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

Diff of /MITgcm/model/src/temp_integrate.F

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

revision 1.5 by jmc, Fri Dec 27 15:46:46 2013 UTC revision 1.18 by jmc, Fri Sep 5 21:07:14 2014 UTC
# Line 3  C $Name$ Line 3  C $Name$
3    
4  #include "PACKAGES_CONFIG.h"  #include "PACKAGES_CONFIG.h"
5  #include "CPP_OPTIONS.h"  #include "CPP_OPTIONS.h"
6    #ifdef ALLOW_AUTODIFF
7    # include "AUTODIFF_OPTIONS.h"
8    #endif
9  #ifdef ALLOW_GENERIC_ADVDIFF  #ifdef ALLOW_GENERIC_ADVDIFF
10  # include "GAD_OPTIONS.h"  # include "GAD_OPTIONS.h"
11  #endif  #endif
# Line 18  C     !INTERFACE: Line 21  C     !INTERFACE:
21  C     !DESCRIPTION: \bv  C     !DESCRIPTION: \bv
22  C     *==========================================================*  C     *==========================================================*
23  C     | SUBROUTINE TEMP_INTEGRATE  C     | SUBROUTINE TEMP_INTEGRATE
24  C     | o Calculate tendency for temperature  C     | o Calculate tendency for temperature and integrates
25  C     |   and integrates forward in time.  C     |   forward in time. The temperature array is updated here
26    C     |   while adjustments (filters, conv.adjustment) are applied
27    C     |   later, in S/R TRACERS_CORRECTION_STEP.
28  C     *==========================================================*  C     *==========================================================*
29  C     | A procedure called EXTERNAL_FORCING_T is called from  C     | A procedure called APPLY_FORCING_T is called from
30  C     | here. These procedures can be used to add per problem  C     | here. These procedures can be used to add per problem
31  C     | heat flux source terms.  C     | heat flux source terms.
32  C     | Note: Although it is slightly counter-intuitive the  C     | Note: Although it is slightly counter-intuitive the
# Line 60  C     == GLobal variables == Line 65  C     == GLobal variables ==
65  #ifdef ALLOW_TIMEAVE  #ifdef ALLOW_TIMEAVE
66  # include "TIMEAVE_STATV.h"  # include "TIMEAVE_STATV.h"
67  #endif  #endif
68  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF
69  # include "tamc.h"  # include "tamc.h"
70  # include "tamc_keys.h"  # include "tamc_keys.h"
71  #endif  #endif
# Line 87  C     myThid     :: my Thread Id. number Line 92  C     myThid     :: my Thread Id. number
92  CEOP  CEOP
93    
94  #ifdef ALLOW_GENERIC_ADVDIFF  #ifdef ALLOW_GENERIC_ADVDIFF
95    #ifdef ALLOW_DIAGNOSTICS
96    C     !FUNCTIONS:
97          LOGICAL  DIAGNOSTICS_IS_ON
98          EXTERNAL DIAGNOSTICS_IS_ON
99    #endif /* ALLOW_DIAGNOSTICS */
100    
101  C     !LOCAL VARIABLES:  C     !LOCAL VARIABLES:
102  C     iMin, iMax :: 1rst index loop range  C     iMin, iMax :: 1rst index loop range
103  C     jMin, jMax :: 2nd  index loop range  C     jMin, jMax :: 2nd  index loop range
# Line 105  C     fZon       :: Flux of temperature Line 116  C     fZon       :: Flux of temperature
116  C     fMer       :: Flux of temperature (T) in the meridional direction  C     fMer       :: Flux of temperature (T) in the meridional direction
117  C     fVer       :: Flux of temperature (T) in the vertical direction  C     fVer       :: Flux of temperature (T) in the vertical direction
118  C                   at the upper(U) and lower(D) faces of a cell.  C                   at the upper(U) and lower(D) faces of a cell.
119    C     gT_loc     :: Temperature tendency (local to this S/R)
120    C     gtForc     :: Temperature forcing tendency
121    C     gt_AB      :: Adams-Bashforth temperature tendency increment
122  C   useVariableK :: T when vertical diffusion is not constant  C   useVariableK :: T when vertical diffusion is not constant
123        INTEGER iMin, iMax, jMin, jMax        INTEGER iMin, iMax, jMin, jMax
124        INTEGER i, j, k        INTEGER i, j, k
# Line 119  C   useVariableK :: T when vertical diff Line 133  C   useVariableK :: T when vertical diff
133        _RL fZon    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL fZon    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
134        _RL fMer    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL fMer    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
135        _RL fVer    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)        _RL fVer    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
136          _RL gT_loc  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
137          _RL gtForc  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
138        _RL gt_AB   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL gt_AB   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
139    #ifdef ALLOW_DIAGNOSTICS
140          LOGICAL diagForcing, diagAB_tend
141    #endif
142        LOGICAL calcAdvection        LOGICAL calcAdvection
143        INTEGER iterNb        INTEGER iterNb
144  #ifdef ALLOW_ADAMSBASHFORTH_3  #ifdef ALLOW_ADAMSBASHFORTH_3
145        INTEGER m1, m2        INTEGER m2
146  #endif  #endif
147  #ifdef ALLOW_TIMEAVE  #ifdef ALLOW_TIMEAVE
148        LOGICAL useVariableK        LOGICAL useVariableK
# Line 131  C   useVariableK :: T when vertical diff Line 150  C   useVariableK :: T when vertical diff
150    
151  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
152    
 C-    Loop ranges for daughter routines  
       iMin = 1-OLx+2  
       iMax = sNx+OLx-1  
       jMin = 1-OLy+2  
       jMax = sNy+OLy-1  
   
