Go to the documentation of this file.
50 bool needs_lines =
false;
51 bool needs_continua =
false;
52 bool needs_cia =
false;
53 bool needs_hxsec =
false;
64 needs_continua =
true;
78 os <<
"Unknown species type: " <<
abs_species[sp][tgs].Type();
79 throw runtime_error(os.str());
88 "*abs_species* contains line species but *abs_xsec_agenda*\n"
89 "does not contain *abs_xsec_per_speciesAddLines*.");
95 "*abs_species* contains continuum species but *abs_xsec_agenda*\n"
96 "does not contain *abs_xsec_per_speciesAddConts*.");
99 if (needs_cia && !
abs_xsec_agenda.has_method(
"abs_xsec_per_speciesAddCIA")) {
101 "*abs_species* contains CIA species but *abs_xsec_agenda*\n"
102 "does not contain *abs_xsec_per_speciesAddCIA*.");
108 "*abs_species* contains HITRAN xsec species but *abs_xsec_agenda*\n"
109 "does not contain *abs_xsec_per_speciesAddHitranXsec*.");
113 if (not
abs_xsec_agenda.has_method(
"abs_xsec_per_speciesAddPredefinedO2MPM2020")) {
115 "*abs_species contains \"O2-MPM2020\" but *abs_xsec_agenda*\n"
116 "does not contain *abs_xsec_per_speciesAddPredefinedO2MPM2020*.");
141 const Index& negative_vmr_ok,
142 const Index& bad_partition_functions_ok,
158 throw runtime_error(
"All values in *vmr_field* must be >= 0.");
162 throw runtime_error(
"All temperatures in *t_field* must be > 0.");
184 bool chk_poles =
false;
230 os <<
"You have a wind field set, but abs_f_interp_order zero.\n"
231 <<
"This is not allowed. Though abs_f_interp_order only is\n"
232 <<
"required and has an effect if absorption lookup tables\n"
233 <<
"are used, for safety reasons you also have to set it >0\n"
234 <<
"in case of on-the-fly absorption.";
235 throw runtime_error(os.str());
250 bool chk_poles =
false;
292 Numeric min_T = 0, max_T = 1e6;
296 bool test_spec =
false;
299 if (s.Species() == ii and s.Isotopologue() == jj) test_spec =
true;
300 if (not test_spec)
continue;
306 if (part_fun.
nelem() == 2) {
307 if (part_fun[1].
data.nelem() == 2 &&
308 part_fun[0].data.
nelem() > 1) {
309 if (part_fun[1].
data[0] > min_T) min_T = part_fun[1].data[0];
310 if (part_fun[1].
data[1] < max_T) max_T = part_fun[1].data[1];
312 throw std::runtime_error(
313 "Bad coefficient parameter in partition_function.\n");
315 throw std::runtime_error(
316 "Bad coefficient parameter in partition_function.\n");
321 if (part_fun.
nelem() == 3) {
322 if (part_fun[2].
data.nelem() == 2 &&
323 (part_fun[1].data.
nelem() == part_fun[0].data.
nelem())) {
324 if (part_fun[2].
data[0] > min_T) min_T = part_fun[2].data[0];
325 if (part_fun[2].
data[1] < max_T) max_T = part_fun[2].data[1];
327 throw std::runtime_error(
328 "Bad coefficient parameter in partition_function.\n");
330 throw std::runtime_error(
331 "Bad coefficient parameter in partition_function.\n");
336 if (part_fun.
nelem() == 1) {
337 if (part_fun[0].
data.nelem() > 1) {
338 if (part_fun[0].get_numeric_grid(0)[0] > min_T)
339 min_T = part_fun[0].get_numeric_grid(0)[0];
340 if (part_fun[0].get_numeric_grid(
341 0)[part_fun[0].
data.nelem() - 1] < max_T)
342 max_T = part_fun[0].get_numeric_grid(
343 0)[part_fun[0].data.
nelem() - 1];
345 throw std::runtime_error(
346 "Bad t_field parameter in partition_function.\n");
348 throw std::runtime_error(
349 "Bad t_field parameter in partition_function.\n");
353 throw std::runtime_error(
354 "Bad parameter type in partition_functions.\n");
360 if (!bad_partition_functions_ok) {
366 os <<
"There are bad partition functions in your setup.\n"
367 <<
"Minimum temperature for defined partition functions is: "
369 <<
" K.\nMaximum temperature for defined partition functions is: "
370 << max_T <<
" K\nThere is a t_field entry of "
371 <<
t_field(ii, jj, kk) <<
" K.\n";
372 throw std::runtime_error(os.str());
402 "The WSV *refellispoid* must be a vector of "
406 "The first element of *refellipsoid* must "
410 "The second element of *refellipsoid* must be "
414 "For 1D, the second element of *refellipsoid* "
415 "(the eccentricity) must be 0.");
424 os <<
"z_field (for latitude nr " << row <<
" and longitude nr " << col
439 os <<
"The surface altitude (*z_surface*) cannot be outside\n"
440 <<
"of the altitudes in *z_field*.\n"
441 <<
"z_surface: " <<
z_surface(row, col) <<
"\n"
442 <<
"min of z_field: " <<
z_field(0, row, col) <<
"\n"
446 os <<
"\nThis was found to be the case for:\n"
449 throw runtime_error(os.str());
458 throw runtime_error(
"For 1D, *lat_true* must have length 1.");
460 throw runtime_error(
"For 1D, *lon_true* must have length 1.");
464 "For 2D, *lat_true* must have same length as *lat_grid*.");
467 "For 2D, *lon_true* must have same length as *lat_grid*.");
471 "If *lat_true* is set, also *lon_true* must be "
472 "set (and have the same length).");
474 throw runtime_error(
"Values in *lat_true* must be inside [-90,90].");
476 throw runtime_error(
"Values in *lon_true* must be inside [-180,360].");
504 const Index& negative_pnd_ok,
508 "The atmospheric fields must be flagged to have "
509 "passed a consistency check (atmfields_checked=1).");
517 ow <<
"The scattering methods are not (yet?) handling winds. For this\n"
518 <<
"reason, the WSVs for wind fields must all be empty with an\n."
519 <<
"active cloudbox.";
522 throw runtime_error(ow.str());
529 Index has_absparticles = 0;
530 for (
Index sp = 0; sp <
abs_species.nelem() && has_absparticles < 1; sp++) {
532 has_absparticles = 1;
535 if (has_absparticles) {
537 "For scattering calculations (cloudbox is on),"
538 "abs_species is not allowed to contain\n"
539 "'particles' (absorbing-only particles)!");
545 os <<
"The array *cloudbox_limits* has incorrect length.\n"
549 throw runtime_error(os.str());
554 os <<
"Incorrect value(s) for cloud box pressure limit(s) found."
555 <<
"\nValues are either out of range or upper limit is not "
556 <<
"greater than lower limit.\nWith present length of "
557 <<
"*p_grid*, OK values are 0 - " <<
p_grid.nelem() - 1
560 throw runtime_error(os.str());
563 Index nlat = 1, nlon = 1;
570 os <<
"Incorrect value(s) for cloud box latitude limit(s) found."
571 <<
"\nValues are either out of range or upper limit is not "
572 <<
"greater than lower limit.\nWith present length of "
573 <<
"*lat_grid*, OK values are 1 - " << nlat - 2
576 throw runtime_error(os.str());
581 os <<
"Too small distance between cloudbox and lower end of "
582 <<
"latitude grid.\n"
583 <<
"This distance must be " <<
LAT_LON_MIN <<
" degrees.\n"
585 <<
" and latitude grid starts at " <<
lat_grid[0] <<
".";
586 throw runtime_error(os.str());
592 os <<
"Too small distance between cloudbox and upper end of "
593 <<
"latitude grid.\n"
594 <<
"This distance must be " <<
LAT_LON_MIN <<
" degrees.\n"
596 <<
" and latitude grid ends at " <<
lat_grid[nlat - 1] <<
".";
597 throw runtime_error(os.str());
606 os <<
"Incorrect value(s) for cloud box longitude limit(s) found"
607 <<
".\nValues are either out of range or upper limit is not "
608 <<
"greater than lower limit.\nWith present length of "
609 <<
"*lon_grid*, OK values are 1 - " << nlon - 2
612 throw runtime_error(os.str());
620 os <<
"Too small distance between cloudbox and lower end of"
621 <<
"the longitude\ngrid. This distance must here be "
623 throw runtime_error(os.str());
628 os <<
"Too small distance between cloudbox and upper end of"
629 <<
"the longitude\ngrid. This distance must here be "
631 throw runtime_error(os.str());
637 for (
Index o = 0; o < nlon; o++) {
638 for (
Index a = 0; a < nlat; a++) {
641 "The upper vertical limit of the cloudbox must be above "
642 "the surface altitude (for all latitudes and longitudes).");
661 throw runtime_error(
"Negative values in *pnd_field* not allowed.");
665 for (
Index a = 0; a < g2.nelem(); a++) {
670 "A non-zero value found in *pnd_field* at the"
671 " lower altitude limit of the cloudbox (but the "
672 "position is not at or below the surface altitude).");
681 "A non-zero value found in *pnd_field* at "
682 "upper altitude limit of the cloudbox.");
686 "A non-zero value found in *pnd_field* at "
687 "lower latitude limit of the cloudbox.");
690 "A non-zero value found in *pnd_field* at "
691 "upper latitude limit of the cloudbox.");
696 "A non-zero value found in *pnd_field* at "
697 "lower longitude limit of the cloudbox.");
700 "A non-zero value found in *pnd_field* at "
701 "upper longitude limit of the cloudbox.");
707 "Size of *dpnd_field_dx* inconsistent with number "
708 "of *jacobian_quantities*.");
717 os <<
"Number of scattering species specified by scat_species does\n"
718 <<
"not agree with number of scattering species in scat_data:\n"
720 <<
" entries, while scat_data has " <<
scat_data.nelem() <<
".";
721 throw runtime_error(os.str());
728 "The WSV *particle_masses* must either be "
729 "empty or have a row size matching the "
730 "length of *scat_data*.");
732 throw runtime_error(
"All values in *particles_masses* must be >= 0.");
744 const Numeric& dfrel_threshold,
745 const String& check_level,
746 const Numeric& sca_mat_threshold,
753 if (dfrel_threshold > 0.5) {
755 os <<
"*dfrel_threshold* too large (max. allowed: 0.5, your's: "
756 << dfrel_threshold <<
").";
757 throw runtime_error(os.str());
761 if (
f_grid.empty())
throw runtime_error(
"The frequency grid is empty.");
766 for (
Index i_ss = 0; i_ss < N_ss; i_ss++) {
768 for (
Index i_se = 0; i_se < N_se; i_se++) {
777 os <<
"*scat_data* must have either one or *f_grid* (=" << nf
778 <<
") frequency entries,\n"
779 <<
"but scattering element #" << i_se <<
" in scattering species #"
780 << i_ss <<
" has " << nf_se <<
".";
781 throw runtime_error(os.str());
783 for (
Index f = 0; f < nf_se; f++) {
787 os <<
"*scat_data* frequency grid has to be identical to *f_grid*\n"
788 <<
"(or contain only a single entry),\n"
789 <<
"but scattering element #" << i_se
790 <<
" in scattering species #" << i_ss
791 <<
" deviates for f_index " << f <<
".";
792 throw runtime_error(os.str());
802 os <<
"Frequency entry (f=" <<
scat_data[i_ss][i_se].f_grid[0]
803 <<
"Hz) of scattering element #" << i_se <<
"\n"
804 <<
"in scattering species #" << i_ss <<
" is too far (>"
805 << dfrel_threshold * 1e2 <<
"%) from one or more\n"
806 <<
"of the f_grid limits (fmin=" <<
f_grid[0]
807 <<
"Hz, fmax=" <<
f_grid[nf - 1] <<
"Hz).";
808 throw runtime_error(os.str());
817 ostringstream bs1, bs2;
818 bs1 <<
"Frequency dimension of ";
820 bs2 <<
" must be ssd.f_grid.nelem() (=" << nf_se <<
"),\n"
821 <<
"but scattering element #" << i_se <<
" in scattering species #"
827 os << bs1.str() <<
"pha_mat_data" << bs2.str() << nf_se <<
".";
828 throw runtime_error(os.str());
830 nf_sd =
scat_data[i_ss][i_se].ext_mat_data.nshelves();
834 os << bs1.str() <<
"ext_mat_data" << bs2.str() << nf_se <<
".";
835 throw runtime_error(os.str());
837 nf_sd =
scat_data[i_ss][i_se].abs_vec_data.nshelves();
841 os << bs1.str() <<
"abs_vec_data" << bs2.str() << nf_se <<
".";
842 throw runtime_error(os.str());
849 ostringstream bs1, bs2;
851 bs1 <<
"Temperature dimension of ";
853 bs2 <<
" must be ssd.T_grid.nelem() (=" << nt_se <<
"),\n"
854 <<
"but for scattering element #" << i_se
855 <<
" in scattering species #" << i_ss <<
" it is ";
857 if (nt_sd != nt_se and nt_sd != 1) {
859 os << bs1.str() <<
"pha_mat_data" << bs2.str() << nt_sd <<
".";
860 throw runtime_error(os.str());
862 nt_sd =
scat_data[i_ss][i_se].ext_mat_data.nbooks();
867 os << bs1.str() <<
"ext_mat_data" << bs2.str() << nt_se <<
".";
868 throw runtime_error(os.str());
870 nt_sd =
scat_data[i_ss][i_se].abs_vec_data.nbooks();
871 if (nt_sd != nt_se) {
873 os << bs1.str() <<
"abs_vec_data" << bs2.str() << nt_se <<
".";
874 throw runtime_error(os.str());
880 if (check_level.
toupper() !=
"NONE") {
908 std::ostringstream os;
909 os <<
"abs_lines_per_species and abs_species must have same length.\n"
910 <<
"Instead len(abs_lines_per_species) = "
912 <<
" and len(abs_species) = "
915 throw std::runtime_error(os.str());
922 if (not specs.nelem()) {
923 if (not lines.nelem()) {
926 throw std::runtime_error(
"Lines for non-existent species discovered!\n");
930 const bool any_zeeman = std::any_of(specs.cbegin(), specs.cend(), [](
auto&
x){return x.Type() == SpeciesTag::TYPE_ZEEMAN;});
931 if (any_zeeman and (not std::all_of(specs.cbegin(), specs.cend(), [](
auto&
x){return x.Type() == SpeciesTag::TYPE_ZEEMAN;}))) {
932 std::ostringstream os;
933 os <<
"Zeeman species found but not all sub-species tags support Zeeman effect.\n";
934 os <<
"Offending tag: " << specs <<
'\n';
935 throw std::runtime_error(os.str());
939 for (
auto& band: lines) {
940 for (
Index k=0; k<band.NumLines(); k++) {
945 auto Ze = band.Line(k).Zeeman();
946 if (Fu.isUndefined() and Ju.isUndefined()) {
947 throw std::runtime_error(
"Bad upper state F(s) or J(s).\n");
948 }
else if (Fl.isUndefined() and Jl.isUndefined()) {
949 throw std::runtime_error(
"Bad lower state F(s) or J(s).\n");
951 throw std::runtime_error(
"Bad Wigner numbers for lower state F or J. Try increasing the Wigner memory allocation.\n");
953 throw std::runtime_error(
"Bad Wigner numbers for lower state F or J. Try increasing the Wigner memory allocation.\n");
954 }
else if (Ze.gu() == 0 ?
false : not std::isnormal(Ze.gu())) {
955 throw std::runtime_error(
"Bad value(s) in the upper Zeeman data not allowed when modeling Zeeman effect.\n");
956 }
else if (Ze.gl() == 0 ?
false : not std::isnormal(Ze.gl())) {
957 throw std::runtime_error(
"Bad value(s) in the lower Zeeman data not allowed when modeling Zeeman effect.\n");
965 for (
auto& band: lines) {
967 throw std::runtime_error(
"Negative or zero frequency in non-Manual mirrored band.\n");
983 bool needs_lines =
false;
984 bool needs_zeeman =
false;
985 bool needs_continua =
false;
986 bool needs_cia =
false;
988 bool needs_particles =
false;
989 bool needs_hxsec =
false;
1001 needs_continua =
true;
1009 needs_particles =
true;
1016 os <<
"Unknown species type: " <<
abs_species[sp][tgs].Type();
1017 throw runtime_error(os.str());
1023 if ((needs_lines || needs_continua || needs_cia || needs_hxsec) &&
1026 throw runtime_error(
1027 "*abs_species* contains line species, CIA species, "
1028 "hitran xsec species or continua but *propmat_clearsky_agenda*\n"
1029 "does not contain *propmat_clearskyAddOnTheFly* nor "
1030 "*propmat_clearskyAddFromLookup*.");
1033 if (needs_zeeman and
1035 throw runtime_error(
1036 "*abs_species* contains Zeeman species but *propmat_clearsky_agenda*\n"
1037 "does not contain *propmat_clearskyAddZeeman*.");
1047 if (needs_particles &&
1050 throw runtime_error(
1051 "*abs_species* contains particles but *propmat_clearsky_agenda*\n"
1052 "does not contain *propmat_clearskyAddParticles*.");
1082 throw runtime_error(
"*f_grid* must be a strictly increasing vector.");
1087 throw runtime_error(
"*sensor_pos* is empty. This is not allowed.");
1089 throw runtime_error(
"*sensor_los* is empty. This is not allowed.");
1092 throw runtime_error(
1093 "The number of columns of sensor_pos must be "
1094 "equal to the atmospheric dimensionality.");
1096 throw runtime_error(
"For 1D and 2D, sensor_los shall have one column.");
1098 throw runtime_error(
"For 3D, sensor_los shall have two columns.");
1101 os <<
"The number of rows of sensor_pos and sensor_los must be "
1102 <<
"identical, but sensor_pos has " << nmblock <<
" rows,\n"
1103 <<
"while sensor_los has " <<
sensor_los.nrows() <<
" rows.";
1104 throw runtime_error(os.str());
1107 throw runtime_error(
1108 "First column of *sensor_los* is not allowed to have values above 180.");
1111 throw runtime_error(
1112 "For atmosphere_dim = 2, first column of "
1113 "*sensor_los* is not allowed to have values below -180.");
1116 throw runtime_error(
1117 "For atmosphere_dim != 2, first column of "
1118 "*sensor_los* is not allowed to have values below 0.");
1122 throw runtime_error(
1123 "Second column of *sensor_los* is not allowed to have values above 180.");
1125 throw runtime_error(
1126 "Second column of *sensor_los* is not allowed to have values below -180.");
1132 throw runtime_error(
1133 "*transmitter_pos* must either be empty or have "
1134 "the same number of rows as *sensor_pos*.");
1136 throw runtime_error(
1137 "*transmitter_pos* must either be empty, have "
1138 "2 for 1D/2D or 3 columns for 3D.");
1144 throw runtime_error(
"*mblock_dlos_grid* is empty.");
1146 throw runtime_error(
1147 "The maximum number of columns in *mblock_dlos_grid* is two.");
1150 throw runtime_error(
1151 "For 1D and 2D *mblock_dlos_grid* must have exactly one column.");
1158 os <<
"The *sensor_response* matrix does not have the right size,\n"
1159 <<
"either the method *sensor_responseInit* has not been run or some\n"
1160 <<
"of the other sensor response methods has not been correctly\n"
1162 throw runtime_error(os.str());
1170 os <<
"Sensor auxiliary variables do not have the correct size.\n"
1171 <<
"The following variables should all have same size:\n"
1172 <<
"length of y for one block : " << n1y <<
"\n"
1177 throw runtime_error(os.str());
void checkPartitionFunctions(const ArrayOfArrayOfSpeciesTag &abs_species, const SpeciesAuxData &partfun)
Check that partition functions for the given species are correctly defined.
Index atmosphere_dim(Workspace &ws) noexcept
Tensor3 wind_v_field(Workspace &ws) noexcept
bool is_same_within_epsilon(const Numeric &a, const Numeric &b, const Numeric &epsilon)
Check, if two numbers agree within a given epsilon.
Tensor3 z_field(Workspace &ws) noexcept
void toupper()
Convert to upper case.
Index atmgeom_checked(Workspace &ws) noexcept
ArrayOfRetrievalQuantity jacobian_quantities(Workspace &ws) noexcept
Matrix transmitter_pos(Workspace &ws) noexcept
const Numeric LAT_LON_MIN
Sparse sensor_response(Workspace &ws) noexcept
bool is_wigner3_ready(const Rational &J)
Tells if the function is ready for Wigner 3J calculations.
Vector lat_grid(Workspace &ws) noexcept
Tensor4 pnd_field(Workspace &ws) noexcept
Verbosity verbosity(Workspace &ws) noexcept
ArrayOfIndex cloudbox_limits(Workspace &ws) noexcept
Tensor3 wind_u_field(Workspace &ws) noexcept
void resize(Index n)
Resize function.
ArrayOfArrayOfAbsorptionLines abs_lines_per_species(Workspace &ws) noexcept
Tensor3 mag_w_field(Workspace &ws) noexcept
G0 G2 FVC Y DV Numeric Numeric Numeric Zeeman LowerQuantumNumbers void * data
Index stokes_dim(Workspace &ws) noexcept
@ AT_PARTITIONFUNCTION_TFIELD
void sensor_checkedCalc(Index &sensor_checked, const Index &atmosphere_dim, const Index &stokes_dim, const Vector &f_grid, const Matrix &sensor_pos, const Matrix &sensor_los, const Matrix &transmitter_pos, const Matrix &mblock_dlos_grid, const Sparse &sensor_response, const Vector &sensor_response_f, const ArrayOfIndex &sensor_response_pol, const Matrix &sensor_response_dlos, const Verbosity &)
WORKSPACE METHOD: sensor_checkedCalc.
void atmfields_checkedCalc(Index &atmfields_checked, const Index &atmosphere_dim, const Vector &p_grid, const Vector &lat_grid, const Vector &lon_grid, const ArrayOfArrayOfSpeciesTag &abs_species, const Tensor3 &t_field, const Tensor4 &vmr_field, const Tensor3 &wind_u_field, const Tensor3 &wind_v_field, const Tensor3 &wind_w_field, const Tensor3 &mag_u_field, const Tensor3 &mag_v_field, const Tensor3 &mag_w_field, const SpeciesAuxData &partition_functions, const Index &abs_f_interp_order, const Index &negative_vmr_ok, const Index &bad_partition_functions_ok, const Verbosity &)
WORKSPACE METHOD: atmfields_checkedCalc.
void scat_data_checkedCalc(Index &scat_data_checked, const ArrayOfArrayOfSingleScatteringData &scat_data, const Vector &f_grid, const Numeric &dfrel_threshold, const String &check_level, const Numeric &sca_mat_threshold, const Verbosity &verbosity)
WORKSPACE METHOD: scat_data_checkedCalc.
Index TotalNumberOfElements(const Array< Array< base > > &aa)
Determine total number of elements in an ArrayOfArray.
Auxiliary data for isotopologues.
Vector lon_true(Workspace &ws) noexcept
Implementation of Matrix, Vector, and such stuff.
This can be used to make arrays out of anything.
A tag group can consist of the sum of several of these.
@ AT_PARTITIONFUNCTION_COEFF
Vector sensor_response_f(Workspace &ws) noexcept
void checkIsotopologueRatios(const ArrayOfArrayOfSpeciesTag &abs_species, const SpeciesAuxData &isoratios)
Check that isotopologue ratios for the given species are correctly defined.
void lbl_checkedCalc(Index &lbl_checked, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const SpeciesAuxData &isotopologue_ratios, const SpeciesAuxData &partition_functions, const Verbosity &)
WORKSPACE METHOD: lbl_checkedCalc.
Matrix particle_masses(Workspace &ws) noexcept
Index nelem() const
Returns the number of elements.
Tensor4 vmr_field(Workspace &ws) noexcept
ArrayOfArrayOfSpeciesTag abs_species(Workspace &ws) noexcept
Index atmfields_checked(Workspace &ws) noexcept
Vector p_grid(Workspace &ws) noexcept
NUMERIC Numeric
The type to use for all floating point numbers.
Vector refellipsoid(Workspace &ws) noexcept
Vector f_grid(Workspace &ws) noexcept
Vector lat_true(Workspace &ws) noexcept
Matrix sensor_pos(Workspace &ws) noexcept
Agenda abs_xsec_agenda(Workspace &ws) noexcept
ArrayOfArrayOfSingleScatteringData scat_data(Workspace &ws) noexcept
Type
Type of line shape to compute.
Vector lon_grid(Workspace &ws) noexcept
ArrayOfTensor4 dpnd_field_dx(Workspace &ws) noexcept
Internal cloudbox functions.
Index scat_data_checked(Workspace &ws) noexcept
Matrix mblock_dlos_grid(Workspace &ws) noexcept
ArrayOfIndex sensor_response_pol(Workspace &ws) noexcept
Index lbl_checked(Workspace &ws) noexcept
Index propmat_clearsky_agenda_checked(Workspace &ws) noexcept
bool is_increasing(ConstVectorView x)
Checks if a vector is sorted and strictly increasing.
void abs_xsec_agenda_checkedCalc(Workspace &ws, Index &abs_xsec_agenda_checked, const ArrayOfArrayOfSpeciesTag &abs_species, const Agenda &abs_xsec_agenda, const Verbosity &)
WORKSPACE METHOD: abs_xsec_agenda_checkedCalc.
void atmgeom_checkedCalc(Index &atmgeom_checked, const Index &atmosphere_dim, const Vector &p_grid, const Vector &lat_grid, const Vector &lon_grid, const Tensor3 &z_field, const Vector &refellipsoid, const Matrix &z_surface, const Vector &lat_true, const Vector &lon_true, const Verbosity &)
WORKSPACE METHOD: atmgeom_checkedCalc.
Tensor3 mag_v_field(Workspace &ws) noexcept
Tensor3 t_field(Workspace &ws) noexcept
Index abs_xsec_agenda_checked(Workspace &ws) noexcept
void scat_dataCheck(const ArrayOfArrayOfSingleScatteringData &scat_data, const String &check_type, const Numeric &threshold, const Verbosity &verbosity)
WORKSPACE METHOD: scat_dataCheck.
SpeciesAuxData partition_functions(Workspace &ws) noexcept
Tensor3 wind_w_field(Workspace &ws) noexcept
SpeciesAuxData isotopologue_ratios(Workspace &ws) noexcept
Index sensor_checked(Workspace &ws) noexcept
Agenda propmat_clearsky_agenda(Workspace &ws) noexcept
void propmat_clearsky_agenda_checkedCalc(Workspace &ws, Index &propmat_clearsky_agenda_checked, const ArrayOfArrayOfSpeciesTag &abs_species, const Agenda &propmat_clearsky_agenda, const Verbosity &)
WORKSPACE METHOD: propmat_clearsky_agenda_checkedCalc.
@ AT_PARTITIONFUNCTION_COEFF_VIBROT
Vector x(Workspace &ws) noexcept
INDEX Index
The type to use for all integer numbers and indices.
Matrix sensor_response_dlos(Workspace &ws) noexcept
ArrayOfString scat_species(Workspace &ws) noexcept
Tensor3 mag_u_field(Workspace &ws) noexcept
void cloudbox_checkedCalc(Index &cloudbox_checked, const Index &atmfields_checked, const Index &atmosphere_dim, const Vector &p_grid, const Vector &lat_grid, const Vector &lon_grid, const Tensor3 &z_field, const Matrix &z_surface, const Tensor3 &wind_u_field, const Tensor3 &wind_v_field, const Tensor3 &wind_w_field, const Index &cloudbox_on, const ArrayOfIndex &cloudbox_limits, const Tensor4 &pnd_field, const ArrayOfTensor4 &dpnd_field_dx, const ArrayOfRetrievalQuantity &jacobian_quantities, const ArrayOfArrayOfSingleScatteringData &scat_data, const ArrayOfString &scat_species, const Matrix &particle_masses, const ArrayOfArrayOfSpeciesTag &abs_species, const Index &negative_pnd_ok, const Verbosity &)
WORKSPACE METHOD: cloudbox_checkedCalc.
Index nelem() const
Number of elements.
Matrix sensor_los(Workspace &ws) noexcept
Index cloudbox_checked(Workspace &ws) noexcept
Matrix z_surface(Workspace &ws) noexcept
The global header file for ARTS.
Index cloudbox_on(Workspace &ws) noexcept
Index abs_f_interp_order(Workspace &ws) noexcept