| 1 |
mlosch |
1.3 |
C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.2 2006/12/14 22:31:18 heimbach Exp $ |
| 2 |
heimbach |
1.2 |
C $Name: $ |
| 3 |
mlosch |
1.1 |
|
| 4 |
|
|
#include "SEAICE_OPTIONS.h" |
| 5 |
|
|
|
| 6 |
|
|
CStartOfInterface |
| 7 |
|
|
SUBROUTINE SEAICE_GROWTH( myTime, myIter, myThid ) |
| 8 |
|
|
C /==========================================================\ |
| 9 |
|
|
C | SUBROUTINE seaice_growth | |
| 10 |
|
|
C | o Updata ice thickness and snow depth | |
| 11 |
|
|
C |==========================================================| |
| 12 |
|
|
C \==========================================================/ |
| 13 |
|
|
IMPLICIT NONE |
| 14 |
|
|
|
| 15 |
|
|
C === Global variables === |
| 16 |
|
|
#include "SIZE.h" |
| 17 |
|
|
#include "EEPARAMS.h" |
| 18 |
|
|
#include "PARAMS.h" |
| 19 |
|
|
#include "DYNVARS.h" |
| 20 |
|
|
#include "GRID.h" |
| 21 |
|
|
#include "FFIELDS.h" |
| 22 |
|
|
#include "SEAICE_PARAMS.h" |
| 23 |
|
|
#include "SEAICE.h" |
| 24 |
|
|
#include "SEAICE_FFIELDS.h" |
| 25 |
|
|
|
| 26 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 27 |
|
|
# include "tamc.h" |
| 28 |
|
|
#endif |
| 29 |
|
|
C === Routine arguments === |
| 30 |
|
|
C myTime - Simulation time |
| 31 |
|
|
C myIter - Simulation timestep number |
| 32 |
|
|
C myThid - Thread no. that called this routine. |
| 33 |
|
|
_RL myTime |
| 34 |
|
|
INTEGER myIter, myThid |
| 35 |
|
|
CEndOfInterface |
| 36 |
|
|
|
| 37 |
|
|
C === Local variables === |
| 38 |
|
|
C i,j,bi,bj - Loop counters |
| 39 |
|
|
|
| 40 |
|
|
INTEGER i, j, bi, bj |
| 41 |
mlosch |
1.3 |
C number of surface interface layer |
| 42 |
|
|
INTEGER kSurface |
| 43 |
mlosch |
1.1 |
_RL TBC, salinity_ice, SDF, ICE_DENS, Q0, QS |
| 44 |
|
|
#ifdef ALLOW_SEAICE_FLOODING |
| 45 |
|
|
_RL hDraft, hFlood |
| 46 |
|
|
#endif /* ALLOW_SEAICE_FLOODING */ |
| 47 |
|
|
_RL GAREA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) |
| 48 |
|
|
_RL GHEFF ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) |
| 49 |
|
|
C RESID_HEAT is residual heat above freezing in equivalent m of ice |
| 50 |
|
|
_RL RESID_HEAT ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) |
| 51 |
|
|
|
| 52 |
|
|
C FICE - thermodynamic ice growth rate over sea ice in W/m^2 |
| 53 |
|
|
C >0 causes ice growth, <0 causes snow and sea ice melt |
| 54 |
|
|
C FHEFF - effective thermodynamic ice growth rate over sea ice in W/m^2 |
| 55 |
|
|
C >0 causes ice growth, <0 causes snow and sea ice melt |
| 56 |
|
|
C QNETO - thermodynamic ice growth rate over open water in W/m^2 |
| 57 |
|
|
C ( = surface heat flux ) |
| 58 |
|
|
C >0 causes ice growth, <0 causes snow and sea ice melt |
| 59 |
|
|
C QNETI - net surface heat flux under ice in W/m^2 |
| 60 |
|
|
C QSWO - short wave heat flux over ocean in W/m^2 |
| 61 |
|
|
C QSWI - short wave heat flux under ice in W/m^2 |
| 62 |
|
|
_RL FHEFF (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 63 |
|
|
_RL FICE (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 64 |
|
|
_RL QNETO (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 65 |
|
|
_RL QNETI (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 66 |
|
|
_RL QSWO (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 67 |
|
|
_RL QSWI (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 68 |
|
|
C |
| 69 |
|
|
_RL HCORR (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 70 |
|
|
C SEAICE_SALT contains m of ice melted (<0) or created (>0) |
| 71 |
|
|
_RL SEAICE_SALT(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
| 72 |
|
|
C actual ice thickness |
| 73 |
|
|
_RL HICE (1-OLx:sNx+OLx, 1-OLy:sNy+OLy) |
| 74 |
|
|
C actual snow thickness |
| 75 |
|
|
_RL hSnwLoc(1-OLx:sNx+OLx, 1-OLy:sNy+OLy) |
| 76 |
|
|
C wind speed |
| 77 |
|
|
_RL UG (1-OLx:sNx+OLx, 1-OLy:sNy+OLy) |
| 78 |
|
|
_RL SPEED_SQ |
| 79 |
mlosch |
1.3 |
C local copy of AREA |
| 80 |
|
|
_RL areaLoc(1-OLx:sNx+OLx, 1-OLy:sNy+OLy) |
| 81 |
mlosch |
1.1 |
|
| 82 |
|
|
#ifdef SEAICE_MULTILEVEL |
| 83 |
|
|
INTEGER it |
| 84 |
|
|
INTEGER ilockey |
| 85 |
|
|
_RL RK |
| 86 |
|
|
_RL HICEP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy) |
| 87 |
|
|
_RL FICEP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy) |
| 88 |
|
|
#endif |
| 89 |
|
|
|
| 90 |
|
|
if ( buoyancyRelation .eq. 'OCEANICP' ) then |
| 91 |
|
|
kSurface = Nr |
| 92 |
|
|
else |
| 93 |
|
|
kSurface = 1 |
| 94 |
|
|
endif |
| 95 |
|
|
|
| 96 |
mlosch |
1.3 |
C ICE SALINITY (g/kg) |
| 97 |
|
|
salinity_ice = 4.0 _d 0 |
| 98 |
|
|
C FREEZING TEMP. OF SEA WATER (deg C) |
| 99 |
|
|
TBC = SEAICE_freeze |
| 100 |
|
|
C RATIO OF WATER DESITY TO SNOW DENSITY |
| 101 |
|
|
SDF = 1000.0 _d 0/330.0 _d 0 |
| 102 |
|
|
C RATIO OF SEA ICE DESITY TO WATER DENSITY |
| 103 |
|
|
ICE_DENS = 0.920 _d 0 |
| 104 |
|
|
C INVERSE HEAT OF FUSION OF ICE (m^3/J) |
| 105 |
|
|
Q0 = 1.0 _d -06 / 302.0 _d +00 |
| 106 |
|
|
C HEAT OF FUSION OF SNOW (J/m^3) |
| 107 |
|
|
QS = 1.1 _d +08 |
| 108 |
mlosch |
1.1 |
|
| 109 |
|
|
DO bj=myByLo(myThid),myByHi(myThid) |
| 110 |
|
|
DO bi=myBxLo(myThid),myBxHi(myThid) |
| 111 |
|
|
c |
| 112 |
|
|
cph( |
| 113 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 114 |
|
|
act1 = bi - myBxLo(myThid) |
| 115 |
|
|
max1 = myBxHi(myThid) - myBxLo(myThid) + 1 |
| 116 |
|
|
act2 = bj - myByLo(myThid) |
| 117 |
|
|
max2 = myByHi(myThid) - myByLo(myThid) + 1 |
| 118 |
|
|
act3 = myThid - 1 |
| 119 |
|
|
max3 = nTx*nTy |
| 120 |
|
|
act4 = ikey_dynamics - 1 |
| 121 |
|
|
iicekey = (act1 + 1) + act2*max1 |
| 122 |
|
|
& + act3*max1*max2 |
| 123 |
|
|
& + act4*max1*max2*max3 |
| 124 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 125 |
|
|
C |
| 126 |
|
|
C initialise a few fields |
| 127 |
|
|
C |
| 128 |
heimbach |
1.2 |
#ifdef ALLOW_AUTODIFF_TAMC |
| 129 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 130 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 131 |
|
|
CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, |
| 132 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 133 |
|
|
CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, |
| 134 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 135 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 136 |
mlosch |
1.1 |
DO J=1,sNy |
| 137 |
|
|
DO I=1,sNx |
| 138 |
mlosch |
1.3 |
areaLoc(I,J) = MAX(A22,AREA(I,J,2,bi,bj)) |
| 139 |
|
|
FHEFF(I,J) = 0.0 _d 0 |
| 140 |
|
|
FICE (I,J) = 0.0 _d 0 |
| 141 |
mlosch |
1.1 |
#ifdef SEAICE_MULTILEVEL |
| 142 |
mlosch |
1.3 |
FICEP(I,J) = 0.0 _d 0 |
| 143 |
mlosch |
1.1 |
#endif |
| 144 |
mlosch |
1.3 |
FHEFF(I,J) = 0.0 _d 0 |
| 145 |
|
|
FICE (I,J) = 0.0 _d 0 |
| 146 |
|
|
QNETO(I,J) = 0.0 _d 0 |
| 147 |
|
|
QNETI(I,J) = 0.0 _d 0 |
| 148 |
|
|
QSWO (I,J) = 0.0 _d 0 |
| 149 |
|
|
QSWI (I,J) = 0.0 _d 0 |
| 150 |
|
|
HCORR(I,J) = 0.0 _d 0 |
| 151 |
|
|
SEAICE_SALT(I,J) = 0.0 _d 0 |
| 152 |
|
|
RESID_HEAT (I,J) = 0.0 _d 0 |
| 153 |
mlosch |
1.1 |
ENDDO |
| 154 |
|
|
ENDDO |
| 155 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 156 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 157 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 158 |
heimbach |
1.2 |
CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj, |
| 159 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 160 |
|
|
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
| 161 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 162 |
mlosch |
1.1 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 163 |
heimbach |
1.2 |
DO J=1,sNy |
| 164 |
|
|
DO I=1,sNx |
| 165 |
|
|
cph need to adjoint-store AREA again before using it in further init. |
| 166 |
|
|
cph (all these initialisations involving AREA are nasty "non-linear") |
| 167 |
mlosch |
1.3 |
HICE(I,J) = HEFF(I,J,2,bi,bj)/areaLoc(I,J) |
| 168 |
|
|
hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc(I,J) |
| 169 |
heimbach |
1.2 |
ENDDO |
| 170 |
|
|
ENDDO |
| 171 |
mlosch |
1.1 |
|
| 172 |
|
|
C NOW DETERMINE MIXED LAYER TEMPERATURE |
| 173 |
|
|
DO J=1,sNy |
| 174 |
|
|
DO I=1,sNx |
| 175 |
|
|
TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00 |
| 176 |
|
|
#ifdef SEAICE_DEBUG |
| 177 |
|
|
TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00) |
| 178 |
|
|
#endif |
| 179 |
|
|
ENDDO |
| 180 |
|
|
ENDDO |
| 181 |
|
|
|
| 182 |
|
|
C THERMAL WIND OF ATMOSPHERE |
| 183 |
|
|
DO J=1,sNy |
| 184 |
|
|
DO I=1,sNx |
| 185 |
|
|
CML#ifdef SEAICE_EXTERNAL_FORCING |
| 186 |
|
|
CMLC this seems to be more natural as we do compute the wind speed in |
| 187 |
|
|
CMLC pkg/exf/exf_wind.F, but it changes the results |
| 188 |
|
|
CML UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj)) |
| 189 |
|
|
CML#else |
| 190 |
|
|
SPEED_SQ = UWIND(I,J,bi,bj)**2 + VWIND(I,J,bi,bj)**2 |
| 191 |
|
|
IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN |
| 192 |
|
|
UG(I,J)=SEAICE_EPS |
| 193 |
|
|
ELSE |
| 194 |
|
|
UG(I,J)=SQRT(SPEED_SQ) |
| 195 |
|
|
ENDIF |
| 196 |
|
|
CML#endif /* SEAICE_EXTERNAL_FORCING */ |
| 197 |
|
|
ENDDO |
| 198 |
|
|
ENDDO |
| 199 |
|
|
|
| 200 |
|
|
|
| 201 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 202 |
heimbach |
1.2 |
cphCADJ STORE heff = comlev1, key = ikey_dynamics |
| 203 |
|
|
cphCADJ STORE hsnow = comlev1, key = ikey_dynamics |
| 204 |
|
|
cphCADJ STORE uwind = comlev1, key = ikey_dynamics |
| 205 |
|
|
cphCADJ STORE vwind = comlev1, key = ikey_dynamics |
| 206 |
|
|
c |
| 207 |
mlosch |
1.1 |
CADJ STORE tice = comlev1, key = ikey_dynamics |
| 208 |
|
|
# ifdef SEAICE_MULTILEVEL |
| 209 |
|
|
CADJ STORE tices = comlev1, key = ikey_dynamics |
| 210 |
|
|
# endif |
| 211 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 212 |
|
|
|
| 213 |
|
|
C NOW DETERMINE GROWTH RATES |
| 214 |
|
|
C FIRST DO OPEN WATER |
| 215 |
|
|
CALL SEAICE_BUDGET_OCEAN( |
| 216 |
|
|
I UG, |
| 217 |
|
|
U TMIX, |
| 218 |
|
|
O QNETO, QSWO, |
| 219 |
|
|
I bi, bj) |
| 220 |
|
|
|
| 221 |
|
|
C NOW DO ICE |
| 222 |
|
|
#ifdef SEAICE_MULTILEVEL |
| 223 |
|
|
C-- Start loop over muli-levels |
| 224 |
|
|
DO IT=1,MULTDIM |
| 225 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 226 |
|
|
ilockey = (iicekey-1)*MULTDIM + IT |
| 227 |
|
|
CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim, |
| 228 |
|
|
CADJ & key = ilockey, byte = isbyte |
| 229 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 230 |
|
|
DO J=1,sNy |
| 231 |
|
|
DO I=1,sNx |
| 232 |
|
|
RK=IT*1.0 |
| 233 |
|
|
HICEP(I,J)=(HICE(I,J)/7.0 _d 0)*((2.0 _d 0*RK)-1.0 _d 0) |
| 234 |
|
|
TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj) |
| 235 |
|
|
ENDDO |
| 236 |
|
|
ENDDO |
| 237 |
|
|
CALL SEAICE_BUDGET_ICE( |
| 238 |
|
|
I UG, HICE, hSnwLoc, |
| 239 |
|
|
U TICE, |
| 240 |
|
|
O FICE, QSWI, |
| 241 |
|
|
I bi, bj) |
| 242 |
|
|
DO J=1,sNy |
| 243 |
|
|
DO I=1,sNx |
| 244 |
|
|
FICEP(I,J)=(FICE(I,J)/7.0 _d 0)+FICEP(I,J) |
| 245 |
|
|
TICES(I,J,IT,bi,bj)=TICE(I,J,bi,bj) |
| 246 |
|
|
ENDDO |
| 247 |
|
|
ENDDO |
| 248 |
|
|
ENDDO |
| 249 |
|
|
C-- End loop over muli-levels |
| 250 |
|
|
DO J=1,sNy |
| 251 |
|
|
DO I=1,sNx |
| 252 |
|
|
FICE(I,J)=FICEP(I,J) |
| 253 |
|
|
ENDDO |
| 254 |
|
|
ENDDO |
| 255 |
|
|
#else /* SEAICE_MULTILEVEL */ |
| 256 |
|
|
CALL SEAICE_BUDGET_ICE( |
| 257 |
|
|
I UG, HICE, hSnwLoc, |
| 258 |
|
|
U TICE, |
| 259 |
|
|
O FICE, QSWI, |
| 260 |
|
|
I bi, bj) |
| 261 |
|
|
#endif /* SEAICE_MULTILEVEL */ |
| 262 |
|
|
|
| 263 |
mlosch |
1.3 |
#ifdef ALLOW_AUTODIFF_TAMC |
| 264 |
|
|
CADJ STORE theta(:,:,:,bi,bj)= comlev1_bibj, |
| 265 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 266 |
|
|
CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj, |
| 267 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 268 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 269 |
|
|
DO J=1,sNy |
| 270 |
|
|
DO I=1,sNx |
| 271 |
|
|
C-- Create or melt sea-ice so that first-level oceanic temperature |
| 272 |
|
|
C is approximately at the freezing point when there is sea-ice. |
| 273 |
|
|
C Initially the units of YNEG are m of sea-ice. |
| 274 |
|
|
C The factor dRf(1)/72.0764, used to convert temperature |
| 275 |
|
|
C change in deg K to m of sea-ice, is approximately: |
| 276 |
|
|
C dRf(1) * (sea water heat capacity = 3996 J/kg/K) |
| 277 |
|
|
C * (density of sea-water = 1026 kg/m^3) |
| 278 |
|
|
C / (latent heat of fusion of sea-ice = 334000 J/kg) |
| 279 |
|
|
C / (density of sea-ice = 910 kg/m^3) |
| 280 |
|
|
C Negative YNEG leads to ice growth. |
| 281 |
|
|
C Positive YNEG leads to ice melting. |
| 282 |
|
|
IF ( .NOT. inAdMode ) THEN |
| 283 |
|
|
#ifdef SEAICE_VARIABLE_FREEZING_POINT |
| 284 |
|
|
TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0 |
| 285 |
|
|
#endif /* SEAICE_VARIABLE_FREEZING_POINT */ |
| 286 |
|
|
YNEG(I,J,bi,bj) = (theta(I,J,kSurface,bi,bj)-TBC) |
| 287 |
|
|
& *dRf(1)/72.0764 _d 0 |
| 288 |
|
|
ELSE |
| 289 |
|
|
YNEG(I,J,bi,bj)= 0. |
| 290 |
|
|
ENDIF |
| 291 |
|
|
GHEFF(I,J)=HEFF(I,J,1,bi,bj) |
| 292 |
|
|
C Melt (YNEG>0) or create (YNEG<0) sea ice |
| 293 |
|
|
HEFF(I,J,1,bi,bj)=MAX(ZERO,HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj)) |
| 294 |
|
|
RESID_HEAT(I,J) = YNEG(I,J,bi,bj) |
| 295 |
|
|
YNEG(I,J,bi,bj) = GHEFF(I,J)-HEFF(I,J,1,bi,bj) |
| 296 |
|
|
SEAICE_SALT(I,J) = SEAICE_SALT(I,J)-YNEG(I,J,bi,bj) |
| 297 |
|
|
RESID_HEAT(I,J) = RESID_HEAT(I,J)-YNEG(I,J,bi,bj) |
| 298 |
|
|
C YNEG now contains m of ice melted (>0) or created (<0) |
| 299 |
|
|
C SEAICE_SALT contains m of ice melted (<0) or created (>0) |
| 300 |
|
|
C RESID_HEAT is residual heat above freezing in equivalent m of ice |
| 301 |
|
|
ENDDO |
| 302 |
|
|
ENDDO |
| 303 |
|
|
|
| 304 |
mlosch |
1.1 |
cph( |
| 305 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 306 |
|
|
cphCADJ STORE heff = comlev1, key = ikey_dynamics |
| 307 |
|
|
cphCADJ STORE hsnow = comlev1, key = ikey_dynamics |
| 308 |
|
|
#endif |
| 309 |
|
|
cph) |
| 310 |
|
|
c |
| 311 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 312 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 313 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 314 |
|
|
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
| 315 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 316 |
heimbach |
1.2 |
CADJ STORE fice(:,:) = comlev1_bibj, |
| 317 |
mlosch |
1.1 |
CADJ & key = iicekey, byte = isbyte |
| 318 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 319 |
|
|
cph) |
| 320 |
|
|
|
| 321 |
|
|
DO J=1,sNy |
| 322 |
|
|
DO I=1,sNx |
| 323 |
mlosch |
1.3 |
C NOW CALCULATE CORRECTED effective growth in J/m^2 (>0=melt) |
| 324 |
|
|
GHEFF(I,J)=-SEAICE_deltaTtherm*FICE(I,J)*AREA(I,J,2,bi,bj) |
| 325 |
mlosch |
1.1 |
ENDDO |
| 326 |
|
|
ENDDO |
| 327 |
heimbach |
1.2 |
|
| 328 |
mlosch |
1.1 |
#ifdef ALLOW_AUTODIFF_TAMC |
| 329 |
mlosch |
1.3 |
CADJ STORE fice(:,:) = comlev1_bibj, |
| 330 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 331 |
mlosch |
1.1 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 332 |
|
|
|
| 333 |
|
|
DO J=1,sNy |
| 334 |
|
|
DO I=1,sNx |
| 335 |
|
|
IF(FICE(I,J).LT.ZERO.AND.AREA(I,J,2,bi,bj).GT.ZERO) THEN |
| 336 |
|
|
C use FICE to melt snow and CALCULATE CORRECTED GROWTH |
| 337 |
|
|
GAREA(I,J)=HSNOW(I,J,bi,bj)*QS ! effective snow thickness in J/m^2 |
| 338 |
|
|
IF(GHEFF(I,J).LE.GAREA(I,J)) THEN |
| 339 |
|
|
C not enough heat to melt all snow; use up all heat flux FICE |
| 340 |
|
|
HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS |
| 341 |
|
|
C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt |
| 342 |
|
|
C The factor 1/SDF/ICE_DENS converts m of snow to m of sea-ice |
| 343 |
|
|
SEAICE_SALT(I,J)=SEAICE_SALT(I,J) |
| 344 |
|
|
& -GHEFF(I,J)/QS/SDF/ICE_DENS |
| 345 |
|
|
FICE(I,J)=ZERO |
| 346 |
|
|
ELSE |
| 347 |
|
|
C enought heat to melt snow completely; |
| 348 |
|
|
C compute remaining heat flux that will melt ice |
| 349 |
|
|
FICE(I,J)=-(GHEFF(I,J)-GAREA(I,J))/ |
| 350 |
|
|
& SEAICE_deltaTtherm/AREA(I,J,2,bi,bj) |
| 351 |
|
|
C convert all snow to melt water (fresh water flux) |
| 352 |
|
|
SEAICE_SALT(I,J)=SEAICE_SALT(I,J) |
| 353 |
|
|
& -HSNOW(I,J,bi,bj)/SDF/ICE_DENS |
| 354 |
|
|
HSNOW(I,J,bi,bj)=0.0 |
| 355 |
|
|
END IF |
| 356 |
|
|
END IF |
| 357 |
heimbach |
1.2 |
ENDDO |
| 358 |
|
|
ENDDO |
| 359 |
mlosch |
1.1 |
|
| 360 |
heimbach |
1.2 |
#ifdef ALLOW_AUTODIFF_TAMC |
| 361 |
mlosch |
1.3 |
CADJ STORE fice(:,:) = comlev1_bibj, |
| 362 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 363 |
heimbach |
1.2 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 364 |
|
|
|
| 365 |
|
|
DO J=1,sNy |
| 366 |
|
|
DO I=1,sNx |
| 367 |
mlosch |
1.1 |
C NOW GET TOTAL GROWTH RATE in W/m^2, >0 causes ice growth |
| 368 |
|
|
FHEFF(I,J)= FICE(I,J) * AREA(I,J,2,bi,bj) |
| 369 |
|
|
& + QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj)) |
| 370 |
|
|
ENDDO |
| 371 |
|
|
ENDDO |
| 372 |
|
|
cph( |
| 373 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 374 |
|
|
CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj, |
| 375 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 376 |
|
|
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
| 377 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 378 |
mlosch |
1.3 |
CADJ STORE fice(:,:) = comlev1_bibj, |
| 379 |
mlosch |
1.1 |
CADJ & key = iicekey, byte = isbyte |
| 380 |
mlosch |
1.3 |
CADJ STORE fheff(:,:) = comlev1_bibj, |
| 381 |
mlosch |
1.1 |
CADJ & key = iicekey, byte = isbyte |
| 382 |
mlosch |
1.3 |
CADJ STORE qneto(:,:) = comlev1_bibj, |
| 383 |
mlosch |
1.1 |
CADJ & key = iicekey, byte = isbyte |
| 384 |
mlosch |
1.3 |
CADJ STORE qswi(:,:) = comlev1_bibj, |
| 385 |
mlosch |
1.1 |
CADJ & key = iicekey, byte = isbyte |
| 386 |
mlosch |
1.3 |
CADJ STORE qswo(:,:) = comlev1_bibj, |
| 387 |
mlosch |
1.1 |
CADJ & key = iicekey, byte = isbyte |
| 388 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 389 |
|
|
cph) |
| 390 |
|
|
DO J=1,sNy |
| 391 |
|
|
DO I=1,sNx |
| 392 |
|
|
C NOW UPDATE AREA |
| 393 |
mlosch |
1.3 |
GHEFF(I,J) = -SEAICE_deltaTtherm*FHEFF(I,J)*Q0 |
| 394 |
|
|
GAREA(I,J) = SEAICE_deltaTtherm*QNETO(I,J)*Q0 |
| 395 |
|
|
GHEFF(I,J) = -ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) |
| 396 |
|
|
GAREA(I,J) = MAX(ZERO,GAREA(I,J)) |
| 397 |
|
|
HCORR(I,J) = MIN(ZERO,GHEFF(I,J)) |
| 398 |
mlosch |
1.1 |
ENDDO |
| 399 |
|
|
ENDDO |
| 400 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 401 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 402 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 403 |
|
|
#endif |
| 404 |
|
|
DO J=1,sNy |
| 405 |
|
|
DO I=1,sNx |
| 406 |
|
|
GAREA(I,J)=(ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO |
| 407 |
|
|
& +HALF*HCORR(I,J)*AREA(I,J,2,bi,bj) |
| 408 |
|
|
& /(HEFF(I,J,1,bi,bj)+.00001 _d 0) |
| 409 |
|
|
AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+GAREA(I,J) |
| 410 |
|
|
ENDDO |
| 411 |
|
|
ENDDO |
| 412 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 413 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 414 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 415 |
|
|
#endif |
| 416 |
|
|
DO J=1,sNy |
| 417 |
|
|
DO I=1,sNx |
| 418 |
|
|
|
| 419 |
|
|
C NOW UPDATE HEFF |
| 420 |
mlosch |
1.3 |
GHEFF(I,J) = -SEAICE_deltaTtherm* |
| 421 |
|
|
& FICE(I,J)*Q0*AREA(I,J,2,bi,bj) |
| 422 |
|
|
GHEFF(I,J) = -ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) |
| 423 |
|
|
HEFF(I,J,1,bi,bj)= HEFF(I,J,1,bi,bj)+GHEFF(I,J) |
| 424 |
|
|
SEAICE_SALT(I,J) = SEAICE_SALT(I,J)+GHEFF(I,J) |
| 425 |
mlosch |
1.1 |
|
| 426 |
|
|
C NOW CALCULATE QNETI UNDER ICE IF ANY |
| 427 |
mlosch |
1.3 |
QNETI(I,J) = (GHEFF(I,J)-SEAICE_deltaTtherm* |
| 428 |
mlosch |
1.1 |
& FICE(I,J)*Q0*AREA(I,J,2,bi,bj))/Q0/SEAICE_deltaTtherm |
| 429 |
|
|
|
| 430 |
|
|
C NOW UPDATE OTHER THINGS |
| 431 |
|
|
|
| 432 |
|
|
IF(FICE(I,J).GT.ZERO) THEN |
| 433 |
|
|
C FREEZING, PRECIP ADDED AS SNOW |
| 434 |
mlosch |
1.3 |
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm* |
| 435 |
mlosch |
1.1 |
& PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF |
| 436 |
|
|
ELSE |
| 437 |
|
|
C ADD PRECIP AS RAIN, WATER CONVERTED INTO equivalent m of ICE BY 1/ICE_DENS |
| 438 |
mlosch |
1.3 |
SEAICE_SALT(I,J) = SEAICE_SALT(I,J) |
| 439 |
mlosch |
1.1 |
& -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)* |
| 440 |
|
|
& SEAICE_deltaTtherm/ICE_DENS |
| 441 |
|
|
ENDIF |
| 442 |
|
|
|
| 443 |
|
|
C Now add in precip over open water directly into ocean as negative salt |
| 444 |
mlosch |
1.3 |
SEAICE_SALT(I,J) = SEAICE_SALT(I,J) |
| 445 |
mlosch |
1.1 |
& -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj)) |
| 446 |
|
|
& *SEAICE_deltaTtherm/ICE_DENS |
| 447 |
|
|
|
| 448 |
|
|
C Now melt snow if there is residual heat left in surface level |
| 449 |
|
|
C Note that units of YNEG and SEAICE_SALT are m of ice |
| 450 |
mlosch |
1.3 |
IF( RESID_HEAT(I,J) .GT.ZERO |
| 451 |
|
|
& .AND.HSNOW(I,J,bi,bj).GT.ZERO ) THEN |
| 452 |
|
|
GHEFF(I,J) = MIN( HSNOW(I,J,bi,bj)/SDF/ICE_DENS, |
| 453 |
|
|
& RESID_HEAT(I,J) ) |
| 454 |
|
|
YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)+GHEFF(I,J) |
| 455 |
|
|
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-GHEFF(I,J)*SDF*ICE_DENS |
| 456 |
|
|
SEAICE_SALT(I,J) = SEAICE_SALT(I,J)-GHEFF(I,J) |
| 457 |
mlosch |
1.1 |
ENDIF |
| 458 |
|
|
|
| 459 |
|
|
C NOW GET FRESH WATER FLUX |
| 460 |
mlosch |
1.3 |
EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*( |
| 461 |
mlosch |
1.1 |
& EVAP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj)) |
| 462 |
|
|
& -RUNOFF(I,J,bi,bj) |
| 463 |
|
|
& +SEAICE_SALT(I,J)*ICE_DENS/SEAICE_deltaTtherm |
| 464 |
|
|
& ) |
| 465 |
|
|
|
| 466 |
|
|
C NOW GET TOTAL QNET AND QSW |
| 467 |
mlosch |
1.3 |
QNET(I,J,bi,bj) = QNETI(I,J) * AREA(I,J,2,bi,bj) |
| 468 |
|
|
& +QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj)) |
| 469 |
|
|
QSW(I,J,bi,bj) = QSWI(I,J) * AREA(I,J,2,bi,bj) |
| 470 |
|
|
& +QSWO(I,J) * (ONE-AREA(I,J,2,bi,bj)) |
| 471 |
mlosch |
1.1 |
|
| 472 |
|
|
C Now convert YNEG back to deg K. |
| 473 |
mlosch |
1.3 |
YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0 |
| 474 |
mlosch |
1.1 |
|
| 475 |
|
|
C Add YNEG contribution to QNET |
| 476 |
mlosch |
1.3 |
QNET(I,J,bi,bj) = QNET(I,J,bi,bj) |
| 477 |
mlosch |
1.1 |
& +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm |
| 478 |
|
|
& *maskC(I,J,kSurface,bi,bj) |
| 479 |
|
|
& *HeatCapacity_Cp*recip_horiVertRatio*rhoConst |
| 480 |
|
|
& *drF(kSurface)*hFacC(i,j,kSurface,bi,bj) |
| 481 |
|
|
|
| 482 |
|
|
ENDDO |
| 483 |
|
|
ENDDO |
| 484 |
|
|
|
| 485 |
|
|
#ifdef SEAICE_DEBUG |
| 486 |
|
|
c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid ) |
| 487 |
|
|
c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid ) |
| 488 |
|
|
CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid ) |
| 489 |
|
|
CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid ) |
| 490 |
|
|
CML CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid ) |
| 491 |
|
|
CML CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid ) |
| 492 |
|
|
CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid ) |
| 493 |
|
|
CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid ) |
| 494 |
|
|
CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid ) |
| 495 |
|
|
DO j=1-OLy,sNy+OLy |
| 496 |
|
|
DO i=1-OLx,sNx+OLx |
| 497 |
|
|
GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2) |
| 498 |
|
|
GAREA(I,J)=HEFF(I,J,1,bi,bj) |
| 499 |
|
|
print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj) |
| 500 |
|
|
ENDDO |
| 501 |
|
|
ENDDO |
| 502 |
|
|
CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid ) |
| 503 |
|
|
CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid ) |
| 504 |
|
|
DO j=1-OLy,sNy+OLy |
| 505 |
|
|
DO i=1-OLx,sNx+OLx |
| 506 |
|
|
if(HEFF(i,j,1,bi,bj).gt.1.) then |
| 507 |
|
|
print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j, |
| 508 |
|
|
& HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj) |
| 509 |
|
|
print '(A,3f10.2)','QSW, QNET before/after correction', |
| 510 |
|
|
& QSW(I,J,bi,bj),QNETI(I,J)*AREA(I,J,2,bi,bj)+ |
| 511 |
|
|
& (ONE-AREA(I,J,2,bi,bj))*QNETO(I,J), QNET(I,J,bi,bj) |
| 512 |
|
|
endif |
| 513 |
|
|
ENDDO |
| 514 |
|
|
ENDDO |
| 515 |
|
|
#endif /* SEAICE_DEBUG */ |
| 516 |
|
|
|
| 517 |
|
|
crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ? |
| 518 |
|
|
#define DO_WE_NEED_THIS |
| 519 |
|
|
C NOW ZERO OUTSIDE POINTS |
| 520 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 521 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 522 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 523 |
|
|
CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj, |
| 524 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 525 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 526 |
|
|
DO J=1,sNy |
| 527 |
|
|
DO I=1,sNx |
| 528 |
|
|
C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS |
| 529 |
|
|
AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj) |
| 530 |
|
|
& ,HEFF(I,J,1,bi,bj)/.0001 _d 0) |
| 531 |
|
|
ENDDO |
| 532 |
|
|
ENDDO |
| 533 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 534 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 535 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 536 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 537 |
|
|
DO J=1,sNy |
| 538 |
|
|
DO I=1,sNx |
| 539 |
|
|
C NOW TRUNCATE AREA |
| 540 |
|
|
#ifdef DO_WE_NEED_THIS |
| 541 |
|
|
AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj)) |
| 542 |
|
|
ENDDO |
| 543 |
|
|
ENDDO |
| 544 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
| 545 |
|
|
CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, |
| 546 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 547 |
|
|
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
| 548 |
|
|
CADJ & key = iicekey, byte = isbyte |
| 549 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
| 550 |
|
|
DO J=1,sNy |
| 551 |
|
|
DO I=1,sNx |
| 552 |
mlosch |
1.3 |
AREA(I,J,1,bi,bj) = MAX(ZERO,AREA(I,J,1,bi,bj)) |
| 553 |
|
|
HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj)) |
| 554 |
mlosch |
1.1 |
#endif |
| 555 |
mlosch |
1.3 |
AREA(I,J,1,bi,bj) = AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) |
| 556 |
|
|
HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) |
| 557 |
mlosch |
1.1 |
#ifdef DO_WE_NEED_THIS |
| 558 |
|
|
c HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj)) |
| 559 |
|
|
#endif |
| 560 |
mlosch |
1.3 |
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
| 561 |
mlosch |
1.1 |
ENDDO |
| 562 |
|
|
ENDDO |
| 563 |
|
|
|
| 564 |
|
|
#ifdef ALLOW_SEAICE_FLOODING |
| 565 |
|
|
IF ( SEAICEuseFlooding ) THEN |
| 566 |
|
|
C convert snow to ice if submerged |
| 567 |
|
|
DO J=1,sNy |
| 568 |
|
|
DO I=1,sNx |
| 569 |
|
|
hDraft = (HSNOW(I,J,bi,bj)*330. _d 0 |
| 570 |
|
|
& +HEFF(I,J,1,bi,bj)*SEAICE_rhoIce)/1000. _d 0 |
| 571 |
|
|
hFlood = hDraft - MIN(hDraft,HEFF(I,J,1,bi,bj)) |
| 572 |
|
|
HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj) + hFlood |
| 573 |
mlosch |
1.3 |
HSNOW(I,J,bi,bj) = MAX(0. _d 0,HSNOW(I,J,bi,bj)-hFlood/SDF) |
| 574 |
mlosch |
1.1 |
ENDDO |
| 575 |
|
|
ENDDO |
| 576 |
|
|
ENDIF |
| 577 |
|
|
#endif /* ALLOW_SEAICE_FLOODING */ |
| 578 |
|
|
|
| 579 |
|
|
#ifdef ATMOSPHERIC_LOADING |
| 580 |
|
|
IF ( useRealFreshWaterFlux ) THEN |
| 581 |
|
|
DO J=1,sNy |
| 582 |
|
|
DO I=1,sNx |
| 583 |
|
|
sIceLoad(i,j,bi,bj) = HEFF(I,J,1,bi,bj)*SEAICE_rhoIce |
| 584 |
|
|
& + HSNOW(I,J,bi,bj)* 330. _d 0 |
| 585 |
|
|
ENDDO |
| 586 |
|
|
ENDDO |
| 587 |
|
|
ENDIF |
| 588 |
|
|
#endif |
| 589 |
|
|
|
| 590 |
|
|
ENDDO |
| 591 |
|
|
ENDDO |
| 592 |
|
|
|
| 593 |
|
|
RETURN |
| 594 |
|
|
END |