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

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

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

revision 1.2 by heimbach, Mon Aug 13 18:05:26 2001 UTC revision 1.54 by edhill, Fri Oct 24 05:29:35 2003 UTC
# Line 1  Line 1 
1  C $Header$  C $Header$
2  C $Name$  C $Name$
3    
4    #include "PACKAGES_CONFIG.h"
5  #include "CPP_OPTIONS.h"  #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_PTRACERS
15    # include "PTRACERS_OPTIONS.h"
16    #endif
17    #endif /* ALLOW_AUTODIFF_TAMC */
18    
19    CBOP
20    C     !ROUTINE: THERMODYNAMICS
21    C     !INTERFACE:
22        SUBROUTINE THERMODYNAMICS(myTime, myIter, myThid)        SUBROUTINE THERMODYNAMICS(myTime, myIter, myThid)
23  C     /==========================================================\  C     !DESCRIPTION: \bv
24  C     | SUBROUTINE THERMODYNAMICS                                |  C     *==========================================================*
25  C     | o Controlling routine for the prognostic part of the     |  C     | SUBROUTINE THERMODYNAMICS                                
26  C     |   thermo-dynamics.                                       |  C     | o Controlling routine for the prognostic part of the      
27  C     |==========================================================|  C     |   thermo-dynamics.                                        
28  C     \==========================================================/  C     *===========================================================
29        IMPLICIT NONE  C     | The algorithm...
30    C     |
31    C     | "Correction Step"
32    C     | =================
33    C     | Here we update the horizontal velocities with the surface
34    C     | pressure such that the resulting flow is either consistent
35    C     | with the free-surface evolution or the rigid-lid:
36    C     |   U[n] = U* + dt x d/dx P
37    C     |   V[n] = V* + dt x d/dy P
38    C     |
39    C     | "Calculation of Gs"
40    C     | ===================
41    C     | This is where all the accelerations and tendencies (ie.
42    C     | physics, parameterizations etc...) are calculated
43    C     |   rho = rho ( theta[n], salt[n] )
44    C     |   b   = b(rho, theta)
45    C     |   K31 = K31 ( rho )
46    C     |   Gu[n] = Gu( u[n], v[n], wVel, b, ... )
47    C     |   Gv[n] = Gv( u[n], v[n], wVel, b, ... )
48    C     |   Gt[n] = Gt( theta[n], u[n], v[n], wVel, K31, ... )
49    C     |   Gs[n] = Gs( salt[n], u[n], v[n], wVel, K31, ... )
50    C     |
51    C     | "Time-stepping" or "Prediction"
52    C     | ================================
53    C     | The models variables are stepped forward with the appropriate
54    C     | time-stepping scheme (currently we use Adams-Bashforth II)
55    C     | - For momentum, the result is always *only* a "prediction"
56    C     | in that the flow may be divergent and will be "corrected"
57    C     | later with a surface pressure gradient.
58    C     | - Normally for tracers the result is the new field at time
59    C     | level [n+1} *BUT* in the case of implicit diffusion the result
60    C     | is also *only* a prediction.
61    C     | - We denote "predictors" with an asterisk (*).
62    C     |   U* = U[n] + dt x ( 3/2 Gu[n] - 1/2 Gu[n-1] )
63    C     |   V* = V[n] + dt x ( 3/2 Gv[n] - 1/2 Gv[n-1] )
64    C     |   theta[n+1] = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
65    C     |   salt[n+1] = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
66    C     | With implicit diffusion:
67    C     |   theta* = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
68    C     |   salt* = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
69    C     |   (1 + dt * K * d_zz) theta[n] = theta*
70    C     |   (1 + dt * K * d_zz) salt[n] = salt*
71    C     |
72    C     *==========================================================*
73    C     \ev
74    
75    C     !USES:
76          IMPLICIT NONE
77  C     == Global variables ===  C     == Global variables ===
78  #include "SIZE.h"  #include "SIZE.h"
79  #include "EEPARAMS.h"  #include "EEPARAMS.h"
80  #include "PARAMS.h"  #include "PARAMS.h"
81  #include "DYNVARS.h"  #include "DYNVARS.h"
82  #include "GRID.h"  #include "GRID.h"
83    #include "GAD.h"
84  #ifdef ALLOW_PASSIVE_TRACER  #ifdef ALLOW_PASSIVE_TRACER
85  #include "TR1.h"  #include "TR1.h"
86  #endif  #endif
87    #ifdef ALLOW_PTRACERS
88    #include "PTRACERS.h"
89    #endif
90    #ifdef ALLOW_TIMEAVE
91    #include "TIMEAVE_STATV.h"
92    #endif
93    
94  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
95  # include "tamc.h"  # include "tamc.h"
96  # include "tamc_keys.h"  # include "tamc_keys.h"
97  # include "FFIELDS.h"  # include "FFIELDS.h"
98    # include "EOS.h"
99  # ifdef ALLOW_KPP  # ifdef ALLOW_KPP
100  #  include "KPP.h"  #  include "KPP.h"
101  # endif  # endif
# Line 34  C     == Global variables === Line 104  C     == Global variables ===
104  # endif  # endif
105  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
106    
107  #ifdef ALLOW_TIMEAVE  C     !INPUT/OUTPUT PARAMETERS:
 #include "TIMEAVE_STATV.h"  
 #endif  
   
108  C     == Routine arguments ==  C     == Routine arguments ==
109  C     myTime - Current time in simulation  C     myTime - Current time in simulation
110  C     myIter - Current iteration number in simulation  C     myIter - Current iteration number in simulation
# Line 46  C     myThid - Thread number for this in Line 113  C     myThid - Thread number for this in
113        INTEGER myIter        INTEGER myIter
114        INTEGER myThid        INTEGER myThid
115    
116    C     !LOCAL VARIABLES:
117  C     == Local variables  C     == Local variables
118  C     xA, yA                 - Per block temporaries holding face areas  C     xA, yA                 - Per block temporaries holding face areas
119  C     uTrans, vTrans, rTrans - Per block temporaries holding flow  C     uTrans, vTrans, rTrans - Per block temporaries holding flow
# Line 59  C                                      i Line 127  C                                      i
127  C                                      so we need an fVer for each  C                                      so we need an fVer for each
128  C                                      variable.  C                                      variable.
129  C     rhoK, rhoKM1   - Density at current level, and level above  C     rhoK, rhoKM1   - Density at current level, and level above
 C     phiHyd         - Hydrostatic part of the potential phiHydi.  
 C                      In z coords phiHydiHyd is the hydrostatic  
 C                      Potential (=pressure/rho0) anomaly  
 C                      In p coords phiHydiHyd is the geopotential  
 C                      surface height anomaly.  
