File indexing completed on 2023-02-03 06:10:35 UTC
view on githubraw file Latest commit edb66560 on 2023-02-02 23:32:31 UTC
87ea84cac6 Jean*0001 #include "THSICE_OPTIONS.h"
6b47d550f4 Mart*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
e3123da85c Patr*0004 # ifdef ALLOW_EXF
0005 # include "EXF_OPTIONS.h"
0006 # endif
a85293d087 Mart*0007 # define ALLOW_AUTODIFF_TAMC_MORE
e3123da85c Patr*0008 #endif
87ea84cac6 Jean*0009
0010
0011
0012
0013 SUBROUTINE THSICE_SOLVE4TEMP(
6dc8890c80 Patr*0014 I bi, bj,
72e380ddb5 Jean*0015 I iMin,iMax, jMin,jMax, dBugFlag,
2a9474d935 Mart*0016 I useBulkForce, useEXF,
a85293d087 Mart*0017 I icMask, hIce, hSnow, tFrz, flxExSW,
0018 U flxSW, tSrf, qIc1, qIc2,
0019 O tIc1, tIc2, dTsrf,
7269783f6f Jean*0020 O sHeat, flxCnB, flxAtm, evpAtm,
0021 I myTime, myIter, myThid )
87ea84cac6 Jean*0022
0023
0024
0025
0026
0027
0028
0029
7269783f6f Jean*0030
0031
0032
0033
88f72205aa Jean*0034
0035
0036
7269783f6f Jean*0037
0038
0039
0040
0041
0042
0043
0044
0045
87ea84cac6 Jean*0046
0047 IMPLICIT NONE
0048
0049
dbce8fc2d4 Jean*0050 #include "EEPARAMS.h"
9dcf02c6ac Jean*0051 #include "SIZE.h"
87ea84cac6 Jean*0052 #include "THSICE_PARAMS.h"
6b47d550f4 Mart*0053 #ifdef ALLOW_AUTODIFF
0054 # include "THSICE_SIZE.h"
1d053ba71b Jean*0055
e3123da85c Patr*0056 # ifdef ALLOW_EXF
c1c3d0f9d7 Patr*0057 # include "EXF_PARAM.h"
9623863f82 Jean*0058 # include "EXF_CONSTANTS.h"
6b47d550f4 Mart*0059 # include "EXF_FIELDS.h"
e3123da85c Patr*0060 # endif
d6f06800ae Patr*0061 #endif
6b47d550f4 Mart*0062 #ifdef ALLOW_AUTODIFF_TAMC
0063 # include "tamc.h"
0064 #endif
87ea84cac6 Jean*0065
0066
0067
7269783f6f Jean*0068
0069
0070
0071
2a9474d935 Mart*0072
0073
7269783f6f Jean*0074
9623863f82 Jean*0075
9dcf02c6ac Jean*0076
a85293d087 Mart*0077
9dcf02c6ac Jean*0078
a85293d087 Mart*0079
7269783f6f Jean*0080
0081
9dcf02c6ac Jean*0082
0083
a85293d087 Mart*0084
0085
0086
7269783f6f Jean*0087
9dcf02c6ac Jean*0088
0089
a85293d087 Mart*0090
0091
9dcf02c6ac Jean*0092
0093
7269783f6f Jean*0094
9dcf02c6ac Jean*0095
7269783f6f Jean*0096
0097
0098
0099
0100 INTEGER bi,bj
0101 INTEGER iMin, iMax
0102 INTEGER jMin, jMax
0103 LOGICAL dBugFlag
2a9474d935 Mart*0104 LOGICAL useBulkForce
0105 LOGICAL useEXF
a85293d087 Mart*0106 _RL icMask (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
6dc8890c80 Patr*0107 _RL hIce (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
a85293d087 Mart*0108 _RL hSnow (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
6dc8890c80 Patr*0109 _RL tFrz (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0110 _RL flxSW (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
a85293d087 Mart*0111 _RL tSrf (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
6dc8890c80 Patr*0112 _RL qIc1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0113 _RL qIc2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0114 _RL tIc1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0115 _RL tIc2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0116 _RL sHeat (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0117 _RL flxCnB (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0118 _RL flxAtm (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0119 _RL evpAtm (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
a85293d087 Mart*0120
0121 _RL flxExSW(1:sNx,1:sNy,0:2)
0122 _RL dTsrf (1:sNx,1:sNy)
d99870c051 Patr*0123 _RL myTime
7269783f6f Jean*0124 INTEGER myIter
0125 INTEGER myThid
0126
0127
0128 #ifdef ALLOW_THSICE
0129
87ea84cac6 Jean*0130
9dcf02c6ac Jean*0131
0132
0133
0134
98b4e0ca2d Jean*0135
a85293d087 Mart*0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
9dcf02c6ac Jean*0149
98b4e0ca2d Jean*0150
0151
9dcf02c6ac Jean*0152
98b4e0ca2d Jean*0153
0154
9dcf02c6ac Jean*0155 LOGICAL useBlkFlx
0156 LOGICAL iterate4Tsf
389b16a470 Jean*0157 INTEGER i, j, k, iterMax
0158 INTEGER ii, jj, icount, stdUnit
9f5240b52a Jean*0159 #if ( defined ALLOW_DBUG_THSICE ||
389b16a470 Jean*0160 CHARACTER*(MAX_LEN_MBUF) msgBuf
9f5240b52a Jean*0161 #endif
98b4e0ca2d Jean*0162 _RL frsnow
0163 _RL fswpen
0164 _RL fswdn
0165 _RL fswint
0166 _RL fswocn
c1c3d0f9d7 Patr*0167 _RL iceFlag (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
a85293d087 Mart*0168 _RL Tsf_mlt (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
9dcf02c6ac Jean*0169 _RL flx0exSW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0170 _RL flxTexSW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0171 _RL dFlxdT (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
a85293d087 Mart*0172 _RL evap_0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
9dcf02c6ac Jean*0173 _RL evapT (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0174 _RL dEvdT (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
170766e9fd Jean*0175 _RL flxNet
98b4e0ca2d Jean*0176 _RL fct
9dcf02c6ac Jean*0177 _RL k12 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0178 _RL k32
0179 _RL a10 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0180 _RL b10 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0181 _RL c10 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
98b4e0ca2d Jean*0182 _RL a1, b1, c1
0183 _RL dt
72e380ddb5 Jean*0184 _RL recip_dhSnowLin
a85293d087 Mart*0185 _RL TsfTmp, tIc2Tmp
9dcf02c6ac Jean*0186 #ifdef ALLOW_DBUG_THSICE
0187 _RL netSW
0188 #endif
7c50f07931 Mart*0189 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0190
0191
0192 INTEGER tkey, ikey
7c50f07931 Mart*0193 #endif
7269783f6f Jean*0194
a85293d087 Mart*0195 #ifdef ALLOW_DBUG_THSICE
9dcf02c6ac Jean*0196
7269783f6f Jean*0197 #include "THSICE_DEBUG.h"
9865bb1ac3 Jean*0198 1010 FORMAT(A,I3,3F11.6)
0199 1020 FORMAT(A,1P4E14.6)
a85293d087 Mart*0200 #endif
0201
87ea84cac6 Jean*0202
d6f06800ae Patr*0203 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0204 tkey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
0205
0206
6b47d550f4 Mart*0207 #endif /* ALLOW_AUTODIFF_TAMC */
0208
0209 #ifdef ALLOW_AUTODIFF
d4b7a0d2bc Patr*0210 DO j = 1-OLy, sNy+OLy
0211 DO i = 1-OLx, sNx+OLx
389b16a470 Jean*0212 tIc1(i,j) = 0. _d 0
0213 tIc2(i,j) = 0. _d 0
0707ba3b3d Jean*0214
0215
0216 flx0exSW(i,j) = 0. _d 0
0217 flxTexSW(i,j) = 0. _d 0
0218 dFlxdT (i,j) = 0. _d 0
a85293d087 Mart*0219 evap_0 (i,j) = 0. _d 0
0707ba3b3d Jean*0220 evapT (i,j) = 0. _d 0
0221 dEvdT (i,j) = 0. _d 0
0222 iceFlag (i,j) = 0. _d 0
a85293d087 Mart*0223 Tsf_mlt (i,j) = 0. _d 0
389b16a470 Jean*0224 ENDDO
0225 ENDDO
6dc8890c80 Patr*0226 #endif
0227
389b16a470 Jean*0228 stdUnit = standardMessageUnit
2a9474d935 Mart*0229 useBlkFlx = useEXF .OR. useBulkForce
9dcf02c6ac Jean*0230 dt = thSIce_dtTemp
72e380ddb5 Jean*0231 IF ( dhSnowLin.GT.0. _d 0 ) THEN
0232 recip_dhSnowLin = 1. _d 0 / dhSnowLin
0233 ELSE
0234 recip_dhSnowLin = 0. _d 0
0235 ENDIF
2a9474d935 Mart*0236
9dcf02c6ac Jean*0237 iterate4Tsf = .FALSE.
9c4b3393ef Mart*0238 icount = 0
389b16a470 Jean*0239
7269783f6f Jean*0240 DO j = jMin, jMax
0241 DO i = iMin, iMax
c1c3d0f9d7 Patr*0242 IF ( icMask(i,j).GT.0. _d 0) THEN
9dcf02c6ac Jean*0243 iterate4Tsf = .TRUE.
c1c3d0f9d7 Patr*0244 iceFlag(i,j) = 1. _d 0
7269783f6f Jean*0245 #ifdef ALLOW_DBUG_THSICE
389b16a470 Jean*0246 IF ( dBug(i,j,bi,bj) ) WRITE(stdUnit,'(A,2I4,2I2)')
7269783f6f Jean*0247 & 'ThSI_SOLVE4T: i,j=',i,j,bi,bj
0248 #endif
9dcf02c6ac Jean*0249 IF ( hIce(i,j).LT.hIceMin ) THEN
9c4b3393ef Mart*0250
0251
0252 ii = i
0253 jj = j
0254 icount = icount + 1
77008a74ba Patr*0255 ENDIF
87ea84cac6 Jean*0256
9dcf02c6ac Jean*0257
0258
0259
0260
a85293d087 Mart*0261 IF ( hSnow(i,j) .GT. icMask(i,j)*dhSnowLin ) THEN
9dcf02c6ac Jean*0262 frsnow = 1. _d 0
0263 ELSE
a85293d087 Mart*0264 frsnow = hSnow(i,j)*recip_dhSnowLin/icMask(i,j)
9dcf02c6ac Jean*0265 IF ( frsnow.GT.0. _d 0 ) frsnow = SQRT(frsnow)
0266 ENDIF
87ea84cac6 Jean*0267
9dcf02c6ac Jean*0268
0269 fswpen = flxSW(i,j) * (1. _d 0 - frsnow) * i0swFrac
0270 fswocn = fswpen * exp(-ksolar*hIce(i,j))
0271 fswint = fswpen - fswocn
0272 fswdn = flxSW(i,j) - fswpen
0273
0274
0275 flxAtm(i,j) = flxSW(i,j)
0276
0277 flxSW(i,j) = fswocn
0278
0279 sHeat(i,j) = fswdn
0280
0281
0282 k12(i,j) = 4. _d 0*kIce*kSnow
a85293d087 Mart*0283 & / (kSnow*hIce(i,j) + 4. _d 0*kIce*hSnow(i,j))
9dcf02c6ac Jean*0284 k32 = 2. _d 0*kIce / hIce(i,j)
0285
0286
0287 a1 = cpIce
0288 b1 = qIc1(i,j) + (cpWater-cpIce )*Tmlt1 - Lfresh
0289 c1 = Lfresh * Tmlt1
0290 tIc1(i,j) = 0.5 _d 0 *(-b1 - SQRT(b1*b1-4. _d 0*a1*c1))/a1
0291 tIc2(i,j) = (Lfresh-qIc2(i,j)) / cpIce
0292
9c4b3393ef Mart*0293 #ifdef ALLOW_DBUG_THSICE
9dcf02c6ac Jean*0294 IF (tIc1(i,j).GT.0. _d 0 ) THEN
389b16a470 Jean*0295 WRITE(stdUnit,'(A,I12,1PE14.6)')
9dcf02c6ac Jean*0296 & ' BBerr: Tice(1) > 0 ; it=', myIter, qIc1(i,j)
389b16a470 Jean*0297 WRITE(stdUnit,'(A,4I5,2F11.4)')
9dcf02c6ac Jean*0298 & ' BBerr: i,j,bi,bj,Tice = ',i,j,bi,bj,tIc1(i,j),tIc2(i,j)
0299 ENDIF
0300 IF ( tIc2(i,j).GT.0. _d 0) THEN
389b16a470 Jean*0301 WRITE(stdUnit,'(A,I12,1PE14.6)')
9dcf02c6ac Jean*0302 & ' BBerr: Tice(2) > 0 ; it=', myIter, qIc2(i,j)
389b16a470 Jean*0303 WRITE(stdUnit,'(A,4I5,2F11.4)')
9dcf02c6ac Jean*0304 & ' BBerr: i,j,bi,bj,Tice = ',i,j,bi,bj,tIc1(i,j),tIc2(i,j)
0305 ENDIF
389b16a470 Jean*0306 IF ( dBug(i,j,bi,bj) ) WRITE(stdUnit,1010)
a85293d087 Mart*0307 & 'ThSI_SOLVE4T: k, Ts, Tice=',0,tSrf(i,j),tIc1(i,j),tIc2(i,j)
7269783f6f Jean*0308 #endif
87ea84cac6 Jean*0309
9dcf02c6ac Jean*0310
87ea84cac6 Jean*0311
9dcf02c6ac Jean*0312 a10(i,j) = rhoi*cpIce *hIce(i,j)/(2. _d 0*dt) +
0313 & k32*( 4. _d 0*dt*k32 + rhoi*cpIce *hIce(i,j) )
0314 & / ( 6. _d 0*dt*k32 + rhoi*cpIce *hIce(i,j) )
0315 b10(i,j) = -hIce(i,j)*
0316 & ( rhoi*cpIce*tIc1(i,j) + rhoi*Lfresh*Tmlt1/tIc1(i,j) )
0317 & /(2. _d 0*dt)
0318 & - k32*( 4. _d 0*dt*k32*tFrz(i,j)
0319 & +rhoi*cpIce*hIce(i,j)*tIc2(i,j) )
0320 & / ( 6. _d 0*dt*k32 + rhoi*cpIce *hIce(i,j) )
0321 & - fswint
0322 c10(i,j) = rhoi*Lfresh*hIce(i,j)*Tmlt1 / (2. _d 0*dt)
0323
0324 ELSE
c1c3d0f9d7 Patr*0325 iceFlag(i,j) = 0. _d 0
9dcf02c6ac Jean*0326 ENDIF
0327 ENDDO
0328 ENDDO
c1c3d0f9d7 Patr*0329 #ifndef ALLOW_AUTODIFF
9c4b3393ef Mart*0330 IF ( icount .gt. 0 ) THEN
389b16a470 Jean*0331 WRITE(stdUnit,'(A,I5,A)')
9c4b3393ef Mart*0332 & 'THSICE_SOLVE4TEMP: there are ',icount,
0333 & ' case(s) where hIce<hIceMin;'
389b16a470 Jean*0334 WRITE(stdUnit,'(A,I3,A1,I3,A)')
9c4b3393ef Mart*0335 & 'THSICE_SOLVE4TEMP: the last one was at (',ii,',',jj,
486e9de820 Jean*0336 & ') with hIce = ', hIce(ii,jj)
389b16a470 Jean*0337 WRITE( msgBuf, '(A)')
0338 & 'THSICE_SOLVE4TEMP: should not enter if hIce<hIceMin'
0339 CALL PRINT_ERROR( msgBuf , myThid )
0340 STOP 'ABNORMAL END: S/R THSICE_SOLVE4TEMP'
9c4b3393ef Mart*0341 ENDIF
c1c3d0f9d7 Patr*0342 #endif /* ALLOW_AUTODIFF */
87ea84cac6 Jean*0343
a85293d087 Mart*0344
6dc8890c80 Patr*0345
a85293d087 Mart*0346
c1c3d0f9d7 Patr*0347 #ifndef ALLOW_AUTODIFF
9dcf02c6ac Jean*0348 IF ( useBlkFlx .AND. iterate4Tsf ) THEN
0349 #endif
0350 DO j = jMin, jMax
0351 DO i = iMin, iMax
a85293d087 Mart*0352 Tsf_mlt(i,j) = 0.
9dcf02c6ac Jean*0353 ENDDO
0354 ENDDO
c1c3d0f9d7 Patr*0355 #ifndef ALLOW_AUTODIFF
9dcf02c6ac Jean*0356 IF ( useEXF ) THEN
c1c3d0f9d7 Patr*0357 #endif
a163d11794 Patr*0358 k = 1
0359 CALL THSICE_GET_EXF( bi, bj, k,
9dcf02c6ac Jean*0360 I iMin, iMax, jMin, jMax,
a85293d087 Mart*0361 I iceFlag, hSnow, Tsf_mlt,
0362 O flx0exSW, dFlxdT, evap_0, dEvdT,
9dcf02c6ac Jean*0363 I myTime, myIter, myThid )
9623863f82 Jean*0364 #ifndef ALLOW_AUTODIFF
9dcf02c6ac Jean*0365
0366 ELSEIF ( useBulkForce ) THEN
6dc8890c80 Patr*0367 CALL THSICE_GET_BULKF( bi, bj,
9dcf02c6ac Jean*0368 I iMin, iMax, jMin, jMax,
a85293d087 Mart*0369 I iceFlag, hSnow, Tsf_mlt,
0370 O flx0exSW, dFlxdT, evap_0, dEvdT,
9dcf02c6ac Jean*0371 I myTime, myIter, myThid )
c1c3d0f9d7 Patr*0372
9dcf02c6ac Jean*0373 ENDIF
c1c3d0f9d7 Patr*0374
9dcf02c6ac Jean*0375 ENDIF
c1c3d0f9d7 Patr*0376 #endif
170766e9fd Jean*0377
a85293d087 Mart*0378
0379
9dcf02c6ac Jean*0380 DO j = jMin, jMax
0381 DO i = iMin, iMax
a85293d087 Mart*0382 dTsrf(i,j) = Terrmax
9dcf02c6ac Jean*0383 ENDDO
0384 ENDDO
9a68c0a761 Jean*0385 IF ( useBlkFlx ) THEN
0386 iterMax = nitMaxTsf
0387 ELSE
0388 iterMax = 1
0389 ENDIF
0390
87ea84cac6 Jean*0391
9a68c0a761 Jean*0392 DO k = 1,iterMax
c1c3d0f9d7 Patr*0393 #ifndef ALLOW_AUTODIFF
9dcf02c6ac Jean*0394 IF ( iterate4Tsf ) THEN
6b47d550f4 Mart*0395 iterate4Tsf = .FALSE.
c1c3d0f9d7 Patr*0396
6b47d550f4 Mart*0397 IF ( useBlkFlx ) THEN
0398 #endif
0399 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0400 ikey = (tkey-1)*MaxTsf + k
0401
0402
0403
0404
0405
6b47d550f4 Mart*0406 #endif
c1c3d0f9d7 Patr*0407
9dcf02c6ac Jean*0408
c1c3d0f9d7 Patr*0409 #ifndef ALLOW_AUTODIFF
170766e9fd Jean*0410 IF ( useEXF ) THEN
c1c3d0f9d7 Patr*0411 #endif
a163d11794 Patr*0412 CALL THSICE_GET_EXF( bi, bj, k+1,
9dcf02c6ac Jean*0413 I iMin, iMax, jMin, jMax,
a85293d087 Mart*0414 I iceFlag, hSnow, tSrf,
9dcf02c6ac Jean*0415 O flxTexSW, dFlxdT, evapT, dEvdT,
0416 I myTime, myIter, myThid )
0417
9623863f82 Jean*0418 #ifndef ALLOW_AUTODIFF
170766e9fd Jean*0419 ELSEIF ( useBulkForce ) THEN
6dc8890c80 Patr*0420 CALL THSICE_GET_BULKF( bi, bj,
9dcf02c6ac Jean*0421 I iMin, iMax, jMin, jMax,
a85293d087 Mart*0422 I iceFlag, hSnow, tSrf,
9dcf02c6ac Jean*0423 O flxTexSW, dFlxdT, evapT, dEvdT,
0424 I myTime, myIter, myThid )
c1c3d0f9d7 Patr*0425
2a9474d935 Mart*0426 ENDIF
6b47d550f4 Mart*0427 ELSE
9dcf02c6ac Jean*0428 DO j = jMin, jMax
0429 DO i = iMin, iMax
c1c3d0f9d7 Patr*0430 IF ( iceFlag(i,j).GT.0. _d 0 ) THEN
9dcf02c6ac Jean*0431 flxTexSW(i,j) = flxExSW(i,j,1)
0432 dFlxdT(i,j) = flxExSW(i,j,2)
0433 ENDIF
0434 ENDDO
0435 ENDDO
c1c3d0f9d7 Patr*0436
6b47d550f4 Mart*0437 ENDIF
c1c3d0f9d7 Patr*0438 #endif /* ALLOW_AUTODIFF */
9dcf02c6ac Jean*0439
a85293d087 Mart*0440 #ifdef ALLOW_AUTODIFF_TAMC_MORE
0441
edb6656069 Mart*0442
0443
1818702d6f Patr*0444 #endif
9dcf02c6ac Jean*0445
a85293d087 Mart*0446
9dcf02c6ac Jean*0447
6b47d550f4 Mart*0448 DO j = jMin, jMax
0449 DO i = iMin, iMax
0450 IF ( iceFlag(i,j).GT.0. _d 0 ) THEN
0451 flxNet = sHeat(i,j) + flxTexSW(i,j)
7269783f6f Jean*0452 #ifdef ALLOW_DBUG_THSICE
6b47d550f4 Mart*0453 IF ( dBug(i,j,bi,bj) ) WRITE(stdUnit,1020)
9dcf02c6ac Jean*0454 & 'ThSI_SOLVE4T: flxNet,dFlxdT,k12,D=',
0455 & flxNet, dFlxdT(i,j), k12(i,j), k12(i,j)-dFlxdT(i,j)
7269783f6f Jean*0456 #endif
87ea84cac6 Jean*0457
6b47d550f4 Mart*0458 a1 = a10(i,j) - k12(i,j)*dFlxdT(i,j) / (k12(i,j)-dFlxdT(i,j))
a85293d087 Mart*0459 b1 = b10(i,j) - k12(i,j)*(flxNet-dFlxdT(i,j)*tSrf(i,j))
6b47d550f4 Mart*0460 & /(k12(i,j)-dFlxdT(i,j))
0461 c1 = c10(i,j)
0462 tIc1(i,j) = -(b1 + SQRT(b1*b1-4. _d 0*a1*c1))/(2. _d 0*a1)
a85293d087 Mart*0463 dTsrf(i,j) = (flxNet + k12(i,j)*(tIc1(i,j)-tSrf(i,j)))
6b47d550f4 Mart*0464 & /(k12(i,j)-dFlxdT(i,j))
a85293d087 Mart*0465
0466
0467
0468
0469
0470 TsfTmp = tSrf(i,j) + dTsrf(i,j)
c1c3d0f9d7 Patr*0471
a85293d087 Mart*0472 IF ( TsfTmp .GT. 0. _d 0 ) THEN
7269783f6f Jean*0473 #ifdef ALLOW_DBUG_THSICE
6b47d550f4 Mart*0474 IF ( dBug(i,j,bi,bj) ) WRITE(stdUnit,1010)
a85293d087 Mart*0475 & 'ThSI_SOLVE4T: k,ts,t1,dTs=',k,TsfTmp,tIc1(i,j),dTsrf(i,j)
7269783f6f Jean*0476 #endif
6b47d550f4 Mart*0477 a1 = a10(i,j) + k12(i,j)
98b4e0ca2d Jean*0478
6b47d550f4 Mart*0479 b1 = b10(i,j)
0480 tIc1(i,j) = (-b1 - SQRT(b1*b1-4. _d 0*a1*c1))/(2. _d 0*a1)
a85293d087 Mart*0481 tSrf(i,j) = 0. _d 0
c1c3d0f9d7 Patr*0482 #ifndef ALLOW_AUTODIFF
6b47d550f4 Mart*0483 IF ( useBlkFlx ) THEN
c1c3d0f9d7 Patr*0484 #endif /* ALLOW_AUTODIFF */
6b47d550f4 Mart*0485 flxTexSW(i,j) = flx0exSW(i,j)
a85293d087 Mart*0486 evapT(i,j) = evap_0(i,j)
0487 dTsrf(i,j) = 0. _d 0
c1c3d0f9d7 Patr*0488 #ifndef ALLOW_AUTODIFF
6b47d550f4 Mart*0489 ELSE
0490 flxTexSW(i,j) = flxExSW(i,j,0)
a85293d087 Mart*0491 dTsrf(i,j) = 1000.
6b47d550f4 Mart*0492 dFlxdT(i,j) = 0.
0493 ENDIF
c1c3d0f9d7 Patr*0494 #endif /* ALLOW_AUTODIFF */
a85293d087 Mart*0495 ELSE
0496 tSrf(i,j) = TsfTmp
6b47d550f4 Mart*0497 ENDIF
9dcf02c6ac Jean*0498
0499
a85293d087 Mart*0500 IF (ABS(dTsrf(i,j)).GE.Terrmax) THEN
6b47d550f4 Mart*0501 iceFlag(i,j) = 1. _d 0
0502 ELSE
0503 iceFlag(i,j) = 0. _d 0
0504 ENDIF
a85293d087 Mart*0505 #ifndef ALLOW_AUTODIFF
6b47d550f4 Mart*0506 iterate4Tsf = iterate4Tsf .OR. (iceFlag(i,j).GT.0. _d 0)
a85293d087 Mart*0507 #endif
87ea84cac6 Jean*0508
a85293d087 Mart*0509
9dcf02c6ac Jean*0510
a85293d087 Mart*0511
9dcf02c6ac Jean*0512
87ea84cac6 Jean*0513
7269783f6f Jean*0514 #ifdef ALLOW_DBUG_THSICE
6b47d550f4 Mart*0515 IF ( dBug(i,j,bi,bj) ) WRITE(stdUnit,1010)
a85293d087 Mart*0516 & 'ThSI_SOLVE4T: k,ts,t1,dTs=', k,tSrf(i,j),tIc1(i,j),dTsrf(i,j)
6b47d550f4 Mart*0517 IF ( useBlkFlx .AND. k.EQ.nitMaxTsf .AND.
0518 & (iceFlag(i,j).GT.0. _d 0) ) THEN
0519 WRITE(stdUnit,'(A,4I4,I12,F15.9)')
9dcf02c6ac Jean*0520 & ' BB: not converge: i,j,it,hi=',i,j,bi,bj,myIter,hIce(i,j)
6b47d550f4 Mart*0521 WRITE(stdUnit,*)
a85293d087 Mart*0522 & 'BB: not converge: tSrf, dTsrf=', tSrf(i,j), dTsrf(i,j)
6b47d550f4 Mart*0523 WRITE(stdUnit,*)
389b16a470 Jean*0524 & 'BB: not converge: flxNet,dFlxT=', flxNet, dFlxdT(i,j)
a85293d087 Mart*0525 IF ( tSrf(i,j).LT.-70. _d 0 ) THEN
389b16a470 Jean*0526 WRITE( msgBuf, '(A,2I4,2I3,I10,F12.3)')
a85293d087 Mart*0527 & 'THSICE_SOLVE4TEMP: Too low tSrf in', i, j, bi, bj,
0528 & myIter, tSrf(i,j)
389b16a470 Jean*0529 CALL PRINT_ERROR( msgBuf , myThid )
0530 STOP 'ABNORMAL END: S/R THSICE_SOLVE4TEMP'
6b47d550f4 Mart*0531 ENDIF
389b16a470 Jean*0532 ENDIF
9623863f82 Jean*0533 #endif /* ALLOW_DBUG_THSICE */
9dcf02c6ac Jean*0534
6b47d550f4 Mart*0535 ENDIF
0536 ENDDO
9dcf02c6ac Jean*0537 ENDDO
c1c3d0f9d7 Patr*0538 #ifndef ALLOW_AUTODIFF
0539
9a68c0a761 Jean*0540 ENDIF
c1c3d0f9d7 Patr*0541 #endif /* ALLOW_AUTODIFF */
0542
9a68c0a761 Jean*0543 ENDDO
87ea84cac6 Jean*0544
a85293d087 Mart*0545 #ifdef ALLOW_AUTODIFF_TAMC_MORE
0546
edb6656069 Mart*0547
0548
0549
0550
0551
a85293d087 Mart*0552 #endif
87ea84cac6 Jean*0553
a85293d087 Mart*0554
87ea84cac6 Jean*0555
9dcf02c6ac Jean*0556 DO j = jMin, jMax
0557 DO i = iMin, iMax
a85293d087 Mart*0558
0559 tIc2Tmp = tIc2(i,j)
c1c3d0f9d7 Patr*0560 IF ( icMask(i,j).GT.0. _d 0 ) THEN
9dcf02c6ac Jean*0561
0562
0563 k32 = 2. _d 0*kIce / hIce(i,j)
0564 tIc2(i,j) = ( 2. _d 0*dt*k32*(tIc1(i,j)+2. _d 0*tFrz(i,j))
a85293d087 Mart*0565 & + rhoi*cpIce*hIce(i,j)*tIc2Tmp)
9dcf02c6ac Jean*0566 & /(6. _d 0*dt*k32 + rhoi*cpIce*hIce(i,j))
7269783f6f Jean*0567 #ifdef ALLOW_DBUG_THSICE
389b16a470 Jean*0568 IF ( dBug(i,j,bi,bj) ) WRITE(stdUnit,1010)
a85293d087 Mart*0569 & 'ThSI_SOLVE4T: k, Ts, Tice=',k,tSrf(i,j),tIc1(i,j),tIc2(i,j)
9dcf02c6ac Jean*0570 netSW = flxAtm(i,j)
7269783f6f Jean*0571 #endif
87ea84cac6 Jean*0572
9dcf02c6ac Jean*0573
a85293d087 Mart*0574 fct = k12(i,j)*(tSrf(i,j)-tIc1(i,j))
9dcf02c6ac Jean*0575 flxCnB(i,j) = 4. _d 0*kIce *(tIc2(i,j)-tFrz(i,j))/hIce(i,j)
0576 flxNet = sHeat(i,j) + flxTexSW(i,j)
a85293d087 Mart*0577 flxNet = flxNet + dFlxdT(i,j)*dTsrf(i,j)
c1c3d0f9d7 Patr*0578 #ifndef ALLOW_AUTODIFF
9dcf02c6ac Jean*0579 IF ( useBlkFlx ) THEN
c1c3d0f9d7 Patr*0580 #endif
a85293d087 Mart*0581
0582
0583 evpAtm(i,j) = evapT(i,j) + dEvdT(i,j)*dTsrf(i,j)
c1c3d0f9d7 Patr*0584 #ifndef ALLOW_AUTODIFF
9dcf02c6ac Jean*0585 ELSE
9865bb1ac3 Jean*0586
9dcf02c6ac Jean*0587 evpAtm(i,j) = 0.
0588 ENDIF
c1c3d0f9d7 Patr*0589 #endif
9dcf02c6ac Jean*0590
9865bb1ac3 Jean*0591
9dcf02c6ac Jean*0592 flxAtm(i,j) = flxAtm(i,j) + flxTexSW(i,j)
a85293d087 Mart*0593 & + dFlxdT(i,j)*dTsrf(i,j) + evpAtm(i,j)*Lfresh
9865bb1ac3 Jean*0594
9dcf02c6ac Jean*0595 sHeat(i,j) = flxNet - fct
87ea84cac6 Jean*0596
7269783f6f Jean*0597 #ifdef ALLOW_DBUG_THSICE
389b16a470 Jean*0598 IF ( dBug(i,j,bi,bj) ) WRITE(stdUnit,1020)
9dcf02c6ac Jean*0599 & 'ThSI_SOLVE4T: flxNet,fct,Dif,flxCnB=',
0600 & flxNet,fct,flxNet-fct,flxCnB(i,j)
7269783f6f Jean*0601 #endif
87ea84cac6 Jean*0602
9dcf02c6ac Jean*0603
0604 qIc1(i,j) = -cpWater*Tmlt1 + cpIce *(Tmlt1-tIc1(i,j))
0605 & + Lfresh*(1. _d 0-Tmlt1/tIc1(i,j))
0606 qIc2(i,j) = -cpIce *tIc2(i,j) + Lfresh
87ea84cac6 Jean*0607
9c4b3393ef Mart*0608 #ifdef ALLOW_DBUG_THSICE
9dcf02c6ac Jean*0609
0610
0611 IF (tIc1(i,j) .GE. Tmlt1) THEN
389b16a470 Jean*0612 WRITE(stdUnit,'(A,2I4,2I3,1P2E14.6)')
9dcf02c6ac Jean*0613 & ' BBerr - Bug: IceT(1) > Tmlt',i,j,bi,bj,tIc1(i,j),Tmlt1
0614 ENDIF
0615 IF (tIc2(i,j) .GE. 0. _d 0) THEN
389b16a470 Jean*0616 WRITE(stdUnit,'(A,2I4,2I3,1P2E14.6)')
9dcf02c6ac Jean*0617 & ' BBerr - Bug: IceT(2) > 0',i,j,bi,bj,tIc2(i,j)
0618 ENDIF
87ea84cac6 Jean*0619
7269783f6f Jean*0620 IF ( dBug(i,j,bi,bj) ) THEN
a85293d087 Mart*0621 WRITE(stdUnit,1020) 'ThSI_SOLV_4T: tSrf,Tice(1,2), dTsurf=',
0622 & tSrf(i,j), tIc1(i,j), tIc2(i,j), dTsrf(i,j)
389b16a470 Jean*0623 WRITE(stdUnit,1020) 'ThSI_SOLV_4T: sHeat, flxCndBt, Qice =',
9dcf02c6ac Jean*0624 & sHeat(i,j), flxCnB(i,j), qIc1(i,j), qIc2(i,j)
389b16a470 Jean*0625 WRITE(stdUnit,1020) 'ThSI_SOLV_4T: flxA, evpA, fxSW_bf,af=',
7269783f6f Jean*0626 & flxAtm(i,j), evpAtm(i,j), netSW, flxSW(i,j)
0627 ENDIF
0628 #endif
9dcf02c6ac Jean*0629
7269783f6f Jean*0630 ELSE
9dcf02c6ac Jean*0631
0632
0633
a85293d087 Mart*0634 dTsrf (i,j) = 0. _d 0
9dcf02c6ac Jean*0635
0636
0637
0638
0639
7269783f6f Jean*0640 ENDIF
0641 ENDDO
0642 ENDDO
87ea84cac6 Jean*0643 #endif /* ALLOW_THSICE */
0644
a85293d087 Mart*0645
87ea84cac6 Jean*0646
0647 RETURN
0648 END