File indexing completed on 2024-10-18 05:11:23 UTC
view on githubraw file Latest commit 5bb179dd on 2024-10-17 18:00:27 UTC
53092bcb42 Mart*0001 #include "SEAICE_OPTIONS.h"
772b2ed80e Gael*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
53092bcb42 Mart*0005
91e72625af Jean*0006
0007
0008
53092bcb42 Mart*0009 SUBROUTINE SEAICE_DYNSOLVER( myTime, myIter, myThid )
91e72625af Jean*0010
45315406aa Mart*0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
91e72625af Jean*0021
0022
53092bcb42 Mart*0023 IMPLICIT NONE
0024
0025 #include "SIZE.h"
0026 #include "EEPARAMS.h"
0027 #include "PARAMS.h"
0028 #include "GRID.h"
8468e0a1f9 Jean*0029 #include "SURFACE.h"
53092bcb42 Mart*0030 #include "DYNVARS.h"
0031 #include "FFIELDS.h"
03c669d1ab Jean*0032 #include "SEAICE_SIZE.h"
53092bcb42 Mart*0033 #include "SEAICE_PARAMS.h"
03c669d1ab Jean*0034 #include "SEAICE.h"
53092bcb42 Mart*0035
0036 #ifdef ALLOW_AUTODIFF_TAMC
0037 # include "tamc.h"
0038 #endif
0039
45315406aa Mart*0040
53092bcb42 Mart*0041
91e72625af Jean*0042
0043
0044
53092bcb42 Mart*0045 _RL myTime
0046 INTEGER myIter
0047 INTEGER myThid
0048
91e72625af Jean*0049
0050 LOGICAL DIFFERENT_MULTIPLE
0051 EXTERNAL DIFFERENT_MULTIPLE
45315406aa Mart*0052 #if ( defined ALLOW_DIAGNOSTICS && defined SEAICE_CGRID )
5fe78992ba Mart*0053 LOGICAL DIAGNOSTICS_IS_ON
0054 EXTERNAL DIAGNOSTICS_IS_ON
45315406aa Mart*0055 #endif
91e72625af Jean*0056
0057
53092bcb42 Mart*0058
17bd6b9422 jm-c 0059
0060
7abe6d1375 Mart*0061 INTEGER i, j, bi, bj
45315406aa Mart*0062 #ifdef SEAICE_CGRID
8377b8ee87 Mart*0063 # ifndef ALLOW_AUTODIFF
17bd6b9422 jm-c 0064 _RL mask_uice, mask_vice
8377b8ee87 Mart*0065 # endif
0066
0067 _RL phiSurf(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0068 #endif
0069
0070
0071 _RL TAUX (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0072 _RL TAUY (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
45315406aa Mart*0073 #if ( defined ALLOW_DIAGNOSTICS && defined SEAICE_CGRID )
5fe78992ba Mart*0074 # ifdef ALLOW_AUTODIFF
0075 _RL strDivX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0076 _RL strDivY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0077 # endif /* ALLOW_AUTODIFF */
0078 _RL sig1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0079 _RL sig2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0080 _RL sig12 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0081 _RL sigp, sigm, sigTmp, recip_prs
99da6b3183 Jean*0082 _RL areaW, areaS, COSWAT
0083 _RS SINWAT
5fe78992ba Mart*0084 INTEGER kSrf
0085 LOGICAL diag_SIsigma_isOn, diag_SIshear_isOn
0086 LOGICAL diag_SIenpi_isOn, diag_SIenpot_isOn
0087 LOGICAL diag_SIpRfric_isOn, diag_SIpSfric_isOn
45315406aa Mart*0088 #endif
0089
17bd6b9422 jm-c 0090
fb1912d055 Patr*0091 DO bj=myByLo(myThid),myByHi(myThid)
0092 DO bi=myBxLo(myThid),myBxHi(myThid)
5fe78992ba Mart*0093 DO j=1-OLy,sNy+OLy
0094 DO i=1-OLx,sNx+OLx
45315406aa Mart*0095 #if ( defined ALLOW_AUTODIFF && defined SEAICE_CGRID )
8377b8ee87 Mart*0096
0097
8e32c48b8f Mart*0098 PRESS0 (i,j,bi,bj) = SEAICE_strength*HEFF(i,j,bi,bj)
ba6cfc5714 Mart*0099 & *EXP(-SEAICE_cStar*(ONE-AREA(i,j,bi,bj)))
8e32c48b8f Mart*0100 SEAICE_zMax(i,j,bi,bj) = SEAICE_zetaMaxFac*PRESS0(i,j,bi,bj)
0101 SEAICE_zMin(i,j,bi,bj) = SEAICE_zetaMin
0102 PRESS0 (i,j,bi,bj) = PRESS0(i,j,bi,bj)*HEFFM(i,j,bi,bj)
5fe78992ba Mart*0103 # ifdef SEAICE_ALLOW_FREEDRIFT
72c7f62b0e Patr*0104 uice_fd(i,j,bi,bj)= 0. _d 0
0105 vice_fd(i,j,bi,bj)= 0. _d 0
5fe78992ba Mart*0106 # endif
45315406aa Mart*0107 #if ( defined ALLOW_DIAGNOSTICS && defined SEAICE_CGRID )
5fe78992ba Mart*0108 strDivX(i,j,bi,bj)= 0. _d 0
0109 strDivY(i,j,bi,bj)= 0. _d 0
0110 # endif
45315406aa Mart*0111 #endif /* ALLOW_AUTODIFF and SEAICE_CGRID */
8377b8ee87 Mart*0112
0113
0114 TAUX(i,j,bi,bj) = 0. _d 0
0115 TAUY(i,j,bi,bj) = 0. _d 0
fb1912d055 Patr*0116 ENDDO
0117 ENDDO
0118 ENDDO
0119 ENDDO
45315406aa Mart*0120 #ifdef ALLOW_AUTODIFF_TAMC
c20cddf271 Patr*0121
0122
0123
0124
45315406aa Mart*0125 #endif /* ALLOW_AUTODIFF_TAMC */
8377b8ee87 Mart*0126
0127
0128
0129 CALL SEAICE_GET_DYNFORCING (
0130 I uIce, vIce, AREA, SIMaskU, SIMaskV,
0131 O TAUX, TAUY,
0132 I myTime, myIter, myThid )
fb1912d055 Patr*0133
45315406aa Mart*0134 #ifdef SEAICE_CGRID
8377b8ee87 Mart*0135 IF ( SEAICEuseDYNAMICS .AND.
02aabb8fe5 Dimi*0136 & DIFFERENT_MULTIPLE(SEAICE_deltaTdyn,myTime,SEAICE_deltaTtherm)
0137 & ) THEN
53092bcb42 Mart*0138
8377b8ee87 Mart*0139 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_ALLOW_EVP)
8e32c48b8f Mart*0140
0141
8377b8ee87 Mart*0142 #endif /* ALLOW_AUTODIFF_TAMC and SEAICE_ALLOW_EVP */
36feb88151 Patr*0143
53092bcb42 Mart*0144
8377b8ee87 Mart*0145 DO bj=myByLo(myThid),myByHi(myThid)
0146 DO bi=myBxLo(myThid),myBxHi(myThid)
79022779f5 Mart*0147 DO j=1-OLy+1,sNy+OLy
0148 DO i=1-OLx+1,sNx+OLx
8377b8ee87 Mart*0149 seaiceMassC(i,j,bi,bj)=SEAICE_rhoIce*HEFF(i,j,bi,bj)
0150 seaiceMassU(i,j,bi,bj)=SEAICE_rhoIce*HALF*(
0151 & HEFF(i,j,bi,bj) + HEFF(i-1,j ,bi,bj) )
0152 seaiceMassV(i,j,bi,bj)=SEAICE_rhoIce*HALF*(
0153 & HEFF(i,j,bi,bj) + HEFF(i ,j-1,bi,bj) )
79022779f5 Mart*0154 ENDDO
0155 ENDDO
8377b8ee87 Mart*0156 IF ( SEAICEaddSnowMass ) THEN
0157 DO j=1-OLy+1,sNy+OLy
0158 DO i=1-OLx+1,sNx+OLx
0159 seaiceMassC(i,j,bi,bj)=seaiceMassC(i,j,bi,bj)
0160 & + SEAICE_rhoSnow*HSNOW(i,j,bi,bj)
0161 seaiceMassU(i,j,bi,bj)=seaiceMassU(i,j,bi,bj)
0162 & + SEAICE_rhoSnow*HALF*(
0163 & HSNOW(i,j,bi,bj) + HSNOW(i-1,j ,bi,bj) )
0164
0165 seaiceMassV(i,j,bi,bj)=seaiceMassV(i,j,bi,bj)
0166 & + SEAICE_rhoSnow*HALF*(
0167 & HSNOW(i,j,bi,bj) + HSNOW(i ,j-1,bi,bj) )
0168 ENDDO
0169 ENDDO
0170 ENDIF
0171 ENDDO
53092bcb42 Mart*0172 ENDDO
0173
45315406aa Mart*0174 # ifndef ALLOW_AUTODIFF
8377b8ee87 Mart*0175 IF ( SEAICE_maskRHS ) THEN
de5b48fa34 Mart*0176
0177
8377b8ee87 Mart*0178 DO bj=myByLo(myThid),myByHi(myThid)
0179 DO bi=myBxLo(myThid),myBxHi(myThid)
0180 DO j=1-OLy+1,sNy+OLy
0181 DO i=1-OLx+1,sNx+OLx
0182 seaiceMaskU(i,j,bi,bj)=AREA(i,j,bi,bj)+AREA(i-1,j,bi,bj)
0183 mask_uice=HEFFM(i,j,bi,bj)+HEFFM(i-1,j ,bi,bj)
0184 IF ( (seaiceMaskU(i,j,bi,bj) .GT. 0. _d 0) .AND.
0185 & (mask_uice .GT. 1.5 _d 0) ) THEN
0186 seaiceMaskU(i,j,bi,bj) = 1. _d 0
0187 ELSE
0188 seaiceMaskU(i,j,bi,bj) = 0. _d 0
0189 ENDIF
0190 seaiceMaskV(i,j,bi,bj)=AREA(i,j,bi,bj)+AREA(i,j-1,bi,bj)
0191 mask_vice=HEFFM(i,j,bi,bj)+HEFFM(i ,j-1,bi,bj)
0192 IF ( (seaiceMaskV(i,j,bi,bj) .GT. 0. _d 0) .AND.
0193 & (mask_vice .GT. 1.5 _d 0) ) THEN
0194 seaiceMaskV(i,j,bi,bj) = 1. _d 0
0195 ELSE
0196 seaiceMaskV(i,j,bi,bj) = 0. _d 0
0197 ENDIF
0198 ENDDO
7abe6d1375 Mart*0199 ENDDO
0200 ENDDO
0201 ENDDO
8377b8ee87 Mart*0202 CALL EXCH_UV_XY_RL( seaiceMaskU, seaiceMaskV, .FALSE., myThid )
0203 ENDIF
45315406aa Mart*0204 # endif /* ndef ALLOW_AUTODIFF */
7abe6d1375 Mart*0205
53092bcb42 Mart*0206
0207
0dfb864288 Mart*0208
45315406aa Mart*0209 # if (defined ALLOW_AUTODIFF && defined SEAICE_ALLOW_EVP)
8377b8ee87 Mart*0210 DO bj=myByLo(myThid),myByHi(myThid)
0211 DO bi=myBxLo(myThid),myBxHi(myThid)
0212 DO j=1-OLy,sNy+OLy
0213 DO i=1-OLx,sNx+OLx
0214 stressDivergenceX(i,j,bi,bj) = 0. _d 0
0215 stressDivergenceY(i,j,bi,bj) = 0. _d 0
0216 ENDDO
484317af64 Mart*0217 ENDDO
0218 ENDDO
0219 ENDDO
45315406aa Mart*0220 # endif
53092bcb42 Mart*0221
8377b8ee87 Mart*0222 DO bj=myByLo(myThid),myByHi(myThid)
0223 DO bi=myBxLo(myThid),myBxHi(myThid)
8468e0a1f9 Jean*0224
0225
8377b8ee87 Mart*0226 IF ( usingPCoords ) THEN
03c669d1ab Jean*0227 DO j=1-OLy,sNy+OLy
0228 DO i=1-OLx,sNx+OLx
8377b8ee87 Mart*0229 phiSurf(i,j) = phiHydLow(i,j,bi,bj)
8468e0a1f9 Jean*0230 ENDDO
0231 ENDDO
0320e25227 Mart*0232 ELSE
03c669d1ab Jean*0233 DO j=1-OLy,sNy+OLy
0234 DO i=1-OLx,sNx+OLx
8377b8ee87 Mart*0235 phiSurf(i,j) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
8468e0a1f9 Jean*0236 ENDDO
0237 ENDDO
0320e25227 Mart*0238 ENDIF
45315406aa Mart*0239 # ifdef ATMOSPHERIC_LOADING
8377b8ee87 Mart*0240
0241
0242 IF ( usingZCoords ) THEN
0243 IF ( useRealFreshWaterFlux ) THEN
0244 DO j=1-OLy,sNy+OLy
0245 DO i=1-OLx,sNx+OLx
0246 phiSurf(i,j) = phiSurf(i,j)
0247 & + ( pload(i,j,bi,bj)
0248 & +sIceLoad(i,j,bi,bj)*gravity*sIceLoadFac
0249 & )*recip_rhoConst
0250 ENDDO
0251 ENDDO
0252 ELSE
0253 DO j=1-OLy,sNy+OLy
0254 DO i=1-OLx,sNx+OLx
0255 phiSurf(i,j) = phiSurf(i,j)
0256 & + pload(i,j,bi,bj)*recip_rhoConst
0257 ENDDO
0258 ENDDO
0259 ENDIF
0260
0320e25227 Mart*0261
0262
8377b8ee87 Mart*0263 ENDIF
45315406aa Mart*0264 # endif /* ATMOSPHERIC_LOADING */
21936d7dea Gael*0265
8377b8ee87 Mart*0266 IF ( SEAICEscaleSurfStress ) THEN
0267 DO j=1-OLy+1,sNy+OLy
0268 DO i=1-OLx+1,sNx+OLx
0269 FORCEX0(i,j,bi,bj)=TAUX(i,j,bi,bj)
0270 & * 0.5 _d 0*(AREA(i,j,bi,bj)+AREA(i-1,j,bi,bj))
0271 FORCEY0(i,j,bi,bj)=TAUY(i,j,bi,bj)
0272 & * 0.5 _d 0*(AREA(i,j,bi,bj)+AREA(i,j-1,bi,bj))
0273 ENDDO
70e078b38a Mart*0274 ENDDO
8377b8ee87 Mart*0275 ELSE
0276 DO j=1-OLy+1,sNy+OLy
0277 DO i=1-OLx+1,sNx+OLx
0278 FORCEX0(i,j,bi,bj)=TAUX(i,j,bi,bj)
0279 FORCEY0(i,j,bi,bj)=TAUY(i,j,bi,bj)
0280 ENDDO
70e078b38a Mart*0281 ENDDO
8377b8ee87 Mart*0282 ENDIF
21936d7dea Gael*0283
8377b8ee87 Mart*0284 IF ( SEAICEuseTILT ) THEN
0285 DO j=1-OLy+1,sNy+OLy
0286 DO i=1-OLx+1,sNx+OLx
21936d7dea Gael*0287
8377b8ee87 Mart*0288 FORCEX0(i,j,bi,bj)=FORCEX0(i,j,bi,bj)
0289 & -seaiceMassU(i,j,bi,bj)*_recip_dxC(i,j,bi,bj)
0290 & *( phiSurf(i,j)-phiSurf(i-1,j) )
0291 FORCEY0(i,j,bi,bj)=FORCEY0(i,j,bi,bj)
0292 & -seaiceMassV(i,j,bi,bj)* _recip_dyC(i,j,bi,bj)
0293 & *( phiSurf(i,j)-phiSurf(i,j-1) )
0294 ENDDO
0295 ENDDO
0296 ENDIF
000ae6c470 Mart*0297
8377b8ee87 Mart*0298 CALL SEAICE_CALC_ICE_STRENGTH( bi, bj, myTime, myIter, myThid )
0c32bd3cb0 Mart*0299
8377b8ee87 Mart*0300 ENDDO
53092bcb42 Mart*0301 ENDDO
0302
45315406aa Mart*0303 # ifdef SEAICE_ALLOW_FREEDRIFT
2c255e54a7 Jean*0304 IF ( SEAICEuseFREEDRIFT .OR. SEAICEuseEVP
0305 & .OR. LSR_mixIniGuess.EQ.0 ) THEN
0306 CALL SEAICE_FREEDRIFT( myTime, myIter, myThid )
0307 ENDIF
0308 IF ( SEAICEuseFREEDRIFT ) THEN
0309 DO bj=myByLo(myThid),myByHi(myThid)
0310 DO bi=myBxLo(myThid),myBxHi(myThid)
0311 DO j=1-OLy,sNy+OLy
0312 DO i=1-OLx,sNx+OLx
0313 uIce(i,j,bi,bj) = uIce_fd(i,j,bi,bj)
0314 vIce(i,j,bi,bj) = vIce_fd(i,j,bi,bj)
0315 stressDivergenceX(i,j,bi,bj) = 0. _d 0
0316 stressDivergenceY(i,j,bi,bj) = 0. _d 0
0317 ENDDO
0318 ENDDO
0319 ENDDO
0320 ENDDO
0321 ENDIF
45315406aa Mart*0322 # endif /* SEAICE_ALLOW_FREEDRIFT */
2c255e54a7 Jean*0323
45315406aa Mart*0324 # ifdef ALLOW_OBCS
91e72625af Jean*0325 IF ( useOBCS ) THEN
0326 CALL OBCS_APPLY_UVICE( uIce, vIce, myThid )
0327 ENDIF
45315406aa Mart*0328 # endif
91e72625af Jean*0329
45315406aa Mart*0330 # ifdef SEAICE_ALLOW_EVP
0331 # ifdef ALLOW_AUTODIFF_TAMC
c20cddf271 Patr*0332
0333
0334
0335
45315406aa Mart*0336 # endif /* ALLOW_AUTODIFF_TAMC */
6e2f4e58fa Mart*0337 IF ( SEAICEuseEVP ) THEN
b0fd37e69b Mart*0338
6e2f4e58fa Mart*0339 CALL SEAICE_EVP( myTime, myIter, myThid )
2c255e54a7 Jean*0340 ENDIF
45315406aa Mart*0341 # endif /* SEAICE_ALLOW_EVP */
2c255e54a7 Jean*0342
c8739d4898 Mart*0343 IF ( SEAICEuseLSR ) THEN
10811105fa Mart*0344
c8739d4898 Mart*0345 CALL SEAICE_LSR( myTime, myIter, myThid )
0346 ENDIF
0347
45315406aa Mart*0348 # ifdef SEAICE_ALLOW_KRYLOV
0349 # ifdef ALLOW_AUTODIFF
10811105fa Mart*0350 STOP 'Adjoint does not work with Picard-Krylov solver.'
45315406aa Mart*0351 # else
10811105fa Mart*0352 IF ( SEAICEuseKrylov ) THEN
0353
0354 CALL SEAICE_KRYLOV( myTime, myIter, myThid )
0355 ENDIF
45315406aa Mart*0356 # endif /* ALLOW_AUTODIFF */
0357 # endif /* SEAICE_ALLOW_KRYLOV */
10811105fa Mart*0358
45315406aa Mart*0359 # ifdef SEAICE_ALLOW_JFNK
0360 # ifdef ALLOW_AUTODIFF
10811105fa Mart*0361 STOP 'Adjoint does not work with JFNK solver.'
45315406aa Mart*0362 # else
10811105fa Mart*0363 IF ( SEAICEuseJFNK ) THEN
b0fd37e69b Mart*0364
e89e650bb4 Mart*0365 CALL SEAICE_JFNK( myTime, myIter, myThid )
0366 ENDIF
45315406aa Mart*0367 # endif /* ALLOW_AUTODIFF */
0368 # endif /* SEAICE_ALLOW_JFNK */
e89e650bb4 Mart*0369
8377b8ee87 Mart*0370
53092bcb42 Mart*0371 ENDIF
45315406aa Mart*0372 #endif /* SEAICE_CGRID */
53092bcb42 Mart*0373
210ee8461e jm-c 0374
0375 IF ( SEAICEupdateOceanStress ) THEN
8377b8ee87 Mart*0376 #ifdef ALLOW_AUTODIFF_TAMC
0377
45315406aa Mart*0378 # ifdef SEAICE_CGRID
8377b8ee87 Mart*0379
0380
45315406aa Mart*0381 # endif
8377b8ee87 Mart*0382 #endif /* ALLOW_AUTODIFF_TAMC */
210ee8461e jm-c 0383 CALL SEAICE_OCEAN_STRESS (
0384 I TAUX, TAUY, myTime, myIter, myThid )
0385 ENDIF
53092bcb42 Mart*0386
45315406aa Mart*0387 #ifdef SEAICE_ALLOW_CLIPVELS
7abe6d1375 Mart*0388 IF ( SEAICEuseDYNAMICS .AND. SEAICE_clipVelocities) THEN
8377b8ee87 Mart*0389 # ifdef ALLOW_AUTODIFF_TAMC
95c72ef3a1 Patr*0390
0391
8377b8ee87 Mart*0392 # endif /* ALLOW_AUTODIFF_TAMC */
7abe6d1375 Mart*0393
0394
0395
0396 DO bj=myByLo(myThid),myByHi(myThid)
0397 DO bi=myBxLo(myThid),myBxHi(myThid)
0398 DO j=1-OLy,sNy+OLy
0399 DO i=1-OLx,sNx+OLx
772590b63c Mart*0400 uIce(i,j,bi,bj)=
0401 & MAX(MIN(uIce(i,j,bi,bj),0.40 _d +00),-0.40 _d +00)
0402 vIce(i,j,bi,bj)=
0403 & MAX(MIN(vIce(i,j,bi,bj),0.40 _d +00),-0.40 _d +00)
7abe6d1375 Mart*0404 ENDDO
0405 ENDDO
0406 ENDDO
0407 ENDDO
0408 ENDIF
45315406aa Mart*0409 #endif /* SEAICE_ALLOW_CLIPVELS */
f0d90fb111 Jean*0410
45315406aa Mart*0411 #if ( defined ALLOW_DIAGNOSTICS && defined SEAICE_CGRID )
5fe78992ba Mart*0412
0413 IF ( useDiagnostics .AND. SEAICEuseDYNAMICS ) THEN
0414 CALL DIAGNOSTICS_FILL(zeta ,'SIzeta ',0,1,0,1,1,myThid)
0415 CALL DIAGNOSTICS_FILL(eta ,'SIeta ',0,1,0,1,1,myThid)
0416 CALL DIAGNOSTICS_FILL(press ,'SIpress ',0,1,0,1,1,myThid)
0417 CALL DIAGNOSTICS_FILL(deltaC ,'SIdelta ',0,1,0,1,1,myThid)
5bb179ddc2 Mart*0418 # ifdef SEAICE_ALLOW_SIDEDRAG
0419
0420 IF ( DIAGNOSTICS_IS_ON('SIlatDgU',myThid) ) THEN
0421 DO bj = myByLo(myThid), myByHi(myThid)
0422 DO bi = myBxLo(myThid), myBxHi(myThid)
0423
0424 DO j=1,sNy
0425 DO i=1,sNx+1
0426 sig1(i,j) = sideDragU(i,j,bi,bj)*uIce(i,j,bi,bj)
0427 ENDDO
0428 ENDDO
0429 CALL DIAGNOSTICS_FILL(sig1,'SIlatDgU',0,1,2,bi,bj,myThid)
0430 ENDDO
0431 ENDDO
0432 ENDIF
0433 IF ( DIAGNOSTICS_IS_ON('SIlatDgV',myThid) ) THEN
0434 DO bj = myByLo(myThid), myByHi(myThid)
0435 DO bi = myBxLo(myThid), myBxHi(myThid)
0436
0437 DO j=1,sNy+1
0438 DO i=1,sNx
0439 sig1(i,j) = sideDragV(i,j,bi,bj)*vIce(i,j,bi,bj)
0440 ENDDO
0441 ENDDO
0442 CALL DIAGNOSTICS_FILL(sig1,'SIlatDgV',0,1,2,bi,bj,myThid)
0443 ENDDO
0444 ENDDO
0445 ENDIF
0446 # endif /* SEAICE_ALLOW_SIDEDRAG */
0447
5fe78992ba Mart*0448 IF ( DIAGNOSTICS_IS_ON('SItensil',myThid) ) THEN
0449 DO bj = myByLo(myThid), myByHi(myThid)
0450 DO bi = myBxLo(myThid), myBxHi(myThid)
0451
0452 DO j=1,sNy
0453 DO i=1,sNx
0454 IF ( tensileStrFac(i,j,bi,bj) .EQ. oneRL ) THEN
0455
0456
0457
0458
0459 sig1(i,j) = press0(i,j,bi,bj)
0460 ELSE
0461
0462
0463 sig1(i,j) = tensileStrFac(i,j,bi,bj)
0464 & *press(i,j,bi,bj)/(1. _d 0 - tensileStrFac(i,j,bi,bj))
0465 ENDIF
0466 ENDDO
0467 ENDDO
0468 CALL DIAGNOSTICS_FILL(sig1,'SItensil',0,1,2,bi,bj,myThid)
0469 ENDDO
0470 ENDDO
0471 ENDIF
0472
0473
0474 diag_SIsigma_isOn = DIAGNOSTICS_IS_ON('SIsig1 ',myThid)
0475 & .OR. DIAGNOSTICS_IS_ON('SIsig2 ',myThid)
0476 diag_SIshear_isOn = DIAGNOSTICS_IS_ON('SIshear ',myThid)
0477 diag_SIenpi_isOn = DIAGNOSTICS_IS_ON('SIenpi ',myThid)
0478 diag_SIenpot_isOn = DIAGNOSTICS_IS_ON('SIenpot ',myThid)
0479 diag_SIpRfric_isOn = DIAGNOSTICS_IS_ON('SIpRfric',myThid)
0480 diag_SIpSfric_isOn = DIAGNOSTICS_IS_ON('SIpSfric',myThid)
0481 IF ( diag_SIsigma_isOn .OR. diag_SIshear_isOn .OR.
0482 & diag_SIenpi_isOn .OR. diag_SIenpot_isOn .OR.
0483 & diag_SIpRfric_isOn .OR. diag_SIpSfric_isOn ) THEN
0484 CALL SEAICE_CALC_STRAINRATES(
0485 I uIce, vIce,
0486 O e11, e22, e12,
0487 I 0, myTime, myIter, myThid )
0488
0489
0490
8e32c48b8f Mart*0491
0492
5fe78992ba Mart*0493
0494
0495 ENDIF
0496
0497 DO bj = myByLo(myThid), myByHi(myThid)
0498 DO bi = myBxLo(myThid), myBxHi(myThid)
0499
0500
0501
0502 IF ( diag_SIsigma_isOn ) THEN
8377b8ee87 Mart*0503 # ifdef SEAICE_ALLOW_EVP
5fe78992ba Mart*0504
0505
0506 IF ( SEAICEuseEVP ) THEN
0507
0508
0509
0510 DO j=1,sNy
0511 DO i=1,sNx
0512 sigp = seaice_sigma1(i,j,bi,bj)
0513 sigm = seaice_sigma2(i,j,bi,bj)
0514 sig12(i,j) = 0.25 _d 0 *
0515 & ( seaice_sigma12(i ,j ,bi,bj)
0516 & + seaice_sigma12(i+1,j ,bi,bj)
0517 & + seaice_sigma12(i+1,j+1,bi,bj)
0518 & + seaice_sigma12(i ,j+1,bi,bj) )
0519 sigTmp = SQRT( sigm*sigm + 4. _d 0*sig12(i,j)*sig12(i,j) )
0520 recip_prs = 0. _d 0
0521 IF ( press0(i,j,bi,bj) .GT. 1. _d -13 )
0522 & recip_prs = 1. _d 0 / press0(i,j,bi,bj)
0523 sig1(i,j) = 0.5 _d 0*(sigp + sigTmp)*recip_prs
0524 sig2(i,j) = 0.5 _d 0*(sigp - sigTmp)*recip_prs
0525 ENDDO
0526 ENDDO
0527 ELSE
8377b8ee87 Mart*0528 # else
5fe78992ba Mart*0529 IF ( .TRUE. ) THEN
8377b8ee87 Mart*0530 # endif /* SEAICE_ALLOW_EVP */
5fe78992ba Mart*0531 CALL SEAICE_CALC_STRESS(
0532 I e11, e22, e12, press, zeta, eta, etaZ,
0533 O sig1, sig2, sig12,
0534 I bi, bj, myTime, myIter, myThid )
0535 DO j=1,sNy
0536 DO i=1,sNx
0537 sigp = sig1(i,j) + sig2(i,j)
0538 sigm = sig1(i,j) - sig2(i,j)
0539
0540
0541
0542
0543
0544
0545
0546
0547 sigTmp = 2. _d 0 * eta(i,j,bi,bj) * 0.25 _d 0 *
0548 & (e12(i,j,bi,bj) + e12(i+1,j,bi,bj)
0549 & +e12(i,j+1,bi,bj)+e12(i+1,j+1,bi,bj))
0550 sigTmp = SQRT( sigm*sigm + 4. _d 0*sigTmp*sigTmp )
0551 recip_prs = 0. _d 0
0552 IF ( press0(i,j,bi,bj) .GT. 1. _d -13 )
0553 & recip_prs = 1. _d 0 / press0(i,j,bi,bj)
0554 sig1(i,j) = 0.5 _d 0*(sigp + sigTmp)*recip_prs
0555 sig2(i,j) = 0.5 _d 0*(sigp - sigTmp)*recip_prs
0556 ENDDO
0557 ENDDO
0558 ENDIF
0559 CALL DIAGNOSTICS_FILL(sig1,'SIsig1 ',0,1,2,bi,bj,myThid)
0560 CALL DIAGNOSTICS_FILL(sig2,'SIsig2 ',0,1,2,bi,bj,myThid)
0561 ENDIF
0562
0563 IF ( diag_SIshear_isOn ) THEN
0564 DO j=1,sNy
0565 DO i=1,sNx
0566 sigm = e11(i,j,bi,bj) - e22(i,j,bi,bj)
0567 sigTmp =
0568 & ( e12(i ,j ,bi,bj)**2 + e12(i+1,j ,bi,bj)**2
0569 & + e12(i+1,j+1,bi,bj)**2 + e12(i ,j+1,bi,bj)**2 )
0570
0571
8377b8ee87 Mart*0572 sig1(i,j) = SQRT(sigm*sigm + sigTmp)
5fe78992ba Mart*0573 ENDDO
0574 ENDDO
0575 CALL DIAGNOSTICS_FILL(sig1,'SIshear ',0,1,2,bi,bj,myThid)
0576 ENDIF
0577
0578
0579
0580 IF ( diag_SIenpi_isOn ) THEN
0581
0582
0583
0584 IF ( .NOT. SEAICEuseFREEDRIFT )
0585 & CALL SEAICE_CALC_STRESSDIV(
0586 I e11, e22, e12, press, zeta, eta, etaZ,
0587 # ifdef ALLOW_AUTODIFF
0588 O strDivX, strDivY,
0589 # else /* not ALLOW_AUTODIFF */
0590 O stressDivergenceX, stressDivergenceY,
0591 # endif /* ALLOW_AUTODIFF */
0592 I bi, bj, myTime, myIter, myThid )
0593 DO j=1,sNy+1
0594 DO i=1,sNx+1
0595 # ifdef ALLOW_AUTODIFF
0596 sig1(i,j) = uIce(i,j,bi,bj)*strDivX(i,j,bi,bj)
0597 sig2(i,j) = vIce(i,j,bi,bj)*strDivY(i,j,bi,bj)
0598 # else /* not ALLOW_AUTODIFF */
0599 sig1(i,j) = uIce(i,j,bi,bj)*stressDivergenceX(i,j,bi,bj)
0600 sig2(i,j) = vIce(i,j,bi,bj)*stressDivergenceY(i,j,bi,bj)
0601 # endif /* ALLOW_AUTODIFF */
0602 ENDDO
0603 ENDDO
0604
0605 DO j=1,sNy
0606 DO i=1,sNx
0607 sig12(i,j)= 0.5 _d 0 * ( sig1(i,j) + sig1(i+1,j)
0608 & + sig2(i,j) + sig2(i,j+1) )
0609 ENDDO
0610 ENDDO
0611 CALL DIAGNOSTICS_FILL(sig12,'SIenpi ',0,1,2,bi,bj,myThid)
0612 ENDIF
0613 IF ( diag_SIenpot_isOn ) THEN
0614 DO j=1,sNy
0615 DO i=1,sNx
0616 sig1(i,j) = 0.5 _d 0 * press0(i,j,bi,bj) *
0617 & ( e11(i,j,bi,bj) + e22(i,j,bi,bj) )
0618 ENDDO
0619 ENDDO
0620 CALL DIAGNOSTICS_FILL(sig1,'SIenpot ',0,1,2,bi,bj,myThid)
0621 ENDIF
0622 IF ( diag_SIpRfric_isOn ) THEN
0623 DO j=1,sNy
0624 DO i=1,sNx
0625 sig1(i,j) = - zeta(i,j,bi,bj)
0626 & * ( e11(i,j,bi,bj) + e22(i,j,bi,bj) )
0627 & * ( e11(i,j,bi,bj) + e22(i,j,bi,bj) )
0628 ENDDO
0629 ENDDO
0630 CALL DIAGNOSTICS_FILL(sig1,'SIpRfric',0,1,2,bi,bj,myThid)
0631 ENDIF
0632 IF ( diag_SIpSfric_isOn ) THEN
0633 DO j=1,sNy
0634 DO i=1,sNx
0635 sig1(i,j) = - eta(i,j,bi,bj)
0636 & * ( (e11(i,j,bi,bj) - e22(i,j,bi,bj))**2 +
0637 & ( e12(i ,j ,bi,bj)**2 + e12(i+1,j ,bi,bj)**2
0638 & + e12(i+1,j+1,bi,bj)**2 + e12(i ,j+1,bi,bj)**2 )
0639 & )
0640 ENDDO
0641 ENDDO
0642 CALL DIAGNOSTICS_FILL(sig1,'SIpSfric',0,1,2,bi,bj,myThid)
0643 ENDIF
0644 IF ( DIAGNOSTICS_IS_ON('SIenpa ',myThid) ) THEN
0645 DO j=1,sNy+1
0646 DO i=1,sNx+1
0647 areaW = 0.5 _d 0 * (AREA(i,j,bi,bj) + AREA(i-1,j,bi,bj))
0648 & * SEAICEstressFactor
0649 areaS = 0.5 _d 0 * (AREA(i,j,bi,bj) + AREA(i,j-1,bi,bj))
0650 & * SEAICEstressFactor
0651 sig1(i,j) = TAUX(i,j,bi,bj)*areaW * uIce(i,j,bi,bj)
0652 sig2(i,j) = TAUY(i,j,bi,bj)*areaS * vIce(i,j,bi,bj)
0653 ENDDO
0654 ENDDO
0655
0656 DO j=1,sNy
0657 DO i=1,sNx
0658 sig12(i,j)= 0.5 _d 0 * ( sig1(i,j) + sig1(i+1,j)
0659 & + sig2(i,j) + sig2(i,j+1) )
0660 ENDDO
0661 ENDDO
0662 CALL DIAGNOSTICS_FILL(sig12,'SIenpa ',0,1,2,bi,bj,myThid)
0663 ENDIF
0664 IF ( DIAGNOSTICS_IS_ON('SIenpw ',myThid) ) THEN
0665
0666 kSrf = 1
0667
0668 SINWAT=SIN(SEAICE_waterTurnAngle*deg2rad)
0669 COSWAT=COS(SEAICE_waterTurnAngle*deg2rad)
0670 DO j=1,sNy+1
0671 DO i=1,sNx+1
0672 areaW = 0.5 _d 0 * (AREA(i,j,bi,bj) + AREA(i-1,j,bi,bj))
0673 & * SEAICEstressFactor
0674 areaS = 0.5 _d 0 * (AREA(i,j,bi,bj) + AREA(i,j-1,bi,bj))
0675 & * SEAICEstressFactor
0676 sig1(i,j) = areaW *
0677 & HALF*( DWATN(i,j,bi,bj)+DWATN(i-1,j,bi,bj) )*
0678 & COSWAT *
0679 & ( uIce(i,j,bi,bj)-uVel(i,j,kSrf,bi,bj) )
0680 & - SIGN(SINWAT, _fCori(i,j,bi,bj)) * 0.5 _d 0 *
0681 & ( DWATN(i ,j,bi,bj) *
0682 & 0.5 _d 0*(vIce(i ,j ,bi,bj)-vVel(i ,j ,kSrf,bi,bj)
0683 & +vIce(i ,j+1,bi,bj)-vVel(i ,j+1,kSrf,bi,bj))
0684 & + DWATN(i-1,j,bi,bj) *
0685 & 0.5 _d 0*(vIce(i-1,j ,bi,bj)-vVel(i-1,j ,kSrf,bi,bj)
0686 & +vIce(i-1,j+1,bi,bj)-vVel(i-1,j+1,kSrf,bi,bj))
0687 & )
0688 sig1(i,j) = sig1(i,j) * uIce(i,j,bi,bj)
0689 sig2(i,j) = areaS *
0690 & HALF*( DWATN(i,j,bi,bj)+DWATN(i,j-1,bi,bj) )*
0691 & COSWAT *
0692 & ( vIce(i,j,bi,bj)-vVel(i,j,kSrf,bi,bj) )
0693 & + SIGN(SINWAT, _fCori(i,j,bi,bj)) * 0.5 _d 0 *
0694 & ( DWATN(i,j ,bi,bj) *
0695 & 0.5 _d 0*(uIce(i ,j ,bi,bj)-uVel(i ,j ,kSrf,bi,bj)
0696 & +uIce(i+1,j ,bi,bj)-uVel(i+1,j ,kSrf,bi,bj))
0697 & + DWATN(i,j-1,bi,bj) *
0698 & 0.5 _d 0*(uIce(i ,j-1,bi,bj)-uVel(i ,j-1,kSrf,bi,bj)
0699 & +uIce(i+1,j-1,bi,bj)-uVel(i+1,j-1,kSrf,bi,bj))
0700 & )
0701 sig2(i,j) = sig2(i,j) * vIce(i,j,bi,bj)
0702 ENDDO
0703 ENDDO
0704
0705 DO j=1,sNy
0706 DO i=1,sNx
0707 sig12(i,j)= - 0.5 _d 0 * ( sig1(i,j) + sig1(i+1,j)
0708 & + sig2(i,j) + sig2(i,j+1) )
0709 ENDDO
0710 ENDDO
0711 CALL DIAGNOSTICS_FILL(sig12,'SIenpw ',0,1,2,bi,bj,myThid)
0712 ENDIF
0713 IF ( SEAICEuseTilt
0714 & .AND. DIAGNOSTICS_IS_ON('SIenpg ',myThid) ) THEN
0715 DO j=1-OLy+1,sNy+OLy
0716 DO i=1-OLx+1,sNx+OLx
0717 sig1(i,j)=
0718 & - seaiceMassU(i,j,bi,bj)*_recip_dxC(i,j,bi,bj)
0719 & *( phiSurf(i,j)-phiSurf(i-1,j) ) * uIce(i,j,bi,bj)
0720 sig2(i,j)=
0721 & - seaiceMassV(i,j,bi,bj)* _recip_dyC(i,j,bi,bj)
0722 & *( phiSurf(i,j)-phiSurf(i,j-1) ) * vIce(i,j,bi,bj)
0723 ENDDO
0724 ENDDO
0725
0726 DO j=1,sNy
0727 DO i=1,sNx
0728 sig12(i,j) = 0.5 _d 0 * ( sig1(i,j) + sig1(i+1,j)
0729 & + sig2(i,j) + sig2(i,j+1) )
0730 ENDDO
0731 ENDDO
0732 CALL DIAGNOSTICS_FILL(sig12,'SIenpg ',0,1,2,bi,bj,myThid)
0733 ENDIF
0734
0735 ENDDO
0736 ENDDO
45315406aa Mart*0737
5fe78992ba Mart*0738 ENDIF
45315406aa Mart*0739 #endif /* ALLOW_DIAGNOSTICS and SEAICE_CGRID */
5fe78992ba Mart*0740
53092bcb42 Mart*0741 RETURN
0742 END