79 const Index& scat_data_checked,
93 "*scat_data* and *pnd_agenda_array* are inconsistent "
96 "*scat_data* and *pnd_agenda_array_input_names* are "
97 "inconsistent in size.");
99 "This method requires one-moment PSDs, but *pnd_agenda_array_input_names* "
100 "for the selected scattering species does not have length one.");
102 "The scat_data must be flagged to have passed a "
103 "consistency check (scat_data_checked=1).");
106 hydrotable.
set_name(
"Table of particle optical properties");
110 hydrotable.
set_grid(0, {
"Extinction [m-1]",
111 "Single scattering albedo [-]",
112 "Asymmetry parameter [-]",
113 "Radar reflectivity [m2]"});
122 const Index nsa = 361;
129 Matrix pnd_agenda_input(nt, 1);
138 for (
Index iw = 0; iw < nw; iw++) {
140 pnd_agenda_input = wc_grid[iw];
147 pnd_agenda_array_input_names[iss],
166 for (
Index iv = 0; iv < nf; iv++) {
167 for (
Index it = 0; it < nt; it++) {
168 hydrotable.
data(0,iv,it,iw) = ext(iv,it);
169 hydrotable.
data(1,iv,it,iw) = 1.0 - (
abs(iv,it) / ext(iv,it));
172 hydrotable.
data(3,iv,it,iw) = fourpi * pfun(iv,it,nsa-1);
186 particle_masses.
resize(np_total, 1);
189 for (
Index i_ss = 0; i_ss < scat_meta.
nelem(); i_ss++) {
190 for (
Index i_se = 0; i_se < scat_meta[i_ss].
nelem(); i_se++) {
192 scat_meta[i_ss][i_se].mass <= 0 || scat_meta[i_ss][i_se].mass > 1.,
193 "A presumably incorrect value found for "
194 "scat_meta[", i_ss,
"][", i_se,
"].mass.\n"
195 "The value is ", scat_meta[i_ss][i_se].mass)
197 particle_masses(i_se_flat, 0) = scat_meta[i_ss][i_se].mass;
212 particle_masses = 0.;
216 for (
Index i_ss = 0; i_ss < scat_meta.
nelem(); i_ss++) {
217 for (
Index i_se = 0; i_se < scat_meta[i_ss].
nelem(); i_se++) {
219 scat_meta[i_ss][i_se].mass <= 0 || scat_meta[i_ss][i_se].mass > 1.,
220 "A presumably incorrect value found for "
221 "scat_meta[", i_ss,
"][", i_se,
"].mass.\n"
222 "The value is ", scat_meta[i_ss][i_se].mass)
224 particle_masses(i_se_flat, i_ss) = scat_meta[i_ss][i_se].mass;
233 const Vector& pnd_size_grid,
235 const Vector& psd_size_grid,
237 const Index& quad_order,
243 const bool do_dx = !dpsd_data_dx.
empty();
247 "The method requires that length of *psd_size_grid* is >= 2.");
249 "So far, the method requires that *psd_size_grid* and "
250 "*pnd_size_grid* have same length.");
251 for (
Index i = 0; i < ng; i++) {
253 "So far, the method requires that *psd_size_grid* and "
254 "*pnd_size_grid* are identical.");
257 "Number of columns in *psd_data* and length of "
258 "*psd_size_grid* must match.");
263 "Number of columns in *dpsd_data_dx* and length of "
264 "*psd_size_grid* must match.");
265 ndx = dpsd_data_dx.
npages();
266 dpnd_data_dx.
resize(ndx, np, ng);
268 dpnd_data_dx.
resize(0, 0, 0);
274 Vector psd_size_grid_sorted(ng);
276 for (
Index i = 0; i < ng; i++)
277 psd_size_grid_sorted[i] = psd_size_grid[intarr[i]];
280 "*psd_size_grid* is not allowed to contain "
281 "duplicate values.");
287 for (
Index i = 0; i < ng; i++) {
288 for (
Index ip = 0; ip < np; ip++) {
289 pnd_data(ip, intarr[i]) = quadweights[i] * psd_data(ip, intarr[i]);
293 for (
Index ip = 0; ip < np; ip++) {
294 for (
Index ix = 0; ix < ndx; ix++) {
295 dpnd_data_dx(ix, ip, intarr[i]) =
296 quadweights[i] * dpsd_data_dx(ix, ip, intarr[i]);
306 const Vector& pnd_size_grid,
308 const Vector& psd_size_grid,
312 const Index& scat_data_checked,
313 const Index& quad_order,
314 const Index& scat_index,
323 const bool do_dx = !dpsd_data_dx.
empty();
327 "The method requires that length of *psd_size_grid* is >= 3.");
329 "So far, the method requires that *psd_size_grid* and"
330 " *pnd_size_grid* have the same length.");
331 for (
Index i = 0; i < ng; i++) {
333 "So far, the method requires that *psd_size_grid* and"
334 " *pnd_size_grid* are identical.");
337 "Number of columns in *psd_data* and length of"
338 " *psd_size_grid* must match.");
343 "Number of columns in *dpsd_data_dx* and length of"
344 " *psd_size_grid* must match.");
345 ndx = dpsd_data_dx.
npages();
346 dpnd_data_dx.
resize(ndx, np, ng);
348 dpnd_data_dx.
resize(0, 0, 0);
352 "*scat_data* must have passed a consistency check"
353 " (scat_data_checked=1).\n"
354 "Alternatively, use *pndFromPsdBasic*.");
356 "*scat_index* exceeds the number of available"
357 " scattering species.");
359 "Number of scattering elements in this scattering"
360 " species (*scat_index*) inconsistent with length of"
361 " *pnd_size_grid*.");
366 Vector psd_size_grid_sorted(ng);
368 for (
Index i = 0; i < ng; i++)
369 psd_size_grid_sorted[i] = psd_size_grid[intarr[i]];
372 "*psd_size_grid* is not allowed to contain "
373 "duplicate values.");
379 for (
Index i = 0; i < ng;
382 for (
Index ip = 0; ip < np; ip++)
384 pnd_data(ip, intarr[i]) = quadweights[i] * psd_data(ip, intarr[i]);
388 for (
Index ip = 0; ip < np; ip++) {
389 for (
Index ix = 0; ix < ndx; ix++) {
390 dpnd_data_dx(ix, ip, intarr[i]) =
391 quadweights[i] * dpsd_data_dx(ix, ip, intarr[i]);
400 Matrix bulkext(np, nf, 0.);
401 Vector ext(nf), ext_s0(nf), ext_s1(nf), ext_l0(nf), ext_l1(nf);
445 for (
Index ise = 0; ise < ng;
448 if (sds[intarr[ise]].ext_mat_data.nshelves() > 1)
449 ext = sds[intarr[ise]].ext_mat_data(
joker, 0, 0, 0, 0);
451 ext = sds[intarr[ise]].ext_mat_data(0, 0, 0, 0, 0);
458 else if (ise == ng - 2)
460 else if (ise == ng - 1)
463 for (
Index ip = 0; ip < np; ip++)
464 if (
abs(pnd_data(ip,
joker).sum()) > 0.)
465 for (
Index f = fstart; f < (fstart + nf); f++)
466 bulkext(ip, f) += pnd_data(ip, intarr[ise]) * ext[f];
470 for (
Index ip = 0; ip < np; ip++)
472 max0 =
max(
abs(pnd_data(ip, intarr[0])), max0);
473 max1 =
max(
abs(pnd_data(ip, intarr[ng - 1])), max1);
477 for (
Index ip = 0; ip < np; ip++)
479 if (
abs(pnd_data(ip,
joker).sum()) > 0.) {
480 for (
Index f = fstart; f < (fstart + nf); f++) {
496 if (
abs(bulkext(ip, f)) > 1e-2 * threshold_bext) {
498 ext_s0[f] *
abs(psd_data(ip, intarr[0])) >=
499 ext_s1[f] *
abs(psd_data(ip, intarr[1])),
500 " Bin-width normalized extinction (ext*psd) not decreasing"
501 " at small size edge\n"
502 " at atm level #", ip,
" and freq point #", f,
".\n"
503 " ext_s0=", ext_s0[f],
504 ", psd_s0=",
abs(psd_data(ip, intarr[0])),
505 ", ext_s0*psd_s0=", ext_s0[f] *
abs(psd_data(ip, intarr[0])),
507 " ext_s1=", ext_s1[f],
508 ", psd_s1=",
abs(psd_data(ip, intarr[1])),
509 ", ext_s1*psd_s1=", ext_s1[f] *
abs(psd_data(ip, intarr[1])),
511 " Total bulk ext = ",
abs(bulkext(ip, f)),
"\n"
512 " Need to add smaller sized particles!\n")
515 ext_l0[f] *
abs(psd_data(ip, intarr[ng - 1])) >=
516 ext_l1[f] *
abs(psd_data(ip, intarr[ng - 2])),
517 "Bin-width normalized extinction (ext*psd) not decreasing"
518 " at large size edge\n"
519 "at atm level #", ip,
" and freq point #", f,
".\n"
520 " ext_l0=", ext_l0[f],
521 ", psd_l0=",
abs(psd_data(ip, intarr[ng - 1])),
523 ext_l0[f] *
abs(psd_data(ip, intarr[ng - 1])),
525 " ext_l1=", ext_l1[f],
526 ", psd_l1=",
abs(psd_data(ip, intarr[ng - 2])),
528 ext_l1[f] *
abs(psd_data(ip, intarr[ng - 2])),
"\n"
529 " Total bulk ext = ",
abs(bulkext(ip, f)),
"\n"
530 " Need to add larger sized particles!\n")
535 if (
abs(bulkext(ip, f)) > threshold_bext) {
536 if (
abs(pnd_data(ip, intarr[0])) > threshold_rpnd * max0) {
538 abs(pnd_data(ip, intarr[0])) * ext_s0[f] /
abs(bulkext(ip, f));
543 threshold_rsec *
abs(bulkext(ip, f)),
544 "Contribution of edge bin to total extinction too high"
545 " (", contrib * 1e2,
"% of ",
abs(bulkext(ip, f)),
546 ") at small size edge\n"
547 "at atm level #", ip,
" and freq point #", f,
".\n"
548 " Need to add smaller sized particles or refine the size"
549 " grid on the small size edge!\n")
551 if (
abs(pnd_data(ip, intarr[ng - 1])) > threshold_rpnd * max1) {
552 contrib =
abs(pnd_data(ip, intarr[ng - 1])) * ext_l0[f] /
558 threshold_rsec *
abs(bulkext(ip, f)),
559 "Contribution of edge bin to total extinction too high"
560 " (", contrib * 1e2,
"% of ",
abs(bulkext(ip, f)),
561 ") at large size edge\n"
562 "at atm level #", ip,
" and freq point #", f,
".\n"
563 " Need to add larger sized particles or refine the size"
564 " grid on the large size edge!\n")
579 const Index& atmosphere_dim,
584 const Index& cloudbox_on,
589 const Tensor4& particle_bulkprop_field,
593 const Index& jacobian_do,
603 "*particle_bulkprop_field* is empty.");
608 chk_atm_field(
"t_field", t_field, atmosphere_dim, p_grid, lat_grid, lon_grid);
610 particle_bulkprop_field,
612 particle_bulkprop_names.
nelem(),
621 particle_bulkprop_names.
nelem() != particle_bulkprop_field.
nbooks(),
622 "Number of fields in *particle_bulkprop_field*"
623 " inconsistent with number of names in"
624 " *particle_bulkprop_names*.");
626 "At least one field per scattering species required"
627 " in *particle_bulkprop_field*.");
630 "Length of *cloudbox_limits* incorrect with respect "
631 "to *atmosphere_dim*.");
632 ARTS_USER_ERROR_IF (cloudbox_limits[1] <= cloudbox_limits[0] || cloudbox_limits[0] < 0 ||
633 cloudbox_limits[1] >= p_grid.
nelem(),
634 "Invalid data in pressure part of *cloudbox_limits*.");
635 if (atmosphere_dim > 1) {
636 ARTS_USER_ERROR_IF (cloudbox_limits[3] <= cloudbox_limits[2] || cloudbox_limits[2] < 0 ||
637 cloudbox_limits[3] >= lat_grid.
nelem(),
638 "Invalid data in latitude part of *cloudbox_limits*.");
639 if (atmosphere_dim > 2) {
640 ARTS_USER_ERROR_IF (cloudbox_limits[5] <= cloudbox_limits[4] || cloudbox_limits[4] < 0 ||
641 cloudbox_limits[5] >= lon_grid.
nelem(),
642 "Invalid data in longitude part of *cloudbox_limits*.");
648 "*scat_data* and *scat_species* are inconsistent in size.");
650 "*scat_data* and *scat_meta* are inconsistent in size.");
652 "*scat_data* and *pnd_agenda_array* are inconsistent "
655 "*scat_data* and *pnd_agenda_array_input_names* are "
656 "inconsistent in size.");
660 const Index np = cloudbox_limits[1] - cloudbox_limits[0] + 1;
661 Index np_nonzero = np;
662 Index ip_offset = cloudbox_limits[0];
665 Index ilat_offset = 0;
666 if (atmosphere_dim > 1) {
667 nlat = cloudbox_limits[3] - cloudbox_limits[2] + 1;
668 ilat_offset = cloudbox_limits[2];
671 Index ilon_offset = 0;
672 if (atmosphere_dim > 2) {
673 nlon = cloudbox_limits[5] - cloudbox_limits[4] + 1;
674 ilon_offset = cloudbox_limits[4];
679 constexpr std::string_view estring =
680 "*particle_bulkprop_field* allowed to contain"
681 " non-zero values only inside the cloudbox.";
683 if (cloudbox_limits[0] != 0) {
686 min(particle_bulkprop_field(
693 if (cloudbox_limits[1] != p_grid.
nelem() - 1) {
694 const Index np_above = p_grid.
nelem() + 1 - (np + ip_offset);
697 min(particle_bulkprop_field(
706 for (
Index i = 0; i < nss; i++) {
708 "*scat_data* and *scat_meta* have inconsistent sizes.");
709 ncumse[i + 1] = ncumse[i] + scat_data[i].
nelem();
714 pnd_field.
resize(ncumse[nss], np, nlat, nlon);
722 dpnd_field_dx.resize(0);
724 nq = jacobian_quantities.
nelem();
725 dpnd_field_dx.resize(nq);
726 scatspecies_to_jq.resize(nss);
728 for (
Index iq = 0; iq < nq; iq++) {
729 if (jacobian_quantities[iq] == Jacobian::Special::ScatteringString) {
731 find_first(scat_species, jacobian_quantities[iq].Subtag());
733 "Jacobian quantity with index ", iq,
" refers to\n"
734 " ", jacobian_quantities[iq].Subtag(),
735 "\nbut this species could not be found in *scat_species*.")
736 scatspecies_to_jq[ihit].push_back(iq);
737 dpnd_field_dx[iq].resize(ncumse[nss], np, nlat, nlon);
738 dpnd_field_dx[iq] = 0.0;
744 for (
Index is = 0; is < nss; is++) {
746 Range se_range(ncumse[is], ncumse[is + 1] - ncumse[is]);
750 const Index nin = pnd_agenda_array_input_names[is].
nelem();
753 for (
Index i = 0; i < nin; i++) {
754 i_pbulkprop[i] =
find_first(particle_bulkprop_names,
755 pnd_agenda_array_input_names[is][i]);
757 "Pnd-agenda with index ", is,
" is set to require \"",
758 pnd_agenda_array_input_names[is][i],
"\",\nbut this quantity "
759 "could not found in *particle_bulkprop_names*.\n"
760 "(Note that temperature must be written as \"Temperature\")")
769 ndx = scatspecies_to_jq[is].
nelem();
770 dpnd_data_dx_names.resize(ndx);
771 for (
Index ix = 0; ix < ndx; ix++) {
772 dpnd_data_dx_names[ix] =
773 jacobian_quantities[scatspecies_to_jq[is][ix]].SubSubtag();
778 for (
Index ilon = 0; ilon < nlon; ilon++) {
779 for (
Index ilat = 0; ilat < nlat; ilat++) {
782 if ((nlat > 1 && (ilat == 0 || ilat == nlat - 1)) ||
783 (nlon > 1 && (ilon == 0 || ilon == nlon - 1))) {
787 Matrix pnd_agenda_input(np_nonzero, nin);
789 for (
Index i = 0; i < nin; i++) {
790 for (
Index ip = 0; ip < np_nonzero; ip++) {
791 pnd_agenda_input(ip, i) =
792 particle_bulkprop_field(i_pbulkprop[i],
799 Vector pnd_agenda_input_t(np);
801 for (
Index ip = 0; ip < np_nonzero; ip++) {
802 pnd_agenda_input_t[ip] =
803 t_field(ip_offset + ip, ilat_offset + ilat, ilon_offset + ilon);
816 pnd_agenda_array_input_names[is],
821 for (
Index ip = 0; ip < np_nonzero; ip++) {
822 pnd_field(se_range, pf_offset+ip, ilat, ilon) = pnd_data(ip,
joker);
824 for (
Index ix = 0; ix < ndx; ix++) {
825 for (
Index ip = 0; ip < np_nonzero; ip++) {
826 dpnd_field_dx[scatspecies_to_jq[is][ix]](se_range, pf_offset+ip, ilat, ilon) =
827 dpnd_data_dx(ix, ip,
joker);
842 const Index& species_index,
846 const Index& do_only_x,
852 "Selected scattering species index is ", species_index,
854 "is not allowed since *scat_meta* has only ", nss,
" elements.")
856 const Index nse = scat_meta[species_index].
nelem();
858 "The scattering species must have at least two "
859 "elements to use this method.");
865 for (
Index i = 0; i < nse; i++) {
866 mass[i] = scat_meta[species_index][i].mass;
871 scat_species_x.
resize(nse);
873 if (x_unit ==
"dveq") {
874 for (
Index i = 0; i < nse; i++) {
875 scat_species_x[i] = scat_meta[species_index][i].diameter_volume_equ;
890 else if (x_unit ==
"dmax") {
891 for (
Index i = 0; i < nse; i++) {
892 scat_species_x[i] = scat_meta[species_index][i].diameter_max;
907 else if (x_unit ==
"area") {
908 for (
Index i = 0; i < nse; i++) {
910 scat_meta[species_index][i].diameter_area_equ_aerodynamical;
925 else if (x_unit ==
"mass") {
926 scat_species_x = mass;
933 ARTS_USER_ERROR (
"You have selected the x_unit: ", x_unit,
"\nwhile accepted "
934 "choices are: \"dveq\", \"dmax\", \"mass\" and \"area\"")
This file contains the definition of Array.
Index TotalNumberOfElements(const Array< Array< base > > &aa)
Determine total number of elements in an ArrayOfArray.
Index find_first(const Array< base > &x, const base &w)
Find first occurance.
base max(const Array< base > &x)
Max function.
base min(const Array< base > &x)
Min function.
The global header file for ARTS.
Constants of physical expressions as constexpr.
void pnd_agenda_arrayExecute(Workspace &ws, Matrix &pnd_data, Tensor3 &dpnd_data_dx, const Index agenda_array_index, const Vector &pnd_agenda_input_t, const Matrix &pnd_agenda_input, const ArrayOfString &pnd_agenda_input_names, const ArrayOfString &dpnd_data_dx_names, const ArrayOfAgenda &input_agenda_array)
This can be used to make arrays out of anything.
Index nelem() const ARTS_NOEXCEPT
Index nrows() const noexcept
Index ncols() const noexcept
bool empty() const noexcept
Index npages() const
Returns the number of pages.
Index ncols() const
Returns the number of columns.
bool empty() const noexcept
Index nbooks() const noexcept
Index nelem() const noexcept
Returns the number of elements.
void set_name(const String &s)
Set name of this gridded field.
void set_grid_name(Index i, const String &s)
Set grid name.
void set_grid(Index i, const Vector &g)
Set a numeric grid.
void resize(Index r, Index c)
Resize function.
void resize(Index p, Index r, Index c)
Resize function.
void resize(Index b, Index p, Index r, Index c)
Resize function.
void resize(Index n)
Resize function.
void bin_quadweights(Vector &w, const Vector &x, const Index &order)
Internal cloudbox functions.
#define ARTS_USER_ERROR(...)
#define ARTS_USER_ERROR_IF(condition,...)
Functions for disort interface.
This file contains basic functions to handle ASCII files.
Header file for interpolation.cc.
Linear algebra functions.
bool is_increasing(ConstVectorView x)
Checks if a vector is sorted and strictly increasing.
Header file for logic.cc.
void pndFromPsdBasic(Matrix &pnd_data, Tensor3 &dpnd_data_dx, const Vector &pnd_size_grid, const Matrix &psd_data, const Vector &psd_size_grid, const Tensor3 &dpsd_data_dx, const Index &quad_order, const Verbosity &)
WORKSPACE METHOD: pndFromPsdBasic.
void particle_massesFromMetaDataSingleCategory(Matrix &particle_masses, const ArrayOfArrayOfScatteringMetaData &scat_meta, const Verbosity &)
WORKSPACE METHOD: particle_massesFromMetaDataSingleCategory.
void pndFromPsd(Matrix &pnd_data, Tensor3 &dpnd_data_dx, const Vector &pnd_size_grid, const Matrix &psd_data, const Vector &psd_size_grid, const Tensor3 &dpsd_data_dx, const ArrayOfArrayOfSingleScatteringData &scat_data, const Vector &f_grid, const Index &scat_data_checked, const Index &quad_order, const Index &scat_index, const Numeric &threshold_rsec, const Numeric &threshold_bext, const Numeric &threshold_rpnd, const Verbosity &)
WORKSPACE METHOD: pndFromPsd.
void ScatSpeciesSizeMassInfo(Vector &scat_species_x, Numeric &scat_species_a, Numeric &scat_species_b, const ArrayOfArrayOfScatteringMetaData &scat_meta, const Index &species_index, const String &x_unit, const Numeric &x_fit_start, const Numeric &x_fit_end, const Index &do_only_x, const Verbosity &)
WORKSPACE METHOD: ScatSpeciesSizeMassInfo.
void pnd_fieldCalcFromParticleBulkProps(Workspace &ws, Tensor4 &pnd_field, ArrayOfTensor4 &dpnd_field_dx, const Index &atmosphere_dim, const Vector &p_grid, const Vector &lat_grid, const Vector &lon_grid, const Tensor3 &t_field, const Index &cloudbox_on, const ArrayOfIndex &cloudbox_limits, const ArrayOfString &scat_species, const ArrayOfArrayOfSingleScatteringData &scat_data, const ArrayOfArrayOfScatteringMetaData &scat_meta, const Tensor4 &particle_bulkprop_field, const ArrayOfString &particle_bulkprop_names, const ArrayOfAgenda &pnd_agenda_array, const ArrayOfArrayOfString &pnd_agenda_array_input_names, const Index &jacobian_do, const ArrayOfRetrievalQuantity &jacobian_quantities, const Verbosity &)
WORKSPACE METHOD: pnd_fieldCalcFromParticleBulkProps.
void HydrotableCalc(Workspace &ws, GriddedField4 &hydrotable, const ArrayOfAgenda &pnd_agenda_array, const ArrayOfArrayOfString &pnd_agenda_array_input_names, const ArrayOfArrayOfSingleScatteringData &scat_data, const Index &scat_data_checked, const Vector &f_grid, const Index &iss, const Vector &T_grid, const Vector &wc_grid, const Verbosity &)
WORKSPACE METHOD: HydrotableCalc.
void particle_massesFromMetaData(Matrix &particle_masses, const ArrayOfArrayOfScatteringMetaData &scat_meta, const Verbosity &)
WORKSPACE METHOD: particle_massesFromMetaData.
void nlinspace(Vector &x, const Numeric start, const Numeric stop, const Index n)
nlinspace
void abs(Sparse &A, const Sparse &B)
Absolute value of sparse matrix elements.
NUMERIC Numeric
The type to use for all floating point numbers.
INDEX Index
The type to use for all integer numbers and indices.
ConstComplexMatrixView transpose(ConstComplexMatrixView m)
Const version of transpose.
Declarations having to do with the four output streams.
Numeric asymmetry_parameter(ConstVectorView sa_grid, ConstVectorView pfun)
asymmetry_parameter
void derive_scat_species_a_and_b(Numeric &a, Numeric &b, const Vector &x, const Vector &mass, const Numeric &x_fit_start, const Numeric &x_fit_end)
Internal functions for microphysics calculations (size distributions etc.)
constexpr Numeric pi
The following mathematical constants are generated in python Decimal package by the code:
void ext_abs_pfun_from_tro(MatrixView ext_data, MatrixView abs_data, Tensor3View pfun_data, const ArrayOfSingleScatteringData &scat_data, const Index &iss, ConstMatrixView pnd_data, ArrayOfIndex &cloudbox_limits, ConstVectorView T_grid, ConstVectorView sa_grid)
Extinction, absorption and phase function for one scattering species, 1D and TRO.
Scattering database structure and functions.
This file contains header information for the dealing with command line parameters.
This file contains declerations of functions of physical character.
Internal functions associated with size distributions.
Declaration of functions in rte.cc.
Contains sorting routines.
void get_sorted_indexes(ArrayOfIndex &sorted, const T &data)
get_sorted_indexes
Header file for special_interp.cc.
This file contains basic functions to handle XML data files.