153        iterNb = myIter        iterNb = myIter
154        IF (staggerTimeStep) iterNb = myIter - 1        IF (staggerTimeStep) iterNb = myIter - 1
155    
156    C-    Loop ranges for daughter routines:
157    c     iMin = 1
158    c     iMax = sNx
159    c     jMin = 1
160    c     jMax = sNy
161    C     Regarding model dynamics, only needs to get correct tracer tendency
162    C     (gT_loc) in tile interior (1:sNx,1:sNy);
163    C     However, for some diagnostics, we may want to get valid tendency
164    C     extended over 1 point in tile halo region (0:sNx+1,0:sNy=1).
165          iMin = 0
166          iMax = sNx+1
167          jMin = 0
168          jMax = sNy+1
169    
170    #ifdef ALLOW_DIAGNOSTICS
171          diagForcing = .FALSE.
172          diagAB_tend = .FALSE.
173          IF ( useDiagnostics .AND. tempForcing )
174         &     diagForcing = DIAGNOSTICS_IS_ON( 'gT_Forc ', myThid )
175          IF ( useDiagnostics .AND. AdamsBashforthGt )
176         &     diagAB_tend = DIAGNOSTICS_IS_ON( 'AB_gT   ', myThid )
177    #endif
178    
179  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
180            act1 = bi - myBxLo(myThid)            act1 = bi - myBxLo(myThid)
181            max1 = myBxHi(myThid) - myBxLo(myThid) + 1            max1 = myBxHi(myThid) - myBxLo(myThid) + 1
# Line 153  C-    Loop ranges for daughter routines Line 189  C-    Loop ranges for daughter routines
189       &                      + act4*max1*max2*max3       &                      + act4*max1*max2*max3
190  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
191    
192    C-    Apply AB on T :
193          IF ( AdamsBashforth_T ) THEN
194    C     compute T^n+1/2 (stored in gtNm) extrapolating T forward in time
195    #ifdef ALLOW_ADAMSBASHFORTH_3
196    c         m1 = 1 + MOD(iterNb+1,2)
197    c         m2 = 1 + MOD( iterNb ,2)
198              CALL ADAMS_BASHFORTH3(
199         I                           bi, bj, 0, Nr,
200         I                           theta(1-OLx,1-OLy,1,bi,bj),
201         U                           gtNm, gt_AB,
202         I                           tempStartAB, iterNb, myThid )
203    #else /* ALLOW_ADAMSBASHFORTH_3 */
204              CALL ADAMS_BASHFORTH2(
205         I                           bi, bj, 0, Nr,
206         I                           theta(1-OLx,1-OLy,1,bi,bj),
207         U                           gtNm1(1-OLx,1-OLy,1,bi,bj), gt_AB,
208         I                           tempStartAB, iterNb, myThid )
209    #endif /* ALLOW_ADAMSBASHFORTH_3 */
210          ENDIF
211    
212  C-    Tracer tendency needs to be set to zero (moved here from gad_calc_rhs):  C-    Tracer tendency needs to be set to zero (moved here from gad_calc_rhs):
213        DO k=1,Nr        DO k=1,Nr
214         DO j=1-OLy,sNy+OLy         DO j=1-OLy,sNy+OLy
215          DO i=1-OLx,sNx+OLx          DO i=1-OLx,sNx+OLx
216           gT(i,j,k,bi,bj) = 0. _d 0           gT_loc(i,j,k) = 0. _d 0
217          ENDDO          ENDDO
218         ENDDO         ENDDO
219        ENDDO        ENDDO
# Line 175  C-    Tracer tendency needs to be set to Line 231  C-    Tracer tendency needs to be set to
231          ENDDO          ENDDO
232         ENDDO         ENDDO
233        ENDDO        ENDDO
234  CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte  CADJ STORE wFld(:,:,:)         = comlev1_bibj , key=itdkey, byte=isbyte
235  CADJ STORE wFld(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte  CADJ STORE theta(:,:,:,bi,bj)  = comlev1_bibj , key=itdkey, byte=isbyte
236    # ifdef ALLOW_ADAMSBASHFORTH_3
237    CADJ STORE gtNm(:,:,:,bi,bj,1) = comlev1_bibj, key=itdkey, byte=isbyte
238    CADJ STORE gtNm(:,:,:,bi,bj,2) = comlev1_bibj, key=itdkey, byte=isbyte
239    # else
240    CADJ STORE gtNm1(:,:,:,bi,bj)  = comlev1_bibj, key=itdkey, byte=isbyte
241    # endif
242  #endif /* ALLOW_AUTODIFF */  #endif /* ALLOW_AUTODIFF */
243    
244  #ifdef INCLUDE_CALC_DIFFUSIVITY_CALL  #ifdef INCLUDE_CALC_DIFFUSIVITY_CALL
# Line 207  CADJ STORE som_T = comlev1_bibj, key=itd Line 269  CADJ STORE som_T = comlev1_bibj, key=itd
269          IF (debugMode) CALL DEBUG_CALL('GAD_SOM_ADVECT',myThid)          IF (debugMode) CALL DEBUG_CALL('GAD_SOM_ADVECT',myThid)
270  # endif  # endif
271          CALL GAD_SOM_ADVECT(          CALL GAD_SOM_ADVECT(
272       I             tempImplVertAdv, tempAdvScheme, tempVertAdvScheme,       I             tempImplVertAdv,
273       I             GAD_TEMPERATURE, dTtracerLev,       I             tempAdvScheme, tempVertAdvScheme, GAD_TEMPERATURE,
274       I             uFld, vFld, wFld, theta,       I             dTtracerLev, uFld, vFld, wFld, theta,
275       U             som_T,       U             som_T,
276       O             gT,       O             gT_loc,
277       I             bi, bj, myTime, myIter, myThid )       I             bi, bj, myTime, myIter, myThid )
278        ELSEIF (tempMultiDimAdvec) THEN        ELSEIF (tempMultiDimAdvec) THEN
279  #else /* GAD_ALLOW_TS_SOM_ADV */  #else /* GAD_ALLOW_TS_SOM_ADV */
# Line 221  CADJ STORE som_T = comlev1_bibj, key=itd Line 283  CADJ STORE som_T = comlev1_bibj, key=itd
283          IF (debugMode) CALL DEBUG_CALL('GAD_ADVECTION',myThid)          IF (debugMode) CALL DEBUG_CALL('GAD_ADVECTION',myThid)
284  # endif  # endif
285          CALL GAD_ADVECTION(          CALL GAD_ADVECTION(
286       I             tempImplVertAdv, tempAdvScheme, tempVertAdvScheme,       I             tempImplVertAdv,
287       I             GAD_TEMPERATURE, dTtracerLev,       I             tempAdvScheme, tempVertAdvScheme, GAD_TEMPERATURE,
288       I             uFld, vFld, wFld, theta,       I             dTtracerLev, uFld, vFld, wFld, theta,
289       O             gT,       O             gT_loc,
290       I             bi, bj, myTime, myIter, myThid )       I             bi, bj, myTime, myIter, myThid )
291        ENDIF        ENDIF
292  #endif /* DISABLE_MULTIDIM_ADVECTION */  #endif /* DISABLE_MULTIDIM_ADVECTION */
# Line 244  C-    Start vertical index (k) loop (Nr: Line 306  C-    Start vertical index (k) loop (Nr:
306  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
307  CADJ STORE fVer(:,:,:) = comlev1_bibj_k, key=kkey,  CADJ STORE fVer(:,:,:) = comlev1_bibj_k, key=kkey,
308  CADJ &     byte=isbyte,  kind = isbyte  CADJ &     byte=isbyte,  kind = isbyte
309  CADJ STORE gT(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey,  CADJ STORE gT_loc(:,:,k) = comlev1_bibj_k, key=kkey,
310  CADJ &     byte=isbyte,  kind = isbyte  CADJ &     byte=isbyte,  kind = isbyte
311  # ifdef ALLOW_ADAMSBASHFORTH_3  # ifdef ALLOW_ADAMSBASHFORTH_3
312  CADJ STORE gtNm(:,:,k,bi,bj,1) = comlev1_bibj_k, key=kkey,  CADJ STORE gtNm(:,:,k,bi,bj,1) = comlev1_bibj_k, key=kkey,
# Line 263  CADJ &     byte=isbyte,  kind = isbyte Line 325  CADJ &     byte=isbyte,  kind = isbyte
325       O                maskUp, xA, yA,       O                maskUp, xA, yA,
326       I                k, bi, bj, myThid )       I                k, bi, bj, myThid )
327    
328    C--   Collect forcing term in local array gtForc:
329            DO j=1-OLy,sNy+OLy
330             DO i=1-OLx,sNx+OLx
331              gtForc(i,j) = 0. _d 0
332             ENDDO
333            ENDDO
334            IF ( tempForcing ) THEN
335              CALL APPLY_FORCING_T(
336         U                        gtForc,
337         I                        iMin,iMax,jMin,jMax, k, bi,bj,
338         I                        myTime, myIter, myThid )
339    #ifdef ALLOW_DIAGNOSTICS
340              IF ( diagForcing ) THEN
341                CALL DIAGNOSTICS_FILL(gtForc,'gT_Forc ',k,1,2,bi,bj,myThid)
342              ENDIF
343    #endif /* ALLOW_DIAGNOSTICS */
344            ENDIF
345    
346  #ifdef ALLOW_ADAMSBASHFORTH_3  #ifdef ALLOW_ADAMSBASHFORTH_3
347          m1 = 1 + MOD(iterNb+1,2)  c       m1 = 1 + MOD(iterNb+1,2)
348          m2 = 1 + MOD( iterNb ,2)          m2 = 1 + MOD( iterNb ,2)
349          CALL GAD_CALC_RHS(          CALL GAD_CALC_RHS(
350       I           bi, bj, iMin,iMax,jMin,jMax, k, kM1, kUp, kDown,       I           bi, bj, iMin,iMax,jMin,jMax, k, kM1, kUp, kDown,
# Line 272  CADJ &     byte=isbyte,  kind = isbyte Line 352  CADJ &     byte=isbyte,  kind = isbyte
352       I           vFld(1-OLx,1-OLy,k), wFld(1-OLx,1-OLy,k),       I           vFld(1-OLx,1-OLy,k), wFld(1-OLx,1-OLy,k),
353       I           uTrans, vTrans, rTrans, rTransKp,       I           uTrans, vTrans, rTrans, rTransKp,
354       I           diffKhT, diffK4T, KappaRk(1-OLx,1-OLy,k), diffKr4T,       I           diffKhT, diffK4T, KappaRk(1-OLx,1-OLy,k), diffKr4T,
355       I           gtNm(1-OLx,1-OLy,1,1,1,m2), theta, dTtracerLev,       I           theta(1-OLx,1-OLy,1,bi,bj),
356         I           gtNm(1-OLx,1-OLy,1,bi,bj,m2), dTtracerLev,
357       I           GAD_TEMPERATURE, tempAdvScheme, tempVertAdvScheme,       I           GAD_TEMPERATURE, tempAdvScheme, tempVertAdvScheme,
358       I           calcAdvection, tempImplVertAdv, AdamsBashforth_T,       I           calcAdvection, tempImplVertAdv, AdamsBashforth_T,
359       I           tempVertDiff4, useGMRedi, useKPP,       I           tempVertDiff4, useGMRedi, useKPP,
360       O           fZon, fMer,       O           fZon, fMer,
361       U           fVer, gT,       U           fVer, gT_loc,
362       I           myTime, myIter, myThid )       I           myTime, myIter, myThid )
363  #else /* ALLOW_ADAMSBASHFORTH_3 */  #else /* ALLOW_ADAMSBASHFORTH_3 */
364          CALL GAD_CALC_RHS(          CALL GAD_CALC_RHS(
# Line 286  CADJ &     byte=isbyte,  kind = isbyte Line 367  CADJ &     byte=isbyte,  kind = isbyte
367       I           vFld(1-OLx,1-OLy,k), wFld(1-OLx,1-OLy,k),       I           vFld(1-OLx,1-OLy,k), wFld(1-OLx,1-OLy,k),
368       I           uTrans, vTrans, rTrans, rTransKp,       I           uTrans, vTrans, rTrans, rTransKp,
369       I           diffKhT, diffK4T, KappaRk(1-OLx,1-OLy,k), diffKr4T,       I           diffKhT, diffK4T, KappaRk(1-OLx,1-OLy,k), diffKr4T,
370       I           gtNm1, theta, dTtracerLev,       I           theta(1-OLx,1-OLy,1,bi,bj),
371         I           gtNm1(1-OLx,1-OLy,1,bi,bj), dTtracerLev,
372       I           GAD_TEMPERATURE, tempAdvScheme, tempVertAdvScheme,       I           GAD_TEMPERATURE, tempAdvScheme, tempVertAdvScheme,
373       I           calcAdvection, tempImplVertAdv, AdamsBashforth_T,       I           calcAdvection, tempImplVertAdv, AdamsBashforth_T,
374       I           tempVertDiff4, useGMRedi, useKPP,       I           tempVertDiff4, useGMRedi, useKPP,
375       O           fZon, fMer,       O           fZon, fMer,
376       U           fVer, gT,       U           fVer, gT_loc,
377       I           myTime, myIter, myThid )       I           myTime, myIter, myThid )
378  #endif  #endif
379    
380  C--   External thermal forcing term(s) inside Adams-Bashforth:  C--   External thermal forcing term(s) inside Adams-Bashforth:
381          IF ( tempForcing .AND. tracForcingOutAB.NE.1 )          IF ( tempForcing .AND. tracForcingOutAB.NE.1 ) THEN
382       &    CALL EXTERNAL_FORCING_T(            DO j=1-OLy,sNy+OLy
383       I         iMin, iMax, jMin, jMax, bi, bj, k,             DO i=1-OLx,sNx+OLx
384       I         myTime, myThid )              gT_loc(i,j,k) = gT_loc(i,j,k) + gtForc(i,j)
385               ENDDO
386              ENDDO
387            ENDIF
388    
389          IF ( AdamsBashforthGt ) THEN          IF ( AdamsBashforthGt ) THEN
390  #ifdef ALLOW_ADAMSBASHFORTH_3  #ifdef ALLOW_ADAMSBASHFORTH_3
391            CALL ADAMS_BASHFORTH3(            CALL ADAMS_BASHFORTH3(
392       I                          bi, bj, k, Nr,       I                          bi, bj, k, Nr,
393       U                          gT, gtNm, gt_AB,       U                          gT_loc, gtNm,
394         O                          gt_AB,
395       I                          tempStartAB, iterNb, myThid )       I                          tempStartAB, iterNb, myThid )
396  #else  #else
397            CALL ADAMS_BASHFORTH2(            CALL ADAMS_BASHFORTH2(
398       I                          bi, bj, k, Nr,       I                          bi, bj, k, Nr,
399       U                          gT, gtNm1, gt_AB,       U                          gT_loc, gtNm1(1-OLx,1-OLy,1,bi,bj),
400         O                          gt_AB,
401       I                          tempStartAB, iterNb, myThid )       I                          tempStartAB, iterNb, myThid )
402  #endif  #endif
403  #ifdef ALLOW_DIAGNOSTICS  #ifdef ALLOW_DIAGNOSTICS
404            IF ( useDiagnostics ) THEN            IF ( diagAB_tend ) THEN
405              CALL DIAGNOSTICS_FILL(gt_AB,'AB_gT   ',k,1,2,bi,bj,myThid)              CALL DIAGNOSTICS_FILL(gt_AB,'AB_gT   ',k,1,2,bi,bj,myThid)
406            ENDIF            ENDIF
407  #endif /* ALLOW_DIAGNOSTICS */  #endif /* ALLOW_DIAGNOSTICS */
408          ENDIF          ENDIF
409    
410  C--   External thermal forcing term(s) outside Adams-Bashforth:  C--   External thermal forcing term(s) outside Adams-Bashforth:
411          IF ( tempForcing .AND. tracForcingOutAB.EQ.1 )          IF ( tempForcing .AND. tracForcingOutAB.EQ.1 ) THEN
412       &    CALL EXTERNAL_FORCING_T(            DO j=1-OLy,sNy+OLy
413       I         iMin, iMax, jMin, jMax, bi, bj, k,             DO i=1-OLx,sNx+OLx
414       I         myTime, myThid )              gT_loc(i,j,k) = gT_loc(i,j,k) + gtForc(i,j)
415               ENDDO
416              ENDDO
417            ENDIF
418    
419  #ifdef NONLIN_FRSURF  #ifdef NONLIN_FRSURF
420          IF (nonlinFreeSurf.GT.0) THEN          IF (nonlinFreeSurf.GT.0) THEN
421            CALL FREESURF_RESCALE_G(            CALL FREESURF_RESCALE_G(
422       I                            bi, bj, k,       I                            bi, bj, k,
423       U                            gT,       U                            gT_loc,
424       I                            myThid )       I                            myThid )
425           IF ( AdamsBashforthGt ) THEN           IF ( AdamsBashforthGt ) THEN
426  #ifdef ALLOW_ADAMSBASHFORTH_3  #ifdef ALLOW_ADAMSBASHFORTH_3
# Line 342  CADJ &     byte=isbyte,  kind = isbyte Line 432  CADJ &     byte=isbyte,  kind = isbyte
432  # endif  # endif
433            CALL FREESURF_RESCALE_G(            CALL FREESURF_RESCALE_G(
434       I                            bi, bj, k,       I                            bi, bj, k,
435       U                            gtNm(1-OLx,1-OLy,1,1,1,1),       U                            gtNm(1-OLx,1-OLy,1,bi,bj,1),
436       I                            myThid )       I                            myThid )
437            CALL FREESURF_RESCALE_G(            CALL FREESURF_RESCALE_G(
438       I                            bi, bj, k,       I                            bi, bj, k,
439       U                            gtNm(1-OLx,1-OLy,1,1,1,2),       U                            gtNm(1-OLx,1-OLy,1,bi,bj,2),
440       I                            myThid )       I                            myThid )
441  #else  #else
442            CALL FREESURF_RESCALE_G(            CALL FREESURF_RESCALE_G(
443       I                            bi, bj, k,       I                            bi, bj, k,
444       U                            gtNm1,       U                            gtNm1(1-OLx,1-OLy,1,bi,bj),
445       I                            myThid )       I                            myThid )
446  #endif  #endif
447           ENDIF           ENDIF
448          ENDIF          ENDIF
449  #endif /* NONLIN_FRSURF */  #endif /* NONLIN_FRSURF */
450    
 #ifdef ALLOW_ADAMSBASHFORTH_3  
         IF ( AdamsBashforth_T ) THEN  
           CALL TIMESTEP_TRACER(  
      I           bi, bj, k, dTtracerLev(k),  
      I           gtNm(1-OLx,1-OLy,1,1,1,m2),  
      U           gT,  
      I           myIter, myThid )  
         ELSE  
 #endif  
           CALL TIMESTEP_TRACER(  
      I           bi, bj, k, dTtracerLev(k),  
      I           theta,  
      U           gT,  
      I           myIter, myThid )  
 #ifdef ALLOW_ADAMSBASHFORTH_3  
         ENDIF  
 #endif  
   
