61 #define PART_TYPE scat_data[i_ss][i_se].ptype
62 #define F_DATAGRID scat_data[i_ss][i_se].f_grid
63 #define T_DATAGRID scat_data[i_ss][i_se].T_grid
64 #define ZA_DATAGRID scat_data[i_ss][i_se].za_grid
65 #define AA_DATAGRID scat_data[i_ss][i_se].aa_grid
66 #define PHA_MAT_DATA scat_data[i_ss][i_se].pha_mat_data
67 #define EXT_MAT_DATA scat_data[i_ss][i_se].ext_mat_data
68 #define ABS_VEC_DATA scat_data[i_ss][i_se].abs_vec_data
72 #define PND_LIMIT 1e-12
94 "The dimension of the stokes vector \n"
95 "must be 1,2,3 or 4");
102 os <<
"Total number of scattering elements in scat_data "
103 <<
"inconsistent with size of pnd_field.";
104 throw runtime_error(os.str());
120 os <<
"Scattering data seems to be *scat_data_mono* (1 freq point only),\n"
121 <<
"but frequency interpolable data (*scat_data* with >=2 freq points) "
122 <<
"is expected here.";
123 throw runtime_error(os.str());
134 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
138 for (
Index i_se = 0; i_se < N_se; i_se++) {
186 os <<
"In pha_mat_sptFromData.\n"
187 <<
"The temperature grid of the scattering data does not\n"
188 <<
"cover the atmospheric temperature at cloud location.\n"
210 i_za_sca, i_aa_sca, i_za_inc, i_aa_inc, i) =
236 i_za_sca, i_aa_sca, i_za_inc, i_aa_inc, i) =
249 for (
Index za_inc_idx = 0; za_inc_idx <
za_grid.nelem();
251 for (
Index aa_inc_idx = 0; aa_inc_idx <
aa_grid.nelem();
294 os <<
"Total number of scattering elements in scat_data_mono "
295 <<
"inconsistent with size of pnd_field.";
296 throw runtime_error(os.str());
345 os <<
"Scattering data seems to be *scat_data* (several freq points),\n"
346 <<
"but *scat_data_mono* (1 freq point only) is expected here.";
347 throw runtime_error(os.str());
359 "The dimension of the stokes vector \n"
360 "must be 1,2,3 or 4");
372 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
375 for (
Index i_se = 0; i_se < N_se; i_se++) {
403 os <<
"In pha_mat_sptFromDataDOITOpt.\n"
404 <<
"The temperature grid of the scattering data does not\n"
405 <<
"cover the atmospheric temperature at cloud location.\n"
419 for (
Index aa_inc_idx = 0; aa_inc_idx <
aa_grid.nelem();
425 pha_mat_spt(i_se_flat, za_inc_idx, aa_inc_idx, i, j) =
480 assert(
ext_mat_spt[0].NumberOfFrequencies() == N_se_total);
481 assert(
abs_vec_spt[0].NumberOfFrequencies() == N_se_total);
493 os <<
"Scattering data seems to be *scat_data_mono* (1 freq point only),\n"
494 <<
"but frequency interpolable data (*scat_data* with >=2 freq points) "
495 <<
"is expected here.";
496 throw runtime_error(os.str());
510 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
514 for (
Index i_se = 0; i_se < N_se; i_se++) {
545 os <<
"In opt_prop_sptFromData.\n"
546 <<
"The temperature grid of the scattering data does not\n"
547 <<
"cover the atmospheric temperature at cloud location.\n"
566 ext_mat_data_int(i_za_sca, i_aa_sca, i) =
583 abs_vec_data_int(i_za_sca, i_aa_sca, i) =
604 ext_mat_data_int(i_za_sca, i_aa_sca, i) =
620 abs_vec_data_int(i_za_sca, i_aa_sca, i) =
680 "The scattering data must be flagged to have "
681 "passed a consistency check (scat_data_checked=1).");
690 "The dimension of the stokes vector \n"
691 "must be 1,2,3 or 4");
711 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
715 for (
Index i_se = 0; i_se < N_se; i_se++) {
737 os <<
"In opt_prop_sptFromScat_data.\n"
738 <<
"The temperature grid of the scattering data does not\n"
739 <<
"cover the atmospheric temperature at cloud location.\n"
765 ext_mat_data_int(i_za_sca, i_aa_sca, i) =
interp(
803 abs_vec_data_int(i_za_sca, i_aa_sca, i) =
interp(
872 os <<
"Number of scattering elements in *abs_vec_spt* and *ext_mat_spt*\n"
873 <<
"does not agree.";
874 throw runtime_error(os.str());
881 os <<
"*stokes_dim* of *abs_vec_spt* and *ext_mat_spt* does not agree.";
882 throw runtime_error(os.str());
886 os <<
"The dimension of stokes vector can only be 1, 2, 3, or 4.";
887 throw runtime_error(os.str());
901 for (
Index l = 0; l < N_se; l++) {
927 "Col dimension of propmat_clearsky "
928 "inconsistent with col dimension in ext_mat.");
937 "Frequency dimension of ext_mat and propmat_clearsky\n"
938 "are inconsistent in ext_matAddGas.");
955 "Frequency dimension of abs_vec and propmat_clearsky\n"
956 "are inconsistent in abs_vecAddGas.");
959 "Stokes dimension of abs_vec and propmat_clearsky\n"
960 "are inconsistent in abs_vecAddGas.");
1046 for (
Index pt_index = 0; pt_index < N_se; ++pt_index)
1068 2 * grid_step_size_azimuth *
1072 for (
Index pt_index = 0; pt_index < N_se; ++pt_index)
1096 const String& check_type,
1116 out2 <<
" checking for negative values in Z11, K11, and a1, and for K11<a1\n";
1117 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
1121 for (
Index i_se = 0; i_se < N_se; i_se++) {
1129 os <<
"Scatt. species #" << i_ss <<
" element #" << i_se
1130 <<
" contains negative K11 or a1 at f#" << f <<
", T#" << t
1131 <<
", za#" << zai <<
", aa#" << aai <<
"\n";
1132 throw runtime_error(os.str());
1137 os <<
"Scatt. species #" << i_ss <<
" element #" << i_se
1138 <<
" has K11<a1 at f#" << f <<
", T#" << t <<
", za#" << zai
1139 <<
", aa#" << aai <<
"\n";
1140 throw runtime_error(os.str());
1147 for (
Index t = 0; t < nTpha; t++) {
1152 os <<
"Scatt. species #" << i_ss <<
" element #" << i_se
1153 <<
" contains negative Z11 at f#" << f <<
", T#" << t
1154 <<
" (of " << nTpha <<
"), za_sca#" << zas <<
", aa_sca#"
1155 << aas <<
", za_inc#" << zai <<
", aa_inc#" << aai
1157 throw runtime_error(os.str());
1166 out2 <<
" checking for NaN anywhere in Z, K, and a\n";
1167 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
1171 for (
Index i_se = 0; i_se < N_se; i_se++) {
1179 os <<
"Scatt. species #" << i_ss <<
" element #" << i_se
1180 <<
" contains NaN in abs_vec at f#" << f <<
", T#" << t
1181 <<
", za#" << zai <<
", aa#" << aai <<
", stokes #" << st
1183 throw runtime_error(os.str());
1188 os <<
"Scatt. species #" << i_ss <<
" element #" << i_se
1189 <<
" contains NaN in ext_mat at f#" << f <<
", T#" << t
1190 <<
", za#" << zai <<
", aa#" << aai <<
", stokes #" << st
1192 throw runtime_error(os.str());
1196 for (
Index t = 0; t < nTpha; t++) {
1203 os <<
"Scatt. species #" << i_ss <<
" element #" << i_se
1204 <<
" contains NaN in pha_mat at f#" << f <<
", T#" << t
1205 <<
" (of " << nTpha <<
"), za_sca#" << zas
1206 <<
", aa_sca#" << aas <<
", za_inc#" << zai
1207 <<
", aa_inc#" << aai <<
", stokes #"
1209 throw runtime_error(os.str());
1217 if (check_type.
toupper() ==
"ALL") {
1219 out2 <<
" checking normalization of scattering matrix\n";
1220 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
1224 for (
Index i_se = 0; i_se < N_se; i_se++)
1234 Numeric Csca_data = Cext_data - Cabs_data;
1252 if (
abs(Csca - Csca_data) / Cext_data > threshold) {
1254 os <<
" Deviations in scat_data too large:\n"
1255 <<
" scat dev [%] " << 1e2 * Csca / Csca_data - 1e2
1256 <<
" at nominal (actual) albedo of "
1257 << Csca_data / Cext_data <<
" (" << Csca / Cext_data
1259 <<
" Check entry for scattering element " << i_se
1260 <<
" of scattering species " << i_ss <<
" at " << f
1261 <<
".frequency and " << t <<
".temperature!\n";
1262 throw runtime_error(os.str());
1281 Numeric Csca_data = Cext_data - Cabs_data;
1299 if (
abs(Csca - Csca_data) / Cext_data > threshold) {
1301 os <<
" Deviations in scat_data too large:\n"
1302 <<
" scat dev [%] " << 1e2 * Csca / Csca_data - 1e2
1303 <<
" at nominal (actual) albedo of "
1304 << Csca_data / Cext_data <<
" (" << Csca / Cext_data
1306 <<
" Check entry for scattering element " << i_se
1307 <<
" of scattering species " << i_ss <<
" at " << f
1308 <<
". frequency, " << t <<
". temperature, and " << iza
1309 <<
". incident polar angle!\n";
1310 throw runtime_error(os.str());
1321 <<
" scat_data consistency check not implemented (yet?!) for\n"
1326 out2 <<
" WARNING:\n"
1327 <<
" scat_data norm check can not be performed for pha_mat-only"
1328 <<
" T-reduced scattering elements\n"
1329 <<
" as found in scatt element #" << i_se
1330 <<
" of scatt species #" << i_ss <<
"!\n";
1332 }
else if (check_type.
toupper() ==
"SANE") {
1333 out1 <<
" WARNING:\n"
1334 <<
" Normalization check on pha_mat switched off.\n"
1335 <<
" Scattering solution might be wrong.\n";
1338 os <<
"Invalid value for argument *check_type*: '" << check_type <<
"'.\n";
1339 os <<
"Valid values are 'all' or 'none'.";
1340 throw runtime_error(os.str());
1365 throw runtime_error(
1366 "The scattering data must be flagged to have "
1367 "passed a consistency check (scat_data_checked=1).");
1411 Index i_se_flat = 0;
1412 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
1415 for (
Index i_se = 0; i_se < N_se; i_se++) {
1430 for (
Index t_idx = 0; t_idx < N_T; t_idx++) {
1434 for (
Index aa_sca_idx = 0; aa_sca_idx < N_aa_sca; aa_sca_idx++) {
1438 for (
Index aa_inc_idx = 0; aa_inc_idx <
aa_grid.nelem();
1480 Index aa_index_local = 0;
1486 Numeric rtp_temperature_local =
1489 for (
Index za_index_local = 0;
1493 Index index_zero = 0;
1503 rtp_temperature_local,
1532 const Index& interp_order,
1545 const String which_interpolation =
"scat_data_raw.f_grid to f_grid";
1555 os <<
"There is a problem with the grids for the following "
1556 <<
"interpolation:\n"
1557 << which_interpolation <<
"\n"
1558 <<
"If original grid has only 1 element, the new grid must also have\n"
1559 <<
"only a single element and hold the same value as the original grid.";
1560 throw runtime_error(os.str());
1582 for (
Index i_se = 0; i_se < N_se; i_se++) {
1609 const bool single_se_fgrid =
1611 if (!single_se_fgrid) {
1619 Matrix itw(nf, interp_order + 1);
1623 for (
Index t_index = 0;
1624 t_index <
scat_data_raw[i_ss][i_se].pha_mat_data.nvitrines();
1626 for (
Index i_za_sca = 0;
1627 i_za_sca <
scat_data_raw[i_ss][i_se].pha_mat_data.nshelves();
1629 for (
Index i_aa_sca = 0;
1632 for (
Index i_za_inc = 0;
1635 for (
Index i_aa_inc = 0;
1665 for (
Index t_index = 0;
1668 for (
Index i_za_sca = 0;
1671 for (
Index i_aa_sca = 0;
1678 joker, t_index, i_za_sca, i_aa_sca, i),
1681 joker, t_index, i_za_sca, i_aa_sca, i),
1689 for (
Index t_index = 0;
1692 for (
Index i_za_sca = 0;
1695 for (
Index i_aa_sca = 0;
1702 joker, t_index, i_za_sca, i_aa_sca, i),
1705 joker, t_index, i_za_sca, i_aa_sca, i),
1731 const Index& interp_order,
1732 const Index& phamat_only,
1744 os <<
"Can not T-reduce scattering species #" << i_ss <<
".\n"
1745 <<
"*scat_data* contains only " << nss <<
" scattering species.";
1746 throw runtime_error(os.str());
1756 <<
" can be handled.\n"
1757 <<
"Scattering element #" << i_se <<
" has ptype " <<
PART_TYPE <<
".";
1758 throw runtime_error(os.str());
1771 os <<
"Single scattering data of scat element #" << i_se
1772 <<
" of scat species #" << i_ss <<
"\n"
1773 <<
"seems to have undergone some temperature grid manipulation in\n"
1774 <<
"*pha_mat_data* already. That can not be done twice!";
1775 throw runtime_error(os.str());
1785 ost <<
"Scattering data temperature interpolation for\n"
1786 <<
"scat element #" << i_se <<
" of scat species #" << i_ss <<
".";
1792 Vector itw(interp_order + 1);
1828 phamat_tmp(i_f, 0, i_za1, i_aa1, i_za2, i_aa2, i_st) =
1831 i_f,
joker, i_za1, i_aa1, i_za2, i_aa2, i_st),
1841 extmat_tmp(i_f, 0, i_za, i_aa, i_st) =
1844 absvec_tmp(i_f, 0, i_za, i_aa, i_st) =
1896 this_threshold = threshold;
1898 "T-reduced *pha_mat_data* norm (=sca xs) deviates too "
1899 "much from non-reduced *ext_mat_data* and *abs_vec_data*:";
1901 this_threshold = 2 * threshold;
1903 "T-reduced *scat_data* deviates too much from original "
1919 Numeric Cext_data = extmat_tmp(f, 0, 0, 0, 0);
1921 Numeric Cabs_data = absvec_tmp(f, 0, 0, 0, 0);
1922 Numeric Csca_data = Cext_data - Cabs_data;
1939 if (
abs(Csca - Csca_data) / Cext_data > threshold) {
1941 os <<
" Deviations in T-reduced scat_data too large:\n"
1942 <<
" scat dev [%] " << 1e2 * Csca / Csca_data - 1e2
1943 <<
" at nominal (actual) albedo of " << Csca_data / Cext_data
1944 <<
" (" << Csca / Cext_data <<
").\n"
1945 <<
" Problem occurs for scattering element #" << i_se
1946 <<
" at " << f <<
".frequency!\n";
1947 throw runtime_error(os.str());
1949 Numeric norm_dev = (Csca - Csca) / Cext_data;
1957 Numeric xs_dev = (Csca - Csca_data) / Cext_data;
1958 if (
abs(norm_dev + (Csca - Csca_data) / Cext_data) >
1960 cout <<
"Accumulated deviation (abs(" << norm_dev <<
"+"
1961 << xs_dev <<
")=" <<
abs(norm_dev + xs_dev)
1962 <<
" exceeding threshold (" << this_threshold <<
").\n";
1963 if (
abs(Csca - Csca_data) / Cext_data > this_threshold) {
1965 os <<
" " << errmsg <<
"\n"
1966 <<
" scat dev [%] " << 1e2 * Csca / Csca_data - 1e2
1967 <<
" at nominal (actual) albedo of " << Csca_data / Cext_data
1968 <<
" (" << Csca / Cext_data <<
").\n"
1969 <<
" Problem occurs for scattering element #" << i_se
1970 <<
" at " << f <<
".frequency and " << t
1971 <<
".temperature!\n";
1972 throw runtime_error(os.str());
1987 Numeric Cext_data = extmat_tmp(f, 0, iza, 0, 0);
1989 Numeric Cabs_data = absvec_tmp(f, 0, iza, 0, 0);
1990 Numeric Csca_data = Cext_data - Cabs_data;
2007 if (
abs(Csca - Csca_data) / Cext_data > threshold) {
2009 os <<
" Deviations in T-reduced scat_data too large:\n"
2010 <<
" scat dev [%] " << 1e2 * Csca / Csca_data - 1e2
2011 <<
" at nominal (actual) albedo of " << Csca_data / Cext_data
2012 <<
" (" << Csca / Cext_data <<
").\n"
2013 <<
" Problem occurs for scattering element #" << i_se
2014 <<
" at " << f <<
".frequency, and " << iza
2015 <<
". incident polar angle!\n";
2016 throw runtime_error(os.str());
2025 if (
abs(Csca - Csca_data) / Cext_data > this_threshold) {
2027 os <<
" " << errmsg <<
"\n"
2028 <<
" scat dev [%] " << 1e2 * Csca / Csca_data - 1e2
2029 <<
" at nominal (actual) albedo of "
2030 << Csca_data / Cext_data <<
" (" << Csca / Cext_data
2032 <<
" Problem occurs for scattering element #" << i_se
2033 <<
" at " << f <<
".frequency and " << t
2034 <<
".temperature, and " << iza
2035 <<
". incident polar angle!\n";
2036 throw runtime_error(os.str());
2096 for (
Index i_se = 0; i_se < N_se; i_se++) {
2133 0, t_index, i_za_sca, i_aa_sca, i_za_inc, i_aa_inc, i) =
2162 0, t_index, i_za_sca, i_aa_sca, i) =
2183 0, t_index, i_za_sca, i_aa_sca, i) =
2211 for (
Index i_se = 0; i_se < N_se; i_se++) {
2283 throw runtime_error(
2284 "The dimension of the stokes vector \n"
2285 "must be 1,2,3 or 4");
2302 os <<
"Scattering data seems to be *scat_data* (several freq points),\n"
2303 <<
"but *scat_data_mono* (1 freq point only) is expected here.";
2304 throw runtime_error(os.str());
2315 Index i_se_flat = 0;
2344 if (t_grid.
nelem() > 1) {
2346 os <<
"In opt_prop_sptFromMonoData.\n"
2347 <<
"The temperature grid of the scattering data does not\n"
2348 <<
"cover the atmospheric temperature at cloud location.\n"
2354 Tensor3 ext_mat_data1temp(ext_npages, ext_nrows, ext_ncols);
2357 for (
Index i_p = 0; i_p < ext_npages; i_p++) {
2358 for (
Index i_r = 0; i_r < ext_nrows; i_r++) {
2359 for (
Index i_c = 0; i_c < ext_ncols; i_c++) {
2360 ext_mat_data1temp(i_p, i_r, i_c) =
2363 0,
joker, i_p, i_r, i_c),
2391 if (t_grid.
nelem() > 1) {
2392 Tensor3 abs_vec_data1temp(abs_npages, abs_nrows, abs_ncols);
2394 for (
Index i_p = 0; i_p < abs_npages; i_p++) {
2395 for (
Index i_r = 0; i_r < abs_nrows; i_r++) {
2396 for (
Index i_c = 0; i_c < abs_ncols; i_c++) {
2397 abs_vec_data1temp(i_p, i_r, i_c) =
2400 0,
joker, i_p, i_r, i_c),
2452 os <<
"Total number of scattering elements in *scat_data_mono* "
2453 <<
"inconsistent with size of pnd_field.";
2454 throw runtime_error(os.str());
2463 throw runtime_error(
2464 "The dimension of the stokes vector \n"
2465 "must be 1,2,3 or 4");
2479 os <<
"Scattering data seems to be *scat_data* (several freq points),\n"
2480 <<
"but *scat_data_mono* (1 freq point only) is expected here.";
2481 throw runtime_error(os.str());
2484 GridPos T_gp = {0, {0, 1}}, Tred_gp;
2490 Index i_se_flat = 0;
2502 pha_mat_spt_tmp = 0.;
2523 os <<
"In pha_mat_sptFromMonoData.\n"
2524 <<
"The temperature grid of the scattering data does not\n"
2525 <<
"cover the atmospheric temperature at cloud location.\n"
2542 for (
Index aa_inc_idx = 0; aa_inc_idx <
aa_grid.nelem();
2546 for (
Index t_idx = 0; t_idx < 2; t_idx++) {
2565 pha_mat_spt(i_se_flat, za_inc_idx, aa_inc_idx, i, j) =
2566 interp(itw, pha_mat_spt_tmp(
joker, i, j), Tred_gp);
2613 throw runtime_error(
2614 "The scattering data must be flagged to have "
2615 "passed a consistency check (scat_data_checked=1).");
2619 throw runtime_error(
2620 "The dimension of the stokes vector \n"
2621 "must be 1,2,3 or 4");
2628 os <<
"Total number of scattering elements in scat_data "
2629 <<
"inconsistent with size of pnd_field.";
2630 throw runtime_error(os.str());
2645 Index i_se_flat = 0;
2647 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
2651 for (
Index i_se = 0; i_se < N_se; i_se++) {
2674 Index this_T_index = -1;
2692 os <<
"In pha_mat_sptFromScat_data.\n"
2693 <<
"The temperature grid of the scattering data does not\n"
2694 <<
"cover the atmospheric temperature at cloud location.\n"
2711 if (this_T_index < 0) {
2723 i_za_sca, i_aa_sca, i_za_inc, i_aa_inc, i) =
2755 for (
Index za_inc_idx = 0; za_inc_idx <
za_grid.nelem();
2757 for (
Index aa_inc_idx = 0; aa_inc_idx <
aa_grid.nelem();
2802 throw std::runtime_error(
2803 "You must call *cloudbox_checkedCalc* before this method.");
2809 throw std::runtime_error(
2810 "Merging scattering elements only works with a 1D atmoshere");
2826 limits[1] - limits[0], limits[1] - limits[0], 1, 1, 0.);
2829 scat_data_merged.resize(1);
2830 scat_data_merged[0].resize(pnd_field_merged.
nbooks());
2832 scat_meta_merged.resize(1);
2833 scat_meta_merged[0].resize(pnd_field_merged.
nbooks());
2835 scat_species_merged.resize(1);
2836 scat_species_merged[0] =
"mergedfield-mergedpsd";
2837 for (
Index sp = 0; sp < scat_data_merged[0].
nelem(); sp++) {
2840 this_part.
description =
"Merged scattering elements";
2846 scat_data[0][0].pha_mat_data.nshelves(),
2869 os <<
"Merged scattering element of cloudbox-level #" << sp;
2871 this_meta.
source =
"ARTS internal";
2873 this_meta.
mass = -1.;
2886 throw std::runtime_error(
2887 "All scattering elements must have the same type");
2890 throw std::runtime_error(
2891 "All scattering elements must have the same f_grid");
2901 throw std::runtime_error(
2902 "All scattering elements must have the same pha_mat_data size"
2903 " (except for temperature).");
2910 throw std::runtime_error(
2911 "All scattering elements must have the same ext_mat_data size"
2912 " (except for temperature).");
2919 throw std::runtime_error(
2920 "All scattering elements must have the same abs_vec_data size"
2921 " (except for temperature).");
2932 for (
Index i_lv = 0; i_lv < nlevels - 1; i_lv++) {
2933 pnd_field_merged(i_lv, i_lv, 0, 0) = 1.;
2949 os <<
"The temperature grid of the scattering data "
2950 <<
"does not cover the\n"
2951 <<
"atmospheric temperature at cloud location. "
2952 <<
"The data should\n"
2953 <<
"include the value T = " << temperature <<
" K.\n"
2954 <<
"Offending particle is scat_data[" << i_ss <<
"][" << i_se
2956 <<
"Description: " << orig_part.
description <<
"\n";
3011 for (
Index i_za_out = 0;
3015 for (
Index i_aa_out = 0;
3019 for (
Index i_za_inc = 0;
3023 for (
Index i_aa_inc = 0;
3081 pnd_field_merged(0, 0, 0, 0) = 0.;
3096 const Index& scat_species_index,
3098 if (scat_species_index < 0) {
3100 os <<
"scat_species_index can't be <0!";
3101 throw runtime_error(os.str());
3107 if (!(nss > scat_species_index)) {
3109 os <<
"Can not extract data for scattering species #" << scat_species_index
3111 <<
"because scat_meta has only " << nss <<
" elements.";
3112 throw runtime_error(os.str());
3118 for (
Index i = 0; i < nse; i++) {
3119 if (meta_name ==
"mass")
3120 meta_param[i] =
scat_meta[scat_species_index][i].mass;
3121 else if (meta_name ==
"diameter_max")
3122 meta_param[i] =
scat_meta[scat_species_index][i].diameter_max;
3123 else if (meta_name ==
"diameter_volume_equ")
3124 meta_param[i] =
scat_meta[scat_species_index][i].diameter_volume_equ;
3125 else if (meta_name ==
"diameter_area_equ_aerodynamical")
3127 scat_meta[scat_species_index][i].diameter_area_equ_aerodynamical;
3130 os <<
"Meta parameter \"" << meta_name <<
"\"is unknown.";
3131 throw runtime_error(os.str());