/[MITgcm]/MITgcm/model/src/thermodynamics.F
ViewVC logotype

Contents of /MITgcm/model/src/thermodynamics.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.33 - (show annotations) (download)
Fri Nov 22 03:01:18 2002 UTC (21 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint47e_post, checkpoint47c_post, checkpoint47d_pre, checkpoint47a_post, checkpoint47d_post, branch-exfmods-tag, checkpoint47b_post, checkpoint47f_post
Branch point for: branch-exfmods-curt
Changes since 1.32: +4 -5 lines
modification needed for the new AIM package (aim_v23)

1 C $Header: /u/gcmpack/MITgcm/model/src/thermodynamics.F,v 1.32 2002/11/21 19:11:42 cheisey Exp $
2 C $Name: $
3
4 #include "CPP_OPTIONS.h"
5 #ifdef ALLOW_AUTODIFF_TAMC
6 # ifdef ALLOW_GMREDI
7 # include "GMREDI_OPTIONS.h"
8 # endif
9 # ifdef ALLOW_KPP
10 # include "KPP_OPTIONS.h"
11 # endif
12 cswdice --- add ----
13 #ifdef ALLOW_THERM_SEAICE
14 #include "ICE.h"
15 #endif
16 cswdice ------
17 #endif /* ALLOW_AUTODIFF_TAMC */
18
19 CBOP
20 C !ROUTINE: THERMODYNAMICS
21 C !INTERFACE:
22 SUBROUTINE THERMODYNAMICS(myTime, myIter, myThid)
23 C !DESCRIPTION: \bv
24 C *==========================================================*
25 C | SUBROUTINE THERMODYNAMICS
26 C | o Controlling routine for the prognostic part of the
27 C | thermo-dynamics.
28 C *===========================================================
29 C | The algorithm...
30 C |
31 C | "Correction Step"
32 C | =================
33 C | Here we update the horizontal velocities with the surface
34 C | pressure such that the resulting flow is either consistent
35 C | with the free-surface evolution or the rigid-lid:
36 C | U[n] = U* + dt x d/dx P
37 C | V[n] = V* + dt x d/dy P
38 C |
39 C | "Calculation of Gs"
40 C | ===================
41 C | This is where all the accelerations and tendencies (ie.
42 C | physics, parameterizations etc...) are calculated
43 C | rho = rho ( theta[n], salt[n] )
44 C | b = b(rho, theta)
45 C | K31 = K31 ( rho )
46 C | Gu[n] = Gu( u[n], v[n], wVel, b, ... )
47 C | Gv[n] = Gv( u[n], v[n], wVel, b, ... )
48 C | Gt[n] = Gt( theta[n], u[n], v[n], wVel, K31, ... )
49 C | Gs[n] = Gs( salt[n], u[n], v[n], wVel, K31, ... )
50 C |
51 C | "Time-stepping" or "Prediction"
52 C | ================================
53 C | The models variables are stepped forward with the appropriate
54 C | time-stepping scheme (currently we use Adams-Bashforth II)
55 C | - For momentum, the result is always *only* a "prediction"
56 C | in that the flow may be divergent and will be "corrected"
57 C | later with a surface pressure gradient.
58 C | - Normally for tracers the result is the new field at time
59 C | level [n+1} *BUT* in the case of implicit diffusion the result
60 C | is also *only* a prediction.
61 C | - We denote "predictors" with an asterisk (*).
62 C | U* = U[n] + dt x ( 3/2 Gu[n] - 1/2 Gu[n-1] )
63 C | V* = V[n] + dt x ( 3/2 Gv[n] - 1/2 Gv[n-1] )
64 C | theta[n+1] = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
65 C | salt[n+1] = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
66 C | With implicit diffusion:
67 C | theta* = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
68 C | salt* = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
69 C | (1 + dt * K * d_zz) theta[n] = theta*
70 C | (1 + dt * K * d_zz) salt[n] = salt*
71 C |
72 C *==========================================================*
73 C \ev
74
75 C !USES:
76 IMPLICIT NONE
77 C == Global variables ===
78 #include "SIZE.h"
79 #include "EEPARAMS.h"
80 #include "PARAMS.h"
81 #include "DYNVARS.h"
82 #include "GRID.h"
83 #include "GAD.h"
84 #ifdef ALLOW_PASSIVE_TRACER
85 #include "TR1.h"
86 #endif
87 #ifdef ALLOW_AUTODIFF_TAMC
88 # include "tamc.h"
89 # include "tamc_keys.h"
90 # include "FFIELDS.h"
91 # include "EOS.h"
92 # ifdef ALLOW_KPP
93 # include "KPP.h"
94 # endif
95 # ifdef ALLOW_GMREDI
96 # include "GMREDI.h"
97 # endif
98 #endif /* ALLOW_AUTODIFF_TAMC */
99 #ifdef ALLOW_TIMEAVE
100 #include "TIMEAVE_STATV.h"
101 #endif
102
103 C !INPUT/OUTPUT PARAMETERS:
104 C == Routine arguments ==
105 C myTime - Current time in simulation
106 C myIter - Current iteration number in simulation
107 C myThid - Thread number for this instance of the routine.
108 _RL myTime
109 INTEGER myIter
110 INTEGER myThid
111
112 C !LOCAL VARIABLES:
113 C == Local variables
114 C xA, yA - Per block temporaries holding face areas
115 C uTrans, vTrans, rTrans - Per block temporaries holding flow
116 C transport
117 C o uTrans: Zonal transport
118 C o vTrans: Meridional transport
119 C o rTrans: Vertical transport
120 C maskUp o maskUp: land/water mask for W points
121 C fVer[STUV] o fVer: Vertical flux term - note fVer
122 C is "pipelined" in the vertical
123 C so we need an fVer for each
124 C variable.
125 C rhoK, rhoKM1 - Density at current level, and level above
126 C phiHyd - Hydrostatic part of the potential phiHydi.
127 C In z coords phiHydiHyd is the hydrostatic
128 C Potential (=pressure/rho0) anomaly
129 C In p coords phiHydiHyd is the geopotential
130 C surface height anomaly.
131 C phiSurfX, - gradient of Surface potentiel (Pressure/rho, ocean)
132 C phiSurfY or geopotentiel (atmos) in X and Y direction
133 C KappaRT, - Total diffusion in vertical for T and S.
134 C KappaRS (background + spatially varying, isopycnal term).
135 C iMin, iMax - Ranges and sub-block indices on which calculations
136 C jMin, jMax are applied.
137 C bi, bj
138 C k, kup, - Index for layer above and below. kup and kDown
139 C kDown, km1 are switched with layer to be the appropriate
140 C index into fVerTerm.
141 _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
142 _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
143 _RL uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
144 _RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
145 _RL rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
146 _RS maskUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
147 _RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
148 _RL fVerS (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
149 _RL fVerTr1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
150 _RL phiHyd (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
151 _RL rhokm1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
152 _RL rhok (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
153 _RL phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
154 _RL phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
155 _RL KappaRT (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
156 _RL KappaRS (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
157 _RL sigmaX (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
158 _RL sigmaY (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
159 _RL sigmaR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
160 C This is currently used by IVDC and Diagnostics
161 _RL ConvectCount (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
162 INTEGER iMin, iMax
163 INTEGER jMin, jMax
164 INTEGER bi, bj
165 INTEGER i, j
166 INTEGER k, km1, kup, kDown
167
168 CEOP
169
170 #ifdef ALLOW_AUTODIFF_TAMC
171 C-- dummy statement to end declaration part
172 ikey = 1
173 itdkey = 1
174 #endif /* ALLOW_AUTODIFF_TAMC */
175
176 C-- Set up work arrays with valid (i.e. not NaN) values
177 C These inital values do not alter the numerical results. They
178 C just ensure that all memory references are to valid floating
179 C point numbers. This prevents spurious hardware signals due to
180 C uninitialised but inert locations.
181 DO j=1-OLy,sNy+OLy
182 DO i=1-OLx,sNx+OLx
183 xA(i,j) = 0. _d 0
184 yA(i,j) = 0. _d 0
185 uTrans(i,j) = 0. _d 0
186 vTrans(i,j) = 0. _d 0
187 rhok (i,j) = 0. _d 0
188 phiSurfX(i,j) = 0. _d 0
189 phiSurfY(i,j) = 0. _d 0
190 ENDDO
191 ENDDO
192
193
194 #ifdef ALLOW_AUTODIFF_TAMC
195 C-- HPF directive to help TAMC
196 CHPF$ INDEPENDENT
197 #endif /* ALLOW_AUTODIFF_TAMC */
198
199 DO bj=myByLo(myThid),myByHi(myThid)
200
201 #ifdef ALLOW_AUTODIFF_TAMC
202 C-- HPF directive to help TAMC
203 CHPF$ INDEPENDENT, NEW (rTrans,fVerT,fVerS
204 CHPF$& ,phiHyd,utrans,vtrans,xA,yA
205 CHPF$& ,KappaRT,KappaRS
206 CHPF$& )
207 #endif /* ALLOW_AUTODIFF_TAMC */
208
209 DO bi=myBxLo(myThid),myBxHi(myThid)
210
211 #ifdef ALLOW_AUTODIFF_TAMC
212 act1 = bi - myBxLo(myThid)
213 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
214 act2 = bj - myByLo(myThid)
215 max2 = myByHi(myThid) - myByLo(myThid) + 1
216 act3 = myThid - 1
217 max3 = nTx*nTy
218 act4 = ikey_dynamics - 1
219 itdkey = (act1 + 1) + act2*max1
220 & + act3*max1*max2
221 & + act4*max1*max2*max3
222 #endif /* ALLOW_AUTODIFF_TAMC */
223
224 C-- Set up work arrays that need valid initial values
225 DO j=1-OLy,sNy+OLy
226 DO i=1-OLx,sNx+OLx
227 rTrans (i,j) = 0. _d 0
228 fVerT (i,j,1) = 0. _d 0
229 fVerT (i,j,2) = 0. _d 0
230 fVerS (i,j,1) = 0. _d 0
231 fVerS (i,j,2) = 0. _d 0
232 fVerTr1(i,j,1) = 0. _d 0
233 fVerTr1(i,j,2) = 0. _d 0
234 rhoKM1 (i,j) = 0. _d 0
235 ENDDO
236 ENDDO
237
238 DO k=1,Nr
239 DO j=1-OLy,sNy+OLy
240 DO i=1-OLx,sNx+OLx
241 C This is currently also used by IVDC and Diagnostics
242 phiHyd(i,j,k) = 0. _d 0
243 sigmaX(i,j,k) = 0. _d 0
244 sigmaY(i,j,k) = 0. _d 0
245 sigmaR(i,j,k) = 0. _d 0
246 ConvectCount(i,j,k) = 0.
247 KappaRT(i,j,k) = 0. _d 0
248 KappaRS(i,j,k) = 0. _d 0
249 #ifdef ALLOW_AUTODIFF_TAMC
250 cph all the following init. are necessary for TAF
251 cph although some of these are re-initialised later.
252 gT(i,j,k,bi,bj) = 0. _d 0
253 gS(i,j,k,bi,bj) = 0. _d 0
254 # ifdef ALLOW_PASSIVE_TRACER
255 gTr1(i,j,k,bi,bj) = 0. _d 0
256 # endif
257 # ifdef ALLOW_GMREDI
258 Kwx(i,j,k,bi,bj) = 0. _d 0
259 Kwy(i,j,k,bi,bj) = 0. _d 0
260 Kwz(i,j,k,bi,bj) = 0. _d 0
261 # ifdef GM_NON_UNITY_DIAGONAL
262 Kux(i,j,k,bi,bj) = 0. _d 0
263 Kvy(i,j,k,bi,bj) = 0. _d 0
264 # endif
265 # ifdef GM_EXTRA_DIAGONAL
266 Kuz(i,j,k,bi,bj) = 0. _d 0
267 Kvz(i,j,k,bi,bj) = 0. _d 0
268 # endif
269 # ifdef GM_BOLUS_ADVEC
270 GM_PsiX(i,j,k,bi,bj) = 0. _d 0
271 GM_PsiY(i,j,k,bi,bj) = 0. _d 0
272 # endif
273 # endif /* ALLOW_GMREDI */
274 #endif /* ALLOW_AUTODIFF_TAMC */
275 ENDDO
276 ENDDO
277 ENDDO
278
279 iMin = 1-OLx
280 iMax = sNx+OLx
281 jMin = 1-OLy
282 jMax = sNy+OLy
283
284
285 #ifdef ALLOW_AUTODIFF_TAMC
286 CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
287 CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
288 #ifdef ALLOW_KPP
289 CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
290 CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
291 #endif
292 #endif /* ALLOW_AUTODIFF_TAMC */
293
294 C-- Start of diagnostic loop
295 DO k=Nr,1,-1
296
297 #ifdef ALLOW_AUTODIFF_TAMC
298 C? Patrick, is this formula correct now that we change the loop range?
299 C? Do we still need this?
300 cph kkey formula corrected.
301 cph Needed for rhok, rhokm1, in the case useGMREDI.
302 kkey = (itdkey-1)*Nr + k
303 #endif /* ALLOW_AUTODIFF_TAMC */
304
305 C-- Integrate continuity vertically for vertical velocity
306 c CALL INTEGRATE_FOR_W(
307 c I bi, bj, k, uVel, vVel,
308 c O wVel,
309 c I myThid )
310
311 #ifdef ALLOW_OBCS
312 #ifdef ALLOW_NONHYDROSTATIC
313 C-- Apply OBC to W if in N-H mode
314 c IF (useOBCS.AND.nonHydrostatic) THEN
315 c CALL OBCS_APPLY_W( bi, bj, k, wVel, myThid )
316 c ENDIF
317 #endif /* ALLOW_NONHYDROSTATIC */
318 #endif /* ALLOW_OBCS */
319
320 C-- Attention: by defining "SINGLE_LAYER_MODE" in CPP_OPTIONS.h
321 C-- MOST of THERMODYNAMICS will be disabled
322 #ifndef SINGLE_LAYER_MODE
323
324 C-- Calculate gradients of potential density for isoneutral
325 C slope terms (e.g. GM/Redi tensor or IVDC diffusivity)
326 c IF ( k.GT.1 .AND. (useGMRedi.OR.ivdc_kappa.NE.0.) ) THEN
327 IF ( useGMRedi .OR. (k.GT.1 .AND. ivdc_kappa.NE.0.) ) THEN
328 #ifdef ALLOW_AUTODIFF_TAMC
329 CADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
330 CADJ STORE salt (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
331 CADJ STORE pressure(:,:,k,bi,bj) =
332 CADJ & comlev1_bibj_k, key=kkey, byte=isbyte
333 #endif /* ALLOW_AUTODIFF_TAMC */
334 CALL FIND_RHO(
335 I bi, bj, iMin, iMax, jMin, jMax, k, k,
336 I theta, salt,
337 O rhoK,
338 I myThid )
339
340 IF (k.GT.1) THEN
341 #ifdef ALLOW_AUTODIFF_TAMC
342 CADJ STORE theta(:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
343 CADJ STORE salt (:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
344 CADJ STORE pressure(:,:,k-1,bi,bj) =
345 CADJ & comlev1_bibj_k, key=kkey, byte=isbyte
346 #endif /* ALLOW_AUTODIFF_TAMC */
347 CALL FIND_RHO(
348 I bi, bj, iMin, iMax, jMin, jMax, k-1, k,
349 I theta, salt,
350 O rhoKm1,
351 I myThid )
352 ENDIF
353 CALL GRAD_SIGMA(
354 I bi, bj, iMin, iMax, jMin, jMax, k,
355 I rhoK, rhoKm1, rhoK,
356 O sigmaX, sigmaY, sigmaR,
357 I myThid )
358 ENDIF
359
360 #ifdef ALLOW_AUTODIFF_TAMC
361 CADJ STORE rhok (:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
362 CADJ STORE rhokm1 (:,:) = comlev1_bibj_k , key=kkey, byte=isbyte
363 #endif /* ALLOW_AUTODIFF_TAMC */
364 C-- Implicit Vertical Diffusion for Convection
365 c ==> should use sigmaR !!!
366 IF (k.GT.1 .AND. ivdc_kappa.NE.0.) THEN
367 CALL CALC_IVDC(
368 I bi, bj, iMin, iMax, jMin, jMax, k,
369 I rhoKm1, rhoK,
370 U ConvectCount, KappaRT, KappaRS,
371 I myTime, myIter, myThid)
372 ENDIF
373
374 #endif /* SINGLE_LAYER_MODE */
375
376 C-- end of diagnostic k loop (Nr:1)
377 ENDDO
378
379 #ifdef ALLOW_AUTODIFF_TAMC
380 cph avoids recomputation of integrate_for_w
381 CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
382 CADJ STORE pressure (:,:,:,bi,bj) =
383 CADJ & comlev1_bibj, key=itdkey, byte=isbyte
384 #endif /* ALLOW_AUTODIFF_TAMC */
385
386 #ifdef ALLOW_OBCS
387 C-- Calculate future values on open boundaries
388 IF (useOBCS) THEN
389 CALL OBCS_CALC( bi, bj, myTime+deltaT, myIter+1,
390 I uVel, vVel, wVel, theta, salt,
391 I myThid )
392 ENDIF
393 #endif /* ALLOW_OBCS */
394
395
396 c********************************************
397 cswdice --- add ---
398 #ifdef ALLOW_THERM_SEAICE
399 C-- Determines forcing terms based on external fields
400 c-- including effects from ice
401 CALL ICE_FORCING(
402 I bi, bj, iMin, iMax, jMin, jMax,
403 I myThid )
404 #else
405
406 cswdice --- end add ---
407
408 C-- Determines forcing terms based on external fields
409 C relaxation terms, etc.
410 CALL EXTERNAL_FORCING_SURF(
411 I bi, bj, iMin, iMax, jMin, jMax,
412 I myThid )
413 cswdice --- add ----
414 #endif
415 cswdice --- end add ---
416 c******************************************
417
418
419
420
421 #ifdef ALLOW_AUTODIFF_TAMC
422 cph needed for KPP
423 CADJ STORE surfacetendencyU(:,:,bi,bj)
424 CADJ & = comlev1_bibj, key=itdkey, byte=isbyte
425 CADJ STORE surfacetendencyV(:,:,bi,bj)
426 CADJ & = comlev1_bibj, key=itdkey, byte=isbyte
427 CADJ STORE surfacetendencyS(:,:,bi,bj)
428 CADJ & = comlev1_bibj, key=itdkey, byte=isbyte
429 CADJ STORE surfacetendencyT(:,:,bi,bj)
430 CADJ & = comlev1_bibj, key=itdkey, byte=isbyte
431 #endif /* ALLOW_AUTODIFF_TAMC */
432
433 C-- Attention: by defining "SINGLE_LAYER_MODE" in CPP_OPTIONS.h
434 C-- MOST of THERMODYNAMICS will be disabled
435 #ifndef SINGLE_LAYER_MODE
436
437 #ifdef ALLOW_GMREDI
438
439 #ifdef ALLOW_AUTODIFF_TAMC
440 CADJ STORE sigmaX(:,:,k) = comlev1_bibj_k, key=kkey, byte=isbyte
441 CADJ STORE sigmaY(:,:,k) = comlev1_bibj_k, key=kkey, byte=isbyte
442 CADJ STORE sigmaR(:,:,k) = comlev1_bibj_k, key=kkey, byte=isbyte
443 #endif /* ALLOW_AUTODIFF_TAMC */
444 C-- Calculate iso-neutral slopes for the GM/Redi parameterisation
445 IF (useGMRedi) THEN
446 CALL GMREDI_CALC_TENSOR(
447 I bi, bj, iMin, iMax, jMin, jMax,
448 I sigmaX, sigmaY, sigmaR,
449 I myThid )
450 #ifdef ALLOW_AUTODIFF_TAMC
451 ELSE
452 CALL GMREDI_CALC_TENSOR_DUMMY(
453 I bi, bj, iMin, iMax, jMin, jMax,
454 I sigmaX, sigmaY, sigmaR,
455 I myThid )
456 #endif /* ALLOW_AUTODIFF_TAMC */
457 ENDIF
458
459 #ifdef ALLOW_AUTODIFF_TAMC
460 CADJ STORE Kwx(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
461 CADJ STORE Kwy(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
462 CADJ STORE Kwz(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
463 #endif /* ALLOW_AUTODIFF_TAMC */
464
465 #endif /* ALLOW_GMREDI */
466
467 #ifdef ALLOW_KPP
468 C-- Compute KPP mixing coefficients
469 IF (useKPP) THEN
470 CALL KPP_CALC(
471 I bi, bj, myTime, myThid )
472 #ifdef ALLOW_AUTODIFF_TAMC
473 ELSE
474 CALL KPP_CALC_DUMMY(
475 I bi, bj, myTime, myThid )
476 #endif /* ALLOW_AUTODIFF_TAMC */
477 ENDIF
478
479 #ifdef ALLOW_AUTODIFF_TAMC
480 CADJ STORE KPPghat (:,:,:,bi,bj)
481 CADJ & , KPPdiffKzT(:,:,:,bi,bj)
482 CADJ & , KPPdiffKzS(:,:,:,bi,bj)
483 CADJ & , KPPfrac (:,: ,bi,bj)
484 CADJ & = comlev1_bibj, key=itdkey, byte=isbyte
485 #endif /* ALLOW_AUTODIFF_TAMC */
486
487 #endif /* ALLOW_KPP */
488
489 #ifdef ALLOW_AUTODIFF_TAMC
490 CADJ STORE KappaRT(:,:,:) = comlev1_bibj, key=itdkey, byte=isbyte
491 CADJ STORE KappaRS(:,:,:) = comlev1_bibj, key=itdkey, byte=isbyte
492 CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
493 CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
494 CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
495 CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
496 #ifdef ALLOW_PASSIVE_TRACER
497 CADJ STORE tr1 (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
498 #endif
499 #endif /* ALLOW_AUTODIFF_TAMC */
500
501 #ifdef ALLOW_AIM
502 C AIM - atmospheric intermediate model, physics package code.
503 IF ( useAIM ) THEN
504 CALL TIMER_START('AIM_DO_PHYSICS [THERMODYNAMICS]', myThid)
505 CALL AIM_DO_PHYSICS( bi, bj, myTime, myIter, myThid )
506 CALL TIMER_STOP( 'AIM_DO_PHYSICS [THERMODYNAMICS]', myThid)
507 ENDIF
508 #endif /* ALLOW_AIM */
509
510 #ifdef ALLOW_TIMEAVE
511 IF (taveFreq.GT.0. .AND. ivdc_kappa.NE.0.) THEN
512 CALL TIMEAVE_CUMULATE(ConvectCountTave, ConvectCount, Nr,
513 I deltaTclock, bi, bj, myThid)
514 ENDIF
515 #endif /* ALLOW_TIMEAVE */
516
517 #ifndef DISABLE_MULTIDIM_ADVECTION
518 C-- Some advection schemes are better calculated using a multi-dimensional
519 C method in the absence of any other terms and, if used, is done here.
520 C
521 C The CPP flag DISABLE_MULTIDIM_ADVECTION is currently unset in GAD_OPTIONS.h
522 C The default is to use multi-dimensinal advection for non-linear advection
523 C schemes. However, for the sake of efficiency of the adjoint it is necessary
524 C to be able to exclude this scheme to avoid excessive storage and
525 C recomputation. It *is* differentiable, if you need it.
526 C Edit GAD_OPTIONS.h and #define DISABLE_MULTIDIM_ADVECTION to
527 C disable this section of code.
528 IF (tempMultiDimAdvec) THEN
529 CALL GAD_ADVECTION(bi,bj,tempAdvScheme,GAD_TEMPERATURE,
530 U theta,gT,
531 I myTime,myIter,myThid)
532 ENDIF
533 IF (saltMultiDimAdvec) THEN
534 CALL GAD_ADVECTION(bi,bj,saltAdvScheme,GAD_SALINITY,
535 U salt,gS,
536 I myTime,myIter,myThid)
537 ENDIF
538 C Since passive tracers are configurable separately from T,S we
539 C call the multi-dimensional method for PTRACERS regardless
540 C of whether multiDimAdvection is set or not.
541 #ifdef ALLOW_PTRACERS
542 IF ( usePTRACERS ) THEN
543 CALL PTRACERS_ADVECTION( bi,bj,myIter,myTime,myThid )
544 ENDIF
545 #endif /* ALLOW_PTRACERS */
546 #endif /* DISABLE_MULTIDIM_ADVECTION */
547
548 C-- Start of thermodynamics loop
549 DO k=Nr,1,-1
550 #ifdef ALLOW_AUTODIFF_TAMC
551 C? Patrick Is this formula correct?
552 cph Yes, but I rewrote it.
553 cph Also, the KappaR? need the index and subscript k!
554 kkey = (itdkey-1)*Nr + k
555 #endif /* ALLOW_AUTODIFF_TAMC */
556
557 C-- km1 Points to level above k (=k-1)
558 C-- kup Cycles through 1,2 to point to layer above
559 C-- kDown Cycles through 2,1 to point to current layer
560
561 km1 = MAX(1,k-1)
562 kup = 1+MOD(k+1,2)
563 kDown= 1+MOD(k,2)
564
565 iMin = 1-OLx
566 iMax = sNx+OLx
567 jMin = 1-OLy
568 jMax = sNy+OLy
569
570 C-- Get temporary terms used by tendency routines
571 CALL CALC_COMMON_FACTORS (
572 I bi,bj,iMin,iMax,jMin,jMax,k,
573 O xA,yA,uTrans,vTrans,rTrans,maskUp,
574 I myThid)
575
576 #ifdef ALLOW_GMREDI
577 C-- Residual transp = Bolus transp + Eulerian transp
578 IF (useGMRedi) THEN
579 CALL GMREDI_CALC_UVFLOW(
580 & uTrans, vTrans, bi, bj, k, myThid)
581 IF (K.GE.2) CALL GMREDI_CALC_WFLOW(
582 & rTrans, bi, bj, k, myThid)
583 ENDIF
584 #endif /* ALLOW_GMREDI */
585
586 #ifdef ALLOW_AUTODIFF_TAMC
587 CADJ STORE KappaRT(:,:,k) = comlev1_bibj_k, key=kkey, byte=isbyte
588 CADJ STORE KappaRS(:,:,k) = comlev1_bibj_k, key=kkey, byte=isbyte
589 #endif /* ALLOW_AUTODIFF_TAMC */
590
591 #ifdef INCLUDE_CALC_DIFFUSIVITY_CALL
592 C-- Calculate the total vertical diffusivity
593 CALL CALC_DIFFUSIVITY(
594 I bi,bj,iMin,iMax,jMin,jMax,k,
595 I maskUp,
596 O KappaRT,KappaRS,
597 I myThid)
598 #endif
599
600 iMin = 1-OLx+2
601 iMax = sNx+OLx-1
602 jMin = 1-OLy+2
603 jMax = sNy+OLy-1
604
605 C-- Calculate active tracer tendencies (gT,gS,...)
606 C and step forward storing result in gTnm1, gSnm1, etc.
607 IF ( tempStepping ) THEN
608 CALL CALC_GT(
609 I bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,
610 I xA,yA,uTrans,vTrans,rTrans,maskUp,
611 I KappaRT,
612 U fVerT,
613 I myTime,myIter,myThid)
614 CALL TIMESTEP_TRACER(
615 I bi,bj,iMin,iMax,jMin,jMax,k,tempAdvScheme,
616 I theta, gT,
617 I myIter, myThid)
618 ENDIF
619 cswdice ---- add ---
620 #ifdef ALLOW_THERM_SEAICE
621 if (k.eq.1) then
622 call ICE_FREEZE(bi, bj, iMin, iMax, jMin, jMax, myThid )
623 endif
624 #endif
625 cswdice -- end add ---
626 IF ( saltStepping ) THEN
627 CALL CALC_GS(
628 I bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,
629 I xA,yA,uTrans,vTrans,rTrans,maskUp,
630 I KappaRS,
631 U fVerS,
632 I myTime,myIter,myThid)
633 CALL TIMESTEP_TRACER(
634 I bi,bj,iMin,iMax,jMin,jMax,k,saltAdvScheme,
635 I salt, gS,
636 I myIter, myThid)
637 ENDIF
638 #ifdef ALLOW_PASSIVE_TRACER
639 IF ( tr1Stepping ) THEN
640 CALL CALC_GTR1(
641 I bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,
642 I xA,yA,uTrans,vTrans,rTrans,maskUp,
643 I KappaRT,
644 U fVerTr1,
645 I myTime,myIter,myThid)
646 CALL TIMESTEP_TRACER(
647 I bi,bj,iMin,iMax,jMin,jMax,k,tracerAdvScheme,
648 I Tr1, gTr1,
649 I myIter,myThid)
650 ENDIF
651 #endif
652 #ifdef ALLOW_PTRACERS
653 IF ( usePTRACERS ) THEN
654 CALL PTRACERS_INTEGERATE(
655 I bi,bj,k,
656 I xA,yA,uTrans,vTrans,rTrans,maskUp,
657 X KappaRS,
658 I myIter,myTime,myThid)
659 ENDIF
660 #endif /* ALLOW_PTRACERS */
661
662 #ifdef ALLOW_OBCS
663 C-- Apply open boundary conditions
664 IF (useOBCS) THEN
665 CALL OBCS_APPLY_TS( bi, bj, k, gT, gS, myThid )
666 END IF
667 #endif /* ALLOW_OBCS */
668
669 C-- Freeze water
670 IF ( allowFreezing .AND. .NOT. useSEAICE ) THEN
671 #ifdef ALLOW_AUTODIFF_TAMC
672 CADJ STORE gT(:,:,k,bi,bj) = comlev1_bibj_k
673 CADJ & , key = kkey, byte = isbyte
674 #endif /* ALLOW_AUTODIFF_TAMC */
675 CALL FREEZE( bi, bj, iMin, iMax, jMin, jMax, k, myThid )
676 END IF
677
678 C-- end of thermodynamic k loop (Nr:1)
679 ENDDO
680
681 cswdice -- add ---
682 #ifdef ALLOW_THERM_SEAICE
683 c timeaveraging for ice model values
684 CALL ICE_AVE(bi,bj,iMin,iMax,jMin,jMax,myThid )
685 #endif
686 cswdice --- end add ---
687
688
689
690
691 C-- Implicit diffusion
692 IF (implicitDiffusion) THEN
693
694 IF (tempStepping) THEN
695 #ifdef ALLOW_AUTODIFF_TAMC
696 CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
697 #endif /* ALLOW_AUTODIFF_TAMC */
698 CALL IMPLDIFF(
699 I bi, bj, iMin, iMax, jMin, jMax,
700 I deltaTtracer, KappaRT, recip_HFacC,
701 U gT,
702 I myThid )
703 ENDIF
704
705 IF (saltStepping) THEN
706 #ifdef ALLOW_AUTODIFF_TAMC
707 CADJ STORE gS(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
708 #endif /* ALLOW_AUTODIFF_TAMC */
709 CALL IMPLDIFF(
710 I bi, bj, iMin, iMax, jMin, jMax,
711 I deltaTtracer, KappaRS, recip_HFacC,
712 U gS,
713 I myThid )
714 ENDIF
715
716 #ifdef ALLOW_PASSIVE_TRACER
717 IF (tr1Stepping) THEN
718 #ifdef ALLOW_AUTODIFF_TAMC
719 CADJ STORE gTr1(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
720 #endif /* ALLOW_AUTODIFF_TAMC */
721 CALL IMPLDIFF(
722 I bi, bj, iMin, iMax, jMin, jMax,
723 I deltaTtracer, KappaRT, recip_HFacC,
724 U gTr1,
725 I myThid )
726 ENDIF
727 #endif
728
729 #ifdef ALLOW_PTRACERS
730 C Vertical diffusion (implicit) for passive tracers
731 IF ( usePTRACERS ) THEN
732 CALL PTRACERS_IMPLDIFF( bi,bj,KappaRS,myThid )
733 ENDIF
734 #endif /* ALLOW_PTRACERS */
735
736 #ifdef ALLOW_OBCS
737 C-- Apply open boundary conditions
738 IF (useOBCS) THEN
739 DO K=1,Nr
740 CALL OBCS_APPLY_TS( bi, bj, k, gT, gS, myThid )
741 ENDDO
742 END IF
743 #endif /* ALLOW_OBCS */
744
745 C-- End If implicitDiffusion
746 ENDIF
747
748 #endif /* SINGLE_LAYER_MODE */
749
750 Ccs-
751 ENDDO
752 ENDDO
753
754 #ifdef ALLOW_AIM
755 c IF ( useAIM ) THEN
756 c CALL AIM_AIM2DYN_EXCHANGES( myTime, myThid )
757 c ENDIF
758 #endif /* ALLOW_AIM */
759 c IF ( staggerTimeStep ) THEN
760 c IF ( useAIM .OR. useCubedSphereExchange ) THEN
761 c IF (tempStepping) _EXCH_XYZ_R8(gT,myThid)
762 c IF (saltStepping) _EXCH_XYZ_R8(gS,myThid)
763 c ELSEIF ( useGMRedi .AND. Oly.LT.4 ) THEN
764 cc .AND. GM_AdvForm .AND. .NOT.GM_AdvSeparate ) THEN
765 c IF (tempMultiDimAdvec) _EXCH_XYZ_R8(gT,myThid)
766 c IF (saltMultiDimAdvec) _EXCH_XYZ_R8(gS,myThid)
767 c ENDIF
768 c ENDIF
769
770 #ifndef DISABLE_DEBUGMODE
771 If (debugMode) THEN
772 CALL DEBUG_STATS_RL(Nr,uVel,'Uvel (THERMODYNAMICS)',myThid)
773 CALL DEBUG_STATS_RL(Nr,vVel,'Vvel (THERMODYNAMICS)',myThid)
774 CALL DEBUG_STATS_RL(Nr,wVel,'Wvel (THERMODYNAMICS)',myThid)
775 CALL DEBUG_STATS_RL(Nr,theta,'Theta (THERMODYNAMICS)',myThid)
776 CALL DEBUG_STATS_RL(Nr,salt,'Salt (THERMODYNAMICS)',myThid)
777 CALL DEBUG_STATS_RL(Nr,Gt,'Gt (THERMODYNAMICS)',myThid)
778 CALL DEBUG_STATS_RL(Nr,Gs,'Gs (THERMODYNAMICS)',myThid)
779 CALL DEBUG_STATS_RL(Nr,GtNm1,'GtNm1 (THERMODYNAMICS)',myThid)
780 CALL DEBUG_STATS_RL(Nr,GsNm1,'GsNm1 (THERMODYNAMICS)',myThid)
781 #ifdef ALLOW_PTRACERS
782 IF ( usePTRACERS ) THEN
783 CALL PTRACERS_DEBUG(myThid)
784 ENDIF
785 #endif /* ALLOW_PTRACERS */
786 ENDIF
787 #endif
788
789 RETURN
790 END

  ViewVC Help
Powered by ViewVC 1.1.22