11 |
C !INTERFACE: |
C !INTERFACE: |
12 |
SUBROUTINE SEAICE_SOLVE4TEMP( |
SUBROUTINE SEAICE_SOLVE4TEMP( |
13 |
I UG, HICE_ACTUAL, HSNOW_ACTUAL, |
I UG, HICE_ACTUAL, HSNOW_ACTUAL, |
14 |
#ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET |
#ifdef SEAICE_CAP_SUBLIM |
15 |
I F_lh_max, |
I F_lh_max, |
16 |
#endif |
#endif |
17 |
U TSURF, |
U TSURF, |
39 |
#include "SEAICE_SIZE.h" |
#include "SEAICE_SIZE.h" |
40 |
#include "SEAICE_PARAMS.h" |
#include "SEAICE_PARAMS.h" |
41 |
#include "SEAICE.h" |
#include "SEAICE.h" |
|
#ifdef SEAICE_VARIABLE_FREEZING_POINT |
|
42 |
#include "DYNVARS.h" |
#include "DYNVARS.h" |
|
#endif /* SEAICE_VARIABLE_FREEZING_POINT */ |
|
43 |
#ifdef ALLOW_EXF |
#ifdef ALLOW_EXF |
44 |
# include "EXF_FIELDS.h" |
# include "EXF_FIELDS.h" |
45 |
#endif |
#endif |
70 |
_RL UG (1:sNx,1:sNy) |
_RL UG (1:sNx,1:sNy) |
71 |
_RL HICE_ACTUAL (1:sNx,1:sNy) |
_RL HICE_ACTUAL (1:sNx,1:sNy) |
72 |
_RL HSNOW_ACTUAL(1:sNx,1:sNy) |
_RL HSNOW_ACTUAL(1:sNx,1:sNy) |
73 |
#ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET |
#ifdef SEAICE_CAP_SUBLIM |
74 |
_RL F_lh_max (1:sNx,1:sNy) |
_RL F_lh_max (1:sNx,1:sNy) |
75 |
#endif |
#endif |
76 |
_RL TSURF (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
_RL TSURF (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
86 |
C !LOCAL VARIABLES: |
C !LOCAL VARIABLES: |
87 |
C === Local variables === |
C === Local variables === |
88 |
C i, j :: Loop counters |
C i, j :: Loop counters |
89 |
C kSrf :: vertical index of surface layer |
C kSurface :: vertical index of surface layer |
90 |
INTEGER i, j |
INTEGER i, j |
91 |
#ifdef SEAICE_VARIABLE_FREEZING_POINT |
INTEGER kSurface |
|
INTEGER kSrf |
|
|
#endif /* SEAICE_VARIABLE_FREEZING_POINT */ |
|
92 |
INTEGER ITER |
INTEGER ITER |
93 |
C TB :: ocean temperature in contact with ice (=seawater freezing point) (K) |
C tempFrz :: ocean temperature in contact with ice (=seawater freezing point) (K) |
94 |
_RL TB (1:sNx,1:sNy) |
_RL tempFrz (1:sNx,1:sNy) |
95 |
_RL D1, D1I |
_RL D1, D1I |
96 |
_RL D3(1:sNx,1:sNy) |
_RL D3(1:sNx,1:sNy) |
97 |
_RL TMELT, XKI, XKS, HCUT, XIO |
_RL TMELT, XKI, XKS, HCUT, XIO |
174 |
cc1 = cc0*aa1*bb1*Ppascals*lnTEN |
cc1 = cc0*aa1*bb1*Ppascals*lnTEN |
175 |
cc2 = cc0*bb2 |
cc2 = cc0*bb2 |
176 |
|
|
177 |
#ifdef SEAICE_VARIABLE_FREEZING_POINT |
IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN |
178 |
kSrf = 1 |
kSurface = Nr |
179 |
#endif /* SEAICE_VARIABLE_FREEZING_POINT */ |
ELSE |
180 |
|
kSurface = 1 |
181 |
|
ENDIF |
182 |
|
|
183 |
C SENSIBLE HEAT CONSTANT |
C SENSIBLE HEAT CONSTANT |
184 |
D1=SEAICE_dalton*SEAICE_cpAir*SEAICE_rhoAir |
D1=SEAICE_dalton*SEAICE_cpAir*SEAICE_rhoAir |
231 |
lwdownLoc(I,J) = MAX( MIN_LWDOWN, LWDOWN(I,J,bi,bj) ) |
lwdownLoc(I,J) = MAX( MIN_LWDOWN, LWDOWN(I,J,bi,bj) ) |
232 |
atempLoc (I,J) = MAX( celsius2K+MIN_ATEMP, ATEMP(I,J,bi,bj) ) |
atempLoc (I,J) = MAX( celsius2K+MIN_ATEMP, ATEMP(I,J,bi,bj) ) |
233 |
|
|
234 |
C FREEZING TEMPERATURE OF SEAWATER |
c FREEZING TEMP. OF SEA WATER (K) |
235 |
#ifdef SEAICE_VARIABLE_FREEZING_POINT |
tempFrz(I,J) = SEAICE_dTempFrz_dS *salt(I,J,kSurface,bi,bj) |
236 |
C Use a variable seawater freezing point |
& + SEAICE_tempFrz0 + celsius2K |
237 |
TB(I,J) = -0.0575 _d 0*salt(I,J,kSrf,bi,bj) + 0.0901 _d 0 |
|
|
& + celsius2K |
|
|
#else |
|
|
C Use a constant freezing temperature (SEAICE_VARIABLE_FREEZING_POINT undef) |
|
|
C old SOLVE4TEMP_LEGACY setting (not consistent with seaice_growth value) |
|
|
c TB(I,J) = 271.2 _d 0 |
|
|
TB(I,J) = celsius2K + SEAICE_freeze |
|
|
#endif /* SEAICE_VARIABLE_FREEZING_POINT */ |
|
|
|
|
238 |
C Now determine fixed (relative to tsurf) forcing term in heat budget |
C Now determine fixed (relative to tsurf) forcing term in heat budget |
239 |
|
|
240 |
IF(HSNOW_ACTUAL(I,J).GT.0.0) THEN |
IF(HSNOW_ACTUAL(I,J).GT.0.0) THEN |
386 |
ENDIF |
ENDIF |
387 |
|
|
388 |
C Calculate the flux terms based on the updated tsurfLoc |
C Calculate the flux terms based on the updated tsurfLoc |
389 |
F_c(I,J) = effConduct(I,J)*(TB(I,J)-tsurfLoc(I,J)) |
F_c(I,J) = effConduct(I,J)*(tempFrz(I,J)-tsurfLoc(I,J)) |
390 |
F_lh(I,J) = D1I*UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj)) |
F_lh(I,J) = D1I*UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj)) |
391 |
#ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET |
#ifdef SEAICE_CAP_SUBLIM |
392 |
C if the latent heat flux implied by tsurfLoc exceeds |
C if the latent heat flux implied by tsurfLoc exceeds |
393 |
C F_lh_max, cap F_lh and decouple the flux magnitude from TICE |
C F_lh_max, cap F_lh and decouple the flux magnitude from TICE |
394 |
IF (F_lh(I,J) .GT. F_lh_max(I,J)) THEN |
IF (F_lh(I,J) .GT. F_lh_max(I,J)) THEN |
395 |
F_lh(I,J) = F_lh_max(I,J) |
F_lh(I,J) = F_lh_max(I,J) |
396 |
dqh_dTs(I,J) = ZERO |
dqh_dTs(I,J) = ZERO |
397 |
ENDIF |
ENDIF |
398 |
#endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */ |
#endif /* SEAICE_CAP_SUBLIM */ |
399 |
|
|
400 |
F_lwu(I,J) = t4 * D3(I,J) |
F_lwu(I,J) = t4 * D3(I,J) |
401 |
F_sens(I,J)= D1 * UG(I,J) * (t1 - atempLoc(I,J)) |
F_sens(I,J)= D1 * UG(I,J) * (t1 - atempLoc(I,J)) |
485 |
C over ice specific humidity |
C over ice specific humidity |
486 |
qhice(I,J) = bb1*mm_pi/( Ppascals -(1.0 _d 0 - bb1)*mm_pi ) |
qhice(I,J) = bb1*mm_pi/( Ppascals -(1.0 _d 0 - bb1)*mm_pi ) |
487 |
ENDIF |
ENDIF |
488 |
F_c(I,J) = effConduct(I,J) * (TB(I,J) - t1) |
F_c(I,J) = effConduct(I,J) * (tempFrz(I,J) - t1) |
489 |
F_lh(I,J) = D1I * UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj)) |
F_lh(I,J) = D1I * UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj)) |
490 |
#ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET |
#ifdef SEAICE_CAP_SUBLIM |
491 |
IF (F_lh(I,J) .GT. F_lh_max(I,J)) THEN |
IF (F_lh(I,J) .GT. F_lh_max(I,J)) THEN |
492 |
F_lh(I,J) = F_lh_max(I,J) |
F_lh(I,J) = F_lh_max(I,J) |
493 |
ENDIF |
ENDIF |
494 |
#endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */ |
#endif /* SEAICE_CAP_SUBLIM */ |
495 |
F_lwu(I,J) = t4 * D3(I,J) |
F_lwu(I,J) = t4 * D3(I,J) |
496 |
F_sens(I,J) = D1 * UG(I,J) * (t1 - atempLoc(I,J)) |
F_sens(I,J) = D1 * UG(I,J) * (t1 - atempLoc(I,J)) |
497 |
C The flux between the ice/snow surface and the atmosphere. |
C The flux between the ice/snow surface and the atmosphere. |
501 |
ELSEIF ( postSolvTempIter.EQ.1 ) THEN |
ELSEIF ( postSolvTempIter.EQ.1 ) THEN |
502 |
C Update fluxes (consistent with the linearized formulation) |
C Update fluxes (consistent with the linearized formulation) |
503 |
delTsurf = tsurfLoc(I,J)-tsurfPrev(I,J) |
delTsurf = tsurfLoc(I,J)-tsurfPrev(I,J) |
504 |
F_c(I,J) = effConduct(I,J)*(TB(I,J)-tsurfLoc(I,J)) |
F_c(I,J) = effConduct(I,J)*(tempFrz(I,J)-tsurfLoc(I,J)) |
505 |
F_ia(I,J) = F_ia(I,J) + dFia_dTs(I,J)*delTsurf |
F_ia(I,J) = F_ia(I,J) + dFia_dTs(I,J)*delTsurf |
506 |
F_lh(I,J) = F_lh(I,J) |
F_lh(I,J) = F_lh(I,J) |
507 |
& + D1I*UG(I,J)*dqh_dTs(I,J)*delTsurf |
& + D1I*UG(I,J)*dqh_dTs(I,J)*delTsurf |
547 |
print '(A,4(1x,D24.15))', |
print '(A,4(1x,D24.15))', |
548 |
& 'ibi F(c,lh,sens) ', |
& 'ibi F(c,lh,sens) ', |
549 |
& F_c(I,J), F_lh(I,J), F_sens(I,J) |
& F_c(I,J), F_lh(I,J), F_sens(I,J) |
550 |
#ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET |
#ifdef SEAICE_CAP_SUBLIM |
551 |
IF (F_lh_max(I,J) .GT. ZERO) THEN |
IF (F_lh_max(I,J) .GT. ZERO) THEN |
552 |
print '(A,4(1x,D24.15))', |
print '(A,4(1x,D24.15))', |
553 |
& 'ibi F_lh_max, F_lh/lhmax) ', |
& 'ibi F_lh_max, F_lh/lhmax) ', |
560 |
& 'ibi FWsub, FWsubm*dT/rhoI ', |
& 'ibi FWsub, FWsubm*dT/rhoI ', |
561 |
& FWsublim(I,J), |
& FWsublim(I,J), |
562 |
& FWsublim(I,J)*SEAICE_deltaTtherm/SEAICE_rhoICE |
& FWsublim(I,J)*SEAICE_deltaTtherm/SEAICE_rhoICE |
563 |
#endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */ |
#endif /* SEAICE_CAP_SUBLIM */ |
564 |
print '(A,4(1x,D24.15))', |
print '(A,4(1x,D24.15))', |
565 |
& 'ibi F_ia, F_ia_net, F_c ', |
& 'ibi F_ia, F_ia_net, F_c ', |
566 |
& F_ia(I,J), F_ia_net, F_c(I,J) |
& F_ia(I,J), F_ia_net, F_c(I,J) |