37 subroutine calc_qbm(time, z_sl, dzeta_c, dzeta_r)
46 real(dp),
intent(in) :: time, z_sl
47 real(dp),
intent(in) :: dzeta_c, dzeta_r
50 integer(i4b) :: n_ocean, n_float
51 real(dp) :: aqbm1, aqbm2, aqbm3a, aqbm3b, aqbm4
52 real(dp) :: frictional_heating
53 real(dp) :: year_sec_inv, rhow_rho_ratio
54 real(dp) :: q_bm_grounded, q_bm_marine, q_bm_floating
55 real(dp) :: qbm_min, qbm_max
59 year_sec_inv = 1.0_dp/year_sec
60 rhow_rho_ratio = rho_w/rho
62 if (flag_aa_nonzero)
then
63 aqbm1 = (ea-1.0_dp)/(rho*l*aa*dzeta_c)
65 aqbm1 = 1.0_dp/(rho*l*dzeta_c)
68 aqbm2 = kappa_r/(rho*l*h_r*dzeta_r)
70 aqbm3b = 1.0_dp/(rho*l)
80 if (maske(j,i)==0)
then
82 if (n_cts(j,i)==-1)
then
84 frictional_heating = 0.0_dp
87 else if (n_cts(j,i)==0)
then
90 if (.not.flag_shelfy_stream(j,i))
then
94 *0.5_dp*(vx_t(0,j,i)+vx_t(0,j,i-1)) &
97 *0.5_dp*(vy_t(0,j,i)+vy_t(0,j-1,i)) &
105 * sqrt(vx_b_g(j,i)**2 &
107 **(1.0_dp+p_weert_inv(j,i))
110 q_bm(j,i) = aqbm1*(temp_c(1,j,i)-temp_c(0,j,i))/h_c(j,i) &
112 - aqbm2*(temp_r(krmax,j,i)-temp_r(krmax-1,j,i)) &
118 if (.not.flag_shelfy_stream(j,i))
then
121 = -aqbm3a*(h_c(j,i)+h_t(j,i)) &
122 *0.5_dp*(vx_t(0,j,i)+vx_t(0,j,i-1)) &
124 -aqbm3a*(h_c(j,i)+h_t(j,i)) &
125 *0.5_dp*(vy_t(0,j,i)+vy_t(0,j-1,i)) &
133 * sqrt(vx_b_g(j,i)**2 &
135 **(1.0_dp+p_weert_inv(j,i))
138 q_bm(j,i) = aqbm4*
kappa_val(temp_t_m(0,j,i)) &
139 - aqbm2*(temp_r(krmax,j,i)-temp_r(krmax-1,j,i)) &
144 #if (MARGIN==1 || MARGIN==2)
146 #if (!defined(MARINE_ICE_BASAL_MELTING) || MARINE_ICE_BASAL_MELTING==1)
150 #elif (MARINE_ICE_BASAL_MELTING==2)
152 if ( (zb(j,i) < z_sl) &
154 ( (maske(j,i+1)==2) &
155 .or.(maske(j,i-1)==2) &
156 .or.(maske(j+1,i)==2) &
157 .or.(maske(j-1,i)==2) &
161 q_bm(j,i) = qbm_marine *year_sec_inv*rhow_rho_ratio
166 #elif (MARINE_ICE_BASAL_MELTING==3)
168 if ( (zb(j,i) < z_sl) &
170 ( (maske(j,i+1)==2) &
171 .or.(maske(j,i-1)==2) &
172 .or.(maske(j+1,i)==2) &
173 .or.(maske(j-1,i)==2) &
178 if (maske(j,i+1)==2) n_ocean = n_ocean+1
179 if (maske(j,i-1)==2) n_ocean = n_ocean+1
180 if (maske(j+1,i)==2) n_ocean = n_ocean+1
181 if (maske(j-1,i)==2) n_ocean = n_ocean+1
183 if ( n_ocean > 0 )
then
185 q_bm_grounded = q_bm(j,i)
186 q_bm_marine = qbm_marine *year_sec_inv*rhow_rho_ratio
189 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_ocean,dp)) * q_bm_grounded &
190 +0.25_dp*
real(n_ocean,dp) * q_bm_marine
194 write(6,
'(a)')
' calc_qbm: Marine ice margin point does not have'
195 write(6,
'(a)')
' an ocean neighbour!'
202 stop
' calc_qbm: MARINE_ICE_BASAL_MELTING must be either 1, 2 or 3!'
207 if (flag_grounding_line_1(j,i))
then
210 #if (FLOATING_ICE_BASAL_MELTING==1 || FLOATING_ICE_BASAL_MELTING==4)
214 #elif (FLOATING_ICE_BASAL_MELTING==2)
216 q_bm(j,i) = qbm_float_1 *year_sec_inv*rhow_rho_ratio
219 #elif (FLOATING_ICE_BASAL_MELTING==3)
222 if (maske(j,i+1)>=2) n_float = n_float+1
223 if (maske(j,i-1)>=2) n_float = n_float+1
224 if (maske(j+1,i)>=2) n_float = n_float+1
225 if (maske(j-1,i)>=2) n_float = n_float+1
227 if ( n_float > 0 )
then
229 q_bm_grounded = q_bm(j,i)
230 q_bm_floating = qbm_float_1 *year_sec_inv*rhow_rho_ratio
233 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_float,dp)) * q_bm_grounded &
234 +0.25_dp*
real(n_float,dp) * q_bm_floating
237 write(6,
'(a)')
' calc_qbm: Grounding line point does not have'
238 write(6,
'(a)')
' a floating ice or ocean neighbour!'
243 write(6, fmt=
'(a)')
' calc_qbm: FLOATING_ICE_BASAL_MELTING'
244 write(6, fmt=
'(a)')
' must be either 1, 2, 3 or 4!'
248 else if ( (zb(j,i) < z_sl) &
250 ( (maske(j,i+1)>=2) &
251 .or.(maske(j,i-1)>=2) &
252 .or.(maske(j+1,i)>=2) &
253 .or.(maske(j-1,i)>=2) &
257 #if (MARINE_ICE_BASAL_MELTING==1)
261 #elif (MARINE_ICE_BASAL_MELTING==2)
263 q_bm(j,i) = qbm_marine *year_sec_inv*rhow_rho_ratio
266 #elif (MARINE_ICE_BASAL_MELTING==3)
269 if (maske(j,i+1)>=2) n_ocean = n_ocean+1
270 if (maske(j,i-1)>=2) n_ocean = n_ocean+1
271 if (maske(j+1,i)>=2) n_ocean = n_ocean+1
272 if (maske(j-1,i)>=2) n_ocean = n_ocean+1
274 if ( n_ocean > 0 )
then
276 q_bm_grounded = q_bm(j,i)
277 q_bm_marine = qbm_marine *year_sec_inv*rhow_rho_ratio
280 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_ocean,dp)) * q_bm_grounded &
281 +0.25_dp*
real(n_ocean,dp) * q_bm_marine
285 write(6,
'(a)')
' calc_qbm: Marine ice margin point does not have'
286 write(6,
'(a)')
' a floating ice or ocean neighbour!'
291 stop
' calc_qbm: MARINE_ICE_BASAL_MELTING must be either 1, 2 or 3!'
296 else if ( (maske(j,i)==2).or.(maske(j,i)==3) )
then
298 #if (FLOATING_ICE_BASAL_MELTING<=3)
300 if (flag_grounding_line_2(j,i))
then
303 q_bm(j,i) = qbm_float_1 *year_sec_inv*rhow_rho_ratio
306 else if ( zl(j,i) > z_abyss )
then
308 q_bm(j,i) = qbm_float_2 *year_sec_inv*rhow_rho_ratio
313 q_bm(j,i) = qbm_float_3 *year_sec_inv*rhow_rho_ratio
318 #elif (FLOATING_ICE_BASAL_MELTING==4)
320 if ( zl(j,i) > z_abyss )
then
322 q_bm(j,i) = q_bm_floating
324 q_bm(j,i) = qbm_float_3 *year_sec_inv*rhow_rho_ratio
329 write(6, fmt=
'(a)')
' calc_qbm: FLOATING_ICE_BASAL_MELTING'
330 write(6, fmt=
'(a)')
' must be either 1, 2, 3 or 4!'
335 stop
' calc_qbm: MARGIN must be either 1, 2 or 3!'
345 q_b_tot = q_bm + q_tld
350 #if (defined(QBM_MIN))
351 qbm_min = qbm_min *year_sec_inv*rhow_rho_ratio
353 #elif (defined(QB_MIN)) /* obsolete */
356 stop
' calc_qbm: Limiter QBM_MIN is undefined!'
359 #if (defined(QBM_MAX))
360 qbm_max = qbm_max *year_sec_inv*rhow_rho_ratio
362 #elif (defined(QB_MAX)) /* obsolete */
365 stop
' calc_qbm: Limiter QBM_MAX is undefined!'
368 #if ( defined(MARINE_ICE_BASAL_MELTING) \
369 && ( marine_ice_basal_melting==2 || marine_ice_basal_melting==3 ) )
371 if (qbm_marine*year_sec_inv*rhow_rho_ratio > qbm_max)
then
372 write (6,
'(a)')
' calc_qbm: QBM_MARINE (basal melting rate at the marine'
373 write (6,
'(a)')
' ice front) is larger than the limiter qbm_max!'
380 && defined(floating_ice_basal_melting) \
381 && floating_ice_basal_melting<=3 )
383 if (qbm_float_1*year_sec_inv*rhow_rho_ratio > qbm_max)
then
384 write (6,
'(a)')
' calc_qbm: QBM_FLOAT_1 (basal melting rate in the grounding'
385 write (6,
'(a)')
' line zone) is larger than the limiter qbm_max!'
393 if (maske(j,i)==0)
then
394 if (q_bm(j,i) < qbm_min) q_bm(j,i) = 0.0_dp
395 if (q_bm(j,i) > qbm_max) q_bm(j,i) = qbm_max
396 if (q_tld(j,i) < qbm_min) q_tld(j,i) = 0.0_dp
397 if (q_tld(j,i) > qbm_max) q_tld(j,i) = qbm_max
398 if (q_b_tot(j,i) < qbm_min) q_b_tot(j,i) = 0.0_dp
399 if (q_b_tot(j,i) > qbm_max) q_b_tot(j,i) = qbm_max
Declarations of kind types for SICOPOLIS.
Declarations of global variables for SICOPOLIS (for the ANT domain).
subroutine calc_qbm(time, z_sl, dzeta_c, dzeta_r)
Computation of the basal melting rate Q_bm. Summation of Q_bm and Q_tld.
subroutine sub_ice_shelf_melting_param(z_sl, i, j, Q_bm_floating)
Sub-ice-shelf melting parameterisation for Antarctica.
real(dp) function, public kappa_val(temp_val)
Heat conductivity of ice: Linear interpolation of tabulated values in KAPPA(.).
Material quantities of ice: Rate factor, heat conductivity, specific heat (heat capacity).
Declarations of global variables for SICOPOLIS.