24 std::set<Species::Species> unique_species;
25 for (
auto& asp : abs_species) {
26 for (
auto& sp : asp) {
27 if (sp.Type() == Species::TagType::XsecFit) {
28 unique_species.insert(sp.Spec());
33 String tmpbasename = basename;
34 if (basename.length() && basename[basename.length() - 1] !=
'/') {
39 xsec_fit_data.clear();
40 for (
auto& species_name : unique_species) {
42 const String filename{tmpbasename +
43 String(Species::toShortName(species_name)) +
".xml"};
46 ReadXML(xsec_coeffs,
"", filename,
"", verbosity);
48 xsec_fit_data.push_back(xsec_coeffs);
49 }
catch (
const std::exception& e) {
51 "Error reading coefficients file:\n", filename,
"\n", e.what());
58 PropagationMatrix& propmat_clearsky,
59 ArrayOfPropagationMatrix& dpropmat_clearsky_dx,
65 const Numeric& rtp_pressure,
66 const Numeric& rtp_temperature,
67 const Vector& rtp_vmr,
69 const Numeric& force_p,
70 const Numeric& force_t,
77 "Mismatch dimensions on species and VMR inputs");
79 propmat_clearsky.NumberOfFrequencies() not_eq f_grid.nelem(),
80 "Mismatch dimensions on internal matrices of xsec and frequency");
83 if (dpropmat_clearsky_dx.nelem()) {
85 dpropmat_clearsky_dx.nelem() not_eq jacobian_quantities.
nelem(),
86 "Mismatch dimensions on xsec derivatives and Jacobian grids");
88 std::any_of(dpropmat_clearsky_dx.cbegin(),
89 dpropmat_clearsky_dx.cend(),
91 return x.NumberOfFrequencies() not_eq f_grid.nelem();
93 "Mismatch dimensions on internal matrices of xsec derivatives and frequency");
101 Vector dxsec_temp_dT;
102 Vector dxsec_temp_dF;
111 dfreq.resize(f_grid.nelem());
114 dxsec_temp_dF.resize(f_grid.nelem());
117 dxsec_temp_dT.resize(f_grid.nelem());
127 Vector xsec_temp(f_grid.nelem(), 0.);
130 bool do_abort =
false;
134 for (Index i = 0; i < abs_species.
nelem(); i++) {
135 if (select_abs_species.
nelem() and abs_species[i] not_eq select_abs_species)
138 for (Index s = 0; s < abs_species[i].
nelem(); s++) {
139 const SpeciesTag& this_species = abs_species[i][s];
142 if (this_species.Type() != Species::TagType::XsecFit)
continue;
144 Index this_xdata_index =
147 "Cross-section species ",
149 " not found in *xsec_fit_data*.")
150 const XsecRecord& this_xdata = xsec_fit_data[this_xdata_index];
153 if (do_abort)
continue;
154 const Numeric current_p = force_p < 0 ? rtp_pressure : force_p;
155 const Numeric current_t = force_t < 0 ? rtp_temperature : force_t;
158 this_xdata.
Extract(xsec_temp, f_grid, current_p, current_t, verbosity);
161 dxsec_temp_dF, dfreq, current_p, current_t, verbosity);
165 dxsec_temp_dT, f_grid, current_p, current_t + dt, verbosity);
172 xsec_temp *= nd * rtp_vmr[i];
173 propmat_clearsky.Kjj() += xsec_temp;
176 for (Index f = 0; f < f_grid.nelem(); f++) {
177 propmat_clearsky.Kjj()[f] += xsec_temp[f] * nd * rtp_vmr[i];
178 for (Index iq = 0; iq < jacobian_quantities.
nelem(); iq++) {
179 const auto& deriv = jacobian_quantities[iq];
181 if (!deriv.propmattype())
continue;
184 dpropmat_clearsky_dx[iq].Kjj()[f] +=
185 (dxsec_temp_dF[f] - xsec_temp[f]) * nd * rtp_vmr[i] / df;
186 }
else if (deriv == Jacobian::Special::ArrayOfSpeciesTagVMR ||
187 deriv == Jacobian::Line::VMR) {
189 dpropmat_clearsky_dx[iq].Kjj()[f] +=
190 xsec_temp[f] * nd * rtp_vmr[i];
192 }
else if (deriv == Jacobian::Atm::Temperature) {
193 dpropmat_clearsky_dx[iq].Kjj()[f] +=
194 ((dxsec_temp_dT[f] - xsec_temp[f]) / dt * nd +
195 xsec_temp[f] * dnd_dt) *
206 ArrayOfMatrix& abs_xsec_per_species,
207 ArrayOfArrayOfMatrix& ,
212 const Vector& f_grid,
216 const Numeric& force_p,
217 const Numeric& force_t,
225 const Index n_tgs = abs_species.
nelem();
226 const Index n_xsec = abs_xsec_per_species.nelem();
230 "The following variables must all have the same dimension:\n"
234 "abs_xsec_per_species: ",
244 const Index n_p = abs_p.nelem();
245 const Index n_t = abs_t.nelem();
249 "The following variables must all have the same dimension:\n"
260 Vector xsec_temp(f_grid.nelem(), 0.);
263 bool do_abort =
false;
268 for (Index ii = 0; ii < abs_species_active.
nelem(); ii++) {
269 const Index i = abs_species_active[ii];
271 for (Index s = 0; s < abs_species[i].
nelem(); s++) {
272 const SpeciesTag& this_species = abs_species[i][s];
275 if (this_species.Type() != Species::TagType::XsecFit)
continue;
277 Index this_xdata_index =
280 "Cross-section species ",
282 " not found in *xsec_fit_data*.")
283 const XsecRecord& this_xdata = xsec_fit_data[this_xdata_index];
284 Matrix& this_xsec = abs_xsec_per_species[i];
287#pragma omp parallel for if (!arts_omp_in_parallel() && abs_p.nelem() >= 1) \
288 firstprivate(xsec_temp)
289 for (Index ip = 0; ip < abs_p.nelem(); ip++) {
290 if (do_abort)
continue;
291 const Numeric current_p = force_p < 0 ? abs_p[ip] : force_p;
292 const Numeric current_t = force_t < 0 ? abs_t[ip] : force_t;
301 }
catch (runtime_error& e) {
303 os <<
"Problem with HITRAN cross section species "
304 << this_species.Name() <<
" at pressure level " << ip <<
" ("
305 << abs_p[ip] / 100. <<
" hPa):\n"
307#pragma omp critical(abs_xsec_per_speciesAddXsecFit)
310 fail_msg.push_back(os.str());
313 this_xsec(joker, ip) += xsec_temp;
The global header file for ARTS.
This can be used to make arrays out of anything.
Index nelem() const ARTS_NOEXCEPT
Hitran crosssection class.
void Extract(VectorView result, const Vector &f_grid, Numeric pressure, Numeric temperature, const Verbosity &verbosity) const
Calculate hitran cross section data.
#define ARTS_USER_ERROR(...)
#define ARTS_USER_ERROR_IF(condition,...)
bool do_frequency_jacobian(const ArrayOfRetrievalQuantity &js) noexcept
Returns if the array wants a frequency derivative.
bool species_match(const RetrievalQuantity &rq, const ArrayOfSpeciesTag &ast)
Returns if the Retrieval quantity is VMR derivative for all the species in the species tags.
bool do_temperature_jacobian(const ArrayOfRetrievalQuantity &js) noexcept
Returns if the array wants the temperature derivative.
bool supports_hitran_xsec(const ArrayOfRetrievalQuantity &js)
Returns if the array supports HITRAN cross-section derivatives.
bool is_frequency_parameter(const RetrievalQuantity &t) noexcept
Returns if the Retrieval quantity is a frequency parameter in propagation matrix calculations.
Numeric temperature_perturbation(const ArrayOfRetrievalQuantity &js) noexcept
Returns the temperature perturbation if it exists.
Numeric frequency_perturbation(const ArrayOfRetrievalQuantity &js) noexcept
Returns the frequency perturbation if it exists.
Routines for setting up the jacobian.
Workspace methods and template functions for supergeneric XML IO.
void ReadXML(T &v, const String &v_name, const String &f, const String &f_name, const Verbosity &verbosity)
WORKSPACE METHOD: ReadXML.
void abs_xsec_per_speciesAddXsecFit(ArrayOfMatrix &abs_xsec_per_species, ArrayOfArrayOfMatrix &, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfRetrievalQuantity &, const ArrayOfIndex &abs_species_active, const Vector &f_grid, const Vector &abs_p, const Vector &abs_t, const ArrayOfXsecRecord &xsec_fit_data, const Numeric &force_p, const Numeric &force_t, const Verbosity &verbosity)
void propmat_clearskyAddXsecFit(PropagationMatrix &propmat_clearsky, ArrayOfPropagationMatrix &dpropmat_clearsky_dx, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfSpeciesTag &select_abs_species, const ArrayOfRetrievalQuantity &jacobian_quantities, const Vector &f_grid, const Numeric &rtp_pressure, const Numeric &rtp_temperature, const Vector &rtp_vmr, const ArrayOfXsecRecord &xsec_fit_data, const Numeric &force_p, const Numeric &force_t, const Verbosity &verbosity)
WORKSPACE METHOD: propmat_clearskyAddXsecFit.
void ReadXsecData(ArrayOfXsecRecord &xsec_fit_data, const ArrayOfArrayOfSpeciesTag &abs_species, const String &basename, const Verbosity &verbosity)
WORKSPACE METHOD: ReadXsecData.
Declarations having to do with the four output streams.
my_basic_string< char > String
The String type for ARTS.
This file contains declerations of functions of physical character.
constexpr Numeric dnumber_density_dt(Numeric p, Numeric t) noexcept
dnumber_density_dT
constexpr Numeric number_density(Numeric p, Numeric t) noexcept
number_density
Index hitran_xsec_get_index(const ArrayOfXsecRecord &xsec_data, const Species::Species species)
Get the index in xsec_fit_data for the given species.
Methods and classes for HITRAN absorption cross section data.