** Warning **
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=MITgcm at /usr/local/share/lxr/lib/LXR/Common.pm line 1224.
Last-Modified: Mon, 22 Feb 2026 06:09:19 GMT
Content-Type: text/html; charset=utf-8
MITgcm/MITgcm/pkg/thsice/thsice_solve4temp.F
File indexing completed on 2023-02-03 06:10:35 UTC
view on github raw 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