File indexing completed on 2018-03-28 05:09:44 UTC
view on githubraw file Latest commit e7af59f6 on 2018-03-24 21:24:35 UTC
ed2f6fecc4 Mart*0001
0002
0003
0004
0005
0006 #include "SEAICE_OPTIONS.h"
0007
0008
0009
0010
0011
0012 SUBROUTINE SEAICE_ITD_REMAP(
0013 I heffitdpre, areaitdpre,
0014 I bi, bj, myTime, myIter, myThid )
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 IMPLICIT NONE
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 #include "SIZE.h"
0045 #include "EEPARAMS.h"
0046 #include "PARAMS.h"
0047 #include "SEAICE_SIZE.h"
0048 #include "SEAICE_PARAMS.h"
0049 #include "SEAICE.h"
0050
0051
0052
0053
0054
0055
0056
0057 _RL myTime
0058 INTEGER bi,bj
0059 INTEGER myIter
0060 INTEGER myThid
0061 _RL heffitdPre (1:sNx,1:sNy,1:nITD)
0062 _RL areaitdPre (1:sNx,1:sNy,1:nITD)
0063
0064 #ifdef SEAICE_ITD
0065
0066
0067
0068
0069
0070 INTEGER i, j, k
0071 INTEGER kDonor, kRecvr
0072 _RL slope, area_reg_sq, hice_reg_sq
0073 _RL etaMin, etaMax, etam, etap, eta2
0074 _RL dh0, da0, daMax
0075
0076 _RL third
0077 PARAMETER ( third = 0.333333333333333333333333333 _d 0 )
dcd6ed0c75 Jean*0078
ed2f6fecc4 Mart*0079 _RL dhActual (1:sNx,1:sNy,1:nITD)
0080 _RL hActual (1:sNx,1:sNy,1:nITD)
0081 _RL hActualPre (1:sNx,1:sNy,1:nITD)
0082 _RL dheff, darea, dhsnw
dcd6ed0c75 Jean*0083
ed2f6fecc4 Mart*0084 _RL hLimitNew (1:sNx,1:sNy,0:nITD)
0085
0086
0087
0088
0089
0090 _RL g0 (1:sNx,1:sNy,0:nITD)
0091 _RL g1 (1:sNx,1:sNy,0:nITD)
0092 _RL hL (1:sNx,1:sNy,0:nITD)
0093 _RL hR (1:sNx,1:sNy,0:nITD)
0094
0095 _RL aLoc(1:sNx,1:sNy)
0096 LOGICAL doRemapping (1:sNx,1:sNy)
0097
0098
0099
0100
0101 area_reg_sq = SEAICE_area_reg**2
0102 hice_reg_sq = SEAICE_hice_reg**2
0103
0104
0105 DO j=1,sNy
0106 DO i=1,sNx
0107 doRemapping(i,j) = .FALSE.
0108 IF ( HEFFM(i,j,bi,bj) .NE. 0. _d 0 ) doRemapping(i,j) = .TRUE.
0109 ENDDO
0110 ENDDO
dcd6ed0c75 Jean*0111
ed2f6fecc4 Mart*0112
0113
0114 DO k=1,nITD
0115 DO j=1,sNy
0116 DO i=1,sNx
0117 hActualPre (i,j,k) = 0. _d 0
0118 hActual (i,j,k) = 0. _d 0
0119 dhActual(i,j,k) = 0. _d 0
0120 IF (.FALSE.) THEN
0121 IF ( areaitdPre(i,j,k) .GT. 0. _d 0 ) THEN
0122 hActualPre(i,j,k) = heffitdPre(i,j,k)
0123 & /SQRT( areaitdPre(i,j,k)**2 + area_reg_sq )
dcd6ed0c75 Jean*0124
ed2f6fecc4 Mart*0125 ENDIF
0126 IF ( AREAITD(i,j,k,bi,bj) .GT. 0. _d 0 ) THEN
0127 hActual(i,j,k) = HEFFITD(i,j,k,bi,bj)
0128 & /SQRT( AREAITD(i,j,k,bi,bj)**2 + area_reg_sq )
dcd6ed0c75 Jean*0129
ed2f6fecc4 Mart*0130 ENDIF
0131 dhActual(i,j,k) = hActual(i,j,k) - hActualPre(i,j,k)
0132 ELSE
0133 IF ( areaitdPre(i,j,k) .GT. SEAICE_area_reg ) THEN
0134 hActualPre(i,j,k) = heffitdPre(i,j,k)/areaitdPre(i,j,k)
0135 ENDIF
0136 IF ( AREAITD(i,j,k,bi,bj) .GT. SEAICE_area_reg ) THEN
0137 hActual(i,j,k) = HEFFITD(i,j,k,bi,bj)/AREAITD(i,j,k,bi,bj)
0138 ENDIF
0139 dhActual(i,j,k) = hActual(i,j,k) - hActualPre(i,j,k)
0140 ENDIF
0141 ENDDO
0142 ENDDO
0143 ENDDO
dcd6ed0c75 Jean*0144
ed2f6fecc4 Mart*0145
dcd6ed0c75 Jean*0146
ed2f6fecc4 Mart*0147 DO j=1,sNy
0148 DO i=1,sNx
0149 hLimitNew(i,j,0) = hLimit(0)
0150 ENDDO
0151 ENDDO
0152 DO k=1,nITD-1
0153 DO j=1,sNy
0154 DO i=1,sNx
0155 IF ( hActualPre(i,j,k) .GT.SEAICE_eps .AND.
0156 & hActualPre(i,j,k+1).GT.SEAICE_eps ) THEN
dcd6ed0c75 Jean*0157 slope = ( dhActual(i,j,k+1) - dhActual(i,j,k) )
ed2f6fecc4 Mart*0158 & /( hActualPre(i,j,k+1) - hActualPre(i,j,k) )
0159 hLimitNew(i,j,k) = hLimit(k) + dhActual(i,j,k)
0160 & + slope * ( hLimit(k) - hActualPre(i,j,k) )
0161 ELSEIF ( hActualPre(i,j,k) .GT.SEAICE_eps ) THEN
0162 hLimitNew(i,j,k) = hLimit(k) + dhActual(i,j,k)
0163 ELSEIF ( hActualPre(i,j,k+1).GT.SEAICE_eps ) THEN
0164 hLimitNew(i,j,k) = hLimit(k) + dhActual(i,j,k+1)
0165 ELSE
0166 hLimitNew(i,j,k) = hLimit(k)
0167 ENDIF
0168
0169
0170 IF ( ( AREAITD(i,j,k,bi,bj).GT.SEAICE_area_reg .AND.
0171 & hActual(i,j,k) .GE. hLimitNew(i,j,k) ) .OR.
0172 & ( AREAITD(i,j,k+1,bi,bj).GT.SEAICE_area_reg .AND.
dcd6ed0c75 Jean*0173 & hActual(i,j,k+1) .LE. hLimitNew(i,j,k) ) )
ed2f6fecc4 Mart*0174 & doRemapping(i,j) = .FALSE.
0175
0176
0177
0178 IF ( ( hLimitNew(i,j,k) .GT. hLimit(k+1) ) .OR.
0179 & ( hLimitNew(i,j,k) .LT. hLimit(k-1) ) )
0180 & doRemapping(i,j) = .FALSE.
0181 ENDDO
0182 ENDDO
0183 ENDDO
0184
0185
0186
0187
0188 IF ( debugLevel.GE.debLevA )
0189 & CALL SEAICE_ITD_REMAP_CHECK_BOUNDS(
0190 I AREAITD, hActual, hActualPre, hLimitNew, doRemapping,
0191 I bi, bj, myTime, myIter, myThid )
0192
0193
0194 k = nITD
0195 DO j=1,sNy
0196 DO i=1,sNx
0197 hLimitNew(i,j,k) = hLimit(k)
0198 IF ( AREAITD(i,j,k,bi,bj).GT.SEAICE_area_reg )
0199 & hLimitNew(i,j,k) = MAX( 3. _d 0*hActual(i,j,k)
0200 & - 2. _d 0 * hLimitNew(i,j,k-1), hLimit(k-1) )
0201 ENDDO
0202 ENDDO
dcd6ed0c75 Jean*0203
0204
ed2f6fecc4 Mart*0205
dcd6ed0c75 Jean*0206
0207
ed2f6fecc4 Mart*0208
0209 k = 1
0210 DO j=1,sNy
0211 DO i=1,sNx
0212
0213 aLoc(i,j) = AREAITD(i,j,k,bi,bj)
0214
dcd6ed0c75 Jean*0215
ed2f6fecc4 Mart*0216
0217 hL(i,j,k) = hLimitNew(i,j,k-1)
0218 hR(i,j,k) = hLimit(k)
0219 ENDDO
0220 ENDDO
0221 CALL SEAICE_ITD_REMAP_LINEAR(
dcd6ed0c75 Jean*0222 O g0(1,1,k), g1(1,1,k),
ed2f6fecc4 Mart*0223 U hL(1,1,k), hR(1,1,k),
dcd6ed0c75 Jean*0224 I hActual(1,1,k), aLoc,
ed2f6fecc4 Mart*0225 I SEAICE_area_reg, SEAICE_eps, doRemapping,
0226 I myTime, myIter, myThid )
0227
0228
0229
0230 DO j=1,sNy
0231 DO i=1,sNx
dcd6ed0c75 Jean*0232 IF ( doRemapping(i,j) .AND.
ed2f6fecc4 Mart*0233 & AREAITD(i,j,k,bi,bj) .GT. SEAICE_area_reg ) THEN
0234
0235 IF ( dhActual(i,j,k) .LT. 0. _d 0 ) THEN
0236
0237
0238 dh0 = MIN(-dhActual(i,j,k),hLimit(k))
0239 etaMax = MIN(dh0,hR(i,j,k)) - hL(i,j,k)
0240 IF ( etaMax > 0. _d 0 ) THEN
0241
0242 da0 = g0(i,j,k)*etaMax + g1(i,j,k)*etaMax*etaMax*0.5 _d 0
0243 daMax = AREAITD(i,j,k,bi,bj)
0244 & * ( 1. _d 0 - hActual(i,j,k)/hActualPre(i,j,k))
0245 da0 = MIN( da0, daMax )
0246
0247 IF ( (AREAITD(i,j,k,bi,bj)-da0) .GT. SEAICE_area_reg ) THEN
0248 hActual(i,j,k) = hActual(i,j,k)
0249 & * AREAITD(i,j,k,bi,bj)/( AREAITD(i,j,k,bi,bj) - da0 )
0250 ELSE
0251 hActual(i,j,k) = ZERO
0252 da0 = AREAITD(i,j,k,bi,bj)
0253 ENDIF
0254
0255 AREAITD(i,j,k,bi,bj) = AREAITD(i,j,k,bi,bj) - da0
0256 ENDIF
0257 ELSE
0258
0259 hLimitNew(i,j,k-1) = MIN( dhActual(i,j,k), hLimit(k) )
0260 ENDIF
0261 ENDIF
0262 ENDDO
0263 ENDDO
0264
0265
0266
0267 DO k=1,nITD
0268 DO j=1,sNy
0269 DO i=1,sNx
0270
0271 aLoc(i,j) = AREAITD(i,j,k,bi,bj)
0272
0273 hL(i,j,k) = hLimitNew(i,j,k-1)
0274 hR(i,j,k) = hLimitNew(i,j,k)
0275 ENDDO
0276 ENDDO
0277 CALL SEAICE_ITD_REMAP_LINEAR(
dcd6ed0c75 Jean*0278 O g0(1,1,k), g1(1,1,k),
ed2f6fecc4 Mart*0279 U hL(1,1,k), hR(1,1,k),
0280 I hActual(1,1,k), aLoc,
0281 I SEAICE_area_reg, SEAICE_eps, doRemapping,
0282 I myTime, myIter, myThid )
0283 ENDDO
dcd6ed0c75 Jean*0284
ed2f6fecc4 Mart*0285 DO k=1,nITD-1
0286 DO j=1,sNy
0287 DO i=1,sNx
0288 dheff = 0. _d 0
0289 darea = 0. _d 0
0290 IF ( doRemapping(i,j) ) THEN
0291
0292 IF ( hLimitNew(i,j,k) .GT. hLimit(k) ) THEN
0293 etaMin = MAX( hLimit(k), hL(i,j,k)) - hL(i,j,k)
0294 etaMax = MIN(hLimitNew(i,j,k), hR(i,j,k)) - hL(i,j,k)
0295 kDonor = k
0296 kRecvr = k+1
0297 ELSE
0298 etaMin = 0. _d 0
0299 etaMax = MIN(hLimit(k), hR(i,j,k+1)) - hL(i,j,k+1)
0300 kDonor = k+1
0301 kRecvr = k
0302 ENDIF
0303
0304 IF ( etaMax .GT. etaMin ) THEN
0305 etam = etaMax-etaMin
0306 etap = etaMax+etaMin
0307 eta2 = 0.5*etam*etap
0308 darea = g0(i,j,kDonor)*etam + g1(i,j,kDonor)*eta2
0309
0310
0311
0312 dheff = g0(i,j,kDonor)*eta2
0313 & + g1(i,j,kDonor)*(etaMax**3-etaMin**3)*third
0314 & + darea*hL(i,j,kDonor)
0315 ENDIF
0316
0317
0318
0319 IF ( (darea .GT.AREAITD(i,j,kDonor,bi,bj)-SEAICE_eps).OR.
0320 & (dheff .GT.HEFFITD(i,j,kDonor,bi,bj)-SEAICE_eps) ) THEN
0321 darea = AREAITD(i,j,kDonor,bi,bj)
0322 dheff = HEFFITD(i,j,kDonor,bi,bj)
0323 ENDIF
0324
0325
0326
0327 IF ( (darea .LT. SEAICE_eps).OR.
0328 & (dheff .LT. SEAICE_eps) ) THEN
0329 darea = 0. _d 0
0330 dheff = 0. _d 0
0331 ENDIF
0332
0333 IF ( AREAITD(i,j,kDonor,bi,bj) .GT. SEAICE_area_reg ) THEN
0334
0335 dhsnw = darea/AREAITD(i,j,kDonor,bi,bj)
0336 & * HSNOWITD(i,j,kDonor,bi,bj)
0337
dcd6ed0c75 Jean*0338
ed2f6fecc4 Mart*0339
0340 ELSE
0341 dhsnw = HSNOWITD(i,j,kDonor,bi,bj)
0342 ENDIF
0343
0344 HEFFITD(i,j,kRecvr,bi,bj) = HEFFITD(i,j,kRecvr,bi,bj) + dheff
0345 HEFFITD(i,j,kDonor,bi,bj) = HEFFITD(i,j,kDonor,bi,bj) - dheff
0346 AREAITD(i,j,kRecvr,bi,bj) = AREAITD(i,j,kRecvr,bi,bj) + darea
0347 AREAITD(i,j,kDonor,bi,bj) = AREAITD(i,j,kDonor,bi,bj) - darea
0348 HSNOWITD(i,j,kRecvr,bi,bj)=HSNOWITD(i,j,kRecvr,bi,bj) + dhsnw
0349 HSNOWITD(i,j,kDonor,bi,bj)=HSNOWITD(i,j,kDonor,bi,bj) - dhsnw
0350
0351 ENDIF
0352 ENDDO
0353 ENDDO
0354 ENDDO
0355
0356 RETURN
0357 END
0358
0359
0360
0361
0362
0363
0364
0365 SUBROUTINE SEAICE_ITD_REMAP_LINEAR(
0366 O g0, g1,
0367 U hL, hR,
dcd6ed0c75 Jean*0368 I hActual, area,
ed2f6fecc4 Mart*0369 I SEAICE_area_reg, SEAICE_eps, doRemapping,
0370 I myTime, myIter, myThid )
0371
0372
0373
0374
dcd6ed0c75 Jean*0375
ed2f6fecc4 Mart*0376
0377
0378
0379
0380
0381
0382
0383
0384 IMPLICIT NONE
0385
0386 #include "SIZE.h"
0387
0388
0389
0390
0391
0392
0393 _RL myTime
0394 INTEGER myIter
0395 INTEGER myThid
dcd6ed0c75 Jean*0396
ed2f6fecc4 Mart*0397
0398
0399
0400
0401
0402 _RL g0 (1:sNx,1:sNy)
0403 _RL g1 (1:sNx,1:sNy)
0404 _RL hL (1:sNx,1:sNy)
0405 _RL hR (1:sNx,1:sNy)
0406
0407
0408
0409 _RL hActual (1:sNx,1:sNy)
0410 _RL area (1:sNx,1:sNy)
0411
0412 _RL SEAICE_area_reg
0413 _RL SEAICE_eps
0414
0415
0416 LOGICAL doRemapping (1:sNx,1:sNy)
0417
0418
0419
0420
0421
0422 INTEGER i, j
0423
0424
0425
0426 _RL auxCoeff
0427 _RL recip_etaR, etaNoR
0428 _RL third, sixth
0429 PARAMETER ( third = 0.333333333333333333333333333 _d 0 )
0430 PARAMETER ( sixth = 0.666666666666666666666666666 _d 0 )
0431
dcd6ed0c75 Jean*0432
ed2f6fecc4 Mart*0433
0434
0435 DO j=1,sNy
0436 DO i=1,sNx
0437 g0(i,j) = 0. _d 0
0438 g1(i,j) = 0. _d 0
0439 IF ( doRemapping(i,j) .AND.
0440 & area(i,j) .GT. SEAICE_area_reg .AND.
0441 & hR(i,j) - hL(i,j) .GT. SEAICE_eps ) THEN
0442
0443 IF ( hActual(i,j) .LT. (2. _d 0*hL(i,j) + hR(i,j))*third ) THEN
0444 hR(i,j) = 3. _d 0 * hActual(i,j) - 2. _d 0 * hL(i,j)
0445 ELSEIF ( hActual(i,j).GT.(hL(i,j)+2. _d 0*hR(i,j))*third ) THEN
0446 hL(i,j) = 3. _d 0 * hActual(i,j) - 2. _d 0 * hR(i,j)
0447 ENDIF
0448
0449
0450
0451 recip_etaR = 0. _d 0
0452
0453 IF ( hR(i,j) - hL(i,j) .GT. SEAICE_eps )
0454 & recip_etaR = 1. _d 0 / (hR(i,j) - hL(i,j))
0455
0456 etaNoR = (hActual(i,j) - hL(i,j))*recip_etaR
0457 auxCoeff = 6. _d 0 * area(i,j)*recip_etaR
0458
0459 g0(i,j) = auxCoeff*( sixth - etaNoR )
0460 g1(i,j) = 2. _d 0 * auxCoeff*recip_etaR*( etaNoR - 0.5 _d 0 )
0461 ELSE
0462
0463
0464 hL(i,j) = 0. _d 0
0465 hR(i,j) = 0. _d 0
0466 ENDIF
0467 ENDDO
0468 ENDDO
0469
0470 RETURN
0471 END
0472
0473
0474
e7af59f6fd Jean*0475
ed2f6fecc4 Mart*0476
0477
0478
0479 SUBROUTINE SEAICE_ITD_REMAP_CHECK_BOUNDS(
0480 I AREAITD, hActual, hActualPre, hLimitNew, doRemapping,
0481 I bi, bj, myTime, myIter, myThid )
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493 IMPLICIT NONE
0494
0495 #include "SIZE.h"
0496 #include "EEPARAMS.h"
0497 #include "SEAICE_SIZE.h"
0498 #include "SEAICE_PARAMS.h"
0499
0500
0501
0502
0503
0504
0505
0506 _RL myTime
0507 INTEGER bi,bj
0508 INTEGER myIter
0509 INTEGER myThid
0510
0511 _RL hActual (1:sNx,1:sNy,1:nITD)
0512 _RL hActualPre(1:sNx,1:sNy,1:nITD)
0513
0514 _RL hLimitNew (1:sNx,1:sNy,0:nITD)
0515
dcd6ed0c75 Jean*0516 _RL AREAITD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nITD,nSx,nSy)
ed2f6fecc4 Mart*0517
0518
0519 LOGICAL doRemapping (1:sNx,1:sNy)
0520
0521
0522
0523
0524
0525 INTEGER i, j, k
0526 CHARACTER*(MAX_LEN_MBUF) msgBuf
0527 CHARACTER*(39) tmpBuf
0528
dcd6ed0c75 Jean*0529
ed2f6fecc4 Mart*0530 DO j=1,sNy
0531 DO i=1,sNx
0532 IF (.NOT.doRemapping(i,j) ) THEN
0533 DO k=1,nITD-1
dcd6ed0c75 Jean*0534 WRITE(tmpBuf,'(A,2I5,A,I10)')
ed2f6fecc4 Mart*0535 & ' at (', i, j, ') in timestep ', myIter
0536 IF ( AREAITD(i,j,k,bi,bj).GT.SEAICE_area_reg .AND.
0537 & hActual(i,j,k) .GE. hLimitNew(i,j,k) ) THEN
0538 WRITE(msgBuf,'(A,I3,A)')
0539 & 'SEAICE_ITD_REMAP: hActual(k) >= hLimitNew(k) '//
0540 & 'for category ', k, tmpBuf
0541 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0542 & SQUEEZE_RIGHT, myThid )
dcd6ed0c75 Jean*0543
ed2f6fecc4 Mart*0544
0545 ENDIF
0546 IF ( AREAITD(i,j,k+1,bi,bj).GT.SEAICE_area_reg .AND.
0547 & hActual(i,j,k+1) .LE. hLimitNew(i,j,k) ) THEN
dcd6ed0c75 Jean*0548 WRITE(msgBuf,'(A,I3,A)')
ed2f6fecc4 Mart*0549 & 'SEAICE_ITD_REMAP: hActual(k+1) <= hLimitNew(k) '//
0550 & 'for category ', k, tmpBuf
0551 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0552 & SQUEEZE_RIGHT, myThid )
dcd6ed0c75 Jean*0553 PRINT '(8(1X,E10.4))',
ed2f6fecc4 Mart*0554 & AREAITD(i,j,k+1,bi,bj), hActual(i,j,k+1),
0555 & hActualPre(i,j,k+1),
0556 & AREAITD(i,j,k,bi,bj), hActual(i,j,k),
0557 & hActualPre(i,j,k),
0558 & hLimitNew(i,j,k), hLimit(k)
0559 ENDIF
0560 IF ( hLimitNew(i,j,k) .GT. hLimit(k+1) ) THEN
dcd6ed0c75 Jean*0561 WRITE(msgBuf,'(A,I3,A)')
ed2f6fecc4 Mart*0562 & 'SEAICE_ITD_REMAP: hLimitNew(k) > hLimitNew(k+1) '//
0563 & 'for category ', k, tmpBuf
0564 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0565 & SQUEEZE_RIGHT, myThid )
0566 ENDIF
0567 IF ( hLimitNew(i,j,k) .LT. hLimit(k-1) ) THEN
dcd6ed0c75 Jean*0568 WRITE(msgBuf,'(A,I3,A)')
ed2f6fecc4 Mart*0569 & 'SEAICE_ITD_REMAP: hLimitNew(k) < hLimitNew(k-1) '//
0570 & 'for category ', k, tmpBuf
0571 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0572 & SQUEEZE_RIGHT, myThid )
0573 ENDIF
0574 ENDDO
0575 ENDIF
0576 ENDDO
0577 ENDDO
0578
0579 #endif /* SEAICE_ITD */
0580
0581 RETURN
0582 END