23 use camp_util,
only: split_string
34 subroutine pmc_camp_interface_solve(camp_core, camp_state, &
35 camp_pre_aero_state, camp_post_aero_state, env_state, aero_data, &
36 aero_state, gas_data, gas_state, photolysis, del_t)
39 type(camp_core_t),
intent(in) :: camp_core
41 type(camp_state_t),
intent(inout) :: camp_state
43 type(camp_state_t),
intent(inout) :: camp_pre_aero_state
45 type(camp_state_t),
intent(inout) :: camp_post_aero_state
47 type(env_state_t),
intent(inout) :: env_state
49 type(aero_data_t),
intent(in) :: aero_data
51 type(aero_state_t),
intent(inout) :: aero_state
53 type(gas_data_t),
intent(in) :: gas_data
55 type(gas_state_t),
intent(inout) :: gas_state
57 type(photolysis_t),
intent(inout) :: photolysis
59 real(kind=
dp),
intent(in) :: del_t
62 real(kind=
dp) :: num_conc
63 integer :: camp_state_size
64 type(solver_stats_t),
target :: solver_stats
65 type(camp_state_t) :: camp_state_pre_aero
68 call env_state_set_camp_env_state(env_state, camp_state)
71 call gas_state_set_camp_conc(gas_state, camp_state, gas_data)
74 call photolysis%update_rate_constants()
77 call pmc_camp_interface_set_camp_aerosol(aero_data, aero_state, &
78 camp_core, camp_state)
81 aero_state%valid_sort = .false.
84 call camp_core%solve(camp_state, del_t, solver_stats = solver_stats)
86 call assert_msg(592148911, solver_stats%status_code == 0, &
87 "Solver failed for aerosol-phase with code "// &
88 integer_to_string(solver_stats%solver_flag))
91 call pmc_camp_interface_set_partmc_aerosol(aero_data, aero_state, &
95 call gas_state_get_camp_conc(gas_state, camp_state)
97 end subroutine pmc_camp_interface_solve
102 subroutine pmc_camp_interface_set_camp_aerosol(aero_data, aero_state, &
103 camp_core, camp_state)
106 type(aero_data_t),
intent(in) :: aero_data
108 type(aero_state_t),
intent(inout) :: aero_state
110 type(camp_core_t),
intent(in) :: camp_core
112 type(camp_state_t),
intent(inout) :: camp_state
114 real(kind=
dp) :: num_conc
115 integer :: i_part, i_spec
117 associate(aero_rep => aero_data%aero_rep_ptr)
118 select type (aero_rep)
119 type is (aero_rep_single_particle_t)
121 aero_rep%maximum_computational_particles(), &
122 "Exceeded CAMP maximum number of particles. Number "// &
123 "of computational particles: "// &
125 ". CAMP maximum: "// &
126 trim(integer_to_string( &
127 aero_rep%maximum_computational_particles())))
129 associate(part => aero_state%apa%particle(i_part))
130 num_conc = aero_weight_array_num_conc(aero_state%awa, part, &
132 call aero_state%update_number%set_number__n_m3(i_part, num_conc)
133 call camp_core%update_data(aero_state%update_number)
134 do i_spec = 1,
size(aero_data%camp_particle_spec_id)
135 camp_state%state_var(aero_data%camp_spec_id(i_part, i_spec)) &
136 = part%vol(i_spec) * aero_data%density(i_spec)
141 aero_rep%maximum_computational_particles()
142 call aero_state%update_number%set_number__n_m3(i_part, 0.0d0)
143 call camp_core%update_data(aero_state%update_number)
144 do i_spec = 1,
size(aero_data%camp_particle_spec_id)
145 camp_state%state_var(aero_data%camp_spec_id(i_part, i_spec)) &
151 "Wrong type for PartMC aerosol representation.")
155 end subroutine pmc_camp_interface_set_camp_aerosol
160 subroutine pmc_camp_interface_set_partmc_aerosol(aero_data, aero_state, &
164 type(aero_data_t),
intent (in) :: aero_data
166 type(aero_state_t),
intent(inout) :: aero_state
168 type(camp_state_t),
intent(in) :: camp_state
170 integer :: i_part, i_spec
172 associate(aero_rep => aero_data%aero_rep_ptr)
173 select type (aero_rep)
174 type is (aero_rep_single_particle_t)
175 call assert_msg(464490945, aero_state_n_part(aero_state) <= &
176 aero_rep%maximum_computational_particles(), &
177 "Exceeded CAMP maximum number of particles")
178 do i_part = 1, aero_state_n_part(aero_state)
179 associate(part => aero_state%apa%particle(i_part))
180 do i_spec = 1,
size(aero_data%camp_particle_spec_id)
182 camp_state%state_var(aero_data%camp_spec_id(i_part, i_spec)) &
183 / aero_data%density(i_spec)
189 "Wrong type for PartMC aerosol representation.")
193 end subroutine pmc_camp_interface_set_partmc_aerosol