25 Numeric sum_xsec_non_negative{};
26 for (
auto& x : xsec) {
29 sum_xsec_non_negative += x;
32 if (sum_xsec > 0. && sum_xsec != sum_xsec_non_negative) {
33 xsec *= sum_xsec / sum_xsec_non_negative;
40 return Species::toShortName(
mspecies);
46 "Invalid version ", version,
", only version ",
mversion,
" supported")
52 const Numeric pressure,
53 const Numeric temperature,
57 const Index nf = f_grid.nelem();
64 for (Index this_dataset_i = 0; this_dataset_i < ndatasets; this_dataset_i++) {
65 const Vector& data_f_grid =
mfitcoeffs[this_dataset_i].get_numeric_grid(0);
66 const Numeric data_fmin = data_f_grid[0];
67 const Numeric data_fmax = data_f_grid[data_f_grid.nelem() - 1];
69 if (out3.sufficient_priority()) {
71 os <<
" f_grid: " << f_grid[0] <<
" - " << f_grid[nf - 1]
73 <<
" data_f_grid: " << data_fmin <<
" - " << data_fmax <<
" Hz\n"
74 <<
" pressure: " << pressure <<
" K\n";
82 const Numeric* f_grid_begin = f_grid.data_handle();
83 const Numeric* f_grid_end = f_grid_begin + f_grid.
nelem();
84 const Index i_fstart = std::distance(
85 f_grid_begin, std::lower_bound(f_grid_begin, f_grid_end, data_fmin));
89 std::upper_bound(f_grid_begin + i_fstart, f_grid_end, data_fmax)) -
93 if (i_fstart == nf || i_fstop == -1)
continue;
95 const Index f_extent = i_fstop - i_fstart + 1;
97 if (out3.sufficient_priority()) {
99 os <<
" " << f_extent <<
" frequency extraction points starting at "
100 <<
"frequency index " << i_fstart <<
".\n";
107 if (f_extent < 1)
continue;
110 const ConstVectorView f_grid_active = f_grid[Range(i_fstart, f_extent)];
115 const Numeric f_grid_fmin = f_grid[i_fstart];
116 const Numeric f_grid_fmax = f_grid[i_fstop];
118 const Numeric* data_f_grid_begin = data_f_grid.data_handle();
119 const Numeric* data_f_grid_end = data_f_grid_begin + data_f_grid.size() - 1;
120 const Index i_data_fstart =
123 std::upper_bound(data_f_grid_begin, data_f_grid_end, f_grid_fmin)) -
125 const Index i_data_fstop = std::distance(
128 data_f_grid_begin + i_data_fstart, data_f_grid_end, f_grid_fmax));
131 ARTS_ASSERT(f_grid[i_fstart] > data_f_grid[i_data_fstart])
132 ARTS_ASSERT(f_grid[i_fstart] < data_f_grid[i_data_fstart + 1])
133 ARTS_ASSERT(f_grid[i_fstop] < data_f_grid[i_data_fstop])
134 ARTS_ASSERT(f_grid[i_fstop] > data_f_grid[i_data_fstop - 1])
137 const Index data_f_extent = i_data_fstop - i_data_fstart + 1;
141 const Range active_range(i_data_fstart, data_f_extent);
142 const ConstVectorView data_f_grid_active = data_f_grid[active_range];
144 Vector fit_result(data_f_grid.nelem());
145 VectorView fit_result_active = fit_result[active_range];
148 VectorView result_active = result[Range(i_fstart, f_extent)];
149 Vector xsec_interp(f_extent);
151 CalcXsec(fit_result, this_dataset_i, pressure, temperature);
163 gridpos(f_gp, data_f_grid_active, f_grid_active);
165 Matrix itw(f_gp.
nelem(), 2);
167 interp(xsec_interp, itw, fit_result_active, f_gp);
170 result_active += xsec_interp;
176 const Numeric pressure,
177 const Numeric temperature)
const {
178 for (Index i = 0; i < xsec.nelem(); i++) {
179 const ConstVectorView coeffs =
mfitcoeffs[dataset].data(i, joker);
180 xsec[i] = coeffs[
P00] + coeffs[
P10] * temperature + coeffs[
P01] * pressure +
181 coeffs[
P20] * temperature * temperature;
211 const Species::Species species) {
212 for (Index i = 0; i < xsec_data.
nelem(); i++)
213 if (xsec_data[i].
Species() == species)
return i;
226 const std::vector<std::shared_ptr<XsecRecord>>& xsec_data,
227 const Species::Species species) {
228 for (
auto& xsec : xsec_data) {
229 if (xsec->Species() == species)
return xsec;
235 os <<
"Species: " << xd.
Species() << std::endl;
Declarations required for the calculation of absorption coefficients.
The global header file for ARTS.
Index nelem() const ARTS_NOEXCEPT
Hitran crosssection class.
static constexpr Index mversion
Species::Species mspecies
static constexpr Index P20
ArrayOfGriddedField2 mfitcoeffs
static constexpr Index P00
String SpeciesName() const
Return species name.
static constexpr Index P01
void SetVersion(Index version)
Set species name.
static constexpr Index P10
void Extract(VectorView result, const Vector &f_grid, Numeric pressure, Numeric temperature, const Verbosity &verbosity) const
Calculate hitran cross section data.
void CalcXsec(VectorView xsec, const Index dataset, const Numeric pressure, const Numeric temperature) const
Calculate crosssections.
const Species::Species & Species() const
Return species index.
Helper macros for debugging.
#define ARTS_ASSERT(condition,...)
#define ARTS_USER_ERROR(...)
void gridpos(ArrayOfGridPos &gp, ConstVectorView old_grid, ConstVectorView new_grid, const Numeric &extpolfac)
Set up a grid position Array.
void interpweights(VectorView itw, const GridPos &tc)
Red 1D interpolation weights.
Numeric interp(ConstVectorView itw, ConstVectorView a, const GridPos &tc)
Red 1D Interpolate.
Header file for interpolation.cc.
This file contains declerations of functions of physical character.
std::ostream & operator<<(std::ostream &os, const XsecRecord &xd)
Index hitran_xsec_get_index(const ArrayOfXsecRecord &xsec_data, const Species::Species species)
Get the index in xsec_fit_data for the given species.
std::shared_ptr< XsecRecord > hitran_xsec_get_data(const std::vector< std::shared_ptr< XsecRecord > > &xsec_data, const Species::Species species)
Get the index in xsec_fit_data for the given species.
void RemoveNegativeXsec(Vector &xsec)
Methods and classes for HITRAN absorption cross section data.