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

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

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


Revision 1.121 - (show annotations) (download)
Mon Jan 21 23:04:02 2013 UTC (11 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.120: +18 -1 lines
- implement new sequence of calls for thsice+seaice:
    previously:   ice-Dyn,ice-Advect,ice-Thermo(thsice)
    new sequence: ice-Thermo(thsice),ice-Dyn,ice-Advect
- allows (with temporary CPP option "#define OLD_THSICE_CALL_SEQUENCE"
  in CPP_OPTIONS.h) to recover old sequence

1 C $Header: /u/gcmpack/MITgcm/model/src/do_oceanic_phys.F,v 1.120 2012/11/09 22:42:00 jmc Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 #ifdef ALLOW_AUTODIFF_TAMC
8 # ifdef ALLOW_GMREDI
9 # include "GMREDI_OPTIONS.h"
10 # endif
11 # ifdef ALLOW_KPP
12 # include "KPP_OPTIONS.h"
13 # endif
14 # ifdef ALLOW_SEAICE
15 # include "SEAICE_OPTIONS.h"
16 # endif
17 # ifdef ALLOW_EXF
18 # include "EXF_OPTIONS.h"
19 # endif
20 #endif /* ALLOW_AUTODIFF_TAMC */
21
22 CBOP
23 C !ROUTINE: DO_OCEANIC_PHYS
24 C !INTERFACE:
25 SUBROUTINE DO_OCEANIC_PHYS(myTime, myIter, myThid)
26 C !DESCRIPTION: \bv
27 C *==========================================================*
28 C | SUBROUTINE DO_OCEANIC_PHYS
29 C | o Controlling routine for oceanic physics and
30 C | parameterization
31 C *==========================================================*
32 C | o originally, part of S/R thermodynamics
33 C *==========================================================*
34 C \ev
35
36 C !USES:
37 IMPLICIT NONE
38 C == Global variables ===
39 #include "SIZE.h"
40 #include "EEPARAMS.h"
41 #include "PARAMS.h"
42 #include "GRID.h"
43 #include "DYNVARS.h"
44 #ifdef ALLOW_TIMEAVE
45 #include "TIMEAVE_STATV.h"
46 #endif
47 #ifdef ALLOW_BALANCE_FLUXES
48 #include "FFIELDS.h"
49 #endif
50
51 #ifdef ALLOW_AUTODIFF_TAMC
52 # include "AUTODIFF_MYFIELDS.h"
53 # include "tamc.h"
54 # include "tamc_keys.h"
55 #ifndef ALLOW_BALANCE_FLUXES
56 # include "FFIELDS.h"
57 #endif
58 # include "SURFACE.h"
59 # include "EOS.h"
60 # ifdef ALLOW_KPP
61 # include "KPP.h"
62 # endif
63 # ifdef ALLOW_GGL90
64 # include "GGL90.h"
65 # endif
66 # ifdef ALLOW_GMREDI
67 # include "GMREDI.h"
68 # endif
69 # ifdef ALLOW_EBM
70 # include "EBM.h"
71 # endif
72 # ifdef ALLOW_EXF
73 # include "ctrl.h"
74 # include "EXF_FIELDS.h"
75 # ifdef ALLOW_BULKFORMULAE
76 # include "EXF_CONSTANTS.h"
77 # endif
78 # endif
79 # ifdef ALLOW_SEAICE
80 # include "SEAICE_SIZE.h"
81 # include "SEAICE.h"
82 # endif
83 # ifdef ALLOW_THSICE
84 # include "THSICE_VARS.h"
85 # endif
86 # ifdef ALLOW_SALT_PLUME
87 # include "SALT_PLUME.h"
88 # endif
89 #endif /* ALLOW_AUTODIFF_TAMC */
90
91 C !INPUT/OUTPUT PARAMETERS:
92 C == Routine arguments ==
93 C myTime :: Current time in simulation
94 C myIter :: Current iteration number in simulation
95 C myThid :: Thread number for this instance of the routine.
96 _RL myTime
97 INTEGER myIter
98 INTEGER myThid
99
100 C !LOCAL VARIABLES:
101 C == Local variables
102 C rhoK, rhoKm1 :: Density at current level, and level above
103 C iMin, iMax :: Ranges and sub-block indices on which calculations
104 C jMin, jMax are applied.
105 C bi, bj :: tile indices
106 C i,j,k :: loop indices
107 _RL rhoKp1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
108 _RL rhoKm1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
109 _RL sigmaX (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
110 _RL sigmaY (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
111 _RL sigmaR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
112 INTEGER iMin, iMax
113 INTEGER jMin, jMax
114 INTEGER bi, bj
115 INTEGER i, j, k
116 INTEGER doDiagsRho
117 #ifdef ALLOW_DIAGNOSTICS
118 LOGICAL DIAGNOSTICS_IS_ON
119 EXTERNAL DIAGNOSTICS_IS_ON
120 #endif /* ALLOW_DIAGNOSTICS */
121
122 CEOP
123
124 #ifdef ALLOW_AUTODIFF_TAMC
125 C-- dummy statement to end declaration part
126 itdkey = 1
127 #endif /* ALLOW_AUTODIFF_TAMC */
128
129 #ifdef ALLOW_DEBUG
130 IF (debugMode) CALL DEBUG_ENTER('DO_OCEANIC_PHYS',myThid)
131 #endif
132
133 doDiagsRho = 0
134 #ifdef ALLOW_DIAGNOSTICS
135 IF ( useDiagnostics .AND. fluidIsWater ) THEN
136 IF ( DIAGNOSTICS_IS_ON('MXLDEPTH',myThid) )
137 & doDiagsRho = doDiagsRho + 1
138 IF ( DIAGNOSTICS_IS_ON('DRHODR ',myThid) )
139 & doDiagsRho = doDiagsRho + 2
140 IF ( DIAGNOSTICS_IS_ON('WdRHO_P ',myThid) )
141 & doDiagsRho = doDiagsRho + 4
142 IF ( DIAGNOSTICS_IS_ON('WdRHOdP ',myThid) )
143 & doDiagsRho = doDiagsRho + 8
144 ENDIF
145 #endif /* ALLOW_DIAGNOSTICS */
146
147 #ifdef ALLOW_OBCS
148 IF (useOBCS) THEN
149 C-- Calculate future values on open boundaries
150 C-- moved before SEAICE_MODEL call since SEAICE_MODEL needs seaice-obcs fields
151 # ifdef ALLOW_AUTODIFF_TAMC
152 CADJ STORE theta = comlev1, key=ikey_dynamics, kind=isbyte
153 CADJ STORE salt = comlev1, key=ikey_dynamics, kind=isbyte
154 # endif
155 # ifdef ALLOW_DEBUG
156 IF (debugMode) CALL DEBUG_CALL('OBCS_CALC',myThid)
157 # endif
158 CALL OBCS_CALC( myTime+deltaTClock, myIter+1,
159 I uVel, vVel, wVel, theta, salt, myThid )
160 ENDIF
161 #endif /* ALLOW_OBCS */
162
163 #ifdef ALLOW_AUTODIFF_TAMC
164 # ifdef ALLOW_SALT_PLUME
165 DO bj=myByLo(myThid),myByHi(myThid)
166 DO bi=myBxLo(myThid),myBxHi(myThid)
167 DO j=1-OLy,sNy+OLy
168 DO i=1-OLx,sNx+OLx
169 saltPlumeDepth(i,j,bi,bj) = 0. _d 0
170 saltPlumeFlux(i,j,bi,bj) = 0. _d 0
171 ENDDO
172 ENDDO
173 ENDDO
174 ENDDO
175 # endif
176 #endif /* ALLOW_AUTODIFF_TAMC */
177
178 #ifdef ALLOW_FRAZIL
179 IF ( useFRAZIL ) THEN
180 C-- Freeze water in the ocean interior and let it rise to the surface
181 CALL FRAZIL_CALC_RHS( myTime, myIter, myThid )
182 ENDIF
183 #endif /* ALLOW_FRAZIL */
184
185 #ifndef OLD_THSICE_CALL_SEQUENCE
186 #if (defined ALLOW_THSICE) && !(defined ALLOW_ATM2D)
187 IF ( useThSIce .AND. fluidIsWater ) THEN
188 # ifdef ALLOW_DEBUG
189 IF (debugMode) CALL DEBUG_CALL('THSICE_MAIN',myThid)
190 # endif
191 C-- Step forward Therm.Sea-Ice variables
192 C and modify forcing terms including effects from ice
193 CALL TIMER_START('THSICE_MAIN [DO_OCEANIC_PHYS]', myThid)
194 CALL THSICE_MAIN( myTime, myIter, myThid )
195 CALL TIMER_STOP( 'THSICE_MAIN [DO_OCEANIC_PHYS]', myThid)
196 ENDIF
197 #endif /* ALLOW_THSICE */
198 #endif /* ndef OLD_THSICE_CALL_SEQUENCE */
199
200 #ifdef ALLOW_SEAICE
201 IF ( useSEAICE ) THEN
202 # ifdef ALLOW_AUTODIFF_TAMC
203 cph-adj-test(
204 CADJ STORE area = comlev1, key=ikey_dynamics, kind=isbyte
205 CADJ STORE hsnow = comlev1, key=ikey_dynamics, kind=isbyte
206 CADJ STORE heff = comlev1, key=ikey_dynamics, kind=isbyte
207 CADJ STORE empmr,qsw,theta = comlev1, key = ikey_dynamics,
208 CADJ & kind = isbyte
209 cph-adj-test)
210 CADJ STORE atemp,aqh,precip = comlev1, key = ikey_dynamics,
211 CADJ & kind = isbyte
212 CADJ STORE swdown,lwdown = comlev1, key = ikey_dynamics,
213 CADJ & kind = isbyte
214 cph# ifdef EXF_READ_EVAP
215 CADJ STORE evap = comlev1, key = ikey_dynamics,
216 CADJ & kind = isbyte
217 cph# endif
218 CADJ STORE uvel,vvel = comlev1, key = ikey_dynamics,
219 CADJ & kind = isbyte
220 # ifdef SEAICE_CGRID
221 CADJ STORE stressdivergencex = comlev1, key = ikey_dynamics,
222 CADJ & kind = isbyte
223 CADJ STORE stressdivergencey = comlev1, key = ikey_dynamics,
224 CADJ & kind = isbyte
225 # endif
226 # ifdef SEAICE_ALLOW_DYNAMICS
227 CADJ STORE uice = comlev1, key = ikey_dynamics,
228 CADJ & kind = isbyte
229 CADJ STORE vice = comlev1, key = ikey_dynamics,
230 CADJ & kind = isbyte
231 # ifdef SEAICE_ALLOW_EVP
232 CADJ STORE seaice_sigma1 = comlev1, key = ikey_dynamics,
233 CADJ & kind = isbyte
234 CADJ STORE seaice_sigma2 = comlev1, key = ikey_dynamics,
235 CADJ & kind = isbyte
236 CADJ STORE seaice_sigma12 = comlev1, key = ikey_dynamics,
237 CADJ & kind = isbyte
238 # endif
239 # endif
240 cph# ifdef SEAICE_SALINITY
241 CADJ STORE salt = comlev1, key = ikey_dynamics,
242 CADJ & kind = isbyte
243 cph# endif
244 # ifdef ATMOSPHERIC_LOADING
245 CADJ STORE pload = comlev1, key = ikey_dynamics,
246 CADJ & kind = isbyte
247 CADJ STORE siceload = comlev1, key = ikey_dynamics,
248 CADJ & kind = isbyte
249 # endif
250 # ifdef NONLIN_FRSURF
251 CADJ STORE recip_hfacc = comlev1, key = ikey_dynamics,
252 CADJ & kind = isbyte
253 # endif
254 # ifdef ANNUAL_BALANCE
255 CADJ STORE balance_itcount = comlev1, key = ikey_dynamics,
256 CADJ & kind = isbyte
257 # endif /* ANNUAL_BALANCE */
258 # endif
259 # ifdef ALLOW_DEBUG
260 IF (debugMode) CALL DEBUG_CALL('SEAICE_MODEL',myThid)
261 # endif
262 CALL TIMER_START('SEAICE_MODEL [DO_OCEANIC_PHYS]', myThid)
263 CALL SEAICE_MODEL( myTime, myIter, myThid )
264 CALL TIMER_STOP ('SEAICE_MODEL [DO_OCEANIC_PHYS]', myThid)
265 # ifdef ALLOW_COST
266 CALL SEAICE_COST_SENSI ( myTime, myIter, myThid )
267 # endif
268 ENDIF
269 #endif /* ALLOW_SEAICE */
270
271 #ifdef ALLOW_AUTODIFF_TAMC
272 CADJ STORE sst, sss = comlev1, key = ikey_dynamics,
273 CADJ & kind = isbyte
274 CADJ STORE qsw = comlev1, key = ikey_dynamics,
275 CADJ & kind = isbyte
276 # ifdef ALLOW_SEAICE
277 CADJ STORE area = comlev1, key = ikey_dynamics,
278 CADJ & kind = isbyte
279 # endif
280 #endif
281
282 #ifdef OLD_THSICE_CALL_SEQUENCE
283 #if (defined ALLOW_THSICE) && !(defined ALLOW_ATM2D)
284 IF ( useThSIce .AND. fluidIsWater ) THEN
285 # ifdef ALLOW_AUTODIFF_TAMC
286 cph(
287 # ifdef NONLIN_FRSURF
288 CADJ STORE uice,vice = comlev1, key = ikey_dynamics,
289 CADJ & kind = isbyte
290 CADJ STORE salt,theta = comlev1, key = ikey_dynamics,
291 CADJ & kind = isbyte
292 CADJ STORE qnet,qsw, empmr = comlev1, key = ikey_dynamics,
293 CADJ & kind = isbyte
294 CADJ STORE hFac_surfC = comlev1, key = ikey_dynamics,
295 CADJ & kind = isbyte
296 # endif
297 # endif
298 # ifdef ALLOW_DEBUG
299 IF (debugMode) CALL DEBUG_CALL('THSICE_MAIN',myThid)
300 # endif
301 C-- Step forward Therm.Sea-Ice variables
302 C and modify forcing terms including effects from ice
303 CALL TIMER_START('THSICE_MAIN [DO_OCEANIC_PHYS]', myThid)
304 CALL THSICE_MAIN( myTime, myIter, myThid )
305 CALL TIMER_STOP( 'THSICE_MAIN [DO_OCEANIC_PHYS]', myThid)
306 ENDIF
307 #endif /* ALLOW_THSICE */
308 #endif /* OLD_THSICE_CALL_SEQUENCE */
309
310 #ifdef ALLOW_SHELFICE
311 # ifdef ALLOW_AUTODIFF_TAMC
312 CADJ STORE salt, theta = comlev1, key = ikey_dynamics,
313 CADJ & kind = isbyte
314 # endif
315 IF ( useShelfIce .AND. fluidIsWater ) THEN
316 #ifdef ALLOW_DEBUG
317 IF (debugMode) CALL DEBUG_CALL('SHELFICE_THERMODYNAMICS',myThid)
318 #endif
319 C compute temperature and (virtual) salt flux at the
320 C shelf-ice ocean interface
321 CALL TIMER_START('SHELFICE_THERMODYNAMICS [DO_OCEANIC_PHYS]',
322 & myThid)
323 CALL SHELFICE_THERMODYNAMICS( myTime, myIter, myThid )
324 CALL TIMER_STOP( 'SHELFICE_THERMODYNAMICS [DO_OCEANIC_PHYS]',
325 & myThid)
326 ENDIF
327 #endif /* ALLOW_SHELFICE */
328
329 #ifdef ALLOW_ICEFRONT
330 IF ( useICEFRONT .AND. fluidIsWater ) THEN
331 #ifdef ALLOW_DEBUG
332 IF (debugMode) CALL DEBUG_CALL('ICEFRONT_THERMODYNAMICS',myThid)
333 #endif
334 C compute temperature and (virtual) salt flux at the
335 C ice-front ocean interface
336 CALL TIMER_START('ICEFRONT_THERMODYNAMICS [DO_OCEANIC_PHYS]',
337 & myThid)
338 CALL ICEFRONT_THERMODYNAMICS( myTime, myIter, myThid )
339 CALL TIMER_STOP( 'ICEFRONT_THERMODYNAMICS [DO_OCEANIC_PHYS]',
340 & myThid)
341 ENDIF
342 #endif /* ALLOW_ICEFRONT */
343
344 #ifdef ALLOW_SALT_PLUME
345 IF ( useSALT_PLUME ) THEN
346 CALL SALT_PLUME_DO_EXCH( myTime, myIter, myThid )
347 ENDIF
348 #endif /* ALLOW_SALT_PLUME */
349
350 C-- Freeze water at the surface
351 IF ( allowFreezing ) THEN
352 #ifdef ALLOW_AUTODIFF_TAMC
353 CADJ STORE theta = comlev1, key = ikey_dynamics,
354 CADJ & kind = isbyte
355 #endif
356 CALL FREEZE_SURFACE( myTime, myIter, myThid )
357 ENDIF
358
359 #ifdef ALLOW_OCN_COMPON_INTERF
360 C-- Apply imported data (from coupled interface) to forcing fields
361 C jmc: do not know precisely where to put this call (bf or af thSIce ?)
362 IF ( useCoupler ) THEN
363 CALL OCN_APPLY_IMPORT( .TRUE., myTime, myIter, myThid )
364 ENDIF
365 #endif /* ALLOW_OCN_COMPON_INTERF */
366
367 #ifdef ALLOW_BALANCE_FLUXES
368 C balance fluxes
369 IF ( balanceEmPmR .AND. (.NOT.useSeaice .OR. useThSIce) )
370 & CALL REMOVE_MEAN_RS( 1, EmPmR, maskInC, maskInC, rA, drF,
371 & 'EmPmR', myTime, myThid )
372 IF ( balanceQnet .AND. (.NOT.useSeaice .OR. useThSIce) )
373 & CALL REMOVE_MEAN_RS( 1, Qnet, maskInC, maskInC, rA, drF,
374 & 'Qnet ', myTime, myThid )
375 #endif /* ALLOW_BALANCE_FLUXES */
376
377 #ifdef ALLOW_AUTODIFF_TAMC
378 C-- HPF directive to help TAMC
379 CHPF$ INDEPENDENT
380 #else /* ALLOW_AUTODIFF_TAMC */
381 C if fluid is not water, by-pass find_rho, gmredi, surfaceForcing
382 C and all vertical mixing schemes, but keep OBCS_CALC
383 IF ( fluidIsWater ) THEN
384 #endif /* ALLOW_AUTODIFF_TAMC */
385 DO bj=myByLo(myThid),myByHi(myThid)
386 #ifdef ALLOW_AUTODIFF_TAMC
387 C-- HPF directive to help TAMC
388 CHPF$ INDEPENDENT
389 #endif /* ALLOW_AUTODIFF_TAMC */
390 DO bi=myBxLo(myThid),myBxHi(myThid)
391
392 #ifdef ALLOW_AUTODIFF_TAMC
393 act1 = bi - myBxLo(myThid)
394 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
395 act2 = bj - myByLo(myThid)
396 max2 = myByHi(myThid) - myByLo(myThid) + 1
397 act3 = myThid - 1
398 max3 = nTx*nTy
399 act4 = ikey_dynamics - 1
400 itdkey = (act1 + 1) + act2*max1
401 & + act3*max1*max2
402 & + act4*max1*max2*max3
403 #endif /* ALLOW_AUTODIFF_TAMC */
404
405 C-- Set up work arrays with valid (i.e. not NaN) values
406 C These inital values do not alter the numerical results. They
407 C just ensure that all memory references are to valid floating
408 C point numbers. This prevents spurious hardware signals due to
409 C uninitialised but inert locations.
410
411 #ifdef ALLOW_AUTODIFF_TAMC
412 DO j=1-OLy,sNy+OLy
413 DO i=1-OLx,sNx+OLx
414 rhoKm1 (i,j) = 0. _d 0
415 rhoKp1 (i,j) = 0. _d 0
416 ENDDO
417 ENDDO
418 #endif /* ALLOW_AUTODIFF_TAMC */
419
420 DO k=1,Nr
421 DO j=1-OLy,sNy+OLy
422 DO i=1-OLx,sNx+OLx
423 C This is currently used by GMRedi, IVDC, MXL-depth and Diagnostics
424 sigmaX(i,j,k) = 0. _d 0
425 sigmaY(i,j,k) = 0. _d 0
426 sigmaR(i,j,k) = 0. _d 0
427 #ifdef ALLOW_AUTODIFF_TAMC
428 cph all the following init. are necessary for TAF
429 cph although some of these are re-initialised later.
430 rhoInSitu(i,j,k,bi,bj) = 0.
431 IVDConvCount(i,j,k,bi,bj) = 0.
432 # ifdef ALLOW_GMREDI
433 Kwx(i,j,k,bi,bj) = 0. _d 0
434 Kwy(i,j,k,bi,bj) = 0. _d 0
435 Kwz(i,j,k,bi,bj) = 0. _d 0
436 # ifdef GM_NON_UNITY_DIAGONAL
437 Kux(i,j,k,bi,bj) = 0. _d 0
438 Kvy(i,j,k,bi,bj) = 0. _d 0
439 # endif
440 # ifdef GM_EXTRA_DIAGONAL
441 Kuz(i,j,k,bi,bj) = 0. _d 0
442 Kvz(i,j,k,bi,bj) = 0. _d 0
443 # endif
444 # ifdef GM_BOLUS_ADVEC
445 GM_PsiX(i,j,k,bi,bj) = 0. _d 0
446 GM_PsiY(i,j,k,bi,bj) = 0. _d 0
447 # endif
448 # ifdef GM_VISBECK_VARIABLE_K
449 VisbeckK(i,j,bi,bj) = 0. _d 0
450 # endif
451 # endif /* ALLOW_GMREDI */
452 # ifdef ALLOW_KPP
453 KPPdiffKzS(i,j,k,bi,bj) = 0. _d 0
454 KPPdiffKzT(i,j,k,bi,bj) = 0. _d 0
455 # endif /* ALLOW_KPP */
456 # ifdef ALLOW_GGL90
457 GGL90viscArU(i,j,k,bi,bj) = 0. _d 0
458 GGL90viscArV(i,j,k,bi,bj) = 0. _d 0
459 GGL90diffKr(i,j,k,bi,bj) = 0. _d 0
460 # endif /* ALLOW_GGL90 */
461 #endif /* ALLOW_AUTODIFF_TAMC */
462 ENDDO
463 ENDDO
464 ENDDO
465
466 iMin = 1-OLx
467 iMax = sNx+OLx
468 jMin = 1-OLy
469 jMax = sNy+OLy
470
471 #ifdef ALLOW_AUTODIFF_TAMC
472 CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey,
473 CADJ & kind = isbyte
474 CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey,
475 CADJ & kind = isbyte
476 CADJ STORE totphihyd(:,:,:,bi,bj)
477 CADJ & = comlev1_bibj, key=itdkey,
478 CADJ & kind = isbyte
479 # ifdef ALLOW_KPP
480 CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey,
481 CADJ & kind = isbyte
482 CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey,
483 CADJ & kind = isbyte
484 # endif
485 # ifdef ALLOW_SALT_PLUME
486 CADJ STORE saltplumedepth(:,:,bi,bj) = comlev1_bibj, key=itdkey,
487 CADJ & kind = isbyte
488 # endif
489 #endif /* ALLOW_AUTODIFF_TAMC */
490
491 C-- Always compute density (stored in common block) here; even when it is not
492 C needed here, will be used anyway in calc_phi_hyd (data flow easier this way)
493 #ifdef ALLOW_DEBUG
494 IF (debugMode) CALL DEBUG_CALL('FIND_RHO_2D (xNr)',myThid)
495 #endif
496 #ifdef ALLOW_AUTODIFF_TAMC
497 IF ( fluidIsWater ) THEN
498 #endif /* ALLOW_AUTODIFF_TAMC */
499 #ifdef ALLOW_DOWN_SLOPE
500 IF ( useDOWN_SLOPE ) THEN
501 DO k=1,Nr
502 CALL DWNSLP_CALC_RHO(
503 I theta, salt,
504 O rhoInSitu(1-OLx,1-OLy,k,bi,bj),
505 I k, bi, bj, myTime, myIter, myThid )
506 ENDDO
507 ENDIF
508 #endif /* ALLOW_DOWN_SLOPE */
509 #ifdef ALLOW_BBL
510 IF ( useBBL ) THEN
511 C pkg/bbl requires in-situ bbl density for depths equal to and deeper than the bbl.
512 C To reduce computation and storage requirement, these densities are stored in the
513 C dry grid boxes of rhoInSitu. See BBL_CALC_RHO for details.
514 DO k=Nr,1,-1
515 CALL BBL_CALC_RHO(
516 I theta, salt,
517 O rhoInSitu,
518 I k, bi, bj, myTime, myIter, myThid )
519
520 ENDDO
521 ENDIF
522 #endif /* ALLOW_BBL */
523 IF ( .NOT. ( useDOWN_SLOPE .OR. useBBL ) ) THEN
524 DO k=1,Nr
525 CALL FIND_RHO_2D(
526 I iMin, iMax, jMin, jMax, k,
527 I theta(1-OLx,1-OLy,k,bi,bj),
528 I salt (1-OLx,1-OLy,k,bi,bj),
529 O rhoInSitu(1-OLx,1-OLy,k,bi,bj),
530 I k, bi, bj, myThid )
531 ENDDO
532 ENDIF
533 #ifdef ALLOW_AUTODIFF_TAMC
534 ELSE
535 C- fluid is not water:
536 DO k=1,Nr
537 DO j=1-OLy,sNy+OLy
538 DO i=1-OLx,sNx+OLx
539 rhoInSitu(i,j,k,bi,bj) = 0.
540 ENDDO
541 ENDDO
542 ENDDO
543 ENDIF
544 #endif /* ALLOW_AUTODIFF_TAMC */
545
546 #ifdef ALLOW_DEBUG
547 IF (debugMode) CALL DEBUG_MSG('ENTERING UPWARD K LOOP',myThid)
548 #endif
549
550 C-- Start of diagnostic loop
551 DO k=Nr,1,-1
552
553 #ifdef ALLOW_AUTODIFF_TAMC
554 C? Patrick, is this formula correct now that we change the loop range?
555 C? Do we still need this?
556 cph kkey formula corrected.
557 cph Needed for rhoK, rhoKm1, in the case useGMREDI.
558 kkey = (itdkey-1)*Nr + k
559 #endif /* ALLOW_AUTODIFF_TAMC */
560
561 c#ifdef ALLOW_AUTODIFF_TAMC
562 cCADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey,
563 cCADJ & kind = isbyte
564 cCADJ STORE salt(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey,
565 cCADJ & kind = isbyte
566 c#endif /* ALLOW_AUTODIFF_TAMC */
567
568 C-- Calculate gradients of potential density for isoneutral
569 C slope terms (e.g. GM/Redi tensor or IVDC diffusivity)
570 IF ( useGMRedi .OR. (k.GT.1 .AND. ivdc_kappa.NE.0.)
571 & .OR. usePP81 .OR. useMY82 .OR. useGGL90
572 & .OR. useSALT_PLUME .OR. doDiagsRho.GE.1 ) THEN
573 IF (k.GT.1) THEN
574 #ifdef ALLOW_AUTODIFF_TAMC
575 CADJ STORE theta(:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey,
576 CADJ & kind = isbyte
577 CADJ STORE salt (:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey,
578 CADJ & kind = isbyte
579 CADJ STORE rhokm1 (bi,bj) = comlev1_bibj_k, key=kkey,
580 CADJ & kind = isbyte
581 #endif /* ALLOW_AUTODIFF_TAMC */
582 CALL FIND_RHO_2D(
583 I iMin, iMax, jMin, jMax, k,
584 I theta(1-OLx,1-OLy,k-1,bi,bj),
585 I salt (1-OLx,1-OLy,k-1,bi,bj),
586 O rhoKm1,
587 I k-1, bi, bj, myThid )
588 ENDIF
589 #ifdef ALLOW_DEBUG
590 IF (debugMode) CALL DEBUG_CALL('GRAD_SIGMA',myThid)
591 #endif
592 cph Avoid variable aliasing for adjoint !!!
593 DO j=jMin,jMax
594 DO i=iMin,iMax
595 rhoKp1(i,j) = rhoInSitu(i,j,k,bi,bj)
596 ENDDO
597 ENDDO
598 CALL GRAD_SIGMA(
599 I bi, bj, iMin, iMax, jMin, jMax, k,
600 I rhoInSitu(1-OLx,1-OLy,k,bi,bj), rhoKm1, rhoKp1,
601 O sigmaX, sigmaY, sigmaR,
602 I myThid )
603 #ifdef ALLOW_AUTODIFF_TAMC
604 #ifdef GMREDI_WITH_STABLE_ADJOINT
605 cgf zero out adjoint fields to stabilize pkg/gmredi adjoint
606 cgf -> cuts adjoint dependency from slope to state
607 CALL ZERO_ADJ_LOC( Nr, sigmaX, myThid)
608 CALL ZERO_ADJ_LOC( Nr, sigmaY, myThid)
609 CALL ZERO_ADJ_LOC( Nr, sigmaR, myThid)
610 #endif
611 #endif /* ALLOW_AUTODIFF_TAMC */
612 ENDIF
613
614 C-- Implicit Vertical Diffusion for Convection
615 IF (k.GT.1 .AND. ivdc_kappa.NE.0.) THEN
616 #ifdef ALLOW_DEBUG
617 IF (debugMode) CALL DEBUG_CALL('CALC_IVDC',myThid)
618 #endif
619 CALL CALC_IVDC(
620 I bi, bj, iMin, iMax, jMin, jMax, k,
621 I sigmaR,
622 I myTime, myIter, myThid)
623 ENDIF
624
625 #ifdef ALLOW_DIAGNOSTICS
626 IF ( doDiagsRho.GE.4 ) THEN
627 CALL DIAGS_RHO_L( doDiagsRho, k, bi, bj,
628 I rhoInSitu(1-OLx,1-OLy,1,bi,bj),
629 I rhoKm1, wVel,
630 I myTime, myIter, myThid )
631 ENDIF
632 #endif
633
634 C-- end of diagnostic k loop (Nr:1)
635 ENDDO
636
637 #ifdef ALLOW_AUTODIFF_TAMC
638 CADJ STORE IVDConvCount(:,:,:,bi,bj)
639 CADJ & = comlev1_bibj, key=itdkey,
640 CADJ & kind = isbyte
641 #endif
642
643 C-- Diagnose Mixed Layer Depth:
644 IF ( useGMRedi .OR. MOD(doDiagsRho,2).EQ.1 ) THEN
645 CALL CALC_OCE_MXLAYER(
646 I rhoInSitu(1-OLx,1-OLy,1,bi,bj), sigmaR,
647 I bi, bj, myTime, myIter, myThid )
648 ENDIF
649
650 #ifdef ALLOW_SALT_PLUME
651 IF ( useSALT_PLUME ) THEN
652 CALL SALT_PLUME_CALC_DEPTH(
653 I rhoInSitu(1-OLx,1-OLy,1,bi,bj), sigmaR,
654 I bi, bj, myTime, myIter, myThid )
655 ENDIF
656 #endif /* ALLOW_SALT_PLUME */
657
658 #ifdef ALLOW_DIAGNOSTICS
659 IF ( MOD(doDiagsRho,4).GE.2 ) THEN
660 CALL DIAGNOSTICS_FILL (sigmaR, 'DRHODR ', 0, Nr,
661 & 2, bi, bj, myThid)
662 ENDIF
663 #endif /* ALLOW_DIAGNOSTICS */
664
665 C-- Determines forcing terms based on external fields
666 C relaxation terms, etc.
667 #ifdef ALLOW_DEBUG
668 IF (debugMode) CALL DEBUG_CALL('EXTERNAL_FORCING_SURF',myThid)
669 #endif
670 #ifdef ALLOW_AUTODIFF_TAMC
671 CADJ STORE EmPmR(:,:,bi,bj)
672 CADJ & = comlev1_bibj, key=itdkey,
673 CADJ & kind = isbyte
674 # ifdef EXACT_CONSERV
675 CADJ STORE PmEpR(:,:,bi,bj)
676 CADJ & = comlev1_bibj, key=itdkey,
677 CADJ & kind = isbyte
678 # endif
679 # ifdef NONLIN_FRSURF
680 CADJ STORE hFac_surfC(:,:,bi,bj)
681 CADJ & = comlev1_bibj, key=itdkey,
682 CADJ & kind = isbyte
683 CADJ STORE recip_hFacC(:,:,:,bi,bj)
684 CADJ & = comlev1_bibj, key=itdkey,
685 CADJ & kind = isbyte
686 # if (defined (ALLOW_PTRACERS))
687 CADJ STORE surfaceForcingS(:,:,bi,bj) = comlev1_bibj, key=itdkey,
688 CADJ & kind = isbyte
689 CADJ STORE surfaceForcingT(:,:,bi,bj) = comlev1_bibj, key=itdkey,
690 CADJ & kind = isbyte
691 # endif /* ALLOW_PTRACERS */
692 # endif /* NONLIN_FRSURF */
693 #endif
694 CALL EXTERNAL_FORCING_SURF(
695 I bi, bj, iMin, iMax, jMin, jMax,
696 I myTime, myIter, myThid )
697 #ifdef ALLOW_AUTODIFF_TAMC
698 # ifdef EXACT_CONSERV
699 cph-test
700 cphCADJ STORE PmEpR(:,:,bi,bj)
701 cphCADJ & = comlev1_bibj, key=itdkey,
702 cphCADJ & kind = isbyte
703 # endif
704 #endif
705
706 #ifdef ALLOW_AUTODIFF_TAMC
707 cph needed for KPP
708 CADJ STORE surfaceForcingU(:,:,bi,bj)
709 CADJ & = comlev1_bibj, key=itdkey,
710 CADJ & kind = isbyte
711 CADJ STORE surfaceForcingV(:,:,bi,bj)
712 CADJ & = comlev1_bibj, key=itdkey,
713 CADJ & kind = isbyte
714 CADJ STORE surfaceForcingS(:,:,bi,bj)
715 CADJ & = comlev1_bibj, key=itdkey,
716 CADJ & kind = isbyte
717 CADJ STORE surfaceForcingT(:,:,bi,bj)
718 CADJ & = comlev1_bibj, key=itdkey,
719 CADJ & kind = isbyte
720 CADJ STORE surfaceForcingTice(:,:,bi,bj)
721 CADJ & = comlev1_bibj, key=itdkey,
722 CADJ & kind = isbyte
723 #endif /* ALLOW_AUTODIFF_TAMC */
724
725 #ifdef ALLOW_KPP
726 C-- Compute KPP mixing coefficients
727 IF (useKPP) THEN
728 #ifdef ALLOW_DEBUG
729 IF (debugMode) CALL DEBUG_CALL('KPP_CALC',myThid)
730 #endif
731 CALL TIMER_START('KPP_CALC [DO_OCEANIC_PHYS]', myThid)
732 CALL KPP_CALC(
733 I bi, bj, myTime, myIter, myThid )
734 CALL TIMER_STOP ('KPP_CALC [DO_OCEANIC_PHYS]', myThid)
735 #ifdef ALLOW_AUTODIFF_TAMC
736 ELSE
737 CALL KPP_CALC_DUMMY(
738 I bi, bj, myTime, myIter, myThid )
739 #endif /* ALLOW_AUTODIFF_TAMC */
740 ENDIF
741
742 #endif /* ALLOW_KPP */
743
744 #ifdef ALLOW_PP81
745 C-- Compute PP81 mixing coefficients
746 IF (usePP81) THEN
747 #ifdef ALLOW_DEBUG
748 IF (debugMode) CALL DEBUG_CALL('PP81_CALC',myThid)
749 #endif
750 CALL PP81_CALC(
751 I bi, bj, sigmaR, myTime, myIter, myThid )
752 ENDIF
753 #endif /* ALLOW_PP81 */
754
755 #ifdef ALLOW_MY82
756 C-- Compute MY82 mixing coefficients
757 IF (useMY82) THEN
758 #ifdef ALLOW_DEBUG
759 IF (debugMode) CALL DEBUG_CALL('MY82_CALC',myThid)
760 #endif
761 CALL MY82_CALC(
762 I bi, bj, sigmaR, myTime, myIter, myThid )
763 ENDIF
764 #endif /* ALLOW_MY82 */
765
766 #ifdef ALLOW_GGL90
767 #ifdef ALLOW_AUTODIFF_TAMC
768 CADJ STORE GGL90TKE (:,:,:,bi,bj) = comlev1_bibj, key=itdkey,
769 CADJ & kind = isbyte
770 #endif /* ALLOW_AUTODIFF_TAMC */
771 C-- Compute GGL90 mixing coefficients
772 IF (useGGL90) THEN
773 #ifdef ALLOW_DEBUG
774 IF (debugMode) CALL DEBUG_CALL('GGL90_CALC',myThid)
775 #endif
776 CALL TIMER_START('GGL90_CALC [DO_OCEANIC_PHYS]', myThid)
777 CALL GGL90_CALC(
778 I bi, bj, sigmaR, myTime, myIter, myThid )
779 CALL TIMER_STOP ('GGL90_CALC [DO_OCEANIC_PHYS]', myThid)
780 ENDIF
781 #endif /* ALLOW_GGL90 */
782
783 #ifdef ALLOW_TIMEAVE
784 IF ( taveFreq.GT. 0. _d 0 ) THEN
785 CALL TIMEAVE_SURF_FLUX( bi, bj, myTime, myIter, myThid)
786 ENDIF
787 IF (taveFreq.GT.0. .AND. ivdc_kappa.NE.0.) THEN
788 CALL TIMEAVE_CUMULATE(ConvectCountTave, IVDConvCount,
789 I Nr, deltaTClock, bi, bj, myThid)
790 ENDIF
791 #endif /* ALLOW_TIMEAVE */
792
793 #ifdef ALLOW_GMREDI
794 #ifdef ALLOW_AUTODIFF_TAMC
795 # ifndef GM_EXCLUDE_CLIPPING
796 cph storing here is needed only for one GMREDI_OPTIONS:
797 cph define GM_BOLUS_ADVEC
798 cph keep it although TAF says you dont need to.
799 cph but I have avoided the #ifdef for now, in case more things change
800 CADJ STORE sigmaX(:,:,:) = comlev1_bibj, key=itdkey,
801 CADJ & kind = isbyte
802 CADJ STORE sigmaY(:,:,:) = comlev1_bibj, key=itdkey,
803 CADJ & kind = isbyte
804 CADJ STORE sigmaR(:,:,:) = comlev1_bibj, key=itdkey,
805 CADJ & kind = isbyte
806 # endif
807 #endif /* ALLOW_AUTODIFF_TAMC */
808
809 C-- Calculate iso-neutral slopes for the GM/Redi parameterisation
810 IF (useGMRedi) THEN
811 #ifdef ALLOW_DEBUG
812 IF (debugMode) CALL DEBUG_CALL('GMREDI_CALC_TENSOR',myThid)
813 #endif
814 CALL GMREDI_CALC_TENSOR(
815 I iMin, iMax, jMin, jMax,
816 I sigmaX, sigmaY, sigmaR,
817 I bi, bj, myTime, myIter, myThid )
818 #ifdef ALLOW_AUTODIFF_TAMC
819 ELSE
820 CALL GMREDI_CALC_TENSOR_DUMMY(
821 I iMin, iMax, jMin, jMax,
822 I sigmaX, sigmaY, sigmaR,
823 I bi, bj, myTime, myIter, myThid )
824 #endif /* ALLOW_AUTODIFF_TAMC */
825 ENDIF
826 #endif /* ALLOW_GMREDI */
827
828 #ifdef ALLOW_DOWN_SLOPE
829 IF ( useDOWN_SLOPE ) THEN
830 C-- Calculate Downsloping Flow for Down_Slope parameterization
831 IF ( usingPCoords ) THEN
832 CALL DWNSLP_CALC_FLOW(
833 I bi, bj, kSurfC, rhoInSitu,
834 I myTime, myIter, myThid )
835 ELSE
836 CALL DWNSLP_CALC_FLOW(
837 I bi, bj, kLowC, rhoInSitu,
838 I myTime, myIter, myThid )
839 ENDIF
840 ENDIF
841 #endif /* ALLOW_DOWN_SLOPE */
842
843 C-- end bi,bj loops.
844 ENDDO
845 ENDDO
846
847 #ifdef ALLOW_BALANCE_RELAX
848 # ifdef ALLOW_AUTODIFF_TAMC
849 CADJ STORE SSSrlx = comlev1, key=ikey_dynamics, kind=isbyte
850 CADJ STORE SSSrlxTile = comlev1, key=ikey_dynamics, kind=isbyte
851 CADJ STORE SSSrlxGlob = comlev1, key=ikey_dynamics, kind=isbyte
852 CADJ STORE SSTrlx = comlev1, key=ikey_dynamics, kind=isbyte
853 CADJ STORE SSTrlxTile = comlev1, key=ikey_dynamics, kind=isbyte
854 CADJ STORE SSTrlxGlob = comlev1, key=ikey_dynamics, kind=isbyte
855 # endif /* ALLOW_AUTODIFF_TAMC */
856 CALL BALANCE_RELAX( myTime, myIter, myThid )
857 #endif /* ALLOW_BALANCE_RELAX */
858
859 #ifndef ALLOW_AUTODIFF_TAMC
860 C--- if fluid Is Water: end
861 ENDIF
862 #endif
863
864 #ifdef ALLOW_BBL
865 IF ( useBBL ) THEN
866 CALL BBL_CALC_RHS(
867 I myTime, myIter, myThid )
868 ENDIF
869 #endif /* ALLOW_BBL */
870
871 #ifdef ALLOW_MYPACKAGE
872 IF ( useMYPACKAGE ) THEN
873 CALL MYPACKAGE_CALC_RHS(
874 I myTime, myIter, myThid )
875 ENDIF
876 #endif /* ALLOW_MYPACKAGE */
877
878 #ifdef ALLOW_GMREDI
879 IF ( useGMRedi ) THEN
880 CALL GMREDI_DO_EXCH( myTime, myIter, myThid )
881 ENDIF
882 #endif /* ALLOW_GMREDI */
883
884 #ifdef ALLOW_KPP
885 IF (useKPP) THEN
886 CALL KPP_DO_EXCH( myThid )
887 ENDIF
888 #endif /* ALLOW_KPP */
889
890 #ifdef ALLOW_DIAGNOSTICS
891 IF ( fluidIsWater .AND. useDiagnostics ) THEN
892 CALL DIAGS_RHO_G(
893 I rhoInSitu, uVel, vVel, wVel,
894 I myTime, myIter, myThid )
895 CALL DIAGS_OCEANIC_SURF_FLUX( myTime, myIter, myThid )
896 ENDIF
897 IF ( ivdc_kappa.NE.0 .AND. useDiagnostics ) THEN
898 CALL DIAGNOSTICS_FILL( IVDConvCount, 'CONVADJ ',
899 & 0, Nr, 0, 1, 1, myThid )
900 ENDIF
901 #endif
902
903 #ifdef ALLOW_DEBUG
904 IF (debugMode) CALL DEBUG_LEAVE('DO_OCEANIC_PHYS',myThid)
905 #endif
906
907 RETURN
908 END

  ViewVC Help
Powered by ViewVC 1.1.22