49 const lm_hitran_2017::ModeOfLineMixing intmode = lm_hitran_2017::toModeOfLineMixingOrThrow(mode);
54 "Bad size of input species+lines");
58 std::for_each(lines.begin(), lines.end(), [](
auto& band){band.sort_by_frequency();});
64 for (
Index j=0; j<abs_species[i].
nelem(); j++) {
65 if (abs_species[i][j].Spec() not_eq Species::fromShortName(
"CO2"))
69 abs_lines_per_species[i].resize(0);
74 if (used[k])
continue;
80 if ((abs_species[i][j].Isotopologue() == lines[k].Isotopologue() or
82 (lines[k].lines.front().F0 <= uf and lines[k].lines.back().F0 >= lf)) {
84 abs_lines_per_species[i].push_back(lines[k]);
104 "Cannot support any Jacobian at this time");
106 "Bad size of input species+lines");
108 "Bad size of input species+vmrs");
113 auto& specs = abs_species[i];
114 for (
auto& spec: specs) {
115 if (Species::fromShortName(
"H2O") == spec.Spec()) {
116 vmrs[1] = rtp_vmr[i];
118 else if (Species::fromShortName(
"CO2") == spec.Spec()) {
119 vmrs[0] = rtp_vmr[i];
126 if (abs_lines_per_species[i].
nelem() and
127 (abs_lines_per_species[i].front().population == Absorption::PopulationType::ByHITRANFullRelmat or
128 abs_lines_per_species[i].front().population == Absorption::PopulationType::ByHITRANRosenkranzRelmat))
140 for (
auto& abs_lines: abs_lines_per_species) {
141 for (
auto& band: abs_lines) {
142 if (band.population == Absorption::PopulationType::ByHITRANFullRelmat or band.population == Absorption::PopulationType::ByHITRANRosenkranzRelmat) {
158 const Numeric& rtp_temperature,
160 const Index& lbl_checked,
164 "Bad size of input species+lines");
166 "Bad size of input species+vmrs");
168 "Please set lbl_checked true to use this function");
170 for (
Index i = 0; i < abs_species.
nelem(); i++) {
171 for (
auto& band : abs_lines_per_species[i]) {
172 if (band.OnTheFlyLineMixing() and band.DoLineMixing(rtp_pressure)) {
174 const Vector line_shape_vmr =
175 band.BroadeningSpeciesVMR(rtp_vmr, abs_species);
184 ecs_data[band.quantumidentity],
188 jacobian_quantities);
189 propmat_clearsky.
Kjj() +=
abs.real();
192 for (
Index j = 0; j < jacobian_quantities.
nelem(); j++) {
193 const auto& deriv = jacobian_quantities[j];
195 if (not deriv.propmattype())
continue;
197 if (deriv == abs_species[i]) {
198 dpropmat_clearsky_dx[j].Kjj() +=
abs.real();
200 dpropmat_clearsky_dx[j].Kjj() +=
dabs[j].real();
217 const Numeric& rtp_temperature,
221 const Index& lbl_checked,
225 "Only for stokes dim 4");
227 "Bad size of input species+lines");
229 "Bad size of input species+vmrs");
231 "Please set lbl_checked true to use this function");
240 const auto polarization_scale_dtheta_data =
242 const auto polarization_scale_deta_data =
245 for (
Index i = 0; i < abs_species.
nelem(); i++) {
246 for (
auto& band : abs_lines_per_species[i]) {
247 if (band.OnTheFlyLineMixing() and band.DoLineMixing(rtp_pressure)) {
249 const Vector line_shape_vmr =
250 band.BroadeningSpeciesVMR(rtp_vmr, abs_species);
257 const auto [
abs,
dabs, error] =
264 ecs_data[band.quantumidentity],
268 jacobian_quantities);
277 for (
Index j = 0; j < jacobian_quantities.
nelem(); j++) {
278 const auto& deriv = jacobian_quantities[j];
280 if (not deriv.propmattype())
continue;
289 polarization_scale_dtheta_data, polarization),
291 polarization_scale_deta_data, polarization),
302 polarization_scale_dtheta_data, polarization),
304 polarization_scale_deta_data, polarization),
315 polarization_scale_dtheta_data, polarization),
317 polarization_scale_deta_data, polarization),
321 }
else if (deriv == abs_species[i]) {
327 dpropmat_clearsky_dx[j].Kjj() +=
dabs[j].real();
342 const Index& rosenkranz_adaptation,
344 for (
auto& band: abs_lines) {
345 if (band.population == Absorption::PopulationType::ByRovibLinearDipoleLineMixing or band.population == Absorption::PopulationType::ByMakarovFullRelmat) {
357 const Index& rosenkranz_adaptation,
359 for (
auto& abs_lines: abs_lines_per_species) {
375 const String& scaling_type,
379 const String& lambda_type,
381 const String& collisional_distance_type,
382 const Vector& collisional_distance,
385 const Species::Species spec = Species::fromShortName(species);
387 auto& data = ecs_data[qid][spec];
391 data.collisional_distance =
LineShapeModelParameters(LineShape::toTemperatureModelOrThrow(collisional_distance_type), collisional_distance);
406 ARTS_USER_ERROR_IF(mp1.
type not_eq mp2.type,
"Can only scale and add same type\nmp1: ", mp1,
"\nmp2: ", mp2)
407 mp1.
X0 += mp2.X0 * x;
408 mp1.
X1 += mp2.X1 * x;
409 mp1.
X2 += mp2.X2 * x;
410 mp1.
X3 += mp2.X3 * x;
413 for (
auto& ecs: ecs_data) {
420 "Can only have joker species, finds: [", specs,
']')
422 auto spec = specs[i].Spec();
424 if (spec == Species::Species::Bath)
continue;
426 auto& data = ecs[spec];
429 if (std::isinf(data.mass)) {
435 airdata.
scaling = data.scaling;
436 airdata.
beta = data.beta;
437 airdata.
lambda = data.lambda;
439 airdata.
mass = data.mass * vmr;
441 scale(airdata.
beta, vmr);
442 scale(airdata.
lambda, vmr);
447 scale_and_add_or_throw(airdata.
scaling, data.scaling, vmr);
448 scale_and_add_or_throw(airdata.
beta, data.beta, vmr);
449 scale_and_add_or_throw(airdata.
lambda, data.lambda, vmr);
451 airdata.
mass += data.mass * vmr;
457 if (sumvmr not_eq 0 and sumvmr not_eq 1) {
458 scale(airdata.
scaling, 1.0 / sumvmr);
459 scale(airdata.
beta, 1.0 / sumvmr);
460 scale(airdata.
lambda, 1.0 / sumvmr);
462 airdata.
mass /= sumvmr;
465 ecs[Species::Species::Bath] = airdata;
495 for (
const auto *key: {
"CO2-626",
"CO2-628",
"CO2-636"}) {
499 ecs[Species::Species::Nitrogen].lambda =
LineShapeModelParameters(LineShapeTemperatureModel::T1, 0.81, 0.0152, 0, 0);
516 for (
const auto *key: {
"CO2-626",
"CO2-628",
"CO2-636"}) {
520 ecs[Species::Species::CarbonDioxide].lambda =
LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.61, 0, 0, 0);
521 ecs[Species::Species::CarbonDioxide].beta =
LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.052, 0, 0, 0);
This can be used to make arrays out of anything.
Index nelem() const ARTS_NOEXCEPT
Number of elements.
Index nelem() const noexcept
Returns the number of elements.
VectorView Kjj(const Index iz=0, const Index ia=0)
Vector view to diagonal elements.
Index StokesDimensions() const
The stokes dimension of the propagation matrix.
#define ARTS_USER_ERROR_IF(condition,...)
constexpr bool good_enum(EnumType x) noexcept
Checks if the enum number is good.
Namespace and functions to deal with HITRAN linemixing.
LineShape::ModelParameters LineShapeModelParameters
void ecs_dataAddTran2011(MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Verbosity &)
WORKSPACE METHOD: ecs_dataAddTran2011.
void propmat_clearskyAddOnTheFlyLineMixingWithZeeman(PropagationMatrix &propmat_clearsky, ArrayOfPropagationMatrix &dpropmat_clearsky_dx, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Vector &f_grid, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfRetrievalQuantity &jacobian_quantities, const Numeric &rtp_pressure, const Numeric &rtp_temperature, const Vector &rtp_vmr, const Vector &rtp_mag, const Vector &rtp_los, const Index &lbl_checked, const Verbosity &)
WORKSPACE METHOD: propmat_clearskyAddOnTheFlyLineMixingWithZeeman.
void abs_lines_per_speciesAdaptOnTheFlyLineMixing(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const MapOfErrorCorrectedSuddenData &ecs_data, const Vector &t_grid, const Numeric &pressure, const Index &order, const Index &robust, const Index &rosenkranz_adaptation, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesAdaptOnTheFlyLineMixing.
void ecs_dataAddMakarov2020(MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Verbosity &)
WORKSPACE METHOD: ecs_dataAddMakarov2020.
void abs_linesAdaptOnTheFlyLineMixing(ArrayOfAbsorptionLines &abs_lines, const MapOfErrorCorrectedSuddenData &ecs_data, const Vector &t_grid, const Numeric &pressure, const Index &order, const Index &robust, const Index &rosenkranz_adaptation, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesAdaptOnTheFlyLineMixing.
void propmat_clearskyAddHitranLineMixingLines(PropagationMatrix &propmat_clearsky, const HitranRelaxationMatrixData &abs_hitran_relmat_data, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const SpeciesIsotopologueRatios &isotopologue_ratios, const Vector &f_grid, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfRetrievalQuantity &jacobian_quantities, const Numeric &rtp_pressure, const Numeric &rtp_temperature, const Vector &rtp_vmr, const Verbosity &)
WORKSPACE METHOD: propmat_clearskyAddHitranLineMixingLines.
void ecs_dataSetSpeciesData(MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const QuantumIdentifier &qid, const String &species, const String &scaling_type, const Vector &scaling, const String &beta_type, const Vector &beta, const String &lambda_type, const Vector &lambda, const String &collisional_distance_type, const Vector &collisional_distance, const Verbosity &)
WORKSPACE METHOD: ecs_dataSetSpeciesData.
void abs_lines_per_speciesAdaptHitranLineMixing(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const HitranRelaxationMatrixData &abs_hitran_relmat_data, const Vector &t_grid, const Numeric &pressure, const Index &order, const Verbosity &)
WORKSPACE METHOD: abs_lines_per_speciesAdaptHitranLineMixing.
void ecs_dataInit(MapOfErrorCorrectedSuddenData &ecs_data, const Verbosity &)
WORKSPACE METHOD: ecs_dataInit.
void ecs_dataSetMeanAir(MapOfErrorCorrectedSuddenData &ecs_data, const Vector &vmrs, const ArrayOfSpeciesTag &specs, const Verbosity &)
WORKSPACE METHOD: ecs_dataSetMeanAir.
void ecs_dataAddRodrigues1997(MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Verbosity &)
WORKSPACE METHOD: ecs_dataAddRodrigues1997.
void propmat_clearskyAddOnTheFlyLineMixing(PropagationMatrix &propmat_clearsky, ArrayOfPropagationMatrix &dpropmat_clearsky_dx, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Vector &f_grid, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfRetrievalQuantity &jacobian_quantities, const Numeric &rtp_pressure, const Numeric &rtp_temperature, const Vector &rtp_vmr, const Index &lbl_checked, const Verbosity &)
WORKSPACE METHOD: propmat_clearskyAddOnTheFlyLineMixing.
void abs_hitran_relmat_dataReadHitranRelmatDataAndLines(HitranRelaxationMatrixData &abs_hitran_relmat_data, ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const String &basedir, const Numeric &linemixinglimit, const Numeric &fmin, const Numeric &fmax, const Numeric &stot, const String &mode, const Verbosity &)
WORKSPACE METHOD: abs_hitran_relmat_dataReadHitranRelmatDataAndLines.
NUMERIC Numeric
The type to use for all floating point numbers.
INDEX Index
The type to use for all integer numbers and indices.
void ecs_eigenvalue_adaptation(AbsorptionLines &band, const Vector &temperatures, const ErrorCorrectedSuddenData &ecs_data, const Numeric P0, const Index ord, const bool robust, const bool rosenkranz_adaptation, const Verbosity &verbosity)
EcsReturn ecs_absorption(const Numeric T, const Numeric H, const Numeric P, const Numeric this_vmr, const Vector &vmrs, const ErrorCorrectedSuddenData &ecs_data, const Vector &f_grid, const Zeeman::Polarization zeeman_polarization, const AbsorptionLines &band, const ArrayOfRetrievalQuantity &jacobian_quantities)
Index nelem(const Lines &l)
Number of lines.
constexpr auto kaycm_per_atm2hz_per_pa(T x) noexcept -> decltype(x *kaycm2freq(pa2atm(1)))
Conversion from cm-1 per atmosphere to Hz per Pascal.
constexpr auto angstrom2meter(T x) noexcept -> decltype(x *1e-10)
Conversion from Å to meter.
constexpr auto deg2rad(T x) noexcept -> decltype(x *one_degree_in_radians)
Converts degrees to radians.
SpeciesIsotopologueRatios isotopologue_ratios()
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.
constexpr Numeric mean_mass(Species spec, const IsotopologueRatios &ir) noexcept
constexpr const IsotopeRecord & select_joker(Species spec) noexcept
const PolarizationVector & SelectPolarization(const AllPolarizationVectors &data, Polarization type) noexcept
Selects the polarization vector depending on polarization type.
Derived FromGrids(Numeric u, Numeric v, Numeric w, Numeric z, Numeric a) noexcept
Computes the derived plane from ARTS grids.
AllPolarizationVectors AllPolarization_deta(Numeric theta, Numeric eta) noexcept
The derivative of AllPolarization wrt eta.
AllPolarizationVectors AllPolarization_dtheta(Numeric theta, const Numeric eta) noexcept
The derivative of AllPolarization wrt theta.
Polarization
Zeeman polarization selection.
void dsum(PropagationMatrix &pm, const ComplexVectorView &abs, const ComplexVectorView &dabs, const PolarizationVector &polvec, const PolarizationVector &dpolvec_dtheta, const PolarizationVector &dpolvec_deta, const Numeric dH, const Numeric dt, const Numeric de, const bool do_phase) ARTS_NOEXCEPT
Sums the Zeeman components derivatives into a propagation matrix.
void sum(PropagationMatrix &pm, const ComplexVectorView &abs, const PolarizationVector &polvec, const bool do_phase) ARTS_NOEXCEPT
Sums the Zeeman components into a propagation matrix.
AllPolarizationVectors AllPolarization(Numeric theta, Numeric eta) noexcept
Computes the polarization of each polarization type.
void hitran_lm_eigenvalue_adaptation(AbsorptionLines &band, const Vector &temperatures, const HitranRelaxationMatrixData &hitran, const Numeric P0, const Index ord)
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.
Vector compute(const Numeric p, const Numeric t, const Numeric xco2, const Numeric xh2o, const ConstVectorView &invcm_grid, const Numeric stotmax, const calctype type)
Stuff related to the propagation matrix.
Quantum::Number::GlobalState QuantumIdentifier
LineShapeModelParameters collisional_distance
LineShapeModelParameters lambda
LineShapeModelParameters beta
LineShapeModelParameters scaling
Coefficients and temperature model for SingleSpeciesModel.
A logical struct for global quantum numbers with species identifiers.