File indexing completed on 2026-08-23 05:08:42 UTC
view on githubraw file Latest commit f0f170d5 on 2026-08-22 15:30:46 UTC
f0f170d54b Mart*0001 #include "LAYERS_OPTIONS.h"
0002
0003
0004
0005
0006 SUBROUTINE LAYERS_DIAPYCNAL(
0007 I tracer, iLa,
0008 O TtendSurf, TtendDiffh, TtendDiffr,
0009 O TtendAdvh, TtendAdvr, TtendTot,
0010 O StendSurf, StendDiffh, StendDiffr,
0011 O StendAdvh, StendAdvr, StendTot,
0012 O Hc, PIc,
0013 I myThid )
0014
0015
0016
0017
0018
0019
0020
0021
0022 IMPLICIT NONE
0023 #include "SIZE.h"
0024 #include "EEPARAMS.h"
0025 #include "PARAMS.h"
0026 #include "GRID.h"
0027 #include "LAYERS_SIZE.h"
0028 #include "LAYERS.h"
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 INTEGER iLa, myThid
0049 _RL tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr, nSx,nSy)
0050 _RL TtendSurf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0051 _RL TtendDiffh(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0052 _RL TtendDiffr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0053 _RL TtendAdvh (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0054 _RL TtendAdvr (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0055 _RL TtendTot (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0056 _RL StendSurf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0057 _RL StendDiffh(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0058 _RL StendDiffr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0059 _RL StendAdvh (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0060 _RL StendAdvr (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0061 _RL StendTot (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0062 _RL Hc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers,nSx,nSy)
0063 _RL PIc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers,nSx,nSy)
0064
0065
0066 #ifdef LAYERS_THERMODYNAMICS
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 _RL Hcw (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nlayers-1,nSx,nSy)
0081 INTEGER bi, bj
0082 INTEGER i,j,k,kk,kg,kci,kloc
0083 INTEGER mSteps
0084 INTEGER kgc(sNx+1,sNy+1)
0085 INTEGER kgcw(sNx+1,sNy+1)
0086 _RL TatC(sNx+1,sNy+1), dzfac, Tfac, Sfac
0087 LOGICAL errorFlag
0088 CHARACTER*(MAX_LEN_MBUF) msgBuf
0089 #ifdef LAYERS_FINEGRID_DIAPYCNAL
0090 INTEGER kp1
0091 #endif
0092
0093
0094 Tfac = 1. _d 0
0095 Sfac = 1. _d 0
0096
0097
0098
0099 mSteps = INT(LOG10(DBLE(Nlayers))/LOG10(2. _d 0))+1
0100
0101
0102
0103
0104 DO bj=myByLo(myThid),myByHi(myThid)
0105 DO bi=myBxLo(myThid),myBxHi(myThid)
0106
0107
0108 DO j = 1,sNy+1
0109 DO i = 1,sNx+1
0110
0111
0112
0113 kgc(i,j) = Nlayers
0114 kgcw(i,j) = Nlayers-1
0115 ENDDO
0116 ENDDO
0117
0118
0119
0120 DO kg=1,Nlayers-1
0121 DO j = 1-OLy,sNy+OLy
0122 DO i = 1-OLx,sNx+OLx
0123 TtendSurf (i,j,kg,bi,bj) = 0. _d 0
0124 TtendDiffh(i,j,kg,bi,bj) = 0. _d 0
0125 TtendDiffr(i,j,kg,bi,bj) = 0. _d 0
0126 TtendAdvh(i,j,kg,bi,bj) = 0. _d 0
0127 TtendAdvr(i,j,kg,bi,bj) = 0. _d 0
0128 TtendTot(i,j,kg,bi,bj) = 0. _d 0
0129 StendSurf (i,j,kg,bi,bj) = 0. _d 0
0130 StendDiffh(i,j,kg,bi,bj) = 0. _d 0
0131 StendDiffr(i,j,kg,bi,bj) = 0. _d 0
0132 StendAdvh(i,j,kg,bi,bj) = 0. _d 0
0133 StendAdvr(i,j,kg,bi,bj) = 0. _d 0
0134 StendTot(i,j,kg,bi,bj) = 0. _d 0
0135 Hcw(i,j,kg,bi,bj) = 0. _d 0
0136 ENDDO
0137 ENDDO
0138 ENDDO
0139
0140 DO kg=1,Nlayers
0141 DO j = 1-OLy,sNy+OLy
0142 DO i = 1-OLx,sNx+OLx
0143 Hc(i,j,kg,bi,bj) = 0. _d 0
0144 PIc(i,j,kg,bi,bj) = 0. _d 0
0145 ENDDO
0146 ENDDO
0147 ENDDO
0148
0149 #ifdef LAYERS_FINEGRID_DIAPYCNAL
0150 DO kk=1,NZZ
0151 k = MapIndex(kk)
0152 kci = CellIndex(kk)
0153 DO j = 1,sNy+1
0154 DO i = 1,sNx+1
0155
0156 kp1=k+1
0157 IF (maskC(i,j,kp1,bi,bj).EQ.zeroRS) kp1=k
0158 TatC(i,j) = MapFact(kk) * tracer(i,j,k,bi,bj) +
0159 & (1. _d 0 -MapFact(kk)) * tracer(i,j,kp1,bi,bj)
0160 ENDDO
0161 ENDDO
0162 #else
0163 DO kk=1,Nr
0164 k = kk
0165 kci = kk
0166 DO j = 1,sNy+1
0167 DO i = 1,sNx+1
0168 TatC(i,j) = tracer(i,j,k,bi,bj)
0169 ENDDO
0170 ENDDO
0171 #endif /* LAYERS_FINEGRID_DIAPYCNAL */
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 CALL LAYERS_LOCATE(
0191 I layers_bounds(1,iLa),Nlayers,mSteps,sNx,sNy,TatC,
0192 O kgc,
0193 I myThid )
0194 #ifndef TARGET_NEC_SX
0195
0196 IF ( debugLevel .GE. debLevC ) THEN
0197 errorFlag = .FALSE.
0198 DO j = 1,sNy+1
0199 DO i = 1,sNx+1
0200 IF ( kgc(i,j) .LE. 0 ) THEN
0201 WRITE(msgBuf,'(2A,I3,A,I3,A,1E14.6)')
0202 & 'S/R LAYERS_LOCATE: Could not find a bin in ',
0203 & 'layers_bounds for TatC(',i,',',j,',)=',TatC(i,j)
0204 CALL PRINT_ERROR( msgBuf, myThid )
0205 errorFlag = .TRUE.
0206 ENDIF
0207 ENDDO
0208 ENDDO
0209 IF ( errorFlag ) STOP 'ABNORMAL END: S/R LAYERS_DIAPYCNAL'
0210 ENDIF
0211 #endif /* ndef TARGET_NEC_SX */
0212
0213
0214 CALL LAYERS_LOCATE(
0215 I layers_bounds_w(1,iLa),Nlayers-1,mSteps,sNx,sNy,TatC,
0216 O kgcw,
0217 I myThid )
0218 #ifndef TARGET_NEC_SX
0219
0220 IF ( debugLevel .GE. debLevC ) THEN
0221 errorFlag = .FALSE.
0222 DO j = 1,sNy+1
0223 DO i = 1,sNx+1
0224 IF ( kgcw(i,j) .LE. 0 ) THEN
0225 WRITE(msgBuf,'(2A,I3,A,I3,A,1E14.6)')
0226 & 'S/R LAYERS_LOCATE: Could not find a bin in ',
0227 & 'layers_bounds for TatC(',i,',',j,',)=',TatC(i,j)
0228 CALL PRINT_ERROR( msgBuf, myThid )
0229 errorFlag = .TRUE.
0230 ENDIF
0231 ENDDO
0232 ENDDO
0233 IF ( errorFlag ) STOP 'ABNORMAL END: S/R LAYERS_DIAPYCNAL'
0234 ENDIF
0235 #endif /* ndef TARGET_NEC_SX */
0236
0237
0238 DO j = 1,sNy+1
0239 DO i = 1,sNx+1
0240 #ifdef LAYERS_FINEGRID_DIAPYCNAL
0241 dzfac = dZZf(kk) * hFacC(i,j,kci,bi,bj)
0242 #else
0243 dzfac = dRf(kci) * hFacC(i,j,kci,bi,bj)
0244 #endif /* LAYERS_FINEGRID_DIAPYCNAL */
0245 kloc = kgcw(i,j)
0246
0247
0248 Hcw(i,j,kloc,bi,bj) = Hcw(i,j,kloc,bi,bj)
0249 & + dzfac
0250
0251 Hc(i,j,kgc(i,j),bi,bj) = Hc(i,j,kgc(i,j),bi,bj)
0252 & + dzfac
0253
0254
0255 dzfac = dzfac * layers_recip_delta(kloc,iLa)
0256
0257 #ifdef LAYERS_PRHO_REF
0258 IF ( layers_num(iLa) .EQ. 3 ) THEN
0259 Tfac = layers_alpha(i,j,kci,bi,bj)
0260 Sfac = layers_beta(i,j,kci,bi,bj)
0261 ENDIF
0262 #endif
0263 IF (kci.EQ.1) THEN
0264
0265 TtendSurf(i,j,kloc,bi,bj) = TtendSurf(i,j,kloc,bi,bj)
0266 & + Tfac * dzfac * layers_surfflux(i,j,1,1,bi,bj)
0267 StendSurf(i,j,kloc,bi,bj) = StendSurf(i,j,kloc,bi,bj)
0268 & + Sfac * dzfac * layers_surfflux(i,j,1,2,bi,bj)
0269 ENDIF
0270
0271 #ifdef SHORTWAVE_HEATING
0272 TtendSurf(i,j,kloc,bi,bj) = TtendSurf(i,j,kloc,bi,bj)
0273 & + Tfac * dzfac * layers_sw(i,j,kci,1,bi,bj)
0274 #endif /* SHORTWAVE_HEATING */
0275
0276
0277 TtendDiffh(i,j,kloc,bi,bj) = TtendDiffh(i,j,kloc,bi,bj)
0278 & + dzfac * Tfac*( layers_dfx(i,j,kci,1,bi,bj)
0279 & + layers_dfy(i,j,kci,1,bi,bj) )
0280 StendDiffh(i,j,kloc,bi,bj) = StendDiffh(i,j,kloc,bi,bj)
0281 & + dzfac * Sfac*( layers_dfx(i,j,kci,2,bi,bj)
0282 & + layers_dfy(i,j,kci,2,bi,bj) )
0283 TtendDiffr(i,j,kloc,bi,bj) = TtendDiffr(i,j,kloc,bi,bj)
0284 & + dzfac * Tfac * layers_dfr(i,j,kci,1,bi,bj)
0285 StendDiffr(i,j,kloc,bi,bj) = StendDiffr(i,j,kloc,bi,bj)
0286 & + dzfac * Sfac * layers_dfr(i,j,kci,2,bi,bj)
0287
0288 TtendAdvh(i,j,kloc,bi,bj) = TtendAdvh(i,j,kloc,bi,bj)
0289 & + dzfac * Tfac*( layers_afx(i,j,kci,1,bi,bj)
0290 & + layers_afy(i,j,kci,1,bi,bj) )
0291 StendAdvh(i,j,kloc,bi,bj) = StendAdvh(i,j,kloc,bi,bj)
0292 & + dzfac * Sfac*( layers_afx(i,j,kci,2,bi,bj)
0293 & + layers_afy(i,j,kci,2,bi,bj) )
0294 TtendAdvr(i,j,kloc,bi,bj) = TtendAdvr(i,j,kloc,bi,bj)
0295 & + dzfac * Tfac * layers_afr(i,j,kci,1,bi,bj)
0296 StendAdvr(i,j,kloc,bi,bj) = StendAdvr(i,j,kloc,bi,bj)
0297 & + dzfac * Sfac * layers_afr(i,j,kci,2,bi,bj)
0298
0299 TtendTot(i,j,kloc,bi,bj) = TtendTot(i,j,kloc,bi,bj)
0300 & + dzfac * Tfac * layers_tottend(i,j,kci,1,bi,bj)
0301 StendTot(i,j,kloc,bi,bj) = StendTot(i,j,kloc,bi,bj)
0302 & + dzfac * Sfac * layers_tottend(i,j,kci,2,bi,bj)
0303 ENDDO
0304 ENDDO
0305
0306 ENDDO
0307
0308
0309
0310 DO kg=1,Nlayers
0311 DO j = 1,sNy+1
0312 DO i = 1,sNx+1
0313 IF (Hc(i,j,kg,bi,bj) .GT. 0.) THEN
0314 PIc(i,j,kg,bi,bj) = 1. _d 0
0315 ENDIF
0316 ENDDO
0317 ENDDO
0318 ENDDO
0319
0320
0321 ENDDO
0322 ENDDO
0323
0324 #endif /* LAYERS_THERMODYNAMICS */
0325
0326 RETURN
0327 END