34#ifndef lineshapemodel_h
35#define lineshapemodel_h
109 static_assert(
Index(Options::LineShapeCoeff::FINAL) ==
N,
"Must update either LineShapeCoeff options or ModelParameters");
117 Numeric inX0=std::numeric_limits<Numeric>::quiet_NaN(),
118 Numeric inX1=std::numeric_limits<Numeric>::quiet_NaN(),
119 Numeric inX2=std::numeric_limits<Numeric>::quiet_NaN(),
120 Numeric inX3=std::numeric_limits<Numeric>::quiet_NaN())
121 noexcept : type(intype), X0(inX0), X1(inX1), X2(inX2), X3(inX3) {}
123 template <
typename VectorType>
constexpr
126 const auto n = std::size(
v);
127 ARTS_ASSERT(n <=
N,
"Must have at most ",
N,
" inputs, got: ", n)
129 case 4: X3 =
v[3]; [[fallthrough]];
130 case 3: X2 =
v[2]; [[fallthrough]];
131 case 2: X1 =
v[1]; [[fallthrough]];
149 return X0 + (T - 200.0) * (X1 - X0) / (250.0 - 200.0);
151 return X2 + (T - 296.0) * (X3 - X2) / (340.0 - 296.0);
152 return X1 + (T - 250.0) * (X2 - X1) / (296.0 - 250.0);
164 return (X1 - X0) / (250.0 - 200.0);
166 return (X3 - X2) / (340.0 - 296.0);
167 return (X2 - X1) / (296.0 - 250.0);
178 return 1 - (T - 200.0) / (250.0 - 200.0);
190 return (T - 200.0) / (250.0 - 200.0);
193 return 1 - (T - 250.0) / (296.0 - 250.0);
206 return 1 - (T - 296.0) / (340.0 - 296.0);
207 return (T - 250.0) / (296.0 - 250.0);
218 return (T - 296.0) / (340.0 - 296.0);
256 case TemperatureModel::None:
257 return {TemperatureModel::None, 0, 0, 0, 0};
258 case TemperatureModel::T0:
259 return {TemperatureModel::T0, 0, 0, 0, 0};
260 case TemperatureModel::T1:
261 return {TemperatureModel::T1, 0, 0, 0, 0};
262 case TemperatureModel::T2:
263 return {TemperatureModel::T2, 0, 0, 0, 0};
264 case TemperatureModel::T3:
265 return {TemperatureModel::T3, 0, 0, 0, 0};
266 case TemperatureModel::T4:
267 return {TemperatureModel::T4, 0, 0, 0, 0};
268 case TemperatureModel::T5:
269 return {TemperatureModel::T5, 0, 0, 0, 0};
270 case TemperatureModel::LM_AER:
271 return {TemperatureModel::LM_AER, 0, 0, 0, 0};
272 case TemperatureModel::DPL:
273 return {TemperatureModel::DPL, 0, 0, 0, 0};
274 case TemperatureModel::POLY:
275 return {TemperatureModel::POLY, 0, 0, 0, 0};
276 case TemperatureModel::FINAL:
277 return {TemperatureModel::None, 0, 0, 0, 0};
279 return {TemperatureModel::None, 0, 0, 0, 0};
284 case TemperatureModel::None:
286 case TemperatureModel::T0:
288 case TemperatureModel::T1:
290 case TemperatureModel::T2:
292 case TemperatureModel::T3:
293 return (mp.X0 == 0 and mp.X1 == 0);
294 case TemperatureModel::T4:
295 return (mp.X0 == 0 and mp.X1 == 0);
296 case TemperatureModel::T5:
298 case TemperatureModel::LM_AER:
299 return (mp.X0 == 0 and mp.X1 == 0 and mp.X2 == 0 and mp.X3 == 0);
300 case TemperatureModel::DPL:
301 return (mp.X0 == 0 and mp.X2 == 0);
302 case TemperatureModel::POLY:
303 return (mp.X0 == 0 and mp.X1 == 0 and mp.X2 == 0 and mp.X3 == 0);
304 case TemperatureModel::FINAL:
312 case TemperatureModel::None:
314 case TemperatureModel::T0:
316 case TemperatureModel::T1:
318 case TemperatureModel::T2:
320 case TemperatureModel::T3:
322 case TemperatureModel::T4:
324 case TemperatureModel::T5:
325 return (0.25 + 1.5*mp.X1);
326 case TemperatureModel::LM_AER:
328 case TemperatureModel::DPL:
330 case TemperatureModel::POLY:
332 case TemperatureModel::FINAL:
333 return std::numeric_limits<Numeric>::quiet_NaN();
335 return std::numeric_limits<Numeric>::quiet_NaN();
344 std::array<ModelParameters, nVars>
X;
351 ModelParameters
G2=ModelParameters{},
352 ModelParameters
D2=ModelParameters{},
353 ModelParameters
FVC=ModelParameters{},
354 ModelParameters
ETA=ModelParameters{},
355 ModelParameters
Y=ModelParameters{},
356 ModelParameters
G=ModelParameters{},
357 ModelParameters DV=ModelParameters{})
360#define ACCESS_INTERNAL(VARPOS) \
361 constexpr ModelParameters& VARPOS() noexcept { return std::get<Index(Variable::VARPOS)>(X); } \
362 constexpr ModelParameters VARPOS() const noexcept { return std::get<Index(Variable::VARPOS)>(X); }
372#undef ACCESS_INTERNAL
375 constexpr std::array<ModelParameters, nVars>&
Data() noexcept {
return X; }
378 [[nodiscard]]
constexpr const std::array<ModelParameters, nVars>&
Data() const noexcept {
return X; }
386#define MODELPARAMCASESETTER(X) \
400 case Variable::FINAL:
break;
402#undef MODELPARAMCASESETTER
412 #define MODELPARAMCASEGETTER(X) case Variable::X: out = X(); break;
424 case Variable::FINAL:
break;
427 #undef MODELPARAMCASEGETTER
461#pragma GCC diagnostic push
462#pragma GCC diagnostic ignored "-Wreturn-type"
463constexpr std::string_view shapetype2metadatastring(Type type)
noexcept {
466 return "The line shape type is the Doppler profile\n";
468 return "The line shape type is the Lorentz profile.\n";
470 return "The line shape type is the Voigt profile.\n";
472 return "The line shape type is the speed-dependent Voigt profile.\n";
474 return "The line shape type is the Hartmann-Tran profile.\n";
476 return "There's an error.\n";
479#pragma GCC diagnostic pop
492 constexpr Output() noexcept = default;
497 constexpr Output(
const Output&)
noexcept =
default;
498 constexpr Output(Output&&) noexcept = default;
499 constexpr Output& operator=(const Output&) noexcept = default;
500 constexpr Output& operator=(Output&&) noexcept = default;
502 friend
std::ostream& operator<<(
std::ostream& os, Output x);
507 return {x.G0, -x.D0, x.G2, -x.D2, x.FVC, x.ETA, x.Y, x.G, -x.DV};
512 return {-x.G0, -x.D0, -x.G2, -x.D2, -x.FVC, -x.ETA, -x.Y, -x.G, -x.DV};
516constexpr Output
si2cgs(Output x)
noexcept {
580static constexpr std::string_view bath_broadening =
"AIR";
583static constexpr std::string_view self_broadening =
"SELF";
591 std::vector<SingleSpeciesModel>
mdata;
598 explicit Model(
const std::vector<SingleSpeciesModel>& assm) noexcept : mdata(assm) {}
604 explicit Model(std::vector<SingleSpeciesModel>&& assm) noexcept : mdata(std::move(assm)) {}
629 std::array<Numeric, 12> aer_interp = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
noexcept;
635 [[nodiscard]]
bool OK(Type type,
bool self,
bool bath,
636 const std::size_t nspecies)
const noexcept;
638#define LSPC(XVAR, PVAR) \
640 Numeric T, Numeric T0, Numeric P [[maybe_unused]], const ConstVectorView& vmrs) \
653#define LSPCV(XVAR, PVAR) \
654 Numeric d##XVAR##_dVMR(Numeric T, \
656 Numeric P [[maybe_unused]], \
657 const Index deriv_pos) const noexcept;
669#define LSPCT(XVAR, PVAR) \
670 Numeric d##XVAR##_dT( \
671 Numeric T, Numeric T0, Numeric P [[maybe_unused]], const ConstVectorView& vmrs) \
685#define LSPDC(XVAR, DERIV, PVAR) \
686 Numeric d##XVAR##DERIV(Numeric T, \
688 Numeric P [[maybe_unused]], \
690 const ConstVectorView& vmrs) const noexcept;
731 LSPDC(DV, _dT0, P* P)
732 LSPDC(DV, _dX0, P* P)
733 LSPDC(DV, _dX1, P* P)
734 LSPDC(DV, _dX2, P* P)
735 LSPDC(DV, _dX3, P* P)
747 [[nodiscard]] Output GetParams(
Numeric T,
761 [[nodiscard]] Output GetParams(
Numeric T,
764 size_t k)
const noexcept;
775 [[nodiscard]] Output GetTemperatureDerivs(
Numeric T,
807 Jacobian::Line deriv)
const noexcept;
845 auto begin() {
return mdata.begin(); }
846 auto end() {
return mdata.end(); }
849 [[nodiscard]]
const std::vector<SingleSpeciesModel>&
Data() const noexcept {
return mdata; }
852 std::vector<SingleSpeciesModel>&
Data() noexcept {
return mdata; }
876 [[nodiscard]] std::pair<bool, bool> Match(
const Model& other)
const noexcept;
918 std::array<Numeric, 12> aer_interp = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
946 LineShape::Type& type,
954namespace LegacyLineFunctionData {
956#pragma GCC diagnostic push
957#pragma GCC diagnostic ignored "-Wreturn-type"
960 case TemperatureModel::None:
962 case TemperatureModel::T0:
964 case TemperatureModel::T1:
966 case TemperatureModel::T2:
968 case TemperatureModel::T3:
970 case TemperatureModel::T4:
972 case TemperatureModel::T5:
974 case TemperatureModel::LM_AER:
976 case TemperatureModel::DPL:
978 case TemperatureModel::POLY:
980 case TemperatureModel::FINAL:
break;
983#pragma GCC diagnostic pop
993namespace LegacyLineMixingData {
1008#pragma GCC diagnostic push
1009#pragma GCC diagnostic ignored "-Wreturn-type"
1012 case TypeLM::LM_NONE:
1014 case TypeLM::LM_LBLRTM:
1016 case TypeLM::LM_LBLRTM_O2NonResonant:
1018 case TypeLM::LM_2NDORDER:
1020 case TypeLM::LM_1STORDER:
1022 case TypeLM::LM_BYBAND:
1026#pragma GCC diagnostic pop
1033namespace LegacyPressureBroadeningData {
1055#pragma GCC diagnostic push
1056#pragma GCC diagnostic ignored "-Wreturn-type"
1059 case TypePB::PB_NONE:
1061 case TypePB::PB_AIR_BROADENING:
1063 case TypePB::PB_AIR_AND_WATER_BROADENING:
1065 case TypePB::PB_PLANETARY_BROADENING:
1069#pragma GCC diagnostic pop
1080 Species::Species self_spec);
A constant view of a Vector.
Main line shape model class.
void resize(Index n)
Resize function for Model.
SingleSpeciesModel & operator[](Index i)
Get a SingleSpeciesModel.
Model(const Model &m) noexcept
Init from copying itself.
Model(std::vector< SingleSpeciesModel > &&assm) noexcept
Init from moving a vector.
Model(const std::vector< SingleSpeciesModel > &assm) noexcept
Init from copying a vector.
Index nelem() const
Number of species in Model.
std::vector< SingleSpeciesModel > mdata
Model(Model &&m) noexcept
Init from moving a itself.
Model(Index n=0) noexcept
Default init just sets the size.
void reserve(Index n)
Reserve function for Model.
Model & operator=(Model &&m)=default
Move and equals.
friend std::istream & from_linefunctiondata(std::istream &data, Type &type, bool &self, bool &bath, Model &m, ArrayOfSpecies &species)
const SingleSpeciesModel & operator[](Index i) const
Get a SingleSpeciesModel.
friend std::istream & from_artscat4(std::istream &is, Type &type, bool &self, bool &bath, Model &m, ArrayOfSpecies &species, const QuantumIdentifier &qid)
std::vector< SingleSpeciesModel > & Data() noexcept
The line shape model data reference.
const std::vector< SingleSpeciesModel > & Data() const noexcept
The line shape model data.
Index size() const
Number of species in Model.
Model & operator=(const Model &m)=default
Copy and equals.
Compute the line shape parameters for a single broadening species.
constexpr const std::array< ModelParameters, nVars > & Data() const noexcept
Get const internal Data reference.
constexpr std::array< ModelParameters, nVars > & Data() noexcept
Get internal Data reference.
constexpr ModelParameters Get(Variable var) const noexcept
Get variable by type.
friend std::ostream & operator<<(std::ostream &os, const SingleSpeciesModel &ssm)
std::array< ModelParameters, nVars > X
constexpr SingleSpeciesModel(ModelParameters G0=ModelParameters{}, ModelParameters D0=ModelParameters{}, ModelParameters G2=ModelParameters{}, ModelParameters D2=ModelParameters{}, ModelParameters FVC=ModelParameters{}, ModelParameters ETA=ModelParameters{}, ModelParameters Y=ModelParameters{}, ModelParameters G=ModelParameters{}, ModelParameters DV=ModelParameters{})
Default initialization.
bofstream & write(bofstream &bof) const
Binary write for SingleSpeciesModel.
bifstream & read(bifstream &bif)
Binary read for SingleSpeciesModel.
friend std::istream & operator>>(std::istream &is, SingleSpeciesModel &ssm)
constexpr void Set(Variable var, const ModelParameters &x) noexcept
Set variable to a different ModelParameters.
std::pair< bool, bool > MatchTypes(const SingleSpeciesModel &other) const noexcept
Binary output file stream class.
Binary output file stream class.
Constants of physical expressions as constexpr.
#define ARTS_ASSERT(condition,...)
This file contains basic functions to handle ASCII files.
Routines for setting up the jacobian.
LineShape::TemperatureModel LineShapeTemperatureModel
LineShape::Variable LineShapeVariable
#define LSPCV(XVAR, PVAR)
LineShape::Type LineShapeType
#define LSPCT(XVAR, PVAR)
#define MODELPARAMCASEGETTER(X)
#define LSPDC(XVAR, DERIV, PVAR)
Jacobian::Line select_derivativeLineShape(const String &var, const String &coeff)
Return the derivative type based on string input.
#define MODELPARAMCASESETTER(X)
NUMERIC Numeric
The type to use for all floating point numbers.
INDEX Index
The type to use for all integer numbers and indices.
constexpr auto freq2kaycm(T x) noexcept -> decltype(x/(100 *c))
Conversion from Hz to Kayser wavenumber.
std::vector< Variable > linemixingtag2variablesvector(String type)
Line mixing models from string.
std::vector< Variable > lineshapetag2variablesvector(String type)
Line shape models from string.
constexpr Index temperaturemodel2legacynelem(TemperatureModel type) noexcept
Length per variable for temperature model.
LegacyLineMixingData::TypeLM string2typelm(String type)
Line mixing types from string.
constexpr Index typelm2nelem(LegacyLineMixingData::TypeLM type)
Line mixing types to number.
Model vector2modellm(Vector x, LegacyLineMixingData::TypeLM type)
LineShape::Model from legacy input vector.
TypeLM
Line mixing types that used to exist.
@ LM_LBLRTM_O2NonResonant
Index self_listed(const QuantumIdentifier &qid, LegacyPressureBroadeningData::TypePB t)
Pressure broadening if self exist.
void vector2modelpb(LineShape::Type &mtype, bool &self, bool &bath, Model &m, ArrayOfSpecies &species, Vector x, LegacyPressureBroadeningData::TypePB type, bool self_in_list, Species::Species self_spec)
LineShape::Model from legacy input vector.
constexpr Index typepb2nelem(LegacyPressureBroadeningData::TypePB type)
Pressure broadening types to number of elements.
LegacyPressureBroadeningData::TypePB string2typepb(String type)
Pressure broadening types from string.
TypePB
Pressure broadening types that used to exist.
@ PB_AIR_AND_WATER_BROADENING
@ PB_PLANETARY_BROADENING
Computations of line shape derived parameters.
ENUMCLASS(Type, char, DP, LP, VP, SDVP, HTP) const expr std constexpr Output mirroredOutput(Output x) noexcept
Type of line shape to compute.
constexpr Output negativeOutput(Output x) noexcept
Output turned negative.
Model lblrtm_model(Numeric sgam, Numeric nself, Numeric agam, Numeric nair, Numeric psf, std::array< Numeric, 12 > aer_interp)
constexpr Output differenceOutput(Output y, Output x) noexcept
Diff of two output.
Numeric & SingleModelParameter(ModelParameters &mp, const String &type)
Get a coefficient from ModelParameters by name.
Model MetaData2ModelShape(const String &s)
constexpr ModelParameters modelparameterGetEmpty(const TemperatureModel t) noexcept
std::istream & from_linefunctiondata(std::istream &data, Type &type, bool &self, bool &bath, Model &m, ArrayOfSpecies &species)
constexpr bool modelparameterEmpty(const ModelParameters mp) noexcept
Model hitran_model(Numeric sgam, Numeric nself, Numeric agam, Numeric nair, Numeric psf)
constexpr Numeric modelparameterFirstExponent(const ModelParameters mp) noexcept
Vector mass(const ConstVectorView &atmospheric_vmrs, const ArrayOfArrayOfSpeciesTag &atmospheric_species, const ArrayOfSpecies &lineshape_species, const SpeciesIsotopologueRatios &ir) ARTS_NOEXCEPT
Returns a mass vector for this model's main calculations.
std::istream & from_pressurebroadeningdata(std::istream &data, LineShape::Type &type, bool &self, bool &bath, Model &m, ArrayOfSpecies &species, const QuantumIdentifier &qid)
Legacy reading of old deprecated PressureBroadeningData class.
ArrayOfString ModelMetaDataArray(const LineShape::Model &m, const bool self, const ArrayOfSpecies &sts, const Numeric T0)
ENUMCLASS(TemperatureModel, char, None, T0, T1, T2, T3, T4, T5, LM_AER, DPL, POLY) ENUMCLASS(Variable
Temperature models.
String modelparameters2metadata(const ModelParameters mp, const Numeric T0)
std::istream & operator>>(std::istream &is, Model &m)
constexpr Output si2cgs(Output x) noexcept
Output turned from SI to CGS units.
String ModelShape2MetaData(const Model &m)
std::istream & from_artscat4(std::istream &is, Type &type, bool &self, bool &bath, Model &m, ArrayOfSpecies &species, const QuantumIdentifier &qid)
std::ostream & operator<<(std::ostream &os, const Model &m)
std::istream & from_linemixingdata(std::istream &data, Model &lsc)
Legacy reading of old deprecated LineMixingData class.
constexpr Index nVars
Current max number of line shape variables.
Vector vmrs(const ConstVectorView &atmospheric_vmrs, const ArrayOfArrayOfSpeciesTag &atmospheric_species, const ArrayOfSpecies &lineshape_species) ARTS_NOEXCEPT
Returns a VMR vector for this model's main calculations.
VectorView var(VectorView var, const Vector &y, const ArrayOfVector &ys, const Index start, const Index end_tmp)
Compute the variance of the ranged ys.
VectorView std(VectorView std, const Vector &y, const ArrayOfVector &ys, const Index start, const Index end_tmp)
Compute the standard deviation of the ranged ys.
void read(HitranRelaxationMatrixData &hitran, ArrayOfAbsorptionLines &bands, const SpeciesIsotopologueRatios &isotopologue_ratio, const String &basedir, const Numeric linemixinglimit, const Numeric fmin, const Numeric fmax, const Numeric stot, const ModeOfLineMixing mode)
Read from HITRAN online line mixing file.
Coefficients and temperature model for SingleSpeciesModel.
static constexpr Numeric special_linemixing_aer_dX1(Numeric T) noexcept
The derivative of special_linemixing_aer wrt X1.
constexpr ModelParameters(TemperatureModel intype, VectorType &&v) ARTS_NOEXCEPT
static constexpr Numeric special_linemixing_aer_dX0(Numeric T) noexcept
The derivative of special_linemixing_aer wrt X0.
constexpr Numeric special_linemixing_aer_dT(Numeric T) const noexcept
The temperature derivative of special_linemixing_aer.
static constexpr Numeric special_linemixing_aer_dX2(Numeric T) noexcept
The derivative of special_linemixing_aer wrt X2.
static constexpr Numeric special_linemixing_aer_dX3(Numeric T) noexcept
The derivative of special_linemixing_aer wrt X3.
constexpr ModelParameters(TemperatureModel intype=TemperatureModel::None, Numeric inX0=std::numeric_limits< Numeric >::quiet_NaN(), Numeric inX1=std::numeric_limits< Numeric >::quiet_NaN(), Numeric inX2=std::numeric_limits< Numeric >::quiet_NaN(), Numeric inX3=std::numeric_limits< Numeric >::quiet_NaN()) noexcept
constexpr Numeric special_linemixing_aer(Numeric T) const noexcept
Line mixing as done by AER data in ARTS.
A logical struct for global quantum numbers with species identifiers.