458 |
C ===========PART 1: treat pathological cases (post advdiff)=========== |
C ===========PART 1: treat pathological cases (post advdiff)=========== |
459 |
C ===================================================================== |
C ===================================================================== |
460 |
|
|
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
|
|
|
DO J=1,sNy |
|
|
DO I=1,sNx |
|
|
HEFFpreTH(I,J)=HEFFNM1(I,J,bi,bj) |
|
|
HSNWpreTH(I,J)=HSNOW(I,J,bi,bj) |
|
|
AREApreTH(I,J)=AREANM1(I,J,bi,bj) |
|
|
d_HEFFbyNEG(I,J)=0. _d 0 |
|
|
d_HSNWbyNEG(I,J)=0. _d 0 |
|
|
#ifdef ALLOW_DIAGNOSTICS |
|
|
DIAGarrayA(I,J) = AREANM1(I,J,bi,bj) |
|
|
DIAGarrayB(I,J) = AREANM1(I,J,bi,bj) |
|
|
DIAGarrayC(I,J) = HEFFNM1(I,J,bi,bj) |
|
|
DIAGarrayD(I,J) = HSNOW(I,J,bi,bj) |
|
|
#endif |
|
|
ENDDO |
|
|
ENDDO |
|
|
#ifdef SEAICE_ITD |
|
|
DO IT=1,nITD |
|
|
DO J=1,sNy |
|
|
DO I=1,sNx |
|
|
HEFFITDpreTH(I,J,IT)=HEFFITD(I,J,IT,bi,bj) |
|
|
HSNWITDpreTH(I,J,IT)=HSNOWITD(I,J,IT,bi,bj) |
|
|
AREAITDpreTH(I,J,IT)=AREAITD(I,J,IT,bi,bj) |
|
|
ENDDO |
|
|
ENDDO |
|
|
ENDDO |
|
|
#endif |
|
|
|
|
|
#else /* SEAICE_GROWTH_LEGACY */ |
|
|
|
|
461 |
#if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ) |
#if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ) |
462 |
Cgf no dependency through pathological cases treatment |
Cgf no dependency through pathological cases treatment |
463 |
IF ( SEAICEadjMODE.EQ.0 ) THEN |
IF ( SEAICEadjMODE.EQ.0 ) THEN |
798 |
ENDDO |
ENDDO |
799 |
#endif /* SEAICE_VARIABLE_SALINITY */ |
#endif /* SEAICE_VARIABLE_SALINITY */ |
800 |
|
|
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
|
|
|
801 |
#ifdef ALLOW_DIAGNOSTICS |
#ifdef ALLOW_DIAGNOSTICS |
802 |
IF ( useDiagnostics ) THEN |
IF ( useDiagnostics ) THEN |
803 |
CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIareaPR',0,1,3,bi,bj,myThid) |
CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIareaPR',0,1,3,bi,bj,myThid) |
869 |
|
|
870 |
#ifdef SEAICE_ITD |
#ifdef SEAICE_ITD |
871 |
IF (HEFFITDpreTH(I,J,IT) .GT. ZERO) THEN |
IF (HEFFITDpreTH(I,J,IT) .GT. ZERO) THEN |
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
tmpscal1 = MAX(SEAICE_area_reg/float(nITD), |
|
|
& AREAITDpreTH(I,J,IT)) |
|
|
hsnowActualMult(I,J,IT) = HSNWITDpreTH(I,J,IT)/tmpscal1 |
|
|
tmpscal2 = HEFFITDpreTH(I,J,IT)/tmpscal1 |
|
|
heffActualMult(I,J,IT) = MAX(tmpscal2,SEAICE_hice_reg) |
|
|
#else /* SEAICE_GROWTH_LEGACY */ |
|
872 |
cif regularize AREA with SEAICE_area_reg |
cif regularize AREA with SEAICE_area_reg |
873 |
tmpscal1 = SQRT(AREAITDpreTH(I,J,IT) * AREAITDpreTH(I,J,IT) |
tmpscal1 = SQRT(AREAITDpreTH(I,J,IT) * AREAITDpreTH(I,J,IT) |
874 |
& + area_reg_sq) |
& + area_reg_sq) |
879 |
& + hice_reg_sq) |
& + hice_reg_sq) |
880 |
cif hsnowActual calculated with the regularized AREA |
cif hsnowActual calculated with the regularized AREA |
881 |
hsnowActualMult(I,J,IT) = HSNWITDpreTH(I,J,IT) / tmpscal1 |
hsnowActualMult(I,J,IT) = HSNWITDpreTH(I,J,IT) / tmpscal1 |
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
882 |
cif regularize the inverse of heffActual by hice_reg |
cif regularize the inverse of heffActual by hice_reg |
883 |
recip_heffActualMult(I,J,IT) = AREAITDpreTH(I,J,IT) / |
recip_heffActualMult(I,J,IT) = AREAITDpreTH(I,J,IT) / |
884 |
& sqrt(HEFFITDpreTH(I,J,IT) * HEFFITDpreTH(I,J,IT) |
& sqrt(HEFFITDpreTH(I,J,IT) * HEFFITDpreTH(I,J,IT) |
891 |
ENDIF |
ENDIF |
892 |
#else /* SEAICE_ITD */ |
#else /* SEAICE_ITD */ |
893 |
IF (HEFFpreTH(I,J) .GT. ZERO) THEN |
IF (HEFFpreTH(I,J) .GT. ZERO) THEN |
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
tmpscal1 = MAX(SEAICE_area_reg,AREApreTH(I,J)) |
|
|
hsnowActual(I,J) = HSNWpreTH(I,J)/tmpscal1 |
|
|
tmpscal2 = HEFFpreTH(I,J)/tmpscal1 |
|
|
heffActual(I,J) = MAX(tmpscal2,SEAICE_hice_reg) |
|
|
#else /* SEAICE_GROWTH_LEGACY */ |
|
894 |
Cif regularize AREA with SEAICE_area_reg |
Cif regularize AREA with SEAICE_area_reg |
895 |
tmpscal1 = SQRT(AREApreTH(I,J)* AREApreTH(I,J) + area_reg_sq) |
tmpscal1 = SQRT(AREApreTH(I,J)* AREApreTH(I,J) + area_reg_sq) |
896 |
Cif heffActual calculated with the regularized AREA |
Cif heffActual calculated with the regularized AREA |
899 |
heffActual(I,J) = SQRT(tmpscal2 * tmpscal2 + hice_reg_sq) |
heffActual(I,J) = SQRT(tmpscal2 * tmpscal2 + hice_reg_sq) |
900 |
Cif hsnowActual calculated with the regularized AREA |
Cif hsnowActual calculated with the regularized AREA |
901 |
hsnowActual(I,J) = HSNWpreTH(I,J) / tmpscal1 |
hsnowActual(I,J) = HSNWpreTH(I,J) / tmpscal1 |
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
902 |
Cif regularize the inverse of heffActual by hice_reg |
Cif regularize the inverse of heffActual by hice_reg |
903 |
recip_heffActual(I,J) = AREApreTH(I,J) / |
recip_heffActual(I,J) = AREApreTH(I,J) / |
904 |
& sqrt(HEFFpreTH(I,J)*HEFFpreTH(I,J) + hice_reg_sq) |
& sqrt(HEFFpreTH(I,J)*HEFFpreTH(I,J) + hice_reg_sq) |
1557 |
tmpscal1 = HEFFITDpreTH(I,J,IT) |
tmpscal1 = HEFFITDpreTH(I,J,IT) |
1558 |
& + d_HEFFbySublim_ITD(I,J,IT) |
& + d_HEFFbySublim_ITD(I,J,IT) |
1559 |
& + d_HEFFbyOCNonICE_ITD(I,J,IT) |
& + d_HEFFbyOCNonICE_ITD(I,J,IT) |
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
tmpscal2 = MAX(-tmpscal1, |
|
|
& r_QbyATMmult_cover(I,J,IT)) |
|
|
#else |
|
1560 |
tmpscal2 = MAX(-tmpscal1, |
tmpscal2 = MAX(-tmpscal1, |
1561 |
& r_QbyATMmult_cover(I,J,IT) |
& r_QbyATMmult_cover(I,J,IT) |
1562 |
c Limit ice growth by potential melt by ocean |
c Limit ice growth by potential melt by ocean |
1563 |
& + AREAITDpreTH(I,J,IT) * r_QbyOCN(I,J)) |
& + AREAITDpreTH(I,J,IT) * r_QbyOCN(I,J)) |
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
1564 |
d_HEFFbyATMonOCN_cover_ITD(I,J,IT) = tmpscal2 |
d_HEFFbyATMonOCN_cover_ITD(I,J,IT) = tmpscal2 |
1565 |
d_HEFFbyATMonOCN_cover(I,J) = d_HEFFbyATMonOCN_cover(I,J) |
d_HEFFbyATMonOCN_cover(I,J) = d_HEFFbyATMonOCN_cover(I,J) |
1566 |
& + tmpscal2 |
& + tmpscal2 |
1585 |
DO J=1,sNy |
DO J=1,sNy |
1586 |
DO I=1,sNx |
DO I=1,sNx |
1587 |
|
|
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J)) |
|
|
#else |
|
1588 |
tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J)+ |
tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J)+ |
1589 |
C Limit ice growth by potential melt by ocean |
C Limit ice growth by potential melt by ocean |
1590 |
& AREApreTH(I,J) * r_QbyOCN(I,J)) |
& AREApreTH(I,J) * r_QbyOCN(I,J)) |
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
1591 |
|
|
1592 |
d_HEFFbyATMonOCN_cover(I,J)=tmpscal2 |
d_HEFFbyATMonOCN_cover(I,J)=tmpscal2 |
1593 |
d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal2 |
d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal2 |
1850 |
C convert snow to ice if submerged. |
C convert snow to ice if submerged. |
1851 |
C ================================= |
C ================================= |
1852 |
|
|
|
#ifndef SEAICE_GROWTH_LEGACY |
|
1853 |
C note: in legacy, this process is done at the end |
C note: in legacy, this process is done at the end |
1854 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
1855 |
CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte |
CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte |
1891 |
ENDDO |
ENDDO |
1892 |
#endif |
#endif |
1893 |
ENDIF |
ENDIF |
1894 |
#endif /* SEAICE_GROWTH_LEGACY */ |
|
1895 |
#ifdef SEAICE_DEBUG |
#ifdef SEAICE_DEBUG |
1896 |
c ToM<<< debug seaice_growth |
c ToM<<< debug seaice_growth |
1897 |
WRITE(msgBuf,msgBufForm) |
WRITE(msgBuf,msgBufForm) |
2010 |
ELSE |
ELSE |
2011 |
recip_HO=1. _d 0 / HO |
recip_HO=1. _d 0 / HO |
2012 |
ENDIF |
ENDIF |
2013 |
#ifdef SEAICE_GROWTH_LEGACY |
recip_HH = recip_heffActual(I,J) |
|
tmpscal0=HEFF(I,J,bi,bj) - d_HEFFbyATMonOCN(I,J) |
|
|
recip_HH = AREApreTH(I,J) /(tmpscal0+.00001 _d 0) |
|
|
#else |
|
|
recip_HH = recip_heffActual(I,J) |
|
|
#endif |
|
2014 |
|
|
2015 |
C gain of ice over open water : computed from |
C gain of ice over open water : computed from |
2016 |
C (SEAICE_areaGainFormula.EQ.1) from growth by ATM |
C (SEAICE_areaGainFormula.EQ.1) from growth by ATM |
2146 |
|
|
2147 |
#ifdef SEAICE_VARIABLE_SALINITY |
#ifdef SEAICE_VARIABLE_SALINITY |
2148 |
|
|
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
# ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte |
|
|
# endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
DO J=1,sNy |
|
|
DO I=1,sNx |
|
|
C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean |
|
|
IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN |
|
|
saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) * |
|
|
& HSALT(I,J,bi,bj) * recip_deltaTtherm |
|
|
HSALT(I,J,bi,bj) = 0.0 _d 0 |
|
|
ENDIF |
|
|
ENDDO |
|
|
ENDDO |
|
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
|
|
|
2149 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
2150 |
CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte |
CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte |
2151 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
2192 |
& saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm |
& saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm |
2193 |
saltFlux(I,J,bi,bj) = |
saltFlux(I,J,bi,bj) = |
2194 |
& saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J) |
& saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J) |
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean |
|
|
IF ( HEFF(I,J,bi,bj) .EQ. 0.0 ) THEN |
|
|
saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) - |
|
|
& HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) * recip_deltaTtherm |
|
|
HSALT(I,J,bi,bj) = 0.0 _d 0 |
|
|
#ifdef ALLOW_SALT_PLUME |
|
|
saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0 |
|
|
#endif /* ALLOW_SALT_PLUME */ |
|
|
ENDIF |
|
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
2195 |
ENDDO |
ENDDO |
2196 |
ENDDO |
ENDDO |
2197 |
#endif /* SEAICE_VARIABLE_SALINITY */ |
#endif /* SEAICE_VARIABLE_SALINITY */ |
2198 |
|
|
|
C ======================================================================= |
|
|
C ==LEGACY PART 6 (LEGACY) treat pathological cases, then do flooding === |
|
|
C ======================================================================= |
|
|
|
|
|
#ifdef SEAICE_GROWTH_LEGACY |
|
|
|
|
|
C treat values of ice cover fraction oustide |
|
|
C the [0 1] range, and other such issues. |
|
|
C =========================================== |
|
|
|
|
|
Cgf note: this part cannot be heat and water conserving |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
|
|
CADJ & key = iicekey, byte = isbyte |
|
|
CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, |
|
|
CADJ & key = iicekey, byte = isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
DO J=1,sNy |
|
|
DO I=1,sNx |
|
|
C NOW SET AREA(I,J,bi,bj)=0 WHERE THERE IS NO ICE |
|
|
CML replaced "/.0001 _d 0" by "*1. _d 4", 1e-4 is probably |
|
|
CML meant to be something like a minimum thickness |
|
|
AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj),HEFF(I,J,bi,bj)*1. _d 4) |
|
|
ENDDO |
|
|
ENDDO |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
|
|
CADJ & key = iicekey, byte = isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
DO J=1,sNy |
|
|
DO I=1,sNx |
|
|
C NOW TRUNCATE AREA |
|
|
AREA(I,J,bi,bj)=MIN(ONE,AREA(I,J,bi,bj)) |
|
|
ENDDO |
|
|
ENDDO |
|
|
|
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
|
|
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
|
|
CADJ & key = iicekey, byte = isbyte |
|
|
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
|
|
CADJ & key = iicekey, byte = isbyte |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
|
DO J=1,sNy |
|
|
DO I=1,sNx |
|
|
AREA(I,J,bi,bj) = MAX(ZERO,AREA(I,J,bi,bj)) |
|
|
HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj)) |
|
|
AREA(I,J,bi,bj) = AREA(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
|
|
HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
|
|
#ifdef SEAICE_CAP_HEFF |
|
|
C This is not energy conserving, but at least it conserves fresh water |
|
|
tmpscal0 = -MAX(HEFF(I,J,bi,bj)-MAX_HEFF,0. _d 0) |
|
|
d_HEFFbyNeg(I,J) = d_HEFFbyNeg(I,J) + tmpscal0 |
|
|
HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal0 |
|
|
#endif /* SEAICE_CAP_HEFF */ |
|
|
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
|
|
ENDDO |
|
|
ENDDO |
|
|
|
|
|
C convert snow to ice if submerged. |
|
|
C ================================= |
|
|
|
|
|
IF ( SEAICEuseFlooding ) THEN |
|
|
DO J=1,sNy |
|
|
DO I=1,sNx |
|
|
tmpscal0 = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow |
|
|
& +HEFF(I,J,bi,bj)*SEAICE_rhoIce)*recip_rhoConst |
|
|
tmpscal1 = MAX( 0. _d 0, tmpscal0 - HEFF(I,J,bi,bj)) |
|
|
d_HEFFbyFLOODING(I,J)=tmpscal1 |
|
|
HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J) |
|
|
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)- |
|
|
& d_HEFFbyFLOODING(I,J)*ICE2SNOW |
|
|
ENDDO |
|
|
ENDDO |
|
|
ENDIF |
|
|
|
|
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
|
|
|
2199 |
#ifdef ALLOW_SITRACER |
#ifdef ALLOW_SITRACER |
2200 |
DO J=1,sNy |
DO J=1,sNy |
2201 |
DO I=1,sNx |
DO I=1,sNx |
2257 |
DO J=1,sNy |
DO J=1,sNy |
2258 |
DO I=1,sNx |
DO I=1,sNx |
2259 |
QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) + r_QbyATM_open(I,J) |
QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) + r_QbyATM_open(I,J) |
|
#ifndef SEAICE_GROWTH_LEGACY |
|
|
C in principle a_QSWbyATM_cover should always be included here, however |
|
|
C for backward compatibility it is left out of the LEGACY branch |
|
2260 |
& + a_QSWbyATM_cover(I,J) |
& + a_QSWbyATM_cover(I,J) |
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
2261 |
& - ( d_HEFFbyOCNonICE(I,J) |
& - ( d_HEFFbyOCNonICE(I,J) |
2262 |
& + d_HSNWbyOCNonSNW(I,J)*SNOW2ICE |
& + d_HSNWbyOCNonSNW(I,J)*SNOW2ICE |
2263 |
& + d_HEFFbyNEG(I,J) |
& + d_HEFFbyNEG(I,J) |
2363 |
CML the ice-ocean system. |
CML the ice-ocean system. |
2364 |
SIatmQnt(I,J,bi,bj) = |
SIatmQnt(I,J,bi,bj) = |
2365 |
& maskC(I,J,kSurface,bi,bj)*convertHI2Q*( |
& maskC(I,J,kSurface,bi,bj)*convertHI2Q*( |
|
#ifndef SEAICE_GROWTH_LEGACY |
|
2366 |
& a_QSWbyATM_cover(I,J) + |
& a_QSWbyATM_cover(I,J) + |
|
#endif /* SEAICE_GROWTH_LEGACY */ |
|
2367 |
& a_QbyATM_cover(I,J) + a_QbyATM_open(I,J) ) |
& a_QbyATM_cover(I,J) + a_QbyATM_open(I,J) ) |
2368 |
cgf 2) SItflux (analogous to tflux; includes advection by water |
cgf 2) SItflux (analogous to tflux; includes advection by water |
2369 |
C exchanged between atmosphere and ocean+ice) |
C exchanged between atmosphere and ocean+ice) |