31 Tensor3& dpsd_data_dx,
32 const Vector& pnd_agenda_input_t,
33 const Matrix& pnd_agenda_input,
37 const Index& species_index,
47 pnd_agenda_input_names,
59 Tensor3& dpsd_data_dx,
60 const Vector& pnd_agenda_input_t,
61 const Matrix& pnd_agenda_input,
65 const Index& species_index,
75 pnd_agenda_input_names,
91 Tensor3& dpsd_data_dx,
92 const Vector& psd_size_grid,
93 const Vector& pnd_agenda_input_t,
94 const Matrix& pnd_agenda_input,
101 const Numeric& t_min,
102 const Numeric& t_max,
110 "The number of columns in *pnd_agenda_input* must "
111 "be 0, 1, 2, 3 or 4.");
114 const Index n0_fixed = (Index) !(std::isnan(n0));
115 const Index mu_fixed = (Index) !(std::isnan(mu));
116 const Index la_fixed = (Index) !(std::isnan(la));
117 const Index ga_fixed = (Index) !(std::isnan(ga));
120 "This PSD has four free parameters. This means that "
121 "the number\nof columns in *pnd_agenda_input* and the "
122 "number of numerics\n(i.e. non-NaN) and among "
123 "the GIN arguments n0, mu, la and\nga must add up to "
124 "four. And this was found not to be the case.");
134 mgd_i_pai[0] = nhit++;
139 mgd_i_pai[1] = nhit++;
144 mgd_i_pai[2] = nhit++;
149 mgd_i_pai[3] = nhit++;
163 for (Index i = 0; i < ndx; i++) {
164 for (Index j = 0; j < 4; j++) {
165 if (dx2in[i] == mgd_i_pai[j]) {
174 for (Index ip = 0; ip < np; ip++) {
176 for (Index i = 0; i < 4; i++) {
177 if (mgd_i_pai[i] >= 0) {
178 mgd_pars[i] = pnd_agenda_input(ip, mgd_i_pai[i]);
181 Numeric t = pnd_agenda_input_t[ip];
184 if ((mgd_pars[0] == 0.) && (!ndx)) {
189 if (t < t_min || t > t_max) {
191 "Method called with a temperature of ", t,
" K.\n"
192 "This is outside the specified allowed range: [ max(0.,", t_min,
200 "Bad MGD parameter detected: la <= 0");
202 "Bad MGD parameter detected: ga <= 0");
205 Matrix jac_data(4, nsi);
219 for (Index i = 0; i < 4; i++) {
221 dpsd_data_dx(mgd_i_jac[i], ip, joker) = jac_data(i, joker);
229 Tensor3& dpsd_data_dx,
230 const Vector& psd_size_grid,
231 const Vector& pnd_agenda_input_t,
232 const Matrix& pnd_agenda_input,
235 const Numeric& scat_species_a,
236 const Numeric& scat_species_b,
241 const Numeric& t_min,
242 const Numeric& t_max,
250 "The number of columns in *pnd_agenda_input* must "
253 "*scat_species_a* should be > 0.");
255 "*scat_species_b* should be > 0 and < 5.");
258 const Index n0_depend = (Index)n0 == -999;
259 const Index mu_depend = (Index)mu == -999;
260 const Index la_depend = (Index)la == -999;
261 const Index ga_depend = (Index)ga == -999;
264 "One (but only one) of n0, mu, la and ga must be NaN, "
265 "to flag that this parameter is the one dependent of "
268 "Sorry, mu and la are not yet allowed to be the "
269 "dependent parameter.");
271 const Index n0_fixed = (Index) !(n0_depend || std::isnan(n0));
272 const Index mu_fixed = (Index) !(mu_depend || std::isnan(mu));
273 const Index la_fixed = (Index) !(la_depend || std::isnan(la));
274 const Index ga_fixed = (Index) !(ga_depend || std::isnan(ga));
277 "This PSD has four free parameters. This means that "
278 "the number\nof columns in *pnd_agenda_input* and the "
279 "number of numerics\n(i.e. not -999 or NaN) and among "
280 "the GIN arguments n0, mu, la and\nga must add up to "
281 "four. And this was found not to be the case.");
284 Vector mgd_pars(4), ext_pars(1);
291 }
else if (!n0_depend) {
292 mgd_i_pai[0] = nhit++;
296 }
else if (!mu_depend) {
297 mgd_i_pai[1] = nhit++;
301 }
else if (!la_depend) {
302 mgd_i_pai[2] = nhit++;
306 }
else if (!ga_depend) {
307 mgd_i_pai[3] = nhit++;
323 for (Index i = 0; i < ndx; i++) {
330 for (Index j = 0; j < 4; j++) {
331 if (dx2in[i] == mgd_i_pai[j]) {
341 for (Index ip = 0; ip < np; ip++) {
343 ext_pars[0] = pnd_agenda_input(ip, ext_i_pai[0]);
345 for (Index i = 0; i < 4; i++) {
346 if (mgd_i_pai[i] >= 0) {
347 mgd_pars[i] = pnd_agenda_input(ip, mgd_i_pai[i]);
350 Numeric t = pnd_agenda_input_t[ip];
353 if ((ext_pars[0] == 0.) && (!ndx)) {
358 if (t < t_min || t > t_max) {
360 "Method called with a temperature of ", t,
" K.\n"
361 "This is outside the specified allowed range: [ max(0.,", t_min,
369 Numeric mub1 = 0, eterm = 0, scfac = 0;
372 mub1 = mgd_pars[1] + scat_species_b + 1;
373 eterm = mub1 / mgd_pars[3];
374 scfac = (mgd_pars[3] * pow(mgd_pars[2], eterm)) /
375 (scat_species_a * tgamma(eterm));
376 mgd_pars[0] = scfac * ext_pars[0];
377 }
else if (la_depend) {
379 "The mass content must be > 0 when la is "
380 "the dependent parameter.");
381 mub1 = mgd_pars[1] + scat_species_b + 1;
382 eterm = mub1 / mgd_pars[3];
383 scfac = mgd_pars[3] / (scat_species_a * mgd_pars[0] * tgamma(eterm));
384 scfac = pow(scfac, -1 / eterm);
385 mgd_pars[2] = scfac * pow(ext_pars[0], -1 / eterm);
393 "Bad MGD parameter detected: mu + b + 1 <= 0");
395 "Bad MGD parameter detected: la <= 0");
397 "Bad MGD parameter detected: ga <= 0");
400 Matrix jac_data(4, nsi);
408 (
bool)mgd_do_jac[0] || n0_depend,
409 (
bool)mgd_do_jac[1] || mu_depend,
410 (
bool)mgd_do_jac[2] || la_depend,
411 (
bool)mgd_do_jac[3] || ga_depend);
416 dpsd_data_dx(ext_i_jac[0], ip, joker) = jac_data(0, joker);
417 dpsd_data_dx(ext_i_jac[0], ip, joker) *= scfac;
418 }
else if (la_depend) {
419 dpsd_data_dx(ext_i_jac[0], ip, joker) = jac_data(2, joker);
420 dpsd_data_dx(ext_i_jac[0], ip, joker) *=
421 scfac * (-1 / eterm) * pow(ext_pars[0], -(1 / eterm + 1));
428 for (Index i = 0; i < 4; i++) {
430 dpsd_data_dx(mgd_i_jac[i], ip, joker) = jac_data(i, joker);
438 Tensor3& dpsd_data_dx,
439 const Vector& psd_size_grid,
440 const Vector& pnd_agenda_input_t,
441 const Matrix& pnd_agenda_input,
444 const Numeric& scat_species_a,
445 const Numeric& scat_species_b,
450 const Numeric& t_min,
451 const Numeric& t_max,
460 pnd_agenda_input_names,
476 Tensor3& dpsd_data_dx,
477 const Vector& psd_size_grid,
478 const Vector& pnd_agenda_input_t,
479 const Matrix& pnd_agenda_input,
482 const Numeric& scat_species_a,
483 const Numeric& scat_species_b,
488 const Numeric& t_min,
489 const Numeric& t_max,
494 "mean particle mass",
498 pnd_agenda_input_names,
514 Tensor3& dpsd_data_dx,
515 const Vector& psd_size_grid,
516 const Vector& pnd_agenda_input_t,
517 const Matrix& pnd_agenda_input,
520 const Numeric& scat_species_a,
521 const Numeric& scat_species_b,
526 const Numeric& t_min,
527 const Numeric& t_max,
536 pnd_agenda_input_names,
552 Tensor3& dpsd_data_dx,
553 const Vector& psd_size_grid,
554 const Vector& pnd_agenda_input_t,
555 const Matrix& pnd_agenda_input,
558 const Numeric& scat_species_a,
559 const Numeric& scat_species_b,
564 const Numeric& t_min,
565 const Numeric& t_max,
574 pnd_agenda_input_names,
591 Tensor3& dpsd_data_dx,
592 const Vector& psd_size_grid,
593 const Vector& pnd_agenda_input_t,
594 const Matrix& pnd_agenda_input,
597 const Numeric& scat_species_a,
598 const Numeric& scat_species_b,
599 const Numeric& n_alpha,
602 const Numeric& gamma,
603 const Numeric& t_min,
604 const Numeric& t_max,
613 pnd_agenda_input_names,
633 Tensor3& dpsd_data_dx,
634 const Vector& psd_size_grid,
635 const Vector& pnd_agenda_input_t,
636 const Matrix& pnd_agenda_input,
643 const Numeric& alpha,
645 const Numeric& t_min,
646 const Numeric& t_max,
647 const Numeric& dm_min,
655 "The number of columns in *pnd_agenda_input* must "
659 const bool n0_depend = (Index)n0 == -999;
660 const bool dm_depend = (Index)dm == -999;
661 const bool iwc_depend = (Index)iwc == -999;
664 const bool iwc_fixed = !(std::isnan(iwc)) && !iwc_depend;
665 const bool n0_fixed = !(std::isnan(n0)) && !n0_depend;
666 const bool dm_fixed = !(std::isnan(dm)) && !dm_depend;
669 (nin + iwc_fixed + n0_fixed + dm_fixed == 1)),
670 "This PSD can have one or two independent parameters, that is \n"
671 "the sum of the number of columns in pnd_agenda_input and\n"
672 "non-NAN, non-dependent values in iwc, n0, dm must be equal to\n"
679 if ((n0_depend || dm_depend) && (!iwc_fixed)) {
683 if ((!n0_depend) && (!n0_fixed)) {
687 if ((!dm_depend) && (!dm_fixed)) {
695 for (Index i = 0; i < ndx; ++i) {
696 for (Index j = 0; j < 3; ++j) {
697 if (dx2in[i] == i_pai[j]) {
705 if (psd_size_grid[0] < std::numeric_limits<Numeric>::epsilon()) {
707 "psd_size_grid has only one element which is 0. This is not allowed.");
710 Numeric iwc_p(0.0), n0_p(0.0), dm_p(0.0);
712 for (Index ip = 0; ip < np; ip++) {
713 Numeric t = pnd_agenda_input_t[ip];
717 iwc_p = pnd_agenda_input(ip, i_pai[0]);
720 n0_p = pnd_agenda_input(ip, i_pai[1]);
723 dm_p = pnd_agenda_input(ip, i_pai[2]);
726 if (n0_depend && dm_depend) {
729 }
else if (n0_depend) {
731 }
else if (dm_depend) {
736 if ((t < t_min) || (t > t_max)) {
738 "Method called with a temperature of ", t,
" K.\n"
739 "This is outside the specified allowed range: [ max(0.,", t_min,
746 "The provided or inferred value of *Dm* (", dm_p,
") is "
747 " less than zero or *Dm_min* and this is not allowed. "
748 "This means that you have very small or zero values "
749 "in *pnd_agenda_input* which is not supported "
754 Matrix jac_data(1, nsi);
755 Vector x_grid(psd_size_grid);
756 x_grid *= 1.0 / dm_p;
758 if (x_grid[0] < std::numeric_limits<Numeric>::epsilon()) {
759 x_grid[0] = 0.1 * psd_size_grid[1];
763 psd_data(ip, joker), jac_data, x_grid, alpha, beta);
764 psd_data(ip, joker) *= n0_p;
765 jac_data(0, joker) *= n0_p;
767 Vector dndx{jac_data(0, joker)};
768 Vector dndn0{psd_data(ip, joker)};
769 dndn0 *= (1.0 / n0_p);
771 Vector dxddm = x_grid;
772 dxddm *= (-1.0 / dm_p);
773 Numeric dn0diwc = n0_p / iwc_p;
776 dpsd_data_dx(i_jac[0], ip, joker) = 0.0;
779 Numeric ddmdiwc = 0.25 * dm_p / iwc_p;
780 Vector dndiwc = dxddm;
783 dpsd_data_dx(i_jac[0], ip, joker) += dndiwc;
784 }
else if (n0_depend) {
785 Vector dndiwc = dndn0;
787 dpsd_data_dx(i_jac[0], ip, joker) += dndiwc;
792 dpsd_data_dx(i_jac[1], ip, joker) = dndn0;
794 Vector dndn02 = dndx;
796 Numeric ddmdn0 = -0.25 / n0_p * dm_p;
798 dpsd_data_dx(i_jac[1], ip, joker) += dndn02;
803 dpsd_data_dx(i_jac[2], ip, joker) = dxddm;
804 dpsd_data_dx(i_jac[2], ip, joker) *= dndx;
806 Vector dndn02 = dndn0;
807 Numeric dn0ddm = -4.0 * n0_p / dm_p;
809 dpsd_data_dx(i_jac[2], ip, joker) += dndn02;
814 if ((!iwc_depend) && (iwc_p == 0.0)) {
815 psd_data(0, joker) = 0.0;
816 for (
size_t i = 0; i < 2; ++i) {
818 dpsd_data_dx(i_jac[i], ip, joker) = 0.0;
827 Tensor3& dpsd_data_dx,
828 const Vector& psd_size_grid,
829 const Vector& pnd_agenda_input_t,
830 const Matrix& pnd_agenda_input,
833 const Numeric& scat_species_a,
834 const Numeric& scat_species_b,
836 const Numeric& t_min,
837 const Numeric& t_max,
838 const Numeric& t_min_psd,
839 const Numeric& t_max_psd,
840 const Numeric& b_min,
841 const Numeric& b_max,
849 "*pnd_agenda_input* must have one column.");
851 "regime must either be \"TR\" or \"ML\".");
853 "*scat_species_a* should be > 0.");
855 "Method called with a mass-dimension-relation exponent b of ",
856 scat_species_b,
".\n"
857 "This is outside the specified allowed range: [", b_min,
",",
860 for (Index ip = 0; ip < np; ip++) {
862 Numeric swc = pnd_agenda_input(ip, 0);
863 Numeric t = pnd_agenda_input_t[ip];
867 if (abs(swc) < 1e-15) {
872 if ((swc == 0.) && (!ndx)) {
877 if (t < t_min || t > t_max) {
879 "Method called with a temperature of ", t,
" K.\n"
880 "This is outside the specified allowed range: [ max(0.,", t_min,
889 }
else if (t > t_max_psd) {
894 Numeric psd_weight = 1.0;
910 for (Index i = 0; i < nsi; i++) {
911 psd_data(ip, i) = psd_weight * psd_1p[i];
918 const Numeric dswc = 1e-9;
919 const Numeric swcp = swc + dswc;
927 for (Index i = 0; i < nsi; i++) {
928 dpsd_data_dx(0, ip, i) = (psd_1p[i] - psd_data(ip, i)) / dswc;
936 Tensor3& dpsd_data_dx,
937 const Vector& psd_size_grid,
938 const Vector& pnd_agenda_input_t,
939 const Matrix& pnd_agenda_input,
942 const Numeric& scat_species_a,
943 const Numeric& scat_species_b,
944 const Numeric& t_min,
945 const Numeric& t_max,
946 const Numeric& t_min_psd,
947 const Numeric& t_max_psd,
956 "*pnd_agenda_input* must have one column.");
958 "Jacobian calculations and \"noisy\" can not be "
961 "This PSD treats pure ice, using Dveq as size grid.\n"
962 "This means that *scat_species_b* should be close to 3,\n"
963 "but it is outside of the tolerated range of [2.9,3.1].\n"
964 "Your value of *scat_species_b* is: ", scat_species_b)
966 "This PSD treats pure ice, using Dveq as size grid.\n"
967 "This means that *scat_species_a* should be close to 480,\n"
968 "but it is outside of the tolerated range of [460,500].\n"
969 "Your value of *scat_species_a* is: ", scat_species_a)
971 for (Index ip = 0; ip < np; ip++) {
973 Numeric iwc = pnd_agenda_input(ip, 0);
974 Numeric t = pnd_agenda_input_t[ip];
977 if ((iwc == 0.) && (!ndx)) {
982 if (t < t_min || t > t_max) {
984 "Method called with a temperature of ", t,
" K.\n"
985 "This is outside the specified allowed range: [ max(0.,", t_min,
994 }
else if (t > t_max_psd) {
999 Numeric psd_weight = 1.0;
1009 for (Index i = 0; i < nsi; i++) {
1010 psd_data(ip, i) = psd_weight * psd_1p[i];
1017 const Numeric diwc = 1e-9;
1018 const Numeric iwcp = iwc + diwc;
1020 for (Index i = 0; i < nsi; i++) {
1021 dpsd_data_dx(0, ip, i) = (psd_1p[i] - psd_data(ip, i)) / diwc;
1033 Tensor3& dpsd_data_dx,
1034 const Vector& psd_size_grid,
1035 const Vector& pnd_agenda_input_t,
1036 const Matrix& pnd_agenda_input,
1039 const Numeric& scat_species_a,
1040 const Numeric& scat_species_b,
1041 const Numeric& t_min,
1042 const Numeric& t_max,
1051 pnd_agenda_input_names,
1067 Tensor3& dpsd_data_dx,
1068 const Vector& psd_size_grid,
1069 const Vector& pnd_agenda_input_t,
1070 const Matrix& pnd_agenda_input,
1073 const Numeric& scat_species_a,
1074 const Numeric& scat_species_b,
1075 const Numeric& t_min,
1076 const Numeric& t_max,
1085 pnd_agenda_input_names,
1105 Tensor3& dpsd_data_dx,
1106 const Vector& psd_size_grid,
1107 const Vector& pnd_agenda_input_t,
1108 const Matrix& pnd_agenda_input,
1111 const Numeric& scat_species_a,
1112 const Numeric& scat_species_b,
1113 const Numeric& t_min,
1114 const Numeric& t_max,
1123 pnd_agenda_input_names,
1143 Tensor3& dpsd_data_dx,
1144 const Vector& psd_size_grid,
1145 const Vector& pnd_agenda_input_t,
1146 const Matrix& pnd_agenda_input,
1149 const String& hydrometeor_type,
1150 const Numeric& t_min,
1151 const Numeric& t_max,
1155 const Index nin = pnd_agenda_input_names.
nelem();
1156 const Index ndx = dpnd_data_dx_names.
nelem();
1157 const Index np = pnd_agenda_input.nrows();
1158 const Index nsi = psd_size_grid.nelem();
1162 "Length of *pnd_agenda_input_names* and number of "
1163 "columns in *pnd_agenda_input* must be equal.");
1165 "*pnd_agenda_input* must have two columns"
1166 "(mass density and number density).");
1169 "*dpnd_data_dx_names* must have length <=2.");
1174 for (Index i = 0; i < nin; i++) {
1175 if ((Index)pnd_agenda_input_names[i].find(
"mass_density") !=
String::npos) {
1177 }
else if ((Index)pnd_agenda_input_names[i].find(
"number_density") !=
1184 "mass_density-tag not found ");
1186 "number_density-tag not found ");
1191 for (Index i = 0; i < ndx; i++) {
1192 if ((Index)dpnd_data_dx_names[i].find(
"mass_density") !=
String::npos) {
1193 dpnd_data_dx_idx[0] = i;
1194 }
else if ((Index)dpnd_data_dx_names[i].find(
"number_density") !=
1196 dpnd_data_dx_idx[1] = i;
1201 psd_data.resize(np, nsi);
1204 dpsd_data_dx.resize(ndx, np, nsi);
1207 dpsd_data_dx.resize(0, 0, 0);
1210 for (Index ip = 0; ip < np; ip++) {
1212 Numeric WC = pnd_agenda_input(ip, input_idx[0]);
1213 Numeric N_tot = pnd_agenda_input(ip, input_idx[1]);
1214 Numeric t = pnd_agenda_input_t[ip];
1217 if ((WC == 0.) && (!ndx)) {
1222 if (t < t_min || t > t_max) {
1224 "Method called with a temperature of ", t,
" K.\n"
1225 "This is outside the specified allowed range: [ max(0.,", t_min,
1232 Numeric psd_weight = 1.0;
1240 Matrix dpsd_1p(nsi, 2);
1242 psd_SB06(psd_1p, dpsd_1p, psd_size_grid, N_tot, WC, hydrometeor_type);
1244 for (Index i = 0; i < nsi; i++) {
1245 psd_data(ip, i) = psd_weight * psd_1p[i];
1247 for (Index idx = 0; idx < dpnd_data_dx_idx.
nelem(); idx++) {
1250 if (dpnd_data_dx_idx[idx] != -1) {
1251 dpsd_data_dx(dpnd_data_dx_idx[idx], ip, i) =
1252 psd_weight * dpsd_1p(i, idx);
1262 Tensor3& dpsd_data_dx,
1263 const Vector& psd_size_grid,
1264 const Vector& pnd_agenda_input_t,
1265 const Matrix& pnd_agenda_input,
1268 const String& hydrometeor_type,
1269 const Numeric& t_min,
1270 const Numeric& t_max,
1274 const Index nin = pnd_agenda_input_names.
nelem();
1275 const Index ndx = dpnd_data_dx_names.
nelem();
1276 const Index np = pnd_agenda_input.nrows();
1277 const Index nsi = psd_size_grid.nelem();
1281 "Length of *pnd_agenda_input_names* and number of "
1282 "columns in *pnd_agenda_input* must be equal.");
1284 "*pnd_agenda_input* must have two columns"
1285 "(mass density and number density).");
1288 "*dpnd_data_dx_names* must have length <=2.");
1293 for (Index i = 0; i < nin; i++) {
1294 if ((Index)pnd_agenda_input_names[i].find(
"mass_density") !=
String::npos) {
1296 }
else if ((Index)pnd_agenda_input_names[i].find(
"number_density") !=
1303 "mass_density-tag not found ");
1305 "number_density-tag not found ");
1310 for (Index i = 0; i < ndx; i++) {
1311 if ((Index)dpnd_data_dx_names[i].find(
"mass_density") !=
String::npos) {
1312 dpnd_data_dx_idx[0] = i;
1313 }
else if ((Index)dpnd_data_dx_names[i].find(
"number_density") !=
1315 dpnd_data_dx_idx[1] = i;
1320 psd_data.resize(np, nsi);
1323 dpsd_data_dx.resize(ndx, np, nsi);
1326 dpsd_data_dx.resize(0, 0, 0);
1329 for (Index ip = 0; ip < np; ip++) {
1331 Numeric WC = pnd_agenda_input(ip, input_idx[0]);
1332 Numeric N_tot = pnd_agenda_input(ip, input_idx[1]);
1333 Numeric t = pnd_agenda_input_t[ip];
1336 if ((WC == 0.) && (!ndx)) {
1341 if (t < t_min || t > t_max) {
1343 "Method called with a temperature of ", t,
" K.\n"
1344 "This is outside the specified allowed range: [ max(0.,", t_min,
1351 Numeric psd_weight = 1.0;
1359 Matrix dpsd_1p(nsi, 2);
1361 psd_MY05(psd_1p, dpsd_1p, psd_size_grid, N_tot, WC, hydrometeor_type);
1363 for (Index i = 0; i < nsi; i++) {
1364 psd_data(ip, i) = psd_weight * psd_1p[i];
1366 for (Index idx = 0; idx < dpnd_data_dx_idx.
nelem(); idx++) {
1369 if (dpnd_data_dx_idx[idx] != -1) {
1370 dpsd_data_dx(dpnd_data_dx_idx[idx], ip, i) =
1371 psd_weight * dpsd_1p(i, idx);
This file contains the definition of Array.
The global header file for ARTS.
Index nelem() const ARTS_NOEXCEPT
static const Index npos
Define npos:
#define ARTS_ASSERT(condition,...)
#define ARTS_USER_ERROR_IF(condition,...)
void psdModifiedGammaMassXmean(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdModifiedGammaMassXmean.
void psdMonoMass(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const ArrayOfArrayOfScatteringMetaData &scat_meta, const Index &species_index, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdMonoMass.
void psdFieldEtAl07(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const String ®ime, const Numeric &t_min, const Numeric &t_max, const Numeric &t_min_psd, const Numeric &t_max_psd, const Numeric &b_min, const Numeric &b_max, const Index &picky, const Verbosity &)
WORKSPACE METHOD: psdFieldEtAl07.
void psdModifiedGammaMassNtot(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdModifiedGammaMassNtot.
void psdModifiedGammaMass(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &)
WORKSPACE METHOD: psdModifiedGammaMass.
void psdMcFarquaharHeymsfield97(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &t_min, const Numeric &t_max, const Numeric &t_min_psd, const Numeric &t_max_psd, const Index &picky, const Index &noisy, const Verbosity &)
WORKSPACE METHOD: psdMcFarquaharHeymsfield97.
void psdDelanoeEtAl14(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &iwc, const Numeric &n0, const Numeric &dm, const Numeric &rho, const Numeric &alpha, const Numeric &beta, const Numeric &t_min, const Numeric &t_max, const Numeric &dm_min, const Index &picky, const Verbosity &)
WORKSPACE METHOD: psdDelanoeEtAl14.
void psdModifiedGammaMassSingleMoment(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n_alpha, const Numeric &n_b, const Numeric &mu, const Numeric &gamma, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdModifiedGammaMassSingleMoment.
void psdMonoDispersive(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const ArrayOfArrayOfScatteringMetaData &scat_meta, const Index &species_index, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdMonoDispersive.
void psdModifiedGammaMassMeanParticleMass(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdModifiedGammaMassMeanParticleMass.
void psdSeifertBeheng06(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const String &hydrometeor_type, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &)
WORKSPACE METHOD: psdSeifertBeheng06.
void psdModifiedGammaMassXmedian(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdModifiedGammaMassXmedian.
void psdAbelBoutle12(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdAbelBoutle12.
void psdWangEtAl16(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdWangEtAl16.
void psdFieldEtAl19(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &verbosity)
WORKSPACE METHOD: psdFieldEtAl19.
void psdMilbrandtYau05(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const String &hydrometeor_type, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &)
WORKSPACE METHOD: psdMilbrandtYau05.
void psdModifiedGamma(Matrix &psd_data, Tensor3 &dpsd_data_dx, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &)
WORKSPACE METHOD: psdModifiedGamma.
void delanoe_shape_with_derivative(VectorView psd, MatrixView jac_data, const Vector &x, const Numeric &alpha, const Numeric &beta)
! Shape functions for normalized PSD.
void mgd_with_derivatives(VectorView psd, MatrixView jac_data, const Vector &x, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const bool &do_n0_jac, const bool &do_mu_jac, const bool &do_la_jac, const bool &do_ga_jac)
Declarations having to do with the four output streams.
This file contains declerations of functions of physical character.
void psd_snow_F07(Vector &psd, const Vector &diameter, const Numeric &swc, const Numeric &t, const Numeric alpha, const Numeric beta, const String ®ime)
The F07 snow PSD.
void psd_MY05(Vector &psd, Matrix &dpsd, const Vector &diameter_max, const Numeric N_tot, const Numeric WC, const String psd_type)
void psd_mgd_mass_and_something(Matrix &psd_data, Tensor3 &dpsd_data_dx, const String &something, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n0, const Numeric &mu, const Numeric &la, const Numeric &ga, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &)
Code common to MGD PSD involving the integrated mass.
Numeric n0_from_t(Numeric t)
Sets N0star based on temperature.
void psd_cloudice_MH97(Vector &psd, const Vector &diameter, const Numeric &iwc, const Numeric &t, const bool noisy)
The MH97 cloud ice PSD.
void psd_mono_common(Matrix &psd_data, Tensor3 &dpsd_data_dx, const String &type, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const ArrayOfArrayOfScatteringMetaData &scat_meta, const Index &species_index, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &)
Code common to PSDs of mono type.
Numeric n0_from_iwc_dm(Numeric iwc, Numeric dm, Numeric rho)
Derives N0star from IWC and Dm.
Numeric dm_from_iwc_n0(Numeric iwc, Numeric n0, Numeric rho)
Derives Dm from IWC and N0star.
void psd_SB06(Vector &psd, Matrix &dpsd, const Vector &mass, const Numeric &N_tot, const Numeric &WC, const String &hydrometeor_type)
void psd_mgd_smm_common(Matrix &psd_data, Tensor3 &dpsd_data_dx, const String &psd_name, const Vector &psd_size_grid, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const Numeric &scat_species_a, const Numeric &scat_species_b, const Numeric &n_alpha_in, const Numeric &n_b_in, const Numeric &mu_in, const Numeric &gamma_in, const Numeric &t_min, const Numeric &t_max, const Index &picky, const Verbosity &)
Code common to a number of modified gamma PSDs used with single-moment mass schemes.
Internal functions associated with size distributions.
#define START_OF_PSD_METHODS()