File indexing completed on 2022-01-06 06:13:25 UTC
view on githubraw file Latest commit 9f5240b5 on 2022-01-05 15:24:45 UTC
0c3d35c9cd Gael*0001 #include "SMOOTH_OPTIONS.h"
0002
0003
9f5240b52a Jean*0004 SUBROUTINE SMOOTH_RHS( fld_in, gt_in, myThid )
0c3d35c9cd Gael*0005
0006
0007
9f5240b52a Jean*0008
0c3d35c9cd Gael*0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 IMPLICIT NONE
0035 #include "SIZE.h"
0036 #include "EEPARAMS.h"
0037 #include "PARAMS.h"
0038 #include "GRID.h"
0039 #include "SMOOTH.h"
0040
0041
9f5240b52a Jean*0042 _RL fld_in(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0043 _RL gt_in (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
5fda927278 Gael*0044 INTEGER myThid
0c3d35c9cd Gael*0045
5fda927278 Gael*0046
0c3d35c9cd Gael*0047 INTEGER bi,bj,iMin,iMax,jMin,jMax
0048 _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0049 _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0050 _RS maskUp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0051 _RL dTdz (nSx,nSy)
0052 _RL dTdx (nSx,nSy)
0053 _RL dTdy (nSx,nSy)
0054 INTEGER i,j,k
9f5240b52a Jean*0055 _RL fZon (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0056 _RL fMer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0057 _RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0c3d35c9cd Gael*0058 _RL df (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
5fda927278 Gael*0059
0c3d35c9cd Gael*0060 DO bj=myByLo(myThid),myByHi(myThid)
0061 DO bi=myBxLo(myThid),myBxHi(myThid)
0062
0063
0064 DO k=1,Nr
5fda927278 Gael*0065 DO j=1-OLy,sNy+OLy
0066 DO i=1-OLx,sNx+OLx
9f5240b52a Jean*0067 fZon(i,j,k,bi,bj) = 0. _d 0
0068 fMer(i,j,k,bi,bj) = 0. _d 0
5fda927278 Gael*0069 fVerT(i,j,k,bi,bj) = 0. _d 0
0070 gt_in(i,j,k,bi,bj) = 0. _d 0
0071 ENDDO
0072 ENDDO
0c3d35c9cd Gael*0073 ENDDO
0074
5fda927278 Gael*0075 iMin = 1-OLx+1
0076 iMax = sNx+OLx-1
0077 jMin = 1-OLy+1
0078 jMax = sNy+OLy-1
0c3d35c9cd Gael*0079
0080
0081 DO k=1,Nr
0082
5fda927278 Gael*0083 DO j=1-OLy,sNy+OLy
0084 DO i=1-OLx,sNx+OLx
9f5240b52a Jean*0085 df(i,j,bi,bj) = 0. _d 0
5fda927278 Gael*0086 xA(i,j,bi,bj) = _dyG(i,j,bi,bj)
0087 & *drF(k)*smooth_hFacW(i,j,k,bi,bj)
0088 yA(i,j,bi,bj) = _dxG(i,j,bi,bj)
0089 & *drF(k)*smooth_hFacS(i,j,k,bi,bj)
9f5240b52a Jean*0090 IF (k .EQ. 1) THEN
5fda927278 Gael*0091 maskUp(i,j,bi,bj) = 0.
0092 ELSE
9f5240b52a Jean*0093 maskUp(i,j,bi,bj) =
5fda927278 Gael*0094 & maskC(i,j,k-1,bi,bj)*maskC(i,j,k,bi,bj)
0095 ENDIF
0096 ENDDO
0097 ENDDO
0c3d35c9cd Gael*0098
0099
0100
5fda927278 Gael*0101 DO j=jMin,jMax
0102 DO i=iMin,iMax
9f5240b52a Jean*0103 df(i,j,bi,bj) = df(i,j,bi,bj)
5fda927278 Gael*0104 & -xA(i,j,bi,bj)
0105 & *smooth3D_Kux(i,j,k,bi,bj)
0106 & *recip_dxC(i,j,bi,bj)
0107 & *(fld_in(i,j,k,bi,bj)-fld_in(i-1,j,k,bi,bj))
0108 ENDDO
0109 ENDDO
0c3d35c9cd Gael*0110
9f5240b52a Jean*0111 DO j=jMin,jMax
0112 DO i=iMin,iMax
5fda927278 Gael*0113 dTdz(bi,bj) = 0.5*(
0114 & +0.5*recip_drC(k)*
0115 & ( maskC(i-1,j,k,bi,bj)*
0116 & (fld_in(i-1,j, MAX(k-1,1) ,bi,bj)-fld_in(i-1,j,k,bi,bj))
0117 & +maskC( i ,j,k,bi,bj)*
0118 & (fld_in( i ,j, MAX(k-1,1) ,bi,bj)-fld_in( i ,j,k,bi,bj))
0119 & )
0120 & +0.5*recip_drC(MIN(k+1,Nr))*
0121 & ( maskC(i-1,j,MIN(k+1,Nr),bi,bj)*
0122 & (fld_in(i-1,j,k,bi,bj)-fld_in(i-1,j,MIN(k+1,Nr),bi,bj))
0123 & +maskC( i ,j,MIN(k+1,Nr),bi,bj)*
0124 & (fld_in( i ,j,k,bi,bj)-fld_in( i ,j,MIN(k+1,Nr),bi,bj))
9f5240b52a Jean*0125 & ) )
0126 df(i,j,bi,bj) = df(i,j,bi,bj)
5fda927278 Gael*0127 & - xA(i,j,bi,bj)*smooth3D_Kuz(i,j,k,bi,bj)*dTdz(bi,bj)
0128 ENDDO
9f5240b52a Jean*0129 ENDDO
0c3d35c9cd Gael*0130
5fda927278 Gael*0131 DO j=jMin,jMax
0132 DO i=iMin,iMax
0133 dTdy(bi,bj) = 0.5*(
0134 & +0.5*(maskS(i,j,k,bi,bj)
0c3d35c9cd Gael*0135 & *recip_dyC(i,j,bi,bj)*
0136 & (fld_in(i,j,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
0137 & +maskS(i,j+1,k,bi,bj)
0138 & *recip_dyC(i,j+1,bi,bj)*
0139 & (fld_in(i,j+1,k,bi,bj)-fld_in(i,j,k,bi,bj)))
5fda927278 Gael*0140 & +0.5*(maskS(i-1,j,k,bi,bj)
0c3d35c9cd Gael*0141 & *recip_dyC(i,j,bi,bj)*
0142 & (fld_in(i-1,j,k,bi,bj)-fld_in(i-1,j-1,k,bi,bj))
0143 & +maskS(i-1,j+1,k,bi,bj)
0144 & *recip_dyC(i,j+1,bi,bj)*
0145 & (fld_in(i-1,j+1,k,bi,bj)-fld_in(i-1,j,k,bi,bj)))
5fda927278 Gael*0146 & )
0147 df(i,j,bi,bj) = df(i,j,bi,bj)
0148 & - xA(i,j,bi,bj)*smooth3D_Kuy(i,j,k,bi,bj)*dTdy(bi,bj)
9f5240b52a Jean*0149 ENDDO
0150 ENDDO
0c3d35c9cd Gael*0151
0152
0153
9f5240b52a Jean*0154 DO j=jMin,jMax
0155 DO i=iMin,iMax
0156 fZon(i,j,k,bi,bj) = fZon(i,j,k,bi,bj) + df(i,j,bi,bj)
5fda927278 Gael*0157 ENDDO
0158 ENDDO
0c3d35c9cd Gael*0159
9f5240b52a Jean*0160 DO j=jMin,jMax
0161 DO i=iMin,iMax
0162 df(i,j,bi,bj) = 0.
5fda927278 Gael*0163 ENDDO
9f5240b52a Jean*0164 ENDDO
0c3d35c9cd Gael*0165
0166
0167
5fda927278 Gael*0168 DO j=jMin,jMax
0169 DO i=iMin,iMax
0170 df(i,j,bi,bj) = df(i,j,bi,bj)
0171 & -yA(i,j,bi,bj)
0172 & *smooth3D_Kvy(i,j,k,bi,bj)
0173 & *recip_dyC(i,j,bi,bj)
0174 & *(fld_in(i,j,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
0175 ENDDO
0176 ENDDO
0c3d35c9cd Gael*0177
9f5240b52a Jean*0178 DO j=jMin,jMax
0179 DO i=iMin,iMax
5fda927278 Gael*0180 dTdz(bi,bj) = 0.5*(
0181 & +0.5*recip_drC(k)*
0182 & ( maskC(i,j-1,k,bi,bj)*
0183 & (fld_in(i,j-1,MAX(k-1,1),bi,bj)-fld_in(i,j-1,k,bi,bj))
0184 & +maskC(i, j ,k,bi,bj)*
0185 & (fld_in(i, j ,MAX(k-1,1),bi,bj)-fld_in(i, j ,k,bi,bj))
0186 & )
0187 & +0.5*recip_drC(MIN(k+1,Nr))*
0188 & ( maskC(i,j-1,MIN(k+1,Nr),bi,bj)*
0189 & (fld_in(i,j-1,k,bi,bj)-fld_in(i,j-1,MIN(k+1,Nr),bi,bj))
0190 & +maskC(i, j ,MIN(k+1,Nr),bi,bj)*
0191 & (fld_in(i, j ,k,bi,bj)-fld_in(i, j ,MIN(k+1,Nr),bi,bj))
0192 & ) )
9f5240b52a Jean*0193 df(i,j,bi,bj) = df(i,j,bi,bj)
0194 & - yA(i,j,bi,bj)*smooth3D_Kvz(i,j,k,bi,bj)*dTdz(bi,bj)
5fda927278 Gael*0195 ENDDO
9f5240b52a Jean*0196 ENDDO
0c3d35c9cd Gael*0197
5fda927278 Gael*0198 DO j=jMin,jMax
0199 DO i=iMin,iMax
0200 dTdx(bi,bj) = 0.5*(
0201 & +0.5*(maskW(i+1,j,k,bi,bj)
0202 & *recip_dxC(i+1,j,bi,bj)*
0203 & (fld_in(i+1,j,k,bi,bj)-fld_in(i,j,k,bi,bj))
0204 & +maskW(i,j,k,bi,bj)
0205 & *recip_dxC(i,j,bi,bj)*
0206 & (fld_in(i,j,k,bi,bj)-fld_in(i-1,j,k,bi,bj)))
0207 & +0.5*(maskW(i+1,j-1,k,bi,bj)
0208 & *recip_dxC(i+1,j,bi,bj)*
0209 & (fld_in(i+1,j-1,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
0210 & +maskW(i,j-1,k,bi,bj)
0211 & *recip_dxC(i,j,bi,bj)*
0212 & (fld_in(i,j-1,k,bi,bj)-fld_in(i-1,j-1,k,bi,bj)))
0213 & )
9f5240b52a Jean*0214 df(i,j,bi,bj) = df(i,j,bi,bj)
0215 & - yA(i,j,bi,bj)*smooth3D_Kvx(i,j,k,bi,bj)*dTdx(bi,bj)
5fda927278 Gael*0216 ENDDO
0217 ENDDO
0c3d35c9cd Gael*0218
9f5240b52a Jean*0219
0220
0221 DO j=jMin,jMax
0222 DO i=iMin,iMax
0223 fMer(i,j,k,bi,bj) = fMer(i,j,k,bi,bj) + df(i,j,bi,bj)
5fda927278 Gael*0224 ENDDO
9f5240b52a Jean*0225 ENDDO
0c3d35c9cd Gael*0226
9f5240b52a Jean*0227 DO j=jMin,jMax
0228 DO i=iMin,iMax
0229 df(i,j,bi,bj) = 0.
5fda927278 Gael*0230 ENDDO
9f5240b52a Jean*0231 ENDDO
0c3d35c9cd Gael*0232
0233
0234
9f5240b52a Jean*0235 IF ( k.GT.1 .AND. .NOT.smooth3DdoImpldiff ) THEN
5fda927278 Gael*0236 DO j=jMin,jMax
0237 DO i=iMin,iMax
0238 df(i,j,bi,bj) =
0239 & -_rA(i,j,bi,bj)
0240 & *smooth3D_kappaR(i,j,k,bi,bj)*recip_drC(k)
0241 & *(fld_in(i,j,k,bi,bj)
0242 & -fld_in(i,j,k-1,bi,bj))*rkSign
9f5240b52a Jean*0243 ENDDO
0244 ENDDO
0245 ENDIF
0c3d35c9cd Gael*0246
0247
0248
9f5240b52a Jean*0249 IF (k.GT.1) THEN
0250 DO j=jMin,jMax
0251 DO i=iMin,iMax
0252 dTdx(bi,bj) = 0.5*(
0253 & +0.5*(maskW(i+1,j,k,bi,bj)
0254 & *recip_dxC(i+1,j,bi,bj)*
0255 & (fld_in(i+1,j,k,bi,bj)-fld_in(i,j,k,bi,bj))
5fda927278 Gael*0256 & +maskW(i,j,k,bi,bj)
9f5240b52a Jean*0257 & *recip_dxC(i,j,bi,bj)*
0258 & (fld_in(i,j,k,bi,bj)-fld_in(i-1,j,k,bi,bj)))
0259 & +0.5*(maskW(i+1,j,k-1,bi,bj)
0260 & *recip_dxC(i+1,j,bi,bj)*
0261 & (fld_in(i+1,j,k-1,bi,bj)-fld_in(i,j,k-1,bi,bj))
5fda927278 Gael*0262 & +maskW(i,j,k-1,bi,bj)
9f5240b52a Jean*0263 & *recip_dxC(i,j,bi,bj)*
0264 & (fld_in(i,j,k-1,bi,bj)-fld_in(i-1,j,k-1,bi,bj)))
0265 & )
0266
0267 dTdy(bi,bj) = 0.5*(
0268 & +0.5*(maskS(i,j,k,bi,bj)
0269 & *recip_dyC(i,j,bi,bj)*
0270 & (fld_in(i,j,k,bi,bj)-fld_in(i,j-1,k,bi,bj))
0271 & +maskS(i,j+1,k,bi,bj)
0272 & *recip_dyC(i,j+1,bi,bj)*
0273 & (fld_in(i,j+1,k,bi,bj)-fld_in(i,j,k,bi,bj)))
0274 & +0.5*(maskS(i,j,k-1,bi,bj)
0275 & *recip_dyC(i,j,bi,bj)*
0276 & (fld_in(i,j,k-1,bi,bj)-fld_in(i,j-1,k-1,bi,bj))
0277 & +maskS(i,j+1,k-1,bi,bj)
0278 & *recip_dyC(i,j+1,bi,bj)*
0279 & (fld_in(i,j+1,k-1,bi,bj)-fld_in(i,j,k-1,bi,bj)))
0280 & )
0281
0282 df(i,j,bi,bj) = df(i,j,bi,bj)
5fda927278 Gael*0283 & - rA(i,j,bi,bj)
0284 & *( smooth3D_Kwx(i,j,k,bi,bj)*dTdx(bi,bj)
9f5240b52a Jean*0285 & +smooth3D_Kwy(i,j,k,bi,bj)*dTdy(bi,bj) )
0c3d35c9cd Gael*0286
9f5240b52a Jean*0287 ENDDO
5fda927278 Gael*0288 ENDDO
0289 ENDIF
0c3d35c9cd Gael*0290
0291
0292
9f5240b52a Jean*0293 IF (k.GT.1) THEN
0294 DO j=jMin,jMax
0295 DO i=iMin,iMax
0296 fVerT(i,j,k-1,bi,bj) = fVerT(i,j,k-1,bi,bj)
0297 & + df(i,j,bi,bj)*maskUp(i,j,bi,bj)
0298 ENDDO
5fda927278 Gael*0299 ENDDO
0300 ENDIF
0c3d35c9cd Gael*0301
5fda927278 Gael*0302 DO j=jMin,jMax
0303 DO i=iMin,iMax
0304 df(i,j,bi,bj) = 0.
0305 ENDDO
0306 ENDDO
0c3d35c9cd Gael*0307
5fda927278 Gael*0308 ENDDO
0309 ENDDO
0310 ENDDO
0c3d35c9cd Gael*0311
0312
0313 CALL EXCH_UV_XYZ_RL(fZon,fMer,.TRUE.,myThid)
be12682802 Gael*0314 CALL EXCH_XYZ_RL ( fVerT, myThid )
0c3d35c9cd Gael*0315
0316 DO bj=myByLo(myThid),myByHi(myThid)
0317 DO bi=myBxLo(myThid),myBxHi(myThid)
0318
0319 DO k=1,Nr
9f5240b52a Jean*0320 IF (k.GT.1) THEN
0321 DO j=jMin,jMax
0322 DO i=iMin,iMax
0323 gt_in(i,j,k,bi,bj) = gt_in(i,j,k,bi,bj)
0324 & -smooth_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
0325 & *recip_rA(i,j,bi,bj)
0326 & *( (fZon(i+1,j,k,bi,bj)-fZon(i,j,k,bi,bj))
0327 & +(fMer(i,j+1,k,bi,bj)-fMer(i,j,k,bi,bj))
0328 & +(fVerT(i,j,k,bi,bj)-fVerT(i,j,k-1,bi,bj))*rkSign
0329 & )
0330 ENDDO
0c3d35c9cd Gael*0331 ENDDO
9f5240b52a Jean*0332 ELSE
0333 DO j=jMin,jMax
0334 DO i=iMin,iMax
0335 gt_in(i,j,k,bi,bj) = gt_in(i,j,k,bi,bj)
0336 & -smooth_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
0337 & *recip_rA(i,j,bi,bj)
0338 & *( (fZon(i+1,j,k,bi,bj)-fZon(i,j,k,bi,bj))
0339 & +(fMer(i,j+1,k,bi,bj)-fMer(i,j,k,bi,bj))
0340 & +(fVerT(i,j,k,bi,bj))*rkSign
0341 & )
0342 ENDDO
0c3d35c9cd Gael*0343 ENDDO
9f5240b52a Jean*0344 ENDIF
0c3d35c9cd Gael*0345 ENDDO
5fda927278 Gael*0346
0c3d35c9cd Gael*0347 ENDDO
0348 ENDDO
0349
9f5240b52a Jean*0350 CALL EXCH_XYZ_RL( gt_in, myThid )
0c3d35c9cd Gael*0351
9f5240b52a Jean*0352 RETURN
0c3d35c9cd Gael*0353 END
0354