130  C     phiSurfX, - gradient of Surface potentiel (Pressure/rho, ocean)  C     phiSurfX, - gradient of Surface potentiel (Pressure/rho, ocean)
131  C     phiSurfY             or geopotentiel (atmos) in X and Y direction  C     phiSurfY             or geopotentiel (atmos) in X and Y direction
132  C     KappaRT,       - Total diffusion in vertical for T and S.  C     KappaRT,       - Total diffusion in vertical for T and S.
133  C     KappaRS          (background + spatially varying, isopycnal term).  C     KappaRS          (background + spatially varying, isopycnal term).
134    C     useVariableK   = T when vertical diffusion is not constant
135  C     iMin, iMax     - Ranges and sub-block indices on which calculations  C     iMin, iMax     - Ranges and sub-block indices on which calculations
136  C     jMin, jMax       are applied.  C     jMin, jMax       are applied.
137  C     bi, bj  C     bi, bj
138  C     k, kup,        - Index for layer above and below. kup and kDown  C     k, kup,        - Index for layer above and below. kup and kDown
139  C     kDown, km1       are switched with layer to be the appropriate  C     kDown, km1       are switched with layer to be the appropriate
140  C                      index into fVerTerm.  C                      index into fVerTerm.
 C     tauAB - Adams-Bashforth timestepping weight: 0=forward ; 1/2=Adams-Bashf.  
141        _RS xA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RS xA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
142        _RS yA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RS yA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
143        _RL uTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL uTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
# Line 84  C     tauAB - Adams-Bashforth timesteppi Line 147  C     tauAB - Adams-Bashforth timesteppi
147        _RL fVerT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)        _RL fVerT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
148        _RL fVerS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)        _RL fVerS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
149        _RL fVerTr1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)        _RL fVerTr1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
       _RL phiHyd  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)  
150        _RL rhokm1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL rhokm1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
151        _RL rhok    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL rhok    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
152        _RL phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
# Line 94  C     tauAB - Adams-Bashforth timesteppi Line 156  C     tauAB - Adams-Bashforth timesteppi
156        _RL sigmaX  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)        _RL sigmaX  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
157        _RL sigmaY  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)        _RL sigmaY  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
158        _RL sigmaR  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)        _RL sigmaR  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
159        _RL tauAB  C     This is currently used by IVDC and Diagnostics
   
 C This is currently used by IVDC and Diagnostics  
160        _RL ConvectCount (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)        _RL ConvectCount (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
161          LOGICAL useVariableK
162        INTEGER iMin, iMax        INTEGER iMin, iMax
163        INTEGER jMin, jMax        INTEGER jMin, jMax
164        INTEGER bi, bj        INTEGER bi, bj
165        INTEGER i, j        INTEGER i, j
166        INTEGER k, km1, kup, kDown        INTEGER k, km1, kup, kDown
167          INTEGER iTracer
168    
169  Cjmc : add for phiHyd output <- but not working if multi tile per CPU  CEOP
 c     CHARACTER*(MAX_LEN_MBUF) suff  
 c     LOGICAL  DIFFERENT_MULTIPLE  
 c     EXTERNAL DIFFERENT_MULTIPLE  
 Cjmc(end)  
   
 C---    The algorithm...  
 C  
 C       "Correction Step"  
 C       =================  
 C       Here we update the horizontal velocities with the surface  
 C       pressure such that the resulting flow is either consistent  
 C       with the free-surface evolution or the rigid-lid:  
 C         U[n] = U* + dt x d/dx P  
 C         V[n] = V* + dt x d/dy P  
 C  
 C       "Calculation of Gs"  
 C       ===================  
 C       This is where all the accelerations and tendencies (ie.  
 C       physics, parameterizations etc...) are calculated  
 C         rho = rho ( theta[n], salt[n] )  
 C         b   = b(rho, theta)  
 C         K31 = K31 ( rho )  
 C         Gu[n] = Gu( u[n], v[n], wVel, b, ... )  
 C         Gv[n] = Gv( u[n], v[n], wVel, b, ... )  
 C         Gt[n] = Gt( theta[n], u[n], v[n], wVel, K31, ... )  
 C         Gs[n] = Gs( salt[n], u[n], v[n], wVel, K31, ... )  
 C  
 C       "Time-stepping" or "Prediction"  
 C       ================================  
 C       The models variables are stepped forward with the appropriate  
 C       time-stepping scheme (currently we use Adams-Bashforth II)  
 C       - For momentum, the result is always *only* a "prediction"  
 C       in that the flow may be divergent and will be "corrected"  
 C       later with a surface pressure gradient.  
 C       - Normally for tracers the result is the new field at time  
 C       level [n+1} *BUT* in the case of implicit diffusion the result  
 C       is also *only* a prediction.  
 C       - We denote "predictors" with an asterisk (*).  
 C         U* = U[n] + dt x ( 3/2 Gu[n] - 1/2 Gu[n-1] )  
 C         V* = V[n] + dt x ( 3/2 Gv[n] - 1/2 Gv[n-1] )  
 C         theta[n+1] = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )  
 C         salt[n+1] = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )  
 C       With implicit diffusion:  
 C         theta* = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )  
 C         salt* = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )  
 C         (1 + dt * K * d_zz) theta[n] = theta*  
 C         (1 + dt * K * d_zz) salt[n] = salt*  
 C---  
170    
171    #ifndef DISABLE_DEBUGMODE
172             IF ( debugLevel .GE. debLevB )
173         &    CALL DEBUG_ENTER('FORWARD_STEP',myThid)
174    #endif
175    
176  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
177  C--   dummy statement to end declaration part  C--   dummy statement to end declaration part
178        ikey = 1        ikey = 1
179          itdkey = 1
180  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
181    
 C--   Set up work arrays with valid (i.e. not NaN) values  
 C     These inital values do not alter the numerical results. They  
 C     just ensure that all memory references are to valid floating  
 C     point numbers. This prevents spurious hardware signals due to  
 C     uninitialised but inert locations.  
       DO j=1-OLy,sNy+OLy  
        DO i=1-OLx,sNx+OLx  
         xA(i,j)      = 0. _d 0  
         yA(i,j)      = 0. _d 0  
         uTrans(i,j)  = 0. _d 0  
         vTrans(i,j)  = 0. _d 0  
         DO k=1,Nr  
          phiHyd(i,j,k)  = 0. _d 0  
          sigmaX(i,j,k) = 0. _d 0  
          sigmaY(i,j,k) = 0. _d 0  
          sigmaR(i,j,k) = 0. _d 0  
         ENDDO  
         rhoKM1 (i,j) = 0. _d 0  
         rhok   (i,j) = 0. _d 0  
         phiSurfX(i,j) = 0. _d 0  
         phiSurfY(i,j) = 0. _d 0  
        ENDDO  
       ENDDO  
   
   
182  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
183  C--   HPF directive to help TAMC  C--   HPF directive to help TAMC
184  CHPF$ INDEPENDENT  CHPF$ INDEPENDENT
# Line 195  CHPF$ INDEPENDENT Line 189  CHPF$ INDEPENDENT
189  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
190  C--    HPF directive to help TAMC  C--    HPF directive to help TAMC
191  CHPF$  INDEPENDENT, NEW (rTrans,fVerT,fVerS  CHPF$  INDEPENDENT, NEW (rTrans,fVerT,fVerS
192  CHPF$&                  ,phiHyd,utrans,vtrans,xA,yA  CHPF$&                  ,utrans,vtrans,xA,yA
193  CHPF$&                  ,KappaRT,KappaRS  CHPF$&                  ,KappaRT,KappaRS
194  CHPF$&                  )  CHPF$&                  )
195  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
# Line 205  CHPF$&                  ) Line 199  CHPF$&                  )
199  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
200            act1 = bi - myBxLo(myThid)            act1 = bi - myBxLo(myThid)
201            max1 = myBxHi(myThid) - myBxLo(myThid) + 1            max1 = myBxHi(myThid) - myBxLo(myThid) + 1
   
