File indexing completed on 2026-05-05 05:09:04 UTC
view on githubraw file Latest commit 3f0f10fc on 2026-05-04 14:55:37 UTC
53092bcb42 Mart*0001 #include "SEAICE_OPTIONS.h"
fec75090d3 Jean*0002 #ifdef ALLOW_OBCS
0003 # include "OBCS_OPTIONS.h"
0004 #else
0005 # define OBCS_UVICE_OLD
0006 #endif
772b2ed80e Gael*0007 #ifdef ALLOW_AUTODIFF
0008 # include "AUTODIFF_OPTIONS.h"
0009 #endif
53092bcb42 Mart*0010
efcb5efb58 Jean*0011
0012
0013
0014
5fb12930f9 Mart*0015
bfe6f7447e Mart*0016
0017
5fb12930f9 Mart*0018
0019
efcb5efb58 Jean*0020
86fa82a64d Jean*0021
e7ae128053 Jean*0022
86fa82a64d Jean*0023
bb3037b865 Gael*0024 SUBROUTINE SEAICE_LSR( myTime, myIter, myThid )
86fa82a64d Jean*0025
0026
0027
0028
0029
0030
0031
0032
0033
efcb5efb58 Jean*0034
86fa82a64d Jean*0035
0036
0037
efcb5efb58 Jean*0038
86fa82a64d Jean*0039
0040
0041
589eca759f Mart*0042 IMPLICIT NONE
0043
0044
0045 #include "SIZE.h"
0046 #include "EEPARAMS.h"
0047 #include "PARAMS.h"
0048 #include "DYNVARS.h"
0049 #include "GRID.h"
9b4636ff01 Patr*0050 #include "SEAICE_SIZE.h"
589eca759f Mart*0051 #include "SEAICE_PARAMS.h"
3f0f10fc37 Mart*0052 #include "SEAICE_GRID.h"
03c669d1ab Jean*0053 #include "SEAICE.h"
589eca759f Mart*0054
0055 #ifdef ALLOW_AUTODIFF_TAMC
0056 # include "tamc.h"
0057 #endif
0058
86fa82a64d Jean*0059
589eca759f Mart*0060
86fa82a64d Jean*0061
0062
0063
589eca759f Mart*0064 _RL myTime
0065 INTEGER myIter
0066 INTEGER myThid
86fa82a64d Jean*0067
589eca759f Mart*0068
0069 #ifdef SEAICE_CGRID
7b7a25aa58 Jean*0070
0071 LOGICAL DIFFERENT_MULTIPLE
0072 EXTERNAL DIFFERENT_MULTIPLE
589eca759f Mart*0073
86fa82a64d Jean*0074
589eca759f Mart*0075
86fa82a64d Jean*0076
589eca759f Mart*0077
4a08d54d3a Mart*0078 INTEGER ipass
5fb12930f9 Mart*0079 INTEGER i, j, m, bi, bj
0080 INTEGER iMin, iMax, jMin, jMax
79df32c3f1 Mart*0081 INTEGER ICOUNT1, ICOUNT2, linearIterLoc, nonLinIterLoc
486cba1d02 Mart*0082 INTEGER kSrf
7b7a25aa58 Jean*0083 LOGICAL doIterate4u, doIterate4v
143d9ce879 Dami*0084 LOGICAL doNonLinLoop
86fa82a64d Jean*0085 CHARACTER*(MAX_LEN_MBUF) msgBuf
589eca759f Mart*0086
143d9ce879 Dami*0087 #ifdef ALLOW_DIAGNOSTICS
0088 LOGICAL DIAGNOSTICS_IS_ON
0089 EXTERNAL DIAGNOSTICS_IS_ON
0090 _RL RTmp (1:sNx,1:sNy)
0091 #endif /* ALLOW_DIAGNOSTICS */
0092
e45202e340 Mart*0093 _RL WFAU, WFAV, WFAU2, WFAV2
5fb12930f9 Mart*0094 _RL S1, S2, S1A, S2A
e232688b80 Mart*0095 _RL recip_deltaT
589eca759f Mart*0096
143d9ce879 Dami*0097 #ifdef SEAICE_ALLOW_LSR_FLEX
0098 _RL residIni, residIniNonLin
0099 _RL LSRflexFac, LSR_ERRORfu, LSR_ERRORfv
0100 _RL residkm1, residkm2
0101 #endif /* SEAICE_ALLOW_LSR_FLEX */
0102
589eca759f Mart*0103
03c669d1ab Jean*0104 _RL AU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0105 _RL BU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0106 _RL CU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0107 _RL AV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0108 _RL BV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0109 _RL CV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2d6335c1f7 Jean*0110
03c669d1ab Jean*0111 _RL rhsU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0112 _RL rhsV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2d6335c1f7 Jean*0113 #ifdef SEAICE_GLOBAL_3DIAG_SOLVER
0114
0115 _RL rhsUx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0116 _RL rhsVy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0117 INTEGER iSubIter
b2e217c119 Jean*0118 INTEGER errCode
2d6335c1f7 Jean*0119 #endif
7b7a25aa58 Jean*0120
03c669d1ab Jean*0121 _RL uRt1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0122 _RL uRt2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
7b7a25aa58 Jean*0123
03c669d1ab Jean*0124 _RL vRt1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0125 _RL vRt2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
589eca759f Mart*0126
03c669d1ab Jean*0127 _RL etaPlusZeta (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0128 _RL zetaMinusEta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
df1dac8b7b Mart*0129
0130 _RL dragSym (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
bfe6f7447e Mart*0131
0132 _RL uIceC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0133 _RL vIceC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
589eca759f Mart*0134
03c669d1ab Jean*0135 _RL uTmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0136 _RL vTmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
4a08d54d3a Mart*0137
0138 _RL fxTmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0139 _RL fyTmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
70e078b38a Mart*0140
733ca03edd Mart*0141 _RL areaW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0142 _RL areaS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
8ce59fd29e Mart*0143 #ifdef SEAICE_ALLOW_MOM_ADVECTION
0144
0145 _RL gUmom(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0146 _RL gVmom(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0147 #endif /* SEAICE_ALLOW_MOM_ADVECTION */
d24acf3cfc Jean*0148 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0149
0150
0151
0152 INTEGER nlkey, lnkey, tkey
d24acf3cfc Jean*0153 #endif
35fda33b05 Jean*0154 _RL COSWAT
0155 _RS SINWAT
589eca759f Mart*0156 _RL UERR
63a26f3b3e Mart*0157 #ifdef SEAICE_ALLOW_CHECK_LSR_CONVERGENCE
0158 _RL resnorm, EKnorm, counter
0159 #endif /* SEAICE_ALLOW_CHECK_LSR_CONVERGENCE */
efcb5efb58 Jean*0160 LOGICAL printResidual
0161 _RL residUini, residVini, residUend, residVend
0162 #ifdef SEAICE_ALLOW_FREEDRIFT
03c669d1ab Jean*0163 _RL uRes (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0164 _RL vRes (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
efcb5efb58 Jean*0165 _RL errIni, errFD, errSum
0166 _RL residU_fd, residV_fd
0167 _RL residUmix, residVmix
0168 #endif /* SEAICE_ALLOW_FREEDRIFT */
0c560a7486 Mart*0169 _RL areaMinLoc
efcb5efb58 Jean*0170
0171
0172
0173 printResidual = debugLevel.GE.debLevA
0174 & .AND. DIFFERENT_MULTIPLE( SEAICE_monFreq, myTime, deltaTClock )
589eca759f Mart*0175
a68248c150 Mart*0176
0177 jMin = 1 - SEAICE_OLy
0178 jMax = sNy + SEAICE_OLy
0179 iMin = 1 - SEAICE_OLx
0180 iMax = sNx + SEAICE_OLx
cbf501ab81 Jean*0181
79df32c3f1 Mart*0182 linearIterLoc = SEAICElinearIterMax
0183 nonLinIterLoc = SEAICEnonLinIterMax
0184 IF ( SEAICEusePicardAsPrecon ) THEN
0185 linearIterLoc = SEAICEpreconlinIter
0186 nonLinIterLoc = SEAICEpreconNL_Iter
0187 ENDIF
143d9ce879 Dami*0188
e232688b80 Mart*0189 recip_deltaT = 1. _d 0 / SEAICE_deltaTdyn
5fb12930f9 Mart*0190
143d9ce879 Dami*0191
0192 IF ( usingPCoords ) THEN
0193 kSrf = Nr
0194 ELSE
0195 kSrf = 1
0196 ENDIF
0197
0198 SINWAT=SIN(SEAICE_waterTurnAngle*deg2rad)
0199 COSWAT=COS(SEAICE_waterTurnAngle*deg2rad)
0200
8377b8ee87 Mart*0201 #ifdef ALLOW_AUTODIFF
d976cd8bb3 Patr*0202
0203 DO bj=myByLo(myThid),myByHi(myThid)
0204 DO bi=myBxLo(myThid),myBxHi(myThid)
0205 DO j=1-OLy,sNy+OLy
0206 DO i=1-OLx,sNx+OLx
a16f976091 Mart*0207 deltaC (i,j,bi,bj) = 0. _d 0
0208 press (i,j,bi,bj) = 0. _d 0
7c0da9bbfa Mart*0209 zeta (i,j,bi,bj) = 0. _d 0
0fd6b2de1a Mart*0210 zetaZ (i,j,bi,bj) = 0. _d 0
7c0da9bbfa Mart*0211 eta (i,j,bi,bj) = 0. _d 0
0212 etaZ (i,j,bi,bj) = 0. _d 0
0213 uIceC (i,j,bi,bj) = 0. _d 0
0214 vIceC (i,j,bi,bj) = 0. _d 0
0215 uIceNm1(i,j,bi,bj) = 0. _d 0
0216 vIceNm1(i,j,bi,bj) = 0. _d 0
d976cd8bb3 Patr*0217 ENDDO
0218 ENDDO
0219 ENDDO
0220 ENDDO
0221 #endif
0222
70e078b38a Mart*0223
733ca03edd Mart*0224 DO bj=myByLo(myThid),myByHi(myThid)
0225 DO bi=myBxLo(myThid),myBxHi(myThid)
0226 DO j=1-OLy,sNy+OLy
0227 DO i=1-OLx,sNx+OLx
4a08d54d3a Mart*0228 areaW(i,j,bi,bj) = 1. _d 0
0229 areaS(i,j,bi,bj) = 1. _d 0
0230 ENDDO
733ca03edd Mart*0231 ENDDO
0c560a7486 Mart*0232 areaMinLoc = 0. _d 0
733ca03edd Mart*0233 IF ( SEAICEscaleSurfStress ) THEN
0c560a7486 Mart*0234 areaMinLoc = 1. _d -10
0235
4a08d54d3a Mart*0236 DO j=jMin,jMax
0237 DO i=iMin,iMax
0238 areaW(i,j,bi,bj) =
0239 & 0.5 _d 0*(AREA(i,j,bi,bj)+AREA(i-1,j,bi,bj))
0240 areaS(i,j,bi,bj) =
0241 & 0.5 _d 0*(AREA(i,j,bi,bj)+AREA(i,j-1,bi,bj))
733ca03edd Mart*0242 ENDDO
0243 ENDDO
0244 ENDIF
70e078b38a Mart*0245 ENDDO
0246 ENDDO
0247
4a08d54d3a Mart*0248 #ifdef ALLOW_AUTODIFF_TAMC
0249
0250
0251 #endif /* ALLOW_AUTODIFF_TAMC */
0252
0253
0254
0255
0256 DO bj=myByLo(myThid),myByHi(myThid)
0257 DO bi=myBxLo(myThid),myBxHi(myThid)
0258 DO j=1-OLy,sNy+OLy
0259 DO i=1-OLx,sNx+OLx
0260 uIceNm1(i,j,bi,bj) = uIce(i,j,bi,bj)
0261 vIceNm1(i,j,bi,bj) = vIce(i,j,bi,bj)
0262 fxTmp (i,j,bi,bj) = FORCEX0(i,j,bi,bj)
0263 & +seaiceMassU(i,j,bi,bj)*recip_deltaT
0264 & *uIceNm1(i,j,bi,bj)
0265 fyTmp (i,j,bi,bj) = FORCEY0(i,j,bi,bj)
0266 & +seaiceMassV(i,j,bi,bj)*recip_deltaT
0267 & *vIceNm1(i,j,bi,bj)
0268 ENDDO
0269 ENDDO
0270 ENDDO
0271 ENDDO
0d75a51072 Mart*0272
143d9ce879 Dami*0273 #ifdef SEAICE_ALLOW_LSR_FLEX
0274 IF ( SEAICEuseLSRflex ) THEN
0275 residkm1 = 1. _d 0
0276 residkm2 = 1. _d 0
0277 residIniNonLin = 1. _d 0
0278 ENDIF
0279 #endif /* SEAICE_ALLOW_LSR_FLEX */
0280
0281 doNonLinLoop = .TRUE.
0282
0283
0284
0285
0286
0287
0288
79df32c3f1 Mart*0289 DO ipass=1,nonLinIterLoc
9b4636ff01 Patr*0290
0291 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0292 nlkey = (ikey_dynamics-1)*MPSEUDOTIMESTEPS + ipass
9b4636ff01 Patr*0293 # ifdef SEAICE_ALLOW_FREEDRIFT
edb6656069 Mart*0294
0295
9b4636ff01 Patr*0296 # endif
edb6656069 Mart*0297
9b4636ff01 Patr*0298 #endif /* ALLOW_AUTODIFF_TAMC */
0299
143d9ce879 Dami*0300 IF ( doNonLinLoop ) THEN
bb3037b865 Gael*0301 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0302
0303
0304
0305
bb3037b865 Gael*0306 #endif /* ALLOW_AUTODIFF_TAMC */
0307
589eca759f Mart*0308
e45202e340 Mart*0309 WFAU=SEAICE_LSRrelaxU
0310 WFAV=SEAICE_LSRrelaxV
589eca759f Mart*0311 WFAU2=ZERO
0312 WFAV2=ZERO
7b7a25aa58 Jean*0313 S1 = 0.
0314 S2 = 0.
e45202e340 Mart*0315 S1A=0.80 _d 0
0316 S2A=0.80 _d 0
589eca759f Mart*0317
4a08d54d3a Mart*0318 DO bj=myByLo(myThid),myByHi(myThid)
0319 DO bi=myBxLo(myThid),myBxHi(myThid)
0320 IF ( ipass .EQ. 1 ) THEN
0321
a10601a61f Mart*0322 DO j=1-OLy,sNy+OLy
0323 DO i=1-OLx,sNx+OLx
4a08d54d3a Mart*0324 uIceC(i,j,bi,bj) = uIce(i,j,bi,bj)
0325 vIceC(i,j,bi,bj) = vIce(i,j,bi,bj)
a10601a61f Mart*0326 ENDDO
0327 ENDDO
4a08d54d3a Mart*0328 ELSEIF ( ipass .EQ. 2 .AND. SEAICEnonLinIterMax .LE. 2 ) THEN
0329
a10601a61f Mart*0330 DO j=1-OLy,sNy+OLy
0331 DO i=1-OLx,sNx+OLx
4a08d54d3a Mart*0332 uIce (i,j,bi,bj)=HALF*( uIce(i,j,bi,bj)+uIceNm1(i,j,bi,bj) )
0333 vIce (i,j,bi,bj)=HALF*( vIce(i,j,bi,bj)+vIceNm1(i,j,bi,bj) )
0334 uIceC(i,j,bi,bj)=uIce(i,j,bi,bj)
0335 vIceC(i,j,bi,bj)=vIce(i,j,bi,bj)
a10601a61f Mart*0336 ENDDO
0337 ENDDO
4a08d54d3a Mart*0338 ELSE
0339
0340
0341
de36f9bd7d Mart*0342 DO j=1-OLy,sNy+OLy
0343 DO i=1-OLx,sNx+OLx
4a08d54d3a Mart*0344
0345
0346
0347
0348 uIceC(i,j,bi,bj) = HALF*( uIce(i,j,bi,bj)+uIceC(i,j,bi,bj) )
0349 vIceC(i,j,bi,bj) = HALF*( vIce(i,j,bi,bj)+vIceC(i,j,bi,bj) )
de36f9bd7d Mart*0350 ENDDO
0351 ENDDO
4a08d54d3a Mart*0352 ENDIF
0353
de36f9bd7d Mart*0354 ENDDO
4a08d54d3a Mart*0355 ENDDO
a10601a61f Mart*0356
589eca759f Mart*0357 #ifdef ALLOW_AUTODIFF_TAMC
3e8bf7e743 Mart*0358
143d9ce879 Dami*0359
0360
3e8bf7e743 Mart*0361
edb6656069 Mart*0362
0363
0364
0365
589eca759f Mart*0366 #endif /* ALLOW_AUTODIFF_TAMC */
0367
0368 CALL SEAICE_CALC_STRAINRATES(
0369 I uIceC, vIceC,
0370 O e11, e22, e12,
3e8bf7e743 Mart*0371 I ipass, myTime, myIter, myThid )
589eca759f Mart*0372
0373 CALL SEAICE_CALC_VISCOSITIES(
8e32c48b8f Mart*0374 I e11, e22, e12, SEAICE_zMin, SEAICE_zMax, HEFFM, press0,
0375 I tensileStrFac,
0fd6b2de1a Mart*0376 O eta, etaZ, zeta, zetaZ, press, deltaC,
3e8bf7e743 Mart*0377 I ipass, myTime, myIter, myThid )
589eca759f Mart*0378
3f31c7d5de Mart*0379 CALL SEAICE_OCEANDRAG_COEFFS(
ec0d7df165 Mart*0380 I uIceC, vIceC, HEFFM,
3f31c7d5de Mart*0381 O DWATN,
3e8bf7e743 Mart*0382 I ipass, myTime, myIter, myThid )
df1dac8b7b Mart*0383
0384 #ifdef SEAICE_ALLOW_BOTTOMDRAG
d5254b4e3d Mart*0385 CALL SEAICE_BOTTOMDRAG_COEFFS(
ec0d7df165 Mart*0386 I uIceC, vIceC, HEFFM,
df1dac8b7b Mart*0387 #ifdef SEAICE_ITD
0388 I HEFFITD, AREAITD, AREA,
0389 #else
0390 I HEFF, AREA,
cbf501ab81 Jean*0391 #endif
df1dac8b7b Mart*0392 O CbotC,
0393 I ipass, myTime, myIter, myThid )
0394 #endif /* SEAICE_ALLOW_BOTTOMDRAG */
5bb179ddc2 Mart*0395
0396 #ifdef SEAICE_ALLOW_SIDEDRAG
0397 IF ( SEAICEsideDrag .NE. 0. _d 0 ) CALL SEAICE_SIDEDRAG_STRESS(
0398 I uIceC, vIceC, coastRoughU, coastRoughV, AREA,
0399 O sideDragU, sideDragV,
0400 I ipass, myTime, myIter, myThid )
0401 #ifdef ALLOW_AUTODIFF_TAMC
0402
0403
0404 #endif /* ALLOW_AUTODIFF_TAMC */
0405 #endif /* SEAICE_ALLOW_SIDEDRAG */
d681af2948 Mart*0406
0407
0408
0409 DO bj=myByLo(myThid),myByHi(myThid)
0410 DO bi=myBxLo(myThid),myBxHi(myThid)
4a08d54d3a Mart*0411 DO j=jMin-1,jMax
0412 DO i=iMin-1,iMax
0413 etaPlusZeta (i,j,bi,bj) = ETA (i,j,bi,bj)+ZETA(i,j,bi,bj)
0414 zetaMinusEta(i,j,bi,bj) = ZETA(i,j,bi,bj)-ETA (i,j,bi,bj)
d681af2948 Mart*0415 ENDDO
0416 ENDDO
4a08d54d3a Mart*0417 DO j=1-OLy,sNy+OLy
0418 DO i=1-OLx,sNx+OLx
0419 dragSym(i,j,bi,bj) = DWATN(i,j,bi,bj)*COSWAT
df1dac8b7b Mart*0420 #ifdef SEAICE_ALLOW_BOTTOMDRAG
4a08d54d3a Mart*0421 & +CbotC(i,j,bi,bj)
df1dac8b7b Mart*0422 #endif /* SEAICE_ALLOW_BOTTOMDRAG */
0423 ENDDO
0424 ENDDO
d681af2948 Mart*0425 ENDDO
0426 ENDDO
0427
0428
0429
0430
589eca759f Mart*0431 DO bj=myByLo(myThid),myByHi(myThid)
0432 DO bi=myBxLo(myThid),myBxHi(myThid)
4a08d54d3a Mart*0433 DO j=jMin,jMax
0434 DO i=iMin,iMax
efcb5efb58 Jean*0435
589eca759f Mart*0436
4a08d54d3a Mart*0437 FORCEX(i,j,bi,bj) = fxTmp(i,j,bi,bj)+
0438 & ( 0.5 _d 0 * ( DWATN(i,j,bi,bj)+DWATN(i-1,j,bi,bj) ) *
0439 & COSWAT * uVel(i,j,kSrf,bi,bj)
0440 & - SIGN(SINWAT, _fCori(i,j,bi,bj))* 0.5 _d 0 *
0441 & ( DWATN(i ,j,bi,bj) * 0.5 _d 0 *
0442 & (vVel(i ,j ,kSrf,bi,bj)-vIceC(i ,j ,bi,bj)
0443 & +vVel(i ,j+1,kSrf,bi,bj)-vIceC(i ,j+1,bi,bj))
0444 & + DWATN(i-1,j,bi,bj) * 0.5 _d 0 *
0445 & (vVel(i-1,j ,kSrf,bi,bj)-vIceC(i-1,j ,bi,bj)
0446 & +vVel(i-1,j+1,kSrf,bi,bj)-vIceC(i-1,j+1,bi,bj))
0447 & ) ) * areaW(i,j,bi,bj)
0448 FORCEY(i,j,bi,bj) = fyTmp(i,j,bi,bj)+
0449 & ( 0.5 _d 0 * ( DWATN(i,j,bi,bj)+DWATN(i,j-1,bi,bj) ) *
0450 & COSWAT * vVel(i,j,kSrf,bi,bj)
0451 & + SIGN(SINWAT, _fCori(i,j,bi,bj)) * 0.5 _d 0 *
0452 & ( DWATN(i,j ,bi,bj) * 0.5 _d 0 *
0453 & (uVel(i ,j ,kSrf,bi,bj)-uIceC(i ,j ,bi,bj)
0454 & +uVel(i+1,j ,kSrf,bi,bj)-uIceC(i+1,j ,bi,bj))
0455 & + DWATN(i,j-1,bi,bj) * 0.5 _d 0 *
0456 & (uVel(i ,j-1,kSrf,bi,bj)-uIceC(i ,j-1,bi,bj)
0457 & +uVel(i+1,j-1,kSrf,bi,bj)-uIceC(i+1,j-1,bi,bj))
0458 & ) ) * areaS(i,j,bi,bj)
589eca759f Mart*0459 ENDDO
0460 ENDDO
5fb12930f9 Mart*0461 DO j=jMin,jMax
0462 DO i=iMin,iMax
efcb5efb58 Jean*0463
4a08d54d3a Mart*0464 FORCEX(i,j,bi,bj) = FORCEX(i,j,bi,bj) + HALF*
0465 & ( seaiceMassC(i ,j,bi,bj) * _fCori(i ,j,bi,bj)
efcb5efb58 Jean*0466 & *0.5 _d 0*( vIceC( i ,j,bi,bj)+vIceC( i ,j+1,bi,bj) )
4a08d54d3a Mart*0467 & + seaiceMassC(i-1,j,bi,bj) * _fCori(i-1,j,bi,bj)
efcb5efb58 Jean*0468 & *0.5 _d 0*( vIceC(i-1,j,bi,bj)+vIceC(i-1,j+1,bi,bj) ) )
4a08d54d3a Mart*0469 FORCEY(i,j,bi,bj) = FORCEY(i,j,bi,bj) - HALF*
0470 & ( seaiceMassC(i,j ,bi,bj) * _fCori(i,j ,bi,bj)
efcb5efb58 Jean*0471 & *0.5 _d 0*( uIceC(i ,j ,bi,bj)+uIceC(i+1, j,bi,bj) )
4a08d54d3a Mart*0472 & + seaiceMassC(i,j-1,bi,bj) * _fCori(i,j-1,bi,bj)
efcb5efb58 Jean*0473 & *0.5 _d 0*( uIceC(i ,j-1,bi,bj)+uIceC(i+1,j-1,bi,bj) ) )
0474 ENDDO
0475 ENDDO
4a08d54d3a Mart*0476
5fb12930f9 Mart*0477 DO j=jMin,jMax
0478 DO i=iMin,iMax
4a08d54d3a Mart*0479 FORCEX(i,j,bi,bj) = FORCEX(i,j,bi,bj)*seaiceMaskU(i,j,bi,bj)
0480 FORCEY(i,j,bi,bj) = FORCEY(i,j,bi,bj)*seaiceMaskV(i,j,bi,bj)
589eca759f Mart*0481 ENDDO
0482 ENDDO
7b7a25aa58 Jean*0483
b7c2bb63b7 Mart*0484
0485
0486
bfe6f7447e Mart*0487 DO j=jMin,jMax
0488 DO i=iMin,iMax
4a08d54d3a Mart*0489 rhsU(i,j,bi,bj) = FORCEX(i,j,bi,bj)
3ff8c9e192 Jean*0490 ENDDO
0491 ENDDO
bfe6f7447e Mart*0492 CALL SEAICE_LSR_RHSU(
0fd6b2de1a Mart*0493 I zetaMinusEta, etaPlusZeta, etaZ, zetaZ, press,
cbf501ab81 Jean*0494 I uIceC, vIceC,
bfe6f7447e Mart*0495 U rhsU,
0496 I iMin, iMax, jMin, jMax, bi, bj, myThid )
b7c2bb63b7 Mart*0497
0498
0499
bfe6f7447e Mart*0500 DO j=jMin,jMax
0501 DO i=iMin,iMax
4a08d54d3a Mart*0502 rhsV(i,j,bi,bj) = FORCEY(i,j,bi,bj)
3ff8c9e192 Jean*0503 ENDDO
0504 ENDDO
bfe6f7447e Mart*0505 CALL SEAICE_LSR_RHSV(
0fd6b2de1a Mart*0506 I zetaMinusEta, etaPlusZeta, etaZ, zetaZ, press,
cbf501ab81 Jean*0507 I uIceC, vIceC,
bfe6f7447e Mart*0508 U rhsV,
0509 I iMin, iMax, jMin, jMax, bi, bj, myThid )
8ce59fd29e Mart*0510
0511 #ifdef SEAICE_ALLOW_MOM_ADVECTION
cbf501ab81 Jean*0512 IF ( SEAICEmomAdvection ) THEN
4a08d54d3a Mart*0513 DO j=1-OLy,sNy+OLy
0514 DO i=1-OLx,sNx+OLx
0515 gUmom(i,j) = 0. _d 0
0516 gVmom(i,j) = 0. _d 0
8ce59fd29e Mart*0517 ENDDO
0518 ENDDO
0519 CALL SEAICE_MOM_ADVECTION(
0520 I bi,bj,iMin,iMax,jMin,jMax,
0521 I uIceC, vIceC,
0522 O gUmom, gVmom,
0523 I myTime, myIter, myThid )
4a08d54d3a Mart*0524 DO j=jMin,jMax
0525 DO i=jMin,jMax
0526 rhsU(i,j,bi,bj) = rhsU(i,j,bi,bj) + gUmom(i,j)
0527 rhsV(i,j,bi,bj) = rhsV(i,j,bi,bj) + gVmom(i,j)
8ce59fd29e Mart*0528 ENDDO
0529 ENDDO
0530 ENDIF
0531 #endif /* SEAICE_ALLOW_MOM_ADVECTION */
b7c2bb63b7 Mart*0532 ENDDO
0533 ENDDO
d681af2948 Mart*0534
0535
0536
0537
0538
0539
0540
0541
cbf501ab81 Jean*0542 CALL SEAICE_LSR_CALC_COEFFS(
df1dac8b7b Mart*0543 I etaPlusZeta, zetaMinusEta, etaZ, zetaZ, dragSym,
d681af2948 Mart*0544 O AU, BU, CU, AV, BV, CV, uRt1, uRt2, vRt1, vRt2,
0545 I iMin, iMax, jMin, jMax, myTime, myIter, myThid )
589eca759f Mart*0546
5bb179ddc2 Mart*0547 #ifdef SEAICE_ALLOW_SIDEDRAG
0548 IF ( SEAICEsideDrag .NE. 0. _d 0 ) THEN
0549 DO bj=myByLo(myThid),myByHi(myThid)
0550 DO bi=myBxLo(myThid),myBxHi(myThid)
0551 DO j=jMin,jMax
0552 DO i=iMin,iMax
0553 BU(i,j,bi,bj) = BU(i,j,bi,bj)
0554 & + seaiceMaskU(i,j,bi,bj) * sideDragU(i,j,bi,bj)
0555 BV(i,j,bi,bj) = BV(i,j,bi,bj)
0556 & + seaiceMaskV(i,j,bi,bj) * sideDragV(i,j,bi,bj)
0557 ENDDO
0558 ENDDO
0559 ENDDO
0560 ENDDO
0561 ENDIF
0562 #endif /* SEAICE_ALLOW_SIDEDRAG */
0563
fec75090d3 Jean*0564 #ifndef OBCS_UVICE_OLD
b7c2bb63b7 Mart*0565
0566 DO bj=myByLo(myThid),myByHi(myThid)
0567 DO bi=myBxLo(myThid),myBxHi(myThid)
4a08d54d3a Mart*0568 DO j=jMin,jMax
0569 DO i=iMin,iMax
b7c2bb63b7 Mart*0570 IF ( maskInC(i,j,bi,bj)*maskInC(i-1,j,bi,bj) .EQ. 0. ) THEN
4a08d54d3a Mart*0571 AU(i,j,bi,bj) = ZERO
0572 BU(i,j,bi,bj) = ONE
0573 CU(i,j,bi,bj) = ZERO
0574 uRt1(i,j,bi,bj) = ZERO
0575 uRt2(i,j,bi,bj) = ZERO
0576 rhsU(i,j,bi,bj) = uIce(i,j,bi,bj)
b7c2bb63b7 Mart*0577 ENDIF
fec75090d3 Jean*0578 IF ( maskInC(i,j,bi,bj)*maskInC(i,j-1,bi,bj) .EQ. 0. ) THEN
4a08d54d3a Mart*0579 AV(i,j,bi,bj) = ZERO
0580 BV(i,j,bi,bj) = ONE
0581 CV(i,j,bi,bj) = ZERO
0582 vRt1(i,j,bi,bj) = ZERO
0583 vRt2(i,j,bi,bj) = ZERO
0584 rhsV(i,j,bi,bj) = vIce(i,j,bi,bj)
fec75090d3 Jean*0585 ENDIF
0586 ENDDO
0587 ENDDO
589eca759f Mart*0588 ENDDO
0589 ENDDO
b7c2bb63b7 Mart*0590 #endif /* OBCS_UVICE_OLD */
589eca759f Mart*0591
7b7a25aa58 Jean*0592
0593
589eca759f Mart*0594 #ifdef ALLOW_DEBUG
86fa82a64d Jean*0595 IF ( debugLevel .GE. debLevD ) THEN
0596 WRITE(msgBuf,'(A,I3,A)')
3e8bf7e743 Mart*0597 & 'Uice pre iter (SEAICE_LSR', MOD(ipass,1000), ')'
7b7a25aa58 Jean*0598 CALL DEBUG_STATS_RL( 1, UICE, msgBuf, myThid )
0599 WRITE(msgBuf,'(A,I3,A)')
3e8bf7e743 Mart*0600 & 'Vice pre iter (SEAICE_LSR', MOD(ipass,1000), ')'
86fa82a64d Jean*0601 CALL DEBUG_STATS_RL( 1, VICE, msgBuf, myThid )
589eca759f Mart*0602 ENDIF
0603 #endif /* ALLOW_DEBUG */
0604
efcb5efb58 Jean*0605
143d9ce879 Dami*0606 IF ( printResidual .OR. LSR_mixIniGuess.GE.1
0607 & .OR. SEAICEuseLSRflex )
0608 & CALL SEAICE_RESIDUAL(
d681af2948 Mart*0609 I rhsU, rhsV, uRt1, uRt2, vRt1, vRt2,
0610 I AU, BU, CU, AV, BV, CV, uIce, vIce,
0611 O residUini, residVini, uTmp, vTmp,
0612 I printResidual, myIter, myThid )
0613
efcb5efb58 Jean*0614 #ifdef SEAICE_ALLOW_FREEDRIFT
d681af2948 Mart*0615 IF ( printResidual .OR. LSR_mixIniGuess.GE.1 ) THEN
0616 IF ( LSR_mixIniGuess.GE.1 ) THEN
0617 DO bj=myByLo(myThid),myByHi(myThid)
0618 DO bi=myBxLo(myThid),myBxHi(myThid)
0619 DO j=jMin,jMax
0620 DO i=iMin,iMax
0621 uIce_fd(i,j,bi,bj) = FORCEX(i,j,bi,bj)
0622 & / ( 1. _d 0 - seaiceMaskU(i,j,bi,bj)
e232688b80 Mart*0623 & + seaiceMassU(i,j,bi,bj)*recip_deltaT
df1dac8b7b Mart*0624 & + HALF*( dragSym(i,j,bi,bj) + dragSym(i-1,j,bi,bj) )
0c560a7486 Mart*0625 & * MAX(areaW(i,j,bi,bj),areaMinLoc)
d681af2948 Mart*0626 & )
0627 vIce_fd(i,j,bi,bj) = FORCEY(i,j,bi,bj)
0628 & / ( 1. _d 0 - seaiceMaskV(i,j,bi,bj)
e232688b80 Mart*0629 & + seaiceMassV(i,j,bi,bj)*recip_deltaT
df1dac8b7b Mart*0630 & + HALF*( dragSym(i,j,bi,bj) + dragSym(i,j-1,bi,bj) )
0c560a7486 Mart*0631 & * MAX(areaS(i,j,bi,bj),areaMinLoc)
d681af2948 Mart*0632 & )
0633 ENDDO
0634 ENDDO
0635 ENDDO
0636 ENDDO
0637 CALL EXCH_UV_XY_RL( uIce_fd, vIce_fd, .TRUE., myThid )
0638 ENDIF
0639 IF ( LSR_mixIniGuess.GE.0 )
efcb5efb58 Jean*0640 & CALL SEAICE_RESIDUAL(
0641 I rhsU, rhsV, uRt1, uRt2, vRt1, vRt2,
0642 I AU, BU, CU, AV, BV, CV, uIce_fd, vIce_fd,
0643 O residU_fd, residV_fd, uRes, vRes,
0644 I printResidual, myIter, myThid )
0645 ENDIF
0646 IF ( LSR_mixIniGuess.GE.2 ) THEN
9b4636ff01 Patr*0647 # ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0648
0649
9b4636ff01 Patr*0650 # endif /* ALLOW_AUTODIFF_TAMC */
efcb5efb58 Jean*0651 DO bj=myByLo(myThid),myByHi(myThid)
0652 DO bi=myBxLo(myThid),myBxHi(myThid)
d681af2948 Mart*0653 DO j=jMin,jMax
0654 DO i=iMin,iMax
0655 errIni = uTmp(i,j,bi,bj)*uTmp(i,j,bi,bj)
0656 errFD = uRes(i,j,bi,bj)*uRes(i,j,bi,bj)
0657 IF ( LSR_mixIniGuess.GE.4 ) THEN
0658 errIni = errIni*errIni
0659 errFD = errFD *errFD
0660 ENDIF
0661 errSum = ( errIni + errFD )
0662 & *maskInC(i,j,bi,bj)*maskInC(i-1,j,bi,bj)
0663 IF ( errSum.GT.0. ) THEN
0664 uIce(i,j,bi,bj) = ( errFD *uIce(i,j,bi,bj)
0665 & + errIni*uIce_fd(i,j,bi,bj)
0666 & )/errSum
0667 ENDIF
0668 errIni = vTmp(i,j,bi,bj)*vTmp(i,j,bi,bj)
0669 errFD = vRes(i,j,bi,bj)*vRes(i,j,bi,bj)
0670 IF ( LSR_mixIniGuess.GE.4 ) THEN
0671 errIni = errIni*errIni
0672 errFD = errFD *errFD
0673 ENDIF
0674 errSum = ( errIni + errFD )
0675 & *maskInC(i,j,bi,bj)*maskInC(i,j-1,bi,bj)
0676 IF ( errSum.GT.0. ) THEN
0677 vIce(i,j,bi,bj) = ( errFD *vIce(i,j,bi,bj)
0678 & + errIni*vIce_fd(i,j,bi,bj)
0679 & )/errSum
0680 ENDIF
efcb5efb58 Jean*0681 ENDDO
d681af2948 Mart*0682 ENDDO
efcb5efb58 Jean*0683 ENDDO
0684 ENDDO
0685 CALL EXCH_UV_XY_RL( uIce, vIce, .TRUE., myThid )
dfc97bd020 Mart*0686 #ifndef ALLOW_AUTODIFF_TAMC
0e2f719d67 Mart*0687
0688
0689
efcb5efb58 Jean*0690 IF ( printResidual ) THEN
0691 CALL SEAICE_RESIDUAL(
0692 I rhsU, rhsV, uRt1, uRt2, vRt1, vRt2,
0693 I AU, BU, CU, AV, BV, CV, uIce, vIce,
0694 O residUmix, residVmix, uTmp, vTmp,
0695 I printResidual, myIter, myThid )
0696 ENDIF
dfc97bd020 Mart*0697 #endif /* ALLOW_AUTODIFF_TAMC */
efcb5efb58 Jean*0698 ENDIF
0699 #endif /* SEAICE_ALLOW_FREEDRIFT */
0700
0701
0702
589eca759f Mart*0703
0704
7b7a25aa58 Jean*0705 doIterate4u = .TRUE.
0706 doIterate4v = .TRUE.
589eca759f Mart*0707
0708
d681af2948 Mart*0709
cbf501ab81 Jean*0710
964a494b4b Mart*0711
0712
0e2f719d67 Mart*0713
964a494b4b Mart*0714
9b4636ff01 Patr*0715
0d75a51072 Mart*0716 ICOUNT1 = linearIterLoc
0717 ICOUNT2 = linearIterLoc
9b4636ff01 Patr*0718
143d9ce879 Dami*0719 #ifdef SEAICE_ALLOW_LSR_FLEX
0720
0721 ENDIF
0722
0723 IF ( SEAICEuseLSRflex ) THEN
0724
0725 IF ( residUini .EQ. 0. _d 0) THEN
0726 doIterate4u = .FALSE.
0727 ICOUNT1 = 0
0728 S1 = residUini
0729 ENDIF
0730 IF ( residVini .EQ. 0. _d 0) THEN
0731 doIterate4v = .FALSE.
0732 ICOUNT2 = 0
0733 S2 = residVini
0734 ENDIF
0735
0736 residIni = SQRT(residUini*residUini+residVini*residVini)
0737
0738
0739
0740 IF ( ipass .EQ. 1 ) residIniNonLin = residIni
0741
0742
0743 doNonLinLoop = doNonLinLoop .AND.( doIterate4u .OR. doIterate4v )
0744
0745 doNonLinLoop = doNonLinLoop .AND. .NOT.
0746 & ( ipass .GT. 2 .AND.
0747 & ( residIni .LT. SEAICEnonLinTol*residIniNonlin ) )
0748
0749
0750 IF ( residIni .EQ. 0. _d 0 ) residIni = 1. _d -20
0751
0752
0753
0754 LSRflexFac = 1. _d 0 / (1. _d 0 + ABS( LOG10(residIni) ) )
0755
0756
0757 LSRflexFac = MIN(LSRflexFac, 0.99 _d 0 )
0758
0759
0760
0761
0762
0763
0764 LSR_ERRORfu = residUini*LSRflexFac
0765 LSR_ERRORfv = residVini*LSRflexFac
0766
0767 IF ( printResidual ) THEN
0768 _BEGIN_MASTER( myThid )
0769 WRITE(standardMessageUnit,'(A,1X,I5,1X,F10.6,3(1X,E12.6))')
0770 & ' SEAICE_LSR: ipass, FLEX_FACTOR,'//
0771 & ' LSR_ERRORfu, LSR_ERRORfv, residIni =',
0772 & ipass, LSRflexFac, LSR_ERRORfu, LSR_ERRORfv, residIni
0773 _END_MASTER( myThid )
0774 ENDIF
0775
0776 ENDIF
0777
0778
0779 IF ( doNonLinLoop ) THEN
0780 #endif /* SEAICE_ALLOW_LSR_FLEX */
0781
0d75a51072 Mart*0782 DO m = 1, linearIterLoc
9b4636ff01 Patr*0783
0e2f719d67 Mart*0784 #ifdef ALLOW_AUTODIFF_TAMC
0785 # ifdef SEAICE_LSR_ADJOINT_ITER
edb6656069 Mart*0786 lnkey = (nlkey-1)*SOLV_MAX_FIXED + MIN(m,SOLV_MAX_FIXED)
0e2f719d67 Mart*0787 # else
edb6656069 Mart*0788 lnkey = nlkey
0e2f719d67 Mart*0789 # endif /* SEAICE_LSR_ADJOINT_ITER */
3e8bf7e743 Mart*0790
0791
edb6656069 Mart*0792
0793
0e2f719d67 Mart*0794 #endif /* ALLOW_AUTODIFF_TAMC */
9b4636ff01 Patr*0795
7b7a25aa58 Jean*0796 IF ( doIterate4u .OR. doIterate4v ) THEN
589eca759f Mart*0797
7b7a25aa58 Jean*0798 IF ( useCubedSphereExchange ) THEN
0799 doIterate4u = .TRUE.
0800 doIterate4v = .TRUE.
0801 ENDIF
589eca759f Mart*0802
9b4636ff01 Patr*0803 # ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0804
3e8bf7e743 Mart*0805
0806
0807
edb6656069 Mart*0808
9b4636ff01 Patr*0809 # endif /* ALLOW_AUTODIFF_TAMC */
0810
2d6335c1f7 Jean*0811 #ifdef SEAICE_GLOBAL_3DIAG_SOLVER
0812 IF ( SEAICEuseMultiTileSolver ) THEN
0813
0814 DO bj=myByLo(myThid),myByHi(myThid)
0815 DO bi=myBxLo(myThid),myBxHi(myThid)
0816 IF ( doIterate4u ) THEN
5fb12930f9 Mart*0817 DO j=jMin,jMax
0818 DO i=iMin,iMax
2d6335c1f7 Jean*0819 uTmp(i,j,bi,bj) = uIce(i,j,bi,bj)
0820 rhsUx(i,j,bi,bj) = ( rhsU(i,j,bi,bj)
0821 & + uRt1(i,j,bi,bj)*uIce(i,j-1,bi,bj)
0822 & + uRt2(i,j,bi,bj)*uIce(i,j+1,bi,bj)
0823 & )*seaiceMaskU(i,j,bi,bj)
0824 ENDDO
0825 ENDDO
0826 ENDIF
0827 IF ( doIterate4v ) THEN
5fb12930f9 Mart*0828 DO j=jMin,jMax
0829 DO i=iMin,iMax
2d6335c1f7 Jean*0830 vTmp(i,j,bi,bj) = vIce(i,j,bi,bj)
0831 rhsVy(i,j,bi,bj) = ( rhsV(i,j,bi,bj)
4a08d54d3a Mart*0832 & + vRt1(i,j,bi,bj)*vIce(i-1,j,bi,bj)
0833 & + vRt2(i,j,bi,bj)*vIce(i+1,j,bi,bj)
2d6335c1f7 Jean*0834 & )*seaiceMaskU(i,j,bi,bj)
0835 ENDDO
0836 ENDDO
0837 ENDIF
0838
0839 ENDDO
0840 ENDDO
0841
0d75a51072 Mart*0842 iSubIter = linearIterLoc*(ipass-1) + m
2d6335c1f7 Jean*0843 CALL SOLVE_UV_TRIDIAGO(
0844 I 1, OLx, doIterate4u, doIterate4v,
0845 I AU, BU, CU, rhsUx,
0846 I AV, BV, CV, rhsVy,
0847 O uIce, vIce, errCode,
0848 I iSubIter, myIter, myThid )
0849
0850 DO bj=myByLo(myThid),myByHi(myThid)
0851 DO bi=myBxLo(myThid),myBxHi(myThid)
0852 IF ( doIterate4u ) THEN
5fb12930f9 Mart*0853 DO j=jMin,jMax
0854 DO i=iMin,iMax
2d6335c1f7 Jean*0855 uIce(i,j,bi,bj) = uTmp(i,j,bi,bj)
0856 & + WFAU*( uIce(i,j,bi,bj)-uTmp(i,j,bi,bj) )
0857 ENDDO
0858 ENDDO
0859 ENDIF
0860 IF ( doIterate4v ) THEN
5fb12930f9 Mart*0861 DO j=jMin,jMax
0862 DO i=iMin,iMax
2d6335c1f7 Jean*0863 vIce(i,j,bi,bj) = vTmp(i,j,bi,bj)
0864 & + WFAV*( vIce(i,j,bi,bj)-vTmp(i,j,bi,bj) )
0865 ENDDO
0866 ENDDO
0867 ENDIF
0868
0869 ENDDO
0870 ENDDO
0871
0872 ELSE
0873 #endif /* SEAICE_GLOBAL_3DIAG_SOLVER */
0874
7b7a25aa58 Jean*0875 DO bj=myByLo(myThid),myByHi(myThid)
0876 DO bi=myBxLo(myThid),myBxHi(myThid)
0877
f4df908d9c Mart*0878 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0879 tkey = bi + (bj-1)*nSx + (lnkey-1)*nSx*nSy
0880
0881
f4df908d9c Mart*0882 #endif /* ALLOW_AUTODIFF_TAMC */
4a08d54d3a Mart*0883
3e8bf7e743 Mart*0884
8df0ccd026 Jean*0885 DO j=1-OLy,sNy+OLy
0886 DO i=1-OLx,sNx+OLx
4a08d54d3a Mart*0887 uTmp(i,j,bi,bj)=uIce(i,j,bi,bj)
0888 vTmp(i,j,bi,bj)=vIce(i,j,bi,bj)
8df0ccd026 Jean*0889 ENDDO
0890 ENDDO
0891
7b7a25aa58 Jean*0892 IF ( doIterate4u ) THEN
0893
5fb12930f9 Mart*0894 CALL SEAICE_LSR_TRIDIAGU(
8df0ccd026 Jean*0895 I AU, BU, CU, uRt1, uRt2, rhsU, uTmp, seaiceMaskU, WFAU,
5fb12930f9 Mart*0896 U uIce,
8d9be9cde5 Mart*0897 I iMin, iMax, jMin, jMax, bi, bj, myTime, myIter, myThid )
3ff8c9e192 Jean*0898 ENDIF
589eca759f Mart*0899
7b7a25aa58 Jean*0900 IF ( doIterate4v ) THEN
0901
5fb12930f9 Mart*0902 CALL SEAICE_LSR_TRIDIAGV(
cbf501ab81 Jean*0903 I AV, BV, CV, vRt1, vRt2, rhsV, vTmp, seaiceMaskV, WFAV,
5fb12930f9 Mart*0904 U vIce,
8d9be9cde5 Mart*0905 I iMin, iMax, jMin, jMax, bi, bj, myTime, myIter, myThid )
7b7a25aa58 Jean*0906 ENDIF
589eca759f Mart*0907
7b7a25aa58 Jean*0908
3ff8c9e192 Jean*0909 ENDDO
589eca759f Mart*0910 ENDDO
0911
2d6335c1f7 Jean*0912 #ifdef SEAICE_GLOBAL_3DIAG_SOLVER
0913 ENDIF
0914 #endif /* SEAICE_GLOBAL_3DIAG_SOLVER */
0915
143d9ce879 Dami*0916 #ifdef SEAICE_ALLOW_LSR_FLEX
0917 IF ( SEAICEuseLSRflex ) THEN
0918 IF ( MOD(m,SOLV_NCHECK) .EQ. 0
0919 & .AND. (doIterate4u.OR.doIterate4v) ) THEN
0920 CALL SEAICE_RESIDUAL(
0921 I rhsU, rhsV, uRt1, uRt2, vRt1, vRt2,
0922 I AU, BU, CU, AV, BV, CV, uIce, vIce,
0923 O S1, S2, uTmp, vTmp,
0924 I printResidual, myIter, myThid )
0925 IF( S1.LT.LSR_ERRORfu ) THEN
0926 ICOUNT1=m
0927 doIterate4u = .FALSE.
0928 ENDIF
0929 IF( S2.LT.LSR_ERRORfv ) THEN
0930 ICOUNT2=m
0931 doIterate4v = .FALSE.
0932 ENDIF
0933 ENDIF
0934 ELSE
0935 #endif
7b7a25aa58 Jean*0936 IF ( doIterate4u.AND.MOD(m,SOLV_NCHECK).EQ.0) THEN
0937 S1=ZERO
0938 DO bj=myByLo(myThid),myByHi(myThid)
0939 DO bi=myBxLo(myThid),myBxHi(myThid)
4a08d54d3a Mart*0940 DO j=1,sNy
0941 DO i=1,sNx
0942 UERR=(uIce(i,j,bi,bj)-uTmp(i,j,bi,bj))
0943 & * seaiceMaskU(i,j,bi,bj)
7b7a25aa58 Jean*0944 S1=MAX(ABS(UERR),S1)
0945 ENDDO
0946 ENDDO
3ff8c9e192 Jean*0947 ENDDO
0948 ENDDO
7b7a25aa58 Jean*0949 _GLOBAL_MAX_RL( S1, myThid )
0950
3e8bf7e743 Mart*0951
589eca759f Mart*0952
7b7a25aa58 Jean*0953 IF(m.GT.1.AND.S1.GT.S1A) WFAU=WFAU2
0954 S1A=S1
0955 IF(S1.LT.LSR_ERROR) THEN
0956 ICOUNT1=m
0957 doIterate4u = .FALSE.
0958 ENDIF
0959 ENDIF
589eca759f Mart*0960
7b7a25aa58 Jean*0961 IF ( doIterate4v.AND.MOD(m,SOLV_NCHECK).EQ.0) THEN
0962 S2=ZERO
0963 DO bj=myByLo(myThid),myByHi(myThid)
0964 DO bi=myBxLo(myThid),myBxHi(myThid)
4a08d54d3a Mart*0965 DO j=1,sNy
0966 DO i=1,sNx
0967 UERR=(vIce(i,j,bi,bj)-vTmp(i,j,bi,bj))
0968 & * seaiceMaskV(i,j,bi,bj)
7b7a25aa58 Jean*0969 S2=MAX(ABS(UERR),S2)
0970 ENDDO
0971 ENDDO
0972 ENDDO
0973 ENDDO
0974 _GLOBAL_MAX_RL( S2, myThid )
0975
0976 IF(m.GT.1.AND.S2.GT.S2A) WFAV=WFAV2
0977 S2A=S2
0978 IF(S2.LT.LSR_ERROR) THEN
0979 ICOUNT2=m
0980 doIterate4v = .FALSE.
0981 ENDIF
0982 ENDIF
143d9ce879 Dami*0983 #ifdef SEAICE_ALLOW_LSR_FLEX
0984 ENDIF
0985 #endif
7b7a25aa58 Jean*0986
0987 CALL EXCH_UV_XY_RL( uIce, vIce,.TRUE.,myThid)
0988
0989
0990 ENDIF
589eca759f Mart*0991 ENDDO
0992
0993
143d9ce879 Dami*0994 #ifdef SEAICE_ALLOW_LSR_FLEX
0995 IF ( SEAICEuseLSRflex ) THEN
0996 residkm2 = residkm1
0997 residkm1 = residIni
0998 ENDIF
0999 #endif /* SEAICE_ALLOW_LSR_FLEX */
1000
efcb5efb58 Jean*1001
1002
dfc97bd020 Mart*1003 #ifndef ALLOW_AUTODIFF_TAMC
0e2f719d67 Mart*1004
1005
1006
efcb5efb58 Jean*1007 IF ( printResidual ) THEN
1008
1009 CALL SEAICE_RESIDUAL(
1010 I rhsU, rhsV, uRt1, uRt2, vRt1, vRt2,
1011 I AU, BU, CU, AV, BV, CV, uIce, vIce,
1012 O residUend, residVend, uTmp, vTmp,
1013 I printResidual, myIter, myThid )
143d9ce879 Dami*1014
86fa82a64d Jean*1015 _BEGIN_MASTER( myThid )
c512e371cc drin*1016 WRITE(standardMessageUnit,'(A,1X,I9,1P3E16.8)')
e116529eb1 Mart*1017 & ' SEAICE_LSR: Residual Initial ipass,Uice,Vice=',
3e8bf7e743 Mart*1018 & ipass, residUini, residVini
efcb5efb58 Jean*1019 #ifdef SEAICE_ALLOW_FREEDRIFT
1020 IF ( LSR_mixIniGuess.GE.0 )
1021 & WRITE(standardMessageUnit,'(A,1P3E16.8)')
1022 & ' SEAICE_LSR: Residual FrDrift U_fd,V_fd=',
1023 & residU_fd, residV_fd
1024 IF ( LSR_mixIniGuess.GE.2 )
1025 & WRITE(standardMessageUnit,'(A,1P3E16.8)')
1026 & ' SEAICE_LSR: Residual Mix-ini Uice,Vice=',
1027 & residUmix, residVmix
1028 #endif /* SEAICE_ALLOW_FREEDRIFT */
c512e371cc drin*1029 WRITE(standardMessageUnit,'(A,I9,A,I9,1P2E16.8)')
3e8bf7e743 Mart*1030 & ' SEAICE_LSR (ipass=',ipass,') iters,dU,Resid=',
efcb5efb58 Jean*1031 & ICOUNT1, S1, residUend
c512e371cc drin*1032 WRITE(standardMessageUnit,'(A,I9,A,I9,1P2E16.8)')
3e8bf7e743 Mart*1033 & ' SEAICE_LSR (ipass=',ipass,') iters,dV,Resid=',
efcb5efb58 Jean*1034 & ICOUNT2, S2, residVend
86fa82a64d Jean*1035 _END_MASTER( myThid )
7b7a25aa58 Jean*1036 ENDIF
efcb5efb58 Jean*1037 #ifdef ALLOW_DEBUG
7b7a25aa58 Jean*1038 IF ( debugLevel .GE. debLevD ) THEN
1039 WRITE(msgBuf,'(A,I3,A)')
3e8bf7e743 Mart*1040 & 'Uice post iter (SEAICE_LSR', MOD(ipass,1000), ')'
7b7a25aa58 Jean*1041 CALL DEBUG_STATS_RL( 1, UICE, msgBuf, myThid )
1042 WRITE(msgBuf,'(A,I3,A)')
3e8bf7e743 Mart*1043 & 'Vice post iter (SEAICE_LSR', MOD(ipass,1000), ')'
7b7a25aa58 Jean*1044 CALL DEBUG_STATS_RL( 1, VICE, msgBuf, myThid )
589eca759f Mart*1045 ENDIF
1046 #endif /* ALLOW_DEBUG */
bc6ed4e27a Jean*1047 IF ( doIterate4u .OR. doIterate4v ) THEN
1048 WRITE(msgBuf,'(2A,I10,A,I4,A)') '** WARNING ** SEAICE_LSR ',
3e8bf7e743 Mart*1049 & '(it=', myIter, ',', ipass,') did not converge :'
bc6ed4e27a Jean*1050 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
1051 & SQUEEZE_RIGHT, myThid )
1052 WRITE(msgBuf,'(2(A,I6,0PF6.3,1PE14.6))')
1053 & ' nIt,wFU,dU=', ICOUNT1, WFAU, S1,
1054 & ' ; nIt,wFV,dV=', ICOUNT2, WFAV, S2
1055 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
1056 & SQUEEZE_RIGHT, myThid )
1057 ENDIF
dfc97bd020 Mart*1058 #endif /* ALLOW_AUTODIFF_TAMC */
589eca759f Mart*1059
1060
1061 DO bj=myByLo(myThid),myByHi(myThid)
1062 DO bi=myBxLo(myThid),myBxHi(myThid)
4a08d54d3a Mart*1063 DO j=1-OLy,sNy+OLy
1064 DO i=1-OLx,sNx+OLx
1065 uIce(i,j,bi,bj)=uIce(i,j,bi,bj)* seaiceMaskU(i,j,bi,bj)
1066 vIce(i,j,bi,bj)=vIce(i,j,bi,bj)* seaiceMaskV(i,j,bi,bj)
3ff8c9e192 Jean*1067 ENDDO
1068 ENDDO
589eca759f Mart*1069 ENDDO
1070 ENDDO
772590b63c Mart*1071
589eca759f Mart*1072
992ae64189 Mart*1073 #ifdef SEAICE_ALLOW_CHECK_LSR_CONVERGENCE
86fa82a64d Jean*1074 IF ( debugLevel .GE. debLevC ) THEN
992ae64189 Mart*1075 resnorm = 0. _d 0
1076 EKnorm = 0. _d 0
1077 counter = 0. _d 0
1078 DO bj=myByLo(myThid),myByHi(myThid)
1079 DO bi=myBxLo(myThid),myBxHi(myThid)
1080
1081 DO j=1,sNy
1082 DO i=1,sNx
1083 resnorm = resnorm + 0.5 _d 0 *
1084 & ( ( (uIceNm1(i,j,bi,bj)+uIceNm1(i+1,j,bi,bj))
1085 & - (uIce(i,j,bi,bj)+uIce(i+1,j,bi,bj)) )**2
1086 & + ( (vIceNm1(i,j,bi,bj)+vIceNm1(i,j+1,bi,bj))
1087 & - (vIce(i,j,bi,bj)+vIce(i,j+1,bi,bj)) )**2 )
8377b8ee87 Mart*1088 IF ( area(i,j,bi,bj) .GT. 0.5 _d 0 ) THEN
992ae64189 Mart*1089 EKnorm = EKnorm + 0.5 _d 0 * heff(i,j,bi,bj) *
1090 & ( ( (uIce(i,j,bi,bj)+uIce(i+1,j,bi,bj)) )**2
1091 & + ( (vIce(i,j,bi,bj)+vIce(i,j+1,bi,bj)) )**2 )
1092 counter = counter + 1. _d 0
1093 ENDIF
1094 ENDDO
1095 ENDDO
1096 ENDDO
1097 ENDDO
1098 _GLOBAL_SUM_RL( resnorm, myThid )
1099 _GLOBAL_SUM_RL( EKnorm, myThid )
1100 _GLOBAL_SUM_RL( counter, myThid )
8377b8ee87 Mart*1101 IF ( counter .GT. 0. _d 0 ) EKnorm = EKnorm/counter
86fa82a64d Jean*1102 _BEGIN_MASTER( myThid )
1103 WRITE(standardMessageUnit,'(A,I7,1X,2E22.14)')
1104 & 'S/R SEAICE_LSR: IPSEUDO, RESNORM, EKNORM = ',
8377b8ee87 Mart*1105 & ipass, SQRT(resnorm), EKnorm
86fa82a64d Jean*1106 _END_MASTER( myThid )
992ae64189 Mart*1107 ENDIF
1108 #endif /* SEAICE_ALLOW_CHECK_LSR_CONVERGENCE */
1109
143d9ce879 Dami*1110
992ae64189 Mart*1111 ENDIF
3e8bf7e743 Mart*1112
992ae64189 Mart*1113 ENDDO
1114
143d9ce879 Dami*1115 #ifdef ALLOW_DIAGNOSTICS
1116 IF ( DIAGNOSTICS_IS_ON('SIlsrRe ',myThid) ) THEN
1117
1118
1119
1120 CALL EXCH_UV_XY_RL( uTmp, vTmp,.TRUE.,myThid)
1121 DO bj = myByLo(myThid), myByHi(myThid)
1122 DO bi = myBxLo(myThid), myBxHi(myThid)
1123 DO j=1,sNy
1124 DO i=1,sNx
1125 RTmp(i,j) = SQRT( HALF * (
1126 & uTmp(i, j,bi,bj) * uTmp(i, j,bi,bj)
1127 & + uTmp(i+1,j,bi,bj) * uTmp(i+1,j,bi,bj)
1128 & + vTmp(i,j, bi,bj) * vTmp(i,j, bi,bj)
1129 & + vTmp(i,j+1,bi,bj) * vTmp(i,j+1,bi,bj)
1130 & ) )
1131 ENDDO
1132 ENDDO
1133 CALL DIAGNOSTICS_FILL(RTmp,'SIlsrRe ',0,1,3,bi,bj,myThid)
1134 ENDDO
1135 ENDDO
1136 ENDIF
1137 #endif /* ALLOW_DIAGNOSTICS */
1138
992ae64189 Mart*1139 IF ( useHB87StressCoupling ) THEN
dfc97bd020 Mart*1140 # ifdef ALLOW_AUTODIFF_TAMC
1141
1142
cbf501ab81 Jean*1143
dfc97bd020 Mart*1144
1145 # endif /* ALLOW_AUTODIFF_TAMC */
8b339058e0 Mart*1146
35fda33b05 Jean*1147
8b339058e0 Mart*1148
1149 CALL SEAICE_CALC_STRAINRATES(
1150 I uIce, vIce,
1151 O e11, e22, e12,
2e75568507 Mart*1152 I 3, myTime, myIter, myThid )
8b339058e0 Mart*1153
925df4f4b9 Mart*1154
8b339058e0 Mart*1155 DO bj=myByLo(myThid),myByHi(myThid)
1156 DO bi=myBxLo(myThid),myBxHi(myThid)
cbf501ab81 Jean*1157 CALL SEAICE_CALC_STRESSDIV(
925df4f4b9 Mart*1158 I e11, e22, e12, press, zeta, eta, etaZ,
1159 O stressDivergenceX, stressDivergenceY,
1160 I bi, bj, myTime, myIter, myThid )
8b339058e0 Mart*1161 ENDDO
964a494b4b Mart*1162 ENDDO
35fda33b05 Jean*1163
8b339058e0 Mart*1164 ENDIF
1165
53092bcb42 Mart*1166 RETURN
1167 END
efcb5efb58 Jean*1168
1169
1170
1171
1172
1173 SUBROUTINE SEAICE_RESIDUAL(
1174 I rhsU, rhsV, uRt1, uRt2, vRt1, vRt2,
1175 I AU, BU, CU, AV, BV, CV, uFld, vFld,
1176 O residU, residV, uRes, vRes,
1177 I calcMeanResid, myIter, myThid )
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187 IMPLICIT NONE
1188
1189
1190 #include "SIZE.h"
1191 #include "EEPARAMS.h"
1192 #include "GRID.h"
03c669d1ab Jean*1193 #include "SEAICE_SIZE.h"
efcb5efb58 Jean*1194 #include "SEAICE.h"
1195
1196
1197
1198
1199
1200
1201
03c669d1ab Jean*1202 _RL rhsU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1203 _RL rhsV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
efcb5efb58 Jean*1204
03c669d1ab Jean*1205 _RL uRt1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1206 _RL uRt2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
efcb5efb58 Jean*1207
03c669d1ab Jean*1208 _RL vRt1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1209 _RL vRt2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
efcb5efb58 Jean*1210
03c669d1ab Jean*1211 _RL AU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1212 _RL BU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1213 _RL CU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1214 _RL AV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1215 _RL BV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1216 _RL CV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
efcb5efb58 Jean*1217
03c669d1ab Jean*1218 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1219 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
efcb5efb58 Jean*1220
1221 _RL residU, residV
03c669d1ab Jean*1222 _RL uRes (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1223 _RL vRes (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
efcb5efb58 Jean*1224 LOGICAL calcMeanResid
1225 INTEGER myIter
1226 INTEGER myThid
1227
1228
1229
1230
1231
1232
1233 INTEGER i, j, bi, bj
1234
1235
1236
1237 residU = 0.
1238 residV = 0.
1239
1240 DO bj=myByLo(myThid),myByHi(myThid)
1241 DO bi=myBxLo(myThid),myBxHi(myThid)
1242 DO j=1,sNy
1243 DO i=1,sNx
1244 uRes(i,j,bi,bj) = rhsU(i,j,bi,bj)
1245 & + uRt1(i,j,bi,bj)*uFld(i,j-1,bi,bj)
1246 & + uRt2(i,j,bi,bj)*uFld(i,j+1,bi,bj)
1247 & - ( AU(i,j,bi,bj)*uFld(i-1,j,bi,bj)
1248 & + BU(i,j,bi,bj)*uFld( i ,j,bi,bj)
1249 & + CU(i,j,bi,bj)*uFld(i+1,j,bi,bj)
1250 & )
1251 vRes(i,j,bi,bj) = rhsV(i,j,bi,bj)
1252 & + vRt1(i,j,bi,bj)*vFld(i-1,j,bi,bj)
1253 & + vRt2(i,j,bi,bj)*vFld(i+1,j,bi,bj)
1254 & - ( AV(i,j,bi,bj)*vFld(i,j-1,bi,bj)
1255 & + BV(i,j,bi,bj)*vFld(i, j ,bi,bj)
1256 & + CV(i,j,bi,bj)*vFld(i,j+1,bi,bj)
1257 & )
1258 ENDDO
1259 ENDDO
56d0d0c8e2 Mart*1260 IF ( calcMeanResid ) THEN
1261 DO j=1,sNy
1262 DO i=1,sNx
efcb5efb58 Jean*1263 residU = residU + uRes(i,j,bi,bj)*uRes(i,j,bi,bj)
1264 & *rAw(i,j,bi,bj)*maskInW(i,j,bi,bj)
5adf1d4e76 Mart*1265 #ifndef OBCS_UVICE_OLD
1266 & *maskInC(i,j,bi,bj)*maskInC(i-1,j,bi,bj)
1267 #endif
efcb5efb58 Jean*1268 residV = residV + vRes(i,j,bi,bj)*vRes(i,j,bi,bj)
1269 & *rAs(i,j,bi,bj)*maskInS(i,j,bi,bj)
5adf1d4e76 Mart*1270 #ifndef OBCS_UVICE_OLD
1271 & *maskInC(i,j,bi,bj)*maskInC(i,j-1,bi,bj)
1272 #endif
56d0d0c8e2 Mart*1273 ENDDO
efcb5efb58 Jean*1274 ENDDO
56d0d0c8e2 Mart*1275 ENDIF
efcb5efb58 Jean*1276 ENDDO
1277 ENDDO
1278 IF ( calcMeanResid ) THEN
56d0d0c8e2 Mart*1279 _GLOBAL_SUM_RL( residU, myThid )
1280 _GLOBAL_SUM_RL( residV, myThid )
1281
1282 IF ( residU.GT.0. ) residU = SQRT(residU/globalArea)
1283 IF ( residV.GT.0. ) residV = SQRT(residV/globalArea)
efcb5efb58 Jean*1284 ENDIF
1285
1286
1287
1288 RETURN
1289 END
b7c2bb63b7 Mart*1290
1291
5fb12930f9 Mart*1292
b7c2bb63b7 Mart*1293
cbf501ab81 Jean*1294 SUBROUTINE SEAICE_LSR_CALC_COEFFS(
df1dac8b7b Mart*1295 I etaPlusZeta, zetaMinusEta, etaZloc, zetaZloc, dragSym,
b7c2bb63b7 Mart*1296 O AU, BU, CU, AV, BV, CV, uRt1, uRt2, vRt1, vRt2,
d585a5aee9 Mart*1297 I iMin, iMax, jMin, jMax, myTime, myIter, myThid )
b7c2bb63b7 Mart*1298
1299
1300
5fb12930f9 Mart*1301
b7c2bb63b7 Mart*1302
1303
1304
1305
1306
1307 IMPLICIT NONE
1308
1309
1310 #include "SIZE.h"
1311 #include "EEPARAMS.h"
1312 #include "PARAMS.h"
1313 #include "GRID.h"
1314 #include "SEAICE_SIZE.h"
1315 #include "SEAICE_PARAMS.h"
3f0f10fc37 Mart*1316 #include "SEAICE_GRID.h"
b7c2bb63b7 Mart*1317 #include "SEAICE.h"
1318
1319
1320
1321
1322
1323
1324 _RL myTime
1325 INTEGER myIter
1326 INTEGER myThid
d585a5aee9 Mart*1327 INTEGER iMin, iMax, jMin, jMax
b7c2bb63b7 Mart*1328
1329
1330 _RL etaPlusZeta (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1331 _RL zetaMinusEta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0fd6b2de1a Mart*1332
1333 _RL etaZloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1334 _RL zetaZloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
df1dac8b7b Mart*1335
1336 _RL dragSym (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
b7c2bb63b7 Mart*1337
1338
1339
1340 _RL AU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1341 _RL BU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1342 _RL CU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1343 _RL AV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1344 _RL BV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1345 _RL CV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1346
1347 _RL uRt1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1348 _RL uRt2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1349
1350 _RL vRt1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1351 _RL vRt2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1352
1353
1354
1355
1356
1357
1358 INTEGER i, j, bi, bj
1359 _RL hFacM, hFacP
e232688b80 Mart*1360
1361 _RL bdfAlphaOverDt
0fd6b2de1a Mart*1362
1363 _RL strImpCplFac
b7c2bb63b7 Mart*1364
70e078b38a Mart*1365
1366 _RL areaW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1367 _RL areaS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
b7c2bb63b7 Mart*1368
1369
1370
1371
1372
1373
bfe6f7447e Mart*1374 _RL UXX (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1375 _RL UYY (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1376 _RL UXM (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1377 _RL UYM (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1378 _RL VXX (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1379 _RL VYY (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1380 _RL VXM (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1381 _RL VYM (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
b7c2bb63b7 Mart*1382
1383
e501eee760 Mart*1384
e232688b80 Mart*1385 bdfAlphaOverDt = 1. _d 0
e501eee760 Mart*1386 IF ( SEAICEuseBDF2 ) THEN
1387 IF ( myIter.EQ.nIter0 .AND. SEAICEmomStartBDF.EQ.0 ) THEN
e232688b80 Mart*1388 bdfAlphaOverDt = 1. _d 0
6cbc659de0 Mart*1389 ELSE
e232688b80 Mart*1390 bdfAlphaOverDt = 1.5 _d 0
6cbc659de0 Mart*1391 ENDIF
1392 ENDIF
e232688b80 Mart*1393
1394 bdfAlphaOverDt = bdfAlphaOverDt / SEAICE_deltaTdyn
1395
0fd6b2de1a Mart*1396 strImpCplFac = 0. _d 0
1397 IF ( SEAICEuseStrImpCpl ) strImpCplFac = 1. _d 0
1398
b7c2bb63b7 Mart*1399 DO bj=myByLo(myThid),myByHi(myThid)
1400 DO bi=myBxLo(myThid),myBxHi(myThid)
70e078b38a Mart*1401 IF ( SEAICEscaleSurfStress ) THEN
4a08d54d3a Mart*1402 DO j=jMin,jMax
1403 DO i=iMin,iMax
1404 areaW(i,j) = 0.5 _d 0*(AREA(i,j,bi,bj)+AREA(i-1,j,bi,bj))
1405 areaS(i,j) = 0.5 _d 0*(AREA(i,j,bi,bj)+AREA(i,j-1,bi,bj))
70e078b38a Mart*1406 ENDDO
1407 ENDDO
1408 ELSE
4a08d54d3a Mart*1409 DO j=jMin,jMax
1410 DO i=iMin,iMax
1411 areaW(i,j) = 1. _d 0
1412 areaS(i,j) = 1. _d 0
70e078b38a Mart*1413 ENDDO
1414 ENDDO
1415 ENDIF
b7c2bb63b7 Mart*1416
4a08d54d3a Mart*1417
b7c2bb63b7 Mart*1418
4a08d54d3a Mart*1419 DO j=jMin,jMax
1420 DO i=iMin-1,iMax
b7c2bb63b7 Mart*1421
4a08d54d3a Mart*1422 UXX(i,j) = _dyF(i,j,bi,bj) * etaPlusZeta(i,j,bi,bj)
1423 & * _recip_dxF(i,j,bi,bj)
b7c2bb63b7 Mart*1424
4a08d54d3a Mart*1425 UXM(i,j) = _dyF(i,j,bi,bj) * zetaMinusEta(i,j,bi,bj)
1426 & * k1AtC(i,j,bi,bj) * 0.5 _d 0
b7c2bb63b7 Mart*1427 ENDDO
1428 ENDDO
4a08d54d3a Mart*1429 DO j=jMin,jMax+1
1430 DO i=iMin,iMax
b7c2bb63b7 Mart*1431
4a08d54d3a Mart*1432 UYY(i,j) = _dxV(i,j,bi,bj) *
1433 & ( etaZloc(i,j,bi,bj) + strImpCplFac*zetaZloc(i,j,bi,bj) )
1434 & * _recip_dyU(i,j,bi,bj)
b7c2bb63b7 Mart*1435
4a08d54d3a Mart*1436 UYM(i,j) = _dxV(i,j,bi,bj) * etaZloc(i,j,bi,bj)
1437 & * k2AtZ(i,j,bi,bj) * 0.5 _d 0
b7c2bb63b7 Mart*1438 ENDDO
1439 ENDDO
4a08d54d3a Mart*1440 DO j=jMin,jMax
1441 DO i=iMin,iMax+1
b7c2bb63b7 Mart*1442
4a08d54d3a Mart*1443 VXX(i,j) = _dyU(i,j,bi,bj) *
1444 & ( etaZloc(i,j,bi,bj) + strImpCplFac*zetaZloc(i,j,bi,bj) )
1445 & * _recip_dxV(i,j,bi,bj)
b7c2bb63b7 Mart*1446
4a08d54d3a Mart*1447 VXM(i,j) = _dyU(i,j,bi,bj) * etaZloc(i,j,bi,bj)
1448 & * k1AtZ(i,j,bi,bj) * 0.5 _d 0
b7c2bb63b7 Mart*1449 ENDDO
1450 ENDDO
4a08d54d3a Mart*1451 DO j=jMin-1,jMax
1452 DO i=iMin,iMax
b7c2bb63b7 Mart*1453
4a08d54d3a Mart*1454 VYY(i,j) = _dxF(i,j,bi,bj) * etaPlusZeta(i,j,bi,bj)
1455 & * _recip_dyF(i,j,bi,bj)
b7c2bb63b7 Mart*1456
4a08d54d3a Mart*1457 VYM(i,j) = _dxF(i,j,bi,bj) * zetaMinusEta(i,j,bi,bj)
1458 & * k2AtC(i,j,bi,bj) * 0.5 _d 0
b7c2bb63b7 Mart*1459 ENDDO
1460 ENDDO
1461
1462
1463
1464
1465
4a08d54d3a Mart*1466
1467 DO j=jMin,jMax
1468 DO i=iMin,iMax
1469
1470 AU(i,j,bi,bj)= ( - UXX(i-1,j) + UXM(i-1,j) )
1471 & * seaiceMaskU(i,j,bi,bj)
1472
1473 CU(i,j,bi,bj)= ( - UXX(i ,j) - UXM(i ,j) )
1474 & * seaiceMaskU(i,j,bi,bj)
1475
1476 BU(i,j,bi,bj)=(ONE - seaiceMaskU(i,j,bi,bj)) +
1477 & ( UXX(i-1,j) + UXX(i,j) + UYY(i,j+1) + UYY(i,j)
1478 & + UXM(i-1,j) - UXM(i,j) + UYM(i,j+1) - UYM(i,j)
1479 & ) * seaiceMaskU(i,j,bi,bj)
1480
1481 uRt1(i,j,bi,bj)= UYY(i,j ) + UYM(i,j )
1482
1483 uRt2(i,j,bi,bj)= UYY(i,j+1) - UYM(i,j+1)
b7c2bb63b7 Mart*1484 ENDDO
1485 ENDDO
1486
1487
1488
1489
4a08d54d3a Mart*1490 DO j=jMin,jMax
1491 DO i=iMin,iMax
1492 hFacM = seaiceMaskU(i,j-1,bi,bj)
1493 hFacP = seaiceMaskU(i,j+1,bi,bj)
1494
b7c2bb63b7 Mart*1495
1496
4a08d54d3a Mart*1497 BU(i,j,bi,bj)=BU(i,j,bi,bj) + seaiceMaskU(i,j,bi,bj) *
1498 & ( ( 1. _d 0 - hFacM ) * ( UYY(i ,j ) + UYM(i ,j ) )
1499 & + ( 1. _d 0 - hFacP ) * ( UYY(i ,j+1) - UYM(i ,j+1) ) )
1500
1501 uRt1(i,j,bi,bj) = uRt1(i,j,bi,bj) * hFacM
1502 uRt2(i,j,bi,bj) = uRt2(i,j,bi,bj) * hFacP
b7c2bb63b7 Mart*1503 ENDDO
1504 ENDDO
1505
1506
4a08d54d3a Mart*1507 DO j=jMin,jMax
1508 DO i=iMin,iMax
1509 AU(i,j,bi,bj) = AU(i,j,bi,bj) * recip_rAw(i,j,bi,bj)
1510 CU(i,j,bi,bj) = CU(i,j,bi,bj) * recip_rAw(i,j,bi,bj)
cbf501ab81 Jean*1511
1512
e232688b80 Mart*1513
4a08d54d3a Mart*1514 BU(i,j,bi,bj) = BU(i,j,bi,bj) * recip_rAw(i,j,bi,bj)
1515 & + seaiceMaskU(i,j,bi,bj) *
1516 & ( bdfAlphaOverDt*seaiceMassU(i,j,bi,bj)
8377b8ee87 Mart*1517 & + 0.5 _d 0 * ( dragSym(i, j,bi,bj)
4a08d54d3a Mart*1518 & + dragSym(i-1,j,bi,bj) )*areaW(i,j)
df1dac8b7b Mart*1519 & )
4a08d54d3a Mart*1520 uRt1(i,j,bi,bj) = uRt1(i,j,bi,bj) * recip_rAw(i,j,bi,bj)
1521 uRt2(i,j,bi,bj) = uRt2(i,j,bi,bj) * recip_rAw(i,j,bi,bj)
b7c2bb63b7 Mart*1522 ENDDO
1523 ENDDO
1524
1525
1526
1527
1528
4a08d54d3a Mart*1529
1530 DO j=jMin,jMax
1531 DO i=iMin,iMax
1532
1533 AV(i,j,bi,bj)=( - VYY(i,j-1) + VYM(i,j-1)
1534 & ) * seaiceMaskV(i,j,bi,bj)
1535
1536 CV(i,j,bi,bj)=( - VYY(i,j ) - VYM(i,j )
1537 & ) * seaiceMaskV(i,j,bi,bj)
1538
1539 BV(i,j,bi,bj)= (ONE - seaiceMaskV(i,j,bi,bj)) +
1540 & ( VXX(i,j) + VXX(i+1,j) + VYY(i,j) + VYY(i,j-1)
1541 & - VXM(i,j) + VXM(i+1,j) - VYM(i,j) + VYM(i,j-1)
1542 & ) * seaiceMaskV(i,j,bi,bj)
1543
1544 vRt1(i,j,bi,bj) = VXX(i ,j) + VXM(i ,j)
1545
1546 vRt2(i,j,bi,bj) = VXX(i+1,j) - VXM(i+1,j)
b7c2bb63b7 Mart*1547 ENDDO
1548 ENDDO
1549
1550
1551
1552
4a08d54d3a Mart*1553 DO j=jMin,jMax
1554 DO i=iMin,iMax
b7c2bb63b7 Mart*1555 hFacM = seaiceMaskV(i-1,j,bi,bj)
1556 hFacP = seaiceMaskV(i+1,j,bi,bj)
4a08d54d3a Mart*1557
b7c2bb63b7 Mart*1558
1559
4a08d54d3a Mart*1560 BV(i,j,bi,bj)=BV(i,j,bi,bj) + seaiceMaskV(i,j,bi,bj) *
1561 & ( ( 1. _d 0 - hFacM ) * ( VXX(i ,j) + VXM(i ,j) )
1562 & + ( 1. _d 0 - hFacP ) * ( VXX(i+1,j) - VXM(i+1,j) ) )
1563
1564 vRt1(i,j,bi,bj) = vRt1(i,j,bi,bj) * hFacM
1565 vRt2(i,j,bi,bj) = vRt2(i,j,bi,bj) * hFacP
b7c2bb63b7 Mart*1566 ENDDO
1567 ENDDO
1568
1569
4a08d54d3a Mart*1570 DO j=jMin,jMax
1571 DO i=iMin,iMax
1572 AV(i,j,bi,bj) = AV(i,j,bi,bj) * recip_rAs(i,j,bi,bj)
1573 CV(i,j,bi,bj) = CV(i,j,bi,bj) * recip_rAs(i,j,bi,bj)
e232688b80 Mart*1574
cbf501ab81 Jean*1575
e232688b80 Mart*1576
4a08d54d3a Mart*1577 BV(i,j,bi,bj) = BV(i,j,bi,bj) * recip_rAs(i,j,bi,bj)
1578 & + seaiceMaskV(i,j,bi,bj) *
1579 & ( bdfAlphaOverDt*seaiceMassV(i,j,bi,bj)
1580 & + 0.5 _d 0 * ( dragSym(i,j, bi,bj)
1581 & + dragSym(i,j-1,bi,bj) )*areaS(i,j)
df1dac8b7b Mart*1582 & )
4a08d54d3a Mart*1583 vRt1(i,j,bi,bj) = vRt1(i,j,bi,bj) * recip_rAs(i,j,bi,bj)
1584 vRt2(i,j,bi,bj) = vRt2(i,j,bi,bj) * recip_rAs(i,j,bi,bj)
b7c2bb63b7 Mart*1585 ENDDO
1586 ENDDO
1587
70e078b38a Mart*1588 IF ( ( useCubedSphereExchange .AND.
1589 & (SEAICE_OLx.GT.0 .OR. SEAICE_OLy.GT.0) ) .OR.
1590 & SEAICEscaleSurfStress ) THEN
05180ad1ef Mart*1591
1592
1593
1594
70e078b38a Mart*1595
1596
4a08d54d3a Mart*1597 DO j=jMin,jMax
1598 DO i=iMin,iMax
1599 IF (BU(i,j,bi,bj).EQ.0 _d 0) BU(i,j,bi,bj) = 1. _d 0
1600 IF (BV(i,j,bi,bj).EQ.0 _d 0) BV(i,j,bi,bj) = 1. _d 0
05180ad1ef Mart*1601 ENDDO
1602 ENDDO
1603 ENDIF
b7c2bb63b7 Mart*1604
1605 ENDDO
1606 ENDDO
1607
5fb12930f9 Mart*1608 RETURN
1609 END
1610
1611
bfe6f7447e Mart*1612
1613
1614
1615
1616 SUBROUTINE SEAICE_LSR_RHSU(
cbf501ab81 Jean*1617 I zetaMinusEta, etaPlusZeta, etaZloc, zetaZloc, pressLoc,
1618 I uIceC, vIceC,
bfe6f7447e Mart*1619 U rhsU,
1620 I iMin, iMax, jMin, jMax, bi, bj, myThid )
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630 IMPLICIT NONE
1631 #include "SIZE.h"
0fd6b2de1a Mart*1632 #include "EEPARAMS.h"
bfe6f7447e Mart*1633 #include "GRID.h"
1634 #include "SEAICE_SIZE.h"
0fd6b2de1a Mart*1635 #include "SEAICE_PARAMS.h"
3f0f10fc37 Mart*1636 #include "SEAICE_GRID.h"
bfe6f7447e Mart*1637 #include "SEAICE.h"
1638
1639
1640
1641
1642 INTEGER myThid
1643 INTEGER iMin, iMax, jMin, jMax, bi, bj
1644
1645 _RL zetaMinusEta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1646 _RL etaPlusZeta (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1647 _RL etaZloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0fd6b2de1a Mart*1648 _RL zetaZloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
bfe6f7447e Mart*1649 _RL pressloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0fd6b2de1a Mart*1650 _RL uIceC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
bfe6f7447e Mart*1651 _RL vIceC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1652 _RL rhsU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1653
1654
1655
1656
3f0f10fc37 Mart*1657
4a08d54d3a Mart*1658 INTEGER i,j
3f0f10fc37 Mart*1659 _RL eplus, eminus
bfe6f7447e Mart*1660 _RL hFacM
1661 _RL sig11(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1662 _RL sig12(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1663
1664
4a08d54d3a Mart*1665 DO j=1-OLy,sNy+OLy
1666 DO i=1-OLx,sNx+OLx
1667 sig11(i,j) = 0. _d 0
1668 sig12(i,j) = 0. _d 0
bfe6f7447e Mart*1669 ENDDO
1670 ENDDO
1671
4a08d54d3a Mart*1672 DO j=jMin,jMax
1673 DO i=iMin-1,iMax
1674 sig11(i,j) = zetaMinusEta(i,j,bi,bj)
1675 & * ( vIceC(i,j+1,bi,bj) - vIceC(i,j,bi,bj) )
1676 & * _recip_dyF(i,j,bi,bj)
1677 & + etaPlusZeta(i,j,bi,bj) * k2AtC(i,j,bi,bj)
1678 & * 0.5 _d 0 * ( vIceC(i,j+1,bi,bj) + vIceC(i,j,bi,bj) )
1679 & - 0.5 _d 0 * pressLoc(i,j,bi,bj)
bfe6f7447e Mart*1680 ENDDO
1681 ENDDO
1682
4a08d54d3a Mart*1683 DO j=jMin,jMax+1
1684 DO i=iMin,iMax
1685 hFacM = seaiceMaskV(i,j,bi,bj) - seaiceMaskV(i-1,j,bi,bj)
1686 sig12(i,j) = etaZloc(i,j,bi,bj) * (
1687 & ( vIceC(i,j,bi,bj) - vIceC(i-1,j,bi,bj) )
1688 & * _recip_dxV(i,j,bi,bj)
1689 & - k1AtZ(i,j,bi,bj)
1690 & * 0.5 _d 0 * ( vIceC(i,j,bi,bj) + vIceC(i-1,j,bi,bj) )
bfe6f7447e Mart*1691 & )
1692
4a08d54d3a Mart*1693 & *HEFFM(i ,j ,bi,bj)*HEFFM(i-1,j ,bi,bj)
1694 & *HEFFM(i ,j-1,bi,bj)*HEFFM(i-1,j-1,bi,bj)
bfe6f7447e Mart*1695
1696
1697
4a08d54d3a Mart*1698 & + etaZloc(i,j,bi,bj) * _recip_dxV(i,j,bi,bj)
1699 & * ( vIceC(i,j,bi,bj) + vIceC(i-1,j,bi,bj) )
bfe6f7447e Mart*1700 & * hFacM * 2. _d 0
1701 ENDDO
1702 ENDDO
1703
0fd6b2de1a Mart*1704 IF ( SEAICEuseStrImpCpl ) THEN
cbf501ab81 Jean*1705
0fd6b2de1a Mart*1706
1707
4a08d54d3a Mart*1708 DO j=jMin,jMax+1
1709 DO i=iMin,iMax
1710 hFacM = seaiceMaskV(i,j,bi,bj) - seaiceMaskV(i-1,j,bi,bj)
1711 sig12(i,j) = sig12(i,j) - zetaZloc(i,j,bi,bj) * (
1712 & ( uIceC(i,j,bi,bj) - uIceC(i,j-1,bi,bj) )
1713 & * _recip_dyU(i,j,bi,bj)
0fd6b2de1a Mart*1714 & )
1715
4a08d54d3a Mart*1716 & *HEFFM(i ,j ,bi,bj)*HEFFM(i-1,j ,bi,bj)
1717 & *HEFFM(i ,j-1,bi,bj)*HEFFM(i-1,j-1,bi,bj)
0fd6b2de1a Mart*1718
1719
1720
4a08d54d3a Mart*1721 & - zetaZloc(i,j,bi,bj) * _recip_dyU(i,j,bi,bj)
1722 & * ( uIceC(i,j,bi,bj) + uIceC(i,j-1,bi,bj) )
0fd6b2de1a Mart*1723 & * hFacM * 2. _d 0
1724 ENDDO
1725 ENDDO
1726 ENDIF
cbf501ab81 Jean*1727
4a08d54d3a Mart*1728 DO j=jMin,jMax
1729 DO i=iMin,iMax
bfe6f7447e Mart*1730
4a08d54d3a Mart*1731 rhsU(i,j,bi,bj) = rhsU(i,j,bi,bj)
1732 & + recip_rAw(i,j,bi,bj) * seaiceMaskU(i,j,bi,bj) *
1733 & ( _dyF(i ,j ,bi,bj)*sig11(i ,j )
1734 & - _dyF(i-1,j ,bi,bj)*sig11(i-1,j )
1735 & + _dxV(i ,j+1,bi,bj)*sig12(i ,j+1)
1736 & - _dxV(i ,j ,bi,bj)*sig12(i ,j ) )
bfe6f7447e Mart*1737 ENDDO
1738 ENDDO
1739
3f0f10fc37 Mart*1740
1741 IF ( SEAICEselectMetricTerms .GE. 2 ) THEN
1742
1743 DO j=1-OLy,sNy+OLy
1744 DO i=1-OLx,sNx+OLx
1745 eplus = e11(i,j,bi,bj) + e22(i,j,bi,bj)
1746 eminus= e11(i,j,bi,bj) - e22(i,j,bi,bj)
1747 sig11(i,j) = zeta(i,j,bi,bj)*eplus - eta(i,j,bi,bj)*eminus
1748 & - 0.5 _d 0 * press(i,j,bi,bj)
1749 sig12(i,j) = 2. _d 0 * e12(i,j,bi,bj) * etaZ(i,j,bi,bj)
1750 ENDDO
1751 ENDDO
1752
1753 DO j=jMin,jMax
1754 DO i=iMin,iMax
1755 rhsU(i,j,bi,bj) = rhsU(i,j,bi,bj)
1756 & + seaiceMaskU(i,j,bi,bj) * halfRL *
1757 & ( k2AtU(i,j,bi,bj) * ( sig12(i,j) + sig12(i,j+1) )
1758 & - k1AtU(i,j,bi,bj) * ( sig11(i,j) + sig11(i-1,j) ) )
1759 ENDDO
1760 ENDDO
1761 ENDIF
1762
bfe6f7447e Mart*1763 RETURN
1764 END
1765
1766
1767
1768
1769
1770
1771 SUBROUTINE SEAICE_LSR_RHSV(
0fd6b2de1a Mart*1772 I zetaMinusEta, etaPlusZeta, etaZloc, zetaZloc, pressLoc,
1773 I uIceC, vIceC,
bfe6f7447e Mart*1774 U rhsV,
1775 I iMin, iMax, jMin, jMax, bi, bj, myThid )
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785 IMPLICIT NONE
1786 #include "SIZE.h"
0fd6b2de1a Mart*1787 #include "EEPARAMS.h"
bfe6f7447e Mart*1788 #include "GRID.h"
1789 #include "SEAICE_SIZE.h"
0fd6b2de1a Mart*1790 #include "SEAICE_PARAMS.h"
3f0f10fc37 Mart*1791 #include "SEAICE_GRID.h"
bfe6f7447e Mart*1792 #include "SEAICE.h"
1793
1794
1795
1796
1797 INTEGER myThid
1798 INTEGER iMin, iMax, jMin, jMax, bi, bj
1799
1800 _RL zetaMinusEta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1801 _RL etaPlusZeta (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1802 _RL etaZloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0fd6b2de1a Mart*1803 _RL zetaZloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
bfe6f7447e Mart*1804 _RL pressloc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1805 _RL uIceC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0fd6b2de1a Mart*1806 _RL vIceC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
bfe6f7447e Mart*1807 _RL rhsV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1808
1809
1810
1811
3f0f10fc37 Mart*1812
4a08d54d3a Mart*1813 INTEGER i,j
3f0f10fc37 Mart*1814 _RL eplus, eminus
bfe6f7447e Mart*1815 _RL hFacM
1816 _RL sig22(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1817 _RL sig12(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1818
1819
4a08d54d3a Mart*1820 DO j=1-OLy,sNy+OLy
1821 DO i=1-OLx,sNx+OLx
1822 sig22(i,j) = 0. _d 0
1823 sig12(i,j) = 0. _d 0
bfe6f7447e Mart*1824 ENDDO
1825 ENDDO
1826
1827
4a08d54d3a Mart*1828 DO j=jMin-1,jMax
1829 DO i=iMin,iMax
1830 sig22(i,j) = zetaMinusEta(i,j,bi,bj)
1831 & * ( uIceC(i+1,j,bi,bj) - uIceC(i,j,bi,bj) )
1832 & * _recip_dxF(i,j,bi,bj)
1833 & + etaPlusZeta(i,j,bi,bj) * k1AtC(i,j,bi,bj)
1834 & * 0.5 _d 0 * ( uIceC(i+1,j,bi,bj) + uIceC(i,j,bi,bj) )
1835 & - 0.5 _d 0 * pressLoc(i,j,bi,bj)
bfe6f7447e Mart*1836 ENDDO
1837 ENDDO
1838
4a08d54d3a Mart*1839 DO j=jMin,jMax
1840 DO i=iMin,iMax+1
bfe6f7447e Mart*1841 hFacM = seaiceMaskU(i,j,bi,bj) - seaiceMaskU(i,j-1,bi,bj)
4a08d54d3a Mart*1842 sig12(i,j) = etaZloc(i,j,bi,bj) * (
1843 & ( uIceC(i,j,bi,bj) - uIceC(i,j-1,bi,bj) )
1844 & * _recip_dyU(i,j,bi,bj)
1845 & - k2AtZ(i,j,bi,bj)
1846 & * 0.5 _d 0 * ( uIceC(i,j,bi,bj) + uIceC(i,j-1,bi,bj) )
bfe6f7447e Mart*1847 & )
1848
4a08d54d3a Mart*1849 & *HEFFM(i ,j ,bi,bj)*HEFFM(i-1,j ,bi,bj)
1850 & *HEFFM(i ,j-1,bi,bj)*HEFFM(i-1,j-1,bi,bj)
bfe6f7447e Mart*1851
1852
1853
4a08d54d3a Mart*1854 & + etaZloc(i,j,bi,bj) * _recip_dyU(i,j,bi,bj)
1855 & * ( uIceC(i,j,bi,bj) + uIceC(i,j-1,bi,bj) )
bfe6f7447e Mart*1856 & * hFacM * 2. _d 0
1857 ENDDO
1858 ENDDO
1859
0fd6b2de1a Mart*1860 IF ( SEAICEuseStrImpCpl ) THEN
cbf501ab81 Jean*1861
0fd6b2de1a Mart*1862
1863
4a08d54d3a Mart*1864 DO j=jMin,jMax
1865 DO i=iMin,iMax+1
0fd6b2de1a Mart*1866 hFacM = seaiceMaskU(i,j,bi,bj) - seaiceMaskU(i,j-1,bi,bj)
4a08d54d3a Mart*1867 sig12(i,j) = sig12(i,j) - zetaZloc(i,j,bi,bj) * (
1868 & ( vIceC(i,j,bi,bj) - vIceC(i-1,j,bi,bj) )
1869 & * _recip_dxV(i,j,bi,bj)
0fd6b2de1a Mart*1870 & )
1871
4a08d54d3a Mart*1872 & *HEFFM(i ,j ,bi,bj)*HEFFM(i-1,j ,bi,bj)
1873 & *HEFFM(i ,j-1,bi,bj)*HEFFM(i-1,j-1,bi,bj)
0fd6b2de1a Mart*1874
1875
1876
4a08d54d3a Mart*1877 & - zetaZloc(i,j,bi,bj) * _recip_dxV(i,j,bi,bj)
1878 & * ( vIceC(i,j,bi,bj) + vIceC(i-1,j,bi,bj) )
0fd6b2de1a Mart*1879 & * hFacM * 2. _d 0
1880 ENDDO
1881 ENDDO
1882 ENDIF
1883
4a08d54d3a Mart*1884 DO j=jMin,jMax
1885 DO i=iMin,iMax
bfe6f7447e Mart*1886
4a08d54d3a Mart*1887 rhsV(i,j,bi,bj) = rhsV(i,j,bi,bj)
1888 & + recip_rAs(i,j,bi,bj) * seaiceMaskV(i,j,bi,bj) *
1889 & ( _dyU(i+1,j ,bi,bj) * sig12(i+1,j )
1890 & - _dyU(i ,j ,bi,bj) * sig12(i ,j )
1891 & + _dxF(i ,j ,bi,bj) * sig22(i ,j )
1892 & - _dxF(i ,j-1,bi,bj) * sig22(i ,j-1) )
bfe6f7447e Mart*1893 ENDDO
1894 ENDDO
1895
3f0f10fc37 Mart*1896 IF ( SEAICEselectMetricTerms .GE. 2 ) THEN
1897
1898 DO j=1-OLy,sNy+OLy
1899 DO i=1-OLx,sNx+OLx
1900 eplus = e11(i,j,bi,bj) + e22(i,j,bi,bj)
1901 eminus= e11(i,j,bi,bj) - e22(i,j,bi,bj)
1902 sig22(i,j) = zeta(i,j,bi,bj)*eplus + eta(i,j,bi,bj)*eminus
1903 & - 0.5 _d 0 * press(i,j,bi,bj)
1904 sig12(i,j) = 2. _d 0 * e12(i,j,bi,bj) * etaZ(i,j,bi,bj)
1905 ENDDO
1906 ENDDO
1907
1908 DO j=jMin,jMax
1909 DO i=iMin,iMax
1910 rhsV(i,j,bi,bj) = rhsV(i,j,bi,bj)
1911 & + seaiceMaskU(i,j,bi,bj) * halfRL *
1912 & ( k1AtV(i,j,bi,bj) * ( sig12(i,j) + sig12(i+1,j) )
1913 & - k2AtV(i,j,bi,bj) * ( sig22(i,j) + sig22(i,j-1) ) )
1914 ENDDO
1915 ENDDO
1916 ENDIF
1917
bfe6f7447e Mart*1918 RETURN
1919 END
1920
1921
5fb12930f9 Mart*1922
1923
1924
1925
1926 SUBROUTINE SEAICE_LSR_TRIDIAGU(
8df0ccd026 Jean*1927 I AU, BU, CU, uRt1, uRt2, rhsU, uTmp, seaiceMaskU, WFAU,
5fb12930f9 Mart*1928 U uIce,
8d9be9cde5 Mart*1929 I iMin, iMax, jMin, jMax, bi, bj, myTime, myIter, myThid )
5fb12930f9 Mart*1930
1931
1932
8d9be9cde5 Mart*1933
5fb12930f9 Mart*1934
1935
1936
1937
1938
1939 IMPLICIT NONE
1940 #include "SIZE.h"
1941
1942
1943
1944
1945
1946
1947 _RL myTime
1948 INTEGER myIter
1949 INTEGER myThid
1950 INTEGER iMin, iMax, jMin, jMax, bi, bj
1951
1952 _RL AU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1953 _RL BU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1954 _RL CU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1955
1956 _RL uRt1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1957 _RL uRt2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1958
1959 _RL rhsU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
8df0ccd026 Jean*1960
1961 _RL uTmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
5fb12930f9 Mart*1962
1963 _RL uIce(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1964
1965 _RL seaiceMaskU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
1966
1967 _RL WFAU
1968
1969
1970
1971
1972
4a08d54d3a Mart*1973 INTEGER i,j,iM
032b010f0c Mart*1974 INTEGER jMinLoc, jStep
12dace3fd6 Mart*1975 #ifdef SEAICE_LSR_ZEBRA
4a08d54d3a Mart*1976 INTEGER k
032b010f0c Mart*1977 PARAMETER ( jStep = 2 )
1978 #else
1979 PARAMETER ( jStep = 1 )
12dace3fd6 Mart*1980 #endif /* SEAICE_LSR_ZEBRA */
7c0da9bbfa Mart*1981 _RL AA3, bet
5fb12930f9 Mart*1982 _RL URT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1983 _RL CUU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
cbf501ab81 Jean*1984
dadeed8422 Mart*1985
4a08d54d3a Mart*1986 DO j=1-OLy,sNy+OLy
1987 DO i=1-OLx,sNx+OLx
1988 URT(i,j) = 0. _d 0
1989 CUU(i,j) = 0. _d 0
dadeed8422 Mart*1990 ENDDO
1991 ENDDO
12dace3fd6 Mart*1992 #ifdef SEAICE_LSR_ZEBRA
4a08d54d3a Mart*1993 DO k=0,1
1994 jMinLoc = jMin+k
8d9be9cde5 Mart*1995 #else
032b010f0c Mart*1996 jMinLoc = jMin
12dace3fd6 Mart*1997 #endif /* SEAICE_LSR_ZEBRA */
4a08d54d3a Mart*1998 DO j=jMinLoc,jMax,jStep
1999 DO i=iMin,iMax
5fb12930f9 Mart*2000 AA3 = 0. _d 0
4a08d54d3a Mart*2001 IF (i.EQ.iMin) AA3 = AA3 - AU(i,j,bi,bj)*uIce(i-1,j,bi,bj)
2002 IF (i.EQ.iMax) AA3 = AA3 - CU(i,j,bi,bj)*uIce(i+1,j,bi,bj)
cbf501ab81 Jean*2003
4a08d54d3a Mart*2004 URT(i,j)=rhsU(i,j,bi,bj)
5fb12930f9 Mart*2005 & + AA3
4a08d54d3a Mart*2006 & + uRt1(i,j,bi,bj)*uIce(i,j-1,bi,bj)
2007 & + uRt2(i,j,bi,bj)*uIce(i,j+1,bi,bj)
2008 URT(i,j)=URT(i,j)* seaiceMaskU(i,j,bi,bj)
5fb12930f9 Mart*2009 ENDDO
032b010f0c Mart*2010
4a08d54d3a Mart*2011 DO i=iMin,iMax
2012 CUU(i,j)=CU(i,j,bi,bj)
5fb12930f9 Mart*2013 ENDDO
4a08d54d3a Mart*2014 CUU(iMin,j)=CUU(iMin,j)/BU(iMin,j,bi,bj)
2015 URT(iMin,j)=URT(iMin,j)/BU(iMin,j,bi,bj)
5fb12930f9 Mart*2016 #ifdef SEAICE_VECTORIZE_LSR
2017 ENDDO
2018
032b010f0c Mart*2019
4a08d54d3a Mart*2020 DO i=iMin+1,iMax
2021 iM=i-1
2022 DO j=jMinLoc,jMax,jStep
5fb12930f9 Mart*2023 #else /* do not SEAICE_VECTORIZE_LSR */
032b010f0c Mart*2024
4a08d54d3a Mart*2025 DO i=iMin+1,iMax
2026 iM=i-1
5fb12930f9 Mart*2027 #endif /* SEAICE_VECTORIZE_LSR */
4a08d54d3a Mart*2028 bet = BU(i,j,bi,bj)-AU(i,j,bi,bj)*CUU(iM,j)
2029 CUU(i,j) = CUU(i,j)/bet
2030 URT(i,j) = (URT(i,j)-AU(i,j,bi,bj)*URT(iM,j))/bet
5fb12930f9 Mart*2031 ENDDO
2032 #ifdef SEAICE_VECTORIZE_LSR
2033 ENDDO
032b010f0c Mart*2034
4a08d54d3a Mart*2035 DO i=iMin,iMax-1
8377b8ee87 Mart*2036 iM=sNx-i
4a08d54d3a Mart*2037 DO j=jMinLoc,jMax,jStep
8d9be9cde5 Mart*2038 #else
032b010f0c Mart*2039
4a08d54d3a Mart*2040 DO i=iMin,iMax-1
8377b8ee87 Mart*2041 iM=sNx-i
032b010f0c Mart*2042 #endif /* SEAICE_VECTORIZE_LSR */
4a08d54d3a Mart*2043 URT(iM,j)=URT(iM,j)-CUU(iM,j)*URT(iM+1,j)
5fb12930f9 Mart*2044 ENDDO
032b010f0c Mart*2045 #ifdef SEAICE_VECTORIZE_LSR
2046 ENDDO
2047 #endif /* SEAICE_VECTORIZE_LSR */
2048
2049
2050 #ifdef SEAICE_VECTORIZE_LSR
2051
4a08d54d3a Mart*2052 DO j=jMinLoc,jMax,jStep
032b010f0c Mart*2053 #endif /* SEAICE_VECTORIZE_LSR */
4a08d54d3a Mart*2054 DO i=iMin,iMax
2055 uIce(i,j,bi,bj)=uTmp(i,j,bi,bj)
2056 & +WFAU*(URT(i,j)-uTmp(i,j,bi,bj))
5fb12930f9 Mart*2057 ENDDO
2058 ENDDO
12dace3fd6 Mart*2059 #ifdef SEAICE_LSR_ZEBRA
8d9be9cde5 Mart*2060 ENDDO
12dace3fd6 Mart*2061 #endif /* SEAICE_LSR_ZEBRA */
5fb12930f9 Mart*2062
2063 RETURN
2064 END
2065
2066
2067
2068
2069
2070
2071 SUBROUTINE SEAICE_LSR_TRIDIAGV(
cbf501ab81 Jean*2072 I AV, BV, CV, vRt1, vRt2, rhsV, vTmp, seaiceMaskV, WFAV,
5fb12930f9 Mart*2073 U vIce,
8d9be9cde5 Mart*2074 I iMin, iMax, jMin, jMax, bi, bj, myTime, myIter, myThid )
5fb12930f9 Mart*2075
2076
2077
2078
2079
2080
2081
2082
2083
2084 IMPLICIT NONE
2085 #include "SIZE.h"
2086
2087
2088
2089
2090
2091
2092 _RL myTime
2093 INTEGER myIter
2094 INTEGER myThid
2095 INTEGER iMin, iMax, jMin, jMax, bi, bj
2096
2097 _RL AV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2098 _RL BV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2099 _RL CV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2100
2101 _RL vRt1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2102 _RL vRt2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2103
2104 _RL rhsV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
8df0ccd026 Jean*2105
2106 _RL vTmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
5fb12930f9 Mart*2107
2108 _RL vIce(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2109
2110 _RL seaiceMaskV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
2111
2112 _RL WFAV
2113
2114
2115
2116
2117
4a08d54d3a Mart*2118 INTEGER i,j,jM
032b010f0c Mart*2119 INTEGER iMinLoc, iStep
12dace3fd6 Mart*2120 #ifdef SEAICE_LSR_ZEBRA
4a08d54d3a Mart*2121 INTEGER k
032b010f0c Mart*2122 PARAMETER ( iStep = 2 )
2123 #else
2124 PARAMETER ( iStep = 1 )
12dace3fd6 Mart*2125 #endif /* SEAICE_LSR_ZEBRA */
7c0da9bbfa Mart*2126 _RL AA3, bet
5fb12930f9 Mart*2127 _RL VRT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
2128 _RL CVV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
2129
dadeed8422 Mart*2130
4a08d54d3a Mart*2131 DO j=1-OLy,sNy+OLy
2132 DO i=1-OLx,sNx+OLx
2133 VRT(i,j) = 0. _d 0
2134 CVV(i,j) = 0. _d 0
dadeed8422 Mart*2135 ENDDO
2136 ENDDO
12dace3fd6 Mart*2137 #ifdef SEAICE_LSR_ZEBRA
4a08d54d3a Mart*2138 DO k=0,1
2139 iMinLoc = iMin+k
032b010f0c Mart*2140 #else
2141 iMinLoc = iMin
12dace3fd6 Mart*2142 #endif /* SEAICE_LSR_ZEBRA */
8d9be9cde5 Mart*2143 #ifdef SEAICE_VECTORIZE_LSR
4a08d54d3a Mart*2144 DO j=jMin,jMax
2145 DO i=iMinLoc,iMax,iStep
8d9be9cde5 Mart*2146 #else
4a08d54d3a Mart*2147 DO i=iMinLoc,iMax,iStep
2148 DO j=jMin,jMax
8d9be9cde5 Mart*2149 #endif /* SEAICE_VECTORIZE_LSR */
5fb12930f9 Mart*2150 AA3 = 0. _d 0
4a08d54d3a Mart*2151 IF (j.EQ.jMin) AA3 = AA3 - AV(i,j,bi,bj)*vIce(i,j-1,bi,bj)
2152 IF (j.EQ.jMax) AA3 = AA3 - CV(i,j,bi,bj)*vIce(i,j+1,bi,bj)
5fb12930f9 Mart*2153
4a08d54d3a Mart*2154 VRT(i,j)=rhsV(i,j,bi,bj)
5fb12930f9 Mart*2155 & + AA3
4a08d54d3a Mart*2156 & + vRt1(i,j,bi,bj)*vIce(i-1,j,bi,bj)
2157 & + vRt2(i,j,bi,bj)*vIce(i+1,j,bi,bj)
2158 VRT(i,j)=VRT(i,j)* seaiceMaskV(i,j,bi,bj)
5fb12930f9 Mart*2159
032b010f0c Mart*2160
4a08d54d3a Mart*2161 CVV(i,j)=CV(i,j,bi,bj)
5fb12930f9 Mart*2162 ENDDO
8d9be9cde5 Mart*2163 #ifdef SEAICE_VECTORIZE_LSR
2164 ENDDO
4a08d54d3a Mart*2165 DO i=iMinLoc,iMax,iStep
8d9be9cde5 Mart*2166 #endif /* SEAICE_VECTORIZE_LSR */
4a08d54d3a Mart*2167 CVV(i,jMin)=CVV(i,jMin)/BV(i,jMin,bi,bj)
2168 VRT(i,jMin)=VRT(i,jMin)/BV(i,jMin,bi,bj)
8d9be9cde5 Mart*2169 #ifdef SEAICE_VECTORIZE_LSR
2170 ENDDO
2171
032b010f0c Mart*2172
4a08d54d3a Mart*2173 DO j=jMin+1,jMax
2174 jM=j-1
2175 DO i=iMinLoc,iMax,iStep
8d9be9cde5 Mart*2176 #else /* do not SEAICE_VECTORIZE_LSR */
032b010f0c Mart*2177
4a08d54d3a Mart*2178 DO j=jMin+1,jMax
2179 jM=j-1
8d9be9cde5 Mart*2180 #endif /* SEAICE_VECTORIZE_LSR */
4a08d54d3a Mart*2181 bet = BV(i,j,bi,bj)-AV(i,j,bi,bj)*CVV(i,jM)
2182 CVV(i,j) = CVV(i,j)/bet
2183 VRT(i,j) = (VRT(i,j)-AV(i,j,bi,bj)*VRT(i,jM))/bet
5fb12930f9 Mart*2184 ENDDO
8d9be9cde5 Mart*2185 #ifdef SEAICE_VECTORIZE_LSR
2186 ENDDO
2187
032b010f0c Mart*2188
4a08d54d3a Mart*2189 DO j=jMin,jMax-1
2190 jM=sNy-j
2191 DO i=iMinLoc,iMax,iStep
032b010f0c Mart*2192 #else
2193
4a08d54d3a Mart*2194 DO j=jMin,jMax-1
2195 jM=sNy-j
032b010f0c Mart*2196 #endif /* SEAICE_VECTORIZE_LSR */
4a08d54d3a Mart*2197 VRT(i,jM)=VRT(i,jM)-CVV(i,jM)*VRT(i,jM+1)
5fb12930f9 Mart*2198 ENDDO
032b010f0c Mart*2199 #ifdef SEAICE_VECTORIZE_LSR
2200 ENDDO
2201
2202
4a08d54d3a Mart*2203 DO j=jMin,jMax
2204 DO i=iMinLoc,iMax,iStep
032b010f0c Mart*2205 #else
4a08d54d3a Mart*2206 DO j=jMin,jMax
032b010f0c Mart*2207 #endif /* SEAICE_VECTORIZE_LSR */
4a08d54d3a Mart*2208 vIce(i,j,bi,bj)=vTmp(i,j,bi,bj)
2209 & +WFAV*(VRT(i,j)-vTmp(i,j,bi,bj))
5fb12930f9 Mart*2210 ENDDO
2211 ENDDO
12dace3fd6 Mart*2212 #ifdef SEAICE_LSR_ZEBRA
8d9be9cde5 Mart*2213 ENDDO
12dace3fd6 Mart*2214 #endif /* SEAICE_LSR_ZEBRA */
5fb12930f9 Mart*2215
b7c2bb63b7 Mart*2216 #endif /* SEAICE_CGRID */
2217
2218 RETURN
2219 END