451  C-    end of vertical index (k) loop (Nr:1)  C-    end of vertical index (k) loop (Nr:1)
452        ENDDO        ENDDO
453    
# Line 384  C-    end of vertical index (k) loop (Nr Line 456  C-    end of vertical index (k) loop (Nr
456          IF ( usingPCoords ) THEN          IF ( usingPCoords ) THEN
457            CALL DWNSLP_APPLY(            CALL DWNSLP_APPLY(
458       I                  GAD_TEMPERATURE, bi, bj, kSurfC,       I                  GAD_TEMPERATURE, bi, bj, kSurfC,
459       I                  recip_drF, recip_hFacC, recip_rA,       I                  theta(1-OLx,1-OLy,1,bi,bj),
460       I                  dTtracerLev,       U                  gT_loc,
461       I                  theta,       I                  recip_hFac, recip_rA, recip_drF,
462       U                  gT,       I                  dTtracerLev, myTime, myIter, myThid )
      I                  myTime, myIter, myThid )  
463          ELSE          ELSE
464            CALL DWNSLP_APPLY(            CALL DWNSLP_APPLY(
465       I                  GAD_TEMPERATURE, bi, bj, kLowC,       I                  GAD_TEMPERATURE, bi, bj, kLowC,
466       I                  recip_drF, recip_hFacC, recip_rA,       I                  theta(1-OLx,1-OLy,1,bi,bj),
467       I                  dTtracerLev,       U                  gT_loc,
468       I                  theta,       I                  recip_hFac, recip_rA, recip_drF,
469       U                  gT,       I                  dTtracerLev, myTime, myIter, myThid )
      I                  myTime, myIter, myThid )  
