ARTS 2.5.11 (git: 6827797f)
lineshape.h
Go to the documentation of this file.
1#ifndef lineshapes_h
2#define lineshapes_h
3
4#include <string_view>
5#include <variant>
6
7#include "arts_conversions.h"
8#include "energylevelmap.h"
9#include "linescaling.h"
10#include "nonstd.h"
11#include "species.h"
12
13namespace LineShape {
14struct Noshape {
15 static constexpr std::string_view name = "Noshape";
16
17 static constexpr Complex F = Complex(0, 0);
18
19 static constexpr Complex dFdT(const Output &, Numeric) noexcept { return 0; }
20 static constexpr Complex dFdf() noexcept { return 0; }
21 static constexpr Complex dFdF0() noexcept { return 0; }
22 static constexpr Complex dFdH(Numeric) noexcept { return 0; }
23 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
24 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
25 static constexpr Complex dFdVMR(const Output &) noexcept { return 0; }
26 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
27 static constexpr Complex dFdD0(Numeric) noexcept { return 0; }
28 static constexpr Complex dFdG0(Numeric) noexcept { return 0; }
29 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
30 static constexpr Complex dFdG2(Numeric) noexcept { return 0; }
31
32 constexpr Complex operator()(Numeric) const noexcept { return F; }
33}; // Noshape
34
35struct Doppler {
36 static constexpr std::string_view name = "Doppler";
37
38 Complex F{};
39 Numeric x{};
40
41 Numeric mF0;
42 Numeric invGD;
43
44 constexpr Doppler(Numeric F0_noshift, Numeric DC, Numeric dZ) noexcept
45 : mF0(F0_noshift + dZ), invGD(1.0 / nonstd::abs(DC * mF0)) {}
46
47 [[nodiscard]] constexpr Complex dFdT(const Output &,
48 Numeric T) const noexcept {
49 return F * (2 * Math::pow2(x) - 1) / (2 * T);
50 }
51 [[nodiscard]] constexpr Complex dFdf() const noexcept {
52 return -2 * invGD * F * x;
53 }
54 [[nodiscard]] constexpr Complex dFdF0() const noexcept {
55 return F * (2 * x * (invGD * mF0 + x) - 1) / mF0;
56 }
57 [[nodiscard]] constexpr Complex dFdH(Numeric dZ) const noexcept {
58 return dZ * (F * (2 * x * (invGD * mF0 + x) - 1) / mF0);
59 }
60 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
61 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
62 static constexpr Complex dFdVMR(const Output &) noexcept { return 0; }
63 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
64 static constexpr Complex dFdD0(Numeric) noexcept { return 0; }
65 static constexpr Complex dFdG0(Numeric) noexcept { return 0; }
66 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
67 static constexpr Complex dFdG2(Numeric) noexcept { return 0; }
68
69 Complex operator()(Numeric f) noexcept;
70}; // Doppler
71
72struct Lorentz {
73 static constexpr std::string_view name = "Lorentz";
74
75 Complex F;
76 Complex dF;
77
78 Numeric mF0;
79 Numeric G0;
80
81 constexpr Lorentz(Numeric F0_noshift, const Output &ls) noexcept
82 : mF0(F0_noshift + ls.D0 + ls.DV), G0(ls.G0) {}
83
84 [[nodiscard]] constexpr Complex dFdVMR(const Output &d) const noexcept {
85 return Complex(d.G0, d.D0 + d.DV) * dF;
86 }
87 [[nodiscard]] constexpr Complex dFdT(const Output &d,
88 Numeric) const noexcept {
89 return dFdVMR(d);
90 }
91 [[nodiscard]] [[nodiscard]] constexpr Complex dFdf() const noexcept {
92 return Complex(0, -1) * dF;
93 }
94 [[nodiscard]] constexpr Complex dFdF0() const noexcept {
95 return Complex(0, 1) * dF;
96 }
97 [[nodiscard]] constexpr Complex dFdDV(Numeric d) const noexcept {
98 return d * dFdF0();
99 }
100 [[nodiscard]] constexpr Complex dFdD0(Numeric d) const noexcept {
101 return d * dFdF0();
102 }
103 static constexpr Complex dFdH(Numeric) noexcept { return 0; }
104 [[nodiscard]] constexpr Complex dFdG0(Numeric d) const noexcept {
105 return d * dF;
106 }
107 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
108 static constexpr Complex dFdG2(Numeric) { return 0; }
109 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
110 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
111
112 constexpr Complex operator()(Numeric f) noexcept {
113 F = Constant::inv_pi / Complex(G0, mF0 - f);
115 return F;
116 }
117}; // Lorentz
118
119struct Voigt {
120 static constexpr std::string_view name = "Voigt";
121
122 Complex F;
123 Complex dF;
124
125 Numeric mF0;
126 Numeric invGD;
127 Complex z;
128
129 constexpr Voigt(Numeric F0_noshift,
130 const Output &ls,
131 Numeric DC,
132 Numeric dZ) noexcept
133 : F(),
134 dF(),
135 mF0(F0_noshift + dZ + ls.D0 + ls.DV),
136 invGD(1.0 / nonstd::abs(DC * mF0)),
137 z(invGD * Complex(-mF0, ls.G0)) {}
138
139 [[nodiscard]] constexpr Complex dFdf() const noexcept { return dF; }
140 [[nodiscard]] constexpr Complex dFdF0() const noexcept { return -dF; }
141 [[nodiscard]] constexpr Complex dFdDV(Numeric d) const noexcept {
142 return -d * dF;
143 }
144 [[nodiscard]] constexpr Complex dFdD0(Numeric d) const noexcept {
145 return -d * dF;
146 }
147 [[nodiscard]] constexpr Complex dFdG0(Numeric d) const noexcept {
148 return Complex(0, d) * dF;
149 }
150 [[nodiscard]] constexpr Complex dFdH(Numeric dZ) const noexcept {
151 return -dZ * dF;
152 }
153 [[nodiscard]] constexpr Complex dFdVMR(const Output &d) const noexcept {
154 return Complex(-d.D0 - d.DV, d.G0) * dF;
155 }
156 [[nodiscard]] constexpr Complex dFdT(const Output &d,
157 Numeric T) const noexcept {
158 return -(F * invGD + dF * z) * (2 * T * (d.D0 + d.DV) + mF0) /
159 (2 * T * invGD * mF0) +
160 Complex(-d.D0 - d.DV, d.G0) * dF;
161 }
162 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
163 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
164 static constexpr Complex dFdD2(Numeric) noexcept { return 0; }
165 static constexpr Complex dFdG2(Numeric) { return 0; }
166
167 Complex operator()(Numeric f) noexcept;
168
169 [[nodiscard]] bool OK() const noexcept { return invGD > 0; }
170}; // Voigt
171
173 static constexpr std::string_view name = "SpeedDependentVoigt";
174
175 enum struct CalcType : char {
176 Voigt,
180 Full
181 };
182
183 Complex F;
184
185 Numeric mF0;
186 Numeric invGD;
187 Complex invc2;
188 Complex dx;
189 Complex x;
190 Complex sqrty;
192 Complex sq;
193 Complex w1;
194 Complex w2;
195 Complex dw1;
196 Complex dw2;
197
198 SpeedDependentVoigt(Numeric F0_noshift,
199 const Output &ls,
200 Numeric GD_div_F0,
201 Numeric dZ) noexcept;
202
203 [[nodiscard]] Complex dFdf() const noexcept;
204 [[nodiscard]] Complex dFdF0() const noexcept;
205 [[nodiscard]] Complex dFdD0(Numeric dD0dD0) const noexcept;
206 [[nodiscard]] Complex dFdG0(Numeric dG0dG0) const noexcept;
207 [[nodiscard]] Complex dFdD2(Numeric dD2dD2) const noexcept;
208 [[nodiscard]] Complex dFdG2(Numeric dG2dG2) const noexcept;
209 [[nodiscard]] Complex dFdH(Numeric dZ) const noexcept;
210 [[nodiscard]] Complex dFdVMR(const Output &d) const noexcept;
211 [[nodiscard]] Complex dFdT(const Output &d, Numeric T) const noexcept;
212 static constexpr Complex dFdETA(Numeric) noexcept { return 0; }
213 static constexpr Complex dFdFVC(Numeric) noexcept { return 0; }
214 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
215
216 Complex operator()(Numeric f) noexcept;
217
218 [[nodiscard]] CalcType init(const Complex c2) const noexcept;
219 void update_calcs() noexcept;
220 void calc() noexcept;
221}; // SpeedDependentVoigt
222
224 static constexpr std::string_view name = "HartmannTran";
225
226 enum struct CalcType : char {
227 Noc2tLowZ,
228 Noc2tHighZ,
232 Full
233 };
234
235 Complex F;
236
237 Numeric G0;
238 Numeric D0;
239 Numeric G2;
240 Numeric D2;
241 Numeric FVC;
242 Numeric ETA;
243 Numeric mF0;
244 Numeric invGD;
245 Complex deltax;
246 Complex sqrty;
247
249
250 Complex x;
251 Complex sqrtxy;
252 Complex sqrtx;
253 Complex z1;
254 Complex z2;
255 Complex w1;
256 Complex w2;
257 Complex A;
258 Complex B;
259 Complex K;
260 Complex dw1;
261 Complex dw2;
262
263 HartmannTran(Numeric F0_noshift,
264 const Output &ls,
265 Numeric GD_div_F0,
266 Numeric dZ) noexcept;
267
268 [[nodiscard]] Complex dFdf() const noexcept;
269 [[nodiscard]] Complex dFdF0() const noexcept;
270 [[nodiscard]] Complex dFdD0(Numeric dD0) const noexcept;
271 [[nodiscard]] Complex dFdG0(Numeric dG0) const noexcept;
272 [[nodiscard]] Complex dFdD2(Numeric dD2) const noexcept;
273 [[nodiscard]] Complex dFdG2(Numeric dG2) const noexcept;
274 [[nodiscard]] Complex dFdFVC(Numeric dFVC) const noexcept;
275 [[nodiscard]] Complex dFdETA(Numeric dETA) const noexcept;
276 [[nodiscard]] Complex dFdH(Numeric dZ) const noexcept;
277 [[nodiscard]] Complex dFdVMR(const Output &d) const noexcept;
278 [[nodiscard]] Complex dFdT(const Output &d, Numeric T) const noexcept;
279 static constexpr Complex dFdDV(Numeric) noexcept { return 0; }
280
281 Complex operator()(Numeric f) noexcept;
282
283 [[nodiscard]] CalcType init(const Complex c2t) const noexcept;
284 void update_calcs() noexcept;
285 void calc() noexcept;
286}; // HartmannTran
287
288struct Nonorm {
289 static constexpr Numeric N = 1.0;
290
291 constexpr Nonorm() noexcept = default;
292
293 static constexpr Numeric dNdT(Numeric, Numeric) noexcept { return 0; }
294 static constexpr Numeric dNdf(Numeric) noexcept { return 0; }
295 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return 0; }
296
297 constexpr Numeric operator()(Numeric) noexcept { return N; }
298}; // Nonorm
299
301 Numeric N;
302
303 Numeric c1;
304 Numeric tanh_c1f0;
305 Numeric inv_denom;
306 Numeric tanh_c1f;
307
308 VanVleckHuber(Numeric F0, Numeric T) noexcept;
309
310 [[nodiscard]] Numeric dNdT(Numeric T, Numeric f) const noexcept;
311 [[nodiscard]] Numeric dNdf(Numeric f) const noexcept;
312 [[nodiscard]] Numeric dNdF0() const noexcept;
313
314 Numeric operator()(Numeric f) noexcept;
315}; // VanVleckHuber
316
318 Numeric N{1};
319
320 Numeric invF0;
321
322 constexpr VanVleckWeisskopf(Numeric F0) noexcept : invF0(1.0 / F0) {}
323
324 static constexpr Numeric dNdT(Numeric, Numeric) noexcept { return 0; }
325 [[nodiscard]] constexpr Numeric dNdf(Numeric f) const noexcept {
326 return 2.0 * f * Math::pow2(invF0);
327 }
328 [[nodiscard]] constexpr Numeric dNdF0() const noexcept {
329 return -2.0 * N * invF0;
330 }
331
332 constexpr Numeric operator()(Numeric f) noexcept {
333 N = Math::pow2(f * invF0);
334 return N;
335 }
336}; // VanVleckWeisskopf
337
339 Numeric N;
340
341 Numeric fac;
342 Numeric dfacdT;
343 Numeric dfacdF0;
344
345 RosenkranzQuadratic(Numeric F0, Numeric T) noexcept;
346
347 [[nodiscard]] Numeric dNdT(Numeric, Numeric f) const noexcept;
348 [[nodiscard]] Numeric dNdf(Numeric f) const noexcept;
349 [[nodiscard]] Numeric dNdF0() const noexcept;
350
351 Numeric operator()(Numeric f) noexcept;
352}; // RosenkranzQuadratic
353
355 Numeric N;
356
357 Numeric T;
358 Numeric F0;
359 Numeric expF0;
360 Numeric expm1F0;
361
362 constexpr SimpleFrequencyScaling(Numeric exp,
363 Numeric expm1,
364 Numeric F0_,
365 Numeric T_)
366 : N(1.0), T(T_), F0(F0_), expF0(exp), expm1F0(expm1) {}
367
368 SimpleFrequencyScaling(Numeric F0_, Numeric T_) noexcept
370 std::exp(-(Constant::h * F0_) / (Constant::k * T_)),
371 std::expm1(-(Constant::h * F0_) / (Constant::k * T_)),
372 F0_,
373 T_) {}
374
375 [[nodiscard]] Numeric dNdT(Numeric t_ [[maybe_unused]],
376 Numeric f) const ARTS_NOEXCEPT;
377 [[nodiscard]] Numeric dNdf(Numeric f) const noexcept;
378 [[nodiscard]] constexpr Numeric dNdF0() const noexcept {
379 return -N / F0 + N * Constant::h * expF0 / (Constant::k * T * expm1F0);
380 }
381
382 Numeric operator()(Numeric f) noexcept;
383}; // SimpleFrequencyScaling
384
386 static constexpr Numeric S = 1.0;
387 static constexpr Numeric N = 0.0;
388
389 static constexpr Numeric dSdT() noexcept { return 0; }
390 static constexpr Numeric dSdI0() noexcept { return 0; }
391 static constexpr Numeric dSdF0() noexcept { return 0; }
392 static constexpr Numeric dSdNLTEu() noexcept { return 0; }
393 static constexpr Numeric dSdNLTEl() noexcept { return 0; }
394 static constexpr Numeric dSdSELFVMR() noexcept { return 0; }
395
396 static constexpr Numeric dNdT() noexcept { return 0; }
397 static constexpr Numeric dNdI0() noexcept { return 0; }
398 static constexpr Numeric dNdF0() noexcept { return 0; }
399 static constexpr Numeric dNdNLTEu() noexcept { return 0; }
400 static constexpr Numeric dNdNLTEl() noexcept { return 0; }
401 static constexpr Numeric dNdSELFVMR() noexcept { return 0; }
402
403 static constexpr bool do_nlte() noexcept { return false; }
404}; // Nostrength
405
407 Numeric S;
408 static constexpr Numeric N = 0.0;
409
410 Numeric dSdI0val;
411 Numeric dSdTval;
412 Numeric dSdF0val;
414
415 constexpr LocalThermodynamicEquilibrium(Numeric I0,
416 Numeric r,
417 Numeric drdSELFVMR,
418 Numeric drdT,
419 Numeric QT0,
420 Numeric QT,
421 Numeric dQTdT,
422 Numeric br,
423 Numeric dbr_dT_rat,
424 Numeric stim,
425 Numeric dstim_dT,
426 Numeric dstim_dF0) noexcept
427 : S(),
428 dSdI0val(r * br * stim * QT0 / QT),
429 dSdTval(I0 * (r * br * dstim_dT * QT0 / QT +
430 dSdI0val * (dbr_dT_rat - dQTdT / QT) +
431 drdT * br * stim * QT0 / QT)),
432 dSdF0val(r * I0 * br * dstim_dF0 * QT0 / QT),
433 dSdSELFVMRval(drdSELFVMR * I0 * br * stim * QT0 / QT) {
434 S = I0 * dSdI0val;
435 }
436
438 Numeric T0,
439 Numeric T,
440 Numeric F0,
441 Numeric E0,
442 Numeric QT,
443 Numeric QT0,
444 Numeric dQTdT,
445 Numeric r,
446 Numeric drdSELFVMR,
447 Numeric drdT) noexcept;
448
449 [[nodiscard]] constexpr Numeric dSdT() const noexcept { return dSdTval; }
450 [[nodiscard]] constexpr Numeric dSdI0() const noexcept { return dSdI0val; }
451 [[nodiscard]] constexpr Numeric dSdF0() const noexcept { return dSdF0val; }
452 static constexpr Numeric dSdNLTEu() noexcept { return 0; }
453 static constexpr Numeric dSdNLTEl() noexcept { return 0; }
454 [[nodiscard]] constexpr Numeric dSdSELFVMR() const noexcept {
455 return dSdSELFVMRval;
456 }
457
458 static constexpr Numeric dNdT() noexcept { return 0; }
459 static constexpr Numeric dNdI0() noexcept { return 0; }
460 static constexpr Numeric dNdF0() noexcept { return 0; }
461 static constexpr Numeric dNdNLTEu() noexcept { return 0; }
462 static constexpr Numeric dNdNLTEl() noexcept { return 0; }
463 static constexpr Numeric dNdSELFVMR() noexcept { return 0; }
464
465 static constexpr bool do_nlte() noexcept { return false; }
466}; // LocalThermodynamicEquilibrium
467
469 Numeric S;
470 Numeric N;
471
472 static constexpr Numeric c0 = 2.0 * Constant::h / Math::pow2(Constant::c);
473 static constexpr Numeric c1 = Constant::h / (4 * Constant::pi);
474
475 Numeric dSdTval;
476 Numeric dNdTval;
477
478 Numeric dSdF0val;
479 Numeric dNdF0val;
480
481 Numeric dSdr1;
482 Numeric dSdr2;
483 Numeric dNdr2;
484
487
489 Numeric drdSELFVMR,
490 Numeric drdt,
491 Numeric k,
492 Numeric dkdF0,
493 Numeric dkdr1,
494 Numeric dkdr2,
495 Numeric e,
496 Numeric dedF0,
497 Numeric dedr2,
498 Numeric B,
499 Numeric dBdT,
500 Numeric dBdF0) noexcept
501 : S(),
502 N(),
503 dSdTval(drdt * k),
504 dNdTval(drdt * (e - k * B) - r * k * dBdT),
505 dSdF0val(r * dkdF0),
506 dNdF0val(r * (dedF0 - dkdF0 * B - k * dBdF0)),
507 dSdr1(r * dkdr1),
508 dSdr2(r * dkdr2),
509 dNdr2(r * (dedr2 - dkdr2 * B)),
510 dSdSELFVMRval(drdSELFVMR * k),
511 dNdSELFVMRval(drdSELFVMR * (e - k * B)) {
512 S = r * k;
513 N = r * (e - k * B);
514 }
515
517 Numeric A21,
518 Numeric T,
519 Numeric g1,
520 Numeric g2,
521 Numeric r1,
522 Numeric r2,
523 Numeric r,
524 Numeric drdSELFVMR,
525 Numeric drdT) noexcept;
526
527 [[nodiscard]] constexpr Numeric dSdT() const noexcept { return 0; }
528 static constexpr Numeric dSdI0() noexcept { return 0; }
529 [[nodiscard]] constexpr Numeric dSdF0() const noexcept { return dSdF0val; }
530 [[nodiscard]] constexpr Numeric dSdNLTEu() const noexcept { return dSdr1; }
531 [[nodiscard]] constexpr Numeric dSdNLTEl() const noexcept { return dSdr2; }
532 [[nodiscard]] constexpr Numeric dSdSELFVMR() const noexcept {
533 return dSdSELFVMRval;
534 }
535
536 [[nodiscard]] constexpr Numeric dNdT() const noexcept { return dNdTval; }
537 static constexpr Numeric dNdI0() noexcept { return 0; }
538 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return dNdF0val; }
539 [[nodiscard]] constexpr Numeric dNdNLTEu() const noexcept { return -dSdr1; }
540 [[nodiscard]] constexpr Numeric dNdNLTEl() const noexcept { return dNdr2; }
541 [[nodiscard]] constexpr Numeric dNdSELFVMR() const noexcept {
542 return dNdSELFVMRval;
543 }
544
545 static constexpr bool do_nlte() noexcept { return true; }
546}; // FullNonLocalThermodynamicEquilibrium
547
549 Numeric S;
550 Numeric N;
551
552 Numeric dSdI0val;
553 Numeric dNdI0val;
554
555 Numeric dSdTval;
556 Numeric dNdTval;
557
558 Numeric dSdF0val;
559 Numeric dNdF0val;
560
561 Numeric dSdTl;
562 Numeric dSdTu;
563 Numeric dNdTu;
564
567
569 Numeric I0,
570 Numeric QT0,
571 Numeric QT,
572 Numeric dQTdT,
573 Numeric r,
574 Numeric drdSELFVMR,
575 Numeric drdT,
576 Numeric K1,
577 Numeric dK1dT,
578 Numeric K2,
579 Numeric dK2dT,
580 Numeric dK2dF0,
581 Numeric K3,
582 Numeric dK3dT,
583 Numeric dK3dF0,
584 Numeric dK3dTl,
585 Numeric dK3dTu,
586 Numeric K4,
587 Numeric dK4dT,
588 Numeric dK4dTu,
589 Numeric B,
590 Numeric dBdT,
591 Numeric dBdF0) noexcept
592 : S(),
593 N(),
594 dSdI0val(r * QT0 / QT * K1 * K2 * K3),
595 dNdI0val(B * r * QT0 / QT * K1 * K2 * (K4 - K3)),
596 dSdTval(I0 * (drdT * QT0 / QT * K1 * K2 * K3 -
597 r * dQTdT * QT0 / Math::pow2(QT) * K1 * K2 * K3 +
598 r * QT0 / QT * dK1dT * K2 * K3 +
599 r * QT0 / QT * K1 * dK2dT * K3 +
600 r * QT0 / QT * K1 * K2 * dK3dT)),
601 dNdTval(I0 * (dBdT * r * QT0 / QT * K1 * K2 * (K4 - K3) +
602 B * drdT * QT0 / QT * K1 * K2 * (K4 - K3) -
603 B * r * dQTdT * QT0 / Math::pow2(QT) * K1 * K2 *
604 (K4 - K3) +
605 B * r * QT0 / QT * dK1dT * K2 * (K4 - K3) +
606 B * r * QT0 / QT * K1 * dK2dT * (K4 - K3) +
607 B * r * QT0 / QT * K1 * K2 * (dK4dT - dK3dT))),
608 dSdF0val(I0 * (r * QT0 / QT * K1 * dK2dF0 * K3 +
609 r * QT0 / QT * K1 * K2 * dK3dF0)),
610 dNdF0val(I0 * (dBdF0 * r * QT0 / QT * K1 * K2 * (K4 - K3) +
611 B * r * QT0 / QT * K1 * dK2dF0 * (K4 - K3) -
612 B * r * QT0 / QT * K1 * K2 * dK3dF0)),
613 dSdTl(I0 * r * QT0 / QT * K1 * K2 * dK3dTl),
614 dSdTu(I0 * r * QT0 / QT * K1 * K2 * dK3dTu),
615 dNdTu(B * r * QT0 / QT * K1 * K2 * (dK4dTu - dK3dTu)),
616 dSdSELFVMRval(I0 * drdSELFVMR * QT0 / QT * K1 * K2 * K3),
617 dNdSELFVMRval(I0 * B * drdSELFVMR * QT0 / QT * K1 * K2 * (K4 - K3)) {
618 S = I0 * dSdI0val;
619 N = I0 * dNdI0val;
620 }
621
623 Numeric I0,
624 Numeric T0,
625 Numeric T,
626 Numeric Tl,
627 Numeric Tu,
628 Numeric F0,
629 Numeric E0,
630 Numeric Evl,
631 Numeric Evu,
632 Numeric QT,
633 Numeric QT0,
634 Numeric dQTdT,
635 Numeric r,
636 Numeric drdSELFVMR,
637 Numeric drdT) noexcept;
638
639 [[nodiscard]] constexpr Numeric dSdT() const noexcept { return dSdTval; }
640 [[nodiscard]] constexpr Numeric dSdI0() const noexcept { return dSdI0val; }
641 [[nodiscard]] constexpr Numeric dSdF0() const noexcept { return dSdF0val; }
642 [[nodiscard]] constexpr Numeric dSdNLTEu() const noexcept { return dSdTl; }
643 [[nodiscard]] constexpr Numeric dSdNLTEl() const noexcept { return dSdTu; }
644 [[nodiscard]] constexpr Numeric dSdSELFVMR() const noexcept {
645 return dSdSELFVMRval;
646 }
647
648 [[nodiscard]] constexpr Numeric dNdT() const noexcept { return dNdTval; }
649 [[nodiscard]] constexpr Numeric dNdI0() const noexcept { return dNdI0val; }
650 [[nodiscard]] constexpr Numeric dNdF0() const noexcept { return dNdF0val; }
651 [[nodiscard]] constexpr Numeric dNdNLTEu() const noexcept { return -dSdTl; }
652 [[nodiscard]] constexpr Numeric dNdNLTEl() const noexcept { return dNdTu; }
653 [[nodiscard]] constexpr Numeric dNdSELFVMR() const noexcept {
654 return dNdSELFVMRval;
655 }
656
657 static constexpr bool do_nlte() noexcept { return true; }
658}; // VibrationalTemperaturesNonLocalThermodynamicEquilibrium
659
662 using Variant = std::variant<Noshape,
663 Doppler,
664 Lorentz,
665 Voigt,
669
670 public:
671 [[nodiscard]] Complex dFdT(const Output &dXdT, Numeric T) const noexcept;
672
673 [[nodiscard]] Complex dFdf() const noexcept;
674
675 [[nodiscard]] Complex dFdF0() const noexcept;
676
677 [[nodiscard]] Complex dFdH(Numeric dfdH) const noexcept;
678
679 [[nodiscard]] Complex dFdVMR(const Output &dXdVMR) const noexcept;
680
681 [[nodiscard]] Complex dFdFVC(Numeric d) const noexcept;
682
683 [[nodiscard]] Complex dFdETA(Numeric d) const noexcept;
684
685 [[nodiscard]] Complex dFdDV(Numeric d) const noexcept;
686
687 [[nodiscard]] Complex dFdD0(Numeric d) const noexcept;
688
689 [[nodiscard]] Complex dFdG0(Numeric d) const noexcept;
690
691 [[nodiscard]] Complex dFdD2(Numeric d) const noexcept;
692
693 [[nodiscard]] Complex dFdG2(Numeric d) const noexcept;
694
695 [[nodiscard]] Complex F() const noexcept;
696
698 [[nodiscard]] constexpr std::string_view name() const noexcept {
699 return std::visit([](auto &&S) { return S.name; }, ls);
700 }
701
703 Complex operator()(Numeric f) noexcept;
704
705 Calculator(const Type type,
706 const Numeric F0,
707 const Output &X,
708 const Numeric DC,
709 const Numeric DZ,
710 bool manually_mirrored) noexcept;
711
712 Calculator(const Absorption::MirroringType mirror,
713 const Type type,
714 const Numeric F0,
715 const Output &X,
716 const Numeric DC,
717 const Numeric DZ);
718}; // Calculator
719
721 using Variant = std::variant<Nonorm,
727
728 public:
729 [[nodiscard]] Numeric dNdT(Numeric T, Numeric f) const noexcept;
730
731 [[nodiscard]] Numeric dNdf(Numeric f) const noexcept;
732
733 [[nodiscard]] Numeric dNdF0() const noexcept;
734
735 [[nodiscard]] Numeric operator()(Numeric f) noexcept;
736
737 Normalizer(const Absorption::NormalizationType type,
738 const Numeric F0,
739 const Numeric T) noexcept;
740}; // Normalizer
741
744 using Variant =
745 std::variant<Nostrength,
750
751 Numeric scale{1.0};
752 Species::Species self_species{Species::Species::Bath};
753 Species::Species scaling_species{Species::Species::FINAL};
754
755 public:
757 [[nodiscard]] Numeric S() const noexcept;
758
760 [[nodiscard]] Numeric dSdT() const noexcept;
761
763 [[nodiscard]] Numeric dSdI0() const noexcept;
764
766 [[nodiscard]] Numeric dSdF0() const noexcept;
767
769 [[nodiscard]] Numeric dSdNLTEu() const noexcept;
770
772 [[nodiscard]] Numeric dSdNLTEl() const noexcept;
773
775 [[nodiscard]] Numeric dSdSELFVMR() const noexcept;
776
778 [[nodiscard]] Numeric dSdOTHERVMR_if() const noexcept;
779
781 [[nodiscard]] Numeric N() const noexcept;
782
784 [[nodiscard]] Numeric dNdT() const noexcept;
785
787 [[nodiscard]] Numeric dNdI0() const noexcept;
788
790 [[nodiscard]] Numeric dNdF0() const noexcept;
791
793 [[nodiscard]] Numeric dNdNLTEu() const noexcept;
794
796 [[nodiscard]] Numeric dNdNLTEl() const noexcept;
797
799 [[nodiscard]] Numeric dNdSELFVMR() const noexcept;
800
802 [[nodiscard]] Numeric dNdOTHERVMR_if() const noexcept;
803
805 [[nodiscard]] constexpr bool do_nlte() const noexcept {
806 return std::visit([](auto &&S) { return S.do_nlte(); }, ls_str);
807 }
808
809 [[nodiscard]] Species::Species scaler() const noexcept {
810 return scaling_species;
811 }
812
813 IntensityCalculator(const Numeric T,
814 const Numeric QT,
815 const Numeric QT0,
816 const Numeric dQTdT,
817 const Numeric r,
818 const Numeric drdSELFVMR,
819 const Numeric drdT,
820 const EnergyLevelMap &nlte,
821 const Absorption::Lines &band,
822 const Index line_index) noexcept;
823
835 IntensityCalculator &adaptive_scaling(Numeric x, Species::Species self,
836 Species::Species other) noexcept;
837}; // IntensityCalculator
838
841 ComplexVector F, N;
842 ComplexMatrix dF, dN;
843 const Vector &f_grid;
844 const bool do_nlte;
845
846 ComputeData(const Vector &f,
847 const ArrayOfRetrievalQuantity &jacobian_quantities,
848 const bool nlte) noexcept
849 : F(f.nelem(), 0),
850 N(nlte ? f.nelem() : 0, 0),
851 dF(f.nelem(), jacobian_quantities.nelem(), 0),
852 dN(nlte ? f.nelem() : 0, nlte ? jacobian_quantities.nelem() : 0, 0),
853 f_grid(f),
854 do_nlte(nlte) {}
855
856 void reset() noexcept {
857 F = 0;
858 N = 0;
859 dF = 0;
860 dN = 0;
861 }
862
867 void interp_add_even(const ComputeData &sparse) ARTS_NOEXCEPT;
868
873 void interp_add_triplequad(const ComputeData &sparse) ARTS_NOEXCEPT;
874
877 const Index nf = f_grid.nelem();
878 for (Index i = 0; i < nf; i++) {
879 if (F[i].real() < 0) {
880 F[i] = 0;
881 dF(i, joker) = 0;
882 if (do_nlte) {
883 N[i] = 0;
884 dN(i, joker) = 0;
885 }
886 }
887 }
888 }
889
892 F += other.F;
893 N += other.N;
894 dF += other.dF;
895 dN += other.dN;
896 return *this;
897 }
898};
899
939void compute(ComputeData &com,
940 ComputeData &sparse_com,
941 const AbsorptionLines &band,
942 const ArrayOfRetrievalQuantity &jacobian_quantities,
943 const EnergyLevelMap &rtp_nlte,
944 const Vector &vmrs,
945 const ArrayOfSpeciesTag &self_tag,
946 const Numeric &self_vmr,
947 const Numeric &isot_ratio,
948 const Numeric &rtp_pressure,
949 const Numeric &rtp_temperature,
950 const Numeric &H,
951 const Numeric &sparse_lim,
952 const Zeeman::Polarization zeeman_polarization,
953 const Options::LblSpeedup speedup_type,
954 const bool robust) ARTS_NOEXCEPT;
955
956Vector linear_sparse_f_grid(const Vector &f_grid,
957 const Numeric &sparse_df) ARTS_NOEXCEPT;
958
959bool good_linear_sparse_f_grid(const Vector &f_grid_dense,
960 const Vector &f_grid_sparse) noexcept;
961
962Vector triple_sparse_f_grid(const Vector &f_grid,
963 const Numeric &sparse_df) noexcept;
964
965} // namespace LineShape
966
967#endif // lineshapes_h
Common ARTS conversions.
This can be used to make arrays out of anything.
Definition: array.h:31
Line shape calculator.
Definition: lineshape.h:661
std::variant< Noshape, Doppler, Lorentz, Voigt, SpeedDependentVoigt, HartmannTran > Variant
Definition: lineshape.h:667
Class encapsulating all supported types of intensity calculations of individual absorption lines.
Definition: lineshape.h:743
std::variant< Nostrength, LocalThermodynamicEquilibrium, FullNonLocalThermodynamicEquilibrium, VibrationalTemperaturesNonLocalThermodynamicEquilibrium > Variant
Definition: lineshape.h:748
Species::Species scaler() const noexcept
Definition: lineshape.h:809
std::variant< Nonorm, VanVleckHuber, VanVleckWeisskopf, RosenkranzQuadratic, SimpleFrequencyScaling > Variant
Definition: lineshape.h:725
#define ARTS_NOEXCEPT
Definition: debug.h:81
Class to map energy levels.
Constains various line scaling functions.
Namespace to contain things required for absorption calculations.
constexpr Numeric pi
The following mathematical constants are generated in python Decimal package by the code:
constexpr Numeric k
Boltzmann constant convenience name [J/K].
constexpr Numeric c
Speed of light convenience name [m/s].
constexpr Numeric inv_pi
Inverse of pi.
constexpr Numeric h
Planck constant convenience name [J s].
Computations of line shape derived parameters.
Definition: lineshape.cc:27
constexpr auto pow2(auto x) noexcept
power of two
Polarization
Zeeman polarization selection.
Definition: zeemandata.h:27
constexpr T abs(T x) noexcept
Definition: nonstd.h:13
Definition: mystring.h:246
Main computational data for the line shape and strength calculations.
Definition: lineshape.h:840
const Vector & f_grid
Definition: lineshape.h:843
ComputeData & operator+=(const ComputeData &other)
Adds two identical compute data fields, the size must be identical.
Definition: lineshape.h:891
ComputeData(const Vector &f, const ArrayOfRetrievalQuantity &jacobian_quantities, const bool nlte) noexcept
Definition: lineshape.h:846
ComplexVector N
Definition: lineshape.h:841
ComplexVector F
Definition: lineshape.h:841
void reset() noexcept
Definition: lineshape.h:856
ComplexMatrix dF
Definition: lineshape.h:842
void enforce_positive_absorption() noexcept
All four fields are set to zero at i if F[i].real() < 0.
Definition: lineshape.h:876
ComplexMatrix dN
Definition: lineshape.h:842
constexpr Doppler(Numeric F0_noshift, Numeric DC, Numeric dZ) noexcept
Definition: lineshape.h:44
Complex operator()(Numeric f) noexcept
Definition: lineshape.cc:28
constexpr Complex dFdT(const Output &, Numeric T) const noexcept
Definition: lineshape.h:47
static constexpr Complex dFdD0(Numeric) noexcept
Definition: lineshape.h:64
static constexpr std::string_view name
Definition: lineshape.h:36
static constexpr Complex dFdVMR(const Output &) noexcept
Definition: lineshape.h:62
constexpr Complex dFdH(Numeric dZ) const noexcept
Definition: lineshape.h:57
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:60
static constexpr Complex dFdDV(Numeric) noexcept
Definition: lineshape.h:63
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:61
constexpr Complex dFdf() const noexcept
Definition: lineshape.h:51
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:66
static constexpr Complex dFdG0(Numeric) noexcept
Definition: lineshape.h:65
static constexpr Complex dFdG2(Numeric) noexcept
Definition: lineshape.h:67
constexpr Complex dFdF0() const noexcept
Definition: lineshape.h:54
static constexpr Numeric dNdI0() noexcept
Definition: lineshape.h:537
constexpr Numeric dSdF0() const noexcept
Definition: lineshape.h:529
constexpr Numeric dNdNLTEl() const noexcept
Definition: lineshape.h:540
constexpr Numeric dSdNLTEl() const noexcept
Definition: lineshape.h:531
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:488
static constexpr bool do_nlte() noexcept
Definition: lineshape.h:545
static constexpr Numeric dSdI0() noexcept
Definition: lineshape.h:528
constexpr Numeric dNdNLTEu() const noexcept
Definition: lineshape.h:539
constexpr Numeric dSdT() const noexcept
Definition: lineshape.h:527
constexpr Numeric dSdSELFVMR() const noexcept
Definition: lineshape.h:532
constexpr Numeric dNdT() const noexcept
Definition: lineshape.h:536
constexpr Numeric dNdSELFVMR() const noexcept
Definition: lineshape.h:541
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:538
constexpr Numeric dSdNLTEu() const noexcept
Definition: lineshape.h:530
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:415
constexpr Numeric dSdF0() const noexcept
Definition: lineshape.h:451
static constexpr Numeric dNdSELFVMR() noexcept
Definition: lineshape.h:463
static constexpr Numeric dSdNLTEl() noexcept
Definition: lineshape.h:453
static constexpr Numeric dNdT() noexcept
Definition: lineshape.h:458
constexpr Numeric dSdSELFVMR() const noexcept
Definition: lineshape.h:454
static constexpr Numeric dNdNLTEl() noexcept
Definition: lineshape.h:462
static constexpr Numeric dSdNLTEu() noexcept
Definition: lineshape.h:452
constexpr Numeric dSdT() const noexcept
Definition: lineshape.h:449
static constexpr Numeric dNdI0() noexcept
Definition: lineshape.h:459
constexpr Numeric dSdI0() const noexcept
Definition: lineshape.h:450
static constexpr bool do_nlte() noexcept
Definition: lineshape.h:465
static constexpr Numeric dNdNLTEu() noexcept
Definition: lineshape.h:461
static constexpr Numeric dNdF0() noexcept
Definition: lineshape.h:460
constexpr Complex dFdVMR(const Output &d) const noexcept
Definition: lineshape.h:84
constexpr Complex dFdD0(Numeric d) const noexcept
Definition: lineshape.h:100
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:107
constexpr Complex dFdDV(Numeric d) const noexcept
Definition: lineshape.h:97
constexpr Complex dFdF0() const noexcept
Definition: lineshape.h:94
static constexpr Complex dFdG2(Numeric)
Definition: lineshape.h:108
constexpr Complex dFdG0(Numeric d) const noexcept
Definition: lineshape.h:104
constexpr Complex dFdT(const Output &d, Numeric) const noexcept
Definition: lineshape.h:87
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:109
constexpr Complex dFdf() const noexcept
Definition: lineshape.h:91
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:110
constexpr Lorentz(Numeric F0_noshift, const Output &ls) noexcept
Definition: lineshape.h:81
static constexpr Complex dFdH(Numeric) noexcept
Definition: lineshape.h:103
constexpr Complex operator()(Numeric f) noexcept
Definition: lineshape.h:112
static constexpr std::string_view name
Definition: lineshape.h:73
static constexpr Numeric dNdf(Numeric) noexcept
Definition: lineshape.h:294
constexpr Numeric operator()(Numeric) noexcept
Definition: lineshape.h:297
constexpr Nonorm() noexcept=default
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:295
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:24
static constexpr Complex dFdH(Numeric) noexcept
Definition: lineshape.h:22
static constexpr Complex dFdG2(Numeric) noexcept
Definition: lineshape.h:30
static constexpr Complex dFdVMR(const Output &) noexcept
Definition: lineshape.h:25
static constexpr Complex dFdT(const Output &, Numeric) noexcept
Definition: lineshape.h:19
static constexpr Complex F
Definition: lineshape.h:17
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:29
static constexpr Complex dFdf() noexcept
Definition: lineshape.h:20
static constexpr std::string_view name
Definition: lineshape.h:15
static constexpr Complex dFdG0(Numeric) noexcept
Definition: lineshape.h:28
static constexpr Complex dFdDV(Numeric) noexcept
Definition: lineshape.h:26
static constexpr Complex dFdD0(Numeric) noexcept
Definition: lineshape.h:27
static constexpr Complex dFdF0() noexcept
Definition: lineshape.h:21
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:23
constexpr Complex operator()(Numeric) const noexcept
Definition: lineshape.h:32
static constexpr Numeric dNdT() noexcept
Definition: lineshape.h:396
static constexpr Numeric dNdNLTEu() noexcept
Definition: lineshape.h:399
static constexpr Numeric dSdNLTEu() noexcept
Definition: lineshape.h:392
static constexpr Numeric dSdI0() noexcept
Definition: lineshape.h:390
static constexpr Numeric dNdF0() noexcept
Definition: lineshape.h:398
static constexpr Numeric dNdI0() noexcept
Definition: lineshape.h:397
static constexpr Numeric dNdSELFVMR() noexcept
Definition: lineshape.h:401
static constexpr Numeric dNdNLTEl() noexcept
Definition: lineshape.h:400
static constexpr Numeric dSdT() noexcept
Definition: lineshape.h:389
static constexpr Numeric dSdNLTEl() noexcept
Definition: lineshape.h:393
static constexpr Numeric dSdSELFVMR() noexcept
Definition: lineshape.h:394
static constexpr bool do_nlte() noexcept
Definition: lineshape.h:403
static constexpr Numeric dSdF0() noexcept
Definition: lineshape.h:391
Main output of Model.
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:378
SimpleFrequencyScaling(Numeric F0_, Numeric T_) noexcept
Definition: lineshape.h:368
constexpr SimpleFrequencyScaling(Numeric exp, Numeric expm1, Numeric F0_, Numeric T_)
Definition: lineshape.h:362
Complex dFdD2(Numeric dD2dD2) const noexcept
Definition: lineshape.cc:145
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:212
Complex dFdD0(Numeric dD0dD0) const noexcept
Definition: lineshape.cc:96
static constexpr std::string_view name
Definition: lineshape.h:173
Complex dFdH(Numeric dZ) const noexcept
Definition: lineshape.cc:221
void update_calcs() noexcept
Definition: lineshape.cc:433
Complex dFdG2(Numeric dG2dG2) const noexcept
Definition: lineshape.cc:190
Complex dFdT(const Output &d, Numeric T) const noexcept
Definition: lineshape.cc:311
Complex dFdf() const noexcept
Definition: lineshape.cc:51
Complex dFdF0() const noexcept
Definition: lineshape.cc:68
CalcType init(const Complex c2) const noexcept
Definition: lineshape.cc:420
Complex dFdG0(Numeric dG0dG0) const noexcept
Definition: lineshape.cc:127
Complex dFdVMR(const Output &d) const noexcept
Definition: lineshape.cc:252
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:213
static constexpr Complex dFdDV(Numeric) noexcept
Definition: lineshape.h:214
Complex operator()(Numeric f) noexcept
Definition: lineshape.cc:407
constexpr Numeric dNdf(Numeric f) const noexcept
Definition: lineshape.h:325
static constexpr Numeric dNdT(Numeric, Numeric) noexcept
Definition: lineshape.h:324
constexpr VanVleckWeisskopf(Numeric F0) noexcept
Definition: lineshape.h:322
constexpr Numeric operator()(Numeric f) noexcept
Definition: lineshape.h:332
constexpr Numeric dNdF0() const noexcept
Definition: lineshape.h:328
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:568
static constexpr Complex dFdD2(Numeric) noexcept
Definition: lineshape.h:164
static constexpr std::string_view name
Definition: lineshape.h:120
constexpr Voigt(Numeric F0_noshift, const Output &ls, Numeric DC, Numeric dZ) noexcept
Definition: lineshape.h:129
constexpr Complex dFdD0(Numeric d) const noexcept
Definition: lineshape.h:144
constexpr Complex dFdF0() const noexcept
Definition: lineshape.h:140
constexpr Complex dFdH(Numeric dZ) const noexcept
Definition: lineshape.h:150
constexpr Complex dFdT(const Output &d, Numeric T) const noexcept
Definition: lineshape.h:156
constexpr Complex dFdf() const noexcept
Definition: lineshape.h:139
bool OK() const noexcept
Definition: lineshape.h:169
static constexpr Complex dFdG2(Numeric)
Definition: lineshape.h:165
constexpr Complex dFdVMR(const Output &d) const noexcept
Definition: lineshape.h:153
static constexpr Complex dFdFVC(Numeric) noexcept
Definition: lineshape.h:163
constexpr Complex dFdG0(Numeric d) const noexcept
Definition: lineshape.h:147
constexpr Complex dFdDV(Numeric d) const noexcept
Definition: lineshape.h:141
static constexpr Complex dFdETA(Numeric) noexcept
Definition: lineshape.h:162
Complex operator()(Numeric f) noexcept
Definition: lineshape.cc:34
#define d