diff --git a/scenarios/1_urban_plume/aero_data.dat b/scenarios/1_urban_plume/aero_data.dat index 43422f091..4a771ead8 100644 --- a/scenarios/1_urban_plume/aero_data.dat +++ b/scenarios/1_urban_plume/aero_data.dat @@ -1,21 +1,21 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -SO4 1800 0 96d-3 0.65 -NO3 1800 0 62d-3 0.65 -Cl 2200 0 35.5d-3 1.28 -NH4 1800 0 18d-3 0.65 -MSA 1800 0 95d-3 0.53 -ARO1 1400 0 150d-3 0.1 -ARO2 1400 0 150d-3 0.1 -ALK1 1400 0 140d-3 0.1 -OLE1 1400 0 140d-3 0.1 -API1 1400 0 184d-3 0.1 -API2 1400 0 184d-3 0.1 -LIM1 1400 0 200d-3 0.1 -LIM2 1400 0 200d-3 0.1 -CO3 2600 0 60d-3 0.53 -Na 2200 0 23d-3 1.28 -Ca 2600 0 40d-3 0.53 -OIN 2600 0 1d-3 0.1 -OC 1000 0 1d-3 0.001 -BC 1800 0 1d-3 0 -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) surface tension (J m^{-2}) +SO4 1800 0 96d-3 0.65 0.073 +NO3 1800 0 62d-3 0.65 0.073 +Cl 2200 0 35.5d-3 1.28 0.073 +NH4 1800 0 18d-3 0.65 0.073 +MSA 1800 0 95d-3 0.53 0.03 +ARO1 1400 0 150d-3 0.1 0.03 +ARO2 1400 0 150d-3 0.1 0.03 +ALK1 1400 0 140d-3 0.1 0.03 +OLE1 1400 0 140d-3 0.1 0.03 +API1 1400 0 184d-3 0.1 0.03 +API2 1400 0 184d-3 0.1 0.03 +LIM1 1400 0 200d-3 0.1 0.03 +LIM2 1400 0 200d-3 0.1 0.03 +CO3 2600 0 60d-3 0.53 0.073 +Na 2200 0 23d-3 1.28 0.073 +Ca 2600 0 40d-3 0.53 0.073 +OIN 2600 0 1d-3 0.1 0 +OC 1000 0 1d-3 0.001 0.03 +BC 1800 0 1d-3 0 0 +H2O 1000 0 18d-3 0 0.073 \ No newline at end of file diff --git a/scenarios/1_urban_plume/urban_plume_process.F90 b/scenarios/1_urban_plume/urban_plume_process.F90 index 6b5e9f03e..223b1330f 100644 --- a/scenarios/1_urban_plume/urban_plume_process.F90 +++ b/scenarios/1_urban_plume/urban_plume_process.F90 @@ -10,26 +10,99 @@ program process use pmc_output use pmc_stats + use pmc_aero_state + use pmc_aero_data + use pmc_env_state + use pmc_aero_particle + use pmc_aero_particle_array character(len=PMC_MAX_FILENAME_LEN), parameter :: prefix & = "out/urban_plume" - - character(len=PMC_MAX_FILENAME_LEN) :: in_filename, out_filename - type(bin_grid_t) :: diam_grid, bc_grid, sc_grid + character(len=PMC_MAX_FILENAME_LEN), parameter :: prefix_new & + = "out/single_particle" + + character(len=PMC_MAX_FILENAME_LEN) :: in_filename, out_filename, & + single_particle_output + type(bin_grid_t) :: diam_grid, bc_grid, oc_grid, sc_grid, & + sc_varying_sigma_grid, & + so4_grid, no3_grid, nh4_grid, soa_grid, & + cl_grid, msa_grid, aro1_grid, aro2_grid, & + alk1_grid, ole1_grid, api1_grid, api2_grid, & + lim1_grid, lim2_grid, co3_grid, na_grid, & + ca_grid, oin_grid, h2o_grid type(aero_data_t) :: aero_data + type(aero_particle_t) :: aero_particle type(aero_state_t) :: aero_state type(env_state_t) :: env_state integer :: ncid, index, repeat, i_index, i_repeat, n_index, n_repeat - real(kind=dp) :: time, del_t, tot_num_conc, tot_mass_conc + integer :: number + real(kind=dp) :: crit_diam + real(kind=dp) :: time, del_t, tot_num_conc, tot_mass_conc, & + tot_dry_mass_conc, tot_bc_mass_conc, tot_oc_mass_conc, & + tot_so4_mass_conc, tot_no3_mass_conc, tot_nh4_mass_conc, & + tot_soa_mass_conc, tot_cl_mass_conc, tot_msa_mass_conc, & + tot_aro1_mass_conc, tot_aro2_mass_conc, tot_alk1_mass_conc, & + tot_ole1_mass_conc, tot_api1_mass_conc, tot_api2_mass_conc, & + tot_lim1_mass_conc, tot_lim2_mass_conc, tot_co3_mass_conc, & + tot_na_mass_conc, tot_ca_mass_conc, tot_oin_mass_conc, & + tot_h2o_mass_conc real(kind=dp) :: d_alpha, d_gamma, chi character(len=PMC_UUID_LEN) :: uuid real(kind=dp), allocatable :: times(:), dry_diameters(:), num_concs(:), & dry_masses(:), masses(:), bc_masses(:), bc_fracs(:), & - crit_rhs(:), scs(:), num_dist(:), & - diam_bc_dist(:,:), diam_sc_dist(:,:) + diam_bc_dist(:,:), oc_masses(:), oc_fracs(:), diam_oc_dist(:,:), & + crit_rhs(:), scs(:), num_dist(:), diam_sc_dist(:,:), & + sc_dist(:), sc_varying_sigma_dist(:), & + crit_rhs_varying_sigma(:), scs_varying_sigma(:), & + diam_sc_varying_sigma_dist(:,:), & + so4_masses(:), so4_fracs(:), diam_so4_dist(:,:), & + no3_masses(:), no3_fracs(:), diam_no3_dist(:,:), & + nh4_masses(:), nh4_fracs(:), diam_nh4_dist(:,:), & + soa_masses(:), soa_fracs(:), diam_soa_dist(:,:), & + cl_masses(:), cl_fracs(:), diam_cl_dist(:,:), & + msa_masses(:), msa_fracs(:), diam_msa_dist(:,:), & + aro1_masses(:), aro1_fracs(:), diam_aro1_dist(:,:), & + aro2_masses(:), aro2_fracs(:), diam_aro2_dist(:,:), & + alk1_masses(:), alk1_fracs(:), diam_alk1_dist(:,:), & + ole1_masses(:), ole1_fracs(:), diam_ole1_dist(:,:), & + api1_masses(:), api1_fracs(:), diam_api1_dist(:,:), & + api2_masses(:), api2_fracs(:), diam_api2_dist(:,:), & + lim1_masses(:), lim1_fracs(:), diam_lim1_dist(:,:), & + lim2_masses(:), lim2_fracs(:), diam_lim2_dist(:,:), & + co3_masses(:), co3_fracs(:), diam_co3_dist(:,:), & + na_masses(:), na_fracs(:), diam_na_dist(:,:), & + ca_masses(:), ca_fracs(:), diam_ca_dist(:,:), & + oin_masses(:), oin_fracs(:), diam_oin_dist(:,:), & + h2o_masses(:), h2o_fracs(:), diam_h2o_dist(:,:) + type(stats_1d_t) :: stats_num_dist, stats_d_alpha, stats_tot_num_conc, & - stats_tot_mass_conc, stats_d_gamma, stats_chi - type(stats_2d_t) :: stats_diam_bc_dist, stats_diam_sc_dist + stats_tot_mass_conc, stats_d_gamma, stats_chi, & + stats_tot_bc_mass_conc, stats_tot_oc_mass_conc, & + stats_tot_so4_mass_conc, stats_tot_no3_mass_conc, & + stats_tot_nh4_mass_conc, stats_tot_dry_mass_conc, & + stats_tot_soa_mass_conc, stats_tot_cl_mass_conc, & + stats_tot_msa_mass_conc, stats_tot_aro1_mass_conc, & + stats_tot_aro2_mass_conc, stats_tot_alk1_mass_conc, & + stats_tot_ole1_mass_conc, stats_tot_api1_mass_conc, & + stats_tot_api2_mass_conc, stats_tot_lim1_mass_conc, & + stats_tot_lim2_mass_conc, stats_tot_co3_mass_conc, & + stats_tot_na_mass_conc, stats_tot_ca_mass_conc, & + stats_tot_oin_mass_conc, stats_tot_h2o_mass_conc, & + stats_sc_dist, stats_sc_varying_sigma_dist + + type(stats_2d_t) :: stats_diam_sc_dist, stats_diam_bc_dist, & + stats_diam_sc_varying_sigma_dist, & + stats_diam_oc_dist, stats_diam_so4_dist, & + stats_diam_no3_dist, stats_diam_nh4_dist, & + stats_diam_soa_dist, stats_diam_cl_dist, & + stats_diam_msa_dist, stats_diam_aro1_dist, & + stats_diam_aro2_dist, stats_diam_alk1_dist, & + stats_diam_ole1_dist, stats_diam_api1_dist, & + stats_diam_api2_dist, stats_diam_lim1_dist, & + stats_diam_lim2_dist, stats_diam_co3_dist, & + stats_diam_na_dist, stats_diam_oin_dist, & + stats_diam_ca_dist, stats_diam_h2o_dist + character(len=AERO_NAME_LEN), allocatable :: mixing_state_groups(:,:) call pmc_mpi_init() @@ -38,7 +111,28 @@ program process call bin_grid_make(diam_grid, BIN_GRID_TYPE_LOG, 180, 1d-9, 1d-3) call bin_grid_make(bc_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(oc_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(so4_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(no3_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(nh4_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(soa_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(cl_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(msa_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(aro1_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(aro2_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(alk1_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(ole1_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(api1_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(api2_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(lim1_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(lim2_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(co3_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(na_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(ca_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(oin_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) + call bin_grid_make(h2o_grid, BIN_GRID_TYPE_LINEAR, 50, 0d0, 1d0) call bin_grid_make(sc_grid, BIN_GRID_TYPE_LOG, 50, 1d-4, 1d0) + call bin_grid_make(sc_varying_sigma_grid, BIN_GRID_TYPE_LOG, 50, 1d-4, 1d0) allocate(times(n_index)) @@ -47,8 +141,29 @@ program process mixing_state_groups(2,:) = ["API1 ", "API2 ", "LIM1 ", "LIM2 "] mixing_state_groups(3,:) = ["SO4 ", "NO3 ", "NH4 ", " "] + scs = [ real(kind=dp) :: ] ! silence compiler warnings + scs_varying_sigma = [ real(kind=dp) :: ] bc_fracs = [ real(kind=dp) :: ] + oc_fracs = [ real(kind=dp) :: ] + so4_fracs = [ real(kind=dp) :: ] + no3_fracs = [ real(kind=dp) :: ] + nh4_fracs = [ real(kind=dp) :: ] + cl_fracs = [ real(kind=dp) :: ] + msa_fracs = [ real(kind=dp) :: ] + aro1_fracs = [ real(kind=dp) :: ] + aro2_fracs = [ real(kind=dp) :: ] + alk1_fracs = [ real(kind=dp) :: ] + ole1_fracs = [ real(kind=dp) :: ] + api1_fracs = [ real(kind=dp) :: ] + api2_fracs = [ real(kind=dp) :: ] + lim1_fracs = [ real(kind=dp) :: ] + lim2_fracs = [ real(kind=dp) :: ] + co3_fracs = [ real(kind=dp) :: ] + na_fracs = [ real(kind=dp) :: ] + ca_fracs = [ real(kind=dp) :: ] + oin_fracs = [ real(kind=dp) :: ] + h2o_fracs = [ real(kind=dp) :: ] do i_index = 1,n_index do i_repeat = 1,n_repeat @@ -73,24 +188,287 @@ program process masses = aero_state_masses(aero_state, aero_data) tot_mass_conc = sum(masses * num_concs) call stats_1d_add_entry(stats_tot_mass_conc, tot_mass_conc, i_index) - +!for dry mass dry_masses = aero_state_masses(aero_state, aero_data, & exclude=(/"H2O"/)) + tot_dry_mass_conc = sum(dry_masses * num_concs) + call stats_1d_add_entry(stats_tot_dry_mass_conc, tot_dry_mass_conc, i_index) +!for bc bc_masses = aero_state_masses(aero_state, aero_data, & include=(/"BC"/)) + tot_bc_mass_conc = sum(bc_masses * num_concs) + call stats_1d_add_entry(stats_tot_bc_mass_conc, tot_bc_mass_conc, i_index) + bc_fracs = bc_masses / dry_masses diam_bc_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & bc_grid, bc_fracs, num_concs) call stats_2d_add(stats_diam_bc_dist, diam_bc_dist) +!for OC + oc_masses = aero_state_masses(aero_state, aero_data, & + include=(/"OC"/)) + tot_oc_mass_conc = sum(oc_masses * num_concs) + call stats_1d_add_entry(stats_tot_oc_mass_conc, tot_oc_mass_conc, i_index) + + oc_fracs = oc_masses / dry_masses + diam_oc_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + oc_grid, oc_fracs, num_concs) + call stats_2d_add(stats_diam_oc_dist, diam_oc_dist) +!for SO4 + so4_masses = aero_state_masses(aero_state, aero_data, & + include=(/"SO4"/)) + tot_so4_mass_conc = sum(so4_masses * num_concs) + call stats_1d_add_entry(stats_tot_so4_mass_conc, tot_so4_mass_conc, i_index) + + so4_fracs = so4_masses / dry_masses + diam_so4_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + so4_grid, so4_fracs, num_concs) + call stats_2d_add(stats_diam_so4_dist, diam_so4_dist) +!for NO3 + no3_masses = aero_state_masses(aero_state, aero_data, & + include=(/"NO3"/)) + tot_no3_mass_conc = sum(no3_masses * num_concs) + call stats_1d_add_entry(stats_tot_no3_mass_conc, tot_no3_mass_conc, i_index) + + no3_fracs = no3_masses / dry_masses + diam_no3_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + no3_grid, no3_fracs, num_concs) + call stats_2d_add(stats_diam_no3_dist, diam_no3_dist) +!for NH4 + nh4_masses = aero_state_masses(aero_state, aero_data, & + include=(/"NH4"/)) + tot_nh4_mass_conc = sum(nh4_masses * num_concs) + call stats_1d_add_entry(stats_tot_nh4_mass_conc, tot_nh4_mass_conc, i_index) + + nh4_fracs = nh4_masses / dry_masses + diam_nh4_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + nh4_grid, nh4_fracs, num_concs) + call stats_2d_add(stats_diam_nh4_dist, diam_nh4_dist) +!for SOA + soa_masses = aero_state_masses(aero_state, aero_data, & + include=(/"ARO1", "ARO2", "ALK1", "OLE1", "API1", "API2", "LIM1", "LIM2"/)) + tot_soa_mass_conc = sum(soa_masses * num_concs) + call stats_1d_add_entry(stats_tot_soa_mass_conc, tot_soa_mass_conc, i_index) + + soa_fracs = soa_masses / dry_masses + diam_soa_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + soa_grid, soa_fracs, num_concs) + call stats_2d_add(stats_diam_soa_dist, diam_soa_dist) +!for Cl + cl_masses = aero_state_masses(aero_state, aero_data, & + include=(/"Cl"/)) + tot_cl_mass_conc = sum(cl_masses * num_concs) + call stats_1d_add_entry(stats_tot_cl_mass_conc, tot_cl_mass_conc, i_index) + + cl_fracs = cl_masses / dry_masses + diam_cl_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + cl_grid, cl_fracs, num_concs) + call stats_2d_add(stats_diam_cl_dist, diam_cl_dist) +!for MSA + msa_masses = aero_state_masses(aero_state, aero_data, & + include=(/"MSA"/)) + tot_msa_mass_conc = sum(msa_masses * num_concs) + call stats_1d_add_entry(stats_tot_msa_mass_conc, tot_msa_mass_conc, i_index) + + msa_fracs = msa_masses / dry_masses + diam_msa_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + msa_grid, msa_fracs, num_concs) + call stats_2d_add(stats_diam_msa_dist, diam_msa_dist) +!for aro1 + aro1_masses = aero_state_masses(aero_state, aero_data, & + include=(/"ARO1"/)) + tot_aro1_mass_conc = sum(aro1_masses * num_concs) + call stats_1d_add_entry(stats_tot_aro1_mass_conc, tot_aro1_mass_conc, i_index) + + aro1_fracs = aro1_masses / dry_masses + diam_aro1_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + aro1_grid, aro1_fracs, num_concs) + call stats_2d_add(stats_diam_aro1_dist, diam_aro1_dist) +!for aro2 + aro2_masses = aero_state_masses(aero_state, aero_data, & + include=(/"ARO2"/)) + tot_aro2_mass_conc = sum(aro2_masses * num_concs) + call stats_1d_add_entry(stats_tot_aro2_mass_conc, tot_aro2_mass_conc, i_index) + + aro2_fracs = aro2_masses / dry_masses + diam_aro2_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + aro2_grid, aro2_fracs, num_concs) + call stats_2d_add(stats_diam_aro2_dist, diam_aro2_dist) +!for alk1 + alk1_masses = aero_state_masses(aero_state, aero_data, & + include=(/"ALK1"/)) + tot_alk1_mass_conc = sum(alk1_masses * num_concs) + call stats_1d_add_entry(stats_tot_alk1_mass_conc, tot_alk1_mass_conc, i_index) + + alk1_fracs = alk1_masses / dry_masses + diam_alk1_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + alk1_grid, alk1_fracs, num_concs) + call stats_2d_add(stats_diam_alk1_dist, diam_alk1_dist) +!for ole1 + ole1_masses = aero_state_masses(aero_state, aero_data, & + include=(/"OLE1"/)) + tot_ole1_mass_conc = sum(ole1_masses * num_concs) + call stats_1d_add_entry(stats_tot_ole1_mass_conc, tot_ole1_mass_conc, i_index) + + ole1_fracs = ole1_masses / dry_masses + diam_ole1_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + ole1_grid, ole1_fracs, num_concs) + call stats_2d_add(stats_diam_ole1_dist, diam_ole1_dist) +!for ole1 + ole1_masses = aero_state_masses(aero_state, aero_data, & + include=(/"OLE1"/)) + tot_ole1_mass_conc = sum(ole1_masses * num_concs) + call stats_1d_add_entry(stats_tot_ole1_mass_conc, tot_ole1_mass_conc, i_index) + + ole1_fracs = ole1_masses / dry_masses + diam_ole1_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + ole1_grid, ole1_fracs, num_concs) + call stats_2d_add(stats_diam_ole1_dist, diam_ole1_dist) +!for api1 + api1_masses = aero_state_masses(aero_state, aero_data, & + include=(/"API1"/)) + tot_api1_mass_conc = sum(api1_masses * num_concs) + call stats_1d_add_entry(stats_tot_api1_mass_conc, tot_api1_mass_conc, i_index) + + api1_fracs = api1_masses / dry_masses + diam_api1_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + api1_grid, api1_fracs, num_concs) + call stats_2d_add(stats_diam_api1_dist, diam_api1_dist) +!for api2 + api2_masses = aero_state_masses(aero_state, aero_data, & + include=(/"API2"/)) + tot_api2_mass_conc = sum(api2_masses * num_concs) + call stats_1d_add_entry(stats_tot_api2_mass_conc, tot_api2_mass_conc, i_index) + + api2_fracs = api2_masses / dry_masses + diam_api2_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + api2_grid, api2_fracs, num_concs) + call stats_2d_add(stats_diam_api2_dist, diam_api2_dist) +!for lim1 + lim1_masses = aero_state_masses(aero_state, aero_data, & + include=(/"LIM1"/)) + tot_lim1_mass_conc = sum(lim1_masses * num_concs) + call stats_1d_add_entry(stats_tot_lim1_mass_conc, tot_lim1_mass_conc, i_index) + + lim1_fracs = lim1_masses / dry_masses + diam_lim1_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + lim1_grid, lim1_fracs, num_concs) + call stats_2d_add(stats_diam_lim1_dist, diam_lim1_dist) +!for lim2 + lim2_masses = aero_state_masses(aero_state, aero_data, & + include=(/"LIM2"/)) + tot_lim2_mass_conc = sum(lim2_masses * num_concs) + call stats_1d_add_entry(stats_tot_lim2_mass_conc, tot_lim2_mass_conc, i_index) + + lim2_fracs = lim2_masses / dry_masses + diam_lim2_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + lim2_grid, lim2_fracs, num_concs) + call stats_2d_add(stats_diam_lim2_dist, diam_lim2_dist) +!for co3 + co3_masses = aero_state_masses(aero_state, aero_data, & + include=(/"CO3"/)) + tot_co3_mass_conc = sum(co3_masses * num_concs) + call stats_1d_add_entry(stats_tot_co3_mass_conc, tot_co3_mass_conc, i_index) + + co3_fracs = co3_masses / dry_masses + diam_co3_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + co3_grid, co3_fracs, num_concs) + call stats_2d_add(stats_diam_co3_dist, diam_co3_dist) +!for na + na_masses = aero_state_masses(aero_state, aero_data, & + include=(/"Na"/)) + tot_na_mass_conc = sum(na_masses * num_concs) + call stats_1d_add_entry(stats_tot_na_mass_conc, tot_na_mass_conc, i_index) + + na_fracs = na_masses / dry_masses + diam_na_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + na_grid, na_fracs, num_concs) + call stats_2d_add(stats_diam_na_dist, diam_na_dist) +!for ca + ca_masses = aero_state_masses(aero_state, aero_data, & + include=(/"Ca"/)) + tot_ca_mass_conc = sum(ca_masses * num_concs) + call stats_1d_add_entry(stats_tot_ca_mass_conc, tot_ca_mass_conc, i_index) + + ca_fracs = ca_masses / dry_masses + diam_ca_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + ca_grid, ca_fracs, num_concs) + call stats_2d_add(stats_diam_ca_dist, diam_ca_dist) +!for oin + oin_masses = aero_state_masses(aero_state, aero_data, & + include=(/"OIN"/)) + tot_oin_mass_conc = sum(oin_masses * num_concs) + call stats_1d_add_entry(stats_tot_oin_mass_conc, tot_oin_mass_conc, i_index) + + oin_fracs = oin_masses / dry_masses + diam_oin_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + oin_grid, oin_fracs, num_concs) + call stats_2d_add(stats_diam_oin_dist, diam_oin_dist) +!for h2o + h2o_masses = aero_state_masses(aero_state, aero_data, & + include=(/"H2O"/)) + tot_h2o_mass_conc = sum(h2o_masses * num_concs) + call stats_1d_add_entry(stats_tot_h2o_mass_conc, tot_h2o_mass_conc, i_index) + + h2o_fracs = h2o_masses / dry_masses + diam_h2o_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + h2o_grid, h2o_fracs, num_concs) + call stats_2d_add(stats_diam_h2o_dist, diam_h2o_dist) +!for critical RH supersaturation crit_rhs = aero_state_crit_rel_humids(aero_state, aero_data, & env_state) scs = crit_rhs - 1d0 diam_sc_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & sc_grid, scs, num_concs) + sc_dist = bin_grid_histogram_1d(sc_grid, scs, num_concs) + call stats_1d_add(stats_sc_dist, sc_dist) call stats_2d_add(stats_diam_sc_dist, diam_sc_dist) - call aero_state_mixing_state_metrics(aero_state, aero_data, & +!for critical RH supersaturation with varying sigma + crit_rhs_varying_sigma = aero_state_crit_rel_humids_varying_sigma( & + aero_state, aero_data, env_state) + scs_varying_sigma = crit_rhs_varying_sigma - 1d0 + diam_sc_varying_sigma_dist = bin_grid_histogram_2d(diam_grid, dry_diameters, & + sc_varying_sigma_grid, scs_varying_sigma, num_concs) + sc_varying_sigma_dist = bin_grid_histogram_1d(sc_varying_sigma_grid, & + scs_varying_sigma, num_concs) + call stats_1d_add(stats_sc_varying_sigma_dist, sc_varying_sigma_dist) + call stats_2d_add(stats_diam_sc_varying_sigma_dist, diam_sc_varying_sigma_dist) + + call for_single_particle(single_particle_output, prefix_new, ".csv", index) + open(15, file= trim(single_particle_output)) + write(15, *) 'dry_diameters', dry_diameters + write(15, *) 'masses', masses + write(15, *) 'dry_masses', dry_masses + write(15, *) 'bc_masses', bc_masses + write(15, *) 'oc_masses', oc_masses + write(15, *) 'so4_masses', so4_masses + write(15, *) 'no3_masses', no3_masses + write(15, *) 'nh4_masses', nh4_masses + write(15, *) 'soa_masses', soa_masses + write(15, *) 'cl_masses', cl_masses + write(15, *) 'msa_masses', msa_masses + write(15, *) 'aro1_masses', aro1_masses + write(15, *) 'aro2_masses', aro2_masses + write(15, *) 'alk1_masses', alk1_masses + write(15, *) 'ole1_masses', ole1_masses + write(15, *) 'api1_masses', api1_masses + write(15, *) 'api2_masses', api2_masses + write(15, *) 'lim1_masses', lim1_masses + write(15, *) 'lim2_masses', lim2_masses + write(15, *) 'co3_masses', co3_masses + write(15, *) 'na_masses', na_masses + write(15, *) 'ca_masses', ca_masses + write(15, *) 'oin_masses', oin_masses + write(15, *) 'h2o_masses', h2o_masses + write(15, *) 'crit_rhs', crit_rhs + write(15, *) 'scs', scs + write(15, *) 'num_con', num_concs + write(15, *) 'crit_rhs_varying_sigma', crit_rhs_varying_sigma + write(15, *) 'scs_varying_sigma', scs_varying_sigma + close(15) + + call aero_state_mixing_state_metrics(aero_state, aero_data, & d_alpha, d_gamma, chi, groups=mixing_state_groups) call stats_1d_add_entry(stats_d_alpha, d_alpha, i_index) @@ -105,7 +483,29 @@ program process call pmc_nc_write_info(ncid, uuid, "1_urban_plume process") call bin_grid_output_netcdf(diam_grid, ncid, "diam", unit="m") call bin_grid_output_netcdf(bc_grid, ncid, "bc_frac", unit="1") + call bin_grid_output_netcdf(oc_grid, ncid, "oc_frac", unit="1") + call bin_grid_output_netcdf(so4_grid, ncid, "so4_frac", unit="1") + call bin_grid_output_netcdf(no3_grid, ncid, "no3_frac", unit="1") + call bin_grid_output_netcdf(nh4_grid, ncid, "nh4_frac", unit="1") + call bin_grid_output_netcdf(soa_grid, ncid, "soa_frac", unit="1") + call bin_grid_output_netcdf(cl_grid, ncid, "cl_frac", unit="1") + call bin_grid_output_netcdf(msa_grid, ncid, "msa_frac", unit="1") + call bin_grid_output_netcdf(aro1_grid, ncid, "aro1_frac", unit="1") + call bin_grid_output_netcdf(aro2_grid, ncid, "aro2_frac", unit="1") + call bin_grid_output_netcdf(alk1_grid, ncid, "alk1_frac", unit="1") + call bin_grid_output_netcdf(ole1_grid, ncid, "ole1_frac", unit="1") + call bin_grid_output_netcdf(api1_grid, ncid, "api1_frac", unit="1") + call bin_grid_output_netcdf(api2_grid, ncid, "api2_frac", unit="1") + call bin_grid_output_netcdf(lim1_grid, ncid, "lim1_frac", unit="1") + call bin_grid_output_netcdf(lim2_grid, ncid, "lim2_frac", unit="1") + call bin_grid_output_netcdf(co3_grid, ncid, "co3_frac", unit="1") + call bin_grid_output_netcdf(na_grid, ncid, "na_frac", unit="1") + call bin_grid_output_netcdf(ca_grid, ncid, "ca_frac", unit="1") + call bin_grid_output_netcdf(oin_grid, ncid, "oin_frac", unit="1") + call bin_grid_output_netcdf(h2o_grid, ncid, "h2o_frac", unit="1") call bin_grid_output_netcdf(sc_grid, ncid, "sc", unit="1") + call bin_grid_output_netcdf(sc_varying_sigma_grid, ncid, & + "sc_varying_sigma", unit="1") call stats_1d_output_netcdf(stats_num_dist, ncid, "num_dist", & dim_name="diam", unit="m^{-3}") @@ -115,10 +515,103 @@ program process dim_name_1="diam", dim_name_2="bc_frac", unit="m^{-3}") call stats_2d_clear(stats_diam_bc_dist) + call stats_2d_output_netcdf(stats_diam_oc_dist, ncid, "diam_oc_dist", & + dim_name_1="diam", dim_name_2="oc_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_oc_dist) + + call stats_2d_output_netcdf(stats_diam_so4_dist, ncid, "diam_so4_dist", & + dim_name_1="diam", dim_name_2="so4_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_so4_dist) + + call stats_2d_output_netcdf(stats_diam_no3_dist, ncid, "diam_no3_dist", & + dim_name_1="diam", dim_name_2="no3_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_no3_dist) + + call stats_2d_output_netcdf(stats_diam_nh4_dist, ncid, "diam_nh4_dist", & + dim_name_1="diam", dim_name_2="nh4_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_nh4_dist) + + call stats_2d_output_netcdf(stats_diam_soa_dist, ncid, "diam_soa_dist", & + dim_name_1="diam", dim_name_2="soa_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_soa_dist) + + call stats_2d_output_netcdf(stats_diam_cl_dist, ncid, "diam_cl_dist", & + dim_name_1="diam", dim_name_2="cl_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_cl_dist) + + call stats_2d_output_netcdf(stats_diam_msa_dist, ncid, "diam_msa_dist", & + dim_name_1="diam", dim_name_2="msa_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_cl_dist) + + call stats_2d_output_netcdf(stats_diam_aro1_dist, ncid, "diam_aro1_dist", & + dim_name_1="diam", dim_name_2="aro1_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_aro1_dist) + + call stats_2d_output_netcdf(stats_diam_aro2_dist, ncid, "diam_aro2_dist", & + dim_name_1="diam", dim_name_2="aro2_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_aro2_dist) + + call stats_2d_output_netcdf(stats_diam_alk1_dist, ncid, "diam_alk1_dist", & + dim_name_1="diam", dim_name_2="alk1_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_alk1_dist) + + call stats_2d_output_netcdf(stats_diam_ole1_dist, ncid, "diam_ole1_dist", & + dim_name_1="diam", dim_name_2="ole1_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_ole1_dist) + + call stats_2d_output_netcdf(stats_diam_api1_dist, ncid, "diam_api1_dist", & + dim_name_1="diam", dim_name_2="api1_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_api1_dist) + + call stats_2d_output_netcdf(stats_diam_api2_dist, ncid, "diam_api2_dist", & + dim_name_1="diam", dim_name_2="api2_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_api2_dist) + + call stats_2d_output_netcdf(stats_diam_lim1_dist, ncid, "diam_lim1_dist", & + dim_name_1="diam", dim_name_2="lim1_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_lim1_dist) + + call stats_2d_output_netcdf(stats_diam_lim2_dist, ncid, "diam_lim2_dist", & + dim_name_1="diam", dim_name_2="lim2_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_lim2_dist) + + call stats_2d_output_netcdf(stats_diam_co3_dist, ncid, "diam_co3_dist", & + dim_name_1="diam", dim_name_2="co3_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_co3_dist) + + call stats_2d_output_netcdf(stats_diam_na_dist, ncid, "diam_na_dist", & + dim_name_1="diam", dim_name_2="na_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_na_dist) + + call stats_2d_output_netcdf(stats_diam_ca_dist, ncid, "diam_ca_dist", & + dim_name_1="diam", dim_name_2="ca_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_ca_dist) + + call stats_2d_output_netcdf(stats_diam_oin_dist, ncid, "diam_oin_dist", & + dim_name_1="diam", dim_name_2="oin_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_oin_dist) + + call stats_2d_output_netcdf(stats_diam_h2o_dist, ncid, "diam_h2o_dist", & + dim_name_1="diam", dim_name_2="h2o_frac", unit="m^{-3}") + call stats_2d_clear(stats_diam_h2o_dist) + call stats_2d_output_netcdf(stats_diam_sc_dist, ncid, "diam_sc_dist", & - dim_name_1="diam", dim_name_2="sc", unit="m^{-3}") + dim_name_1="diam", dim_name_2="sc", unit="m^{-3}") call stats_2d_clear(stats_diam_sc_dist) + call stats_2d_output_netcdf(stats_diam_sc_varying_sigma_dist, ncid, & + "diam_sc_varying_sigma_dist", & + dim_name_1="diam", dim_name_2="sc_varying_sigma", unit="m^{-3}") + call stats_2d_clear(stats_diam_sc_varying_sigma_dist) + + call stats_1d_output_netcdf(stats_sc_dist, ncid, "sc_dist", & + dim_name="sc", unit="C") + call stats_1d_clear(stats_sc_dist) + + call stats_1d_output_netcdf(stats_sc_varying_sigma_dist, ncid, "sc_varying_sigma_dist", & + dim_name="sc", unit="C") + call stats_1d_clear(stats_sc_varying_sigma_dist) + call pmc_nc_close(ncid) end do @@ -131,6 +624,50 @@ program process dim_name="time", unit="m^{-3}") call stats_1d_output_netcdf(stats_tot_mass_conc, ncid, "tot_mass_conc", & dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_dry_mass_conc, ncid, "tot_dry_mass_conc",& + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_bc_mass_conc, ncid, "tot_bc_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_oc_mass_conc, ncid, "tot_oc_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_so4_mass_conc, ncid, "tot_so4_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_no3_mass_conc, ncid, "tot_no3_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_nh4_mass_conc, ncid, "tot_nh4_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_soa_mass_conc, ncid, "tot_soa_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_cl_mass_conc, ncid, "tot_cl_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_msa_mass_conc, ncid, "tot_msa_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_aro1_mass_conc, ncid, "tot_aro1_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_aro2_mass_conc, ncid, "tot_aro2_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_alk1_mass_conc, ncid, "tot_alk1_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_ole1_mass_conc, ncid, "tot_ole1_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_api1_mass_conc, ncid, "tot_api1_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_api2_mass_conc, ncid, "tot_api2_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_lim1_mass_conc, ncid, "tot_lim1_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_lim2_mass_conc, ncid, "tot_lim2_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_co3_mass_conc, ncid, "tot_co3_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_na_mass_conc, ncid, "tot_na_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_ca_mass_conc, ncid, "tot_ca_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_oin_mass_conc, ncid, "tot_oin_mass_conc", & + dim_name="time", unit="kg m^{-3}") + call stats_1d_output_netcdf(stats_tot_h2o_mass_conc, ncid, "tot_h2o_mass_conc", & + dim_name="time", unit="kg m^{-3}") call stats_1d_output_netcdf(stats_d_alpha, ncid, "d_alpha", & dim_name="time", unit="1") call stats_1d_output_netcdf(stats_d_gamma, ncid, & diff --git a/src/aero_data.F90 b/src/aero_data.F90 index 223271495..cc806a369 100644 --- a/src/aero_data.F90 +++ b/src/aero_data.F90 @@ -62,6 +62,8 @@ module pmc_aero_data real(kind=dp), allocatable :: molec_weight(:) !> Length \c aero_data_n_spec(aero_data), kappas (1). real(kind=dp), allocatable :: kappa(:) + !> Length \c aero_data_n_spec(aero_data), sigma (J m-2). + real(kind=dp), allocatable :: sigma(:) !> Length \c aero_data_n_source(aero_data), source names. character(len=AERO_SOURCE_NAME_LEN), allocatable :: source_name(:) !> Fractal particle parameters. @@ -430,9 +432,9 @@ subroutine spec_file_read_aero_data(file, aero_data) ! check the data size n_species = size(species_data, 1) - if (.not. ((size(species_data, 2) == 4) .or. (n_species == 0))) then + if (.not. ((size(species_data, 2) == 5) .or. (n_species == 0))) then call die_msg(428926381, 'each line in ' // trim(file%name) & - // ' should contain exactly 5 values') + // ' should contain exactly 6 values') end if ! allocate and copy over the data @@ -442,12 +444,14 @@ subroutine spec_file_read_aero_data(file, aero_data) call ensure_integer_array_size(aero_data%num_ions, n_species) call ensure_real_array_size(aero_data%molec_weight, n_species) call ensure_real_array_size(aero_data%kappa, n_species) + call ensure_real_array_size(aero_data%sigma, n_species) do i = 1,n_species aero_data%name(i) = species_name(i)(1:AERO_NAME_LEN) aero_data%density(i) = species_data(i,1) aero_data%num_ions(i) = nint(species_data(i,2)) aero_data%molec_weight(i) = species_data(i,3) aero_data%kappa(i) = species_data(i,4) + aero_data%sigma(i) = species_data(i,5) call assert_msg(232362742, & (aero_data%num_ions(i) == 0) .or. (aero_data%kappa(i) == 0d0), & "ions and kappa both non-zero for species " & @@ -519,6 +523,7 @@ integer function pmc_mpi_pack_size_aero_data(val) + pmc_mpi_pack_size_integer_array(val%num_ions) & + pmc_mpi_pack_size_real_array(val%molec_weight) & + pmc_mpi_pack_size_real_array(val%kappa) & + + pmc_mpi_pack_size_real_array(val%sigma) & + pmc_mpi_pack_size_string_array(val%source_name) & + pmc_mpi_pack_size_fractal(val%fractal) @@ -547,6 +552,7 @@ subroutine pmc_mpi_pack_aero_data(buffer, position, val) call pmc_mpi_pack_integer_array(buffer, position, val%num_ions) call pmc_mpi_pack_real_array(buffer, position, val%molec_weight) call pmc_mpi_pack_real_array(buffer, position, val%kappa) + call pmc_mpi_pack_real_array(buffer, position, val%sigma) call pmc_mpi_pack_string_array(buffer, position, val%source_name) call pmc_mpi_pack_fractal(buffer, position, val%fractal) call assert(183834856, & @@ -578,6 +584,7 @@ subroutine pmc_mpi_unpack_aero_data(buffer, position, val) call pmc_mpi_unpack_integer_array(buffer, position, val%num_ions) call pmc_mpi_unpack_real_array(buffer, position, val%molec_weight) call pmc_mpi_unpack_real_array(buffer, position, val%kappa) + call pmc_mpi_unpack_real_array(buffer, position, val%sigma) call pmc_mpi_unpack_string_array(buffer, position, val%source_name) call pmc_mpi_unpack_fractal(buffer, position, val%fractal) call assert(188522823, & @@ -760,6 +767,9 @@ subroutine aero_data_output_netcdf(aero_data, ncid) call pmc_nc_write_real_1d(ncid, aero_data%kappa, & "aero_kappa", (/ dimid_aero_species /), unit="1", & long_name="hygroscopicity parameters (kappas) of aerosol species") + call pmc_nc_write_real_1d(ncid, aero_data%sigma, & + "aero_sigma", (/ dimid_aero_species /), unit="J/m2", & + long_name="surface tension (sigma) of aerosol species") call fractal_output_netcdf(aero_data%fractal, ncid) end subroutine aero_data_output_netcdf @@ -801,6 +811,7 @@ subroutine aero_data_input_netcdf(aero_data, ncid) call pmc_nc_read_integer_1d(ncid, aero_data%num_ions, "aero_num_ions") call pmc_nc_read_real_1d(ncid, aero_data%molec_weight, "aero_molec_weight") call pmc_nc_read_real_1d(ncid, aero_data%kappa, "aero_kappa") + call pmc_nc_read_real_1d(ncid, aero_data%sigma, "aero_sigma") call pmc_nc_check(nf90_inq_varid(ncid, "aero_species", & varid_aero_species)) @@ -899,6 +910,7 @@ subroutine aero_data_initialize(aero_data, camp_core) allocate(aero_data%num_ions(num_spec)) allocate(aero_data%molec_weight(num_spec)) allocate(aero_data%kappa(num_spec)) + allocate(aero_data%sigma(num_spec)) allocate(aero_data%camp_particle_spec_id(num_spec)) ! Assume no aerosol water @@ -936,6 +948,12 @@ subroutine aero_data_initialize(aero_data, camp_core) call die_msg(944207343, "Missing kappa for aerosol species " & // spec_names(i_spec)%string) end if + prop_name = "sigma" + if (.not. property_set%get_real(prop_name, & + aero_data%sigma(i_spec))) then + call die_msg(944207343, "Missing sigma for aerosol species " & + // spec_names(i_spec)%string) + end if prop_name = "PartMC name" if (property_set%get_string(prop_name, str_val)) then if (str_val == "H2O") then diff --git a/src/aero_particle.F90 b/src/aero_particle.F90 index 41618c9a6..51cec694d 100644 --- a/src/aero_particle.F90 +++ b/src/aero_particle.F90 @@ -13,6 +13,7 @@ module pmc_aero_particle use pmc_spec_file use pmc_env_state use pmc_mpi + use pmc_constants #ifdef PMC_USE_MPI use mpi #endif @@ -285,7 +286,6 @@ elemental real(kind=dp) function aero_particle_species_volume( & aero_particle_species_volume = aero_particle%vol(i_spec) end function aero_particle_species_volume - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !> Total dry volume of the particle (m^3). @@ -293,7 +293,7 @@ elemental real(kind=dp) function aero_particle_dry_volume(aero_particle, & aero_data) !> Particle. - type(aero_particle_t), intent(in) :: aero_particle + type(aero_particle_t), intent(in) :: aero_particle !> Aerosol data. type(aero_data_t), intent(in) :: aero_data @@ -718,8 +718,9 @@ real(kind=dp) function aero_particle_approx_crit_rel_humid(aero_particle, & real(kind=dp) :: kappa, diam, C, A + A = env_state_A(env_state) kappa = aero_particle_solute_kappa(aero_particle, aero_data) - C = sqrt(4d0 * env_state_A(env_state)**3 / 27d0) + C = sqrt(4d0 * (A * const%water_surf_eng)**3 / 27d0) diam = aero_particle_diameter(aero_particle, aero_data) aero_particle_approx_crit_rel_humid = C / sqrt(kappa * diam**3) + 1d0 @@ -746,14 +747,43 @@ real(kind=dp) function aero_particle_crit_rel_humid(aero_particle, & env_state) kappa = aero_particle_solute_kappa(aero_particle, aero_data) if (kappa < 1d-30) then - aero_particle_crit_rel_humid = exp(A / crit_diam) + aero_particle_crit_rel_humid = exp(A * const%water_surf_eng / crit_diam) else aero_particle_crit_rel_humid = (crit_diam**3 - dry_diam**3) & - / (crit_diam**3 - dry_diam**3 * (1 - kappa)) * exp(A / crit_diam) + / (crit_diam**3 - dry_diam**3 * (1 - kappa)) * exp(A * & + const%water_surf_eng / crit_diam) end if end function aero_particle_crit_rel_humid +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! > Returns the critical relative humidity (1). + real(kind=dp) function aero_particle_crit_rel_humid_varying_sigma(aero_particle, & + aero_data, env_state) + + !> Aerosol particle. + type(aero_particle_t), intent(in) :: aero_particle + !> Aerosol data. + type(aero_data_t), intent(in) :: aero_data + !> Environment state. + type(env_state_t), intent(in) :: env_state + + real(kind=dp) :: A, dry_diam, kappa, d, sigma + + A = env_state_A(env_state) + dry_diam = aero_particle_dry_diameter(aero_particle, aero_data) + kappa = aero_particle_solute_kappa(aero_particle, aero_data) + d = aero_particle_crit_diameter_varying_sigma(aero_particle, aero_data, env_state, sigma) + + if (d == dry_diam) then + aero_particle_crit_rel_humid_varying_sigma = exp(A * sigma / dry_diam) + else + aero_particle_crit_rel_humid_varying_sigma = (d**3 - dry_diam**3) / & + (d**3 - dry_diam**3 * (1d0 - kappa)) * exp(A * sigma / d) + end if + + end function aero_particle_crit_rel_humid_varying_sigma !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !> Returns the critical diameter (m). @@ -819,7 +849,7 @@ real(kind=dp) function aero_particle_crit_diameter(aero_particle, & return end if - c4 = - 3d0 * dry_diam**3 * kappa / A + c4 = - 3d0 * dry_diam**3 * kappa / (A * const%water_surf_eng) c3 = - dry_diam**3 * (2d0 - kappa) c0 = dry_diam**6 * (1d0 - kappa) @@ -835,13 +865,262 @@ real(kind=dp) function aero_particle_crit_diameter(aero_particle, & end if end do call warn_assert_msg(408545686, i_newton < CRIT_DIAM_MAX_ITER, & - "critical diameter Newton loop failed to converge") + "critical diameter of old Newton loop failed to converge") call warn_assert_msg(353290871, d >= dry_diam, & - "critical diameter Newton loop converged to invalid solution") + "critical diameter of old Newton loop converged to invalid solution") aero_particle_crit_diameter = d end function aero_particle_crit_diameter + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! > Returns the critical diameter (m) for varying simga. + real(kind=dp) function aero_particle_crit_diameter_varying_sigma(& + aero_particle, aero_data, env_state, sigma) + + !> Aerosol particle. + type(aero_particle_t), intent(in) :: aero_particle + !> Aerosol data. + type(aero_data_t), intent(in) :: aero_data + !> Environment state. + type(env_state_t), intent(in) :: env_state + + real(kind=dp), intent(out) :: sigma + + integer, parameter :: CRIT_DIAM_MAX_ITER = 100 + integer :: i_newton + real(kind=dp) :: delta_min = 1.6d-10 + real(kind=dp) :: kappa, dry_diam, A, T + real(kind=dp) :: sigma_soluble, sigma_organic + real(kind=dp) :: v_solid, v_sol, v_org, r_solid + real(kind=dp) :: d, v_delta_solid, r_core, v_delta, d_v_delta + real(kind=dp) :: d_sigma, d_2_sigma, R, d_R, f, df, dd + real(kind=dp) :: c_1, c_2, c_3, c_4, c_5 + + A = env_state_A(env_state) + T = env_state%temp + kappa = aero_particle_solute_kappa(aero_particle, aero_data) + dry_diam = aero_particle_dry_diameter(aero_particle, aero_data) + sigma_organic = aero_particle_sigma_organic(aero_particle, aero_data) + v_solid = aero_particle_solid_volume(aero_particle, aero_data) + v_org = aero_particle_organic_volume(aero_particle, aero_data) + + if (kappa < 1d-30) then + ! bail out early for hydrophobic particles + aero_particle_crit_diameter_varying_sigma = dry_diam + return + end if + + c_1 = 3d0 * dry_diam**3 * kappa / A + c_2= (2d0 - kappa) * dry_diam**3 + c_3 = (1d0 - kappa) * dry_diam**6 + c_4 = 2d0 * const%pi * delta_min ! d_2_v_delta_d + + d = 50*sqrt(4d0 / 3d0 * c_1) + + if (v_solid == 0d0) then + do i_newton = 1, CRIT_DIAM_MAX_ITER + sigma_soluble = aero_particle_sigma_soluble(aero_particle, aero_data, env_state, d) + c_5 = v_org * (sigma_organic - sigma_soluble) + v_sol = const%pi * d**3 / 6d0 - v_org ! volume of soluble inorganics + water + r_core = ((3d0 * v_sol)/(4d0 * const%pi))**(1d0 / 3d0) + v_delta = (4d0 * const%pi / 3d0) * ((r_core + delta_min)**3 - (r_core)**3) + if (v_org > v_delta) then + sigma = sigma_organic + f = d**6 - c_1 * d**4 / sigma - c_2 * d**3 + c_3 + df = 6d0 * d**5 - 4d0 * c_1 * d**3 / sigma - 3d0 * c_2 * d**2 + else + if (v_org == 0) then + sigma = sigma_soluble + f = d**6 - c_1 * d**4 / sigma - c_2 * d**3 + c_3 + df = 6d0 * d**5 - 4d0 * c_1 * d**3 / sigma - 3d0 * c_2 * d**2 + else + sigma = sigma_soluble + c_5 / v_delta + d_sigma = - c_5 * d_v_delta / v_delta**2 + d_v_delta = 2d0 * const%pi * delta_min * (d - delta_min) + d_sigma = - c_5 * d_v_delta / v_delta**2 + R = sigma - d * d_sigma + d_2_sigma = (c_5 / v_delta**3) * (2d0 * d_v_delta**2 - v_delta * c_4) + d_R = - d * d_2_sigma + f = R * (d**6 - c_2 * d**3 + c_3) - c_1 * d**4 + df = d_R * (d**6 - c_2 * d**3 + c_3) + R * (6d0 * d**5 - 3d0 * c_2 * d**2) & + - 4d0 * c_1 * d**3 + end if + end if + dd = f / df + d = d - dd + if (abs(dd / d) < 1d-11) then + exit + end if + end do + else + r_solid = ((3d0 * v_solid) / (4d0 * const%pi))**(1d0 / 3d0) + v_delta_solid = (4d0 * const%pi / 3d0) * ((r_solid + delta_min)**3 - (r_solid)**3) + do i_newton = 1, CRIT_DIAM_MAX_ITER + sigma_soluble = aero_particle_sigma_soluble(aero_particle, aero_data, env_state, d) + c_5 = v_org * (sigma_organic - sigma_soluble) + v_sol = const%pi * d**3 / 6 - v_solid - v_org + if (v_sol + v_org > v_delta_solid) then + r_core = ((3d0 * (v_sol + v_solid))/(4 * const%pi))**(1d0 / 3d0) + v_delta = (4d0 * const%pi / 3d0) * ((r_core + delta_min)**3 - (r_core)**3) + if (v_org > v_delta) then + sigma = sigma_organic + f = d**6 - c_1 * d**4 / sigma - c_2 * d**3 + c_3 + df = 6d0 * d**5 - 4d0 * c_1 * d**3 / sigma - 3d0 * c_2 * d**2 + else + if (v_org == 0) then + sigma = sigma_soluble + f = d**6 - c_1 * d**4 / sigma - c_2 * d**3 + c_3 + df = 6d0 * d**5 - 4d0 * c_1 * d**3 / sigma - 3d0 * c_2 * d**2 + else + sigma = sigma_soluble + c_5 / v_delta + d_sigma = - c_5 * d_v_delta / v_delta**2 + d_v_delta = 2d0 * const%pi * delta_min * (d - delta_min) + d_sigma = - c_5 * d_v_delta / v_delta**2 + R = sigma - d * d_sigma + d_2_sigma = (c_5 / v_delta**3) * (2d0 * d_v_delta**2 - v_delta * c_4) + d_R = - d * d_2_sigma + f = R * (d**6 - c_2 * d**3 + c_3) - c_1 * d**4 + df = d_R * (d**6 - c_2 * d**3 + c_3) + R * (6d0 * d**5 - 3d0 * c_2 * d**2) & + - 4d0 * c_1 * d**3 + end if + end if + dd = f / df + d = d - dd + if (abs(dd / d) < 1d-11) then + exit + end if + else + sigma = (v_org * sigma_organic + v_sol * sigma_soluble) / v_delta_solid + d = dry_diam + exit + end if + end do + end if + + call warn_assert_msg(408545686, i_newton < CRIT_DIAM_MAX_ITER, & + "critical diameter for new Newton loop failed to converge") + call warn_assert_msg(353290871, d >= dry_diam, & + "critical diameter for new Newton loop converged to invalid solution") + aero_particle_crit_diameter_varying_sigma = d + + end function aero_particle_crit_diameter_varying_sigma +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + !> Organic volume of a single species in the particle (m^3). + real(kind=dp) function aero_particle_organic_volume(aero_particle, aero_data) + + !> Particle. + type(aero_particle_t), intent(in) :: aero_particle + !> Aerosol data. + type(aero_data_t), intent(in) :: aero_data + integer :: i_org_spec, n_org_spec + character(len=AERO_NAME_LEN), parameter, dimension(10) :: & + org_spec = ["MSA ", "ARO1 ", "ARO2 ", "ALK1 ", "OLE1 ", & + "API1 ", "API2 ", "LIM1 ", "LIM2 ", "OC "] + + aero_particle_organic_volume = 0d0 + + do n_org_spec = 1, size(org_spec) + i_org_spec = aero_data_spec_by_name(aero_data, org_spec(n_org_spec)) + aero_particle_organic_volume = aero_particle_organic_volume & + + aero_particle%vol(i_org_spec) + end do + + end function aero_particle_organic_volume +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + ! > soluble inrganic volume of a single species in the particle (m^3). + real(kind=dp) function aero_particle_solid_volume(aero_particle, aero_data) + + !> Particle. + type(aero_particle_t), intent(in) :: aero_particle + !> Aerosol data.ls + type(aero_data_t), intent(in) :: aero_data + integer :: i_solid_spec, n_solid_spec + character(len=AERO_NAME_LEN), parameter, dimension(2) :: & + solid_spec = ["OIN ", "BC "] + + aero_particle_solid_volume = 0d0 + + do n_solid_spec = 1, size(solid_spec) + i_solid_spec = aero_data_spec_by_name(aero_data, solid_spec(n_solid_spec)) + aero_particle_solid_volume = aero_particle_solid_volume & + + aero_particle%vol(i_solid_spec) + end do + + end function aero_particle_solid_volume +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + !> Returns the sigma of sol. + real(kind=dp) function aero_particle_sigma_soluble(aero_particle, & + aero_data, env_state, d) + + !> Aerosol particle. + type(aero_particle_t), intent(in) :: aero_particle + !> Aerosol data. + type(aero_data_t), intent(in) :: aero_data + !> Environment state. + type(env_state_t), intent(in) :: env_state + + integer :: i_sol_spec, n_sol_spec + real(kind=dp) :: d, aero_particle_soluble_volume + real(kind=dp) :: v_solid, v_org, v_sol, v_water + character(len=AERO_NAME_LEN), parameter, dimension(7) :: & + sol_spec = ["SO4 ", "NO3 ", "Cl ", "NH4 ", "CO3 ", & + "Na ", "Ca "] + + v_solid = aero_particle_solid_volume(aero_particle, aero_data) + v_org = aero_particle_organic_volume(aero_particle, aero_data) + + aero_particle_soluble_volume = 0d0 + + do n_sol_spec = 1, size(sol_spec) + i_sol_spec = aero_data_spec_by_name(aero_data, sol_spec(n_sol_spec)) + aero_particle_soluble_volume = aero_particle_soluble_volume & + + aero_particle%vol(i_sol_spec) + end do + + v_sol = d**3 * const%pi / 6 - v_solid - v_org + v_water = v_sol - aero_particle_soluble_volume + + aero_particle_sigma_soluble = 0d0 + do n_sol_spec = 1, size(sol_spec) + i_sol_spec = aero_data_spec_by_name(aero_data, sol_spec(n_sol_spec)) + aero_particle_sigma_soluble = aero_particle_sigma_soluble & + + aero_particle%vol(i_sol_spec) * & + aero_data%sigma(i_sol_spec) / v_sol + end do + aero_particle_sigma_soluble = aero_particle_sigma_soluble + v_water & + * const%water_surf_eng / v_sol + + end function aero_particle_sigma_soluble + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + !> Returns the sigma of shell + real(kind=dp) function aero_particle_sigma_organic(aero_particle, aero_data) + + !> Aerosol particle. + type(aero_particle_t), intent(in) :: aero_particle + !> Aerosol data. + type(aero_data_t), intent(in) :: aero_data + real(kind=dp) :: org_volume + integer :: i_org_spec, n_org_spec + character(len=AERO_NAME_LEN), parameter, dimension(10) :: & + org_spec = ["MSA ", "ARO1 ", "ARO2 ", "ALK1 ", "OLE1 ", & + "API1 ", "API2 ", "LIM1 ", "LIM2 ", "OC "] + + org_volume = aero_particle_organic_volume(aero_particle, aero_data) + aero_particle_sigma_organic = 0d0 + + do n_org_spec = 1, size(org_spec) + i_org_spec = aero_data_spec_by_name(aero_data, org_spec(n_org_spec)) + aero_particle_sigma_organic = aero_particle_sigma_organic + aero_particle%vol(i_org_spec) * & + aero_data%sigma(i_org_spec) / org_volume + end do + + end function aero_particle_sigma_organic !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !> Coagulate two particles together to make a new one. The new diff --git a/src/aero_state.F90 b/src/aero_state.F90 index 77254bb94..6b6e3cae4 100644 --- a/src/aero_state.F90 +++ b/src/aero_state.F90 @@ -1478,7 +1478,7 @@ end function aero_state_approx_crit_rel_humids !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !> Returns the critical relative humidity for all particles (1). +! !> Returns the critical relative humidity for all particles (1). function aero_state_crit_rel_humids(aero_state, aero_data, env_state) !> Aerosol state. @@ -1500,6 +1500,31 @@ function aero_state_crit_rel_humids(aero_state, aero_data, env_state) end function aero_state_crit_rel_humids +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + !> Returns the critical relative humidity for all particles (1). + function aero_state_crit_rel_humids_varying_sigma(aero_state, aero_data, env_state) + + !> Aerosol state. + type(aero_state_t), intent(in) :: aero_state + !> Aerosol data. + type(aero_data_t), intent(in) :: aero_data + !> Environment state. + type(env_state_t), intent(in) :: env_state + + !> Return value. + real(kind=dp) :: aero_state_crit_rel_humids_varying_sigma(aero_state_n_part(aero_state)) + + integer :: i_part + + do i_part = 1,aero_state_n_part(aero_state) + aero_state_crit_rel_humids_varying_sigma(i_part) = & + aero_particle_crit_rel_humid_varying_sigma( & + aero_state%apa%particle(i_part), aero_data, env_state) + end do + + end function aero_state_crit_rel_humids_varying_sigma + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !> Does the same thing as aero_state_to_bin() but based on dry radius. diff --git a/src/env_state.F90 b/src/env_state.F90 index 682ed32ae..983fdd823 100644 --- a/src/env_state.F90 +++ b/src/env_state.F90 @@ -174,20 +174,19 @@ real(kind=dp) function env_state_air_molar_den(env_state) end function env_state_air_molar_den !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - !> Condensation \f$A\f$ parameter. + ! constant sigma + ! !> Condensation \f$A\f$ parameter. real(kind=dp) function env_state_A(env_state) !> Environment state. type(env_state_t), intent(in) :: env_state - env_state_A = 4d0 * const%water_surf_eng * const%water_molec_weight & + env_state_A = 4d0 * const%water_molec_weight & / (const%univ_gas_const * env_state%temp * const%water_density) end function env_state_A !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !> Convert (ppb) to (molecules m^{-3}). real(kind=dp) function env_state_ppb_to_conc(env_state, ppb) diff --git a/src/output.F90 b/src/output.F90 index a2dd75ae0..9a355015e 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1,4 +1,4 @@ -! Copyright (C) 2005-2022 Nicole Riemer and Matthew West +! Copyright (C) 2005-2018 Nicole Riemer and Matthew West ! Licensed under the GNU General Public License version 2 or (at your ! option) any later version. See the file COPYING for details. @@ -247,6 +247,51 @@ subroutine make_filename(filename, prefix, suffix, index, i_repeat, & end subroutine make_filename +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Modified by xx24, Feb/12/2022 + !> Make a filename from a given prefix and other information. + subroutine for_single_particle(filename, prefix_single_particle, suffix, index, i_repeat, & + write_rank, write_n_proc) + +!> Filename to create. +character(len=*), intent(out) :: filename +!> Filename prefix. +character(len=*), intent(in) :: prefix_single_particle +!> Filename suffix. +character(len=*), intent(in) :: suffix +!> Filename index. +integer, intent(in), optional :: index +!> Current repeat number. +integer, intent(in), optional :: i_repeat +!> Rank to write into file. +integer, intent(in), optional :: write_rank +!> Number of processes to write into file. +integer, intent(in), optional :: write_n_proc + +integer :: ncid, use_rank, use_n_proc +character(len=100) :: proc_string, index_string, repeat_string + +if (present(write_rank)) then + use_rank = write_rank +else + use_rank = pmc_mpi_rank() +end if +if (present(write_n_proc)) then + use_n_proc = write_n_proc +else + use_n_proc = pmc_mpi_size() +end if + +repeat_string = "" +proc_string = "" +index_string = "" +if (present(i_repeat)) write(repeat_string, '(a,i4.4)') '_', i_repeat +if (use_n_proc > 1) write(proc_string, '(a,i4.4)') '_', (use_rank + 1) +if (present(index)) write(index_string, '(a,i8.8)') '_', index +write(filename, '(a,a,a,a,a)') trim(prefix_single_particle), trim(repeat_string), & + trim(proc_string), trim(index_string), trim(suffix) + +end subroutine for_single_particle !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !> Helper routine to write time variables. Do not call directly. diff --git a/src/pmc_constants.mod b/src/pmc_constants.mod new file mode 100644 index 000000000..d1af6b07f Binary files /dev/null and b/src/pmc_constants.mod differ diff --git a/test/additive/aero_data.dat b/test/additive/aero_data.dat index 41cdc37fc..ec050a51b 100644 --- a/test/additive/aero_data.dat +++ b/test/additive/aero_data.dat @@ -1,2 +1,2 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 diff --git a/test/average/aero_data.dat b/test/average/aero_data.dat index adc790ba7..7780ff248 100644 --- a/test/average/aero_data.dat +++ b/test/average/aero_data.dat @@ -1,3 +1,26 @@ +<<<<<<< HEAD +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 +SO4 1800 0 96d-3 0.65 0.05d0 +NO3 1800 0 62d-3 0.65 0.05d0 +Cl 2200 0 35.5d-3 0.53 0.05d0 +NH4 1800 0 18d-3 0.65 0.05d0 +MSA 1800 0 95d-3 0.53 0.03d0 +ARO1 1400 0 150d-3 0.1 0.03d0 +ARO2 1400 0 150d-3 0.1 0.03d0 +ALK1 1400 0 140d-3 0.1 0.03d0 +OLE1 1400 0 140d-3 0.1 0.03d0 +API1 1400 0 184d-3 0.1 0.03d0 +API2 1400 0 184d-3 0.1 0.03d0 +LIM1 1400 0 200d-3 0.1 0.03d0 +LIM2 1400 0 200d-3 0.1 0.03d0 +CO3 2600 0 60d-3 0.53 0.05d0 +Na 2200 0 23d-3 0.53 0.05d0 +Ca 2600 0 40d-3 0.53 0.05d0 +OIN 2600 0 1d-3 0.1 0.05d0 +OC 1000 0 1d-3 0.001 0.03d0 +BC 1800 0 1d-3 0 0.05d0 +======= # dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa H2O 1000 0 18d-3 0 SO4 1800 0 96d-3 0.53 @@ -19,3 +42,4 @@ API1 1000 0 184d-3 0.1 API2 1000 0 184d-3 0.1 LIM1 1000 0 200d-3 0.1 LIM2 1000 0 200d-3 0.1 +>>>>>>> master diff --git a/test/bidisperse/aero_data.dat b/test/bidisperse/aero_data.dat index 41cdc37fc..ec050a51b 100644 --- a/test/bidisperse/aero_data.dat +++ b/test/bidisperse/aero_data.dat @@ -1,2 +1,2 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 diff --git a/test/brownian/aero_data.dat b/test/brownian/aero_data.dat index 41cdc37fc..ec050a51b 100644 --- a/test/brownian/aero_data.dat +++ b/test/brownian/aero_data.dat @@ -1,2 +1,2 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 diff --git a/test/condense/aero_data.dat b/test/condense/aero_data.dat index af22101b2..36c4c9b1b 100644 --- a/test/condense/aero_data.dat +++ b/test/condense/aero_data.dat @@ -1,21 +1,21 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -SO4 1800 1 96d-3 0 -NO3 1800 1 62d-3 0 -Cl 2200 1 35.5d-3 0 -NH4 1800 1 18d-3 0 -MSA 1800 0 95d-3 0.53 -ARO1 1400 0 150d-3 0.1 -ARO2 1400 0 150d-3 0.1 -ALK1 1400 0 140d-3 0.1 -OLE1 1400 0 140d-3 0.1 -API1 1400 0 184d-3 0.1 -API2 1400 0 184d-3 0.1 -LIM1 1400 0 200d-3 0.1 -LIM2 1400 0 200d-3 0.1 -CO3 2600 1 60d-3 0 -Na 2200 1 23d-3 0 -Ca 2600 1 40d-3 0 -OIN 2600 0 1d-3 0.1 -OC 1400 0 1d-3 0.1 -BC 1800 0 1d-3 0 -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +SO4 1800 0 96d-3 0.65 0.05d0 +NO3 1800 0 62d-3 0.65 0.05d0 +Cl 2200 0 35.5d-3 0.53 0.05d0 +NH4 1800 0 18d-3 0.65 0.05d0 +MSA 1800 0 95d-3 0.53 0.03d0 +ARO1 1400 0 150d-3 0.1 0.03d0 +ARO2 1400 0 150d-3 0.1 0.03d0 +ALK1 1400 0 140d-3 0.1 0.03d0 +OLE1 1400 0 140d-3 0.1 0.03d0 +API1 1400 0 184d-3 0.1 0.03d0 +API2 1400 0 184d-3 0.1 0.03d0 +LIM1 1400 0 200d-3 0.1 0.03d0 +LIM2 1400 0 200d-3 0.1 0.03d0 +CO3 2600 0 60d-3 0.53 0.05d0 +Na 2200 0 23d-3 0.53 0.05d0 +Ca 2600 0 40d-3 0.53 0.05d0 +OIN 2600 0 1d-3 0.1 0.05d0 +OC 1000 0 1d-3 0.001 0.03d0 +BC 1800 0 1d-3 0 0.05d0 +H2O 1000 0 18d-3 0 0.073d0 diff --git a/test/emission/aero_data.dat b/test/emission/aero_data.dat index 83d7a7091..3671fc4ac 100644 --- a/test/emission/aero_data.dat +++ b/test/emission/aero_data.dat @@ -1,4 +1,4 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -SI 10000 0 18d-3 0 -SB 100 0 18d-3 0 -SE 1500 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +SI 10000 0 18d-3 0 0.073d0 +SB 100 0 18d-3 0 0.073d0 +SE 1500 0 18d-3 0 0.073d0 diff --git a/test/fractal/aero_data.dat b/test/fractal/aero_data.dat index 21e82154f..2c227b908 100644 --- a/test/fractal/aero_data.dat +++ b/test/fractal/aero_data.dat @@ -1,2 +1,2 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -BC 4200 0 1d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +BC 4200 0 1d-3 0 0.073d0 diff --git a/test/loss/aero_data.dat b/test/loss/aero_data.dat index 41cdc37fc..b7e15530b 100644 --- a/test/loss/aero_data.dat +++ b/test/loss/aero_data.dat @@ -1,2 +1,2 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 \ No newline at end of file diff --git a/test/mixing_state/aero_data.dat b/test/mixing_state/aero_data.dat index 740f9933b..fabcf9815 100644 --- a/test/mixing_state/aero_data.dat +++ b/test/mixing_state/aero_data.dat @@ -1,5 +1,5 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -A 1000 0 100d-3 0.1 -B 1500 0 100d-3 0.1 -C 2000 0 100d-3 0.1 -D 2500 0 100d-3 0.1 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +A 1000 0 100d-3 0.1 0.073d0 +B 1500 0 100d-3 0.1 0.073d0 +C 2000 0 100d-3 0.1 0.073d0 +D 2500 0 100d-3 0.1 0.073d0 diff --git a/test/mosaic/aero_data.dat b/test/mosaic/aero_data.dat index d6d5f3538..fdfe9e97e 100644 --- a/test/mosaic/aero_data.dat +++ b/test/mosaic/aero_data.dat @@ -1,3 +1,26 @@ +<<<<<<< HEAD +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 +SO4 1800 0 96d-3 0.65 0.05d0 +NO3 1800 0 62d-3 0.65 0.05d0 +Cl 2200 0 35.5d-3 0.53 0.05d0 +NH4 1800 0 18d-3 0.65 0.05d0 +CO3 2600 0 60d-3 0.53 0.05d0 +MSA 1800 0 95d-3 0.53 0.03d0 +Na 2200 0 23d-3 0.53 0.05d0 +Ca 2600 0 40d-3 0.53 0.05d0 +OC 1000 0 1d-3 0.001 0.03d0 +BC 1800 0 1d-3 0 0.05d0 +OIN 2600 0 1d-3 0.1 0.05d0 +ARO1 1400 0 150d-3 0.1 0.03d0 +ARO2 1400 0 150d-3 0.1 0.03d0 +ALK1 1400 0 140d-3 0.1 0.03d0 +OLE1 1400 0 140d-3 0.1 0.03d0 +API1 1400 0 184d-3 0.1 0.03d0 +API2 1400 0 184d-3 0.1 0.03d0 +LIM1 1400 0 200d-3 0.1 0.03d0 +LIM2 1400 0 200d-3 0.1 0.03d0 +======= # dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa H2O 1000 0 18d-3 0 SO4 1800 0 96d-3 0.53 @@ -19,3 +42,4 @@ API1 1000 0 184d-3 0.1 API2 1000 0 184d-3 0.1 LIM1 1000 0 200d-3 0.1 LIM2 1000 0 200d-3 0.1 +>>>>>>> master diff --git a/test/nucleate/aero_data.dat b/test/nucleate/aero_data.dat index 1f0f968fa..dee42a8e6 100644 --- a/test/nucleate/aero_data.dat +++ b/test/nucleate/aero_data.dat @@ -1,3 +1,3 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -SO4 1800 0 96d-3 0.65 -NO3 1800 0 62d-3 0.65 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +SO4 1800 0 96d-3 0.65 0.05d0 +NO3 1800 0 62d-3 0.65 0.05d0 diff --git a/test/parallel/aero_data.dat b/test/parallel/aero_data.dat index 41cdc37fc..b7e15530b 100644 --- a/test/parallel/aero_data.dat +++ b/test/parallel/aero_data.dat @@ -1,2 +1,2 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 \ No newline at end of file diff --git a/test/sedi/aero_data.dat b/test/sedi/aero_data.dat index 41cdc37fc..b7e15530b 100644 --- a/test/sedi/aero_data.dat +++ b/test/sedi/aero_data.dat @@ -1,2 +1,2 @@ -# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) -H2O 1000 0 18d-3 0 +# dens (kg/m^3) ions in soln (1) molec wght (kg/mole) kappa (1) sigma +H2O 1000 0 18d-3 0 0.073d0 \ No newline at end of file