source: issm/trunk/test/MITgcm/code/do_oceanic_phys.F@ 22758

Last change on this file since 22758 was 22758, checked in by Mathieu Morlighem, 7 years ago

merged trunk-jpl and trunk for revision 22757

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