53 subroutine calc_qbm(time, z_sl, dzeta_c, dzeta_r)
59 real(dp),
intent(in) :: time, z_sl
60 real(dp),
intent(in) :: dzeta_c, dzeta_r
63 integer(i4b) :: n_ocean, n_float
64 real(dp) :: aqbm1, aqbm2, aqbm3a, aqbm3b, aqbm4
65 real(dp) :: frictional_heating
66 real(dp) :: year_sec_inv, rhow_rho_ratio
67 real(dp) :: Q_bm_grounded, Q_bm_marine, Q_bm_floating
68 real(dp) :: qbm_min, qbm_max
72 year_sec_inv = 1.0_dp/year_sec
76 aqbm1 = (
ea-1.0_dp)/(
rho*
l*
aa*dzeta_c)
78 aqbm1 = 1.0_dp/(
rho*
l*dzeta_c)
83 aqbm3b = 1.0_dp/(
rho*
l)
93 if (
maske(j,i)==0)
then 95 if (
n_cts(j,i)==-1)
then 97 frictional_heating = 0.0_dp
100 else if (
n_cts(j,i)==0)
then 107 *0.5_dp*(
vx_t(0,j,i)+
vx_t(0,j,i-1)) &
110 *0.5_dp*(
vy_t(0,j,i)+
vy_t(0,j-1,i)) &
134 = -aqbm3a*(
h_c(j,i)+
h_t(j,i)) &
135 *0.5_dp*(
vx_t(0,j,i)+
vx_t(0,j,i-1)) &
137 -aqbm3a*(
h_c(j,i)+
h_t(j,i)) &
138 *0.5_dp*(
vy_t(0,j,i)+
vy_t(0,j-1,i)) &
157 #if (MARGIN==1 || MARGIN==2) 159 #if (!defined(MARINE_ICE_BASAL_MELTING) || MARINE_ICE_BASAL_MELTING==1) 163 #elif (MARINE_ICE_BASAL_MELTING==2) 165 if ( (
zb(j,i) < z_sl) &
167 ( (
maske(j,i+1)==2) &
168 .or.(
maske(j,i-1)==2) &
169 .or.(
maske(j+1,i)==2) &
170 .or.(
maske(j-1,i)==2) &
174 q_bm(j,i) = qbm_marine *year_sec_inv*rhow_rho_ratio
179 #elif (MARINE_ICE_BASAL_MELTING==3) 181 if ( (
zb(j,i) < z_sl) &
183 ( (
maske(j,i+1)==2) &
184 .or.(
maske(j,i-1)==2) &
185 .or.(
maske(j+1,i)==2) &
186 .or.(
maske(j-1,i)==2) &
191 if (
maske(j,i+1)==2) n_ocean = n_ocean+1
192 if (
maske(j,i-1)==2) n_ocean = n_ocean+1
193 if (
maske(j+1,i)==2) n_ocean = n_ocean+1
194 if (
maske(j-1,i)==2) n_ocean = n_ocean+1
196 if ( n_ocean > 0 )
then 198 q_bm_grounded =
q_bm(j,i)
199 q_bm_marine = qbm_marine *year_sec_inv*rhow_rho_ratio
202 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_ocean,
dp)) * q_bm_grounded &
203 +0.25_dp*
real(n_ocean,dp) * Q_bm_marine
207 write(6,
'(a)')
' >>> calc_qbm: Marine ice margin point does not' 208 write(6,
'(a)')
' have an ocean neighbour!' 215 stop
' >>> calc_qbm: MARINE_ICE_BASAL_MELTING must be 1, 2 or 3!' 223 #if (FLOATING_ICE_BASAL_MELTING==1 || FLOATING_ICE_BASAL_MELTING==4 \ 224 || floating_ice_basal_melting==5)
228 #elif (FLOATING_ICE_BASAL_MELTING==2) 230 q_bm(j,i) = qbm_float_1 *year_sec_inv*rhow_rho_ratio
233 #elif (FLOATING_ICE_BASAL_MELTING==3) 236 if (
maske(j,i+1)>=2) n_float = n_float+1
237 if (
maske(j,i-1)>=2) n_float = n_float+1
238 if (
maske(j+1,i)>=2) n_float = n_float+1
239 if (
maske(j-1,i)>=2) n_float = n_float+1
241 if ( n_float > 0 )
then 243 q_bm_grounded =
q_bm(j,i)
244 q_bm_floating = qbm_float_1 *year_sec_inv*rhow_rho_ratio
247 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_float,
dp)) * q_bm_grounded &
248 +0.25_dp*
real(n_float,dp) * Q_bm_floating
251 write(6,
'(a)')
' >>> calc_qbm: Grounding line point does not have' 252 write(6,
'(a)')
' a floating ice or ocean neighbour!' 257 write(6, fmt=
'(a)')
' >>> calc_qbm: FLOATING_ICE_BASAL_MELTING' 258 write(6, fmt=
'(a)')
' must be 1, 2, 3, 4 or 5!' 262 else if ( (
zb(j,i) < z_sl) &
264 ( (
maske(j,i+1)>=2) &
265 .or.(
maske(j,i-1)>=2) &
266 .or.(
maske(j+1,i)>=2) &
267 .or.(
maske(j-1,i)>=2) &
271 #if (MARINE_ICE_BASAL_MELTING==1) 275 #elif (MARINE_ICE_BASAL_MELTING==2) 277 q_bm(j,i) = qbm_marine *year_sec_inv*rhow_rho_ratio
280 #elif (MARINE_ICE_BASAL_MELTING==3) 283 if (
maske(j,i+1)>=2) n_ocean = n_ocean+1
284 if (
maske(j,i-1)>=2) n_ocean = n_ocean+1
285 if (
maske(j+1,i)>=2) n_ocean = n_ocean+1
286 if (
maske(j-1,i)>=2) n_ocean = n_ocean+1
288 if ( n_ocean > 0 )
then 290 q_bm_grounded =
q_bm(j,i)
291 q_bm_marine = qbm_marine *year_sec_inv*rhow_rho_ratio
294 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_ocean,
dp)) * q_bm_grounded &
295 +0.25_dp*
real(n_ocean,dp) * Q_bm_marine
299 write(6,
'(a)')
' >>> calc_qbm: Marine ice margin point does not' 300 write(6,
'(a)')
' have a floating ice or ocean neighbour!' 305 stop
' >>> calc_qbm: MARINE_ICE_BASAL_MELTING must be 1, 2 or 3!' 310 else if ( (
maske(j,i)==2).or.(
maske(j,i)==3) )
then 312 #if (FLOATING_ICE_BASAL_MELTING<=3) 317 q_bm(j,i) = qbm_float_1 *year_sec_inv*rhow_rho_ratio
320 else if (
zl(j,i) > z_abyss )
then 322 q_bm(j,i) = qbm_float_2 *year_sec_inv*rhow_rho_ratio
327 q_bm(j,i) = qbm_float_3 *year_sec_inv*rhow_rho_ratio
332 #elif (FLOATING_ICE_BASAL_MELTING==4 || FLOATING_ICE_BASAL_MELTING==5) 334 if (
zl(j,i) > z_abyss )
then 336 year_sec_inv, rhow_rho_ratio, &
338 q_bm(j,i) = q_bm_floating
340 q_bm(j,i) = qbm_float_3 *year_sec_inv*rhow_rho_ratio
345 write(6, fmt=
'(a)')
' >>> calc_qbm: FLOATING_ICE_BASAL_MELTING' 346 write(6, fmt=
'(a)')
' must be 1, 2, 3, 4 or 5!' 351 stop
' >>> calc_qbm: MARGIN must be 1, 2 or 3!' 366 #if (defined(QBM_MIN)) 367 qbm_min = qbm_min *year_sec_inv*rhow_rho_ratio
369 #elif (defined(QB_MIN)) /* obsolete */ 372 stop
' >>> calc_qbm: Limiter QBM_MIN is undefined!' 375 #if (defined(QBM_MAX)) 376 qbm_max = qbm_max *year_sec_inv*rhow_rho_ratio
378 #elif (defined(QB_MAX)) /* obsolete */ 381 stop
' >>> calc_qbm: Limiter QBM_MAX is undefined!' 384 #if ( defined(MARINE_ICE_BASAL_MELTING) \ 385 && ( marine_ice_basal_melting==2 || marine_ice_basal_melting==3 ) )
387 if (qbm_marine*year_sec_inv*rhow_rho_ratio > qbm_max)
then 388 write (6,
'(a)')
' >>> calc_qbm: QBM_MARINE' 389 write (6,
'(a)')
' (basal melting rate at the ice front)' 390 write (6,
'(a)')
' is larger than the limiter qbm_max!' 397 && defined(floating_ice_basal_melting) \
398 && floating_ice_basal_melting<=3 )
400 if (qbm_float_1*year_sec_inv*rhow_rho_ratio > qbm_max)
then 401 write (6,
'(a)')
' >>> calc_qbm: QBM_FLOAT_1' 402 write (6,
'(a)')
' (basal melting rate in the grounding line zone)' 403 write (6,
'(a)')
' is larger than the limiter qbm_max!' 411 if (
maske(j,i)==0)
then 412 if (
q_bm(j,i) < qbm_min)
q_bm(j,i) = 0.0_dp
413 if (
q_bm(j,i) > qbm_max)
q_bm(j,i) = qbm_max
415 if (
q_tld(j,i) > qbm_max)
q_tld(j,i) = qbm_max
428 year_sec_inv, rhow_rho_ratio, &
433 integer(i4b),
intent(in) :: i, j
434 real(dp),
intent(in) :: time, z_sl
435 real(dp),
intent(in) :: year_sec_inv, rhow_rho_ratio
437 real(dp),
intent(out) :: Q_bm_floating
439 real(dp) :: time_in_years
440 real(dp) :: Toc, Tmb, T_forcing, Omega, alpha, draft0, draft
441 real(dp) :: lon_d, lat_d, Phi_par
442 real(dp) :: H_w_now, Q_bm_scaling_factor
444 real(dp),
parameter :: beta_sw = 7.61e-04_dp
446 #if (FLOATING_ICE_BASAL_MELTING==5) 448 real(dp),
parameter :: c_sw = 3974.0_dp, &
453 time_in_years = time*year_sec_inv
455 #if (FLOATING_ICE_BASAL_MELTING==4) 458 omega = omega_qbm *year_sec_inv*rhow_rho_ratio
462 #elif (FLOATING_ICE_BASAL_MELTING==5) 464 #if (defined(ANT)) /* Antarctic ice sheet */ 471 lon_d = modulo(lon_d+180.0_dp, 360.0_dp)-180.0_dp
475 if ((lon_d>=-10.0_dp).and.(lon_d<60.0_dp))
then 484 else if ((lon_d>=60.0_dp).and.(lon_d<80.0_dp))
then 493 else if ((lon_d>=80.0_dp).and.(lon_d<130.0_dp))
then 503 else if ( ((lon_d>=130.0_dp).and.(lon_d<159.0_dp)) &
505 ((lon_d>=159.0_dp).and.(lon_d<170.0_dp) &
506 .and.(lat_d>=-72.0_dp)) )
then 516 else if ( (lon_d>=159.0_dp) &
520 ((lon_d>=-140.0_dp).and.(lon_d<-120.0_dp) &
521 .and.(lat_d<-77.0_dp)) )
then 530 else if ( ((lon_d>=-140.0_dp).and.(lon_d<-120.0_dp) &
531 .and.(lat_d>=-77.0_dp)) &
533 ((lon_d>=-120.0_dp).and.(lon_d<-90.0_dp)) )
then 542 else if ( ((lon_d>=-90.0_dp).and.(lon_d<-66.0_dp) &
543 .and.(lat_d>=-74.0_dp)) )
then 563 #else /* not Antarctic ice sheet */ 565 q_bm_floating = 0.0_dp
567 write(6, fmt=
'(a)')
' >>> sub_ice_shelf_melting_param:' 568 write(6, fmt=
'(a)')
' Case FLOATING_ICE_BASAL_MELTING==5' 569 write(6, fmt=
'(a)')
' only defined for Antarctica!' 582 if (
maske(j,i)==2_i2b)
then 584 h_w_now = max((z_sl-
zl(j,i)), 0.0_dp)
585 else if (
maske(j,i)==3_i2b)
then 586 draft = max((z_sl -
zb(j,i)), 0.0_dp)
587 h_w_now = max((
zb(j,i)-
zl(j,i)), 0.0_dp)
589 write(6, fmt=
'(a)')
' >>> sub_ice_shelf_melting_param:' 590 write(6, fmt=
'(a)')
' Routine must not be called for maske(j,i) < 2!' 596 t_forcing = max((toc-tmb), 0.0_dp)
600 if (h_w_0 >
eps)
then 601 q_bm_scaling_factor = tanh(h_w_now/h_w_0)
603 q_bm_scaling_factor = 1.0_dp
607 q_bm_scaling_factor = 1.0_dp
610 #if (FLOATING_ICE_BASAL_MELTING==4) 612 q_bm_floating = q_bm_scaling_factor*omega*t_forcing**alpha
614 #elif (FLOATING_ICE_BASAL_MELTING==5) 618 q_bm_floating = q_bm_scaling_factor &
619 *phi_par*omega*t_forcing*(draft/draft0)**alpha
623 q_bm_floating = 0.0_dp
625 write(6, fmt=
'(a)')
' >>> sub_ice_shelf_melting_param:' 626 write(6, fmt=
'(a)')
' FLOATING_ICE_BASAL_MELTING must be 4 or 5!' 631 #if (defined(INITMIP_BMB_ANOM_FILE)) 635 if ((time_in_years > 0.0_dp).and.(time_in_years <= 40.0_dp))
then 636 q_bm_floating = q_bm_floating &
637 + 0.025_dp*floor(time_in_years) * ab_anom_initmip(j,i)
638 else if (time_in_years > 40.0_dp)
then 639 q_bm_floating = q_bm_floating + ab_anom_initmip(j,i)
real(dp), dimension(0:kcmax, 0:jmax, 0:imax) temp_c
temp_c(kc,j,i): Temperature in the upper (kc) ice domain
real(dp) kappa_r
KAPPA_R: Heat conductivity of the lithosphere.
real(dp) delta_tm_sw
DELTA_TM_SW: Melting point depression of sea water due to its average salinity.
real(dp), dimension(0:jmax, 0:imax) phi
phi(j,i): Geographic latitude of grid point (i,j)
integer(i2b), dimension(0:jmax, 0:imax) n_cts
n_cts(j,i): Mask for thermal conditions. -1: cold ice base, 0: temperate ice base with cold ice above...
subroutine, public calc_qbm(time, z_sl, dzeta_c, dzeta_r)
Computation of the basal melting rate Q_bm. Summation of Q_bm and Q_tld (water drainage rate from the...
integer(i2b), dimension(0:jmax, 0:imax) n_sector
n_sector(j,i): Marker for the different sectors for ice shelf basal melting.
real(dp), dimension(0:jmax, 0:imax) vx_b_g
(.)_g(j,i): Staggered-grid quantity (.) interpolated to grid point (i,j)
real(dp) rho_w
RHO_W: Density of pure water.
real(dp), dimension(0:krmax, 0:jmax, 0:imax) temp_r
temp_r(kr,j,i): Temperature in the bedrock
real(dp) h_r
H_R: Thickness of the modelled lithosphere layer.
Material properties of ice: Rate factor, heat conductivity, specific heat (heat capacity), creep function, viscosity.
real(dp), parameter eps
eps: Small number
logical, dimension(0:jmax, 0:imax) flag_grounding_line_1
flag_grounding_line_1(j,i): Grounding line flag. .true.: grounding line point (grounded ice point wit...
real(dp), dimension(0:jmax, 0:imax) lambda
lambda(j,i): Geographic longitude of grid point (i,j)
real(dp) function, public kappa_val(temp_val)
Heat conductivity of ice: Linear interpolation of tabulated values in KAPPA(.).
integer(i2b), dimension(0:jmax, 0:imax) maske
maske(j,i): Ice-land-ocean mask. 0: grounded ice, 1: ice-free land, 2: ocean, 3: floating ice ...
real(dp), dimension(0:jmax, 0:imax) dzs_deta_g
(.)_g(j,i): Staggered-grid quantity (.) interpolated to grid point (i,j)
real(dp), dimension(0:ktmax, 0:jmax, 0:imax) temp_t_m
temp_t_m(kt,j,i): Melting temperature in the lower (kt) ice domain
real(dp), parameter pi_180_inv
pi_180_inv: 180 divided by pi (-> rad to deg)
real(dp), dimension(0:jmax, 0:imax) zl
zl(j,i): Coordinate z of the lithosphere surface
real(dp) g
G: Acceleration due to gravity.
real(dp), dimension(0:jmax, 0:imax) q_tld
Q_tld(j,i): Water drainage rate from the temperate layer.
Declarations of global variables for SICOPOLIS (for the ANT domain).
real(dp) ea
ea: Abbreviation for exp(aa)
logical flag_aa_nonzero
flag_aa_nonzero: Flag for the exponential stretch parameter aa. .true.: aa greater than zero (non-equ...
real(dp) aa
aa: Exponential stretch parameter of the non-equidistant vertical grid in the upper (kc) ice domain ...
Declarations of kind types for SICOPOLIS.
real(dp), dimension(0:jmax, 0:imax) h_c
H_c(j,i): Thickness of ice in the upper (kc) domain (thickness of the cold-ice layer for POLY...
real(dp), dimension(0:jmax, 0:imax) vy_b_g
(.)_g(j,i): Staggered-grid quantity (.) interpolated to grid point (i,j)
real(dp), dimension(0:jmax, 0:imax) p_weert_inv
p_weert_inv(j,i): Inverse of p_weert
logical, dimension(0:jmax, 0:imax) flag_shelfy_stream
flag_shelfy_stream(j,i): Shelfy stream flag on the main grid. .true.: grounded ice, and at least one neighbour on the staggered grid is a shelfy stream point .false.: otherwise
real(dp), dimension(0:jmax, 0:imax) q_b_tot
Q_b_tot(j,i): Sum of Q_bm and Q_tld.
real(dp), dimension(0:jmax, 0:imax) q_bm
Q_bm(j,i): Basal melting rate.
real(dp), dimension(0:jmax, 0:imax) dzs_dxi_g
(.)_g(j,i): Staggered-grid quantity (.) interpolated to grid point (i,j)
real(dp), dimension(0:ktmax, 0:jmax, 0:imax) vy_t
vy_t(kt,j,i): Velocity in y-direction in the lower (kt) ice domain (at (i,j+1/2,kt)) ...
real(dp) beta
BETA: Clausius-Clapeyron gradient of ice.
real(dp), dimension(0:jmax, 0:imax) c_drag
c_drag(j,i): Auxiliary quantity for the computation of the basal drag
Computation of the basal melting rate.
real(dp) rho_sw
RHO_SW: Density of sea water.
real(dp) l
L: Latent heat of ice.
subroutine sub_ice_shelf_melting_param(time, z_sl, year_sec_inv, rhow_rho_ratio, i, j, Q_bm_floating)
Sub-ice-shelf melting parameterisation.
real(dp) rho
RHO: Density of ice.
integer, parameter dp
Double-precision reals.
real(dp), dimension(0:jmax, 0:imax) zb
zb(j,i): Coordinate z of the ice base
logical, dimension(0:jmax, 0:imax) flag_grounding_line_2
flag_grounding_line_2(j,i): Grounding line flag. .true.: grounding line point (floating ice point wit...
real(dp), dimension(0:jmax, 0:imax) h_t
H_t(j,i): Thickness of ice in the lower (kt) domain (thickness of the temperate layer for POLY...
Declarations of global variables for SICOPOLIS.
real(dp), dimension(0:ktmax, 0:jmax, 0:imax) vx_t
vx_t(kt,j,i): Velocity in x-direction in the lower (kt) ice domain (at (i+1/2,j,kt)) ...