17#include "matpack_data.h"
18#include "propagationmatrix.h"
25 const Numeric& linemixinglimit,
31 const lm_hitran_2017::ModeOfLineMixing intmode =
32 lm_hitran_2017::toModeOfLineMixingOrThrow(mode);
38 "Bad size of input species+lines");
50 std::for_each(lines.begin(), lines.end(), [](
auto& band) {
51 band.sort_by_frequency();
56 for (Index i = 0; i < abs_species.
nelem(); i++) {
57 for (Index j = 0; j < abs_species[i].
nelem(); j++) {
58 if (abs_species[i][j].Spec() not_eq Species::fromShortName(
"CO2"))
62 abs_lines_per_species[i].resize(0);
66 for (Index k = 0; k < lines.
nelem(); k++) {
67 if (used[k])
continue;
69 const Numeric lf{abs_species[i][j].lower_freq > 0
70 ? abs_species[i][j].lower_freq
71 : -std::numeric_limits<Numeric>::max()};
72 const Numeric uf{abs_species[i][j].upper_freq > 0
73 ? abs_species[i][j].upper_freq
74 : std::numeric_limits<Numeric>::max()};
77 if ((abs_species[i][j].Isotopologue() == lines[k].Isotopologue() or
78 abs_species[i][j].Isotopologue() ==
80 (lines[k].lines.front().F0 <= uf and
81 lines[k].lines.back().F0 >= lf)) {
83 abs_lines_per_species[i].push_back(lines[k]);
91 PropagationMatrix& propmat_clearsky,
99 const Numeric& rtp_pressure,
100 const Numeric& rtp_temperature,
101 const Vector& rtp_vmr,
104 "Cannot support any Jacobian at this time");
106 "Bad size of input species+lines");
108 "Bad size of input species+vmrs");
112 for (Index i = 0; i < abs_species.
nelem(); i++) {
113 auto& specs = abs_species[i];
114 if (select_abs_species.
nelem() and select_abs_species not_eq specs)
116 for (
auto& spec : specs) {
117 if (Species::fromShortName(
"H2O") == spec.Spec()) {
118 vmrs[1] = rtp_vmr[i];
119 }
else if (Species::fromShortName(
"CO2") == spec.Spec()) {
120 vmrs[0] = rtp_vmr[i];
124 vmrs[2] = 1.0 - vmrs[1] - vmrs[0];
126 for (Index i = 0; i < abs_species.
nelem(); i++) {
127 if (abs_lines_per_species[i].nelem() and
128 (abs_lines_per_species[i].front().population ==
129 Absorption::PopulationType::ByHITRANFullRelmat or
130 abs_lines_per_species[i].front().population ==
131 Absorption::PopulationType::ByHITRANRosenkranzRelmat))
132 propmat_clearsky.Kjj() +=
134 abs_lines_per_species[i],
146 const Vector& t_grid,
147 const Numeric& pressure,
150 for (
auto& abs_lines : abs_lines_per_species) {
151 for (
auto& band : abs_lines) {
152 if (band.population == Absorption::PopulationType::ByHITRANFullRelmat or
154 Absorption::PopulationType::ByHITRANRosenkranzRelmat) {
156 band, t_grid, abs_hitran_relmat_data, pressure, order);
163 PropagationMatrix& propmat_clearsky,
164 ArrayOfPropagationMatrix& dpropmat_clearsky_dx,
168 const Vector& f_grid,
172 const Numeric& rtp_pressure,
173 const Numeric& rtp_temperature,
174 const Vector& rtp_vmr,
175 const Index& lbl_checked,
178 "Bad size of input species+lines");
180 "Bad size of input species+vmrs");
182 "Please set lbl_checked true to use this function");
184 for (Index i = 0; i < abs_species.
nelem(); i++) {
185 if (select_abs_species.
nelem() and select_abs_species not_eq abs_species[i])
187 for (
auto& band : abs_lines_per_species[i]) {
188 if (band.OnTheFlyLineMixing() and band.DoLineMixing(rtp_pressure)) {
190 const Vector line_shape_vmr =
191 band.BroadeningSpeciesVMR(rtp_vmr, abs_species);
192 const Numeric this_vmr =
193 rtp_vmr[i] * isotopologue_ratios[band.Isotopologue()];
200 ecs_data[band.quantumidentity],
204 jacobian_quantities);
205 propmat_clearsky.Kjj() += abs.real();
208 for (Index j = 0; j < jacobian_quantities.
nelem(); j++) {
209 const auto& deriv = jacobian_quantities[j];
211 if (not deriv.propmattype())
continue;
213 if (deriv == abs_species[i]) {
214 dpropmat_clearsky_dx[j].Kjj() += abs.real();
216 dpropmat_clearsky_dx[j].Kjj() += dabs[j].real();
225 PropagationMatrix& propmat_clearsky,
226 ArrayOfPropagationMatrix& dpropmat_clearsky_dx,
230 const Vector& f_grid,
234 const Numeric& rtp_pressure,
235 const Numeric& rtp_temperature,
236 const Vector& rtp_vmr,
237 const Vector& rtp_mag,
238 const Vector& rtp_los,
239 const Index& lbl_checked,
242 "Only for stokes dim 4");
244 "Bad size of input species+lines");
246 "Bad size of input species+vmrs");
248 "Please set lbl_checked true to use this function");
257 const auto polarization_scale_dtheta_data =
259 const auto polarization_scale_deta_data =
262 for (Index i = 0; i < abs_species.
nelem(); i++) {
263 if (select_abs_species.
nelem() and select_abs_species not_eq abs_species[i])
265 for (
auto& band : abs_lines_per_species[i]) {
266 if (band.OnTheFlyLineMixing() and band.DoLineMixing(rtp_pressure)) {
268 const Vector line_shape_vmr =
269 band.BroadeningSpeciesVMR(rtp_vmr, abs_species);
270 const Numeric this_vmr =
271 rtp_vmr[i] * isotopologue_ratios[band.Isotopologue()];
276 const auto [abs, dabs, error] =
283 ecs_data[band.quantumidentity],
287 jacobian_quantities);
296 for (Index j = 0; j < jacobian_quantities.
nelem(); j++) {
297 const auto& deriv = jacobian_quantities[j];
299 if (not deriv.propmattype())
continue;
301 if (deriv == Jacobian::Atm::MagneticU) {
308 polarization_scale_dtheta_data, polarization),
310 polarization_scale_deta_data, polarization),
314 }
else if (deriv == Jacobian::Atm::MagneticV) {
321 polarization_scale_dtheta_data, polarization),
323 polarization_scale_deta_data, polarization),
327 }
else if (deriv == Jacobian::Atm::MagneticW) {
334 polarization_scale_dtheta_data, polarization),
336 polarization_scale_deta_data, polarization),
340 }
else if (deriv == abs_species[i]) {
346 dpropmat_clearsky_dx[j].Kjj() += dabs[j].real();
358 const Vector& t_grid,
359 const Numeric& pressure,
362 const Index& rosenkranz_adaptation,
364 for (
auto& band : abs_lines) {
365 if (band.population ==
366 Absorption::PopulationType::ByRovibLinearDipoleLineMixing or
367 band.population == Absorption::PopulationType::ByMakarovFullRelmat) {
371 ecs_data[band.quantumidentity],
375 rosenkranz_adaptation,
384 const Vector& t_grid,
385 const Numeric& pressure,
388 const Index& rosenkranz_adaptation,
390 for (
auto& abs_lines : abs_lines_per_species) {
397 rosenkranz_adaptation,
411 const String& scaling_type,
412 const Vector& scaling,
415 const String& lambda_type,
416 const Vector& lambda,
417 const String& collisional_distance_type,
418 const Vector& collisional_distance,
420 const Species::Species spec = Species::fromShortName(species);
422 auto& data = ecs_data[qid][spec];
424 LineShape::toTemperatureModelOrThrow(scaling_type), scaling);
426 LineShape::toTemperatureModelOrThrow(beta_type), beta);
428 LineShape::toTemperatureModelOrThrow(lambda_type), lambda);
430 LineShape::toTemperatureModelOrThrow(collisional_distance_type),
431 collisional_distance);
440 "Bad sizes of specs and vmrs\nspecs: [",
457 "Can only scale and add same type\nmp1: ",
461 mp1.
X0 += mp2.X0 * x;
462 mp1.
X1 += mp2.X1 * x;
463 mp1.
X2 += mp2.X2 * x;
464 mp1.
X3 += mp2.X3 * x;
467 for (
auto& ecs : ecs_data) {
472 for (Index i = 0; i < specs.
nelem(); i++) {
474 "Can only have joker species, finds: [",
478 auto spec = specs[i].Spec();
480 if (spec == Species::Species::Bath)
continue;
482 auto& data = ecs[spec];
485 if (std::isinf(data.mass)) {
489 const Numeric vmr = vmrs[i];
491 airdata.
scaling = data.scaling;
492 airdata.
beta = data.beta;
493 airdata.
lambda = data.lambda;
495 airdata.
mass = data.mass * vmr;
497 scale(airdata.
beta, vmr);
498 scale(airdata.
lambda, vmr);
503 scale_and_add_or_throw(airdata.
scaling, data.scaling, vmr);
504 scale_and_add_or_throw(airdata.
beta, data.beta, vmr);
505 scale_and_add_or_throw(airdata.
lambda, data.lambda, vmr);
506 scale_and_add_or_throw(
508 airdata.
mass += data.mass * vmr;
514 if (sumvmr not_eq 0 and sumvmr not_eq 1) {
515 scale(airdata.
scaling, 1.0 / sumvmr);
516 scale(airdata.
beta, 1.0 / sumvmr);
517 scale(airdata.
lambda, 1.0 / sumvmr);
519 airdata.
mass /= sumvmr;
522 ecs[Species::Species::Bath] = airdata;
535 ecs[Species::Species::Oxygen].scaling =
539 ecs[Species::Species::Oxygen].lambda =
541 ecs[Species::Species::Oxygen].beta =
543 ecs[Species::Species::Oxygen].mass =
546 ecs[Species::Species::Nitrogen].scaling =
548 ecs[Species::Species::Nitrogen].collisional_distance =
554 ecs[Species::Species::Nitrogen].lambda =
556 ecs[Species::Species::Nitrogen].beta =
558 ecs[Species::Species::Nitrogen].mass =
566 for (
const auto* key : {
"CO2-626",
"CO2-628",
"CO2-636"}) {
569 ecs[Species::Species::Nitrogen].scaling =
576 LineShapeTemperatureModel::T1, 0.81, 0.0152, 0, 0);
577 ecs[Species::Species::Nitrogen].beta =
579 ecs[Species::Species::Nitrogen].collisional_distance =
585 ecs[Species::Species::Nitrogen].mass =
588 ecs[Species::Species::Oxygen].scaling =
595 LineShapeTemperatureModel::T1, 0.82, -0.091, 0, 0);
596 ecs[Species::Species::Oxygen].beta =
598 ecs[Species::Species::Oxygen].collisional_distance =
604 ecs[Species::Species::Oxygen].mass =
614 ecs[Species::Species::Oxygen].scaling =
618 ecs[Species::Species::Oxygen].lambda =
620 ecs[Species::Species::Oxygen].beta =
622 ecs[Species::Species::Oxygen].mass =
625 ecs[Species::Species::Nitrogen].scaling =
629 ecs[Species::Species::Nitrogen].lambda =
631 ecs[Species::Species::Nitrogen].beta =
633 ecs[Species::Species::Nitrogen].mass =
640 for (
const auto* key : {
"CO2-626",
"CO2-628",
"CO2-636"}) {
643 ecs[Species::Species::CarbonDioxide].scaling =
649 ecs[Species::Species::CarbonDioxide].lambda =
651 ecs[Species::Species::CarbonDioxide].beta =
653 ecs[Species::Species::CarbonDioxide].collisional_distance =
660 Species::Species::CarbonDioxide, isotopologue_ratios);
This can be used to make arrays out of anything.
Index nelem() const ARTS_NOEXCEPT
#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_dataAddTran2006(MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Verbosity &)
WORKSPACE METHOD: ecs_dataAddTran2006.
void ecs_dataAddTran2011(MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Verbosity &)
WORKSPACE METHOD: ecs_dataAddTran2011.
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 ArrayOfSpeciesTag &select_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 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 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 ArrayOfSpeciesTag &select_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_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 ecs_dataAddSpeciesData(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_dataAddSpeciesData.
void ecs_dataAddMeanAir(MapOfErrorCorrectedSuddenData &ecs_data, const Vector &vmrs, const ArrayOfSpeciesTag &specs, const Verbosity &)
WORKSPACE METHOD: ecs_dataAddMeanAir.
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_dataAddRodrigues1997(MapOfErrorCorrectedSuddenData &ecs_data, const SpeciesIsotopologueRatios &isotopologue_ratios, const Verbosity &)
WORKSPACE METHOD: ecs_dataAddRodrigues1997.
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 ArrayOfSpeciesTag &select_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_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.
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)
constexpr auto deg2rad(auto x) noexcept
Converts degrees to radians.
constexpr auto kaycm_per_atm2hz_per_pa(auto x) noexcept
Conversion from cm-1 per atmosphere to Hz per Pascal.
constexpr auto angstrom2meter(auto x) noexcept
Conversion from Å to meter.
SpeciesIsotopologueRatios isotopologue_ratios()
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 Vector &invcm_grid, const Numeric stotmax, const calctype type)
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.