470          ENDIF          ENDIF
471        ENDIF        ENDIF
472  #endif /* ALLOW_DOWN_SLOPE */  #endif /* ALLOW_DOWN_SLOPE */
473    
474        iMin = 0  C-    Integrate forward in time, storing in gT_loc:  gT <= T + dt*gT
475        iMax = sNx+1        CALL TIMESTEP_TRACER(
476        jMin = 0       I                  bi, bj, dTtracerLev,
477        jMax = sNy+1       I                  theta(1-OLx,1-OLy,1,bi,bj),
478         U                  gT_loc,
479         I                  myTime, myIter, myThid )
480    
481  C--   Implicit vertical advection & diffusion  C--   Implicit vertical advection & diffusion
482    
483  #ifdef INCLUDE_IMPLVERTADV_CODE  #ifdef INCLUDE_IMPLVERTADV_CODE
484        IF ( tempImplVertAdv ) THEN        IF ( tempImplVertAdv ) THEN
485  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
486  CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte  CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
487    CADJ STORE gT_loc(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
488    CADJ STORE wFld(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
489    CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
490    CADJ STORE recip_hFac(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
491  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
492          CALL GAD_IMPLICIT_R(          CALL GAD_IMPLICIT_R(
493       I         tempImplVertAdv, tempVertAdvScheme, GAD_TEMPERATURE,       I         tempImplVertAdv, tempVertAdvScheme, GAD_TEMPERATURE,
494       I         dTtracerLev,       I         dTtracerLev, kappaRk, recip_hFac, wFld,
495       I         kappaRk, recip_hFac, wFld, theta,       I         theta(1-OLx,1-OLy,1,bi,bj),
496       U         gT,       U         gT_loc,
497       I         bi, bj, myTime, myIter, myThid )       I         bi, bj, myTime, myIter, myThid )
498        ELSEIF ( implicitDiffusion ) THEN        ELSEIF ( implicitDiffusion ) THEN
499  #else /* INCLUDE_IMPLVERTADV_CODE */  #else /* INCLUDE_IMPLVERTADV_CODE */
500        IF     ( implicitDiffusion ) THEN        IF     ( implicitDiffusion ) THEN
501  #endif /* INCLUDE_IMPLVERTADV_CODE */  #endif /* INCLUDE_IMPLVERTADV_CODE */
502  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
503  CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte  CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
504    CADJ STORE gT_loc(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
505  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
506          CALL IMPLDIFF(          CALL IMPLDIFF(
507       I         bi, bj, iMin, iMax, jMin, jMax,       I         bi, bj, iMin, iMax, jMin, jMax,
508       I         GAD_TEMPERATURE, kappaRk, recip_hFac,       I         GAD_TEMPERATURE, kappaRk, recip_hFac,
509       U         gT,       U         gT_loc,
510       I         myThid )       I         myThid )
511        ENDIF        ENDIF
512    
513  #ifdef ALLOW_TIMEAVE  #ifdef ALLOW_TIMEAVE
514        useVariableK = useKPP .OR. usePP81 .OR. useMY82 .OR. useGGL90        useVariableK = useKPP .OR. usePP81 .OR. useKL10 .OR. useMY82
515       &       .OR. useGMredi .OR. ivdc_kappa.NE.0.       &       .OR. useGGL90 .OR. useGMredi .OR. ivdc_kappa.NE.0.
516        IF ( taveFreq.GT.0. .AND. useVariableK        IF ( taveFreq.GT.0. .AND. useVariableK
517       &                    .AND.implicitDiffusion ) THEN       &                    .AND.implicitDiffusion ) THEN
518          CALL TIMEAVE_CUMUL_DIF_1T(TdiffRtave, gT, kappaRk,          CALL TIMEAVE_CUMUL_DIF_1T( TdiffRtave,
519       I                        Nr, 3, deltaTClock, bi, bj, myThid)       I                        gT_loc, kappaRk,
520         I                        Nr, 3, deltaTClock, bi, bj, myThid )
521        ENDIF        ENDIF
522  #endif /* ALLOW_TIMEAVE */  #endif /* ALLOW_TIMEAVE */
523    
524          IF ( AdamsBashforth_T ) THEN
525    C-    Save current tracer field (for AB on tracer) and then update tracer
526    #ifdef ALLOW_ADAMSBASHFORTH_3
527            CALL CYCLE_AB_TRACER(
528         I             bi, bj, gT_loc,
529         U             theta(1-OLx,1-OLy,1,bi,bj),
530         O             gtNm(1-OLx,1-OLy,1,bi,bj,m2),
531         I             myTime, myIter, myThid )
532    #else /* ALLOW_ADAMSBASHFORTH_3 */
533            CALL CYCLE_AB_TRACER(
534         I             bi, bj, gT_loc,
535         U             theta(1-OLx,1-OLy,1,bi,bj),
536         O             gtNm1(1-OLx,1-OLy,1,bi,bj),
537         I             myTime, myIter, myThid )
538    #endif /* ALLOW_ADAMSBASHFORTH_3 */
539          ELSE
540    C-    Update tracer fields:  T(n) = T**
541            CALL CYCLE_TRACER(
542         I             bi, bj,
543         O             theta(1-OLx,1-OLy,1,bi,bj),
544         I             gT_loc, myTime, myIter, myThid )
545          ENDIF
546    
547  #endif /* ALLOW_GENERIC_ADVDIFF */  #endif /* ALLOW_GENERIC_ADVDIFF */
548    
549        RETURN        RETURN

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.18

  ViewVC Help
Powered by ViewVC 1.1.22