/[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.135 - (show annotations) (download)
Tue Apr 29 23:42:21 2014 UTC (10 years ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint64w
Changes since 1.134: +3 -1 lines
Add store dir for saltplumeflux

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

  ViewVC Help
Powered by ViewVC 1.1.22