File indexing completed on 2021-06-27 05:11:49 UTC
view on githubraw file Latest commit 4e4ad91a on 2021-06-26 16:30:07 UTC
1cf549c217 Mart*0001 #include "SEAICE_OPTIONS.h"
0002
0003
0004
0005
0006 SUBROUTINE SEAICE_DO_RIDGING(
0007 I bi, bj, myTime, myIter, myThid )
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 IMPLICIT NONE
0023
0024 #include "SIZE.h"
0025 #include "EEPARAMS.h"
0026 #include "PARAMS.h"
0027 #include "GRID.h"
0028 #include "SEAICE_SIZE.h"
0029 #include "SEAICE_PARAMS.h"
0030 #include "SEAICE.h"
0031
0032
0033
0034
0035
0036
0037
0038 _RL myTime
0039 INTEGER bi,bj
0040 INTEGER myIter
0041 INTEGER myThid
0042
0043
0044
0045
0046
0047
0048
0049 INTEGER i, j
0050 INTEGER iMin, iMax, jMin, jMax
0051 #ifdef SEAICE_ITD
0052 INTEGER k, l, n
0053 _RL ridgingModeNorm (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0054 _RL partFunc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,0:nITD)
0055
0056
0057
0058
0059 _RL hrMin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
0060 _RL hrMax (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
0061 _RL hrExp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
0062 _RL ridgeRatio (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
353a8877c7 Mart*0063
37d4930619 Jean*0064 _RL hActual (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
1cf549c217 Mart*0065
0066 _RL openWater (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0067 _RL netArea (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0068
0069 _RL openingRate (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0070 _RL closingRate (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0071 _RL grossClosing (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0072
0073 _RL ridgingArea (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0074 _RL ridgingHeff (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0075 _RL ridgingHsnw (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0076
0077 _RL areaFraction (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0078 _RL volFraction (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0079
0080 _RL ridgedArea (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0081 LOGICAL doRidging (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0082 LOGICAL doRidgeAgain, areaTooLarge
0083
0084 _RL recip_deltaT, convergence, divergence, shear, divAdv
0085 _RL tmp, tmpFac, hL, hR, expL, expR
37d4930619 Jean*0086 _RL areaPR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
0087 _RL heffPR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
0088 _RL hsnwPR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
0089
badaa21155 Mart*0090 CHARACTER*(MAX_LEN_MBUF) msgBuf
1cf549c217 Mart*0091 #endif /* SEAICE_ITD */
0092
0093
0094
0095
0096 iMin=1
0097 iMax=sNx
0098 jMin=1
0099 jMax=sNy
37d4930619 Jean*0100 #ifndef SEAICE_ITD
1cf549c217 Mart*0101
0102 DO j=jMin,jMax
0103 DO i=iMin,iMax
4e4ad91a39 Jean*0104 AREA(i,j,bi,bj) = MIN(AREA(i,j,bi,bj),SEAICE_area_max)
1cf549c217 Mart*0105 ENDDO
0106 ENDDO
0107 #else
0108
0109 DO j=jMin,jMax
0110 DO i=iMin,iMax
0111 openWater(i,j) = ONE
0112 ENDDO
0113 ENDDO
0114 DO k=1,nITD
0115 DO j=jMin,jMax
0116 DO i=iMin,iMax
0117 openWater(i,j) = openWater(i,j) - AREAITD(i,j,k,bi,bj)
0118 ENDDO
0119 ENDDO
0120 ENDDO
0121 IF ( SEAICEsimpleRidging ) THEN
0122
0123
0124
37d4930619 Jean*0125
1cf549c217 Mart*0126 DO j=jMin,jMax
0127 DO i=iMin,iMax
0128 IF (openWater(i,j) .lt. 0.0)
0129 & AREAITD(i,j,1,bi,bj) = openWater(i,j)+AREAITD(i,j,1,bi,bj)
0130 ENDDO
0131 ENDDO
0132
0133 ELSE
353a8877c7 Mart*0134
0135 DO j=jMin,jMax
0136 DO i=iMin,iMax
0137 ridgingArea(i,j) = 0. _d 0
0138 ridgingHeff(i,j) = 0. _d 0
0139 ridgingHsnw(i,j) = 0. _d 0
0140 areaFraction(i,j) = 0. _d 0
0141 volFraction(i,j) = 0. _d 0
0142 fw2ObyRidge(i,j,bi,bj) = 0. _d 0
06c98f766d Mart*0143 ridgedArea(i,j) = 0. _d 0
353a8877c7 Mart*0144 ENDDO
0145 ENDDO
0146 CALL SEAICE_PREPARE_RIDGING(
0147 O hActual,
0148 O hrMin, hrMax, hrExp, ridgeRatio, ridgingModeNorm, partFunc,
0149 I iMin, iMax, jMin, jMax, bi, bj, myTime, myIter, myThid )
1cf549c217 Mart*0150
0151
0152
0153 DO j=jMin,jMax
0154 DO i=iMin,iMax
0155 divergence = e11(i,j,bi,bj) + e22(i,j,bi,bj)
0156 shear = 0.5 _d 0 * ( deltaC(i,j,bi,bj) - ABS(divergence) )
0157 convergence = - MIN(divergence, 0.D0)
0158 closingRate(i,j) = SEAICEshearParm*shear + convergence
0159 ENDDO
0160 ENDDO
37d4930619 Jean*0161
1cf549c217 Mart*0162
0163 DO j=jMin,jMax
0164 DO i=iMin,iMax
0165 netArea(i,j) = 0. _d 0
0166 ENDDO
0167 ENDDO
0168 DO k=1,nITD
0169 DO j=jMin,jMax
0170 DO i=iMin,iMax
0171 netArea(i,j) = netArea(i,j) + AREAITD(i,j,k,bi,bj)
0172 ENDDO
0173 ENDDO
0174 ENDDO
0175 recip_DeltaT = 1. _d 0/SEAICE_deltaTtherm
0176 DO j=jMin,jMax
0177 DO i=iMin,iMax
37d4930619 Jean*0178
0179
1cf549c217 Mart*0180
0181 divAdv = (1. _d 0-netArea(i,j)-opnWtrFrac(i,j,bi,bj))
0182 & *recip_deltaT
37d4930619 Jean*0183 IF (divAdv .LT. 0. _d 0)
1cf549c217 Mart*0184 & closingRate(i,j) = MAX(closingRate(i,j), -divAdv)
badaa21155 Mart*0185
0186
1cf549c217 Mart*0187 openingRate(i,j) = closingRate(i,j) + divAdv
0188 ENDDO
0189 ENDDO
0190
0191
0192
0193 doRidgeAgain = .TRUE.
0194 n = 1
0195 DO WHILE (doRidgeAgain)
0196
0197 DO k=1,nITD
0198 DO j=jMin,jMax
0199 DO i=iMin,iMax
0200 areaPR(i,j,k) = AREAITD(i,j,k,bi,bj)
badaa21155 Mart*0201 heffPR(i,j,k) = HEFFITD(i,j,k,bi,bj)
0202 hsnwPR(i,j,k) = HSNOWITD(i,j,k,bi,bj)
37d4930619 Jean*0203
1cf549c217 Mart*0204
0205
0206 ENDDO
0207 ENDDO
0208 ENDDO
37d4930619 Jean*0209
1cf549c217 Mart*0210 DO j=jMin,jMax
0211 DO i=iMin,iMax
0212
0213
0214
0215 grossClosing(i,j) = closingRate(i,j)*SEAICE_deltaTtherm
0216 & /ridgingModeNorm(i,j)
0217
0218 IF ( partFunc(i,j,0) .GT. 0. _d 0 ) THEN
0219 tmp = partFunc(i,j,0)*grossClosing(i,j)
0220 IF ( tmp .GT. opnWtrFrac(i,j,bi,bj) ) THEN
0221 tmpFac = opnWtrFrac(i,j,bi,bj)/tmp
0222 grossClosing(i,j) = grossClosing(i,j) * tmpFac
0223 openingRate(i,j) = openingRate(i,j) * tmpFac
0224 ENDIF
0225 ENDIF
0226 ENDDO
0227 ENDDO
0228 DO k=1,nITD
0229 DO j=jMin,jMax
0230 DO i=iMin,iMax
0231
37d4930619 Jean*0232 IF ( areaPR(i,j,k) .GT. SEAICE_area_reg
1cf549c217 Mart*0233 & .AND. partFunc(i,j,k) .GT. 0. _d 0 ) THEN
0234 tmp = partFunc(i,j,k)*grossClosing(i,j)
0235 IF ( tmp .GT. AREAITD(i,j,k,bi,bj) ) THEN
0236 tmpFac = AREAITD(i,j,k,bi,bj)/tmp
0237 grossClosing(i,j) = grossClosing(i,j) * tmpFac
0238 openingRate(i,j) = openingRate(i,j) * tmpFac
0239 ENDIF
0240 ENDIF
0241 ENDDO
0242 ENDDO
0243 ENDDO
0244
0245
37d4930619 Jean*0246
1cf549c217 Mart*0247 DO j=jMin,jMax
0248 DO i=iMin,iMax
0249
37d4930619 Jean*0250 opnWtrFrac(i,j,bi,bj) = opnWtrFrac(i,j,bi,bj)
1cf549c217 Mart*0251 & - partFunc(i,j,0)*grossClosing(i,j)
0252 & + openingRate(i,j)*SEAICE_deltaTtherm
badaa21155 Mart*0253
0254
0255 opnWtrFrac(i,j,bi,bj) = MAX( 0. _d 0, opnWtrFrac(i,j,bi,bj) )
1cf549c217 Mart*0256 ENDDO
0257 ENDDO
37d4930619 Jean*0258
1cf549c217 Mart*0259 DO k=1,nITD
0260
0261 DO j=jMin,jMax
0262 DO i=iMin,iMax
0263 doRidging(i,j) = areaPR(i,j,k) .GT. SEAICE_area_reg
37d4930619 Jean*0264 & .AND. partFunc(i,j,k) .GT. 0. _d 0
1cf549c217 Mart*0265 & .AND. grossClosing(i,j) .GT. 0. _d 0
0266 & .AND. HEFFM(i,j,bi,bj) .GT. 0. _d 0
0267
0268
0269 IF ( doRidging(i,j) ) THEN
0270
0271
0272 ridgingArea(i,j) = partFunc(i,j,k)*grossClosing(i,j)
37d4930619 Jean*0273 IF ( ridgingArea(i,j) .GT. areaPR(i,j,k) ) THEN
1cf549c217 Mart*0274 ridgingArea(i,j) = areaPR(i,j,k)
0275 ENDIF
0276 areaFraction(i,j) = ridgingArea(i,j)/areaPR(i,j,k)
0277 ridgedArea(i,j) = ridgingArea(i,j)/ridgeRatio(i,j,k)
0278
0279
badaa21155 Mart*0280 ridgingHEFF(i,j) = heffPR(i,j,k) * areaFraction(i,j)
0281 ridgingHsnw(i,j) = hsnwPR(i,j,k) * areaFraction(i,j)
1cf549c217 Mart*0282
37d4930619 Jean*0283
1cf549c217 Mart*0284
37d4930619 Jean*0285 fw2ObyRidge(i,j,bi,bj) = fw2ObyRidge(i,j,bi,bj)
1cf549c217 Mart*0286 & + SEAICE_rhoSnow*ridgingHsnw(i,j)
0287 & *(1. _d 0 - SEAICEsnowFracRidge)
0288
0289 ridgingHsnw(i,j) = ridgingHsnw(i,j) * SEAICEsnowFracRidge
0290
0291
0292 AREAITD(i,j,k,bi,bj) = AREAITD(i,j,k,bi,bj) - ridgingArea(i,j)
0293 HEFFITD(i,j,k,bi,bj) = HEFFITD(i,j,k,bi,bj) - ridgingHeff(i,j)
0294 HSNOWITD(i,j,k,bi,bj)=HSNOWITD(i,j,k,bi,bj) - ridgingHsnw(i,j)
0295 ENDIF
0296 ENDDO
0297 ENDDO
37d4930619 Jean*0298
1cf549c217 Mart*0299
0300 DO l=1,nITD
06c98f766d Mart*0301
0302
1cf549c217 Mart*0303 DO j=jMin,jMax
0304 DO i=iMin,iMax
0305 areaFraction(i,j) = 0. _d 0
0306 volFraction (i,j) = 0. _d 0
0307 ENDDO
0308 ENDDO
0309 IF ( SEAICEredistFunc .EQ. 0 ) THEN
0310
0311
0312 DO j=jMin,jMax
0313 DO i=iMin,iMax
0314 IF ( doRidging(i,j) ) THEN
0315 IF ( hrMin(i,j,k) .GE. hLimit(l) .OR.
0316 & hrMax(i,j,k) .LE. hLimit(l-1) ) THEN
0317
0318
0319 areaFraction(i,j) = 0. _d 0
0320 volFraction (i,j) = 0. _d 0
0321 ELSE
0322 hL = MAX(hrMin(i,j,k), hLimit(l-1))
0323 hR = MIN(hrMax(i,j,k), hLimit(l))
37d4930619 Jean*0324 areaFraction(i,j) = ( hR - hL )
1cf549c217 Mart*0325 & / ( hrMax(i,j,k) - hrMin(i,j,k) )
37d4930619 Jean*0326
1cf549c217 Mart*0327
37d4930619 Jean*0328 volFraction (i,j) = areaFraction(i,j)*( hR + hL )
1cf549c217 Mart*0329 & / ( hrMax(i,j,k) + hrMin(i,j,k) )
0330 ENDIF
0331 ENDIF
0332 ENDDO
0333 ENDDO
0334 ELSEIF ( SEAICEredistFunc .EQ. 1 ) THEN
0335
0336
0337 IF ( l.LT.nITD ) THEN
0338 DO j=jMin,jMax
0339 DO i=iMin,iMax
37d4930619 Jean*0340 IF ( doRidging(i,j)
0341 & .AND. hrMin(i,j,k) .LT. hLimit(l)
1cf549c217 Mart*0342 & .AND. hrExp(i,j,k) .NE. 0. _d 0 ) THEN
0343 hL = MAX( hrMin(i,j,k), hLimit(l-1) )
0344 hR = hLimit(l)
0345 expL = EXP(-( hL - hrMin(i,j,k) )/hrExp(i,j,k) )
0346 expR = EXP(-( hR - hrMin(i,j,k) )/hrExp(i,j,k) )
0347 areaFraction(i,j) = expL - expR
0348 volFraction (i,j) =
0349 & ( ( hL + hrExp(i,j,k) ) * expL
0350 & - ( hR + hrExp(i,j,k) ) * expR )
0351 & / ( hrMin(i,j,k) + hrExp(i,j,k) )
0352 ENDIF
0353 ENDDO
0354 ENDDO
0355 ELSE
0356 DO j=jMin,jMax
0357 DO i=iMin,iMax
0358 IF ( doRidging(i,j) .AND. hrExp(i,j,k) .NE. 0. _d 0 ) THEN
0359 hL = MAX( hrMin(i,j,k), hLimit(l-1) )
0360 expL = EXP(-( hL - hrMin(i,j,k) )/hrExp(i,j,k) )
0361 areaFraction(i,j) = expL
0362 volFraction (i,j) = ( hL + hrExp(i,j,k) ) * expL
0363 & / ( hrMin(i,j,k) + hrExp(i,j,k) )
0364 ENDIF
0365 ENDDO
0366 ENDDO
0367 ENDIF
37d4930619 Jean*0368 ENDIF
0369
1cf549c217 Mart*0370 DO j=jMin,jMax
0371 DO i=iMin,iMax
0372 AREAITD(i,j,l,bi,bj) = AREAITD(i,j,l,bi,bj)
badaa21155 Mart*0373 & +areaFraction(i,j)*ridgedArea(i,j)
1cf549c217 Mart*0374 HEFFITD(i,j,l,bi,bj) = HEFFITD(i,j,l,bi,bj)
0375 & +volFraction(i,j)*ridgingHeff(i,j)
0376 HSNOWITD(i,j,l,bi,bj) = HSNOWITD(i,j,l,bi,bj)
badaa21155 Mart*0377 & +volFraction(i,j)*ridgingHsnw(i,j)*SEAICEsnowFracRidge
1cf549c217 Mart*0378 ENDDO
0379 ENDDO
0380
0381 ENDDO
0382
0383 ENDDO
0384
0385
0386 DO j=jMin,jMax
0387 DO i=iMin,iMax
0388 netArea(i,j) = 0. _d 0
0389 ENDDO
0390 ENDDO
0391 DO k=1,nITD
0392 DO j=jMin,jMax
0393 DO i=iMin,iMax
0394 netArea(i,j) = netArea(i,j) + AREAITD(i,j,k,bi,bj)
0395 ENDDO
0396 ENDDO
0397 ENDDO
0398 doRidgeAgain = .FALSE.
0399 DO j=jMin,jMax
0400 DO i=iMin,iMax
0401 tmp = netArea(i,j)+opnWtrFrac(i,j,bi,bj)
0402 areaTooLarge = tmp - 1. _d 0 .GT. 1. _d -11
0403 IF ( HEFFM(i,j,bi,bj) .GT. 0. _d 0 .AND. areaTooLarge ) THEN
0404 doRidging(i,j) = .TRUE.
0405 doRidgeAgain = .TRUE.
0406 divAdv = (1. _d 0-tmp)*recip_deltaT
badaa21155 Mart*0407 closingRate(i,j) = MAX( 0. _d 0, -divAdv)
0408 openingRate(i,j) = MAX( 0. _d 0, divAdv)
0409 ELSE
0410
0411 closingRate(i,j) = 0. _d 0
0412 openingRate(i,j) = 0. _d 0
44114fe2bb Mart*0413 doRidging(i,j) = .FALSE.
1cf549c217 Mart*0414 ENDIF
0415 ENDDO
0416 ENDDO
badaa21155 Mart*0417 IF ( doRidgeAgain .AND. n.GE.SEAICEridgingIterMax ) THEN
0418
0419 WRITE(msgBuf,'(A)') 'SEAICE_DO_RIDGING: *** WARNING ***'
0420 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0421 & SQUEEZE_RIGHT, myThid )
0422 WRITE(msgBuf,'(A,I2,A)') 'SEAICE_DO_RIDGING: '//
37d4930619 Jean*0423 & 'did not converge in SEAICEridgingIterMax = ',
badaa21155 Mart*0424 & SEAICEridgingIterMax, ' iterations.'
0425 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0426 & SQUEEZE_RIGHT, myThid )
0427
0428 ENDIF
1cf549c217 Mart*0429 doRidgeAgain = doRidgeAgain .AND. n.LT.SEAICEridgingIterMax
badaa21155 Mart*0430 IF ( doRidgeAgain .AND. debugLevel .GE. debLevA ) THEN
0431
37d4930619 Jean*0432 WRITE(msgBuf,'(A,I2,A,I10)')
badaa21155 Mart*0433 & 'SEAICE_DO_RIDGING: Repeat ridging after iteration ',
0434 & n, ' in timestep ', myIter
0435 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0436 & SQUEEZE_RIGHT, myThid )
0437 ENDIF
1cf549c217 Mart*0438 IF ( doRidgeAgain ) CALL SEAICE_PREPARE_RIDGING(
353a8877c7 Mart*0439 O hActual,
1cf549c217 Mart*0440 O hrMin, hrMax, hrExp, ridgeRatio, ridgingModeNorm, partFunc,
0441 I iMin, iMax, jMin, jMax, bi, bj, myTime, myIter, myThid )
0442 n = n + 1
0443
0444 ENDDO
0445
0446 ENDIF
0447 #endif /* SEAICE_ITD */
0448
37d4930619 Jean*0449
0450
1cf549c217 Mart*0451
0452
0453
0454 RETURN
0455 END