ARTS 2.5.0 (git: 9ee3ac6c)
lineshape.h
Go to the documentation of this file.
1#ifndef lineshapes_h
2#define lineshapes_h
3
4#include <variant>
5
6#include "constants.h"
7#include "energylevelmap.h"
8#include "linescaling.h"
9#include "nonstd.h"
10
11namespace LineShape {
12struct Noshape {
13 static constexpr Complex F = Complex(0, 0);
14
15 static constexpr Complex dFdT(const Output &, Numeric) noexcept { return 0; }
16 static constexpr Complex dFdf() noexcept { return 0; }
17 static constexpr Complex dFdF0() noexcept { return 0; }
18 static constexpr Complex dFdH(Numeric) noexcept { return 0; }
19 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
20 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
21 static constexpr Complex dFdVMR(const Output &) noexcept { return 0; }
22 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
23 static constexpr Complex dFdD0(Numeric) noexcept { return 0; }
24 static constexpr Complex dFdG0(Numeric) noexcept { return 0; }
25 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
26 static constexpr Complex dFdG2(Numeric) noexcept { return 0; }
27
28 constexpr Complex operator()(Numeric) const noexcept { return F; }
29}; // Noshape
30
31struct Doppler {
34
37
38 constexpr Doppler(Numeric F0_noshift, Numeric DC, Numeric dZ) noexcept
39 : F(), x(), mF0(F0_noshift + dZ), invGD(1.0 / nonstd::abs(DC * mF0)) {}
40
41 [[nodiscard]] constexpr Complex dFdT(const Output &, Numeric T) const noexcept {
42 return F * (2 * Constant::pow2(x) - 1) / (2 * T);
43 }
44 [[nodiscard]] constexpr Complex dFdf() const noexcept { return -2 * invGD * F * x; }
45 [[nodiscard]] constexpr Complex dFdF0() const noexcept {
46 return F * (2 * x * (invGD * mF0 + x) - 1) / mF0;
47 }
48 [[nodiscard]] constexpr Complex dFdH(Numeric dZ) const noexcept {
49 return dZ * (F * (2 * x * (invGD * mF0 + x) - 1) / mF0);
50 }
51 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
52 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
53 static constexpr Complex dFdVMR(const Output &) noexcept { return 0; }
54 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
55 static constexpr Complex dFdD0(Numeric) noexcept { return 0; }
56 static constexpr Complex dFdG0(Numeric) noexcept { return 0; }
57 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
58 static constexpr Complex dFdG2(Numeric) noexcept { return 0; }
59
60 Complex operator()(Numeric f) noexcept;
61}; // Doppler
62
63struct Lorentz {
66
69
70 constexpr Lorentz(Numeric F0_noshift, const Output &ls) noexcept
71 : mF0(F0_noshift + ls.D0 + ls.DV), G0(ls.G0) {}
72
73 [[nodiscard]] constexpr Complex dFdVMR(const Output &d) const noexcept {
74 return Complex(d.G0, d.D0 + d.DV) * dF;
75 }
76 [[nodiscard]] constexpr Complex dFdT(const Output &d, Numeric) const noexcept {
77 return dFdVMR(d);
78 }
79 [[nodiscard]] [[nodiscard]] constexpr Complex dFdf() const noexcept { return Complex(0, -1) * dF; }
80 [[nodiscard]] constexpr Complex dFdF0() const noexcept { return Complex(0, 1) * dF; }
81 [[nodiscard]] constexpr Complex dFdDV(Numeric d) const noexcept { return d * dFdF0(); }
82 [[nodiscard]] constexpr Complex dFdD0(Numeric d) const noexcept { return d * dFdF0(); }
83 static constexpr Complex dFdH(Numeric) noexcept { return 0; }
84 [[nodiscard]] constexpr Complex dFdG0(Numeric d) const noexcept { return d * dF; }
85 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
86 static constexpr Complex dFdG2(Numeric) { return 0; }
87 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
88 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
89
90 constexpr Complex operator()(Numeric f) noexcept {
91 F = Constant::inv_pi / Complex(G0, mF0 - f);
92 dF = -Constant::pi * Constant::pow2(F);
93 return F;
94 }
95}; // Lorentz
96
97struct Voigt {
100
104
105 constexpr Voigt(Numeric F0_noshift, const Output &ls, Numeric DC, Numeric dZ) noexcept
106 : F(), dF(), mF0(F0_noshift + dZ + ls.D0 + ls.DV),
107 invGD(1.0 / nonstd::abs(DC * mF0)), z(invGD * Complex(-mF0, ls.G0)) {}
108
109 [[nodiscard]] constexpr Complex dFdf() const noexcept { return dF; }
110 [[nodiscard]] constexpr Complex dFdF0() const noexcept { return -dF; }
111 [[nodiscard]] constexpr Complex dFdDV(Numeric d) const noexcept { return -d * dF; }
112 [[nodiscard]] constexpr Complex dFdD0(Numeric d) const noexcept { return -d * dF; }
113 [[nodiscard]] constexpr Complex dFdG0(Numeric d) const noexcept { return Complex(0, d) * dF; }
114 [[nodiscard]] constexpr Complex dFdH(Numeric dZ) const noexcept { return -dZ * dF; }
115 [[nodiscard]] constexpr Complex dFdVMR(const Output &d) const noexcept {
116 return Complex(-d.D0 - d.DV, d.G0) * dF;
117 }
118 [[nodiscard]] constexpr Complex dFdT(const Output &d, Numeric T) const noexcept {
119 return -(F * invGD + dF * z) * (2 * T * (d.D0 + d.DV) + mF0) /
120 (2 * T * invGD * mF0) +
121 Complex(-d.D0 - d.DV, d.G0) * dF;
122 }
123 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
124 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
125 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
126 static constexpr Complex dFdG2(Numeric) { return 0; }
127
128 Complex operator()(Numeric f) noexcept;
129
130 [[nodiscard]] bool OK() const noexcept { return invGD > 0; }
131}; // Voigt
132
134 enum struct CalcType : char {
135 Voigt,
139 Full
140 };
141
143
156
157 SpeedDependentVoigt(Numeric F0_noshift, const Output &ls, Numeric GD_div_F0,
158 Numeric dZ) noexcept;
159
160 [[nodiscard]] Complex dFdf() const noexcept;
161 [[nodiscard]] Complex dFdF0() const noexcept;
162 [[nodiscard]] Complex dFdD0(Numeric dD0dD0) const noexcept;
163 [[nodiscard]] Complex dFdG0(Numeric dG0dG0) const noexcept;
164 [[nodiscard]] Complex dFdD2(Numeric dD2dD2) const noexcept;
165 [[nodiscard]] Complex dFdG2(Numeric dG2dG2) const noexcept;
166 [[nodiscard]] Complex dFdH(Numeric dZ) const noexcept;
167 [[nodiscard]] Complex dFdVMR(const Output &d) const noexcept;
168 [[nodiscard]] Complex dFdT(const Output &d, Numeric T) const noexcept;
169 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
170 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
171 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
172
173 Complex operator()(Numeric f) noexcept;
174
175 [[nodiscard]] CalcType init(const Complex c2) const noexcept;
176 void update_calcs() noexcept;
177 void calc() noexcept;
178}; // SpeedDependentVoigt
179
181 enum struct CalcType : char {
182 Noc2tLowZ,
183 Noc2tHighZ,
187 Full
188 };
189
191
202
204
217
218 HartmannTran(Numeric F0_noshift, const Output &ls, Numeric GD_div_F0,
219 Numeric dZ) noexcept;
220
221 [[nodiscard]] Complex dFdf() const noexcept;
222 [[nodiscard]] Complex dFdF0() const noexcept;
223 [[nodiscard]] Complex dFdD0(Numeric dD0) const noexcept;
224 [[nodiscard]] Complex dFdG0(Numeric dG0) const noexcept;
225 [[nodiscard]] Complex dFdD2(Numeric dD2) const noexcept;
226 [[nodiscard]] Complex dFdG2(Numeric dG2) const noexcept;
227 [[nodiscard]] Complex dFdFVC(Numeric dFVC) const noexcept;
228 [[nodiscard]] Complex dFdETA(Numeric dETA) const noexcept;
229 [[nodiscard]] Complex dFdH(Numeric dZ) const noexcept;
230 [[nodiscard]] Complex dFdVMR(const Output &d) const noexcept;
231 [[nodiscard]] Complex dFdT(const Output &d, Numeric T) const noexcept;
232 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
233
234 Complex operator()(Numeric f) noexcept;
235
236 [[nodiscard]] CalcType init(const Complex c2t) const noexcept;
237 void update_calcs() noexcept;
238 void calc() noexcept;
239}; // HartmannTran
240
241struct Nonorm {
242 static constexpr Numeric N = 1.0;
243
244 constexpr Nonorm() noexcept = default;
245
246 static constexpr Numeric dNdT(Numeric, Numeric) noexcept { return 0; }
247 static constexpr Numeric dNdf(Numeric) noexcept { return 0; }
248 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return 0; }
249
250 constexpr Numeric operator()(Numeric) noexcept { return N; }
251}; // Nonorm
252
255
260
261 VanVleckHuber(Numeric F0, Numeric T) noexcept;
262
263 [[nodiscard]] Numeric dNdT(Numeric T, Numeric f) const noexcept;
264 [[nodiscard]] Numeric dNdf(Numeric f) const noexcept;
265 [[nodiscard]] Numeric dNdF0() const noexcept;
266
267 Numeric operator()(Numeric f) noexcept;
268}; // VanVleckHuber
269
272
274
275 constexpr VanVleckWeisskopf(Numeric F0) noexcept : N(1), invF0(1.0 / F0) {}
276
277 static constexpr Numeric dNdT(Numeric, Numeric) noexcept { return 0; }
278 [[nodiscard]] constexpr Numeric dNdf(Numeric f) const noexcept {
279 return 2.0 * f * Constant::pow2(invF0);
280 }
281 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return -2.0 * N * invF0; }
282
283 constexpr Numeric operator()(Numeric f) noexcept {
284 N = Constant::pow2(f * invF0);
285 return N;
286 }
287}; // VanVleckWeisskopf
288
291
295
297
298 [[nodiscard]] Numeric dNdT(Numeric, Numeric f) const noexcept;
299 [[nodiscard]] Numeric dNdf(Numeric f) const noexcept;
300 [[nodiscard]] Numeric dNdF0() const noexcept;
301
302 Numeric operator()(Numeric f) noexcept;
303}; // RosenkranzQuadratic
304
307
312
313 constexpr SimpleFrequencyScaling(Numeric exp, Numeric expm1, Numeric F0_, Numeric T_) :
314 N(1.0), T(T_), F0(F0_), expF0(exp), expm1F0(expm1) {}
315
317 SimpleFrequencyScaling(std::exp(- (Constant::h * F0_) / (Constant::k * T_)),
318 std::expm1(- (Constant::h * F0_) / (Constant::k * T_)),
319 F0_, T_) {}
320
321 [[nodiscard]] Numeric dNdT(Numeric t_ [[maybe_unused]], Numeric f) const ARTS_NOEXCEPT;
322 [[nodiscard]] Numeric dNdf(Numeric f) const noexcept;
323 [[nodiscard]] constexpr Numeric dNdF0() const noexcept {
324 return - N / F0 + N * Constant::h * expF0 / (Constant::k * T * expm1F0);
325 }
326
327 Numeric operator()(Numeric f) noexcept;
328}; // SimpleFrequencyScaling
329
331 static constexpr Numeric S = 1.0;
332 static constexpr Numeric N = 0.0;
333
334 static constexpr Numeric dSdT() noexcept { return 0; }
335 static constexpr Numeric dSdI0() noexcept { return 0; }
336 static constexpr Numeric dSdF0() noexcept { return 0; }
337 static constexpr Numeric dSdNLTEu() noexcept { return 0; }
338 static constexpr Numeric dSdNLTEl() noexcept { return 0; }
339 static constexpr Numeric dSdSELFVMR() noexcept { return 0; }
340
341 static constexpr Numeric dNdT() noexcept { return 0; }
342 static constexpr Numeric dNdI0() noexcept { return 0; }
343 static constexpr Numeric dNdF0() noexcept { return 0; }
344 static constexpr Numeric dNdNLTEu() noexcept { return 0; }
345 static constexpr Numeric dNdNLTEl() noexcept { return 0; }
346 static constexpr Numeric dNdSELFVMR() noexcept { return 0; }
347
348 static constexpr bool do_nlte() noexcept {return false;}
349}; // Nostrength
350
353 static constexpr Numeric N = 0.0;
354
359
360 constexpr LocalThermodynamicEquilibrium(Numeric I0, Numeric r, Numeric drdSELFVMR, Numeric drdT, Numeric QT0,
361 Numeric QT, Numeric dQTdT, Numeric br,
362 Numeric dbr_dT_rat, Numeric stim,
363 Numeric dstim_dT, Numeric dstim_dF0) noexcept
364 : S(), dSdI0val(r * br * stim * QT0 / QT),
365 dSdTval(I0 * (r * br * dstim_dT * QT0 / QT + dSdI0val * (dbr_dT_rat - dQTdT / QT) + drdT * br * stim * QT0 / QT)),
366 dSdF0val(r * I0 * br * dstim_dF0 * QT0 / QT),
367 dSdSELFVMRval(drdSELFVMR * I0 * br * stim * QT0 / QT)
368 {
369 S = I0 * dSdI0val;
370 }
371
373 Numeric E0, Numeric QT, Numeric QT0,
374 Numeric dQTdT, Numeric r, Numeric drdSELFVMR, Numeric drdT) noexcept;
375
376 [[nodiscard]] constexpr Numeric dSdT() const noexcept { return dSdTval; }
377 [[nodiscard]] constexpr Numeric dSdI0() const noexcept { return dSdI0val; }
378 [[nodiscard]] constexpr Numeric dSdF0() const noexcept { return dSdF0val; }
379 static constexpr Numeric dSdNLTEu() noexcept { return 0; }
380 static constexpr Numeric dSdNLTEl() noexcept { return 0; }
381 [[nodiscard]] constexpr Numeric dSdSELFVMR() const noexcept { return dSdSELFVMRval; }
382
383 static constexpr Numeric dNdT() noexcept { return 0; }
384 static constexpr Numeric dNdI0() noexcept { return 0; }
385 static constexpr Numeric dNdF0() noexcept { return 0; }
386 static constexpr Numeric dNdNLTEu() noexcept { return 0; }
387 static constexpr Numeric dNdNLTEl() noexcept { return 0; }
388 static constexpr Numeric dNdSELFVMR() noexcept { return 0; }
389
390 static constexpr bool do_nlte() noexcept {return false;}
391}; // LocalThermodynamicEquilibrium
392
396
397 static constexpr Numeric c0 = 2.0 * Constant::h / Constant::pow2(Constant::c);
398 static constexpr Numeric c1 = Constant::h / (4 * Constant::pi);
399
402
405
409
412
414 Numeric r, Numeric drdSELFVMR, Numeric drdt,
415 Numeric k, Numeric dkdF0, Numeric dkdr1, Numeric dkdr2,
416 Numeric e, Numeric dedF0, Numeric dedr2,
417 Numeric B, Numeric dBdT, Numeric dBdF0) noexcept :
418 S(), N(),
419 dSdTval(drdt * k),
420 dNdTval(drdt * (e - k * B) - r * k * dBdT),
421 dSdF0val(r * dkdF0),
422 dNdF0val(r * (dedF0 - dkdF0 * B - k * dBdF0)),
423 dSdr1(r * dkdr1),
424 dSdr2(r * dkdr2),
425 dNdr2(r * (dedr2 - dkdr2 * B)),
426 dSdSELFVMRval(drdSELFVMR * k),
427 dNdSELFVMRval(drdSELFVMR * (e - k * B))
428 {
429 S = r * k;
430 N = r * (e - k * B);
431 }
432
434 Numeric g1, Numeric g2, Numeric r1,
435 Numeric r2, Numeric r, Numeric drdSELFVMR, Numeric drdT) noexcept;
436
437
438 [[nodiscard]] constexpr Numeric dSdT() const noexcept { return 0; }
439 static constexpr Numeric dSdI0() noexcept { return 0; }
440 [[nodiscard]] constexpr Numeric dSdF0() const noexcept { return dSdF0val; }
441 [[nodiscard]] constexpr Numeric dSdNLTEu() const noexcept { return dSdr1; }
442 [[nodiscard]] constexpr Numeric dSdNLTEl() const noexcept { return dSdr2; }
443 [[nodiscard]] constexpr Numeric dSdSELFVMR() const noexcept { return dSdSELFVMRval; }
444
445 [[nodiscard]] constexpr Numeric dNdT() const noexcept { return dNdTval; }
446 static constexpr Numeric dNdI0() noexcept { return 0; }
447 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return dNdF0val; }
448 [[nodiscard]] constexpr Numeric dNdNLTEu() const noexcept { return -dSdr1; }
449 [[nodiscard]] constexpr Numeric dNdNLTEl() const noexcept { return dNdr2; }
450 [[nodiscard]] constexpr Numeric dNdSELFVMR() const noexcept { return dNdSELFVMRval; }
451
452 static constexpr bool do_nlte() noexcept {return true;}
453}; // FullNonLocalThermodynamicEquilibrium
454
458
461
464
467
471
474
476 Numeric QT0, Numeric QT, Numeric dQTdT,
477 Numeric r, Numeric drdSELFVMR, Numeric drdT,
478 Numeric K1, Numeric dK1dT,
479 Numeric K2, Numeric dK2dT, Numeric dK2dF0,
480 Numeric K3, Numeric dK3dT, Numeric dK3dF0, Numeric dK3dTl, Numeric dK3dTu,
481 Numeric K4, Numeric dK4dT, Numeric dK4dTu,
482 Numeric B, Numeric dBdT, Numeric dBdF0) noexcept :
483 S(), N(),
484 dSdI0val( r * QT0 / QT * K1 * K2 * K3),
485 dNdI0val(B * r * QT0 / QT * K1 * K2 * (K4 - K3)),
486 dSdTval(I0 * (drdT * QT0 / QT * K1 * K2 * K3 -
487 r * dQTdT * QT0 / Constant::pow2(QT) * K1 * K2 * K3 +
488 r * QT0 / QT * dK1dT * K2 * K3 +
489 r * QT0 / QT * K1 * dK2dT * K3 +
490 r * QT0 / QT * K1 * K2 * dK3dT)),
491 dNdTval(I0 * (dBdT * r * QT0 / QT * K1 * K2 * (K4 - K3) +
492 B * drdT * QT0 / QT * K1 * K2 * (K4 - K3) -
493 B * r * dQTdT * QT0 / Constant::pow2(QT) * K1 * K2 * (K4 - K3) +
494 B * r * QT0 / QT * dK1dT * K2 * (K4 - K3) +
495 B * r * QT0 / QT * K1 * dK2dT * (K4 - K3) +
496 B * r * QT0 / QT * K1 * K2 * (dK4dT - dK3dT))),
497 dSdF0val(I0 * (r * QT0 / QT * K1 * dK2dF0 * K3 +
498 r * QT0 / QT * K1 * K2 * dK3dF0)),
499 dNdF0val(I0 * (dBdF0 * r * QT0 / QT * K1 * K2 * (K4 - K3) +
500 B * r * QT0 / QT * K1 * dK2dF0 * (K4 - K3) -
501 B * r * QT0 / QT * K1 * K2 * dK3dF0)),
502 dSdTl(I0 * r * QT0 / QT * K1 * K2 * dK3dTl),
503 dSdTu(I0 * r * QT0 / QT * K1 * K2 * dK3dTu),
504 dNdTu(B * r * QT0 / QT * K1 * K2 * (dK4dTu - dK3dTu)),
505 dSdSELFVMRval(I0 * drdSELFVMR * QT0 / QT * K1 * K2 * K3),
506 dNdSELFVMRval(I0 * B * drdSELFVMR * QT0 / QT * K1 * K2 * (K4 - K3))
507 {
508 S = I0 * dSdI0val;
509 N = I0 * dNdI0val;
510 }
511
513 Numeric I0, Numeric T0, Numeric T, Numeric Tl, Numeric Tu, Numeric F0,
514 Numeric E0, Numeric Evl, Numeric Evu, Numeric QT, Numeric QT0,
515 Numeric dQTdT, Numeric r, Numeric drdSELFVMR, Numeric drdT) noexcept;
516
517 [[nodiscard]] constexpr Numeric dSdT() const noexcept { return dSdTval; }
518 [[nodiscard]] constexpr Numeric dSdI0() const noexcept { return dSdI0val; }
519 [[nodiscard]] constexpr Numeric dSdF0() const noexcept { return dSdF0val; }
520 [[nodiscard]] constexpr Numeric dSdNLTEu() const noexcept { return dSdTl; }
521 [[nodiscard]] constexpr Numeric dSdNLTEl() const noexcept { return dSdTu; }
522 [[nodiscard]] constexpr Numeric dSdSELFVMR() const noexcept { return dSdSELFVMRval; }
523
524 [[nodiscard]] constexpr Numeric dNdT() const noexcept { return dNdTval; }
525 [[nodiscard]] constexpr Numeric dNdI0() const noexcept { return dNdI0val; }
526 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return dNdF0val; }
527 [[nodiscard]] constexpr Numeric dNdNLTEu() const noexcept { return -dSdTl; }
528 [[nodiscard]] constexpr Numeric dNdNLTEl() const noexcept { return dNdTu; }
529 [[nodiscard]] constexpr Numeric dNdSELFVMR() const noexcept { return dNdSELFVMRval; }
530
531 static constexpr bool do_nlte() noexcept {return true;}}
532; // VibrationalTemperaturesNonLocalThermodynamicEquilibrium
533
536 using Variant = std::variant<Noshape, Doppler, Lorentz, Voigt, SpeedDependentVoigt, HartmannTran>;
538
539public:
540 [[nodiscard]] constexpr Complex dFdT(const Output & dXdT, Numeric T) const noexcept {return std::visit([&](auto &&LS) { return LS.dFdT(dXdT, T); }, ls);}
541 [[nodiscard]] constexpr Complex dFdf() const noexcept {return std::visit([](auto &&LS) { return LS.dFdf(); }, ls);}
542 [[nodiscard]] constexpr Complex dFdF0() const noexcept {return std::visit([](auto &&LS) { return LS.dFdF0(); }, ls);}
543 [[nodiscard]] constexpr Complex dFdH(Numeric dfdH) const noexcept {return std::visit([dfdH](auto &&LS) { return LS.dFdH(dfdH); }, ls);}
544 [[nodiscard]] constexpr Complex dFdVMR(const Output &dXdVMR) const noexcept {return std::visit([&](auto &&LS) { return LS.dFdVMR(dXdVMR); }, ls);}
545 [[nodiscard]] constexpr Complex dFdFVC(Numeric d) const noexcept {return std::visit([d](auto &&LS) { return LS.dFdFVC(d); }, ls);}
546 [[nodiscard]] constexpr Complex dFdETA(Numeric d) const noexcept {return std::visit([d](auto &&LS) { return LS.dFdETA(d); }, ls);}
547 [[nodiscard]] constexpr Complex dFdDV(Numeric d) const noexcept {return std::visit([d](auto &&LS) { return LS.dFdDV(d); }, ls);}
548 [[nodiscard]] constexpr Complex dFdD0(Numeric d) const noexcept {return std::visit([d](auto &&LS) { return LS.dFdD0(d); }, ls);}
549 [[nodiscard]] constexpr Complex dFdG0(Numeric d) const noexcept {return std::visit([d](auto &&LS) { return LS.dFdG0(d); }, ls);}
550 [[nodiscard]] constexpr Complex dFdD2(Numeric d) const noexcept {return std::visit([d](auto &&LS) { return LS.dFdD2(d); }, ls);}
551 [[nodiscard]] constexpr Complex dFdG2(Numeric d) const noexcept {return std::visit([d](auto &&LS) { return LS.dFdG2(d); }, ls);}
552 [[nodiscard]] constexpr Complex F() const noexcept {return std::visit([](auto &&LS) { return LS.F; }, ls);}
553
555 constexpr Complex operator()(Numeric f) noexcept {return std::visit([f](auto &&LS) { return LS(f); }, ls);}
556
557 constexpr Calculator(const Type type, const Numeric F0,
558 const Output &X, const Numeric DC,
559 const Numeric DZ, bool manually_mirrored) noexcept : ls(Noshape{}) {
560 if (not manually_mirrored) {
561 switch (type) {
562 case Type::DP:
563 ls = Doppler(F0, DC, DZ); break;
564 case Type::LP:
565 ls = Lorentz(F0, X); break;
566 case Type::VP:
567 ls = Voigt(F0, X, DC, DZ); break;
568 case Type::SDVP:
569 ls = SpeedDependentVoigt(F0, X, DC, DZ); break;
570 case Type::HTP:
571 ls = HartmannTran(F0, X, DC, DZ); break;
572 case Type::FINAL: { /*leave last*/
573 }
574 }
575 }
576 }
577
578 constexpr Calculator(const Absorption::MirroringType mirror,
579 const Type type, const Numeric F0,
580 const Output &X, const Numeric DC,
581 const Numeric DZ) : ls(Noshape{}) {
582 switch (mirror) {
583 case Absorption::MirroringType::Lorentz:
584 ls = Lorentz(-F0, mirroredOutput(X)); break;
585 case Absorption::MirroringType::SameAsLineShape:
586 *this = {type, -F0, mirroredOutput(X), -DC, -DZ, false}; break;
587 case Absorption::MirroringType::Manual:
588 *this = {type, F0, mirroredOutput(X), -DC, -DZ, false}; break;
590 break;
591 case Absorption::MirroringType::FINAL: { /*leave last*/
592 }
593 }
594 }
595}; // Calculator
596
598 using Variant = std::variant<Nonorm, VanVleckHuber, VanVleckWeisskopf, RosenkranzQuadratic, SimpleFrequencyScaling>;
600
601public:
602 [[nodiscard]] constexpr Numeric dNdT(Numeric T, Numeric f) const noexcept { return std::visit([T, f](auto &&LSN) { return LSN.dNdT(T, f); }, ls_norm); }
603 [[nodiscard]] constexpr Numeric dNdf(Numeric f) const noexcept { return std::visit([f](auto&& LS){return LS.dNdf(f);}, ls_norm); }
604 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return std::visit([](auto &&LS) { return LS.dNdF0(); }, ls_norm); }
605 constexpr Numeric operator()(Numeric f) noexcept { return std::visit([f](auto &&LSN) { return LSN(f); }, ls_norm); }
606
607 constexpr Normalizer(const Absorption::NormalizationType type,
608 const Numeric F0, const Numeric T) noexcept : ls_norm(Nonorm{}) {
609 switch (type) {
611 break;
612 case Absorption::NormalizationType::RQ:
613 ls_norm = RosenkranzQuadratic(F0, T); break;
614 case Absorption::NormalizationType::VVH:
615 ls_norm = VanVleckHuber(F0, T); break;
616 case Absorption::NormalizationType::VVW:
617 ls_norm = VanVleckWeisskopf(F0); break;
618 case Absorption::NormalizationType::SFS:
619 ls_norm = SimpleFrequencyScaling(F0, T); break;
620 case Absorption::NormalizationType::FINAL: { /*leave last*/
621 }
622 }
623 }
624}; // Normalizer
625
631
632public:
633 [[nodiscard]] constexpr Numeric S() const noexcept { return std::visit([](auto &&S) { return S.S; }, ls_str); }
634 [[nodiscard]] constexpr Numeric dSdT() const noexcept { return std::visit([](auto &&LSN) { return LSN.dSdT(); }, ls_str); }
635 [[nodiscard]] constexpr Numeric dSdI0() const noexcept { return std::visit([](auto &&LS) { return LS.dSdI0(); }, ls_str); }
636 [[nodiscard]] constexpr Numeric dSdF0() const noexcept { return std::visit([](auto &&LS) { return LS.dSdF0(); }, ls_str); }
637 [[nodiscard]] constexpr Numeric dSdNLTEu() const noexcept { return std::visit([](auto &&LS) { return LS.dSdNLTEu(); }, ls_str); }
638 [[nodiscard]] constexpr Numeric dSdNLTEl() const noexcept { return std::visit([](auto &&LS) { return LS.dSdNLTEl(); }, ls_str); }
639 [[nodiscard]] constexpr Numeric dSdSELFVMR() const noexcept { return std::visit([](auto&&LS){return LS.dSdSELFVMR();}, ls_str); }
640
641 [[nodiscard]] constexpr Numeric N() const noexcept { return std::visit([](auto &&S) { return S.N; }, ls_str); }
642 [[nodiscard]] constexpr Numeric dNdT() const noexcept { return std::visit([](auto &&LSN) { return LSN.dNdT(); }, ls_str); }
643 [[nodiscard]] constexpr Numeric dNdI0() const noexcept { return std::visit([](auto &&LS) { return LS.dNdI0(); }, ls_str); }
644 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return std::visit([](auto &&LS) { return LS.dNdF0(); }, ls_str); }
645 [[nodiscard]] constexpr Numeric dNdNLTEu() const noexcept { return std::visit([](auto &&LS) { return LS.dNdNLTEu(); }, ls_str); }
646 [[nodiscard]] constexpr Numeric dNdNLTEl() const noexcept { return std::visit([](auto &&LS) { return LS.dNdNLTEl(); }, ls_str);; }
647 [[nodiscard]] constexpr Numeric dNdSELFVMR() const noexcept { return std::visit([](auto&&LS){return LS.dNdSELFVMR();}, ls_str); }
648
649 [[nodiscard]] constexpr bool do_nlte() const noexcept {return std::visit([](auto &&S) { return S.do_nlte(); }, ls_str);}
650
652 const Numeric QT0,
653 const Numeric dQTdT, const Numeric r,
654 const Numeric drdSELFVMR,
655 const Numeric drdT,
656 const EnergyLevelMap &nlte,
657 const Absorption::Lines &band,
658 const Index line_index) noexcept : ls_str(Nostrength{}) {
659 const auto &line = band.Line(line_index);
660 switch (band.Population()) {
661 case Absorption::PopulationType::ByHITRANFullRelmat:
662 case Absorption::PopulationType::ByHITRANRosenkranzRelmat:
663 case Absorption::PopulationType::ByMakarovFullRelmat:
664 case Absorption::PopulationType::ByRovibLinearDipoleLineMixing:
665 case Absorption::PopulationType::LTE:
666 ls_str = LocalThermodynamicEquilibrium(line.I0(), band.T0(), T, line.F0(),
667 line.E0(), QT, QT0, dQTdT, r, drdSELFVMR, drdT); break;
668 case Absorption::PopulationType::NLTE: {
669 const auto [r_low, r_upp] = nlte.get_ratio_params(band, line_index);
671 line.F0(), line.A(), T, line.g_low(), line.g_upp(), r_low, r_upp, r, drdSELFVMR, drdT);
672 } break;
673 case Absorption::PopulationType::VibTemps: {
674 const auto [E_low, E_upp, T_low, T_upp] =
675 nlte.get_vibtemp_params(band, line_index, T);
676 ls_str = VibrationalTemperaturesNonLocalThermodynamicEquilibrium(
677 line.I0(), band.T0(), T, T_low, T_upp, line.F0(), line.E0(), E_low,
678 E_upp, QT, QT0, dQTdT, r, drdSELFVMR, drdT);
679 } break;
680 case Absorption::PopulationType::FINAL: { /*leave last*/
681 }
682 }
683 }
684}; // IntensityCalculator
685
689 const Vector & f_grid;
690 const bool do_nlte;
691
692 ComputeData(const Vector& f, const ArrayOfRetrievalQuantity &jacobian_quantities, const bool nlte) noexcept :
693 F(f.nelem(), 0),
694 N(nlte ? f.nelem() : 0, 0),
695 dF(f.nelem(), jacobian_quantities.nelem(), 0),
696 dN(nlte ? f.nelem() : 0, nlte ? jacobian_quantities.nelem() : 0, 0),
697 f_grid(f),
698 do_nlte(nlte) {}
699
700 void reset() noexcept {
701 F = 0;
702 N = 0;
703 dF = 0;
704 dN = 0;
705 }
706
707 void interp_add_even(const ComputeData& sparse) ARTS_NOEXCEPT;
708
709 void interp_add_triplequad(const ComputeData& sparse) ARTS_NOEXCEPT;
710};
711
712void compute(ComputeData &com,
713 ComputeData &sparse_com,
714 const AbsorptionLines &band,
715 const ArrayOfRetrievalQuantity &jacobian_quantities,
716 const EnergyLevelMap &nlte, const Vector &vmrs,
717 const ArrayOfSpeciesTag& self_tag,
718 const Numeric &self_vmr, const Numeric &isot_ratio, const Numeric &P, const Numeric &T, const Numeric &H, const Numeric &sparse_lim,
719 const bool do_zeeman, const Zeeman::Polarization zeeman_polarization, const Options::LblSpeedup speedup_type) ARTS_NOEXCEPT;
720
721Vector linear_sparse_f_grid(const Vector& f_grid, const Numeric& sparse_df) ARTS_NOEXCEPT;
722
723bool good_linear_sparse_f_grid(const Vector& f_grid_dense, const Vector& f_grid_sparse) noexcept;
724
725Vector triple_sparse_f_grid(const Vector& f_grid, const Numeric& sparse_df) noexcept;
726
727} // namespace LineShape
728
729#endif // lineshapes_h
Numeric E0
This can be used to make arrays out of anything.
Definition: array.h:107
The ComplexMatrix class.
The ComplexVector class.
Line shape calculator.
Definition: lineshape.h:535
constexpr Complex dFdETA(Numeric d) const noexcept
Definition: lineshape.h:546
constexpr Calculator(const Type type, const Numeric F0, const Output &X, const Numeric DC, const Numeric DZ, bool manually_mirrored) noexcept
Definition: lineshape.h:557
constexpr Complex dFdH(Numeric dfdH) const noexcept
Definition: lineshape.h:543
constexpr Calculator(const Absorption::MirroringType mirror, const Type type, const Numeric F0, const Output &X, const Numeric DC, const Numeric DZ)
Definition: lineshape.h:578
constexpr Complex dFdD2(Numeric d) const noexcept
Definition: lineshape.h:550
constexpr Complex dFdD0(Numeric d) const noexcept
Definition: lineshape.h:548
constexpr Complex dFdF0() const noexcept
Definition: lineshape.h:542
constexpr Complex dFdFVC(Numeric d) const noexcept
Definition: lineshape.h:545
constexpr Complex operator()(Numeric f) noexcept
Call operator on frequency. Must call this before any of the derivatives.
Definition: lineshape.h:555
std::variant< Noshape, Doppler, Lorentz, Voigt, SpeedDependentVoigt, HartmannTran > Variant
Definition: lineshape.h:536
constexpr Complex dFdf() const noexcept
Definition: lineshape.h:541
constexpr Complex dFdG0(Numeric d) const noexcept
Definition: lineshape.h:549
constexpr Complex dFdT(const Output &dXdT, Numeric T) const noexcept
Definition: lineshape.h:540
constexpr Complex dFdVMR(const Output &dXdVMR) const noexcept
Definition: lineshape.h:544
constexpr Complex F() const noexcept
Definition: lineshape.h:552
constexpr Complex dFdG2(Numeric d) const noexcept
Definition: lineshape.h:551
constexpr Complex dFdDV(Numeric d) const noexcept
Definition: lineshape.h:547
constexpr Numeric dSdNLTEu() const noexcept
Definition: lineshape.h:637
constexpr Numeric dSdSELFVMR() const noexcept
Definition: lineshape.h:639
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:644
constexpr Numeric dSdI0() const noexcept
Definition: lineshape.h:635
constexpr Numeric dNdNLTEl() const noexcept
Definition: lineshape.h:646
constexpr Numeric dSdNLTEl() const noexcept
Definition: lineshape.h:638
std::variant< Nostrength, LocalThermodynamicEquilibrium, FullNonLocalThermodynamicEquilibrium, VibrationalTemperaturesNonLocalThermodynamicEquilibrium > Variant
Definition: lineshape.h:629
constexpr Numeric N() const noexcept
Definition: lineshape.h:641
constexpr Numeric dSdT() const noexcept
Definition: lineshape.h:634
constexpr Numeric dNdT() const noexcept
Definition: lineshape.h:642
constexpr Numeric dNdNLTEu() const noexcept
Definition: lineshape.h:645
constexpr Numeric dNdI0() const noexcept
Definition: lineshape.h:643
constexpr Numeric dNdSELFVMR() const noexcept
Definition: lineshape.h:647
constexpr Numeric S() const noexcept
Definition: lineshape.h:633
constexpr bool do_nlte() const noexcept
Definition: lineshape.h:649
constexpr Numeric dSdF0() const noexcept
Definition: lineshape.h:636
IntensityCalculator(const Numeric T, const Numeric QT, const Numeric QT0, const Numeric dQTdT, const Numeric r, const Numeric drdSELFVMR, const Numeric drdT, const EnergyLevelMap &nlte, const Absorption::Lines &band, const Index line_index) noexcept
Definition: lineshape.h:651
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:604
constexpr Numeric dNdf(Numeric f) const noexcept
Definition: lineshape.h:603
constexpr Numeric operator()(Numeric f) noexcept
Definition: lineshape.h:605
std::variant< Nonorm, VanVleckHuber, VanVleckWeisskopf, RosenkranzQuadratic, SimpleFrequencyScaling > Variant
Definition: lineshape.h:598
constexpr Numeric dNdT(Numeric T, Numeric f) const noexcept
Definition: lineshape.h:602
constexpr Normalizer(const Absorption::NormalizationType type, const Numeric F0, const Numeric T) noexcept
Definition: lineshape.h:607
The Vector class.
Definition: matpackI.h:876
Constants of physical expressions as constexpr.
#define ARTS_NOEXCEPT
Definition: debug.h:80
Class to map energy levels.
Constains various line scaling functions.
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
std::complex< Numeric > Complex
constexpr auto pow2(T x) -> decltype(x *x)
power of two
Definition: constants.h:65
char Type type
Computations of line shape derived parameters.
Definition: lineshape.cc:23
constexpr Output mirroredOutput(Output x) noexcept
Output to be used by mirroring calls.
bool good_linear_sparse_f_grid(const Vector &f_grid_dense, const Vector &f_grid_sparse) noexcept
Definition: lineshape.cc:3196
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.
Vector triple_sparse_f_grid(const Vector &f_grid, const Numeric &sparse_df) noexcept
Definition: lineshape.cc:3209
Vector linear_sparse_f_grid(const Vector &f_grid, const Numeric &sparse_df) ARTS_NOEXCEPT
Definition: lineshape.cc:3174
void compute(ComputeData &com, ComputeData &sparse_com, const AbsorptionLines &band, const ArrayOfRetrievalQuantity &jacobian_quantities, const EnergyLevelMap &nlte, const Vector &vmrs, const ArrayOfSpeciesTag &self_tag, const Numeric &self_vmr, const Numeric &isot_ratio, const Numeric &P, const Numeric &T, const Numeric &H, const Numeric &sparse_lim, const bool do_zeeman, const Zeeman::Polarization zeeman_polarization, const Options::LblSpeedup speedup_type) ARTS_NOEXCEPT
Compute the line shape in its entirety.
Definition: lineshape.cc:3116
X3 LineCenter None
Definition: constants.h:576
Polarization
Zeeman polarization selection.
Definition: zeemandata.h:44
constexpr T abs(T x) noexcept
Definition: nonstd.h:13
#define d
#define N
Definition: rng.cc:164
const Vector & f_grid
Definition: lineshape.h:689
ComputeData(const Vector &f, const ArrayOfRetrievalQuantity &jacobian_quantities, const bool nlte) noexcept
Definition: lineshape.h:692
ComplexVector F
Definition: lineshape.h:687
void reset() noexcept
Definition: lineshape.h:700
ComplexMatrix dF
Definition: lineshape.h:688
constexpr Doppler(Numeric F0_noshift, Numeric DC, Numeric dZ) noexcept
Definition: lineshape.h:38
Complex operator()(Numeric f) noexcept
Definition: lineshape.cc:24
constexpr Complex dFdT(const Output &, Numeric T) const noexcept
Definition: lineshape.h:41
static constexpr Complex dFdD0(Numeric) noexcept
Definition: lineshape.h:55
static constexpr Complex dFdVMR(const Output &) noexcept
Definition: lineshape.h:53
constexpr Complex dFdH(Numeric dZ) const noexcept
Definition: lineshape.h:48
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:51
static constexpr Complex dFdDV(Numeric) noexcept
Definition: lineshape.h:54
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:52
constexpr Complex dFdf() const noexcept
Definition: lineshape.h:44
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:57
static constexpr Complex dFdG0(Numeric) noexcept
Definition: lineshape.h:56
static constexpr Complex dFdG2(Numeric) noexcept
Definition: lineshape.h:58
constexpr Complex dFdF0() const noexcept
Definition: lineshape.h:45
static constexpr Numeric dNdI0() noexcept
Definition: lineshape.h:446
constexpr Numeric dSdF0() const noexcept
Definition: lineshape.h:440
constexpr Numeric dNdNLTEl() const noexcept
Definition: lineshape.h:449
constexpr Numeric dSdNLTEl() const noexcept
Definition: lineshape.h:442
constexpr FullNonLocalThermodynamicEquilibrium(Numeric r, Numeric drdSELFVMR, Numeric drdt, Numeric k, Numeric dkdF0, Numeric dkdr1, Numeric dkdr2, Numeric e, Numeric dedF0, Numeric dedr2, Numeric B, Numeric dBdT, Numeric dBdF0) noexcept
Definition: lineshape.h:413
static constexpr bool do_nlte() noexcept
Definition: lineshape.h:452
static constexpr Numeric dSdI0() noexcept
Definition: lineshape.h:439
constexpr Numeric dNdNLTEu() const noexcept
Definition: lineshape.h:448
constexpr Numeric dSdT() const noexcept
Definition: lineshape.h:438
constexpr Numeric dSdSELFVMR() const noexcept
Definition: lineshape.h:443
constexpr Numeric dNdT() const noexcept
Definition: lineshape.h:445
constexpr Numeric dNdSELFVMR() const noexcept
Definition: lineshape.h:450
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:447
constexpr Numeric dSdNLTEu() const noexcept
Definition: lineshape.h:441
constexpr LocalThermodynamicEquilibrium(Numeric I0, Numeric r, Numeric drdSELFVMR, Numeric drdT, Numeric QT0, Numeric QT, Numeric dQTdT, Numeric br, Numeric dbr_dT_rat, Numeric stim, Numeric dstim_dT, Numeric dstim_dF0) noexcept
Definition: lineshape.h:360
constexpr Numeric dSdF0() const noexcept
Definition: lineshape.h:378
static constexpr Numeric dNdSELFVMR() noexcept
Definition: lineshape.h:388
static constexpr Numeric dSdNLTEl() noexcept
Definition: lineshape.h:380
static constexpr Numeric dNdT() noexcept
Definition: lineshape.h:383
constexpr Numeric dSdSELFVMR() const noexcept
Definition: lineshape.h:381
static constexpr Numeric dNdNLTEl() noexcept
Definition: lineshape.h:387
static constexpr Numeric dSdNLTEu() noexcept
Definition: lineshape.h:379
constexpr Numeric dSdT() const noexcept
Definition: lineshape.h:376
static constexpr Numeric dNdI0() noexcept
Definition: lineshape.h:384
constexpr Numeric dSdI0() const noexcept
Definition: lineshape.h:377
static constexpr bool do_nlte() noexcept
Definition: lineshape.h:390
static constexpr Numeric dNdNLTEu() noexcept
Definition: lineshape.h:386
static constexpr Numeric dNdF0() noexcept
Definition: lineshape.h:385
constexpr Complex dFdVMR(const Output &d) const noexcept
Definition: lineshape.h:73
constexpr Complex dFdD0(Numeric d) const noexcept
Definition: lineshape.h:82
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:85
constexpr Complex dFdDV(Numeric d) const noexcept
Definition: lineshape.h:81
constexpr Complex dFdF0() const noexcept
Definition: lineshape.h:80
static constexpr Complex dFdG2(Numeric)
Definition: lineshape.h:86
constexpr Complex dFdG0(Numeric d) const noexcept
Definition: lineshape.h:84
constexpr Complex dFdT(const Output &d, Numeric) const noexcept
Definition: lineshape.h:76
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:87
constexpr Complex dFdf() const noexcept
Definition: lineshape.h:79
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:88
constexpr Lorentz(Numeric F0_noshift, const Output &ls) noexcept
Definition: lineshape.h:70
static constexpr Complex dFdH(Numeric) noexcept
Definition: lineshape.h:83
constexpr Complex operator()(Numeric f) noexcept
Definition: lineshape.h:90
static constexpr Numeric dNdf(Numeric) noexcept
Definition: lineshape.h:247
constexpr Numeric operator()(Numeric) noexcept
Definition: lineshape.h:250
constexpr Nonorm() noexcept=default
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:248
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:20
static constexpr Complex dFdH(Numeric) noexcept
Definition: lineshape.h:18
static constexpr Complex dFdG2(Numeric) noexcept
Definition: lineshape.h:26
static constexpr Complex dFdVMR(const Output &) noexcept
Definition: lineshape.h:21
static constexpr Complex dFdT(const Output &, Numeric) noexcept
Definition: lineshape.h:15
static constexpr Complex F
Definition: lineshape.h:13
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:25
static constexpr Complex dFdf() noexcept
Definition: lineshape.h:16
static constexpr Complex dFdG0(Numeric) noexcept
Definition: lineshape.h:24
static constexpr Complex dFdDV(Numeric) noexcept
Definition: lineshape.h:22
static constexpr Complex dFdD0(Numeric) noexcept
Definition: lineshape.h:23
static constexpr Complex dFdF0() noexcept
Definition: lineshape.h:17
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:19
constexpr Complex operator()(Numeric) const noexcept
Definition: lineshape.h:28
static constexpr Numeric dNdT() noexcept
Definition: lineshape.h:341
static constexpr Numeric dNdNLTEu() noexcept
Definition: lineshape.h:344
static constexpr Numeric dSdNLTEu() noexcept
Definition: lineshape.h:337
static constexpr Numeric dSdI0() noexcept
Definition: lineshape.h:335
static constexpr Numeric dNdF0() noexcept
Definition: lineshape.h:343
static constexpr Numeric dNdI0() noexcept
Definition: lineshape.h:342
static constexpr Numeric dNdSELFVMR() noexcept
Definition: lineshape.h:346
static constexpr Numeric dNdNLTEl() noexcept
Definition: lineshape.h:345
static constexpr Numeric dSdT() noexcept
Definition: lineshape.h:334
static constexpr Numeric dSdNLTEl() noexcept
Definition: lineshape.h:338
static constexpr Numeric dSdSELFVMR() noexcept
Definition: lineshape.h:339
static constexpr bool do_nlte() noexcept
Definition: lineshape.h:348
static constexpr Numeric dSdF0() noexcept
Definition: lineshape.h:336
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:323
SimpleFrequencyScaling(Numeric F0_, Numeric T_) noexcept
Definition: lineshape.h:316
constexpr SimpleFrequencyScaling(Numeric exp, Numeric expm1, Numeric F0_, Numeric T_)
Definition: lineshape.h:313
Complex dFdD2(Numeric dD2dD2) const noexcept
Definition: lineshape.cc:141
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:169
Complex dFdD0(Numeric dD0dD0) const noexcept
Definition: lineshape.cc:92
Complex dFdH(Numeric dZ) const noexcept
Definition: lineshape.cc:217
void update_calcs() noexcept
Definition: lineshape.cc:428
Complex dFdG2(Numeric dG2dG2) const noexcept
Definition: lineshape.cc:186
Complex dFdT(const Output &d, Numeric T) const noexcept
Definition: lineshape.cc:307
Complex dFdf() const noexcept
Definition: lineshape.cc:47
Complex dFdF0() const noexcept
Definition: lineshape.cc:64
CalcType init(const Complex c2) const noexcept
Definition: lineshape.cc:416
Complex dFdG0(Numeric dG0dG0) const noexcept
Definition: lineshape.cc:123
SpeedDependentVoigt(Numeric F0_noshift, const Output &ls, Numeric GD_div_F0, Numeric dZ) noexcept
Definition: lineshape.cc:37
Complex dFdVMR(const Output &d) const noexcept
Definition: lineshape.cc:248
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:170
static constexpr Complex dFdDV(Numeric) noexcept
Definition: lineshape.h:171
Complex operator()(Numeric f) noexcept
Definition: lineshape.cc:403
constexpr Numeric dNdf(Numeric f) const noexcept
Definition: lineshape.h:278
static constexpr Numeric dNdT(Numeric, Numeric) noexcept
Definition: lineshape.h:277
constexpr VanVleckWeisskopf(Numeric F0) noexcept
Definition: lineshape.h:275
constexpr Numeric operator()(Numeric f) noexcept
Definition: lineshape.h:283
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:281
constexpr VibrationalTemperaturesNonLocalThermodynamicEquilibrium(Numeric I0, Numeric QT0, Numeric QT, Numeric dQTdT, Numeric r, Numeric drdSELFVMR, Numeric drdT, Numeric K1, Numeric dK1dT, Numeric K2, Numeric dK2dT, Numeric dK2dF0, Numeric K3, Numeric dK3dT, Numeric dK3dF0, Numeric dK3dTl, Numeric dK3dTu, Numeric K4, Numeric dK4dT, Numeric dK4dTu, Numeric B, Numeric dBdT, Numeric dBdF0) noexcept
Definition: lineshape.h:475
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:125
constexpr Voigt(Numeric F0_noshift, const Output &ls, Numeric DC, Numeric dZ) noexcept
Definition: lineshape.h:105
constexpr Complex dFdD0(Numeric d) const noexcept
Definition: lineshape.h:112
constexpr Complex dFdF0() const noexcept
Definition: lineshape.h:110
constexpr Complex dFdH(Numeric dZ) const noexcept
Definition: lineshape.h:114
constexpr Complex dFdT(const Output &d, Numeric T) const noexcept
Definition: lineshape.h:118
constexpr Complex dFdf() const noexcept
Definition: lineshape.h:109
bool OK() const noexcept
Definition: lineshape.h:130
static constexpr Complex dFdG2(Numeric)
Definition: lineshape.h:126
constexpr Complex dFdVMR(const Output &d) const noexcept
Definition: lineshape.h:115
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:124
constexpr Complex dFdG0(Numeric d) const noexcept
Definition: lineshape.h:113
constexpr Complex dFdDV(Numeric d) const noexcept
Definition: lineshape.h:111
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:123
Complex operator()(Numeric f) noexcept
Definition: lineshape.cc:30