37 subroutine calc_qbm(time, z_sl, dzeta_c, dzeta_r)
44 real(dp),
intent(in) :: time, z_sl
45 real(dp),
intent(in) :: dzeta_c, dzeta_r
48 integer(i4b) :: n_ocean, n_float
49 real(dp) :: aqbm1, aqbm2, aqbm3, aqbm4
50 real(dp) :: year_sec_inv, rhow_rho_ratio
51 real(dp) :: q_bm_grounded, q_bm_marine, q_bm_floating
52 real(dp) :: qbm_min, qbm_max
56 year_sec_inv = 1.0_dp/year_sec
57 rhow_rho_ratio = rho_w/rho
59 aqbm1 = (ea-1.0_dp)/(rho*l*deform*dzeta_c)
60 aqbm2 = kappa_r/(rho*l*h_r*dzeta_r)
71 if (maske(j,i)==0)
then
73 if (n_cts(j,i)==-1)
then
75 else if (n_cts(j,i)==0)
then
76 q_bm(j,i) = aqbm1*(temp_c(1,j,i)-temp_c(0,j,i))/h_c(j,i) &
78 -aqbm2*(temp_r(krmax,j,i)-temp_r(krmax-1,j,i)) &
79 -aqbm3*h_c(j,i)*0.5_dp*(vx_t(0,j,i)+vx_t(0,j,i-1)) &
81 -aqbm3*h_c(j,i)*0.5_dp*(vy_t(0,j,i)+vy_t(0,j-1,i)) &
86 -aqbm2*(temp_r(krmax,j,i)-temp_r(krmax-1,j,i)) &
87 -aqbm3*(h_c(j,i)+h_t(j,i)) &
88 *0.5_dp*(vx_t(0,j,i)+vx_t(0,j,i-1)) &
90 -aqbm3*(h_c(j,i)+h_t(j,i)) &
91 *0.5_dp*(vy_t(0,j,i)+vy_t(0,j-1,i)) &
95 #if ( MARGIN==1 || MARGIN==2 )
97 #if ( !defined(MARINE_ICE_BASAL_MELTING) || MARINE_ICE_BASAL_MELTING==1 )
101 #elif MARINE_ICE_BASAL_MELTING==2
103 if ( (zb(j,i) < z_sl) &
105 ( (maske(j,i+1)==2) &
106 .or.(maske(j,i-1)==2) &
107 .or.(maske(j+1,i)==2) &
108 .or.(maske(j-1,i)==2) &
112 q_bm(j,i) = qbm_marine *year_sec_inv*rhow_rho_ratio
117 #elif MARINE_ICE_BASAL_MELTING==3
119 if ( (zb(j,i) < z_sl) &
121 ( (maske(j,i+1)==2) &
122 .or.(maske(j,i-1)==2) &
123 .or.(maske(j+1,i)==2) &
124 .or.(maske(j-1,i)==2) &
129 if (maske(j,i+1)==2) n_ocean = n_ocean+1
130 if (maske(j,i-1)==2) n_ocean = n_ocean+1
131 if (maske(j+1,i)==2) n_ocean = n_ocean+1
132 if (maske(j-1,i)==2) n_ocean = n_ocean+1
134 if ( n_ocean > 0 )
then
136 q_bm_grounded = q_bm(j,i)
137 q_bm_marine = qbm_marine *year_sec_inv*rhow_rho_ratio
140 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_ocean,dp)) * q_bm_grounded &
141 +0.25_dp*
real(n_ocean,dp) * q_bm_marine
145 write(6,
'(a)')
' calc_qbm: Marine ice margin point does not have'
146 write(6,
'(a)')
' an ocean neighbour!'
153 stop
' calc_qbm: MARINE_ICE_BASAL_MELTING must be either 1, 2 or 3!'
158 if ( flag_grounding_line(j,i) )
then
160 #if FLOATING_ICE_BASAL_MELTING==1
164 #elif FLOATING_ICE_BASAL_MELTING==2
166 q_bm(j,i) = qbm_float_1 *year_sec_inv*rhow_rho_ratio
169 #elif FLOATING_ICE_BASAL_MELTING==3
172 if (maske(j,i+1)>=2) n_float = n_float+1
173 if (maske(j,i-1)>=2) n_float = n_float+1
174 if (maske(j+1,i)>=2) n_float = n_float+1
175 if (maske(j-1,i)>=2) n_float = n_float+1
177 if ( n_float > 0 )
then
179 q_bm_grounded = q_bm(j,i)
180 q_bm_floating = qbm_float_1 *year_sec_inv*rhow_rho_ratio
183 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_float,dp)) * q_bm_grounded &
184 +0.25_dp*
real(n_float,dp) * q_bm_floating
187 write(6,
'(a)')
' calc_qbm: Grounding line point does not have'
188 write(6,
'(a)')
' a floating ice or ocean neighbour!'
193 stop
' calc_qbm: FLOATING_ICE_BASAL_MELTING must be either 1, 2 or 3!'
196 else if ( (zb(j,i) < z_sl) &
198 ( (maske(j,i+1)>=2) &
199 .or.(maske(j,i-1)>=2) &
200 .or.(maske(j+1,i)>=2) &
201 .or.(maske(j-1,i)>=2) &
205 #if MARINE_ICE_BASAL_MELTING==1
209 #elif MARINE_ICE_BASAL_MELTING==2
211 q_bm(j,i) = qbm_marine *year_sec_inv*rhow_rho_ratio
214 #elif MARINE_ICE_BASAL_MELTING==3
217 if (maske(j,i+1)>=2) n_ocean = n_ocean+1
218 if (maske(j,i-1)>=2) n_ocean = n_ocean+1
219 if (maske(j+1,i)>=2) n_ocean = n_ocean+1
220 if (maske(j-1,i)>=2) n_ocean = n_ocean+1
222 if ( n_ocean > 0 )
then
224 q_bm_grounded = q_bm(j,i)
225 q_bm_marine = qbm_marine *year_sec_inv*rhow_rho_ratio
228 q_bm(j,i) = (1.0_dp-0.25_dp*
real(n_ocean,dp)) * q_bm_grounded &
229 +0.25_dp*
real(n_ocean,dp) * q_bm_marine
233 write(6,
'(a)')
' calc_qbm: Marine ice margin point does not have'
234 write(6,
'(a)')
' a floating ice or ocean neighbour!'
239 stop
' calc_qbm: MARINE_ICE_BASAL_MELTING must be either 1, 2 or 3!'
244 else if ( (maske(j,i)==2).or.(maske(j,i)==3) )
then
246 if ( flag_grounding_line(j,i+1) &
247 .or.flag_grounding_line(j,i-1) &
248 .or.flag_grounding_line(j+1,i) &
249 .or.flag_grounding_line(j-1,i) )
then
251 q_bm(j,i) = qbm_float_1 *year_sec_inv*rhow_rho_ratio
254 else if ( zl(j,i) > z_abyss )
then
256 q_bm(j,i) = qbm_float_2 *year_sec_inv*rhow_rho_ratio
261 q_bm(j,i) = qbm_float_3 *year_sec_inv*rhow_rho_ratio
267 stop
' calc_qbm: MARGIN must be either 1, 2 or 3!'
277 q_b_tot = q_bm + q_tld
283 qbm_min = qbm_min *year_sec_inv*rhow_rho_ratio
285 #elif defined(QB_MIN) /* obsolete */
288 stop
' calc_qbm: Limiter QBM_MIN is undefined!'
292 qbm_max = qbm_max *year_sec_inv*rhow_rho_ratio
294 #elif defined(QB_MAX) /* obsolete */
297 stop
' calc_qbm: Limiter QBM_MAX is undefined!'
300 #if ( defined(MARINE_ICE_BASAL_MELTING) \
301 && ( marine_ice_basal_melting==2 || marine_ice_basal_melting==3 ) )
303 if (qbm_marine*year_sec_inv*rhow_rho_ratio > qbm_max)
then
304 write (6,
'(a)')
' calc_qbm: QBM_MARINE (basal melting rate at the marine'
305 write (6,
'(a)')
' ice front) is larger than the limiter qbm_max!'
312 && defined(floating_ice_basal_melting) \
313 && floating_ice_basal_melting<=3 )
315 if (qbm_float_1*year_sec_inv*rhow_rho_ratio > qbm_max)
then
316 write (6,
'(a)')
' calc_qbm: QBM_FLOAT_1 (basal melting rate in the grounding'
317 write (6,
'(a)')
' line zone) is larger than the limiter qbm_max!'
325 if (maske(j,i)==0)
then
326 if (q_bm(j,i) < qbm_min) q_bm(j,i) = 0.0_dp
327 if (q_bm(j,i) > qbm_max) q_bm(j,i) = qbm_max
328 if (q_tld(j,i) < qbm_min) q_tld(j,i) = 0.0_dp
329 if (q_tld(j,i) > qbm_max) q_tld(j,i) = qbm_max
330 if (q_b_tot(j,i) < qbm_min) q_b_tot(j,i) = 0.0_dp
331 if (q_b_tot(j,i) > qbm_max) q_b_tot(j,i) = qbm_max