25 #ifdef PMC_USE_QUADPACK
26 use quadpack_double,
only: dqagse
50 real(kind=
dp) :: z_ref = 20.0d0
52 real(kind=
dp) :: u_mean = 5.0d0
55 real(kind=
dp) :: z_rough = 0.8d0
57 real(kind=
dp) :: a = 2.0d0 / 1000.0d0
59 real(kind=
dp) :: alpha = 1.0d0
61 real(kind=
dp) :: eps_0 = 3.0d0
63 real(kind=
dp) :: gamma = 0.56d0
65 real(kind=
dp) :: c_b = 1.0d0
67 real(kind=
dp) :: c_in = 0.5d0
69 real(kind=
dp) :: c_im = 1.0d0
71 real(kind=
dp) :: nu = 2.0d0
73 real(kind=
dp) :: beta = 2.0d0
89 real(kind=
dp),
allocatable :: temp_time(:)
91 real(kind=
dp),
allocatable :: temp(:)
94 real(kind=
dp),
allocatable :: pressure_time(:)
96 real(kind=
dp),
allocatable :: pressure(:)
99 real(kind=
dp),
allocatable :: height_time(:)
101 real(kind=
dp),
allocatable :: height(:)
104 real(kind=
dp),
allocatable :: gas_emission_time(:)
106 real(kind=
dp),
allocatable :: gas_emission_rate_scale(:)
111 real(kind=
dp),
allocatable :: gas_dilution_time(:)
113 real(kind=
dp),
allocatable :: gas_dilution_rate(:)
118 real(kind=
dp),
allocatable :: aero_emission_time(:)
120 real(kind=
dp),
allocatable :: aero_emission_rate_scale(:)
125 real(kind=
dp),
allocatable :: aero_dilution_time(:)
127 real(kind=
dp),
allocatable :: aero_dilution_rate(:)
132 integer :: loss_function_type
152 real(kind=
dp),
intent(in) :: time
154 env_state%temp =
interp_1d(scenario%temp_time, scenario%temp, time)
155 env_state%pressure =
interp_1d(scenario%pressure_time, &
156 scenario%pressure, time)
157 env_state%height =
interp_1d(scenario%height_time, scenario%height, time)
158 env_state%elapsed_time = time
160 env_state%solar_zenith_angle = 0d0
175 real(kind=
dp),
intent(in) :: time
178 real(kind=
dp) :: pmv_old, pmv_new
180 real(kind=
dp) :: pressure_old
182 real(kind=
dp) :: temp_old
188 pressure_old = env_state%pressure
189 temp_old = env_state%temp
191 env_state%temp =
interp_1d(scenario%temp_time, scenario%temp, time)
192 env_state%pressure =
interp_1d(scenario%pressure_time, &
193 scenario%pressure, time)
195 pmv_new = pmv_old * env_state%pressure / pressure_old
198 env_state%height =
interp_1d(scenario%height_time, scenario%height, time)
199 env_state%elapsed_time = time
243 old_env_state, gas_data, gas_state)
248 real(kind=
dp),
intent(in) :: delta_t
258 real(kind=
dp) :: emission_rate_scale, dilution_rate, p
262 if (
size(scenario%gas_emission) > 0)
then
264 scenario%gas_emission_time, scenario%gas_emission_rate_scale, &
265 env_state%elapsed_time, emissions, emission_rate_scale)
267 p = emission_rate_scale * delta_t / env_state%height
273 scenario%gas_dilution_time, scenario%gas_dilution_rate, &
274 env_state%elapsed_time, background, dilution_rate)
275 p = exp(- dilution_rate * delta_t)
276 if (env_state%height > old_env_state%height)
then
277 p = p * old_env_state%height / env_state%height
295 old_env_state, aero_data, aero_state, n_emit, n_dil_in, n_dil_out, &
296 allow_doubling, allow_halving)
301 real(kind=
dp),
intent(in) :: delta_t
311 integer,
intent(out) :: n_emit
313 integer,
intent(out) :: n_dil_in
315 integer,
intent(out) :: n_dil_out
317 logical,
intent(in) :: allow_doubling
319 logical,
intent(in) :: allow_halving
321 real(kind=
dp),
parameter :: sample_timescale = 3600.0d0
322 real(kind=
dp) :: characteristic_factor, sample_timescale_effective
323 real(kind=
dp) :: emission_rate_scale, dilution_rate, p
327 sample_timescale_effective = max(1.0, min(sample_timescale, &
328 env_state%elapsed_time))
329 characteristic_factor = sample_timescale_effective / delta_t
332 if (
size(scenario%aero_emission) > 0)
then
334 scenario%aero_emission_time, scenario%aero_emission_rate_scale, &
335 env_state%elapsed_time, emissions, emission_rate_scale)
336 p = emission_rate_scale * delta_t / env_state%height
338 emissions, p, characteristic_factor, env_state%elapsed_time, &
339 allow_doubling, allow_halving, n_emit)
344 scenario%aero_dilution_time, scenario%aero_dilution_rate, &
345 env_state%elapsed_time, background, dilution_rate)
346 p = exp(- dilution_rate * delta_t)
347 if (env_state%height > old_env_state%height)
then
348 p = p * old_env_state%height / env_state%height
354 aero_data, 1d0 - p, aero_info_dilution)
358 background, 1d0 - p, characteristic_factor, env_state%elapsed_time, &
359 allow_doubling, allow_halving, n_dil_in)
367 call aero_weight_array_scale(aero_state%awa, &
368 old_env_state%inverse_density * (1.0d0 / env_state%inverse_density))
371 call aero_weight_array_scale(aero_state%awa, &
372 old_env_state%temp * env_state%pressure &
373 / (env_state%temp * old_env_state%pressure))
385 old_env_state, bin_grid, aero_data, do_aero_dilution, aero_binned)
390 real(kind=
dp),
intent(in) :: delta_t
400 logical,
intent(in) :: do_aero_dilution
402 type(aero_binned_t),
intent(inout) :: aero_binned
404 real(kind=
dp) :: emission_rate_scale, dilution_rate, p
406 type(aero_binned_t) :: emissions_binned, background_binned
410 scenario%aero_emission_time, scenario%aero_emission_rate_scale, &
411 env_state%elapsed_time, emissions, emission_rate_scale)
412 call aero_binned_add_aero_dist(emissions_binned, bin_grid, aero_data, &
414 p = emission_rate_scale * delta_t / env_state%height
415 call aero_binned_add_scaled(aero_binned, emissions_binned, p)
418 if (do_aero_dilution)
then
420 scenario%aero_dilution_time, scenario%aero_dilution_rate, &
421 env_state%elapsed_time, background, dilution_rate)
422 call aero_binned_add_aero_dist(background_binned, bin_grid, aero_data, &
424 p = exp(- dilution_rate * delta_t)
425 if (env_state%height > old_env_state%height)
then
426 p = p * old_env_state%height / env_state%height
428 call aero_binned_scale(aero_binned, p)
429 call aero_binned_add_scaled(aero_binned, background_binned, 1d0 - p)
434 env_state, aero_binned)
447 real(kind=
dp),
intent(in) :: del_t
451 real(kind=
dp),
intent(in) :: density
455 real(kind=
dp) :: n, d_pg, ln_sigma_g
456 real(kind=
dp) :: m_0_rate, m_3_rate
457 real(kind=
dp) :: m, new_m
458 real(kind=
dp) :: new_n, new_d_pg
467 n = aero_dist%mode(i_mode)%num_conc
471 d_pg = aero_dist%mode(i_mode)%char_radius * 2.0d0
472 ln_sigma_g = aero_dist%mode(i_mode)%log10_std_dev_radius &
477 aero_dist%mode(i_mode), 0.0d0, density, env_state)
478 new_n = n * exp(m_0_rate * del_t)
480 aero_dist%mode(i_mode)%num_conc = new_n
485 aero_dist%mode(i_mode), 3.0d0, density, env_state)
486 m = n * d_pg**3.0d0 * exp((3.0d0**2.0d0) / 2.0d0 &
487 * (ln_sigma_g**2.0d0))
488 new_m = m * exp(m_3_rate * del_t)
491 new_d_pg = (new_m / new_n * exp(-(3.0d0**2.0d0) / 2.0d0 &
492 * (ln_sigma_g**2.0d0)))**(1.0d0/3.0d0)
493 aero_dist%mode(i_mode)%char_radius = new_d_pg / 2.0d0
496 call die_msg(192500240,
"loss_function must be none or drydep " &
497 //
"for modal runs; unsupported loss function id: " &
507 aero_data, env_state)
512 real(kind=
dp),
intent(in) :: vol
514 real(kind=
dp),
intent(in) :: density
533 aero_data, env_state, scenario)
537 aero_data, env_state) &
539 aero_data, env_state)
541 call die_msg(201594391,
"Unknown loss function id: " &
556 real(kind=
dp),
intent(in) :: vol
558 real(kind=
dp),
intent(in) :: density
569 real(kind=
dp) :: density_air
570 real(kind=
dp) :: visc_d, visc_k
571 real(kind=
dp) :: gas_speed, gas_mean_free_path
572 real(kind=
dp) :: knud, cunning
573 real(kind=
dp) :: grav
574 real(kind=
dp) :: r_s, r_a
575 real(kind=
dp) :: diff_p
576 real(kind=
dp) :: von_karman
577 real(kind=
dp) :: st, sc, u_star
578 real(kind=
dp) :: e_b, e_im, e_in, r1
581 drydep_params = scenario%drydep
586 density_air = (
const%air_molec_weight * env_state%pressure) &
587 / (
const%univ_gas_const * env_state%temp)
589 visc_d = 1.8325d-5 * (416.16 / (env_state%temp + 120.0d0)) &
590 * (env_state%temp / 296.16)**1.5d0
592 visc_k = visc_d / density_air
594 gas_speed = sqrt((8.0d0 *
const%boltzmann * env_state%temp &
597 gas_mean_free_path = (2.0d0 * visc_d) / (density_air * gas_speed)
599 knud = (2.0d0 * gas_mean_free_path) / d_p
601 cunning = 1.0d0 + knud * (1.257d0 + 0.4d0 * exp(-1.1d0 / knud))
605 v_s = (density * d_p**2.0d0 * grav * cunning) / (18.0d0 * visc_d)
609 u_star = .4d0 * drydep_params%u_mean &
610 / log(drydep_params%z_ref / drydep_params%z_rough)
611 r_a = (1.0d0 / (.4d0 * u_star)) &
612 * log(drydep_params%z_ref / drydep_params%z_rough)
614 diff_p = (
const%boltzmann * env_state%temp * cunning) &
615 / (3.d0 *
const%pi * visc_d * d_p)
617 e_b = drydep_params%C_B * sc**(-drydep_params%gamma)
621 e_in = drydep_params%C_IN * (d_p / drydep_params%A)**drydep_params%nu
624 st = (v_s * u_star) / (grav * drydep_params%A)
625 e_im = drydep_params%C_IM * (st &
626 / (drydep_params%alpha + st))**drydep_params%beta
632 r_s = 1.0d0 / (drydep_params%eps_0 * u_star * (e_b + e_in + e_im) * r1)
635 v_d = v_s + (1.0d0 / (r_a + r_s))
647 aero_mode, moment, density, env_state)
652 type(aero_mode_t),
intent(in) :: aero_mode
654 real(kind=
dp),
intent(in) :: moment
656 real(kind=
dp),
intent(in) :: density
660 real(kind=
dp) :: v_d_hat, v_g_hat
661 real(kind=
dp) :: v_g_bar
662 real(kind=
dp) :: d_pg, ln_sigma_g
663 real(kind=
dp) :: density_air
664 real(kind=
dp) :: visc_d, visc_k
665 real(kind=
dp) :: gas_speed, gas_mean_free_path
666 real(kind=
dp) :: knud
667 real(kind=
dp) :: d_bar, d_hat
668 real(kind=
dp) :: st, sc
669 real(kind=
dp) :: u_star
670 real(kind=
dp) :: r_a, r_s
671 real(kind=
dp) :: e_b, e_in, e_im, r1
674 #ifdef PMC_USE_QUADPACK
677 scenario_integrated_loss_rate_drydep_quadpack( &
678 scenario, aero_mode, moment, density, env_state)
682 drydep_params = scenario%drydep
685 d_pg = aero_mode%char_radius * 2.0d0
687 ln_sigma_g = aero_mode%log10_std_dev_radius / log10(exp(1.0d0))
689 density_air = (
const%air_molec_weight * env_state%pressure) &
690 / (
const%univ_gas_const * env_state%temp)
692 visc_d = 1.8325d-5 * (416.16 / (env_state%temp + 120.0d0)) &
693 * (env_state%temp / 296.16)**1.5d0
695 visc_k = visc_d / density_air
697 gas_speed = sqrt((8.0d0 *
const%boltzmann * env_state%temp &
700 gas_mean_free_path = (2.0d0 * visc_d) / (density_air * gas_speed)
702 knud = (2.0d0 * gas_mean_free_path) / d_pg
704 v_g_bar = (density * d_pg**2.0d0 *
const%std_grav) / (18.0d0 * visc_d)
707 * (exp((4.0d0 * moment + 4.0d0) / 2.0d0 * ln_sigma_g**2.0d0) &
709 * exp((2.0d0 * moment + 1.0d0) / 2.0d0 * ln_sigma_g**2.0d0))
712 u_star = 0.4d0 * drydep_params%u_mean / log(drydep_params%z_ref &
713 / drydep_params%z_rough)
714 r_a = (1.0d0 / (0.4d0 * u_star)) &
715 * log(drydep_params%z_ref / drydep_params%z_rough)
718 d_bar = (
const%boltzmann * env_state%temp) &
719 / (3.0d0 *
const%pi * visc_d * d_pg)
722 * ((exp((-2.0d0 * moment + 1.0d0) / 2.0d0 * ln_sigma_g**2.0d0) &
724 * exp((-4.0d0 * moment + 4.0d0) / 2.0d0 * ln_sigma_g**2.0d0)))
728 e_b = drydep_params%C_B * sc**(-drydep_params%gamma)
731 e_in = drydep_params%C_IN * (d_pg / drydep_params%A)**drydep_params%nu
734 st = (v_g_hat * u_star) / (
const%std_grav * drydep_params%A)
736 e_im = drydep_params%C_IM * (st / (drydep_params%alpha + st)) &
743 r_s = 1.0d0 / (drydep_params%eps_0 * u_star * (e_b + e_in + e_im) * r1)
746 v_d_hat = v_g_hat + (1.0d0 / (r_a + r_s))
755 #ifdef PMC_USE_QUADPACK
756 real(kind=
dp)
function scenario_integrated_loss_rate_drydep_quadpack( &
757 scenario, aero_mode, moment, density, env_state)
762 type(aero_mode_t),
intent(in) :: aero_mode
764 real(kind=
dp),
intent(in) :: moment
766 real(kind=
dp),
intent(in) :: density
770 real(kind=
dp) :: d_pg, ln_sigma_g
771 real(kind=
dp) :: density_air
772 real(kind=
dp) :: visc_d, visc_k
773 real(kind=
dp) :: gas_speed, gas_mean_free_path
775 real(kind=
dp) :: lower, upper, epsabs, epsrel, result, abserr, ref
776 integer :: limit, neval, ier, last
777 real(kind=
dp),
allocatable :: alist(:), blist(:), rlist(:), elist(:)
778 integer,
allocatable :: iord(:)
782 drydep_params = scenario%drydep
785 d_pg = aero_mode%char_radius * 2.0d0
787 ln_sigma_g = aero_mode%log10_std_dev_radius / log10(exp(1.0d0))
789 density_air = (
const%air_molec_weight * env_state%pressure) &
790 / (
const%univ_gas_const * env_state%temp)
792 visc_d = 1.8325d-5 * (416.16 / (env_state%temp + 120.0d0)) &
793 * (env_state%temp / 296.16)**1.5d0
795 visc_k = visc_d / density_air
797 gas_speed = sqrt((8.0d0 *
const%boltzmann * env_state%temp &
800 gas_mean_free_path = (2.0d0 * visc_d) / (density_air * gas_speed)
802 ref = exp(log(d_pg) + moment*ln_sigma_g**2)
803 lower = ref / (exp(ln_sigma_g)*10.0)
804 upper = ref * exp(ln_sigma_g)*10.0
812 allocate(alist(limit), blist(limit), rlist(limit), &
813 elist(limit), iord(limit))
816 call dqagse(dep_vel_integrand, lower, upper, epsabs, epsrel, limit, &
817 result, abserr, neval, ier, alist, blist, rlist, elist, iord, last)
820 "QUADPACK integration failed, error code: " &
823 m_k = d_pg**moment * exp(moment**2 * ln_sigma_g**2 / 2.0d0)
826 scenario_integrated_loss_rate_drydep_quadpack = 1.0d0 / m_k * result &
830 deallocate(alist, blist, rlist, elist, iord)
834 real(kind=
dp)
function dep_vel_integrand(d_p)
835 real(kind=
dp),
intent(in) :: d_p
838 real(kind=
dp) :: v_d, v_s
839 real(kind=
dp) :: knud_local, cunning
840 real(kind=
dp) :: diff_p, sc, st
841 real(kind=
dp) :: u_star, r_a, r_s
842 real(kind=
dp) :: e_b, e_in, e_im, r1
843 real(kind=
dp) :: ln_dp, ln_dp_g, n_ddp
846 knud_local = (2.0d0 * gas_mean_free_path) / d_p
849 cunning = 1.0d0 + knud_local * (1.257d0 + 0.4d0 * exp(-1.1d0 / knud_local))
852 v_s = (density * d_p**2.0d0 *
const%std_grav * cunning) / (18.0d0 * visc_d)
855 u_star = 0.4d0 * drydep_params%u_mean &
856 / log(drydep_params%z_ref / drydep_params%z_rough)
857 r_a = (1.0d0 / (0.4d0 * u_star)) &
858 * log(drydep_params%z_ref / drydep_params%z_rough)
861 diff_p = (
const%boltzmann * env_state%temp * cunning) &
862 / (3.0d0 *
const%pi * visc_d * d_p)
866 e_b = drydep_params%C_B * sc**(-drydep_params%gamma)
867 e_in = drydep_params%C_IN * (d_p / drydep_params%A)**drydep_params%nu
870 st = (v_s * u_star) / (
const%std_grav * drydep_params%A)
871 e_im = drydep_params%C_IM &
872 * (st / (drydep_params%alpha + st))**drydep_params%beta
878 r_s = 1.0d0 / (drydep_params%eps_0 * u_star * (e_b + e_in + e_im) * r1)
881 v_d = v_s + (1.0d0 / (r_a + r_s))
886 n_ddp = (1.0d0/(sqrt(2.0d0 *
const%pi) * d_p * ln_sigma_g)) &
887 * exp(-((ln_dp - ln_dp_g)**2) / (2.0d0 * ln_sigma_g**2))
890 dep_vel_integrand = d_p**moment * v_d * n_ddp
891 end function dep_vel_integrand
892 end function scenario_integrated_loss_rate_drydep_quadpack
900 density, env_state, velocities)
907 real(kind=
dp),
intent(in) :: moment
909 real(kind=
dp),
intent(in) :: density
913 real(kind=
dp),
intent(inout) :: velocities(:)
917 do i_mode = 1,
size(velocities)
919 scenario, aero_dist%mode(i_mode), moment, density, env_state) &
934 real(kind=
dp),
intent(in) :: vol
941 integer,
parameter :: n_sample = 3
943 real(kind=
dp) :: d, d_min, d_max, loss
946 d_min = minval(aero_data%density)
947 d_max = maxval(aero_data%density)
980 integer,
parameter :: n_sample = 3
982 real(kind=
dp),
parameter :: over_scale = 2d0
984 real(kind=
dp) :: v_low, v_high, vol, r, r_max
994 r_max = max(r_max, r)
996 loss_max(b) = r_max * over_scale
1017 real(kind=
dp),
intent(in) :: delta_t
1025 integer :: c, b, s, i_part
1026 real(kind=
dp) :: over_rate, over_prob, rand_real, rand_geom
1033 do i_part = aero_state%apa%n_part, 1, -1
1035 aero_data, aero_state, env_state, i_part, 1d0)
1042 if (.not. aero_state%aero_sorted%removal_rate_bounds_valid)
then
1044 aero_state%aero_sorted%bin_grid, aero_data, env_state, &
1045 aero_state%aero_sorted%removal_rate_max)
1046 aero_state%aero_sorted%removal_rate_bounds_valid = .true.
1049 do c = 1,aero_sorted_n_class(aero_state%aero_sorted)
1050 do b = 1,aero_sorted_n_bin(aero_state%aero_sorted)
1051 over_rate = aero_state%aero_sorted%removal_rate_max(b)
1052 if (delta_t * over_rate <= 0d0) cycle
1053 over_prob = 1d0 - exp(-delta_t * over_rate)
1056 do s = aero_state%aero_sorted%size_class%inverse(b, c)%n_entry, &
1059 aero_state%aero_sorted%size_class%inverse(b, c)%entry(s)
1061 aero_data, aero_state, env_state, i_part, 1d0)
1065 s = aero_state%aero_sorted%size_class%inverse(b, c)%n_entry + 1
1068 if (rand_real <= 0d0)
exit
1069 rand_geom = -log(rand_real) / (delta_t * over_rate) + 1d0
1070 if (rand_geom >= real(s, kind=
dp))
exit
1071 s = s - floor(rand_geom)
1077 aero_state%aero_sorted%size_class%inverse(b, c)%entry(s)
1079 aero_data, aero_state, env_state, i_part, over_prob)
1097 aero_data, aero_state, env_state, i_part, over_prob)
1102 real(kind=
dp),
intent(in) :: delta_t
1110 integer,
intent(in) :: i_part
1112 real(kind=
dp),
intent(in) :: over_prob
1114 real(kind=
dp) :: prob, rate, vol, density
1115 type(aero_info_t) :: aero_info
1117 vol = aero_particle_volume(aero_state%apa%particle(i_part))
1118 density = aero_particle_density(aero_state%apa%particle(i_part), aero_data)
1120 prob = 1d0 - exp(-delta_t * rate)
1122 "particle loss upper bound estimation is too tight: " &
1127 aero_info%id = aero_state%apa%particle(i_part)%id
1128 aero_info%action = aero_info_dilution
1129 aero_info%other_id = 0
1137 env_state, aero_binned)
1144 real(kind=
dp),
intent(in) :: delta_t
1150 type(aero_binned_t),
intent(inout) :: aero_binned
1153 real(kind=
dp) :: density, vol, loss_rate, p
1164 "sectional loss assumes a single aerosol species")
1165 density = aero_data%density(1)
1169 if (aero_binned%num_conc(i_bin) <= 0d0) cycle
1173 aero_data, env_state)
1174 p = exp(- loss_rate * delta_t)
1175 aero_binned%vol_conc(i_bin,:) = aero_binned%vol_conc(i_bin,:) * p
1176 aero_binned%num_conc(i_bin) = aero_binned%vol_conc(i_bin,1) / vol
1180 call die_msg(769879198,
"loss_function must be none or drydep " &
1181 //
"for sectional runs; unsupported loss function id: " &
1196 integer,
intent(in) :: aero_mode_type
1209 subroutine spec_file_read_scenario(file, gas_data, aero_data, &
1210 read_aero_weight_classes, scenario)
1219 logical,
intent(in) :: read_aero_weight_classes
1223 character(len=PMC_MAX_FILENAME_LEN) :: sub_filename
1225 character(len=SPEC_LINE_MAX_VAR_LEN) :: function_name
1226 type(spec_line_t) :: line
1279 scenario%temp_time, scenario%temp)
1286 scenario%pressure_time, scenario%pressure)
1293 scenario%height_time, scenario%height)
1299 call spec_file_read_gas_states_times_rates(sub_file, gas_data, &
1300 scenario%gas_emission_time, scenario%gas_emission_rate_scale, &
1301 scenario%gas_emission)
1307 call spec_file_read_gas_states_times_rates(sub_file, gas_data, &
1308 scenario%gas_dilution_time, scenario%gas_dilution_rate, &
1309 scenario%gas_background)
1315 call spec_file_read_aero_dists_times_rates(sub_file, aero_data, &
1316 read_aero_weight_classes, scenario%aero_emission_time, &
1317 scenario%aero_emission_rate_scale, scenario%aero_emission)
1323 call spec_file_read_aero_dists_times_rates(sub_file, aero_data, &
1324 read_aero_weight_classes, scenario%aero_dilution_time, &
1325 scenario%aero_dilution_rate, scenario%aero_background)
1330 if (trim(function_name) ==
'none')
then
1332 else if (trim(function_name) ==
'constant')
then
1334 else if (trim(function_name) ==
'volume')
then
1336 else if (trim(function_name) ==
'drydep')
then
1340 if (line%name /=
'drydep_params')
then
1341 call warn_msg(735291468,
"using default dry deposition parameters")
1345 call spec_file_read_drydep_params(sub_file, scenario%drydep)
1348 else if (trim(function_name) ==
'chamber')
then
1350 call spec_file_read_chamber(file, scenario%chamber)
1353 "Unknown loss function type: " // trim(function_name))
1356 end subroutine spec_file_read_scenario
1462 subroutine spec_file_read_drydep_params(file, drydep_params)
1516 end subroutine spec_file_read_drydep_params
1526 integer,
intent(in) :: ncid
1528 associate(d => drydep_params)
1554 integer,
intent(in) :: ncid
1559 logical,
optional,
intent(in) :: must_be_present
1561 integer :: varid, status
1562 logical :: use_must_be_present
1564 use_must_be_present = .true.
1565 if (
present(must_be_present)) use_must_be_present = must_be_present
1567 if (.not. use_must_be_present)
then
1568 status = nf90_inq_varid(ncid,
"drydep_z_ref", varid)
1569 if (status == nf90_enotvar)
return
1572 associate(d => drydep_params)
1573 call pmc_nc_read_real(ncid, d%z_ref,
"drydep_z_ref")
1574 call pmc_nc_read_real(ncid, d%u_mean,
"drydep_u_mean")
1575 call pmc_nc_read_real(ncid, d%z_rough,
"drydep_z_rough")
1576 call pmc_nc_read_real(ncid, d%A,
"drydep_A")
1577 call pmc_nc_read_real(ncid, d%alpha,
"drydep_alpha")
1578 call pmc_nc_read_real(ncid, d%eps_0,
"drydep_eps_0")
1579 call pmc_nc_read_real(ncid, d%gamma,
"drydep_gamma")
1580 call pmc_nc_read_real(ncid, d%C_B,
"drydep_C_B")
1581 call pmc_nc_read_real(ncid, d%C_IN,
"drydep_C_IN")
1582 call pmc_nc_read_real(ncid, d%C_IM,
"drydep_C_IM")
1583 call pmc_nc_read_real(ncid, d%nu,
"drydep_nu")
1584 call pmc_nc_read_real(ncid, d%beta,
"drydep_beta")
1597 integer :: total_size, i
1616 + pmc_mpi_pack_size_chamber(val%chamber)
1617 if (
allocated(val%gas_emission_time))
then
1618 do i = 1,
size(val%gas_emission)
1619 total_size = total_size &
1620 + pmc_mpi_pack_size_gas_state(val%gas_emission(i))
1623 if (
allocated(val%gas_dilution_time))
then
1624 do i = 1,
size(val%gas_background)
1625 total_size = total_size &
1626 + pmc_mpi_pack_size_gas_state(val%gas_background(i))
1629 if (
allocated(val%aero_emission_time))
then
1630 do i = 1,
size(val%aero_emission)
1631 total_size = total_size &
1632 + pmc_mpi_pack_size_aero_dist(val%aero_emission(i))
1635 if (
allocated(val%aero_dilution_time))
then
1636 do i = 1,
size(val%aero_background)
1637 total_size = total_size &
1638 + pmc_mpi_pack_size_aero_dist(val%aero_background(i))
1652 character,
intent(inout) :: buffer(:)
1654 integer,
intent(inout) :: position
1659 integer :: prev_position, i
1661 prev_position = position
1674 val%aero_emission_rate_scale)
1679 call pmc_mpi_pack_chamber(buffer, position, val%chamber)
1680 if (
allocated(val%gas_emission_time))
then
1681 do i = 1,
size(val%gas_emission)
1682 call pmc_mpi_pack_gas_state(buffer, position, val%gas_emission(i))
1685 if (
allocated(val%gas_dilution_time))
then
1686 do i = 1,
size(val%gas_background)
1687 call pmc_mpi_pack_gas_state(buffer, position, val%gas_background(i))
1690 if (
allocated(val%aero_emission_time))
then
1691 do i = 1,
size(val%aero_emission)
1692 call pmc_mpi_pack_aero_dist(buffer, position, val%aero_emission(i))
1695 if (
allocated(val%aero_dilution_time))
then
1696 do i = 1,
size(val%aero_background)
1697 call pmc_mpi_pack_aero_dist(buffer, position, val%aero_background(i))
1712 character,
intent(inout) :: buffer(:)
1714 integer,
intent(inout) :: position
1719 integer :: prev_position, i
1721 prev_position = position
1730 val%gas_emission_rate_scale)
1735 val%aero_emission_rate_scale)
1740 call pmc_mpi_unpack_chamber(buffer, position, val%chamber)
1741 if (
allocated(val%gas_emission))
deallocate(val%gas_emission)
1742 if (
allocated(val%gas_background))
deallocate(val%gas_background)
1743 if (
allocated(val%aero_emission))
deallocate(val%aero_emission)
1744 if (
allocated(val%aero_background))
deallocate(val%aero_background)
1745 if (
allocated(val%gas_emission_time))
then
1746 allocate(val%gas_emission(
size(val%gas_emission_time)))
1747 do i = 1,
size(val%gas_emission)
1748 call pmc_mpi_unpack_gas_state(buffer, position, val%gas_emission(i))
1751 if (
allocated(val%gas_dilution_time))
then
1752 allocate(val%gas_background(
size(val%gas_dilution_time)))
1753 do i = 1,
size(val%gas_background)
1754 call pmc_mpi_unpack_gas_state(buffer, position, &
1755 val%gas_background(i))
1758 if (
allocated(val%aero_emission_time))
then
1759 allocate(val%aero_emission(
size(val%aero_emission_time)))
1760 do i = 1,
size(val%aero_emission)
1761 call pmc_mpi_unpack_aero_dist(buffer, position, val%aero_emission(i))
1764 if (
allocated(val%aero_dilution_time))
then
1765 allocate(val%aero_background(
size(val%aero_dilution_time)))
1766 do i = 1,
size(val%aero_background)
1767 call pmc_mpi_unpack_aero_dist(buffer, position, &
1768 val%aero_background(i))
1807 character,
intent(inout) :: buffer(:)
1809 integer,
intent(inout) :: position
1814 integer :: prev_position
1816 prev_position = position
1841 character,
intent(inout) :: buffer(:)
1843 integer,
intent(inout) :: position
1848 integer :: prev_position
1850 prev_position = position