File indexing completed on 2023-02-03 06:09:36 UTC
view on githubraw file Latest commit edb66560 on 2023-02-02 23:32:31 UTC
6d54cf9ca1 Ed H*0001 #include "PACKAGES_CONFIG.h"
fb5eaa30cd Jean*0002 #include "CPP_OPTIONS.h"
52dd931a85 Timo*0003 #ifdef ALLOW_AUTODIFF
0004 # include "AUTODIFF_OPTIONS.h"
0005 #endif
aecc8b0f47 Mart*0006 #ifdef ALLOW_CTRL
0007 # include "CTRL_OPTIONS.h"
0008 #endif
fb5eaa30cd Jean*0009
0010
0011
0012
0013 SUBROUTINE INTEGR_CONTINUITY(
bfdbc242ac Jean*0014 I uFld, vFld,
fb5eaa30cd Jean*0015 I myTime, myIter, myThid )
0016
0017
21b8df1d84 Jean*0018
0019
bfdbc242ac Jean*0020
0021
52dd931a85 Timo*0022
0023
fb5eaa30cd Jean*0024
0025
0026
0027
0028 IMPLICIT NONE
0029
0030 #include "SIZE.h"
0031 #include "EEPARAMS.h"
0032 #include "PARAMS.h"
0033 #include "DYNVARS.h"
0034 #include "GRID.h"
0035 #include "SURFACE.h"
0036 #include "FFIELDS.h"
aecc8b0f47 Mart*0037 #ifdef ALLOW_AUTODIFF_TAMC
0038 # include "tamc.h"
0039 #endif
fb5eaa30cd Jean*0040
0041
0042
bfdbc242ac Jean*0043
0044
0045
0046
0047
fb5eaa30cd Jean*0048 _RL myTime
0049 INTEGER myIter
0050 INTEGER myThid
e1fb02e8f0 Jean*0051 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0052 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
fb5eaa30cd Jean*0053
0054
0055
0056
0057
bfdbc242ac Jean*0058
0059
0060
0061
8dc89a3cca Jean*0062
e1fb02e8f0 Jean*0063 INTEGER k,bi,bj
55e9ea8a90 Jean*0064 #ifdef EXACT_CONSERV
e1fb02e8f0 Jean*0065 INTEGER i, j
b924705ae1 Matt*0066 INTEGER ks
e1fb02e8f0 Jean*0067 _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0068 _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0069 _RL hDivFlow(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
d2a11ab670 Jean*0070 _RL facEmP, facMass
e1fb02e8f0 Jean*0071 #else /* EXACT_CONSERV */
0072 # ifdef ALLOW_OBCS
0073 INTEGER i, j
0074 # endif
d2a11ab670 Jean*0075 #endif /* EXACT_CONSERV */
0076 #ifndef ALLOW_ADDFLUID
0077 _RL addMass(1)
0078 #endif /* ndef ALLOW_ADDFLUID */
65de7f3d8d Jean*0079 #if (defined NONLIN_FRSURF) &&
e1fb02e8f0 Jean*0080 _RL rStarDhDt(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
aecc8b0f47 Mart*0081 # if (defined ALLOW_AUTODIFF_TAMC) && (defined ALLOW_DEPTH_CONTROL)
edb6656069 Mart*0082
0083 INTEGER tkey
aecc8b0f47 Mart*0084 # endif
65de7f3d8d Jean*0085 #else
0086 _RL rStarDhDt(1)
0087 #endif
fb5eaa30cd Jean*0088
0089
bfdbc242ac Jean*0090
0091 DO bj=myByLo(myThid),myByHi(myThid)
0092 DO bi=myBxLo(myThid),myBxHi(myThid)
0093
fb5eaa30cd Jean*0094
0095
0096 #ifdef EXACT_CONSERV
0097 IF (exactConserv) THEN
0098
d2a11ab670 Jean*0099 facEmP = 0.
0100 IF ( fluidIsWater.AND.useRealFreshWaterFlux ) facEmP=mass2rUnit
0101 facMass = 0.
0102 IF ( selectAddFluid.GE.1 ) facMass = mass2rUnit
0103
fb5eaa30cd Jean*0104
0105
21b8df1d84 Jean*0106
e1fb02e8f0 Jean*0107 DO j=1-OLy,sNy+OLy
0108 DO i=1-OLx,sNx+OLx
8dc89a3cca Jean*0109 hDivFlow(i,j) = 0. _d 0
0110 utrans(i,j) = 0. _d 0
0111 vtrans(i,j) = 0. _d 0
d2a11ab670 Jean*0112 ENDDO
fb5eaa30cd Jean*0113 ENDDO
0114
d2a11ab670 Jean*0115 DO k=1,Nr
21b8df1d84 Jean*0116
fb5eaa30cd Jean*0117
4606c28752 Jean*0118
fb5eaa30cd Jean*0119 DO j=1,sNy+1
0120 DO i=1,sNx+1
0121 uTrans(i,j) = uFld(i,j,k,bi,bj)*_dyG(i,j,bi,bj)
4606c28752 Jean*0122 & *deepFacC(k)*rhoFacC(k)
fb5eaa30cd Jean*0123 & *drF(k)*_hFacW(i,j,k,bi,bj)
0124 vTrans(i,j) = vFld(i,j,k,bi,bj)*_dxG(i,j,bi,bj)
4606c28752 Jean*0125 & *deepFacC(k)*rhoFacC(k)
fb5eaa30cd Jean*0126 & *drF(k)*_hFacS(i,j,k,bi,bj)
0127 ENDDO
0128 ENDDO
0129
21b8df1d84 Jean*0130
fb5eaa30cd Jean*0131 DO j=1,sNy
0132 DO i=1,sNx
8dc89a3cca Jean*0133 hDivFlow(i,j) = hDivFlow(i,j)
fb5eaa30cd Jean*0134 & +maskC(i,j,k,bi,bj)*( uTrans(i+1,j)-uTrans(i,j)
0135 & +vTrans(i,j+1)-vTrans(i,j) )
d2a11ab670 Jean*0136 #ifdef ALLOW_ADDFLUID
0137 & -facMass*addMass(i,j,k,bi,bj)
0138 #endif /* ALLOW_ADDFLUID */
fb5eaa30cd Jean*0139 ENDDO
0140 ENDDO
0141
0142
d2a11ab670 Jean*0143 ENDDO
fb5eaa30cd Jean*0144
8dc89a3cca Jean*0145
4606c28752 Jean*0146
0147
bfdbc242ac Jean*0148 IF ( myIter.EQ.nIter0 .AND. myIter.NE.0
0149 & .AND. fluidIsWater .AND. useRealFreshWaterFlux ) THEN
615c650f5e Jean*0150
8dc89a3cca Jean*0151
615c650f5e Jean*0152
0153 IF ( usePickupBeforeC54 ) THEN
8dc89a3cca Jean*0154 DO j=1,sNy
0155 DO i=1,sNx
615c650f5e Jean*0156 dEtaHdt(i,j,bi,bj) = (etaN(i,j,bi,bj)-etaH(i,j,bi,bj))
edb6656069 Mart*0157 & / (implicDiv2Dflow*deltaTFreeSurf)
615c650f5e Jean*0158 ENDDO
0159 ENDDO
0160 ENDIF
0161
0162 DO j=1,sNy
0163 DO i=1,sNx
8dc89a3cca Jean*0164 PmEpR(i,j,bi,bj) = dEtaHdt(i,j,bi,bj)
0165 & + hDivFlow(i,j)*recip_rA(i,j,bi,bj)
4606c28752 Jean*0166 & *recip_deepFac2F(1)
62fd6ae4e5 Jean*0167 PmEpR(i,j,bi,bj) = PmEpR(i,j,bi,bj)*rUnit2mass
8dc89a3cca Jean*0168 ENDDO
615c650f5e Jean*0169 ENDDO
bfdbc242ac Jean*0170 ELSEIF ( myIter.EQ.nIter0 ) THEN
8dc89a3cca Jean*0171 DO j=1,sNy
0172 DO i=1,sNx
edb6656069 Mart*0173 ks = kSurfC(i,j,bi,bj)
8dc89a3cca Jean*0174 PmEpR(i,j,bi,bj) = 0. _d 0
0175 dEtaHdt(i,j,bi,bj) = -hDivFlow(i,j)*recip_rA(i,j,bi,bj)
4606c28752 Jean*0176 & *recip_deepFac2F(ks)
8dc89a3cca Jean*0177 ENDDO
21b8df1d84 Jean*0178 ENDDO
8dc89a3cca Jean*0179 ELSE
21b8df1d84 Jean*0180
0181
0182 DO j=1-OLy,sNy+OLy
0183 DO i=1-OLx,sNx+OLx
0184 PmEpR(i,j,bi,bj) = -EmPmR(i,j,bi,bj)
0185 ENDDO
0186 ENDDO
8dc89a3cca Jean*0187 DO j=1,sNy
0188 DO i=1,sNx
2d3bf0eeda Jean*0189 ks = kSurfC(i,j,bi,bj)
8dc89a3cca Jean*0190 dEtaHdt(i,j,bi,bj) = -hDivFlow(i,j)*recip_rA(i,j,bi,bj)
4606c28752 Jean*0191 & *recip_deepFac2F(ks)
8dc89a3cca Jean*0192 & -facEmP*EmPmR(i,j,bi,bj)
0193 ENDDO
0194 ENDDO
0195 ENDIF
0196
0197
2d3bf0eeda Jean*0198 #ifdef ALLOW_OBCS
0199
0200 IF ( useOBCS ) THEN
0201 DO j=1,sNy
0202 DO i=1,sNx
0203 dEtaHdt(i,j,bi,bj) = dEtaHdt(i,j,bi,bj)*maskInC(i,j,bi,bj)
0204 ENDDO
0205 ENDDO
0206 ENDIF
0207 #endif /* ALLOW_OBCS */
0208
0209
fb5eaa30cd Jean*0210 ENDIF
0211
0212
0213
bfdbc242ac Jean*0214 IF ( exactConserv .AND. myIter.NE.nIter0 ) THEN
21b8df1d84 Jean*0215
fb5eaa30cd Jean*0216
0217
0218 IF (implicDiv2Dflow.EQ. 0. _d 0) THEN
e1fb02e8f0 Jean*0219 DO j=1-OLy,sNy+OLy
0220 DO i=1-OLx,sNx+OLx
21b8df1d84 Jean*0221 etaN(i,j,bi,bj) = etaH(i,j,bi,bj)
fb5eaa30cd Jean*0222 ENDDO
0223 ENDDO
0224 ELSE
0225 DO j=1,sNy
0226 DO i=1,sNx
0227 etaN(i,j,bi,bj) = etaH(i,j,bi,bj)
edb6656069 Mart*0228 & + implicDiv2Dflow*dEtaHdt(i,j,bi,bj)*deltaTFreeSurf
fb5eaa30cd Jean*0229 ENDDO
0230 ENDDO
0231 ENDIF
0232
b3d6da8289 Dimi*0233 #ifdef ALLOW_OBCS
2d3bf0eeda Jean*0234
0235
0236
0237
0238
21b8df1d84 Jean*0239 #endif /* ALLOW_OBCS */
604cf5604a Alis*0240
bfdbc242ac Jean*0241
fb5eaa30cd Jean*0242 ENDIF
0243
0244
0245
cdc9f269ae Patr*0246 # ifdef NONLIN_FRSURF
aecc8b0f47 Mart*0247 # if (defined ALLOW_AUTODIFF_TAMC) && \
0248 (defined ALLOW_DEPTH_CONTROL) && (
edb6656069 Mart*0249 tkey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
0250
aecc8b0f47 Mart*0251 # endif
00b29feb62 Jean*0252 IF (select_rStar .NE. 0) THEN
cdc9f269ae Patr*0253 # ifndef DISABLE_RSTAR_CODE
65de7f3d8d Jean*0254
0255
8dc89a3cca Jean*0256 DO j=1,sNy
0257 DO i=1,sNx
2d3bf0eeda Jean*0258 ks = kSurfC(i,j,bi,bj)
65de7f3d8d Jean*0259 rStarDhDt(i,j) = dEtaHdt(i,j,bi,bj)
0260 & *deepFac2F(ks)*rhoFacF(ks)
0261 & *recip_Rcol(i,j,bi,bj)
00b29feb62 Jean*0262 ENDDO
cdc9f269ae Patr*0263 ENDDO
0264 # endif /* DISABLE_RSTAR_CODE */
00b29feb62 Jean*0265 ENDIF
aecc8b0f47 Mart*0266 # if (defined ALLOW_AUTODIFF_TAMC) && \
0267 (defined ALLOW_DEPTH_CONTROL) && (
edb6656069 Mart*0268
aecc8b0f47 Mart*0269 # endif
cdc9f269ae Patr*0270 # endif /* NONLIN_FRSURF */
0271
ef891516b3 Jean*0272 #endif /* EXACT_CONSERV */
00b29feb62 Jean*0273
0274
0275
fb5eaa30cd Jean*0276 DO k=Nr,1,-1
0277
0278
0279 CALL INTEGRATE_FOR_W(
65de7f3d8d Jean*0280 I bi, bj, k, uFld, vFld,
0281 I addMass, rStarDhDt,
fb5eaa30cd Jean*0282 O wVel,
0283 I myThid )
21b8df1d84 Jean*0284
f4db9965d8 Jean*0285 #ifdef EXACT_CONSERV
bfdbc242ac Jean*0286 IF ( k.EQ.Nr .AND. myIter.NE.0 .AND. usingPCoords
0287 & .AND. fluidIsWater .AND. useRealFreshWaterFlux ) THEN
e0c3eb6fa1 Jean*0288
2d3bf0eeda Jean*0289 DO j=1,sNy
0290 DO i=1,sNx
0291 wVel(i,j,k,bi,bj) = wVel(i,j,k,bi,bj)
62fd6ae4e5 Jean*0292 & +mass2rUnit*PmEpR(i,j,bi,bj)*maskC(i,j,k,bi,bj)
e0c3eb6fa1 Jean*0293 ENDDO
2d3bf0eeda Jean*0294 ENDDO
e0c3eb6fa1 Jean*0295
0296 ENDIF
f4db9965d8 Jean*0297 #endif /* EXACT_CONSERV */
e0c3eb6fa1 Jean*0298
fb5eaa30cd Jean*0299 #ifdef ALLOW_OBCS
2d3bf0eeda Jean*0300
0301 IF ( useOBCS ) THEN
0302 DO j=1,sNy
0303 DO i=1,sNx
0304 wVel(i,j,k,bi,bj) = wVel(i,j,k,bi,bj)*maskInC(i,j,bi,bj)
0305 ENDDO
0306 ENDDO
0307 ENDIF
0308
0309 IF ( useOBCS.AND.nonHydrostatic )
0310 & CALL OBCS_APPLY_W( bi, bj, k, wVel, myThid )
21b8df1d84 Jean*0311 #endif /* ALLOW_OBCS */
fb5eaa30cd Jean*0312
0313
0314 ENDDO
0315
0316
0317
bfdbc242ac Jean*0318
0319 ENDDO
0320 ENDDO
0321
52dd931a85 Timo*0322 #ifdef ALLOW_AUTODIFF_MONITOR
0323
0324 CALL DUMMY_FOR_ETAN( myTime, myIter, myThid )
0325 _EXCH_XY_RL( etaN , myThid )
0326 #else /* ALLOW_AUTODIFF_MONITOR */
bfdbc242ac Jean*0327 IF ( exactConserv .AND. myIter.NE.nIter0
0328 & .AND. implicDiv2Dflow .NE. 0. _d 0 )
c1e2d059e3 Jean*0329 & _EXCH_XY_RL( etaN , myThid )
52dd931a85 Timo*0330 #endif /* ALLOW_AUTODIFF_MONITOR */
0331
bfdbc242ac Jean*0332 IF ( implicitIntGravWave .OR. myIter.EQ.nIter0 )
c1e2d059e3 Jean*0333 & _EXCH_XYZ_RL( wVel , myThid )
bfdbc242ac Jean*0334
0335 #ifdef EXACT_CONSERV
0336
0337 IF (exactConserv) THEN
c1e2d059e3 Jean*0338
0339
bfdbc242ac Jean*0340 #ifdef ALLOW_DEBUG
0341 IF (debugMode) CALL DEBUG_CALL('UPDATE_ETAH',myThid)
0342 #endif
0343 CALL UPDATE_ETAH( myTime, myIter, myThid )
0344 ENDIF
c1e2d059e3 Jean*0345
0346 #ifdef NONLIN_FRSURF
0347 # ifndef DISABLE_SIGMA_CODE
0348 IF ( nonlinFreeSurf.GT.0 .AND. selectSigmaCoord.NE.0 ) THEN
0349 CALL EXCH_XY_RL( dEtaHdt, myThid )
0350 CALL UPDATE_ETAWS( myTime, myIter, myThid )
0351 ENDIF
0352 # endif /* DISABLE_SIGMA_CODE */
0353 #endif /* NONLIN_FRSURF */
0354
bfdbc242ac Jean*0355 #endif /* EXACT_CONSERV */
0356
fb5eaa30cd Jean*0357 RETURN
0358 END