/[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.95 - (show annotations) (download)
Thu Oct 28 14:36:47 2010 UTC (13 years, 7 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint62n
Changes since 1.94: +2 -2 lines
Attempt to make adjoint work again for arctic210x192x50 setup
(currently broken)

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

  ViewVC Help
Powered by ViewVC 1.1.22