47 real(dp),
dimension(-256:255),
private :: rf
51 real(dp) ,
private :: r_t
54 real(dp),
dimension(-256:255),
private :: kappa
57 real(dp),
dimension(-256:255),
private :: c
61 integer(i4b),
private :: n_temp_min
65 integer(i4b),
private :: n_temp_max
68 real(dp) ,
private :: rho_i
71 real(dp) ,
private :: rho_c
74 real(dp) ,
private :: kappa_c
77 real(dp) ,
private :: c_c
91 n_tmp_min, n_tmp_max, &
92 rho_i_val, rho_c_val, kappa_c_val, c_c_val)
96 integer(i4b),
intent(in) :: n_tmp_min, n_tmp_max
97 real(dp),
dimension(n_tmp_min:n_tmp_max), &
98 intent(in) :: RF_table, KAPPA_table, C_table
99 real(dp),
intent(in) :: R_T_val
100 real(dp),
optional,
intent(in) :: RHO_I_val, RHO_C_val, KAPPA_C_val, C_C_val
110 n_temp_min = n_tmp_min
111 n_temp_max = n_tmp_max
113 if ((n_temp_min <= -256).or.(n_temp_max >= 255)) &
114 stop
' >>> ice_mat_eqs_pars: Temperature indices out of allowed range!' 118 do n=n_temp_min, n_temp_max
120 kappa(n) = kappa_table(n)
124 do n=-256, n_temp_min-1
125 rf(n) = rf(n_temp_min)
126 kappa(n) = kappa(n_temp_min)
130 do n=n_temp_max+1, 255
131 rf(n) = rf(n_temp_max)
132 kappa(n) = kappa(n_temp_max)
140 if (
present(rho_i_val) )
then 146 if (
present(rho_c_val) )
then 152 if (
present(kappa_c_val) )
then 153 kappa_c = kappa_c_val
158 if (
present(c_c_val) )
then 177 real(dp) :: ratefac_c
178 real(dp),
intent(in) :: temp_val, temp_m_val
180 integer(i4b) :: n_temp_1, n_temp_2
181 real(dp) :: temp_h_val
183 temp_h_val = temp_val-temp_m_val
185 n_temp_1 = floor(temp_h_val)
186 n_temp_1 = max(min(n_temp_1, n_temp_max-1), n_temp_min)
187 n_temp_2 = n_temp_1 + 1
189 ratefac_c = rf(n_temp_1) &
190 + (rf(n_temp_2)-rf(n_temp_1)) &
191 * (temp_h_val-
real(n_temp_1,
dp))
205 real(dp) :: ratefac_t
206 real(dp),
intent(in) :: omega_val
208 ratefac_t = rf(0)*(1.0_dp+r_t*(omega_val))
216 function ratefac_c_t(temp_val, omega_val, temp_m_val)
223 real(dp) :: ratefac_c_t
224 real(dp),
intent(in) :: temp_val, temp_m_val, omega_val
226 integer(i4b) :: n_temp_1, n_temp_2
227 real(dp) :: temp_h_val
229 temp_h_val = temp_val-temp_m_val
231 n_temp_1 = floor(temp_h_val)
232 n_temp_1 = max(min(n_temp_1, n_temp_max-1), n_temp_min)
233 n_temp_2 = n_temp_1 + 1
235 ratefac_c_t = ( rf(n_temp_1) &
236 + (rf(n_temp_2)-rf(n_temp_1)) &
237 * (temp_h_val-
real(n_temp_1,
dp)) ) &
238 * (1.0_dp+r_t*(omega_val))
253 real(dp) :: kappa_val
254 real(dp),
intent(in) :: temp_val
256 integer(i4b) :: n_temp_1, n_temp_2
257 real(dp) :: kappa_ice
261 n_temp_1 = floor(temp_val)
262 n_temp_1 = max(min(n_temp_1, n_temp_max-1), n_temp_min)
263 n_temp_2 = n_temp_1 + 1
265 #if defined(FRAC_DUST) 266 kappa_ice = kappa(n_temp_1) &
267 + (kappa(n_temp_2)-kappa(n_temp_1)) &
268 * (temp_val-
real(n_temp_1,
dp))
270 kappa_val = kappa(n_temp_1) &
271 + (kappa(n_temp_2)-kappa(n_temp_1)) &
272 * (temp_val-
real(n_temp_1,
dp))
278 #if defined(FRAC_DUST) 279 kappa_val = (1.0_dp-frac_dust)*kappa_ice + frac_dust*kappa_c
288 function c_val(temp_val)
296 real(dp),
intent(in) :: temp_val
298 integer(i4b) :: n_temp_1, n_temp_2
303 n_temp_1 = floor(temp_val)
304 n_temp_1 = max(min(n_temp_1, n_temp_max-1), n_temp_min)
305 n_temp_2 = n_temp_1 + 1
307 #if defined(FRAC_DUST) 308 c_ice = c(n_temp_1) &
309 + (c(n_temp_2)-c(n_temp_1)) &
310 * (temp_val-
real(n_temp_1,
dp))
312 c_val = c(n_temp_1) &
313 + (c(n_temp_2)-c(n_temp_1)) &
314 * (temp_val-
real(n_temp_1,
dp))
320 #if defined(FRAC_DUST) 321 c_val =
rho_inv * ( (1.0_dp-frac_dust)*rho_i*c_ice + frac_dust*rho_c*c_c )
329 function creep(sigma_val)
338 real(dp),
intent(in) :: sigma_val
341 real(dp),
parameter :: sm_coeff_1 = 8.5112e-15_dp, &
342 sm_coeff_2 = 8.1643e-25_dp, &
343 sm_coeff_3 = 9.2594e-12_dp
350 creep = sigma_val*sigma_val
355 creep = sigma_val**0.8_dp * gr_size**(-1.4_dp)
360 creep = sigma_val*sigma_val*sigma_val
369 creep = sigma_val*sigma_val + sigma_res*sigma_res
374 creep = (sigma_val**0.8_dp + sigma_res**0.8_dp) * gr_size**(-1.4_dp)
380 creep = sigma_val*sigma_val*sigma_val + sigma_res*sigma_res*sigma_res
390 + sm_coeff_2 * (sigma_val*sigma_val) &
391 * (1.0_dp + sm_coeff_3 * (sigma_val*sigma_val))
404 function viscosity(de_val, temp_val, temp_m_val, omega_val, enh_val, &
413 real(dp) :: viscosity
414 real(dp) ,
intent(in) :: de_val
415 real(dp) ,
intent(in) :: temp_val, temp_m_val
416 real(dp) ,
intent(in) :: omega_val
417 real(dp) ,
intent(in) :: enh_val
418 integer(i2b),
intent(in) :: i_flag_cold_temp
420 real(dp) :: ratefac_val
423 real(dp) :: n_power_law, inv_n_power_law, n_grain_size
425 real(dp),
parameter :: de_min = 1.0e-30_dp
429 real(dp),
parameter :: sm_coeff_1 = 8.5112e-15_dp, &
430 sm_coeff_2 = 8.1643e-25_dp, &
431 sm_coeff_3 = 9.2594e-12_dp
436 if (i_flag_cold_temp == 0_i2b)
then 437 ratefac_val =
ratefac_c(temp_val, temp_m_val)
438 else if (i_flag_cold_temp == 1_i2b)
then 441 ratefac_val =
ratefac_c_t(temp_val, omega_val, temp_m_val)
444 de_val_m = max(de_val, de_min)
452 inv_n_power_law = 0.333333333333333_dp
454 viscosity = 0.5_dp * de_val_m**(inv_n_power_law-1.0_dp) &
455 * (enh_val*ratefac_val)**(-inv_n_power_law)
461 inv_n_power_law = 0.555555555555555_dp
462 n_grain_size = 1.4_dp
464 viscosity = 0.5_dp * de_val_m**(inv_n_power_law-1.0_dp) &
465 * gr_size**(n_grain_size*inv_n_power_law) &
466 * (enh_val*ratefac_val)**(-inv_n_power_law)
472 inv_n_power_law = 0.25_dp
474 viscosity = 0.5_dp * de_val_m**(inv_n_power_law-1.0_dp) &
475 * (enh_val*ratefac_val)**(-inv_n_power_law)
487 viscosity = visc_iter(de_val_m, ratefac_val, enh_val, n_power_law, sigma_res)
495 n_grain_size = 1.4_dp
497 write(6,
'(a)')
' >>> viscosity: Computation of the viscosity as a function' 498 write(6,
'(a)')
' of the effective strain rate not yet implemented' 499 write(6,
'(a)')
' for grain-size-dependent finite viscosity flow laws!' 508 viscosity = visc_iter(de_val_m, ratefac_val, enh_val, n_power_law, sigma_res)
518 viscosity = visc_iter_sm(de_val_m, ratefac_val, enh_val, &
519 sm_coeff_1, sm_coeff_2, sm_coeff_3)
531 function visc_iter(de_val_m, ratefac_val, enh_val, n_power_law, sigma_res)
537 real(dp) :: visc_iter
538 real(dp),
intent(in) :: de_val_m
539 real(dp),
intent(in) :: ratefac_val, enh_val
540 real(dp),
intent(in) :: n_power_law, sigma_res
542 real(dp) :: visc_val, res
544 real(dp),
parameter :: eps = 1.0e-05_dp
548 visc_val = 1.0e+10_dp
552 res = fct_visc(de_val_m, ratefac_val, enh_val, visc_val, &
553 n_power_law, sigma_res)
555 if (res < 0.0_dp)
then 556 visc_val = 10.0_dp*visc_val
567 visc_val = visc_val &
569 /fct_visc_deriv(de_val_m, ratefac_val, enh_val, visc_val, &
570 n_power_law, sigma_res)
572 res = fct_visc(de_val_m, ratefac_val, enh_val, visc_val, &
573 n_power_law, sigma_res)
575 if (abs(res) < eps)
exit 581 end function visc_iter
587 function fct_visc(de_val_m, ratefac_val, enh_val, visc_val, &
588 n_power_law, sigma_res)
595 real(dp),
intent(in) :: de_val_m
596 real(dp),
intent(in) :: ratefac_val, enh_val
597 real(dp),
intent(in) :: visc_val
598 real(dp),
intent(in) :: n_power_law, sigma_res
600 fct_visc = 2.0_dp**n_power_law &
601 *enh_val*ratefac_val &
602 *de_val_m**(n_power_law-1.0_dp) &
603 *visc_val**n_power_law &
604 + 2.0_dp*enh_val*ratefac_val &
605 *sigma_res**(n_power_law-1.0_dp) &
609 end function fct_visc
615 function fct_visc_deriv(de_val_m, ratefac_val, enh_val, visc_val, &
616 n_power_law, sigma_res)
622 real(dp) :: fct_visc_deriv
623 real(dp),
intent(in) :: de_val_m
624 real(dp),
intent(in) :: ratefac_val, enh_val
625 real(dp),
intent(in) :: visc_val
626 real(dp),
intent(in) :: n_power_law, sigma_res
628 fct_visc_deriv = 2.0_dp**n_power_law*n_power_law &
629 *enh_val*ratefac_val &
630 *de_val_m**(n_power_law-1.0_dp) &
631 *visc_val**(n_power_law-1.0_dp) &
632 + 2.0_dp*enh_val*ratefac_val &
633 *sigma_res**(n_power_law-1.0_dp)
635 end function fct_visc_deriv
645 function visc_iter_sm(de_val_m, ratefac_val, enh_val, &
646 sm_coeff_1, sm_coeff_2, sm_coeff_3)
652 real(dp) :: visc_iter_sm
653 real(dp),
intent(in) :: de_val_m
654 real(dp),
intent(in) :: ratefac_val, enh_val
655 real(dp),
intent(in) :: sm_coeff_1, sm_coeff_2, sm_coeff_3
657 real(dp) :: visc_val, res
659 real(dp),
parameter :: eps = 1.0e-05_dp
663 visc_val = 1.0e+10_dp
667 res = fct_visc_sm(de_val_m, ratefac_val, enh_val, visc_val, &
668 sm_coeff_1, sm_coeff_2, sm_coeff_3)
670 if (res < 0.0_dp)
then 671 visc_val = 10.0_dp*visc_val
682 visc_val = visc_val &
684 /fct_visc_sm_deriv(de_val_m, ratefac_val, enh_val, visc_val, &
685 sm_coeff_1, sm_coeff_2, sm_coeff_3)
687 res = fct_visc_sm(de_val_m, ratefac_val, enh_val, visc_val, &
688 sm_coeff_1, sm_coeff_2, sm_coeff_3)
690 if (abs(res) < eps)
exit 694 visc_iter_sm = visc_val
696 end function visc_iter_sm
702 function fct_visc_sm(de_val_m, ratefac_val, enh_val, visc_val, &
703 sm_coeff_1, sm_coeff_2, sm_coeff_3)
709 real(dp) :: fct_visc_sm
710 real(dp),
intent(in) :: de_val_m
711 real(dp),
intent(in) :: ratefac_val, enh_val
712 real(dp),
intent(in) :: visc_val
713 real(dp),
intent(in) :: sm_coeff_1, sm_coeff_2, sm_coeff_3
715 real(dp) :: de_visc_factor
717 de_visc_factor = de_val_m*de_val_m*visc_val*visc_val
719 fct_visc_sm = 2.0_dp*enh_val*ratefac_val*visc_val &
721 + 4.0_dp*sm_coeff_2*de_visc_factor &
722 * ( 1.0_dp + 4.0_dp*sm_coeff_3*de_visc_factor ) ) &
725 end function fct_visc_sm
731 function fct_visc_sm_deriv(de_val_m, ratefac_val, enh_val, visc_val, &
732 sm_coeff_1, sm_coeff_2, sm_coeff_3)
738 real(dp) :: fct_visc_sm_deriv
739 real(dp),
intent(in) :: de_val_m
740 real(dp),
intent(in) :: ratefac_val, enh_val
741 real(dp),
intent(in) :: visc_val
742 real(dp),
intent(in) :: sm_coeff_1, sm_coeff_2, sm_coeff_3
744 real(dp) :: de_visc_factor
746 real(dp),
parameter :: twenty_over_three = 6.666666666666667_dp
748 de_visc_factor = de_val_m*de_val_m*visc_val*visc_val
750 fct_visc_sm_deriv = 2.0_dp*sm_coeff_1*enh_val*ratefac_val &
751 + 24.0_dp*sm_coeff_2*enh_val*ratefac_val*de_visc_factor &
752 * ( 1.0_dp + twenty_over_three*sm_coeff_3*de_visc_factor )
754 end function fct_visc_sm_deriv
Material properties of ice: Rate factor, heat conductivity, specific heat (heat capacity), creep function, viscosity.
real(dp) function, public kappa_val(temp_val)
Heat conductivity of ice: Linear interpolation of tabulated values in KAPPA(.).
real(dp) function, public creep(sigma_val)
Creep response function for ice.
Declarations of global variables for SICOPOLIS (for the ANT domain).
real(dp) function, public ratefac_c(temp_val, temp_m_val)
Rate factor for cold ice: Linear interpolation of tabulated values in RF(.).
Declarations of kind types for SICOPOLIS.
real(dp) function, public ratefac_t(omega_val)
Rate factor for temperate ice.
real(dp) function, public c_val(temp_val)
Specific heat of ice: Linear interpolation of tabulated values in C(.).
real(dp) rho_inv
rho_inv: Inverse of the density of ice-dust mixture
subroutine, public ice_mat_eqs_pars(RF_table, R_T_val, KAPPA_table, C_table, n_tmp_min, n_tmp_max, RHO_I_val, RHO_C_val, KAPPA_C_val, C_C_val)
Setting of required physical parameters.
real(dp) function, public viscosity(de_val, temp_val, temp_m_val, omega_val, enh_val, i_flag_cold_temp)
Ice viscosity as a function of the effective strain rate and the temperature (in cold ice) or the wat...
real(dp) function, public ratefac_c_t(temp_val, omega_val, temp_m_val)
Rate factor for cold and temperate ice: Combination of ratefac_c and ratefac_t (only for the enthalpy...
integer, parameter dp
Double-precision reals.
Declarations of global variables for SICOPOLIS.