File indexing completed on 2023-08-04 05:10:46 UTC
view on githubraw file Latest commit 45315406 on 2023-08-03 16:50:12 UTC
7e4f7741f6 Patr*0001 #include "SEAICE_OPTIONS.h"
0002
0003
0004 SUBROUTINE SEAICE_INIT_FIXED( myThid )
afaeb4fe62 Jean*0005
0006
0007
0008
0009
7e4f7741f6 Patr*0010 IMPLICIT NONE
afaeb4fe62 Jean*0011
7e4f7741f6 Patr*0012
0013 #include "SIZE.h"
0014 #include "EEPARAMS.h"
0015 #include "PARAMS.h"
0016 #include "GRID.h"
76d465095d Jean*0017 #include "FFIELDS.h"
03c669d1ab Jean*0018 #include "SEAICE_SIZE.h"
76d465095d Jean*0019 #include "SEAICE_PARAMS.h"
7e4f7741f6 Patr*0020 #include "SEAICE.h"
8bc8bee483 Gael*0021 #include "SEAICE_TRACER.h"
7e4f7741f6 Patr*0022
0023
0024
0025 INTEGER myThid
0026
afaeb4fe62 Jean*0027
7e4f7741f6 Patr*0028
86b84a92fc Patr*0029 #ifdef SEAICE_ITD
0030
0031 CHARACTER*(MAX_LEN_MBUF) msgBuf
0032
0033 INTEGER k
514a01235c Jean*0034 _RL tmpVar
541c48397a Mart*0035 LOGICAL computeHlimit
86b84a92fc Patr*0036 #endif
ed6012c5a0 Jean*0037
ec0d7df165 Mart*0038 INTEGER i, j, bi, bj
0320e25227 Mart*0039 INTEGER kSrf
8bc8bee483 Gael*0040 #ifdef ALLOW_SITRACER
0041 INTEGER iTracer
0042 #endif
c31ba56cf0 Jean*0043 #ifdef SHORTWAVE_HEATING
79f1f58b1f Patr*0044
88f72205aa Jean*0045
79f1f58b1f Patr*0046 _RL swfracba(2)
c31ba56cf0 Jean*0047 #endif /* SHORTWAVE_HEATING */
0320e25227 Mart*0048
0049 _RL dzSurf
45315406aa Mart*0050 #ifdef SEAICE_BGRID_DYNAMICS
5fe78992ba Mart*0051 _RL mask_uice
0052 #endif
7e4f7741f6 Patr*0053
0320e25227 Mart*0054 IF ( usingPCoords ) THEN
0055 kSrf = Nr
84cb676f82 Mart*0056 ELSE
0320e25227 Mart*0057 kSrf = 1
7e4f7741f6 Patr*0058 ENDIF
0059
afaeb4fe62 Jean*0060
0061 IF ( useMNC .AND.
0062 & (seaice_tave_mnc.OR.seaice_dump_mnc.OR.SEAICE_mon_mnc)
0063 & ) THEN
0064 CALL SEAICE_MNC_INIT( myThid )
0065 ENDIF
0066
514a01235c Jean*0067
0068 _BEGIN_MASTER(myThid)
0069
6cbc659de0 Mart*0070
e501eee760 Mart*0071 SEAICEmomStartBDF = 0
0072 IF ( SEAICEuseBDF2 ) SEAICEmomStartBDF = nIter0
6cbc659de0 Mart*0073
79f1f58b1f Patr*0074 #ifdef SHORTWAVE_HEATING
8e32c48b8f Mart*0075 IF ( usingZCoords ) THEN
0076 swfracba(1) = rF(1)
0077 swfracba(2) = rF(2)
0078 ELSE
0079
0080 swfracba(1) = -rF(Nr+1)*recip_rhoConst*recip_gravity
0081 swfracba(2) = -rF(Nr) *recip_rhoConst*recip_gravity
0082 ENDIF
c31ba56cf0 Jean*0083 CALL SWFRAC(
8e32c48b8f Mart*0084 I 2, oneRL,
79f1f58b1f Patr*0085 U swfracba,
8e32c48b8f Mart*0086 I oneRL, 0, myThid )
0087 SEAICE_SWFrac = swfracba(2)
c31ba56cf0 Jean*0088 #else /* SHORTWAVE_HEATING */
8e32c48b8f Mart*0089 SEAICE_SWFrac = 0. _d 0
c31ba56cf0 Jean*0090 #endif /* SHORTWAVE_HEATING */
03c669d1ab Jean*0091
1c278edd09 Jean*0092
0320e25227 Mart*0093 dzSurf = drF(kSrf)
0094 IF ( usingPCoords )
0095 & dzSurf = drF(kSrf) * recip_rhoConst * recip_gravity
1c278edd09 Jean*0096 IF ( SEAICE_mcPheePiston.EQ.UNSET_RL ) THEN
0097 IF ( SEAICE_availHeatFrac.NE.UNSET_RL ) THEN
0098 SEAICE_mcPheePiston = SEAICE_availHeatFrac
0320e25227 Mart*0099 & * dzSurf/SEAICE_deltaTtherm
1c278edd09 Jean*0100 ELSE
0101 SEAICE_mcPheePiston = MCPHEE_TAPER_FAC
0102 & * STANTON_NUMBER * USTAR_BASE
0103 SEAICE_mcPheePiston = MIN( SEAICE_mcPheePiston,
0320e25227 Mart*0104 & dzSurf/SEAICE_deltaTtherm )
1c278edd09 Jean*0105 ENDIF
0320e25227 Mart*0106
1c278edd09 Jean*0107 ENDIF
0108
8bc8bee483 Gael*0109
0110 #ifdef ALLOW_SITRACER
0111 DO iTracer = 1, SItrNumInUse
1c278edd09 Jean*0112
0113 IF (SItrName(iTracer).EQ.'one') THEN
8bc8bee483 Gael*0114 SItrFromOcean0(iTracer) =ONE
0115 SItrFromFlood0(iTracer) =ONE
0116 SItrExpand0(iTracer) =ONE
0117 SItrFromOceanFrac(iTracer) =ZERO
0118 SItrFromFloodFrac(iTracer) =ZERO
1c278edd09 Jean*0119 ENDIF
0120
0121 IF (SItrName(iTracer).EQ.'age') THEN
8bc8bee483 Gael*0122 SItrFromOcean0(iTracer) =ZERO
0123 SItrFromFlood0(iTracer) =ZERO
0124 SItrExpand0(iTracer) =ZERO
0125 SItrFromOceanFrac(iTracer) =ZERO
0126 SItrFromFloodFrac(iTracer) =ZERO
1c278edd09 Jean*0127 ENDIf
0128
0129 IF (SItrName(iTracer).EQ.'salinity') THEN
8bc8bee483 Gael*0130 SItrMate(iTracer) ='HEFF'
0131 SItrExpand0(iTracer) =ZERO
1c278edd09 Jean*0132 IF ( SEAICE_salinityTracer ) THEN
0133 SEAICE_salt0 = ZERO
0134 SEAICE_saltFrac = ZERO
0135 ENDIF
0136 ENDIF
0137
0138 IF (SItrName(iTracer).EQ.'ridge') THEN
8bc8bee483 Gael*0139 SItrMate(iTracer) ='AREA'
0140 SItrFromOcean0(iTracer) =ZERO
0141 SItrFromFlood0(iTracer) =ZERO
0142 SItrExpand0(iTracer) =ZERO
0143 SItrFromOceanFrac(iTracer) =ZERO
0144 SItrFromFloodFrac(iTracer) =ZERO
1c278edd09 Jean*0145 ENDIF
f61838dfc1 Torg*0146 #ifdef SEAICE_GREASE
0147
0148
0149 IF (SItrName(iTracer).EQ.'grease') THEN
0150 SItrMate(iTracer) ='HEFF'
0151 SItrFromOcean0(iTracer) =ZERO
0152 SItrFromFlood0(iTracer) =ZERO
0153 SItrExpand0(iTracer) =ZERO
0154 SItrFromOceanFrac(iTracer) =ZERO
0155 SItrFromFloodFrac(iTracer) =ZERO
0156 ENDIF
0157 #endif /* SEAICE_GREASE */
8bc8bee483 Gael*0158 ENDDO
f61838dfc1 Torg*0159 #endif /* ALLOW_SITRACER */
8bc8bee483 Gael*0160
86b84a92fc Patr*0161 #ifdef SEAICE_ITD
541c48397a Mart*0162
0163 Hlimit(0) = 0. _d 0
0164
0165 Hlimit(nITD) = 999.9 _d 0
0166 computeHlimit=.FALSE.
0167
0168 DO k = 1, nITD
0169 IF ( Hlimit(k).EQ.UNSET_RL ) computeHlimit=.TRUE.
0170 IF ( Hlimit(k).LE.Hlimit(k-1) ) computeHlimit=.TRUE.
0171 ENDDO
0172 IF ( computeHlimit ) THEN
22c740e9fe Mart*0173 WRITE(msgBuf,'(A,I2,A)') 'SEAICE_INIT_FIXED: Computing ',
541c48397a Mart*0174 & nITD, ' thickness category limits with'
0175 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0176 & SQUEEZE_RIGHT, myThid )
22c740e9fe Mart*0177 CALL WRITE_0D_RL( Hlimit_c1 ,INDEX_NONE,
0178 & 'Hlimit_c1 =', ' /* ITD bin parameter */')
0179 CALL WRITE_0D_RL( Hlimit_c2 ,INDEX_NONE,
0180 & 'Hlimit_c2 =', ' /* ITD bin parameter */')
0181 CALL WRITE_0D_RL( Hlimit_c3 ,INDEX_NONE,
0182 & 'Hlimit_c3 =', ' /* ITD bin parameter */')
0183 WRITE(msgBuf,'(A)') ' '
541c48397a Mart*0184 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0185 & SQUEEZE_RIGHT, myThid )
86b84a92fc Patr*0186
0187
0188
0189
becfda7837 Torg*0190
0191
0192
0193
541c48397a Mart*0194 IF ( nITD.GT.1 ) THEN
0195 tmpVar = nITD
0196 tmpVar = oneRL / tmpVar
0197 Hlimit_c1 = Hlimit_c1*tmpVar
0198 Hlimit_c2 = Hlimit_c2*Hlimit_c1
0199 DO k=1,nITD-1
0200 Hlimit(k) = Hlimit(k-1)
0201 & + Hlimit_c1
0202 & + Hlimit_c2
0203 & *( oneRL + TANH( Hlimit_c3 *( FLOAT(k-1)*tmpVar - oneRL ) ) )
0204 ENDDO
0205 ENDIF
86b84a92fc Patr*0206 ENDIF
0207
514a01235c Jean*0208 Hlimit(nITD) = 999.9 _d 0
86b84a92fc Patr*0209
514a01235c Jean*0210 #endif /* SEAICE_ITD */
86b84a92fc Patr*0211
514a01235c Jean*0212
0213 _END_MASTER(myThid)
84cb676f82 Mart*0214
ab972c4b6b Mart*0215 #ifdef SEAICE_ALLOW_JFNK
514a01235c Jean*0216
0217 _BEGIN_MASTER(myThid)
ab972c4b6b Mart*0218
0219 totalNewtonIters = 0
0220 totalNewtonFails = 0
0221 totalKrylovIters = 0
0222 totalKrylovFails = 0
0223 totalJFNKtimeSteps = 0
514a01235c Jean*0224 _END_MASTER(myThid)
438b73e6d6 Mart*0225
0226
c363713d9d Jean*0227
438b73e6d6 Mart*0228
0229
0230
0231
c363713d9d Jean*0232
438b73e6d6 Mart*0233
0234
0235
0236
ab972c4b6b Mart*0237 #endif /* SEAICE_ALLOW_JFNK */
0238
514a01235c Jean*0239
0240 _BARRIER
0241
84cb676f82 Mart*0242 #ifdef ALLOW_DIAGNOSTICS
0243 IF ( useDiagnostics ) THEN
0244 CALL SEAICE_DIAGNOSTICS_INIT( myThid )
0245 ENDIF
0246 #endif
0247
1ed503f8a3 Gael*0248
0249 CALL SEAICE_SUMMARY( myThid )
03c669d1ab Jean*0250
ec0d7df165 Mart*0251
0252
0253
0254 DO bj=myByLo(myThid),myByHi(myThid)
0255 DO bi=myBxLo(myThid),myBxHi(myThid)
148dd84005 jm-c 0256
ec0d7df165 Mart*0257 DO j=1-OLy,sNy+OLy
0258 DO i=1-OLx,sNx+OLx
0259 HEFFM (i,j,bi,bj) = 0. _d 0
0260 SIMaskU(i,j,bi,bj) = 0. _d 0
0261 SIMaskV(i,j,bi,bj) = 0. _d 0
0262 ENDDO
0263 ENDDO
0264 DO j=1-OLy,sNy+OLy
0265 DO i=1-OLx,sNx+OLx
0320e25227 Mart*0266 HEFFM (i,j,bi,bj) = maskC(i,j,kSrf,bi,bj)
0267 SIMaskU(i,j,bi,bj) = maskW(i,j,kSrf,bi,bj)
0268 SIMaskV(i,j,bi,bj) = maskS(i,j,kSrf,bi,bj)
ec0d7df165 Mart*0269 ENDDO
0270 ENDDO
45315406aa Mart*0271 #ifdef SEAICE_BGRID_DYNAMICS
ec0d7df165 Mart*0272 DO j=1-OLy+1,sNy+OLy
0273 DO i=1-OLx+1,sNx+OLx
0274 UVM(i,j,bi,bj)=0. _d 0
0275 mask_uice=HEFFM(i,j, bi,bj)+HEFFM(i-1,j-1,bi,bj)
0276 & +HEFFM(i,j-1,bi,bj)+HEFFM(i-1,j, bi,bj)
0277 IF(mask_uice.GT.3.5 _d 0) UVM(i,j,bi,bj)=1. _d 0
0278 ENDDO
0279 ENDDO
45315406aa Mart*0280 #endif
ec0d7df165 Mart*0281
0282
0283 #ifdef SEAICE_CGRID
0284 DO j=1-OLy,sNy+OLy
0285 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0286 k1AtC(i,j,bi,bj) = 0.0 _d 0
0287 k1AtZ(i,j,bi,bj) = 0.0 _d 0
0288 k2AtC(i,j,bi,bj) = 0.0 _d 0
0289 k2AtZ(i,j,bi,bj) = 0.0 _d 0
ec0d7df165 Mart*0290 ENDDO
0291 ENDDO
0292 IF ( usingSphericalPolarGrid .AND. SEAICEuseMetricTerms ) THEN
0293
0294
0295
0296
0297
0298
0299 DO j=1-OLy,sNy+OLy
0300 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0301 k2AtC(i,j,bi,bj) = - _tanPhiAtU(i,j,bi,bj)*recip_rSphere
0302 k2AtZ(i,j,bi,bj) = - _tanPhiAtV(i,j,bi,bj)*recip_rSphere
ec0d7df165 Mart*0303 ENDDO
0304 ENDDO
0305 ELSEIF ( usingCurvilinearGrid .AND. SEAICEuseMetricTerms ) THEN
0306
0307
0308 DO j=1-OLy,sNy+OLy
0309 DO i=1-OLx,sNx+OLx-1
5fe78992ba Mart*0310 k1AtC(i,j,bi,bj) = _recip_dyF(i,j,bi,bj)
0311 & * ( _dyG(i+1,j,bi,bj) - _dyG(i,j,bi,bj) )
0312 & * _recip_dxF(i,j,bi,bj)
ec0d7df165 Mart*0313 ENDDO
0314 ENDDO
0315 DO j=1-OLy,sNy+OLy
0316 DO i=1-OLx+1,sNx+OLx
5fe78992ba Mart*0317 k1AtZ(i,j,bi,bj) = _recip_dyU(i,j,bi,bj)
0318 & * ( _dyC(i,j,bi,bj) - _dyC(i-1,j,bi,bj) )
0319 & * _recip_dxV(i,j,bi,bj)
ec0d7df165 Mart*0320 ENDDO
0321 ENDDO
0322 DO j=1-OLy,sNy+OLy-1
0323 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0324 k2AtC(i,j,bi,bj) = _recip_dxF(i,j,bi,bj)
0325 & * ( _dxG(i,j+1,bi,bj) - _dxG(i,j,bi,bj) )
0326 & * _recip_dyF(i,j,bi,bj)
ec0d7df165 Mart*0327 ENDDO
0328 ENDDO
0329 DO j=1-OLy+1,sNy+OLy
0330 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0331 k2AtZ(i,j,bi,bj) = _recip_dxV(i,j,bi,bj)
0332 & * ( _dxC(i,j,bi,bj) - _dxC(i,j-1,bi,bj) )
0333 & * _recip_dyU(i,j,bi,bj)
ec0d7df165 Mart*0334 ENDDO
0335 ENDDO
0336 ENDIF
45315406aa Mart*0337 #endif /* SEAICE_CGRID */
0338
0339 #ifdef SEAICE_BGRID_DYNAMICS
ec0d7df165 Mart*0340 DO j=1-OLy,sNy+OLy
0341 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0342 k1AtC(i,j,bi,bj) = 0.0 _d 0
0343 k1AtU(i,j,bi,bj) = 0.0 _d 0
0344 k1AtV(i,j,bi,bj) = 0.0 _d 0
0345 k2AtC(i,j,bi,bj) = 0.0 _d 0
0346 k2AtU(i,j,bi,bj) = 0.0 _d 0
0347 k2AtV(i,j,bi,bj) = 0.0 _d 0
ec0d7df165 Mart*0348 ENDDO
0349 ENDDO
0350 IF ( usingSphericalPolarGrid .AND. SEAICEuseMetricTerms ) THEN
0351
0352
0353
0354
0355
0356
0357 DO j=1-OLy,sNy+OLy
0358 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0359 k2AtC(i,j,bi,bj) = - _tanPhiAtU(i,j,bi,bj)*recip_rSphere
0360 k2AtU(i,j,bi,bj) = - _tanPhiAtU(i,j,bi,bj)*recip_rSphere
0361 k2AtV(i,j,bi,bj) = - _tanPhiAtV(i,j,bi,bj)*recip_rSphere
ec0d7df165 Mart*0362 ENDDO
0363 ENDDO
0364 ELSEIF ( usingCurvilinearGrid .AND. SEAICEuseMetricTerms ) THEN
0365
0366
0367 DO j=1-OLy,sNy+OLy
0368 DO i=1-OLx,sNx+OLx-1
5fe78992ba Mart*0369 k1AtC(i,j,bi,bj) = _recip_dyF(i,j,bi,bj)
0370 & * ( _dyG(i+1,j,bi,bj) - _dyG(i,j,bi,bj) )
0371 & * _recip_dxF(i,j,bi,bj)
ec0d7df165 Mart*0372 ENDDO
0373 ENDDO
0374 DO j=1-OLy,sNy+OLy
0375 DO i=1-OLx+1,sNx+OLx
5fe78992ba Mart*0376 k1AtU(i,j,bi,bj) = _recip_dyG(i,j,bi,bj)
0377 & * ( _dyF(i,j,bi,bj) - _dyF(i-1,j,bi,bj) )
0378 & * _recip_dxC(i,j,bi,bj)
ec0d7df165 Mart*0379 ENDDO
0380 ENDDO
0381 DO j=1-OLy,sNy+OLy
0382 DO i=1-OLx,sNx+OLx-1
5fe78992ba Mart*0383 k1AtV(i,j,bi,bj) = _recip_dyC(i,j,bi,bj)
0384 & * ( _dyU(i+1,j,bi,bj) - _dyU(i,j,bi,bj) )
0385 & * _recip_dxG(i,j,bi,bj)
ec0d7df165 Mart*0386 ENDDO
0387 ENDDO
0388 DO j=1-OLy,sNy+OLy-1
0389 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0390 k2AtC(i,j,bi,bj) = _recip_dxF(i,j,bi,bj)
0391 & * ( _dxG(i,j+1,bi,bj) - _dxG(i,j,bi,bj) )
0392 & * _recip_dyF(i,j,bi,bj)
ec0d7df165 Mart*0393 ENDDO
0394 ENDDO
0395 DO j=1-OLy,sNy+OLy-1
0396 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0397 k2AtU(i,j,bi,bj) = _recip_dxC(i,j,bi,bj)
0398 & * ( _dxV(i,j+1,bi,bj) - _dxV(i,j,bi,bj) )
0399 & * _recip_dyG(i,j,bi,bj)
ec0d7df165 Mart*0400 ENDDO
0401 ENDDO
0402 DO j=1-OLy+1,sNy+OLy
0403 DO i=1-OLx,sNx+OLx
5fe78992ba Mart*0404 k2AtV(i,j,bi,bj) = _recip_dxG(i,j,bi,bj)
0405 & * ( _dxF(i,j,bi,bj) - _dxF(i,j-1,bi,bj) )
0406 & * _recip_dyC(i,j,bi,bj)
ec0d7df165 Mart*0407 ENDDO
0408 ENDDO
0409 ENDIF
45315406aa Mart*0410
0411 DO j=1-OLy,sNy+OLy
0412 DO i=1-OLx,sNx+OLx
0413 KGEO(i,j,bi,bj) = 0
0414 ENDDO
0415 ENDDO
0416 DO j=1-OLy,sNy+OLy
0417 DO i=1-OLx,sNx+OLx
0418 #ifdef SEAICE_BICE_STRESS
0419 KGEO(i,j,bi,bj) = 1
0420 #else /* SEAICE_BICE_STRESS */
0421 IF (klowc(i,j,bi,bj) .LT. 2) THEN
0422 KGEO(i,j,bi,bj) = 1
0423 ELSE
0424 KGEO(i,j,bi,bj) = 2
0425 DO WHILE ( abs(rC(KGEO(i,j,bi,bj))) .LT. 50.0 _d 0 .AND.
0426 & KGEO(i,j,bi,bj) .LT. (klowc(i,j,bi,bj)-1) )
0427 KGEO(i,j,bi,bj) = KGEO(i,j,bi,bj) + 1
0428 ENDDO
0429 ENDIF
0430 #endif /* SEAICE_BICE_STRESS */
0431 ENDDO
0432 ENDDO
0433 #endif /* SEAICE_BGRID_DYNAMICS */
148dd84005 jm-c 0434
ec0d7df165 Mart*0435 ENDDO
0436 ENDDO
0437
148dd84005 jm-c 0438 #ifdef ALLOW_SHELFICE
0439 IF ( useShelfIce ) THEN
0440 DO bj=myByLo(myThid),myByHi(myThid)
0441 DO bi=myBxLo(myThid),myBxHi(myThid)
0442
0443 CALL SHELFICE_MASK_SEAICE(
0444 U HEFFM,
0445 I bi, bj, -1, myThid )
0446 DO j=2-OLy,sNy+OLy
0447 DO i=2-OLx,sNx+OLx
0448 IF ( HEFFM(i-1,j,bi,bj).EQ.zeroRL .OR.
0449 & HEFFM( i, j,bi,bj).EQ.zeroRL )
0450 & SIMaskU(i,j,bi,bj) = zeroRL
0451 IF ( HEFFM(i,j-1,bi,bj).EQ.zeroRL .OR.
0452 & HEFFM(i, j, bi,bj).EQ.zeroRL )
0453 & SIMaskV(i,j,bi,bj) = zeroRL
0454 ENDDO
0455 ENDDO
0456 ENDDO
0457 ENDDO
0458 CALL EXCH_UV_XY_RL( SIMaskU, SIMaskV, .FALSE., myThid )
0459 ENDIF
0460 #endif /* ALLOW_SHELFICE */
0461
7e4f7741f6 Patr*0462 RETURN
0463 END