File indexing completed on 2020-11-29 06:10:44 UTC
view on githubraw file Latest commit 622cf2fb on 2020-11-27 18:11:49 UTC
aacd3965ce Jean*0001 #include "PACKAGES_CONFIG.h"
1dbaea09ee Chri*0002 #include "CPP_OPTIONS.h"
0bb99fb476 Alis*0003
9366854e02 Chri*0004
0005
0006
0bb99fb476 Alis*0007 SUBROUTINE CORRECTION_STEP( bi, bj, iMin, iMax, jMin, jMax,
6c16fd0209 Jean*0008 I phiSurfX, phiSurfY,
0009 I myTime, myIter, myThid )
9366854e02 Chri*0010
0011
cb7fa97db9 Jean*0012
0013
0014
9366854e02 Chri*0015
0016
fba1188151 Patr*0017
9366854e02 Chri*0018
0019 IMPLICIT NONE
fba1188151 Patr*0020
0bb99fb476 Alis*0021 #include "SIZE.h"
81bc00c2f0 Chri*0022 #include "EEPARAMS.h"
0bb99fb476 Alis*0023 #include "PARAMS.h"
0024 #include "GRID.h"
d1b81ea0bc Jean*0025 #include "DYNVARS.h"
88830be691 Alis*0026 #ifdef ALLOW_NONHYDROSTATIC
df999eca2c Jean*0027 # include "NH_VARS.h"
0028 #endif
0029 #ifdef ALLOW_DIAGNOSTICS
0030 # include "FFIELDS.h"
88830be691 Alis*0031 #endif
9366854e02 Chri*0032
0033
0bb99fb476 Alis*0034
16f5093311 Jean*0035
0036
0037
0038
6c16fd0209 Jean*0039
16f5093311 Jean*0040
0041 _RL phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0042 _RL phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
6c16fd0209 Jean*0043 INTEGER bi, bj
0044 INTEGER iMin, iMax, jMin, jMax
16f5093311 Jean*0045 _RL myTime
6c16fd0209 Jean*0046 INTEGER myIter
0bb99fb476 Alis*0047 INTEGER myThid
88ea655fd6 Chri*0048
df999eca2c Jean*0049
0050 #ifdef ALLOW_DIAGNOSTICS
0051 LOGICAL DIAGNOSTICS_IS_ON
0052 EXTERNAL DIAGNOSTICS_IS_ON
0053 #endif
0054
9366854e02 Chri*0055
0bb99fb476 Alis*0056
6c16fd0209 Jean*0057
0058
16f5093311 Jean*0059
6c16fd0209 Jean*0060
0061
0bb99fb476 Alis*0062 INTEGER i,j
6c16fd0209 Jean*0063 INTEGER k
16f5093311 Jean*0064 _RL psFac, nhFac
6c16fd0209 Jean*0065 _RL gU_dpx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0066 _RL gV_dpy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
df999eca2c Jean*0067 #ifdef ALLOW_DIAGNOSTICS
0068 LOGICAL dPhiDiagIsOn, implDisDiagIsOn
622cf2fb44 Jean*0069 # ifdef ALLOW_SOLVE4_PS_AND_DRAG
df999eca2c Jean*0070 _RL tmpFac
622cf2fb44 Jean*0071 # endif
df999eca2c Jean*0072 #endif /* ALLOW_DIAGNOSTICS */
9366854e02 Chri*0073
0bb99fb476 Alis*0074
df999eca2c Jean*0075 #ifdef ALLOW_DIAGNOSTICS
0076 dPhiDiagIsOn = .FALSE.
0077 IF ( useDiagnostics )
0078 & dPhiDiagIsOn = DIAGNOSTICS_IS_ON( 'Um_dPhiX', myThid )
0079 & .OR. DIAGNOSTICS_IS_ON( 'Vm_dPhiY', myThid )
0080 implDisDiagIsOn = .FALSE.
0081 IF ( useDiagnostics )
0082 & implDisDiagIsOn = DIAGNOSTICS_IS_ON( 'Um_ImplD', myThid )
0083 & .OR. DIAGNOSTICS_IS_ON( 'Vm_ImplD', myThid )
0084 #endif
0085
6c16fd0209 Jean*0086
0087 DO k=1,Nr
0088
855d57fc61 Jean*0089 #ifdef ALLOW_SOLVE4_PS_AND_DRAG
6c16fd0209 Jean*0090 IF ( selectImplicitDrag.EQ.2 ) THEN
855d57fc61 Jean*0091
df999eca2c Jean*0092 #ifdef ALLOW_DIAGNOSTICS
0093
0094
0095 IF ( dPhiDiagIsOn ) THEN
0096 psFac = pfFacMom*implicSurfPress
0097 & *recip_deepFacC(k)*recip_rhoFacC(k)
0098 DO j=jMin,jMax
0099 DO i=iMin,iMax
0100 gU_dpx(i,j) = -psFac*phiSurfX(i,j)*_maskW(i,j,k,bi,bj)
0101 gV_dpy(i,j) = -psFac*phiSurfY(i,j)*_maskS(i,j,k,bi,bj)
0102 ENDDO
0103 ENDDO
0104 CALL DIAGNOSTICS_FILL( gU_dpx,
0105 & 'Um_dPhiX', k, 1, -2, bi, bj, myThid )
0106 CALL DIAGNOSTICS_FILL( gV_dpy,
0107 & 'Vm_dPhiY', k, 1, -2, bi, bj, myThid )
0108 ENDIF
0109 IF ( implDisDiagIsOn ) THEN
0110 psFac = pfFacMom*implicSurfPress
0111 tmpFac = recip_deepFacC(k)*recip_rhoFacC(k)
0112 DO j=jMin,jMax
0113 DO i=iMin,iMax
0114 gU_dpx(i,j) = -psFac*( dU_psFacX(i,j,k,bi,bj) - tmpFac )
0115 & *phiSurfX(i,j)*_maskW(i,j,k,bi,bj)
0116 gV_dpy(i,j) = -psFac*( dV_psFacY(i,j,k,bi,bj) - tmpFac )
0117 & *phiSurfY(i,j)*_maskS(i,j,k,bi,bj)
0118 ENDDO
0119 ENDDO
0120 CALL DIAGNOSTICS_FILL( gU_dpx,
0121 & 'Um_ImplD', k, 1, -2, bi, bj, myThid )
0122 CALL DIAGNOSTICS_FILL( gV_dpy,
0123 & 'Vm_ImplD', k, 1, -2, bi, bj, myThid )
0124 ENDIF
0125 #endif /* ALLOW_DIAGNOSTICS */
0126
6c16fd0209 Jean*0127
0128 psFac = pfFacMom*implicSurfPress
855d57fc61 Jean*0129
6c16fd0209 Jean*0130
0131 DO j=jMin,jMax
0132 DO i=iMin,iMax
0133 gU_dpx(i,j) =
0134 & -psFac*dU_psFacX(i,j,k,bi,bj)*phiSurfX(i,j)
0135
0136 ENDDO
855d57fc61 Jean*0137 ENDDO
0138
6c16fd0209 Jean*0139
0140 DO j=jMin,jMax
0141 DO i=iMin,iMax
0142 gV_dpy(i,j) =
0143 & -psFac*dV_psFacY(i,j,k,bi,bj)*phiSurfY(i,j)
0144
0145 ENDDO
855d57fc61 Jean*0146 ENDDO
0147
6c16fd0209 Jean*0148 ELSE
855d57fc61 Jean*0149 #endif /* ALLOW_SOLVE4_PS_AND_DRAG */
0150
4606c28752 Jean*0151
6c16fd0209 Jean*0152 psFac = pfFacMom*implicSurfPress
16f5093311 Jean*0153 & *recip_deepFacC(k)*recip_rhoFacC(k)
df999eca2c Jean*0154
0155
6c16fd0209 Jean*0156 IF ( use3Dsolver ) THEN
0157 nhFac = pfFacMom*implicitNHPress
0158 & *recip_deepFacC(k)*recip_rhoFacC(k)
df999eca2c Jean*0159 DO j=jMin,jMax
0160 DO i=iMin,iMax
0161 gU_dpx(i,j) = -(
6c16fd0209 Jean*0162 & psFac*phiSurfX(i,j)
0163 #ifdef ALLOW_NONHYDROSTATIC
0164 & + nhFac*_recip_dxC(i,j,bi,bj)
0165 & *(phi_nh(i,j,k,bi,bj)-phi_nh(i-1,j,k,bi,bj))
0166 #endif
0167 & )*_maskW(i,j,k,bi,bj)
df999eca2c Jean*0168 ENDDO
6c16fd0209 Jean*0169 ENDDO
df999eca2c Jean*0170 ELSE
0171 DO j=jMin,jMax
0172 DO i=iMin,iMax
0173 gU_dpx(i,j) = -psFac*phiSurfX(i,j)*_maskW(i,j,k,bi,bj)
0174 ENDDO
0175 ENDDO
0176 ENDIF
6c16fd0209 Jean*0177
0178
df999eca2c Jean*0179 IF ( use3Dsolver ) THEN
0180 DO j=jMin,jMax
0181 DO i=iMin,iMax
0182 gV_dpy(i,j) = -(
6c16fd0209 Jean*0183 & psFac*phiSurfY(i,j)
0184 #ifdef ALLOW_NONHYDROSTATIC
0185 & + nhFac*_recip_dyC(i,j,bi,bj)
0186 & *(phi_nh(i,j,k,bi,bj)-phi_nh(i,j-1,k,bi,bj))
0187 #endif
0188 & )*_maskS(i,j,k,bi,bj)
df999eca2c Jean*0189 ENDDO
6c16fd0209 Jean*0190 ENDDO
df999eca2c Jean*0191 ELSE
0192 DO j=jMin,jMax
0193 DO i=iMin,iMax
0194 gV_dpy(i,j) = -psFac*phiSurfY(i,j)*_maskS(i,j,k,bi,bj)
0195 ENDDO
0196 ENDDO
0197 ENDIF
0198
0199 #ifdef ALLOW_DIAGNOSTICS
0200 IF ( dPhiDiagIsOn ) THEN
0201 CALL DIAGNOSTICS_FILL( gU_dpx,
0202 & 'Um_dPhiX', k, 1, -2, bi, bj, myThid )
0203 CALL DIAGNOSTICS_FILL( gV_dpy,
0204 & 'Vm_dPhiY', k, 1, -2, bi, bj, myThid )
0205 ENDIF
0206 #endif /* ALLOW_DIAGNOSTICS */
6c16fd0209 Jean*0207
0208 #ifdef ALLOW_SOLVE4_PS_AND_DRAG
855d57fc61 Jean*0209 ENDIF
6c16fd0209 Jean*0210 #endif /* ALLOW_SOLVE4_PS_AND_DRAG */
0bb99fb476 Alis*0211
6c16fd0209 Jean*0212
855d57fc61 Jean*0213 DO j=jMin,jMax
0214 DO i=iMin,iMax
6c16fd0209 Jean*0215 uVel(i,j,k,bi,bj)=( gU(i,j,k,bi,bj)
0216 & + deltaTMom*gU_dpx(i,j)
0217 & )*_maskW(i,j,k,bi,bj)
aacd3965ce Jean*0218 #ifdef ALLOW_OBCS
6c16fd0209 Jean*0219 & *maskInW(i,j,bi,bj)
aacd3965ce Jean*0220 #endif
855d57fc61 Jean*0221 ENDDO
0bb99fb476 Alis*0222 ENDDO
0223
6c16fd0209 Jean*0224
855d57fc61 Jean*0225 DO j=jMin,jMax
0226 DO i=iMin,iMax
6c16fd0209 Jean*0227 vVel(i,j,k,bi,bj)=( gV(i,j,k,bi,bj)
0228 & + deltaTMom*gV_dpy(i,j)
0229 & )*_maskS(i,j,k,bi,bj)
aacd3965ce Jean*0230 #ifdef ALLOW_OBCS
6c16fd0209 Jean*0231 & *maskInS(i,j,bi,bj)
aacd3965ce Jean*0232 #endif
855d57fc61 Jean*0233 ENDDO
0bb99fb476 Alis*0234 ENDDO
855d57fc61 Jean*0235
6c16fd0209 Jean*0236
0237 ENDDO
0bb99fb476 Alis*0238
df999eca2c Jean*0239 #ifdef ALLOW_DIAGNOSTICS
0240 IF ( useDiagnostics .AND. selectImplicitDrag.EQ.2 ) THEN
0241 IF ( DIAGNOSTICS_IS_ON( 'botTauX ', myThid ) ) THEN
0242 IF ( usingZCoords ) THEN
0243
0244 DO j=jMin,jMax
0245 DO i=iMin,iMax
0246 k = MAX( 1, MIN( kLowC(i-1,j,bi,bj), kLowC(i,j,bi,bj) ) )
0247 botDragU(i,j,bi,bj) = -botDragU(i,j,bi,bj)
0248 & * uVel(i,j,k,bi,bj)
0249 ENDDO
0250 ENDDO
0251 ELSE
0252
0253 DO j=jMin,jMax
0254 DO i=iMin,iMax
0255 k = MIN( Nr, kSurfW(i,j,bi,bj) )
0256 botDragU(i,j,bi,bj) = -botDragU(i,j,bi,bj)
0257 & * uVel(i,j,k,bi,bj)
0258 ENDDO
0259 ENDDO
0260 ENDIF
a54ff488da Jean*0261 CALL DIAGNOSTICS_FILL_RS( botDragU, 'botTauX ',
0262 & 0, 1, 1, bi, bj, myThid )
df999eca2c Jean*0263 ENDIF
0264 IF ( DIAGNOSTICS_IS_ON( 'botTauY ', myThid ) ) THEN
0265 IF ( usingZCoords ) THEN
0266
0267 DO j=jMin,jMax
0268 DO i=iMin,iMax
0269 k = MAX( 1, MIN( kLowC(i,j-1,bi,bj), kLowC(i,j,bi,bj) ) )
0270 botDragV(i,j,bi,bj) = -botDragV(i,j,bi,bj)
0271 & * vVel(i,j,k,bi,bj)
0272 ENDDO
0273 ENDDO
0274 ELSE
0275
0276 DO j=jMin,jMax
0277 DO i=iMin,iMax
0278 k = MIN( Nr, kSurfS(i,j,bi,bj) )
0279 botDragV(i,j,bi,bj) = -botDragV(i,j,bi,bj)
0280 & * vVel(i,j,k,bi,bj)
0281 ENDDO
0282 ENDDO
0283 ENDIF
a54ff488da Jean*0284 CALL DIAGNOSTICS_FILL_RS( botDragV, 'botTauY ',
0285 & 0, 1, 1, bi, bj, myThid )
df999eca2c Jean*0286 ENDIF
0287 ENDIF
1fa1235c63 Jean*0288
0289 # ifdef ALLOW_SHELFICE
0290 IF ( useShelfIce .AND. useDiagnostics ) THEN
0291 CALL SHELFICE_DIAGNOSTICS_DRAG(
0292 I uVel(1-OLx,1-OLy,1,bi,bj),
0293 I vVel(1-OLx,1-OLy,1,bi,bj),
0294 I bi, bj, myIter, myThid )
0295 ENDIF
0296 # endif /* ALLOW_SHELFICE */
df999eca2c Jean*0297 #endif /* ALLOW_DIAGNOSTICS */
0298
0bb99fb476 Alis*0299 RETURN
0300 END