ARTS 2.5.0 (git: 9ee3ac6c)
predefined_absorption_models.cc
Go to the documentation of this file.
1/* Copyright (C) 2020
2 * Richard Larsson <ric.larsson@gmail.com>
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2, or (at your option) any
7 * later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
17 * USA. */
18
28#include "lin_alg.h"
29#include "linescaling.h"
30
31#include <Faddeeva/Faddeeva.hh>
32
33constexpr std::size_t nlines_mpm2020 = 44;
34
35
37 Numeric y0,
38 Numeric y1,
39 Numeric g0,
40 Numeric g1,
41 Numeric dv0,
42 Numeric dv1,
43 Numeric x) noexcept
44{
46 ssm.G0() = {LineShape::TemperatureModel::T1, g00, x, NAN, NAN};
47 ssm.Y() = {LineShape::TemperatureModel::T4, y0, y1, x, NAN};
48 ssm.G() = {LineShape::TemperatureModel::T4, g0, g1, 2*x, NAN};
49 ssm.DV() = {LineShape::TemperatureModel::T4, dv0, dv1, 2*x, NAN};
50 return ssm;
51}
52
53
54constexpr std::array<LineShape::SingleSpeciesModel, nlines_mpm2020> init_mpm2020_lsm() noexcept
55{
56 // Pressure broadening [1/Pa] at reference temperature
57 constexpr std::array<Numeric, nlines_mpm2020> g00 =
58 {1.685E+4, 1.703E+4, 1.513E+4, 1.495E+4, 1.433E+4,
59 1.408E+4, 1.353E+4, 1.353E+4, 1.303E+4, 1.319E+4,
60 1.262E+4, 1.265E+4, 1.238E+4, 1.217E+4, 1.207E+4,
61 1.207E+4, 1.137E+4, 1.137E+4, 1.101E+4, 1.101E+4,
62 1.037E+4, 1.038E+4, 9.96E+3, 9.96E+3, 9.55E+3,
63 9.55E+3, 9.06E+3, 9.06E+3, 8.58E+3, 8.58E+3,
64 8.11E+3, 8.11E+3, 7.64E+3, 7.64E+3, 7.17E+3,
65 7.17E+3, 6.69E+3, 6.69E+3, 1.64E+4, 1.64E+4,
66 1.60E+4, 1.60E+4, 1.62E+4, 1.47E+4,};
67
68 // First order line mixing first coefficient [1/Pa] at reference temperature
69 constexpr std::array<Numeric, nlines_mpm2020> y0 =
70 {-4.1E-7, 0.00000277, -0.00000372, 0.00000559, -0.00000573,
71 0.00000618, -0.00000366, 0.00000278, -8.9E-7, -2.1E-7,
72 6.0E-7, -0.00000152, 0.00000216, -0.00000293, 0.00000373,
73 -0.00000436, 0.00000491, -0.00000542, 0.00000571, -0.00000613,
74 0.00000636, -0.00000670, 0.00000690, -0.00000718, 0.00000740,
75 -0.00000763, 0.00000788, -0.00000807, 0.00000834, -0.00000849,
76 0.00000876, -0.00000887, 0.00000915, -0.00000922, 0.00000950,
77 -0.00000955, 0.00000987, -0.00000988, 0.00000, 0.00000,
78 0.00000, 0.00000, 0.00000, 0.00000,};
79
80 // First order line mixing second coefficient [1/Pa] at reference temperature
81 constexpr std::array<Numeric, nlines_mpm2020> y1 =
82 {0.00000, 0.00000124, -2E-8, 8E-8, 4.5E-7,
83 -9.3E-7, 0.00000264, -0.00000351, 0.00000359, -0.00000416,
84 0.00000326, -0.00000353, 0.00000484, -0.00000503, 0.00000579,
85 -0.00000590, 0.00000616, -0.00000619, 0.00000611, -0.00000609,
86 0.00000574, -0.00000568, 0.00000574, -0.00000566, 0.0000060,
87 -0.0000059, 0.0000063, -0.0000062, 0.0000064, -0.0000063,
88 0.0000065, -0.0000064, 0.0000065, -0.0000064, 0.0000065,
89 -0.0000064, 0.0000064, -0.0000062, 0.00000, 0.00000,
90 0.00000, 0.00000, 0.00000, 0.00000, };
91
92 // Second order line mixing strength adjustment first coefficient [1/Pa^2] at reference temperature
93 constexpr std::array<Numeric, nlines_mpm2020> g0 =
94 {-6.95E-14, -9.0E-12, -1.03E-11, -2.39E-11, -1.72E-11,
95 -1.71E-11, 2.8E-12, 1.50E-11, 1.32E-11, 1.70E-11,
96 8.7E-12, 6.9E-12, 8.3E-12, 6.7E-12, 7E-13,
97 1.6E-12, -2.1E-12, -6.6E-12, -9.5E-12, -1.15E-11,
98 -1.18E-11, -1.40E-11, -1.73E-11, -1.86E-11, -2.17E-11,
99 -2.27E-11, -2.34E-11, -2.42E-11, -2.66E-11, -2.72E-11,
100 -3.01E-11, -3.04E-11, -3.34E-11, -3.33E-11, -3.61E-11,
101 -3.58E-11, -3.48E-11, -3.44E-11, 0E-10, 0E-10,
102 0E-10, 0E-10, 0E-10, 0E-10,};
103
104 // Second order line mixing strength adjustment second coefficient [1/Pa^2] at reference temperature
105 constexpr std::array<Numeric, nlines_mpm2020> g1 =
106 {0E-10, -4.5E-12, 7E-13, 3.3E-12, 8.1E-12,
107 1.62E-11, 1.79E-11, 2.25E-11, 5.4E-12, 3E-13,
108 4E-14, -4.7E-12, -3.4E-12, -7.1E-12, -1.80E-11,
109 -2.10E-11, -2.85E-11, -3.23E-11, -3.63E-11, -3.80E-11,
110 -3.78E-11, -3.87E-11, -3.92E-11, -3.94E-11, -4.24E-11,
111 -4.22E-11, -4.65E-11, -4.6E-11, -5.1E-11, -5.0E-11,
112 -5.5E-11, -5.4E-11, -5.8E-11, -5.6E-11, -6.2E-11,
113 -5.9E-11, -6.8E-11, -6.5E-11, 0E-10, 0E-10,
114 0E-10, 0E-10, 0E-10, 0E-10, };
115
116 // Second order line mixing frequency adjustment first coefficient [Hz/Pa^2] at reference temperature
117 constexpr std::array<Numeric, nlines_mpm2020> dv0 =
118 {-0.000028, 0.000597, -0.00195, 0.0032, -0.00475,
119 0.00541, -0.00232, 0.00154, 0.00007, -0.00084,
120 -0.00025, -0.00014, -0.00004, -0.00020, 0.0005,
121 -0.00066, 0.00072, -0.0008, 0.00064, -0.00070,
122 0.00056, -0.00060, 0.00047, -0.00049, 0.00040,
123 -0.00041, 0.00036, -0.00037, 0.00033, -0.00034,
124 0.00032, -0.00032, 0.00030, -0.00030, 0.00028,
125 -0.00029, 0.00029, -0.00029, 0.0, 0.0,
126 0.0, 0.0, 0.0, 0.0, };
127
128 // Second order line mixing frequency adjustment second coefficient [Hz/Pa^2] at reference temperature
129 constexpr std::array<Numeric, nlines_mpm2020> dv1 =
130 {-0.000039, 0.0009, -0.0012, 0.0016, -0.0027,
131 0.0029, 0.0006, -0.0015, 0.0010, -0.0014,
132 -0.0013, 0.0013, 0.0004, -0.0005, 0.0010,
133 -0.0010, 0.0010, -0.0011, 0.0008, -0.0009,
134 0.0003, -0.0003, 0.00009, -0.00009, 0.00017,
135 -0.00016, 0.00024, -0.00023, 0.00024, -0.00024,
136 0.00024, -0.00020, 0.00017, -0.00016, 0.00013,
137 -0.00012, 0.00005, -0.00004, 0.0, 0.0,
138 0.0, 0.0, 0.0, 0.0, };
139
140 // Temperature scaling exponent [-]
141 constexpr Numeric x = 0.754;
142
143 // Init all the values
144 std::array<LineShape::SingleSpeciesModel, nlines_mpm2020> out;
145 for (std::size_t i=0; i<nlines_mpm2020; i++) {
146 out[i] = init_mpm2020_slsm(g00[i], y0[i], y1[i], g0[i], g1[i], dv0[i], dv1[i], x);
147 }
148 return out;
149}
150
151
152constexpr QuantumIdentifier init_mpm2020_qid(Rational Jup, Rational Jlow, Rational Nup, Rational Nlow) noexcept
153{
154 QuantumNumbers upp;
155 QuantumNumbers low;
156 upp[QuantumNumberType::J] = Jup;
157 upp[QuantumNumberType::N] = Nup;
158 upp[QuantumNumberType::v1] = 0;
159 low[QuantumNumberType::J] = Jlow;
160 low[QuantumNumberType::N] = Nlow;
161 low[QuantumNumberType::v1] = 0;
162 return QuantumIdentifier(Species::select(Species::Species::Oxygen, "66"), upp, low);
163}
164
165
166constexpr std::array<QuantumIdentifier, nlines_mpm2020> init_mpm2020_qids() noexcept
167{
168 // N of upper level
169 constexpr std::array<Index, nlines_mpm2020> Np = {
170 1, 1, 3, 3, 5, 5, 7, 7, 9, 9,
171 11, 11, 13, 13, 15, 15, 17, 17,
172 19, 19, 21, 21, 23, 23, 25, 25,
173 27, 27, 29, 29, 31, 31, 33, 33,
174 35, 35, 37, 37, 1, 1, 1, 3, 3, 3};
175
176 // N of lower level
177 constexpr std::array<Index, nlines_mpm2020> Npp = {
178 1, 1, 3, 3, 5, 5, 7, 7, 9, 9,
179 11, 11, 13, 13, 15, 15, 17, 17,
180 19, 19, 21, 21, 23, 23, 25, 25,
181 27, 27, 29, 29, 31, 31, 33, 33,
182 35, 35, 37, 37, 3, 3, 3, 5, 5, 5};
183
184 // J of upper level
185 constexpr std::array<Index, nlines_mpm2020> Jp = {
186 1, 1, 3, 3, 5, 5, 7, 7, 9, 9,
187 11, 11, 13, 13, 15, 15, 17, 17,
188 19, 19, 21, 21, 23, 23, 25, 25,
189 27, 27, 29, 29, 31, 31, 33, 33,
190 35, 35, 37, 37, 1, 2, 2, 3, 4, 4};
191
192 // J of lower level
193 constexpr std::array<Index, nlines_mpm2020> Jpp = {
194 0, 2, 2, 4, 4, 6, 6, 8, 8, 10,
195 10, 12, 12, 14, 14, 16, 16, 18,
196 18, 20, 20, 22, 22, 24, 24, 26,
197 26, 28, 28, 30, 30, 32, 32, 34,
198 34, 36, 36, 38, 2, 2, 3, 4, 4, 5};
199
200 // Init all the values
201 std::array<QuantumIdentifier, nlines_mpm2020> out;
202 for (std::size_t i=0; i<nlines_mpm2020; i++) {
203 out[i] = init_mpm2020_qid(Rational(Jp[i]), Rational(Np[i]), Rational(Jpp[i]), Rational(Npp[i]));
204 }
205 return out;
206}
207
208
210 ArrayOfPropagationMatrix& dpropmat_clearsky_dx,
211 const Vector& f,
212 const Numeric& p,
213 const Numeric& t,
214 const Numeric& oxygen_vmr,
215 const Numeric& water_vmr,
216 const ArrayOfRetrievalQuantity& jacs)
217{
218 using Constant::pi;
219 using Constant::sqrt_pi;
220 using Constant::inv_sqrt_pi;
221 using Constant::pow2;
222 using Constant::pow3;
223
224 // Central frequency [Hz]
225 constexpr std::array<Numeric, nlines_mpm2020> f0 = {
226 1.18750334E+11, 5.6264774E+10, 6.2486253E+10, 5.8446588E+10, 6.0306056E+10,
227 5.9590983E+10, 5.9164204E+10, 6.0434778E+10, 5.8323877E+10, 6.1150562E+10,
228 5.7612486E+10, 6.1800158E+10, 5.6968211E+10, 6.2411220E+10, 5.6363399E+10,
229 6.2997984E+10, 5.5783815E+10, 6.3568526E+10, 5.5221384E+10, 6.4127775E+10,
230 5.4671180E+10, 6.4678910E+10, 5.4130025E+10, 6.5224078E+10, 5.3595775E+10,
231 6.5764779E+10, 5.3066934E+10, 6.6302096E+10, 5.2542418E+10, 6.6836834E+10,
232 5.2021429E+10, 6.7369601E+10, 5.1503360E+10, 6.7900868E+10, 5.0987745E+10,
233 6.8431006E+10, 5.0474214E+10, 6.8960312E+10, 3.68498246E+11, 4.24763020E+11,
234 4.87249273E+11, 7.15392902E+11, 7.73839490E+11, 8.34145546E+11, };
235
236 // Intensity [1 / Pa] (rounded to 10 digits because at most 9 digits exist in f0)
237 constexpr std::array<Numeric, nlines_mpm2020> intens = {
238 1.591521878E-21, 1.941172240E-21, 4.834543970E-21, 4.959264029E-21, 7.010386457E-21,
239 7.051673348E-21, 8.085012578E-21, 8.108262250E-21, 8.145673278E-21, 8.149757320E-21,
240 7.396406085E-21, 7.401923754E-21, 6.162286575E-21, 6.168475265E-21, 4.749226167E-21,
241 4.754435107E-21, 3.405982896E-21, 3.408455562E-21, 2.282498656E-21, 2.283934341E-21,
242 1.432692459E-21, 1.433513473E-21, 8.439995690E-22, 8.443521837E-22, 4.672706507E-22,
243 4.676049313E-22, 2.435008301E-22, 2.437304596E-22, 1.195038747E-22, 1.196873412E-22,
244 5.532759045E-23, 5.537261239E-23, 2.416832398E-23, 2.418989865E-23, 9.969285671E-24,
245 9.977543709E-24, 3.882541154E-24, 3.888101811E-24, 3.676253816E-23, 3.017524005E-22,
246 9.792882227E-23, 2.756166168E-23, 1.486462215E-22, 4.411918954E-23, };
247
248 // Temperature intensity modifier
249 constexpr std::array<Numeric, nlines_mpm2020> a2 = {
250 0.01, 0.014, 0.083, 0.083, 0.207, 0.207, 0.387, 0.386,
251 0.621, 0.621, 0.910, 0.910, 1.255, 1.255, 1.654, 1.654,
252 2.109, 2.108, 2.618, 2.617, 3.182, 3.181, 3.800, 3.800,
253 4.474, 4.473, 5.201, 5.200, 5.983, 5.982, 6.819, 6.818,
254 7.709, 7.708, 8.653, 8.652, 9.651, 9.650, 0.048, 0.044,
255 0.049, 0.145, 0.141, 0.145};
256
257 // Line shape model in SI units
258 constexpr auto lsm = init_mpm2020_lsm();
259
260 // Reference temperature [K]
261 constexpr Numeric t0 = 300;
262
263 // QuantumIdentifier if we need it
264 constexpr std::array<QuantumIdentifier, nlines_mpm2020> qids = init_mpm2020_qids();
265 constexpr Numeric mass = qids.front().Isotopologue().mass;
266
267 // Model setting
268 const bool do_temp_deriv = do_temperature_jacobian(jacs);
269
270 const Numeric theta = t0 / t;
271 const Numeric theta_m1 = theta - 1;
272 const Numeric theta_3 = pow3(theta);
273 const Numeric GD_div_F0 = std::sqrt(Constant::doppler_broadening_const_squared * t / mass);
274
275 for (std::size_t i=0; i<nlines_mpm2020; i++) {
276 const Numeric invGD = 1 / (GD_div_F0 * f0[i]);
277 const Numeric fac = sqrt_pi * invGD;
278 const Numeric ST = oxygen_vmr * theta_3 * p * intens[i] * std::exp(-a2[i] * theta_m1);
279 const Numeric G0 = (1 + 0.1*water_vmr) * p * lsm[i].G0().at(t, t0);
280 const Numeric Y = p * lsm[i].Y().at(t, t0);
281 const Numeric G = pow2( p) * lsm[i].G().at(t, t0);
282 const Numeric DV = pow2(p) * lsm[i].DV().at(t, t0);
283
284 const Numeric dinvGD_dT = do_temp_deriv ? - invGD * GD_div_F0 / (2 * t) : 0;
285 const Numeric dST_dT = do_temp_deriv ? (a2[i]*t0 - 3*t) / pow2(t) * ST : 0;
286 const Numeric dG0_dT = do_temp_deriv ? (1 + 0.1*water_vmr) * p * lsm[i].G0().dT(t, t0) : 0;
287 const Numeric dY_dT = do_temp_deriv ? p * lsm[i].Y().dT(t, t0) : 0;
288 const Numeric dG_dT = do_temp_deriv ? pow2(p) * lsm[i].G().dT(t, t0) : 0;
289 const Numeric dDV_dT = do_temp_deriv ? pow2(p) * lsm[i].DV().dT(t, t0) : 0;
290
291 for (Index j=0; j<f.nelem(); j++) {
292 const Complex z = Complex(f0[i] + DV - f[j], G0) * invGD;
293 const Complex Fv = fac * Faddeeva::w(z);
294 const Complex Flm = 1 / Complex(G0, f[j] + f0[i] + DV);
295
296 const Complex abs = std::real(
297 Complex(1 + G, Y) * Fv +
298 Complex(1 + G, -Y) * Flm);
299
300 propmat_clearsky.Kjj()[j] += ST * pow2(f[j]) * abs.real();
301
302 if (jacs.nelem()) {
303 const Complex dw = 2 * (Complex(0, fac * inv_sqrt_pi) - z * Fv);
304 const Complex dm = - pi * pow2(Flm);
305
306 for (Index iq=0; iq<jacs.nelem(); iq++) {
307 const auto& deriv = jacs[iq];
308
309 if (not deriv.propmattype()) continue;
310
311 if (deriv == Jacobian::Atm::Temperature) {
312 const Complex dFv = dw * (invGD * Complex(dDV_dT, dG0_dT) - dinvGD_dT) + Fv * dinvGD_dT;
313 const Complex dFlm = dm * Complex(dG0_dT, dDV_dT);
314 dpropmat_clearsky_dx[iq].Kjj()[j] += pow2(f[j]) * (ST * std::real(
315 Complex(1 + G, Y) * dFv + Complex(dG_dT, dY_dT) * Fv +
316 Complex(1 + G, -Y) * dFlm + Complex(G, -dY_dT) * Flm) + abs.real() * dST_dT);
317 } else if (is_frequency_parameter(deriv)) {
318 const Complex dFv = - dw * invGD;
319 const Complex dFlm = Complex(0, 1) * dm;
320 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * (pow2(f[j]) * std::real(
321 Complex(1 + G, Y) * dFv +
322 Complex(1 + G, -Y) * dFlm) + 2 * abs.real() * f[j]);
323 } else if (deriv.Target().needQuantumIdentity()) {
324 const Absorption::QuantumIdentifierLineTarget lt(deriv.QuantumIdentity(), qids[i]);
325
326 //NOTE: This is a special case where each line must be seen as a "Band" by themselves.
327 //NOTE: (cont) This is because we never check for "Line" unless a full Absorption::Lines
328 //NOTE: (cont) is used in the QuantumIdentifierLineTarget struct.
329 if (lt not_eq Absorption::QuantumIdentifierLineTargetType::Band) continue;
330
331 if (deriv == Jacobian::Line::ShapeG0X0) {
332 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(
333 Complex(1 + G, Y) * Complex(0, 1) * dw * invGD +
334 Complex(1 + G, -Y) * dm) *
335 lsm[i].G0().dX0(t, t0);
336 } else if (deriv == Jacobian::Line::ShapeG0X1) {
337 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(
338 Complex(1 + G, Y) * Complex(0, 1) * dw * invGD +
339 Complex(1 + G, -Y) * dm) *
340 lsm[i].G0().dX1(t, t0);
341 } else if (deriv == Jacobian::Line::ShapeDVX0) {
342 const Complex dFv = dw * invGD;
343 const Complex dFlm = Complex(0, 1) * dm;
344 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(
345 Complex(1 + G, Y) * dFv +
346 Complex(1 + G, -Y) * dFlm) *
347 lsm[i].DV().dX0(t, t0);
348 } else if (deriv == Jacobian::Line::ShapeDVX1) {
349 const Complex dFv = dw * invGD;
350 const Complex dFlm = Complex(0, 1) * dm;
351 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(
352 Complex(1 + G, Y) * dFv +
353 Complex(1 + G, -Y) * dFlm) *
354 lsm[i].DV().dX1(t, t0);
355 } else if (deriv == Jacobian::Line::ShapeDVX2) {
356 const Complex dFv = dw * invGD;
357 const Complex dFlm = Complex(0, 1) * dm;
358 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(
359 Complex(1 + G, Y) * dFv +
360 Complex(1 + G, -Y) * dFlm) *
361 lsm[i].DV().dX2(t, t0);
362 } else if (deriv == Jacobian::Line::ShapeGX0) {
363 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(Fv + Flm) *
364 lsm[i].G().dX0(t, t0);
365 } else if (deriv == Jacobian::Line::ShapeYX0) {
366 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(Fv + Flm) *
367 lsm[i].Y().dX0(t, t0);
368 } else if (deriv == Jacobian::Line::ShapeGX1) {
369 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(Fv - Flm) *
370 lsm[i].G().dX1(t, t0);
371 } else if (deriv == Jacobian::Line::ShapeYX1) {
372 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(Fv + Flm) *
373 lsm[i].Y().dX1(t, t0);
374 } else if (deriv == Jacobian::Line::ShapeGX2) {
375 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(Fv - Flm) *
376 lsm[i].G().dX2(t, t0);
377 } else if (deriv == Jacobian::Line::ShapeYX2) {
378 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(Fv - Flm) *
379 lsm[i].Y().dX2(t, t0);
380 } else if (deriv == Jacobian::Line::Center) {
381 const Complex dFv = Fv / f0[i] - dw * invGD + dw * z / f0[i];
382 const Complex dFlm = Complex(0, 1) * dm;
383 dpropmat_clearsky_dx[iq].Kjj()[j] += ST * pow2(f[j]) * std::real(
384 Complex(1 + G, Y) * dFv +
385 Complex(1 + G, -Y) * dFlm);
386 } else if (deriv == Jacobian::Line::Strength) {
387 dpropmat_clearsky_dx[iq].Kjj()[j] += theta_3 * p * std::exp(-a2[i] * theta_m1) * pow2(f[j]) * abs.real();
388 }
389 }
390 }
391 }
392 }
393 }
394}
This can be used to make arrays out of anything.
Definition: array.h:107
Index nelem() const ARTS_NOEXCEPT
Number of elements.
Definition: array.h:195
Index nelem() const ARTS_NOEXCEPT
Returns the number of elements.
Definition: matpackI.cc:48
Compute the line shape parameters for a single broadening species.
VectorView Kjj(const Index iz=0, const Index ia=0)
Vector view to diagonal elements.
Container class for Quantum Numbers.
Definition: quantum.h:112
Implements rational numbers to work with other ARTS types.
Definition: rational.h:52
The Vector class.
Definition: matpackI.h:876
bool do_temperature_jacobian(const ArrayOfRetrievalQuantity &js) noexcept
Returns if the array wants the temperature derivative.
Definition: jacobian.cc:1147
bool is_frequency_parameter(const RetrievalQuantity &t) noexcept
Returns if the Retrieval quantity is a frequency parameter in propagation matrix calculations.
Definition: jacobian.cc:1001
#define abs(x)
Linear algebra functions.
Constains various line scaling functions.
Numeric fac(const Index n)
fac
Definition: math_funcs.cc:63
INDEX Index
The type to use for all integer numbers and indices.
Definition: matpack.h:39
NUMERIC Numeric
The type to use for all floating point numbers.
Definition: matpack.h:33
#define a2
std::complex< Numeric > Complex
constexpr Numeric real(Complex c) noexcept
real
void makarov2020_o2_lines_mpm(PropagationMatrix &propmat_clearsky, ArrayOfPropagationMatrix &dpropmat_clearsky_dx, const Vector &f, const Numeric &p, const Numeric &t, const Numeric &oxygen_vmr, const Numeric &water_vmr, const ArrayOfRetrievalQuantity &jacs)
Adds Makarov MPM2020 O2 absorption lines to the propagation matrix.
constexpr auto pow3(T x) -> decltype(pow2(x) *x)
power of three
Definition: constants.h:71
constexpr auto pow2(T x) -> decltype(x *x)
power of two
Definition: constants.h:65
Temperature
Definition: jacobian.h:57
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.
constexpr const IsotopeRecord & select(Species spec, const std::string_view isotname) noexcept
constexpr std::array< QuantumIdentifier, nlines_mpm2020 > init_mpm2020_qids() noexcept
constexpr QuantumIdentifier init_mpm2020_qid(Rational Jup, Rational Jlow, Rational Nup, Rational Nlow) noexcept
constexpr std::size_t nlines_mpm2020
constexpr std::array< LineShape::SingleSpeciesModel, nlines_mpm2020 > init_mpm2020_lsm() noexcept
constexpr LineShape::SingleSpeciesModel init_mpm2020_slsm(Numeric g00, Numeric y0, Numeric y1, Numeric g0, Numeric g1, Numeric dv0, Numeric dv1, Numeric x) noexcept
#define w
Quantum::Identifier QuantumIdentifier
Definition: quantum.h:471
Numeric sqrt(const Rational r)
Square root.
Definition: rational.h:739
#define N
Definition: rng.cc:164