202            act2 = bj - myByLo(myThid)            act2 = bj - myByLo(myThid)
203            max2 = myByHi(myThid) - myByLo(myThid) + 1            max2 = myByHi(myThid) - myByLo(myThid) + 1
   
204            act3 = myThid - 1            act3 = myThid - 1
205            max3 = nTx*nTy            max3 = nTx*nTy
   
206            act4 = ikey_dynamics - 1            act4 = ikey_dynamics - 1
207              itdkey = (act1 + 1) + act2*max1
           ikey = (act1 + 1) + act2*max1  
208       &                      + act3*max1*max2       &                      + act3*max1*max2
209       &                      + act4*max1*max2*max3       &                      + act4*max1*max2*max3
210  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
211    
212  C--     Set up work arrays that need valid initial values  C--   Set up work arrays with valid (i.e. not NaN) values
213    C     These inital values do not alter the numerical results. They
214    C     just ensure that all memory references are to valid floating
215    C     point numbers. This prevents spurious hardware signals due to
216    C     uninitialised but inert locations.
217    
218          DO j=1-OLy,sNy+OLy          DO j=1-OLy,sNy+OLy
219           DO i=1-OLx,sNx+OLx           DO i=1-OLx,sNx+OLx
220              xA(i,j)        = 0. _d 0
221              yA(i,j)        = 0. _d 0
222              uTrans(i,j)    = 0. _d 0
223              vTrans(i,j)    = 0. _d 0
224              rhok   (i,j)   = 0. _d 0
225              rhoKM1 (i,j)   = 0. _d 0
226              phiSurfX(i,j)  = 0. _d 0
227              phiSurfY(i,j)  = 0. _d 0
228            rTrans (i,j)   = 0. _d 0            rTrans (i,j)   = 0. _d 0
229            fVerT  (i,j,1) = 0. _d 0            fVerT  (i,j,1) = 0. _d 0
230            fVerT  (i,j,2) = 0. _d 0            fVerT  (i,j,2) = 0. _d 0
# Line 236  C--     Set up work arrays that need val Line 239  C--     Set up work arrays that need val
239           DO j=1-OLy,sNy+OLy           DO j=1-OLy,sNy+OLy
240            DO i=1-OLx,sNx+OLx            DO i=1-OLx,sNx+OLx
241  C This is currently also used by IVDC and Diagnostics  C This is currently also used by IVDC and Diagnostics
242               sigmaX(i,j,k) = 0. _d 0
243               sigmaY(i,j,k) = 0. _d 0
244               sigmaR(i,j,k) = 0. _d 0
245             ConvectCount(i,j,k) = 0.             ConvectCount(i,j,k) = 0.
246             KappaRT(i,j,k) = 0. _d 0             KappaRT(i,j,k)    = 0. _d 0
247             KappaRS(i,j,k) = 0. _d 0             KappaRS(i,j,k)    = 0. _d 0
248    C- tracer tendency needs to be set to zero (moved here from gad_calc_rhs):
249               gT(i,j,k,bi,bj)   = 0. _d 0
250               gS(i,j,k,bi,bj)   = 0. _d 0
251    # ifdef ALLOW_PASSIVE_TRACER
252    ceh3 needs an IF ( use PASSIVE_TRACER) THEN
253               gTr1(i,j,k,bi,bj) = 0. _d 0
254    # endif
255    # ifdef ALLOW_PTRACERS
256    ceh3 this should have an   IF ( usePTRACERS ) THEN
257               DO iTracer=1,PTRACERS_numInUse
258                gPTr(i,j,k,bi,bj,itracer) = 0. _d 0
259               ENDDO
260    # endif
261    #ifdef ALLOW_AUTODIFF_TAMC
262    cph all the following init. are necessary for TAF
263    cph although some of these are re-initialised later.
264    # ifdef ALLOW_GMREDI
265               Kwx(i,j,k,bi,bj)  = 0. _d 0
266               Kwy(i,j,k,bi,bj)  = 0. _d 0
267               Kwz(i,j,k,bi,bj)  = 0. _d 0
268    #  ifdef GM_NON_UNITY_DIAGONAL
269               Kux(i,j,k,bi,bj)  = 0. _d 0
270               Kvy(i,j,k,bi,bj)  = 0. _d 0
271    #  endif
272    #  ifdef GM_EXTRA_DIAGONAL
273               Kuz(i,j,k,bi,bj)  = 0. _d 0
274               Kvz(i,j,k,bi,bj)  = 0. _d 0
275    #  endif
276    #  ifdef GM_BOLUS_ADVEC
277               GM_PsiX(i,j,k,bi,bj)  = 0. _d 0
278               GM_PsiY(i,j,k,bi,bj)  = 0. _d 0
279    #  endif
280    #  ifdef GM_VISBECK_VARIABLE_K
281               VisbeckK(i,j,bi,bj)   = 0. _d 0
282    #  endif
283    # endif /* ALLOW_GMREDI */
284    #endif /* ALLOW_AUTODIFF_TAMC */
285            ENDDO            ENDDO
286           ENDDO           ENDDO
287          ENDDO          ENDDO
288    
289          iMin = 1-OLx+1          iMin = 1-OLx
290          iMax = sNx+OLx          iMax = sNx+OLx
291          jMin = 1-OLy+1          jMin = 1-OLy
292          jMax = sNy+OLy          jMax = sNy+OLy
293    
   
294  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
295  CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
296  CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
297    CADJ STORE totphihyd
298    CADJ &     = comlev1_bibj, key=itdkey, byte=isbyte
299    #ifdef ALLOW_KPP
300    CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
301    CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
302    #endif
303  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
304    
305    #ifndef DISABLE_DEBUGMODE
306            IF ( debugLevel .GE. debLevB )
307         &    CALL DEBUG_MSG('ENTERING UPWARD K LOOP',myThid)
308    #endif
309    
310  C--     Start of diagnostic loop  C--     Start of diagnostic loop
311          DO k=Nr,1,-1          DO k=Nr,1,-1
312    
# Line 262  C? Patrick, is this formula correct now Line 315  C? Patrick, is this formula correct now
315  C? Do we still need this?  C? Do we still need this?
316  cph kkey formula corrected.  cph kkey formula corrected.
317  cph Needed for rhok, rhokm1, in the case useGMREDI.  cph Needed for rhok, rhokm1, in the case useGMREDI.
318           kkey = (ikey-1)*Nr + k           kkey = (itdkey-1)*Nr + k
 CADJ STORE rhokm1(:,:) = comlev1_bibj_k ,       key=kkey, byte=isbyte  
 CADJ STORE rhok  (:,:) = comlev1_bibj_k ,       key=kkey, byte=isbyte  
