File indexing completed on 2023-08-04 05:10:40 UTC
view on githubraw file Latest commit 45315406 on 2023-08-03 16:50:12 UTC
809c36b928 Patr*0001 #include "SEAICE_OPTIONS.h"
8377b8ee87 Mart*0002 #ifdef ALLOW_EXF
0003 # include "EXF_OPTIONS.h"
0004 #endif
772b2ed80e Gael*0005 #ifdef ALLOW_AUTODIFF
0006 # include "AUTODIFF_OPTIONS.h"
0007 #endif
09510da3bb Dimi*0008
809c36b928 Patr*0009
5d6433c292 Jean*0010 SUBROUTINE DYNSOLVER( myTime, myIter, myThid )
0011
0012
45315406aa Mart*0013
0014
5d6433c292 Jean*0015
0016
809c36b928 Patr*0017 IMPLICIT NONE
09510da3bb Dimi*0018
809c36b928 Patr*0019
0020 #include "SIZE.h"
0021 #include "EEPARAMS.h"
0022 #include "PARAMS.h"
4366d31d92 Mart*0023 #include "GRID.h"
55f4fb1c97 Mart*0024 #include "DYNVARS.h"
809c36b928 Patr*0025 #include "FFIELDS.h"
03c669d1ab Jean*0026 #include "SEAICE_SIZE.h"
809c36b928 Patr*0027 #include "SEAICE_PARAMS.h"
03c669d1ab Jean*0028 #include "SEAICE.h"
ae1fb66b64 Dimi*0029 #ifdef ALLOW_EXF
0030 # include "EXF_FIELDS.h"
0031 #endif
baa476eeba Dimi*0032 #ifdef ALLOW_AUTODIFF_TAMC
0033 # include "tamc.h"
6060ec2938 Dimi*0034 #endif
baa476eeba Dimi*0035
809c36b928 Patr*0036
0037
0038
0039
0040 _RL myTime
0041 INTEGER myIter
0042 INTEGER myThid
0043
09510da3bb Dimi*0044
45315406aa Mart*0045 #ifdef SEAICE_BGRID_DYNAMICS
f3ce416a61 Jean*0046
0047 #ifdef EXPLICIT_SSH_SLOPE
0048 #include "SURFACE.h"
642c38b9c7 Jean*0049 _RL phiSurf(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
f3ce416a61 Jean*0050 #endif
0051
809c36b928 Patr*0052
cee16b76ae Dimi*0053
809c36b928 Patr*0054
642c38b9c7 Jean*0055 INTEGER i, j, bi, bj
35fda33b05 Jean*0056 _RL RHOICE, RHOAIR
df93b38141 Mart*0057 _RL COSWIN
0058 _RS SINWIN
642c38b9c7 Jean*0059 _RL ECCEN, ECM2, PSTAR, AAA
0060 _RL U1, V1
809c36b928 Patr*0061
0062 _RL COR_ICE (1-OLx:sNx+OLx,1-OLy:sNy+OLy, nSx,nSy)
0063
cee16b76ae Dimi*0064
53092bcb42 Mart*0065 RHOICE=SEAICE_rhoIce
0066 RHOAIR=SEAICE_rhoAir
0067 ECCEN=SEAICE_eccen
cee16b76ae Dimi*0068 ECM2=ONE/(ECCEN**2)
0069 PSTAR=SEAICE_strength
0070
16f85413ea Mart*0071
55f4fb1c97 Mart*0072 SINWIN=SIN(SEAICE_airTurnAngle*deg2rad)
0073 COSWIN=COS(SEAICE_airTurnAngle*deg2rad)
0074
0075
0076 DO bj=myByLo(myThid),myByHi(myThid)
0077 DO bi=myBxLo(myThid),myBxHi(myThid)
0078 DO j=0,sNy+1
0079 DO i=0,sNx+1
8377b8ee87 Mart*0080 GWATX(i,j,bi,bj)=HALF*(uVel(i,j,KGEO(i,j,bi,bj),bi,bj)
0081 & +uVel(i,j-1,KGEO(i,j,bi,bj),bi,bj))
0082 GWATY(i,j,bi,bj)=HALF*(vVel(i,j,KGEO(i,j,bi,bj),bi,bj)
0083 & +vVel(i-1,j,KGEO(i,j,bi,bj),bi,bj))
55f4fb1c97 Mart*0084 #ifdef SEAICE_DEBUG
0085
0086
0087
0088
0089
0090 #endif
0091 ENDDO
0092 ENDDO
0093 ENDDO
0094 ENDDO
809c36b928 Patr*0095
cee16b76ae Dimi*0096
0097 DO bj=myByLo(myThid),myByHi(myThid)
0098 DO bi=myBxLo(myThid),myBxHi(myThid)
0b5d39a040 Jean*0099 DO j=1-OLy,sNy+OLy
0100 DO i=1-OLx,sNx+OLx
0101 COR_ICE(i,j,bi,bj) = 0.
0102 ENDDO
0103 ENDDO
cee16b76ae Dimi*0104 DO j=1,sNy
0105 DO i=1,sNx
8377b8ee87 Mart*0106 AMASS(i,j,bi,bj)=RHOICE*QUART*(
772590b63c Mart*0107 & HEFF(i,j ,bi,bj) + HEFF(i-1,j ,bi,bj)
0108 & +HEFF(i,j-1,bi,bj) + HEFF(i-1,j-1,bi,bj) )
8377b8ee87 Mart*0109 COR_ICE(i,j,bi,bj)=AMASS(i,j,bi,bj) * _fCoriG(i,j,bi,bj)
cee16b76ae Dimi*0110 ENDDO
0111 ENDDO
0112 ENDDO
0113 ENDDO
809c36b928 Patr*0114
cee16b76ae Dimi*0115
0116
bda7c25f4a Dimi*0117
0118
0119 DO bj=myByLo(myThid),myByHi(myThid)
0120 DO bi=myBxLo(myThid),myBxHi(myThid)
0121 DO j=1,sNy
0122 DO i=1,sNx
8377b8ee87 Mart*0123 U1=QUART*(UWIND(i-1,j-1,bi,bj)+UWIND(i-1,j,bi,bj)
0124 & +UWIND(i ,j-1,bi,bj)+UWIND(i ,j,bi,bj))
0125 V1=QUART*(VWIND(i-1,j-1,bi,bj)+VWIND(i-1,j,bi,bj)
0126 & +VWIND(i ,j-1,bi,bj)+VWIND(i ,j,bi,bj))
bda7c25f4a Dimi*0127 AAA=U1**2+V1**2
0128 IF ( AAA .LE. SEAICE_EPS_SQ ) THEN
0129 AAA=SEAICE_EPS
0130 ELSE
0131 AAA=SQRT(AAA)
0132 ENDIF
09510da3bb Dimi*0133
8377b8ee87 Mart*0134 DAIRN(i,j,bi,bj)=RHOAIR*OCEAN_drag
bda7c25f4a Dimi*0135 & *(2.70 _d 0+0.142 _d 0*AAA+0.0764 _d 0*AAA*AAA)
8377b8ee87 Mart*0136 WINDX(i,j,bi,bj)=DAIRN(i,j,bi,bj)*
0137 & (COSWIN*U1-SIGN(SINWIN, _fCori(i,j,bi,bj))*V1)
0138 WINDY(i,j,bi,bj)=DAIRN(i,j,bi,bj)*
0139 & (SIGN(SINWIN, _fCori(i,j,bi,bj))*U1+COSWIN*V1)
09510da3bb Dimi*0140
0141
8377b8ee87 Mart*0142 IF ( YC(i,j,bi,bj) .LT. ZERO ) THEN
0143 DAIRN(i,j,bi,bj) =
0144 & RHOAIR*(SEAICE_drag_south*AAA*AREA(i,j,bi,bj)
f834b21bef Dimi*0145 & +OCEAN_drag*(2.70 _d 0+0.142 _d 0*AAA
8377b8ee87 Mart*0146 & +0.0764 _d 0*AAA*AAA)*(ONE-AREA(i,j,bi,bj)))
f834b21bef Dimi*0147 ELSE
8377b8ee87 Mart*0148 DAIRN(i,j,bi,bj) =
0149 & RHOAIR*(SEAICE_drag*AAA*AREA(i,j,bi,bj)
f834b21bef Dimi*0150 & +OCEAN_drag*(2.70 _d 0+0.142 _d 0*AAA
8377b8ee87 Mart*0151 & +0.0764 _d 0*AAA*AAA)*(ONE-AREA(i,j,bi,bj)))
f834b21bef Dimi*0152 ENDIF
8377b8ee87 Mart*0153 FORCEX(i,j,bi,bj)=DAIRN(i,j,bi,bj)*
0154 & (COSWIN*U1-SIGN(SINWIN, _fCori(i,j,bi,bj))*V1)
0155 FORCEY(i,j,bi,bj)=DAIRN(i,j,bi,bj)*
0156 & (SIGN(SINWIN, _fCori(i,j,bi,bj))*U1+COSWIN*V1)
cee16b76ae Dimi*0157 ENDDO
0158 ENDDO
0159 ENDDO
bda7c25f4a Dimi*0160 ENDDO
809c36b928 Patr*0161
0162 DO bj=myByLo(myThid),myByHi(myThid)
0163 DO bi=myBxLo(myThid),myBxHi(myThid)
f3ce416a61 Jean*0164 #ifdef EXPLICIT_SSH_SLOPE
0165
0166
642c38b9c7 Jean*0167 DO j=1-OLy,sNy+OLy
0168 DO i=1-OLx,sNx+OLx
f3ce416a61 Jean*0169 phiSurf(i,j) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
0170 ENDDO
0171 ENDDO
0172 #ifdef ATMOSPHERIC_LOADING
0173
0174 IF ( useRealFreshWaterFlux ) THEN
642c38b9c7 Jean*0175 DO j=1-OLy,sNy+OLy
0176 DO i=1-OLx,sNx+OLx
f3ce416a61 Jean*0177 phiSurf(i,j) = phiSurf(i,j)
0178 & + ( pload(i,j,bi,bj)
0320e25227 Mart*0179 & +sIceLoad(i,j,bi,bj)*gravity*sIceLoadFac
f3ce416a61 Jean*0180 & )*recip_rhoConst
0181 ENDDO
0182 ENDDO
0183 ELSE
642c38b9c7 Jean*0184 DO j=1-OLy,sNy+OLy
0185 DO i=1-OLx,sNx+OLx
f3ce416a61 Jean*0186 phiSurf(i,j) = phiSurf(i,j)
0187 & + pload(i,j,bi,bj)*recip_rhoConst
0188 ENDDO
0189 ENDDO
0190 ENDIF
0191 #endif /* ATMOSPHERIC_LOADING */
642c38b9c7 Jean*0192 DO j=1-OLy+1,sNy+OLy
0193 DO i=1-OLx+1,sNx+OLx
f3ce416a61 Jean*0194
8377b8ee87 Mart*0195 FORCEX(i,j,bi,bj)=FORCEX(i,j,bi,bj)
0196 & -AMASS(i,j,bi,bj)
ec0d7df165 Mart*0197 & *( (phiSurf(i, j )-phiSurf(i-1, j ))*SIMaskU(i, j ,bi,bj)
0198 & +(phiSurf(i,j-1)-phiSurf(i-1,j-1))*SIMaskV(i,j-1,bi,bj)
8377b8ee87 Mart*0199 & )*HALF*_recip_dxV(i,j,bi,bj)
0200 FORCEY(i,j,bi,bj)=FORCEY(i,j,bi,bj)
0201 & -AMASS(i,j,bi,bj)
ec0d7df165 Mart*0202 & *( (phiSurf( i ,j)-phiSurf( i ,j-1))*SIMaskV( i ,j,bi,bj)
0203 & +(phiSurf(i-1,j)-phiSurf(i-1,j-1))*SIMaskV(i-1,j,bi,bj)
8377b8ee87 Mart*0204 & )*HALF*_recip_dyU(i,j,bi,bj)
f3ce416a61 Jean*0205
8377b8ee87 Mart*0206 FORCEX0(i,j,bi,bj)=FORCEX(i,j,bi,bj)
0207 FORCEY0(i,j,bi,bj)=FORCEY(i,j,bi,bj)
f3ce416a61 Jean*0208 ENDDO
0209 ENDDO
0210 #endif /* EXPLICIT_SSH_SLOPE */
642c38b9c7 Jean*0211 DO j=1-OLy,sNy+OLy
0212 DO i=1-OLx,sNx+OLx
f3ce416a61 Jean*0213 #ifndef EXPLICIT_SSH_SLOPE
cee16b76ae Dimi*0214
8377b8ee87 Mart*0215 FORCEX(i,j,bi,bj)=FORCEX(i,j,bi,bj)
0216 & -COR_ICE(i,j,bi,bj)*GWATY(i,j,bi,bj)
0217 FORCEY(i,j,bi,bj)=FORCEY(i,j,bi,bj)
0218 & +COR_ICE(i,j,bi,bj)*GWATX(i,j,bi,bj)
09510da3bb Dimi*0219
8377b8ee87 Mart*0220 FORCEX0(i,j,bi,bj)=FORCEX(i,j,bi,bj)
0221 FORCEY0(i,j,bi,bj)=FORCEY(i,j,bi,bj)
f3ce416a61 Jean*0222 #endif /* EXPLICIT_SSH_SLOPE */
cee16b76ae Dimi*0223
8377b8ee87 Mart*0224 PRESS0(i,j,bi,bj)=PSTAR*HEFF(i,j,bi,bj)
ba6cfc5714 Mart*0225 & *EXP(-SEAICE_cStar*(ONE-AREA(i,j,bi,bj)))
8e32c48b8f Mart*0226
0227 SEAICE_zMax(i,j,bi,bj)=SEAICE_zetaMaxFac*PRESS0(i,j,bi,bj)
0228
0229 SEAICE_zMin(i,j,bi,bj)=SEAICE_zetaMin
8377b8ee87 Mart*0230 PRESS0(i,j,bi,bj)=PRESS0(i,j,bi,bj)*HEFFM(i,j,bi,bj)
809c36b928 Patr*0231 ENDDO
0232 ENDDO
0233 ENDDO
0234 ENDDO
0235
0236 IF ( SEAICEuseDYNAMICS ) THEN
0237
7109a141b2 Patr*0238 #ifdef ALLOW_AUTODIFF_TAMC
0239
0240
0241 #endif /* ALLOW_AUTODIFF_TAMC */
0242
3f31c7d5de Mart*0243
baa476eeba Dimi*0244
0245
0246
09510da3bb Dimi*0247
600feedf01 Dimi*0248
809c36b928 Patr*0249
0250 DO bj=myByLo(myThid),myByHi(myThid)
0251 DO bi=myBxLo(myThid),myBxHi(myThid)
0252 DO j=1-OLy,sNy+OLy
0253 DO i=1-OLx,sNx+OLx
8377b8ee87 Mart*0254 UICENM1(i,j,bi,bj)=UICE(i,j,bi,bj)
0255 VICENM1(i,j,bi,bj)=VICE(i,j,bi,bj)
45315406aa Mart*0256 UICEB(i,j,bi,bj)=UICE(i,j,bi,bj)
0257 VICEB(i,j,bi,bj)=VICE(i,j,bi,bj)
809c36b928 Patr*0258 ENDDO
0259 ENDDO
0260 ENDDO
0261 ENDDO
0262
09510da3bb Dimi*0263
7109a141b2 Patr*0264
0265
0266 CALL LSR( 1, myThid )
0267
0268
09510da3bb Dimi*0269
0270
0271 DO bj=myByLo(myThid),myByHi(myThid)
0272 DO bi=myBxLo(myThid),myBxHi(myThid)
0273 DO j=1-OLy,sNy+OLy
0274 DO i=1-OLx,sNx+OLx
8377b8ee87 Mart*0275 UICE(i,j,bi,bj)=HALF*(UICE(i,j,bi,bj)+UICENM1(i,j,bi,bj))
0276 VICE(i,j,bi,bj)=HALF*(VICE(i,j,bi,bj)+VICENM1(i,j,bi,bj))
45315406aa Mart*0277 UICEB(i,j,bi,bj)=UICE(i,j,bi,bj)
0278 VICEB(i,j,bi,bj)=VICE(i,j,bi,bj)
809c36b928 Patr*0279 ENDDO
0280 ENDDO
0281 ENDDO
0282 ENDDO
0283
09510da3bb Dimi*0284
7109a141b2 Patr*0285 CALL LSR( 2, myThid )
809c36b928 Patr*0286
3f5db9535e Dimi*0287
baa476eeba Dimi*0288
809c36b928 Patr*0289 ENDIF
0290
f9fa432bd6 Mart*0291 #ifdef ALLOW_DIAGNOSTICS
0292 IF ( useDiagnostics ) THEN
0293 CALL DIAGNOSTICS_FILL(zeta ,'SIzeta ',0,1 ,0,1,1,myThid)
0294 CALL DIAGNOSTICS_FILL(eta ,'SIeta ',0,1 ,0,1,1,myThid)
0295 CALL DIAGNOSTICS_FILL(press ,'SIpress ',0,1 ,0,1,1,myThid)
0296 ENDIF
5d6433c292 Jean*0297 #endif /* ALLOW_DIAGNOSTICS */
f9fa432bd6 Mart*0298
809c36b928 Patr*0299
53092bcb42 Mart*0300 CALL OSTRES ( COR_ICE, myThid )
809c36b928 Patr*0301
d37c75ccbc Mart*0302 #ifdef SEAICE_ALLOW_CLIPVELS
0303 IF ( SEAICEuseDYNAMICS .AND. SEAICE_clipVelocities) THEN
7109a141b2 Patr*0304 #ifdef ALLOW_AUTODIFF_TAMC
0305
0306
0307 #endif /* ALLOW_AUTODIFF_TAMC */
809c36b928 Patr*0308
0309
0310
0311 DO bj=myByLo(myThid),myByHi(myThid)
0312 DO bi=myBxLo(myThid),myBxHi(myThid)
0313 DO j=1-OLy,sNy+OLy
0314 DO i=1-OLx,sNx+OLx
0315 #ifdef SEAICE_DEBUG
0316
0317
0318
0319
772590b63c Mart*0320
0321
6060ec2938 Dimi*0322 #endif /* SEAICE_DEBUG */
772590b63c Mart*0323 UICE(i,j,bi,bj)=min(UICE(i,j,bi,bj),0.40 _d +00)
0324 VICE(i,j,bi,bj)=min(VICE(i,j,bi,bj),0.40 _d +00)
7109a141b2 Patr*0325 ENDDO
0326 ENDDO
0327 ENDDO
0328 ENDDO
0329 #ifdef ALLOW_AUTODIFF_TAMC
0330
0331
0332 #endif /* ALLOW_AUTODIFF_TAMC */
0333 DO bj=myByLo(myThid),myByHi(myThid)
0334 DO bi=myBxLo(myThid),myBxHi(myThid)
0335 DO j=1-OLy,sNy+OLy
0336 DO i=1-OLx,sNx+OLx
772590b63c Mart*0337 UICE(i,j,bi,bj)=max(UICE(i,j,bi,bj),-0.40 _d +00)
0338 VICE(i,j,bi,bj)=max(VICE(i,j,bi,bj),-0.40 _d +00)
809c36b928 Patr*0339 ENDDO
0340 ENDDO
0341 ENDDO
0342 ENDDO
0343
0344 ENDIF
d37c75ccbc Mart*0345 #endif /* SEAICE_ALLOW_CLIPVELS */
45315406aa Mart*0346 #endif /* SEAICE_BGRID_DYNAMICS */
809c36b928 Patr*0347
0348 RETURN
0349 END