62 constexpr std::array<Numeric, nlines_mpm2020> g00 =
63 {1.685E+4, 1.703E+4, 1.513E+4, 1.495E+4, 1.433E+4,
64 1.408E+4, 1.353E+4, 1.353E+4, 1.303E+4, 1.319E+4,
65 1.262E+4, 1.265E+4, 1.238E+4, 1.217E+4, 1.207E+4,
66 1.207E+4, 1.137E+4, 1.137E+4, 1.101E+4, 1.101E+4,
67 1.037E+4, 1.038E+4, 9.96E+3, 9.96E+3, 9.55E+3,
68 9.55E+3, 9.06E+3, 9.06E+3, 8.58E+3, 8.58E+3,
69 8.11E+3, 8.11E+3, 7.64E+3, 7.64E+3, 7.17E+3,
70 7.17E+3, 6.69E+3, 6.69E+3, 1.64E+4, 1.64E+4,
71 1.60E+4, 1.60E+4, 1.62E+4, 1.47E+4,};
74 constexpr std::array<Numeric, nlines_mpm2020> y0 =
75 {-4.1E-7, 0.00000277, -0.00000372, 0.00000559, -0.00000573,
76 0.00000618, -0.00000366, 0.00000278, -8.9E-7, -2.1E-7,
77 6.0E-7, -0.00000152, 0.00000216, -0.00000293, 0.00000373,
78 -0.00000436, 0.00000491, -0.00000542, 0.00000571, -0.00000613,
79 0.00000636, -0.00000670, 0.00000690, -0.00000718, 0.00000740,
80 -0.00000763, 0.00000788, -0.00000807, 0.00000834, -0.00000849,
81 0.00000876, -0.00000887, 0.00000915, -0.00000922, 0.00000950,
82 -0.00000955, 0.00000987, -0.00000988, 0.00000, 0.00000,
83 0.00000, 0.00000, 0.00000, 0.00000,};
86 constexpr std::array<Numeric, nlines_mpm2020> y1 =
87 {0.00000, 0.00000124, -2E-8, 8E-8, 4.5E-7,
88 -9.3E-7, 0.00000264, -0.00000351, 0.00000359, -0.00000416,
89 0.00000326, -0.00000353, 0.00000484, -0.00000503, 0.00000579,
90 -0.00000590, 0.00000616, -0.00000619, 0.00000611, -0.00000609,
91 0.00000574, -0.00000568, 0.00000574, -0.00000566, 0.0000060,
92 -0.0000059, 0.0000063, -0.0000062, 0.0000064, -0.0000063,
93 0.0000065, -0.0000064, 0.0000065, -0.0000064, 0.0000065,
94 -0.0000064, 0.0000064, -0.0000062, 0.00000, 0.00000,
95 0.00000, 0.00000, 0.00000, 0.00000, };
98 constexpr std::array<Numeric, nlines_mpm2020> g0 =
99 {-6.95E-14, -9.0E-12, -1.03E-11, -2.39E-11, -1.72E-11,
100 -1.71E-11, 2.8E-12, 1.50E-11, 1.32E-11, 1.70E-11,
101 8.7E-12, 6.9E-12, 8.3E-12, 6.7E-12, 7E-13,
102 1.6E-12, -2.1E-12, -6.6E-12, -9.5E-12, -1.15E-11,
103 -1.18E-11, -1.40E-11, -1.73E-11, -1.86E-11, -2.17E-11,
104 -2.27E-11, -2.34E-11, -2.42E-11, -2.66E-11, -2.72E-11,
105 -3.01E-11, -3.04E-11, -3.34E-11, -3.33E-11, -3.61E-11,
106 -3.58E-11, -3.48E-11, -3.44E-11, 0E-10, 0E-10,
107 0E-10, 0E-10, 0E-10, 0E-10,};
110 constexpr std::array<Numeric, nlines_mpm2020> g1 =
111 {0E-10, -4.5E-12, 7E-13, 3.3E-12, 8.1E-12,
112 1.62E-11, 1.79E-11, 2.25E-11, 5.4E-12, 3E-13,
113 4E-14, -4.7E-12, -3.4E-12, -7.1E-12, -1.80E-11,
114 -2.10E-11, -2.85E-11, -3.23E-11, -3.63E-11, -3.80E-11,
115 -3.78E-11, -3.87E-11, -3.92E-11, -3.94E-11, -4.24E-11,
116 -4.22E-11, -4.65E-11, -4.6E-11, -5.1E-11, -5.0E-11,
117 -5.5E-11, -5.4E-11, -5.8E-11, -5.6E-11, -6.2E-11,
118 -5.9E-11, -6.8E-11, -6.5E-11, 0E-10, 0E-10,
119 0E-10, 0E-10, 0E-10, 0E-10, };
122 constexpr std::array<Numeric, nlines_mpm2020> dv0 =
123 {-0.000028, 0.000597, -0.00195, 0.0032, -0.00475,
124 0.00541, -0.00232, 0.00154, 0.00007, -0.00084,
125 -0.00025, -0.00014, -0.00004, -0.00020, 0.0005,
126 -0.00066, 0.00072, -0.0008, 0.00064, -0.00070,
127 0.00056, -0.00060, 0.00047, -0.00049, 0.00040,
128 -0.00041, 0.00036, -0.00037, 0.00033, -0.00034,
129 0.00032, -0.00032, 0.00030, -0.00030, 0.00028,
130 -0.00029, 0.00029, -0.00029, 0.0, 0.0,
131 0.0, 0.0, 0.0, 0.0, };
134 constexpr std::array<Numeric, nlines_mpm2020> dv1 =
135 {-0.000039, 0.0009, -0.0012, 0.0016, -0.0027,
136 0.0029, 0.0006, -0.0015, 0.0010, -0.0014,
137 -0.0013, 0.0013, 0.0004, -0.0005, 0.0010,
138 -0.0010, 0.0010, -0.0011, 0.0008, -0.0009,
139 0.0003, -0.0003, 0.00009, -0.00009, 0.00017,
140 -0.00016, 0.00024, -0.00023, 0.00024, -0.00024,
141 0.00024, -0.00020, 0.00017, -0.00016, 0.00013,
142 -0.00012, 0.00005, -0.00004, 0.0, 0.0,
143 0.0, 0.0, 0.0, 0.0, };
148 return {
init_mpm2020_slsm(g00[0], y0[0], y1[0], g0[0], g1[0], dv0[0], dv1[0], x),
191 init_mpm2020_slsm(g00[43], y0[43], y1[43], g0[43], g1[43], dv0[43], dv1[43], x),};
204 constexpr std::array<Index, nlines_mpm2020> Np = {
205 1, 1, 3, 3, 5, 5, 7, 7, 9, 9,
206 11, 11, 13, 13, 15, 15, 17, 17,
207 19, 19, 21, 21, 23, 23, 25, 25,
208 27, 27, 29, 29, 31, 31, 33, 33,
209 35, 35, 37, 37, 1, 1, 1, 3, 3, 3};
212 constexpr std::array<Index, nlines_mpm2020> Npp = {
213 1, 1, 3, 3, 5, 5, 7, 7, 9, 9,
214 11, 11, 13, 13, 15, 15, 17, 17,
215 19, 19, 21, 21, 23, 23, 25, 25,
216 27, 27, 29, 29, 31, 31, 33, 33,
217 35, 35, 37, 37, 3, 3, 3, 5, 5, 5};
220 constexpr std::array<Index, nlines_mpm2020> Jp = {
221 1, 1, 3, 3, 5, 5, 7, 7, 9, 9,
222 11, 11, 13, 13, 15, 15, 17, 17,
223 19, 19, 21, 21, 23, 23, 25, 25,
224 27, 27, 29, 29, 31, 31, 33, 33,
225 35, 35, 37, 37, 1, 2, 2, 3, 4, 4};
228 constexpr std::array<Index, nlines_mpm2020> Jpp = {
229 0, 2, 2, 4, 4, 6, 6, 8, 8, 10,
230 10, 12, 12, 14, 14, 16, 16, 18,
231 18, 20, 20, 22, 22, 24, 24, 26,
232 26, 28, 28, 30, 30, 32, 32, 34,
233 34, 36, 36, 38, 2, 2, 3, 4, 4, 5};
292 using Constant::sqrt_pi;
293 using Constant::inv_sqrt_pi;
298 constexpr std::array<Numeric, nlines_mpm2020> f0 = {
299 1.18750334E+11, 5.6264774E+10, 6.2486253E+10, 5.8446588E+10, 6.0306056E+10,
300 5.9590983E+10, 5.9164204E+10, 6.0434778E+10, 5.8323877E+10, 6.1150562E+10,
301 5.7612486E+10, 6.1800158E+10, 5.6968211E+10, 6.2411220E+10, 5.6363399E+10,
302 6.2997984E+10, 5.5783815E+10, 6.3568526E+10, 5.5221384E+10, 6.4127775E+10,
303 5.4671180E+10, 6.4678910E+10, 5.4130025E+10, 6.5224078E+10, 5.3595775E+10,
304 6.5764779E+10, 5.3066934E+10, 6.6302096E+10, 5.2542418E+10, 6.6836834E+10,
305 5.2021429E+10, 6.7369601E+10, 5.1503360E+10, 6.7900868E+10, 5.0987745E+10,
306 6.8431006E+10, 5.0474214E+10, 6.8960312E+10, 3.68498246E+11, 4.24763020E+11,
307 4.87249273E+11, 7.15392902E+11, 7.73839490E+11, 8.34145546E+11, };
310 constexpr std::array<Numeric, nlines_mpm2020> intens = {
311 1.591521878E-21, 1.941172240E-21, 4.834543970E-21, 4.959264029E-21, 7.010386457E-21,
312 7.051673348E-21, 8.085012578E-21, 8.108262250E-21, 8.145673278E-21, 8.149757320E-21,
313 7.396406085E-21, 7.401923754E-21, 6.162286575E-21, 6.168475265E-21, 4.749226167E-21,
314 4.754435107E-21, 3.405982896E-21, 3.408455562E-21, 2.282498656E-21, 2.283934341E-21,
315 1.432692459E-21, 1.433513473E-21, 8.439995690E-22, 8.443521837E-22, 4.672706507E-22,
316 4.676049313E-22, 2.435008301E-22, 2.437304596E-22, 1.195038747E-22, 1.196873412E-22,
317 5.532759045E-23, 5.537261239E-23, 2.416832398E-23, 2.418989865E-23, 9.969285671E-24,
318 9.977543709E-24, 3.882541154E-24, 3.888101811E-24, 3.676253816E-23, 3.017524005E-22,
319 9.792882227E-23, 2.756166168E-23, 1.486462215E-22, 4.411918954E-23, };
322 constexpr std::array<Numeric, nlines_mpm2020>
a2 = {
323 0.01, 0.014, 0.083, 0.083, 0.207, 0.207, 0.387, 0.386,
324 0.621, 0.621, 0.910, 0.910, 1.255, 1.255, 1.654, 1.654,
325 2.109, 2.108, 2.618, 2.617, 3.182, 3.181, 3.800, 3.800,
326 4.474, 4.473, 5.201, 5.200, 5.983, 5.982, 6.819, 6.818,
327 7.709, 7.708, 8.653, 8.652, 9.651, 9.650, 0.048, 0.044,
328 0.049, 0.145, 0.141, 0.145};
338 const std::array<QuantumIdentifier, nlines_mpm2020> qids =
345 #pragma omp parallel for if (not arts_omp_in_parallel() and p.nelem() >= arts_omp_get_max_threads()) schedule(guided) 347 const Numeric theta = t0 / t[ip];
348 const Numeric theta_m1 = theta - 1;
353 const Numeric invGD = 1 / (GD_div_F0 * f0[
i]);
355 const Numeric ST = theta_3 * p[ip] * intens[
i] * std::exp(-a2[
i] * theta_m1);
362 const Numeric dST_dT = do_temp_deriv ? (a2[
i]*t0 - 3*t[ip]) /
pow2(t[ip]) * ST : 0;
379 xsec(j, ip) += ST *
pow2(f[j]) * abs.real();
381 if (jacs_pos.
nelem()) {
386 const auto& deriv = jacs[jacs_pos[iq]];
389 const Complex dFv = dw * (invGD *
Complex(dDV_dT, dG0_dT) - dinvGD_dT) + Fv * dinvGD_dT;
391 dxsec[iq](j, ip) +=
pow2(f[j]) * (ST * std::real(
395 Complex(1 + G, -Y) * dFlm +
Complex(G, -dY_dT) * Flm) + abs.real() * dST_dT);
397 const Complex dFv = - dw * invGD;
399 dxsec[iq](j, ip) += ST * (
pow2(f[j]) * std::real(
403 Complex(1 + G, -Y) * dFlm) + 2 * abs.real() * f[j]);
404 }
else if (deriv.QuantumIdentity().In(qids[
i])) {
406 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
413 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
420 const Complex dFv = dw * invGD;
422 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
429 const Complex dFv = dw * invGD;
431 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
438 const Complex dFv = dw * invGD;
440 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
447 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
454 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
461 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
468 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
475 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
482 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
489 const Complex dFv = Fv / f0[i] - dw * invGD + dw * z / f0[i];
491 dxsec[iq](j, ip) += ST *
pow2(f[j]) * std::real(
497 dxsec[iq](j, ip) += theta_3 * p[ip] * std::exp(-a2[i] * theta_m1) *
pow2(f[j]) * abs.real();
499 dxsec[iq](j, ip) += -theta_m1 * ST *
pow2(f[j]) * abs.real();
511 const Eigen::Ref<Eigen::ArrayXd> rho,
512 const Eigen::Ref<Eigen::ArrayXd> d)
522 for (
Index j=0; j<
i; j++) {
524 W(i, j) = W(j, i) * (rho[i] / rho[j]);
531 auto norm = - std::imag(d[
i] * W(
i,
i)) / std::imag(W.row(
i) * d.abs().matrix() -
std::abs(d[
i]) * W(i, i));
550 constexpr
auto T0 = 300;
553 constexpr std::array<Numeric, nlines_mpm2020> f0 = {
554 1.18750334E+11, 5.6264774E+10, 6.2486253E+10, 5.8446588E+10, 6.0306056E+10,
555 5.9590983E+10, 5.9164204E+10, 6.0434778E+10, 5.8323877E+10, 6.1150562E+10,
556 5.7612486E+10, 6.1800158E+10, 5.6968211E+10, 6.2411220E+10, 5.6363399E+10,
557 6.2997984E+10, 5.5783815E+10, 6.3568526E+10, 5.5221384E+10, 6.4127775E+10,
558 5.4671180E+10, 6.4678910E+10, 5.4130025E+10, 6.5224078E+10, 5.3595775E+10,
559 6.5764779E+10, 5.3066934E+10, 6.6302096E+10, 5.2542418E+10, 6.6836834E+10,
560 5.2021429E+10, 6.7369601E+10, 5.1503360E+10, 6.7900868E+10, 5.0987745E+10,
561 6.8431006E+10, 5.0474214E+10, 6.8960312E+10, 3.68498246E+11, 4.24763020E+11,
562 4.87249273E+11, 7.15392902E+11, 7.73839490E+11, 8.34145546E+11, };
565 constexpr std::array<Numeric, nlines_mpm2020> intens = {
566 1.591521878E-21, 1.941172240E-21, 4.834543970E-21, 4.959264029E-21, 7.010386457E-21,
567 7.051673348E-21, 8.085012578E-21, 8.108262250E-21, 8.145673278E-21, 8.149757320E-21,
568 7.396406085E-21, 7.401923754E-21, 6.162286575E-21, 6.168475265E-21, 4.749226167E-21,
569 4.754435107E-21, 3.405982896E-21, 3.408455562E-21, 2.282498656E-21, 2.283934341E-21,
570 1.432692459E-21, 1.433513473E-21, 8.439995690E-22, 8.443521837E-22, 4.672706507E-22,
571 4.676049313E-22, 2.435008301E-22, 2.437304596E-22, 1.195038747E-22, 1.196873412E-22,
572 5.532759045E-23, 5.537261239E-23, 2.416832398E-23, 2.418989865E-23, 9.969285671E-24,
573 9.977543709E-24, 3.882541154E-24, 3.888101811E-24, 3.676253816E-23, 3.017524005E-22,
574 9.792882227E-23, 2.756166168E-23, 1.486462215E-22, 4.411918954E-23, };
577 constexpr std::array<Numeric, nlines_mpm2020>
a2 = {
578 0.01, 0.014, 0.083, 0.083, 0.207, 0.207, 0.387, 0.386,
579 0.621, 0.621, 0.910, 0.910, 1.255, 1.255, 1.654, 1.654,
580 2.109, 2.108, 2.618, 2.617, 3.182, 3.181, 3.800, 3.800,
581 4.474, 4.473, 5.201, 5.200, 5.983, 5.982, 6.819, 6.818,
582 7.709, 7.708, 8.653, 8.652, 9.651, 9.650, 0.048, 0.044,
583 0.049, 0.145, 0.141, 0.145};
586 Eigen::Array<Numeric, necs2020, 1> d;
587 Eigen::Array<Numeric, necs2020, 1> rho;
588 Eigen::Matrix<Complex, necs2020, necs2020> W;
602 W(
i, j) = 1
i *
o2_ecs_wigner_symbol_tran(Ji, Jf, Ni, Nf, 1_rat, 1_rat, Ji_p, Jf_p, Ni_p, Nf_p, 1_rat, T);
670 const Numeric theta_m1 = theta - 1;
673 const Numeric ST = pi * theta_3 * P * intens[
i] * std::exp(-a2[
i] * theta_m1);
675 d[i] = sgn * f0[i] *
std::sqrt(ST / rho[i]);
688 const Eigen::ComplexEigenSolver<Eigen::Matrix<Complex, necs2020, necs2020>> eV(W,
true);
689 const auto& D = eV.eigenvalues();
690 const auto& V = eV.eigenvectors();
691 const auto& Vinv = W = eV.eigenvectors().inverse();
693 Eigen::Array<Complex, necs2020, 1> B; B *= 0;
697 B[m] += rho[
i] * d[
i] * d[j] * V(j, m) * Vinv(m,
i);
710 I[iv] += (Constant::inv_sqrt_pi / (GD0 * D[
i].real())) *
Faddeeva::w((f[iv] -
std::conj(D[
i])) / (GD0 * D[i].real())) * B[i];
INDEX Index
The type to use for all integer numbers and indices.
Numeric o2_makarov2013_reduced_dipole(const Rational &Jup, const Rational &Jlo, const Rational &N)
Returns the reduced dipole moment following Makarov etal 2013.
constexpr LineShape::SingleSpeciesModel init_mpm2020_slsm(Numeric g00, Numeric y0, Numeric y1, Numeric g0, Numeric g1, Numeric dv0, Numeric dv1, Numeric x)
Index nelem() const
Number of elements.
Numeric fac(const Index n)
fac
void normalize_relaxation_matrix(Eigen::Ref< Eigen::MatrixXcd > W, const Eigen::Ref< Eigen::ArrayXd > rho, const Eigen::Ref< Eigen::ArrayXd > d)
Linear algebra functions.
Numeric boltzman_factor(Numeric T, Numeric E0)
Computes exp(- E0/kT)
constexpr Complex conj(Complex c)
the conjugate of c
cmplx FADDEEVA() w(cmplx z, double relerr)
constexpr T pow2(T x)
power of two
Wigner symbol interactions.
Index nelem() const
Returns the number of elements.
bool is_frequency_parameter(const RetrievalQuantity &t) noexcept
Returns if the Retrieval quantity is a frequency parameter in propagation matrix calculations.
constexpr std::array< LineShape::SingleSpeciesModel, nlines_mpm2020 > init_mpm2020_lsm()
constexpr std::array< QuantumIdentifier, nlines_mpm2020 > init_mpm2020_qids(const Index &species, const Index &isot)
void makarov2020_o2_lines_mpm(Matrix &xsec, ArrayOfMatrix &dxsec, const Vector &f, const Vector &p, const Vector &t, const Vector &water_vmr, const ArrayOfRetrievalQuantity &jacs, const ArrayOfIndex &jacs_pos)
Adds Makarov MPM2020 O2 absorption lines to the absorption matrix.
std::complex< Numeric > Complex
Implements rational numbers to work with other ARTS types.
A tag group can consist of the sum of several of these.
Class to identify and match lines by their quantum numbers.
NUMERIC Numeric
The type to use for all floating point numbers.
constexpr Complex dw(Complex z, Complex w) noexcept
The Faddeeva function partial derivative.
Numeric o2_ecs_erot_jn_same(Rational J)
Energy of the J=N line at J.
constexpr QuantumIdentifier init_mpm2020_qid(Index species, Index isot, Rational Jup, Rational Jlow, Rational Nup, Rational Nlow)
constexpr T pow3(T x)
power of three
Numeric dDopplerConstant_dT(const Numeric &T, const Numeric &dc)
Returns the temperature derivative of the frequency-independent part of the Doppler broadening...
bool do_temperature_jacobian(const ArrayOfRetrievalQuantity &js) noexcept
Returns if the array wants the temperature derivative.
Vector compute(const Numeric p, const Numeric t, const Numeric xco2, const Numeric xh2o, const ConstVectorView invcm_grid, const Numeric stotmax, const calctype type)
Container class for Quantum Numbers.
This can be used to make arrays out of anything.
Constains various line scaling functions.
Numeric o2_ecs_wigner_symbol_tran(const Rational &Ji, const Rational &Jf, const Rational &Ni, const Rational &Nf, const Rational &Si, const Rational &Sf, const Rational &Ji_p, const Rational &Jf_p, const Rational &Ni_p, const Rational &Nf_p, const Rational &n, const Numeric &T)
Returns the wigner symbol used in Tran etal 2006.
constexpr auto nlines_mpm2020
Numeric DopplerConstant(Numeric T, Numeric mass)
Returns the frequency-independent part of the Doppler broadening.
void makarov2020_o2_lines_ecs(ComplexVector &I, const Vector &f, Numeric P, Numeric T, Numeric water_vmr)
void transform(VectorView y, double(&my_func)(double), ConstVectorView x)
A generic transform function for vectors, which can be used to implement mathematical functions opera...
Compute the line shape parameters for a single broadening species.
Numeric sqrt(const Rational r)
Square root.