319  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
320    
321  C--       Integrate continuity vertically for vertical velocity  C--       Integrate continuity vertically for vertical velocity
322            CALL INTEGRATE_FOR_W(  c         CALL INTEGRATE_FOR_W(
323       I                         bi, bj, k, uVel, vVel,  c    I                         bi, bj, k, uVel, vVel,
324       O                         wVel,  c    O                         wVel,
325       I                         myThid )  c    I                         myThid )
326    
327  #ifdef    ALLOW_OBCS  #ifdef    ALLOW_OBCS
328  #ifdef    ALLOW_NONHYDROSTATIC  #ifdef    ALLOW_NONHYDROSTATIC
329  C--       Apply OBC to W if in N-H mode  C--       Apply OBC to W if in N-H mode
330            IF (useOBCS.AND.nonHydrostatic) THEN  c         IF (useOBCS.AND.nonHydrostatic) THEN
331              CALL OBCS_APPLY_W( bi, bj, k, wVel, myThid )  c           CALL OBCS_APPLY_W( bi, bj, k, wVel, myThid )
332            ENDIF  c         ENDIF
333  #endif    /* ALLOW_NONHYDROSTATIC */  #endif    /* ALLOW_NONHYDROSTATIC */
334  #endif    /* ALLOW_OBCS */  #endif    /* ALLOW_OBCS */
335    
336    C--       Attention: by defining "SINGLE_LAYER_MODE" in CPP_OPTIONS.h
337    C--       MOST of THERMODYNAMICS will be disabled
338    #ifndef SINGLE_LAYER_MODE
339    
340  C--       Calculate gradients of potential density for isoneutral  C--       Calculate gradients of potential density for isoneutral
341  C         slope terms (e.g. GM/Redi tensor or IVDC diffusivity)  C         slope terms (e.g. GM/Redi tensor or IVDC diffusivity)
342  c         IF ( k.GT.1 .AND. (useGMRedi.OR.ivdc_kappa.NE.0.) ) THEN  c         IF ( k.GT.1 .AND. (useGMRedi.OR.ivdc_kappa.NE.0.) ) THEN
343            IF ( useGMRedi .OR. (k.GT.1 .AND. ivdc_kappa.NE.0.) ) THEN            IF ( useGMRedi .OR. (k.GT.1 .AND. ivdc_kappa.NE.0.) ) THEN
344    #ifndef DISABLE_DEBUGMODE
345                IF ( debugLevel .GE. debLevB )
346         &       CALL DEBUG_CALL('FIND_RHO',myThid)
347    #endif
348  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
349  CADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte  CADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
350  CADJ STORE salt (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte  CADJ STORE salt (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
351  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
352              CALL FIND_RHO(              CALL FIND_RHO(
353       I        bi, bj, iMin, iMax, jMin, jMax, k, k, eosType,       I        bi, bj, iMin, iMax, jMin, jMax, k, k,
354       I        theta, salt,       I        theta, salt,
355       O        rhoK,       O        rhoK,
356       I        myThid )       I        myThid )
357    
358              IF (k.GT.1) THEN              IF (k.GT.1) THEN
359  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
360  CADJ STORE theta(:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte  CADJ STORE theta(:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
361  CADJ STORE salt (:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte  CADJ STORE salt (:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
362  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
363               CALL FIND_RHO(               CALL FIND_RHO(
364       I        bi, bj, iMin, iMax, jMin, jMax, k-1, k, eosType,       I        bi, bj, iMin, iMax, jMin, jMax, k-1, k,
365       I        theta, salt,       I        theta, salt,
366       O        rhoKm1,       O        rhoKm1,
367       I        myThid )       I        myThid )
368              ENDIF              ENDIF
369    #ifndef DISABLE_DEBUGMODE
370                IF ( debugLevel .GE. debLevB )
371         &       CALL DEBUG_CALL('GRAD_SIGMA',myThid)
372    #endif
373              CALL GRAD_SIGMA(              CALL GRAD_SIGMA(
374       I             bi, bj, iMin, iMax, jMin, jMax, k,       I             bi, bj, iMin, iMax, jMin, jMax, k,
375       I             rhoK, rhoKm1, rhoK,       I             rhoK, rhoKm1, rhoK,
# Line 313  CADJ STORE salt (:,:,k-1,bi,bj) = comlev Line 377  CADJ STORE salt (:,:,k-1,bi,bj) = comlev
377       I             myThid )       I             myThid )
378            ENDIF            ENDIF
379    
380    #ifdef ALLOW_AUTODIFF_TAMC
381    CADJ STORE rhok   (:,:) = comlev1_bibj_k ,       key=kkey, byte=isbyte
382    CADJ STORE rhokm1 (:,:) = comlev1_bibj_k ,       key=kkey, byte=isbyte
383    #endif /* ALLOW_AUTODIFF_TAMC */
384  C--       Implicit Vertical Diffusion for Convection  C--       Implicit Vertical Diffusion for Convection
385  c ==> should use sigmaR !!!  c ==> should use sigmaR !!!
386            IF (k.GT.1 .AND. ivdc_kappa.NE.0.) THEN            IF (k.GT.1 .AND. ivdc_kappa.NE.0.) THEN
387    #ifndef DISABLE_DEBUGMODE
388                IF ( debugLevel .GE. debLevB )
389         &       CALL DEBUG_CALL('CALC_IVDC',myThid)
390    #endif
391              CALL CALC_IVDC(              CALL CALC_IVDC(
392       I        bi, bj, iMin, iMax, jMin, jMax, k,       I        bi, bj, iMin, iMax, jMin, jMax, k,
393       I        rhoKm1, rhoK,       I        rhoKm1, rhoK,
# Line 323  c ==> should use sigmaR !!! Line 395  c ==> should use sigmaR !!!
395       I        myTime, myIter, myThid)       I        myTime, myIter, myThid)
396            ENDIF            ENDIF
397    
398    #endif /* SINGLE_LAYER_MODE */
399    
400  C--     end of diagnostic k loop (Nr:1)  C--     end of diagnostic k loop (Nr:1)
401          ENDDO          ENDDO
402    
403  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
404  cph avoids recomputation of integrate_for_w  cph avoids recomputation of integrate_for_w
405  CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
406  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
407    
408  #ifdef  ALLOW_OBCS  #ifdef  ALLOW_OBCS
409  C--     Calculate future values on open boundaries  C--     Calculate future values on open boundaries
410          IF (useOBCS) THEN          IF (useOBCS) THEN
411            CALL OBCS_CALC( bi, bj, myTime+deltaT,  #ifndef DISABLE_DEBUGMODE
412              IF ( debugLevel .GE. debLevB )
413         &     CALL DEBUG_CALL('OBCS_CALC',myThid)
414    #endif
415              CALL OBCS_CALC( bi, bj, myTime+deltaT, myIter+1,
416       I            uVel, vVel, wVel, theta, salt,       I            uVel, vVel, wVel, theta, salt,
417       I            myThid )       I            myThid )
418          ENDIF          ENDIF
419  #endif  /* ALLOW_OBCS */  #endif  /* ALLOW_OBCS */
420    
421    
422    #ifdef ALLOW_THERM_SEAICE
423           IF (useThermSeaIce) THEN
424    #ifndef DISABLE_DEBUGMODE
425            IF ( debugLevel .GE. debLevB )
426         &    CALL DEBUG_CALL('ICE_FORCING',myThid)
427    #endif
428  C--     Determines forcing terms based on external fields  C--     Determines forcing terms based on external fields
429  C       relaxation terms, etc.  C       including effects from ice
430          CALL EXTERNAL_FORCING_SURF(          CALL ICE_FORCING(
431       I             bi, bj, iMin, iMax, jMin, jMax,       I             bi, bj, iMin, iMax, jMin, jMax,
432       I             myThid )       I             myThid )
433           ELSE
434    #endif /* ALLOW_THERM_SEAICE */
435    
436    C--     Determines forcing terms based on external fields
437    C       relaxation terms, etc.
438    #ifndef DISABLE_DEBUGMODE
439            IF ( debugLevel .GE. debLevB )
440         &    CALL DEBUG_CALL('EXTERNAL_FORCING_SURF',myThid)
441    #endif
442            CALL EXTERNAL_FORCING_SURF(
443         I             bi, bj, iMin, iMax, jMin, jMax,
444         I             myTime, myIter, myThid )
445    
446    #ifdef ALLOW_THERM_SEAICE
447    C--    end of if/else block useThermSeaIce --
448           ENDIF
449    #endif /* ALLOW_THERM_SEAICE */
450    
451  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
452  cph needed for KPP  cph needed for KPP
453  CADJ STORE surfacetendencyU(:,:,bi,bj)  CADJ STORE surfacetendencyU(:,:,bi,bj)
454  CADJ &     = comlev1_bibj, key=ikey, byte=isbyte  CADJ &     = comlev1_bibj, key=itdkey, byte=isbyte
455  CADJ STORE surfacetendencyV(:,:,bi,bj)  CADJ STORE surfacetendencyV(:,:,bi,bj)
456  CADJ &     = comlev1_bibj, key=ikey, byte=isbyte  CADJ &     = comlev1_bibj, key=itdkey, byte=isbyte
457  CADJ STORE surfacetendencyS(:,:,bi,bj)  CADJ STORE surfacetendencyS(:,:,bi,bj)
458  CADJ &     = comlev1_bibj, key=ikey, byte=isbyte  CADJ &     = comlev1_bibj, key=itdkey, byte=isbyte
459  CADJ STORE surfacetendencyT(:,:,bi,bj)  CADJ STORE surfacetendencyT(:,:,bi,bj)
460  CADJ &     = comlev1_bibj, key=ikey, byte=isbyte  CADJ &     = comlev1_bibj, key=itdkey, byte=isbyte
461  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
462    
463    C--     Attention: by defining "SINGLE_LAYER_MODE" in CPP_OPTIONS.h
464    C--     MOST of THERMODYNAMICS will be disabled
465    #ifndef SINGLE_LAYER_MODE
466    
467  #ifdef  ALLOW_GMREDI  #ifdef  ALLOW_GMREDI
468    
469  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
470  CADJ STORE sigmaX(:,:,:) = comlev1, key=ikey, byte=isbyte  cph storing here is needed only for one GMREDI_OPTIONS:
471  CADJ STORE sigmaY(:,:,:) = comlev1, key=ikey, byte=isbyte  cph define GM_BOLUS_ADVEC
472  CADJ STORE sigmaR(:,:,:) = comlev1, key=ikey, byte=isbyte  cph but I've avoided the #ifdef for now, in case more things change
473    CADJ STORE sigmaX(:,:,:)        = comlev1_bibj, key=itdkey, byte=isbyte
474    CADJ STORE sigmaY(:,:,:)        = comlev1_bibj, key=itdkey, byte=isbyte
475    CADJ STORE sigmaR(:,:,:)        = comlev1_bibj, key=itdkey, byte=isbyte
476  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
477    
478  C--     Calculate iso-neutral slopes for the GM/Redi parameterisation  C--     Calculate iso-neutral slopes for the GM/Redi parameterisation
479          IF (useGMRedi) THEN          IF (useGMRedi) THEN
480            DO k=1,Nr  #ifndef DISABLE_DEBUGMODE
481              CALL GMREDI_CALC_TENSOR(            IF ( debugLevel .GE. debLevB )
482       I             bi, bj, iMin, iMax, jMin, jMax, k,       &     CALL DEBUG_CALL('GMREDI_CALC_TENSOR',myThid)
483    #endif
484              CALL GMREDI_CALC_TENSOR(
485         I             bi, bj, iMin, iMax, jMin, jMax,
486       I             sigmaX, sigmaY, sigmaR,       I             sigmaX, sigmaY, sigmaR,
487       I             myThid )       I             myThid )
           ENDDO  
488  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
489          ELSE          ELSE
490            DO k=1, Nr            CALL GMREDI_CALC_TENSOR_DUMMY(
491              CALL GMREDI_CALC_TENSOR_DUMMY(       I             bi, bj, iMin, iMax, jMin, jMax,
      I             bi, bj, iMin, iMax, jMin, jMax, k,  
492       I             sigmaX, sigmaY, sigmaR,       I             sigmaX, sigmaY, sigmaR,
493       I             myThid )       I             myThid )
           ENDDO  
494  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
495          ENDIF          ENDIF
496    
497  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
498  CADJ STORE Kwx(:,:,:,bi,bj)   = comlev1_bibj, key=ikey, byte=isbyte  CADJ STORE Kwx(:,:,:,bi,bj)   = comlev1_bibj, key=itdkey, byte=isbyte
499  CADJ STORE Kwy(:,:,:,bi,bj)   = comlev1_bibj, key=ikey, byte=isbyte  CADJ STORE Kwy(:,:,:,bi,bj)   = comlev1_bibj, key=itdkey, byte=isbyte
500  CADJ STORE Kwz(:,:,:,bi,bj)   = comlev1_bibj, key=ikey, byte=isbyte  CADJ STORE Kwz(:,:,:,bi,bj)   = comlev1_bibj, key=itdkey, byte=isbyte
501  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
502    
503  #endif  /* ALLOW_GMREDI */  #endif  /* ALLOW_GMREDI */
# Line 394  CADJ STORE Kwz(:,:,:,bi,bj)   = comlev1_ Line 505  CADJ STORE Kwz(:,:,:,bi,bj)   = comlev1_
505  #ifdef  ALLOW_KPP  #ifdef  ALLOW_KPP
506  C--     Compute KPP mixing coefficients  C--     Compute KPP mixing coefficients
507          IF (useKPP) THEN          IF (useKPP) THEN
508    #ifndef DISABLE_DEBUGMODE
509              IF ( debugLevel .GE. debLevB )
510         &     CALL DEBUG_CALL('KPP_CALC',myThid)
511    #endif
512            CALL KPP_CALC(            CALL KPP_CALC(
513       I                  bi, bj, myTime, myThid )       I                  bi, bj, myTime, myThid )
514  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
# Line 405  C--     Compute KPP mixing coefficients Line 520  C--     Compute KPP mixing coefficients
520    
521  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
522  CADJ STORE KPPghat   (:,:,:,bi,bj)  CADJ STORE KPPghat   (:,:,:,bi,bj)
 CADJ &   , KPPviscAz (:,:,:,bi,bj)  
523  CADJ &   , KPPdiffKzT(:,:,:,bi,bj)  CADJ &   , KPPdiffKzT(:,:,:,bi,bj)
524  CADJ &   , KPPdiffKzS(:,:,:,bi,bj)  CADJ &   , KPPdiffKzS(:,:,:,bi,bj)
525  CADJ &   , KPPfrac   (:,:  ,bi,bj)  CADJ &   , KPPfrac   (:,:  ,bi,bj)
526  CADJ &                 = comlev1_bibj, key=ikey, byte=isbyte  CADJ &                 = comlev1_bibj, key=itdkey, byte=isbyte
527  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
528    
529  #endif  /* ALLOW_KPP */  #endif  /* ALLOW_KPP */
530    
531  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
532  CADJ STORE KappaRT(:,:,:)     = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
533  CADJ STORE KappaRS(:,:,:)     = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
534  CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
535  CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
 CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  
 CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  
536  #ifdef ALLOW_PASSIVE_TRACER  #ifdef ALLOW_PASSIVE_TRACER
537  CADJ STORE tr1  (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte  CADJ STORE tr1  (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
538    #endif
539    #ifdef ALLOW_PTRACERS
540    cph-- moved to forward_step to avoid key computation
541    cphCADJ STORE ptracer(:,:,:,bi,bj,itracer) = comlev1_bibj,
542    cphCADJ &                              key=itdkey, byte=isbyte
543  #endif  #endif
544  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
545    
546  #ifdef ALLOW_AIM  #ifdef ALLOW_AIM
547  C       AIM - atmospheric intermediate model, physics package code.  C       AIM - atmospheric intermediate model, physics package code.
 C note(jmc) : phiHyd=0 at this point but is not really used in Molteni Physics  
548          IF ( useAIM ) THEN          IF ( useAIM ) THEN
549           CALL TIMER_START('AIM_DO_ATMOS_PHYS      [DYNAMICS]', myThid)  #ifndef DISABLE_DEBUGMODE
550           CALL AIM_DO_ATMOS_PHYSICS( phiHyd, bi, bj, myTime, myThid )            IF ( debugLevel .GE. debLevB )
551           CALL TIMER_STOP ('AIM_DO_ATMOS_PHYS      [DYNAMICS]', myThid)       &     CALL DEBUG_CALL('AIM_DO_PHYSICS',myThid)
552    #endif
553             CALL TIMER_START('AIM_DO_PHYSICS   [THERMODYNAMICS]', myThid)
554             CALL AIM_DO_PHYSICS( bi, bj, myTime, myIter, myThid )
555             CALL TIMER_STOP( 'AIM_DO_PHYSICS   [THERMODYNAMICS]', myThid)
556          ENDIF          ENDIF
557  #endif /* ALLOW_AIM */  #endif /* ALLOW_AIM */
558    
559    #ifndef DISABLE_MULTIDIM_ADVECTION
560    C--     Some advection schemes are better calculated using a multi-dimensional
561    C       method in the absence of any other terms and, if used, is done here.
562    C
563    C The CPP flag DISABLE_MULTIDIM_ADVECTION is currently unset in GAD_OPTIONS.h
564    C The default is to use multi-dimensinal advection for non-linear advection
565    C schemes. However, for the sake of efficiency of the adjoint it is necessary
566    C to be able to exclude this scheme to avoid excessive storage and
567    C recomputation. It *is* differentiable, if you need it.
568    C Edit GAD_OPTIONS.h and #define DISABLE_MULTIDIM_ADVECTION to
569    C disable this section of code.
570            IF (tempMultiDimAdvec) THEN
571    #ifndef DISABLE_DEBUGMODE
572              IF ( debugLevel .GE. debLevB )
573         &     CALL DEBUG_CALL('GAD_ADVECTION',myThid)
574    #endif
575              CALL GAD_ADVECTION(bi,bj,tempAdvScheme,GAD_TEMPERATURE,
576         U                      theta,gT,
577         I                      myTime,myIter,myThid)
578            ENDIF
579            IF (saltMultiDimAdvec) THEN
580    #ifndef DISABLE_DEBUGMODE
581              IF ( debugLevel .GE. debLevB )
582         &     CALL DEBUG_CALL('GAD_ADVECTION',myThid)
583    #endif
584              CALL GAD_ADVECTION(bi,bj,saltAdvScheme,GAD_SALINITY,
585         U                      salt,gS,
586         I                      myTime,myIter,myThid)
587            ENDIF
588    C Since passive tracers are configurable separately from T,S we
589    C call the multi-dimensional method for PTRACERS regardless
590    C of whether multiDimAdvection is set or not.
591    #ifdef ALLOW_PTRACERS
592            IF ( usePTRACERS ) THEN
593    #ifndef DISABLE_DEBUGMODE
594              IF ( debugLevel .GE. debLevB )
595         &     CALL DEBUG_CALL('PTRACERS_ADVECTION',myThid)
596    #endif
597             CALL PTRACERS_ADVECTION( bi,bj,myIter,myTime,myThid )
598            ENDIF
599    #endif /* ALLOW_PTRACERS */
600    #endif /* DISABLE_MULTIDIM_ADVECTION */
601    
602    #ifndef DISABLE_DEBUGMODE
603           IF ( debugLevel .GE. debLevB )
604         &    CALL DEBUG_MSG('ENTERING DOWNWARD K LOOP',myThid)
605    #endif
606    
607  C--     Start of thermodynamics loop  C--     Start of thermodynamics loop
608          DO k=Nr,1,-1          DO k=Nr,1,-1
# Line 443  C--     Start of thermodynamics loop Line 610  C--     Start of thermodynamics loop
610  C? Patrick Is this formula correct?  C? Patrick Is this formula correct?
611  cph Yes, but I rewrote it.  cph Yes, but I rewrote it.
612  cph Also, the KappaR? need the index and subscript k!  cph Also, the KappaR? need the index and subscript k!
613           kkey = (ikey-1)*Nr + k           kkey = (itdkey-1)*Nr + k
614  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
615    
616  C--       km1    Points to level above k (=k-1)  C--       km1    Points to level above k (=k-1)
# Line 465  C--       Get temporary terms used by te Line 632  C--       Get temporary terms used by te
632       O         xA,yA,uTrans,vTrans,rTrans,maskUp,       O         xA,yA,uTrans,vTrans,rTrans,maskUp,
633       I         myThid)       I         myThid)
634    
635    #ifdef ALLOW_GMREDI
636    
637    C--   Residual transp = Bolus transp + Eulerian transp
638              IF (useGMRedi) THEN
639                CALL GMREDI_CALC_UVFLOW(
640         &            uTrans, vTrans, bi, bj, k, myThid)
641                IF (K.GE.2) CALL GMREDI_CALC_WFLOW(
642         &                    rTrans, bi, bj, k, myThid)
643              ENDIF
644    
645  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
646  CADJ STORE KappaRT(:,:,k)    = comlev1_bibj_k, key=kkey, byte=isbyte  #ifdef GM_BOLUS_ADVEC
647  CADJ STORE KappaRS(:,:,k)    = comlev1_bibj_k, key=kkey, byte=isbyte  CADJ STORE uTrans(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
648    CADJ STORE vTrans(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
649    CADJ STORE rTrans(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
650    #endif
651  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
652    
653    #endif /* ALLOW_GMREDI */
654    
655  #ifdef  INCLUDE_CALC_DIFFUSIVITY_CALL  #ifdef  INCLUDE_CALC_DIFFUSIVITY_CALL
656  C--      Calculate the total vertical diffusivity  C--      Calculate the total vertical diffusivity
657           CALL CALC_DIFFUSIVITY(           CALL CALC_DIFFUSIVITY(
# Line 477  C--      Calculate the total vertical di Line 659  C--      Calculate the total vertical di
659       I        maskUp,       I        maskUp,
660       O        KappaRT,KappaRS,       O        KappaRT,KappaRS,
661       I        myThid)       I        myThid)
662    # ifdef ALLOW_AUTODIFF_TAMC
663    CADJ STORE KappaRT(:,:,k)    = comlev1_bibj_k, key=kkey, byte=isbyte
664    CADJ STORE KappaRS(:,:,k)    = comlev1_bibj_k, key=kkey, byte=isbyte
665    # endif /* ALLOW_AUTODIFF_TAMC */
666  #endif  #endif
667    
668            iMin = 1-OLx+2            iMin = 1-OLx+2
# Line 492  C        and step forward storing result Line 678  C        and step forward storing result
678       I         xA,yA,uTrans,vTrans,rTrans,maskUp,       I         xA,yA,uTrans,vTrans,rTrans,maskUp,
679       I         KappaRT,       I         KappaRT,
680       U         fVerT,       U         fVerT,
681       I         myTime, myThid)       I         myTime,myIter,myThid)
            tauAB = 0.5d0 + abEps  
682             CALL TIMESTEP_TRACER(             CALL TIMESTEP_TRACER(
683       I         bi,bj,iMin,iMax,jMin,jMax,k,tauAB,       I         bi,bj,iMin,iMax,jMin,jMax,k,tempAdvScheme,
684       I         theta, gT,       I         theta, gT,
      U         gTnm1,  
685       I         myIter, myThid)       I         myIter, myThid)
686           ENDIF           ENDIF
687    
688    #ifdef ALLOW_THERM_SEAICE
689             IF (useThermSeaIce .AND. k.EQ.1) THEN
690               CALL ICE_FREEZE( bi,bj, iMin,iMax,jMin,jMax, myThid )
691             ENDIF
692    #endif
693    
694           IF ( saltStepping ) THEN           IF ( saltStepping ) THEN
695             CALL CALC_GS(             CALL CALC_GS(
696       I         bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,       I         bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,
697       I         xA,yA,uTrans,vTrans,rTrans,maskUp,       I         xA,yA,uTrans,vTrans,rTrans,maskUp,
698       I         KappaRS,       I         KappaRS,
699       U         fVerS,       U         fVerS,
700       I         myTime, myThid)       I         myTime,myIter,myThid)
            tauAB = 0.5d0 + abEps  
701             CALL TIMESTEP_TRACER(             CALL TIMESTEP_TRACER(
702       I         bi,bj,iMin,iMax,jMin,jMax,k,tauAB,       I         bi,bj,iMin,iMax,jMin,jMax,k,saltAdvScheme,
703       I         salt, gS,       I         salt, gS,
      U         gSnm1,  
704       I         myIter, myThid)       I         myIter, myThid)
705           ENDIF           ENDIF
706  #ifdef ALLOW_PASSIVE_TRACER  #ifdef ALLOW_PASSIVE_TRACER
707    ceh3 needs an IF ( usePASSIVE_TRACER ) THEN
708           IF ( tr1Stepping ) THEN           IF ( tr1Stepping ) THEN
709             CALL CALC_GTR1(             CALL CALC_GTR1(
710       I         bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,       I         bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,
711       I         xA,yA,uTrans,vTrans,rTrans,maskUp,       I         xA,yA,uTrans,vTrans,rTrans,maskUp,
712       I         KappaRT,       I         KappaRT,
713       U         fVerTr1,       U         fVerTr1,
714       I         myTime, myThid)       I         myTime,myIter,myThid)
            tauAB = 0.5d0 + abEps  
715             CALL TIMESTEP_TRACER(             CALL TIMESTEP_TRACER(
716       I         bi,bj,iMin,iMax,jMin,jMax,k,tauAB,       I         bi,bj,iMin,iMax,jMin,jMax,k,tracerAdvScheme,
717       I         Tr1, gTr1,       I         Tr1, gTr1,
718       U         gTr1NM1,       I         myIter,myThid)
      I         myIter, myThid)  
719           ENDIF           ENDIF
720  #endif  #endif
721    #ifdef ALLOW_PTRACERS
722             IF ( usePTRACERS ) THEN
723               CALL PTRACERS_INTEGRATE(
724         I         bi,bj,k,
725         I         xA,yA,uTrans,vTrans,rTrans,maskUp,
726         X         KappaRS,
727         I         myIter,myTime,myThid)
728             ENDIF
729    #endif /* ALLOW_PTRACERS */
730    
731  #ifdef   ALLOW_OBCS  #ifdef   ALLOW_OBCS
732  C--      Apply open boundary conditions  C--      Apply open boundary conditions
733           IF (useOBCS) THEN           IF (useOBCS) THEN
734             CALL OBCS_APPLY_TS( bi, bj, k, gTnm1, gSnm1, myThid )             CALL OBCS_APPLY_TS( bi, bj, k, gT, gS, myThid )
735           END IF           END IF
736  #endif   /* ALLOW_OBCS */  #endif   /* ALLOW_OBCS */
737    
738  C--      Freeze water  C--      Freeze water
739           IF (allowFreezing) THEN           IF ( allowFreezing .AND. .NOT. useSEAICE
740         &       .AND. .NOT.(useThermSeaIce.AND.k.EQ.1) ) THEN
741  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
742  CADJ STORE gTNm1(:,:,k,bi,bj) = comlev1_bibj_k  CADJ STORE gT(:,:,k,bi,bj) = comlev1_bibj_k
743  CADJ &   , key = kkey, byte = isbyte  CADJ &   , key = kkey, byte = isbyte
744  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
745              CALL FREEZE( bi, bj, iMin, iMax, jMin, jMax, k, myThid )              CALL FREEZE( bi, bj, iMin, iMax, jMin, jMax, k, myThid )
746           END IF           ENDIF
747    
748  C--     end of thermodynamic k loop (Nr:1)  C--     end of thermodynamic k loop (Nr:1)
749          ENDDO          ENDDO
750    
751    cswdice -- add ---
752    #ifdef ALLOW_THERM_SEAICE
753    c timeaveraging for ice model values
754    ceh3 This should be wrapped in an IF ( useThermSeaIce ) THEN
755               CALL ICE_AVE(bi,bj,iMin,iMax,jMin,jMax,myThid )
756    #endif
757    cswdice --- end add ---
758    
759    
760    
 #ifdef ALLOW_AUTODIFF_TAMC  
 C? Patrick? What about this one?  
 cph Keys iikey and idkey don't seem to be needed  
 cph since storing occurs on different tape for each  
 cph impldiff call anyways.  
 cph Thus, common block comlev1_impl isn't needed either.  
 cph Storing below needed in the case useGMREDI.  
         iikey = (ikey-1)*maximpl  
 #endif /* ALLOW_AUTODIFF_TAMC */  
761    
762  C--     Implicit diffusion  C--     Implicit diffusion
763          IF (implicitDiffusion) THEN          IF (implicitDiffusion) THEN
764    
765           IF (tempStepping) THEN           IF (tempStepping) THEN
766  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
767              idkey = iikey + 1  CADJ STORE KappaRT(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
768  CADJ STORE gTNm1(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte  CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
769  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
770              CALL IMPLDIFF(              CALL IMPLDIFF(
771       I         bi, bj, iMin, iMax, jMin, jMax,       I         bi, bj, iMin, iMax, jMin, jMax,
772       I         deltaTtracer, KappaRT, recip_HFacC,       I         deltaTtracer, KappaRT, recip_HFacC,
773       U         gTNm1,       U         gT,
774       I         myThid )       I         myThid )
775           ENDIF           ENDIF
776    
777           IF (saltStepping) THEN           IF (saltStepping) THEN
778  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
779           idkey = iikey + 2  CADJ STORE KappaRS(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
780  CADJ STORE gSNm1(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte  CADJ STORE gS(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
781  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
782              CALL IMPLDIFF(              CALL IMPLDIFF(
783       I         bi, bj, iMin, iMax, jMin, jMax,       I         bi, bj, iMin, iMax, jMin, jMax,
784       I         deltaTtracer, KappaRS, recip_HFacC,       I         deltaTtracer, KappaRS, recip_HFacC,
785       U         gSNm1,       U         gS,
786       I         myThid )       I         myThid )
787           ENDIF           ENDIF
788    
789  #ifdef ALLOW_PASSIVE_TRACER  #ifdef ALLOW_PASSIVE_TRACER
790           IF (tr1Stepping) THEN           IF (tr1Stepping) THEN
791  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
792  CADJ STORE gTr1Nm1(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte  CADJ STORE gTr1(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
793  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
794            CALL IMPLDIFF(            CALL IMPLDIFF(
795       I      bi, bj, iMin, iMax, jMin, jMax,       I      bi, bj, iMin, iMax, jMin, jMax,
796       I      deltaTtracer, KappaRT, recip_HFacC,       I      deltaTtracer, KappaRT, recip_HFacC,
797       U      gTr1Nm1,       U      gTr1,
798       I      myThid )       I      myThid )
799           ENDIF           ENDIF
800  #endif  #endif
801    
802    #ifdef ALLOW_PTRACERS
803    C Vertical diffusion (implicit) for passive tracers
804             IF ( usePTRACERS ) THEN
805               CALL PTRACERS_IMPLDIFF( bi,bj,KappaRS,myThid )
806             ENDIF
807    #endif /* ALLOW_PTRACERS */
808    
809  #ifdef   ALLOW_OBCS  #ifdef   ALLOW_OBCS
810  C--      Apply open boundary conditions  C--      Apply open boundary conditions
811           IF (useOBCS) THEN           IF (useOBCS) THEN
812             DO K=1,Nr             DO K=1,Nr
813               CALL OBCS_APPLY_TS( bi, bj, k, gTnm1, gSnm1, myThid )               CALL OBCS_APPLY_TS( bi, bj, k, gT, gS, myThid )
814             ENDDO             ENDDO
815           END IF           END IF
816  #endif   /* ALLOW_OBCS */  #endif   /* ALLOW_OBCS */
# Line 613  C--      Apply open boundary conditions Line 818  C--      Apply open boundary conditions
818  C--     End If implicitDiffusion  C--     End If implicitDiffusion
819          ENDIF          ENDIF
820    
821  Ccs-  #ifdef ALLOW_TIMEAVE
822    ceh3 needs an IF ( useTIMEAVE ) THEN
823            IF (taveFreq.GT.0. .AND. ivdc_kappa.NE.0.) THEN
824              CALL TIMEAVE_CUMUL_1T(ConvectCountTave, ConvectCount,
825         I                           Nr, deltaTclock, bi, bj, myThid)
826            ENDIF
827            useVariableK = useKPP .OR. useGMredi .OR. ivdc_kappa.NE.0.
828            IF (taveFreq.GT.0. .AND. useVariableK ) THEN
829             IF (implicitDiffusion) THEN
830              CALL TIMEAVE_CUMUL_DIF_1T(TdiffRtave, gT, kappaRT,
831         I                        Nr, 3, deltaTclock, bi, bj, myThid)
832             ELSE
833              CALL TIMEAVE_CUMUL_DIF_1T(TdiffRtave, theta, kappaRT,
834         I                        Nr, 3, deltaTclock, bi, bj, myThid)
835             ENDIF
836            ENDIF
837    #endif /* ALLOW_TIMEAVE */
838    
839    #endif /* SINGLE_LAYER_MODE */
840    
841    C--   end bi,bj loops.
842         ENDDO         ENDDO
843        ENDDO        ENDDO
844    
845  #ifdef ALLOW_AIM  #ifndef DISABLE_DEBUGMODE
846        IF ( useAIM ) THEN        If (debugMode) THEN
847         CALL AIM_AIM2DYN_EXCHANGES( myTime, myThid )         CALL DEBUG_STATS_RL(Nr,uVel,'Uvel (THERMODYNAMICS)',myThid)
848        ENDIF         CALL DEBUG_STATS_RL(Nr,vVel,'Vvel (THERMODYNAMICS)',myThid)
849         _EXCH_XYZ_R8(gTnm1,myThid)         CALL DEBUG_STATS_RL(Nr,wVel,'Wvel (THERMODYNAMICS)',myThid)
850         _EXCH_XYZ_R8(gSnm1,myThid)         CALL DEBUG_STATS_RL(Nr,theta,'Theta (THERMODYNAMICS)',myThid)
851  #else         CALL DEBUG_STATS_RL(Nr,salt,'Salt (THERMODYNAMICS)',myThid)
852        IF (staggerTimeStep.AND.useCubedSphereExchange) THEN         CALL DEBUG_STATS_RL(Nr,Gt,'Gt (THERMODYNAMICS)',myThid)
853         _EXCH_XYZ_R8(gTnm1,myThid)         CALL DEBUG_STATS_RL(Nr,Gs,'Gs (THERMODYNAMICS)',myThid)
854         _EXCH_XYZ_R8(gSnm1,myThid)         CALL DEBUG_STATS_RL(Nr,GtNm1,'GtNm1 (THERMODYNAMICS)',myThid)
855           CALL DEBUG_STATS_RL(Nr,GsNm1,'GsNm1 (THERMODYNAMICS)',myThid)
856    #ifdef ALLOW_PTRACERS
857           IF ( usePTRACERS ) THEN
858             CALL PTRACERS_DEBUG(myThid)
859           ENDIF
860    #endif /* ALLOW_PTRACERS */
861        ENDIF        ENDIF
862  #endif /* ALLOW_AIM */  #endif
863    
864    #ifndef DISABLE_DEBUGMODE
865             IF ( debugLevel .GE. debLevB )
866         &    CALL DEBUG_LEAVE('FORWARD_STEP',myThid)
867    #endif
868    
869        RETURN        RETURN
870        END        END

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.54

  ViewVC Help
Powered by ViewVC 1.1.22