ARTS 2.5.11 (git: 6827797f)
m_linemixing.cc
Go to the documentation of this file.
1
13#include "arts_conversions.h"
14#include "hitran_species.h"
15#include "linemixing.h"
16#include "linemixing_hitran.h"
17#include "matpack_data.h"
18#include "propagationmatrix.h"
19
21 HitranRelaxationMatrixData& abs_hitran_relmat_data,
22 ArrayOfArrayOfAbsorptionLines& abs_lines_per_species,
23 const ArrayOfArrayOfSpeciesTag& abs_species,
24 const String& basedir,
25 const Numeric& linemixinglimit,
26 const Numeric& fmin,
27 const Numeric& fmax,
28 const Numeric& stot,
29 const String& mode,
30 const Verbosity&) {
31 const lm_hitran_2017::ModeOfLineMixing intmode =
32 lm_hitran_2017::toModeOfLineMixingOrThrow(mode);
33
34 const SpeciesIsotopologueRatios isotopologue_ratios =
36
37 ARTS_USER_ERROR_IF(abs_species.nelem() not_eq abs_lines_per_species.nelem(),
38 "Bad size of input species+lines");
39
41 lm_hitran_2017::read(abs_hitran_relmat_data,
42 lines,
43 isotopologue_ratios,
44 basedir,
45 linemixinglimit,
46 fmin,
47 fmax,
48 stot,
49 intmode);
50 std::for_each(lines.begin(), lines.end(), [](auto& band) {
51 band.sort_by_frequency();
52 }); // Sort so largest frequency is last
53 ArrayOfIndex used(lines.nelem(), false);
54
55 bool emptied = false;
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"))
59 continue;
60
61 if (not emptied) {
62 abs_lines_per_species[i].resize(0);
63 emptied = true;
64 }
65
66 for (Index k = 0; k < lines.nelem(); k++) {
67 if (used[k]) continue;
68
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()};
75
76 // Select lines with correct Isotopologue and one line center within the range
77 if ((abs_species[i][j].Isotopologue() == lines[k].Isotopologue() or
78 abs_species[i][j].Isotopologue() ==
79 Species::select_joker("CO2")) and
80 (lines[k].lines.front().F0 <= uf and
81 lines[k].lines.back().F0 >= lf)) {
82 used[k] = true; // The lines should not be copied into other places
83 abs_lines_per_species[i].push_back(lines[k]);
84 }
85 }
86 }
87 }
88}
89
91 PropagationMatrix& propmat_clearsky,
92 const HitranRelaxationMatrixData& abs_hitran_relmat_data,
93 const ArrayOfArrayOfAbsorptionLines& abs_lines_per_species,
94 const SpeciesIsotopologueRatios& isotopologue_ratios,
95 const Vector& f_grid,
96 const ArrayOfArrayOfSpeciesTag& abs_species,
97 const ArrayOfSpeciesTag& select_abs_species,
98 const ArrayOfRetrievalQuantity& jacobian_quantities,
99 const Numeric& rtp_pressure,
100 const Numeric& rtp_temperature,
101 const Vector& rtp_vmr,
102 const Verbosity&) {
103 ARTS_USER_ERROR_IF(jacobian_quantities.nelem(),
104 "Cannot support any Jacobian at this time");
105 ARTS_USER_ERROR_IF(abs_species.nelem() not_eq abs_lines_per_species.nelem(),
106 "Bad size of input species+lines");
107 ARTS_USER_ERROR_IF(abs_species.nelem() not_eq rtp_vmr.nelem(),
108 "Bad size of input species+vmrs");
109
110 // vmrs should be [air, water, co2]
111 Vector vmrs(3, 0);
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)
115 continue;
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];
121 }
122 }
123 }
124 vmrs[2] = 1.0 - vmrs[1] - vmrs[0];
125
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() +=
133 lm_hitran_2017::compute(abs_hitran_relmat_data,
134 abs_lines_per_species[i],
135 isotopologue_ratios,
136 rtp_pressure,
137 rtp_temperature,
138 vmrs,
139 f_grid);
140 }
141}
142
144 ArrayOfArrayOfAbsorptionLines& abs_lines_per_species,
145 const HitranRelaxationMatrixData& abs_hitran_relmat_data,
146 const Vector& t_grid,
147 const Numeric& pressure,
148 const Index& order,
149 const Verbosity&) {
150 for (auto& abs_lines : abs_lines_per_species) {
151 for (auto& band : abs_lines) {
152 if (band.population == Absorption::PopulationType::ByHITRANFullRelmat or
153 band.population ==
154 Absorption::PopulationType::ByHITRANRosenkranzRelmat) {
156 band, t_grid, abs_hitran_relmat_data, pressure, order);
157 }
158 }
159 }
160}
161
163 PropagationMatrix& propmat_clearsky,
164 ArrayOfPropagationMatrix& dpropmat_clearsky_dx,
165 const ArrayOfArrayOfAbsorptionLines& abs_lines_per_species,
166 const MapOfErrorCorrectedSuddenData& ecs_data,
167 const SpeciesIsotopologueRatios& isotopologue_ratios,
168 const Vector& f_grid,
169 const ArrayOfArrayOfSpeciesTag& abs_species,
170 const ArrayOfSpeciesTag& select_abs_species,
171 const ArrayOfRetrievalQuantity& jacobian_quantities,
172 const Numeric& rtp_pressure,
173 const Numeric& rtp_temperature,
174 const Vector& rtp_vmr,
175 const Index& lbl_checked,
176 const Verbosity&) {
177 ARTS_USER_ERROR_IF(abs_species.nelem() not_eq abs_lines_per_species.nelem(),
178 "Bad size of input species+lines");
179 ARTS_USER_ERROR_IF(abs_species.nelem() not_eq rtp_vmr.nelem(),
180 "Bad size of input species+vmrs");
181 ARTS_USER_ERROR_IF(not lbl_checked,
182 "Please set lbl_checked true to use this function");
183
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])
186 continue;
187 for (auto& band : abs_lines_per_species[i]) {
188 if (band.OnTheFlyLineMixing() and band.DoLineMixing(rtp_pressure)) {
189 // vmrs should be for the line
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()];
194 const auto [abs, dabs, error] = Absorption::LineMixing::ecs_absorption(
195 rtp_temperature,
196 0,
197 rtp_pressure,
198 this_vmr,
199 line_shape_vmr,
200 ecs_data[band.quantumidentity],
201 f_grid,
203 band,
204 jacobian_quantities);
205 propmat_clearsky.Kjj() += abs.real();
206
207 // Sum up the resorted Jacobian
208 for (Index j = 0; j < jacobian_quantities.nelem(); j++) {
209 const auto& deriv = jacobian_quantities[j];
210
211 if (not deriv.propmattype()) continue;
212
213 if (deriv == abs_species[i]) {
214 dpropmat_clearsky_dx[j].Kjj() += abs.real();
215 } else {
216 dpropmat_clearsky_dx[j].Kjj() += dabs[j].real();
217 }
218 }
219 }
220 }
221 }
222}
223
225 PropagationMatrix& propmat_clearsky,
226 ArrayOfPropagationMatrix& dpropmat_clearsky_dx,
227 const ArrayOfArrayOfAbsorptionLines& abs_lines_per_species,
228 const MapOfErrorCorrectedSuddenData& ecs_data,
229 const SpeciesIsotopologueRatios& isotopologue_ratios,
230 const Vector& f_grid,
231 const ArrayOfArrayOfSpeciesTag& abs_species,
232 const ArrayOfSpeciesTag& select_abs_species,
233 const ArrayOfRetrievalQuantity& jacobian_quantities,
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,
240 const Verbosity&) {
241 ARTS_USER_ERROR_IF(propmat_clearsky.StokesDimensions() not_eq 4,
242 "Only for stokes dim 4");
243 ARTS_USER_ERROR_IF(abs_species.nelem() not_eq abs_lines_per_species.nelem(),
244 "Bad size of input species+lines");
245 ARTS_USER_ERROR_IF(abs_species.nelem() not_eq rtp_vmr.nelem(),
246 "Bad size of input species+vmrs");
247 ARTS_USER_ERROR_IF(not lbl_checked,
248 "Please set lbl_checked true to use this function");
249
250 // Polarization
251 const auto Z = Zeeman::FromGrids(rtp_mag[0],
252 rtp_mag[1],
253 rtp_mag[2],
254 Conversion::deg2rad(rtp_los[0]),
255 Conversion::deg2rad(rtp_los[1]));
256 const auto polarization_scale_data = Zeeman::AllPolarization(Z.theta, Z.eta);
257 const auto polarization_scale_dtheta_data =
258 Zeeman::AllPolarization_dtheta(Z.theta, Z.eta);
259 const auto polarization_scale_deta_data =
260 Zeeman::AllPolarization_deta(Z.theta, Z.eta);
261
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])
264 continue;
265 for (auto& band : abs_lines_per_species[i]) {
266 if (band.OnTheFlyLineMixing() and band.DoLineMixing(rtp_pressure)) {
267 // vmrs should be for the line
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()];
272 for (Zeeman::Polarization polarization :
276 const auto [abs, dabs, error] =
278 rtp_temperature,
279 Z.H,
280 rtp_pressure,
281 this_vmr,
282 line_shape_vmr,
283 ecs_data[band.quantumidentity],
284 f_grid,
285 polarization,
286 band,
287 jacobian_quantities);
288
289 // Sum up the propagation matrix
290 Zeeman::sum(propmat_clearsky,
291 abs,
292 Zeeman::SelectPolarization(polarization_scale_data,
293 polarization));
294
295 // Sum up the resorted Jacobian
296 for (Index j = 0; j < jacobian_quantities.nelem(); j++) {
297 const auto& deriv = jacobian_quantities[j];
298
299 if (not deriv.propmattype()) continue;
300
301 if (deriv == Jacobian::Atm::MagneticU) {
302 Zeeman::dsum(dpropmat_clearsky_dx[j],
303 abs,
304 dabs[j],
305 Zeeman::SelectPolarization(polarization_scale_data,
306 polarization),
308 polarization_scale_dtheta_data, polarization),
310 polarization_scale_deta_data, polarization),
311 Z.dH_du,
312 Z.dtheta_du,
313 Z.deta_du);
314 } else if (deriv == Jacobian::Atm::MagneticV) {
315 Zeeman::dsum(dpropmat_clearsky_dx[j],
316 abs,
317 dabs[j],
318 Zeeman::SelectPolarization(polarization_scale_data,
319 polarization),
321 polarization_scale_dtheta_data, polarization),
323 polarization_scale_deta_data, polarization),
324 Z.dH_dv,
325 Z.dtheta_dv,
326 Z.deta_dv);
327 } else if (deriv == Jacobian::Atm::MagneticW) {
328 Zeeman::dsum(dpropmat_clearsky_dx[j],
329 abs,
330 dabs[j],
331 Zeeman::SelectPolarization(polarization_scale_data,
332 polarization),
334 polarization_scale_dtheta_data, polarization),
336 polarization_scale_deta_data, polarization),
337 Z.dH_dw,
338 Z.dtheta_dw,
339 Z.deta_dw);
340 } else if (deriv == abs_species[i]) {
341 Zeeman::sum(dpropmat_clearsky_dx[j],
342 abs,
343 Zeeman::SelectPolarization(polarization_scale_data,
344 polarization));
345 } else {
346 dpropmat_clearsky_dx[j].Kjj() += dabs[j].real();
347 }
348 }
349 }
350 }
351 }
352 }
353}
354
356 ArrayOfAbsorptionLines& abs_lines,
357 const MapOfErrorCorrectedSuddenData& ecs_data,
358 const Vector& t_grid,
359 const Numeric& pressure,
360 const Index& order,
361 const Index& robust,
362 const Index& rosenkranz_adaptation,
363 const Verbosity& verbosity) {
364 for (auto& band : abs_lines) {
365 if (band.population ==
366 Absorption::PopulationType::ByRovibLinearDipoleLineMixing or
367 band.population == Absorption::PopulationType::ByMakarovFullRelmat) {
369 band,
370 t_grid,
371 ecs_data[band.quantumidentity],
372 pressure,
373 order,
374 robust,
375 rosenkranz_adaptation,
376 verbosity);
377 }
378 }
379}
380
382 ArrayOfArrayOfAbsorptionLines& abs_lines_per_species,
383 const MapOfErrorCorrectedSuddenData& ecs_data,
384 const Vector& t_grid,
385 const Numeric& pressure,
386 const Index& order,
387 const Index& robust,
388 const Index& rosenkranz_adaptation,
389 const Verbosity& verbosity) {
390 for (auto& abs_lines : abs_lines_per_species) {
392 ecs_data,
393 t_grid,
394 pressure,
395 order,
396 robust,
397 rosenkranz_adaptation,
398 verbosity);
399 }
400}
401
403 ecs_data.resize(0);
404}
405
408 const SpeciesIsotopologueRatios& isotopologue_ratios,
409 const QuantumIdentifier& qid,
410 const String& species,
411 const String& scaling_type,
412 const Vector& scaling,
413 const String& beta_type,
414 const Vector& beta,
415 const String& lambda_type,
416 const Vector& lambda,
417 const String& collisional_distance_type,
418 const Vector& collisional_distance,
419 const Verbosity&) {
420 const Species::Species spec = Species::fromShortName(species);
421 ARTS_USER_ERROR_IF(not good_enum(spec), "Invalid species: ", species)
422 auto& data = ecs_data[qid][spec];
423 data.scaling = LineShapeModelParameters(
424 LineShape::toTemperatureModelOrThrow(scaling_type), scaling);
425 data.beta = LineShapeModelParameters(
426 LineShape::toTemperatureModelOrThrow(beta_type), beta);
427 data.lambda = LineShapeModelParameters(
428 LineShape::toTemperatureModelOrThrow(lambda_type), lambda);
429 data.collisional_distance = LineShapeModelParameters(
430 LineShape::toTemperatureModelOrThrow(collisional_distance_type),
431 collisional_distance);
432 data.mass = Species::mean_mass(spec, isotopologue_ratios);
433}
434
436 const Vector& vmrs,
437 const ArrayOfSpeciesTag& specs,
438 const Verbosity&) {
439 ARTS_USER_ERROR_IF(specs.nelem() not_eq vmrs.nelem(),
440 "Bad sizes of specs and vmrs\nspecs: [",
441 specs,
442 "]\nvmrs: [",
443 vmrs,
444 "]")
445
446 static_assert(LineShapeModelParameters::N == 4);
447 const auto scale = [](LineShapeModelParameters& mp, Numeric x) {
448 mp.X0 *= x;
449 mp.X1 *= x;
450 mp.X2 *= x;
451 mp.X3 *= x;
452 };
453 const auto scale_and_add_or_throw = [](LineShapeModelParameters& mp1,
454 const LineShapeModelParameters& mp2,
455 Numeric x) {
456 ARTS_USER_ERROR_IF(mp1.type not_eq mp2.type,
457 "Can only scale and add same type\nmp1: ",
458 mp1,
459 "\nmp2: ",
460 mp2)
461 mp1.X0 += mp2.X0 * x;
462 mp1.X1 += mp2.X1 * x;
463 mp1.X2 += mp2.X2 * x;
464 mp1.X3 += mp2.X3 * x;
465 };
466
467 for (auto& ecs : ecs_data) {
469
470 bool found = false;
471 Numeric sumvmr = 0;
472 for (Index i = 0; i < specs.nelem(); i++) {
473 ARTS_USER_ERROR_IF(not specs[i].Isotopologue().joker(),
474 "Can only have joker species, finds: [",
475 specs,
476 ']')
477
478 auto spec = specs[i].Spec();
479
480 if (spec == Species::Species::Bath) continue;
481
482 auto& data = ecs[spec];
483
484 // This means we never had the data so we should skip
485 if (std::isinf(data.mass)) {
486 continue;
487 }
488
489 const Numeric vmr = vmrs[i];
490 if (not found) {
491 airdata.scaling = data.scaling;
492 airdata.beta = data.beta;
493 airdata.lambda = data.lambda;
494 airdata.collisional_distance = data.collisional_distance;
495 airdata.mass = data.mass * vmr;
496 scale(airdata.scaling, vmr);
497 scale(airdata.beta, vmr);
498 scale(airdata.lambda, vmr);
499 scale(airdata.collisional_distance, vmr);
500
501 found = true;
502 } else {
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(
507 airdata.collisional_distance, data.collisional_distance, vmr);
508 airdata.mass += data.mass * vmr;
509 }
510
511 sumvmr += vmrs[i];
512 }
513
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);
518 scale(airdata.collisional_distance, 1.0 / sumvmr);
519 airdata.mass /= sumvmr;
520 }
521
522 ecs[Species::Species::Bath] = airdata;
523 }
524}
525
528 const SpeciesIsotopologueRatios& isotopologue_ratios,
529 const Verbosity&) {
530 // The band is ignored
531 auto& ecs = ecs_data[QuantumIdentifier("O2-66")];
532
533 // All species have the same effect, so just copy the values but change the mass (allow new mass for Air)
534
535 ecs[Species::Species::Oxygen].scaling =
536 LineShapeModelParameters(LineShapeTemperatureModel::T0, 1.0, 0, 0, 0);
537 ecs[Species::Species::Oxygen].collisional_distance = LineShapeModelParameters(
538 LineShapeTemperatureModel::T0, Conversion::angstrom2meter(0.61), 0, 0, 0);
539 ecs[Species::Species::Oxygen].lambda =
540 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.39, 0, 0, 0);
541 ecs[Species::Species::Oxygen].beta =
542 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.567, 0, 0, 0);
543 ecs[Species::Species::Oxygen].mass =
544 Species::mean_mass(Species::Species::Oxygen, isotopologue_ratios);
545
546 ecs[Species::Species::Nitrogen].scaling =
547 LineShapeModelParameters(LineShapeTemperatureModel::T0, 1.0, 0, 0, 0);
548 ecs[Species::Species::Nitrogen].collisional_distance =
549 LineShapeModelParameters(LineShapeTemperatureModel::T0,
551 0,
552 0,
553 0);
554 ecs[Species::Species::Nitrogen].lambda =
555 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.39, 0, 0, 0);
556 ecs[Species::Species::Nitrogen].beta =
557 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.567, 0, 0, 0);
558 ecs[Species::Species::Nitrogen].mass =
559 Species::mean_mass(Species::Species::Nitrogen, isotopologue_ratios);
560}
561
564 const SpeciesIsotopologueRatios& isotopologue_ratios,
565 const Verbosity&) {
566 for (const auto* key : {"CO2-626", "CO2-628", "CO2-636"}) {
567 auto& ecs = ecs_data[QuantumIdentifier(key)];
568
569 ecs[Species::Species::Nitrogen].scaling =
570 LineShapeModelParameters(LineShapeTemperatureModel::T1,
572 0.85,
573 0,
574 0);
575 ecs[Species::Species::Nitrogen].lambda = LineShapeModelParameters(
576 LineShapeTemperatureModel::T1, 0.81, 0.0152, 0, 0);
577 ecs[Species::Species::Nitrogen].beta =
578 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.008, 0, 0, 0);
579 ecs[Species::Species::Nitrogen].collisional_distance =
580 LineShapeModelParameters(LineShapeTemperatureModel::T0,
582 0,
583 0,
584 0);
585 ecs[Species::Species::Nitrogen].mass =
586 Species::mean_mass(Species::Species::Nitrogen, isotopologue_ratios);
587
588 ecs[Species::Species::Oxygen].scaling =
589 LineShapeModelParameters(LineShapeTemperatureModel::T1,
591 0.5,
592 0,
593 0);
594 ecs[Species::Species::Oxygen].lambda = LineShapeModelParameters(
595 LineShapeTemperatureModel::T1, 0.82, -0.091, 0, 0);
596 ecs[Species::Species::Oxygen].beta =
597 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.007, 0, 0, 0);
598 ecs[Species::Species::Oxygen].collisional_distance =
599 LineShapeModelParameters(LineShapeTemperatureModel::T0,
601 0,
602 0,
603 0);
604 ecs[Species::Species::Oxygen].mass =
605 Species::mean_mass(Species::Species::Oxygen, isotopologue_ratios);
606 }
607}
608
610 const SpeciesIsotopologueRatios& isotopologue_ratios,
611 const Verbosity&) {
612 auto& ecs = ecs_data[QuantumIdentifier("O2-66")];
613
614 ecs[Species::Species::Oxygen].scaling =
615 LineShapeModelParameters(LineShapeTemperatureModel::T1, Conversion::kaycm_per_atm2hz_per_pa(0.0275), 1.01, 0, 0);
616 ecs[Species::Species::Oxygen].collisional_distance = LineShapeModelParameters(
617 LineShapeTemperatureModel::T0, Conversion::angstrom2meter(1.05), 0, 0, 0);
618 ecs[Species::Species::Oxygen].lambda =
619 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.935, 0, 0, 0);
620 ecs[Species::Species::Oxygen].beta =
621 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0, 0, 0, 0);
622 ecs[Species::Species::Oxygen].mass =
623 Species::mean_mass(Species::Species::Oxygen, isotopologue_ratios);
624
625 ecs[Species::Species::Nitrogen].scaling =
626 LineShapeModelParameters(LineShapeTemperatureModel::T1, Conversion::kaycm_per_atm2hz_per_pa(0.0285), 1.03, 0, 0);
627 ecs[Species::Species::Nitrogen].collisional_distance = LineShapeModelParameters(
628 LineShapeTemperatureModel::T0, Conversion::angstrom2meter(1.00), 0, 0, 0);
629 ecs[Species::Species::Nitrogen].lambda =
630 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.95, 0, 0, 0);
631 ecs[Species::Species::Nitrogen].beta =
632 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0, 0, 0, 0);
633 ecs[Species::Species::Nitrogen].mass =
634 Species::mean_mass(Species::Species::Nitrogen, isotopologue_ratios);
635}
636
638 const SpeciesIsotopologueRatios& isotopologue_ratios,
639 const Verbosity&) {
640 for (const auto* key : {"CO2-626", "CO2-628", "CO2-636"}) {
641 auto& ecs = ecs_data[QuantumIdentifier(key)];
642
643 ecs[Species::Species::CarbonDioxide].scaling =
644 LineShapeModelParameters(LineShapeTemperatureModel::T0,
646 0,
647 0,
648 0);
649 ecs[Species::Species::CarbonDioxide].lambda =
650 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.61, 0, 0, 0);
651 ecs[Species::Species::CarbonDioxide].beta =
652 LineShapeModelParameters(LineShapeTemperatureModel::T0, 0.052, 0, 0, 0);
653 ecs[Species::Species::CarbonDioxide].collisional_distance =
654 LineShapeModelParameters(LineShapeTemperatureModel::T0,
656 0,
657 0,
658 0);
659 ecs[Species::Species::CarbonDioxide].mass = Species::mean_mass(
660 Species::Species::CarbonDioxide, isotopologue_ratios);
661 }
662}
Common ARTS conversions.
This can be used to make arrays out of anything.
Definition: array.h:31
Index nelem() const ARTS_NOEXCEPT
Definition: array.h:75
#define ARTS_USER_ERROR_IF(condition,...)
Definition: debug.h:135
constexpr bool good_enum(EnumType x) noexcept
Checks if the enum number is good.
Definition: enums.h:21
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.
Definition: m_linemixing.cc:90
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.
Definition: m_linemixing.cc:20
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)
Definition: linemixing.cc:1452
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)
Definition: linemixing.cc:763
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.
Definition: zeemandata.cc:402
Derived FromGrids(Numeric u, Numeric v, Numeric w, Numeric z, Numeric a) noexcept
Computes the derived plane from ARTS grids.
Definition: zeemandata.cc:261
AllPolarizationVectors AllPolarization_deta(Numeric theta, Numeric eta) noexcept
The derivative of AllPolarization wrt eta.
Definition: zeemandata.cc:384
AllPolarizationVectors AllPolarization_dtheta(Numeric theta, const Numeric eta) noexcept
The derivative of AllPolarization wrt theta.
Definition: zeemandata.cc:367
Polarization
Zeeman polarization selection.
Definition: zeemandata.h:27
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.
Definition: zeemandata.cc:437
void sum(PropagationMatrix &pm, const ComplexVectorView &abs, const PolarizationVector &polvec, const bool do_phase) ARTS_NOEXCEPT
Sums the Zeeman components into a propagation matrix.
Definition: zeemandata.cc:417
AllPolarizationVectors AllPolarization(Numeric theta, Numeric eta) noexcept
Computes the polarization of each polarization type.
Definition: zeemandata.cc:352
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
Coefficients and temperature model for SingleSpeciesModel.
static constexpr Index N
A logical struct for global quantum numbers with species identifiers.