ARTS 2.5.11 (git: 725533f0)
isotopologues.h
Go to the documentation of this file.
1#ifndef isotopologues_h
2#define isotopologues_h
3
4#include <limits>
5#include <string_view>
6
7#include "enums.h"
8#include "mystring.h"
9#include "nonstd.h"
10#include "species.h"
11
12namespace Species {
13inline constexpr std::string_view Joker = "*";
14
19
21 std::string_view isotname;
22
24 Numeric mass;
25
27 Index gi;
28
29 constexpr explicit IsotopeRecord(Species spec_, const std::string_view isotname_=Joker, Numeric mass_=std::numeric_limits<Numeric>::quiet_NaN(), Index gi_=-1) noexcept
30 : spec(spec_), isotname(isotname_), mass(mass_), gi(gi_) {}
31
32 constexpr IsotopeRecord() noexcept : IsotopeRecord(Species::FINAL) {}
33
34 friend std::ostream& operator<<(std::ostream& os, const IsotopeRecord& ir) {
35 return os << ir.spec << ' ' << ir.isotname << ' ' << ir.mass << ' ' << ir.gi;
36 }
37 constexpr bool operator==(const IsotopeRecord& that) const noexcept {
38 return that.spec == spec and that.isotname == isotname;
39 }
40
42 constexpr bool operator==(const std::string_view specstr) const noexcept {
43 auto lim = specstr.find('-');
44 return (lim not_eq specstr.npos) and (fromShortName(specstr.substr(0, lim)) == spec) and (specstr.substr(lim+1) == isotname);
45 }
46
47 template <typename T> constexpr bool operator!=(T x)const noexcept {return not operator==(x);}
48
49 [[nodiscard]] String FullName() const noexcept {return String(toShortName(spec)) + String("-") + String(isotname);}
50 [[nodiscard]] constexpr bool joker() const noexcept {return isotname == Joker;}
51 [[nodiscard]] constexpr bool OK() const noexcept {return good_enum(spec);}
52};
53
54#define deal_with_spec(SPEC) IsotopeRecord(Species::SPEC),
55
57inline constexpr std::array Isotopologues {
59 deal_with_spec(Water)
60 IsotopeRecord(fromShortName("H2O"), "161", 18.010565, 1),
61 IsotopeRecord(fromShortName("H2O"), "162", 19.016740, 6),
62 IsotopeRecord(fromShortName("H2O"), "171", 19.014780, 6),
63 IsotopeRecord(fromShortName("H2O"), "172", 20.020956, 36),
64 IsotopeRecord(fromShortName("H2O"), "181", 20.014811, 1),
65 IsotopeRecord(fromShortName("H2O"), "182", 21.020985, 6),
66 IsotopeRecord(fromShortName("H2O"), "262", 20.022915, 1),
67 IsotopeRecord(fromShortName("H2O"), "ForeignContCKDMT320"),
68 IsotopeRecord(fromShortName("H2O"), "ForeignContCKDMT350"),
69 IsotopeRecord(fromShortName("H2O"), "ForeignContCKDMT400"),
70 IsotopeRecord(fromShortName("H2O"), "ForeignContStandardType"),
71 IsotopeRecord(fromShortName("H2O"), "MPM89"),
72 IsotopeRecord(fromShortName("H2O"), "PWR2021"),
73 IsotopeRecord(fromShortName("H2O"), "PWR2022"),
74 IsotopeRecord(fromShortName("H2O"), "PWR98"),
75 IsotopeRecord(fromShortName("H2O"), "SelfContCKDMT320"),
76 IsotopeRecord(fromShortName("H2O"), "SelfContCKDMT350"),
77 IsotopeRecord(fromShortName("H2O"), "SelfContCKDMT400"),
78 IsotopeRecord(fromShortName("H2O"), "SelfContStandardType"),
82 deal_with_spec(CarbonDioxide)
83 IsotopeRecord(fromShortName("CO2"), "626", 43.989830, 1),
84 IsotopeRecord(fromShortName("CO2"), "627", 44.994045, 6),
85 IsotopeRecord(fromShortName("CO2"), "628", 45.994076, 1),
86 IsotopeRecord(fromShortName("CO2"), "636", 44.993185, 2),
87 IsotopeRecord(fromShortName("CO2"), "637", 45.997400, 12),
88 IsotopeRecord(fromShortName("CO2"), "638", 46.997431, 2),
89 IsotopeRecord(fromShortName("CO2"), "727", 45.998262, 1),
90 IsotopeRecord(fromShortName("CO2"), "737", 47.001618, 2),
91 IsotopeRecord(fromShortName("CO2"), "827", 46.998291, 6),
92 IsotopeRecord(fromShortName("CO2"), "828", 47.998322, 1),
93 IsotopeRecord(fromShortName("CO2"), "837", 48.001646, 12),
94 IsotopeRecord(fromShortName("CO2"), "838", 49.001675, 2),
95 IsotopeRecord(fromShortName("CO2"), "CKDMT252"),
99 deal_with_spec(Ozone)
100 IsotopeRecord(fromShortName("O3"), "666", 47.984745, 1),
101 IsotopeRecord(fromShortName("O3"), "667", 48.988960, 6),
102 IsotopeRecord(fromShortName("O3"), "668", 49.988991, 1),
103 IsotopeRecord(fromShortName("O3"), "676", 48.988960, 6),
104 IsotopeRecord(fromShortName("O3"), "686", 49.988991, 1),
108 deal_with_spec(NitrogenOxide)
109 IsotopeRecord(fromShortName("N2O"), "446", 44.001062, 9),
110 IsotopeRecord(fromShortName("N2O"), "447", 45.005278, 54),
111 IsotopeRecord(fromShortName("N2O"), "448", 46.005308, 9),
112 IsotopeRecord(fromShortName("N2O"), "456", 44.998096, 6),
113 IsotopeRecord(fromShortName("N2O"), "546", 44.998096, 6),
117 deal_with_spec(CarbonMonoxide)
118 IsotopeRecord(fromShortName("CO"), "26", 27.994915, 1),
119 IsotopeRecord(fromShortName("CO"), "27", 28.999130, 6),
120 IsotopeRecord(fromShortName("CO"), "28", 29.999161, 1),
121 IsotopeRecord(fromShortName("CO"), "36", 28.998270, 2),
122 IsotopeRecord(fromShortName("CO"), "37", 30.002485, 12),
123 IsotopeRecord(fromShortName("CO"), "38", 31.002516, 2),
127 deal_with_spec(Methane)
128 IsotopeRecord(fromShortName("CH4"), "211", 16.031300, 1),
129 IsotopeRecord(fromShortName("CH4"), "212", 17.037475, 3),
130 IsotopeRecord(fromShortName("CH4"), "311", 17.034655, 2),
131 IsotopeRecord(fromShortName("CH4"), "312", 18.040830, 6),
135 deal_with_spec(Oxygen)
136 IsotopeRecord(fromShortName("O2"), "66", 31.989830, 1),
137 IsotopeRecord(fromShortName("O2"), "67", 32.994045, 6),
138 IsotopeRecord(fromShortName("O2"), "68", 33.994076, 1),
139 IsotopeRecord(fromShortName("O2"), "CIAfunCKDMT100"),
140 IsotopeRecord(fromShortName("O2"), "MPM2020"),
141 IsotopeRecord(fromShortName("O2"), "MPM89"),
142 IsotopeRecord(fromShortName("O2"), "PWR2021"),
143 IsotopeRecord(fromShortName("O2"), "PWR2022"),
144 IsotopeRecord(fromShortName("O2"), "PWR98"),
145 IsotopeRecord(fromShortName("O2"), "SelfContStandardType"),
146 IsotopeRecord(fromShortName("O2"), "TRE05"),
147 IsotopeRecord(fromShortName("O2"), "v0v0CKDMT100"),
148 IsotopeRecord(fromShortName("O2"), "v1v0CKDMT100"),
149 IsotopeRecord(fromShortName("O2"), "visCKDMT252"),
153 deal_with_spec(NitricOxide)
154 IsotopeRecord(fromShortName("NO"), "46", 29.997989, 3),
155 IsotopeRecord(fromShortName("NO"), "48", 32.002234, 3),
156 IsotopeRecord(fromShortName("NO"), "56", 30.995023, 2),
160 deal_with_spec(SulfurDioxide)
161 IsotopeRecord(fromShortName("SO2"), "626", 63.961901, 1),
162 IsotopeRecord(fromShortName("SO2"), "628", 65.966146, 1),
163 IsotopeRecord(fromShortName("SO2"), "636", 64.961286, 4),
164 IsotopeRecord(fromShortName("SO2"), "646", 65.957695, 1),
168 deal_with_spec(NitrogenDioxide)
169 IsotopeRecord(fromShortName("NO2"), "646", 45.992904, 3),
170 IsotopeRecord(fromShortName("NO2"), "656", 46.989938, 2),
174 deal_with_spec(Ammonia)
175 IsotopeRecord(fromShortName("NH3"), "4111", 17.026549, 3),
176 IsotopeRecord(fromShortName("NH3"), "4112", 18), // FIXME: Better mass and some gj?
177 IsotopeRecord(fromShortName("NH3"), "5111", 18.023583, 2),
181 deal_with_spec(NitricAcid)
182 IsotopeRecord(fromShortName("HNO3"), "146", 62.995644, 6),
183 IsotopeRecord(fromShortName("HNO3"), "156", 63.992680, 4),
187 deal_with_spec(Hydroxyl)
188 IsotopeRecord(fromShortName("OH"), "61", 17.002740, 2),
189 IsotopeRecord(fromShortName("OH"), "62", 18.008915, 3),
190 IsotopeRecord(fromShortName("OH"), "81", 19.006986, 2),
194 deal_with_spec(HydrogenFluoride)
195 IsotopeRecord(fromShortName("HF"), "19", 20.006229, 4),
196 IsotopeRecord(fromShortName("HF"), "29", 21.012404, 6),
200 deal_with_spec(HydrogenChloride)
201 IsotopeRecord(fromShortName("HCl"), "15", 35.976678, 8),
202 IsotopeRecord(fromShortName("HCl"), "17", 37.973729, 8),
203 IsotopeRecord(fromShortName("HCl"), "25", 36.982853, 12),
204 IsotopeRecord(fromShortName("HCl"), "27", 38.979904, 12),
208 deal_with_spec(HydrogenBromide)
209 IsotopeRecord(fromShortName("HBr"), "11", 81.924115, 8),
210 IsotopeRecord(fromShortName("HBr"), "19", 79.926160, 8),
211 IsotopeRecord(fromShortName("HBr"), "21", 82.930289, 12),
212 IsotopeRecord(fromShortName("HBr"), "29", 80.932336, 12),
216 deal_with_spec(HydrogenIodide)
217 IsotopeRecord(fromShortName("HI"), "17", 127.912297, 12),
218 IsotopeRecord(fromShortName("HI"), "27", 128.918472, 18),
222 deal_with_spec(ChlorineMonoxide)
223 IsotopeRecord(fromShortName("ClO"), "56", 50.963768, 4),
224 IsotopeRecord(fromShortName("ClO"), "76", 52.960819, 4),
228 deal_with_spec(CarbonylSulfide)
229 IsotopeRecord(fromShortName("OCS"), "622", 59.966986, 1),
230 IsotopeRecord(fromShortName("OCS"), "623", 60.966371, 4),
231 IsotopeRecord(fromShortName("OCS"), "624", 61.962780, 1),
232 IsotopeRecord(fromShortName("OCS"), "632", 60.970341, 2),
233 IsotopeRecord(fromShortName("OCS"), "634", 62.966137, 2),
234 IsotopeRecord(fromShortName("OCS"), "822", 61.971231, 1),
238 deal_with_spec(Formaldehyde)
239 IsotopeRecord(fromShortName("H2CO"), "126", 30.010565, 1),
240 IsotopeRecord(fromShortName("H2CO"), "128", 32.014811, 1),
241 IsotopeRecord(fromShortName("H2CO"), "136", 31.013920, 2),
245 deal_with_spec(HeavyFormaldehyde)
246 IsotopeRecord(fromShortName("HDCO"), "26", 31), // FIXME: Better mass and some gj? What is the AFGL code???
250 deal_with_spec(VeryHeavyFormaldehyde)
251 IsotopeRecord(fromShortName("D2CO"), "26", 32), // FIXME: Better mass and some gj? What is the AFGL code???
255 deal_with_spec(HypochlorousAcid)
256 IsotopeRecord(fromShortName("HOCl"), "165", 51.971593, 8),
257 IsotopeRecord(fromShortName("HOCl"), "167", 53.968644, 8),
261 deal_with_spec(Nitrogen)
262 IsotopeRecord(fromShortName("N2"), "44", 28.006148, 1),
263 IsotopeRecord(fromShortName("N2"), "45", 29.003182, 6),
264 IsotopeRecord(fromShortName("N2"), "CIAfunCKDMT252"),
265 IsotopeRecord(fromShortName("N2"), "CIArotCKDMT252"),
266 IsotopeRecord(fromShortName("N2"), "SelfContMPM93"),
267 IsotopeRecord(fromShortName("N2"), "SelfContPWR2021"),
268 IsotopeRecord(fromShortName("N2"), "SelfContStandardType"),
272 deal_with_spec(HydrogenCyanide)
273 IsotopeRecord(fromShortName("HCN"), "124", 27.010899, 6),
274 IsotopeRecord(fromShortName("HCN"), "125", 28.007933, 4),
275 IsotopeRecord(fromShortName("HCN"), "134", 28.014254, 12),
276 IsotopeRecord(fromShortName("HCN"), "224", 28), // FIXME: Better mass and some gj?
280 deal_with_spec(Chloromethane)
281 IsotopeRecord(fromShortName("CH3Cl"), "215", 49.992328, 4),
282 IsotopeRecord(fromShortName("CH3Cl"), "217", 51.989379, 4),
286 deal_with_spec(HydrogenPeroxide)
287 IsotopeRecord(fromShortName("H2O2"), "1661", 34.005480, 1),
291 deal_with_spec(Acetylene)
292 IsotopeRecord(fromShortName("C2H2"), "1221", 26.015650, 1),
293 IsotopeRecord(fromShortName("C2H2"), "1222", 27.021825, 6),
294 IsotopeRecord(fromShortName("C2H2"), "1231", 27.019005, 8),
298 deal_with_spec(Ethane)
299 IsotopeRecord(fromShortName("C2H6"), "1221", 30.046950, 1),
300 IsotopeRecord(fromShortName("C2H6"), "1231", 31.050305, 2),
304 deal_with_spec(Phosphine)
305 IsotopeRecord(fromShortName("PH3"), "1111", 33.997238, 2),
309 deal_with_spec(CarbonylFluoride)
310 IsotopeRecord(fromShortName("COF2"), "269", 65.991722, 1),
311 IsotopeRecord(fromShortName("COF2"), "369", 66.995083, 2),
315 deal_with_spec(SulfurHexafluoride)
316 IsotopeRecord(fromShortName("SF6"), "29", 145.962492, 1),
320 deal_with_spec(HydrogenSulfide)
321 IsotopeRecord(fromShortName("H2S"), "121", 33.987721, 1),
322 IsotopeRecord(fromShortName("H2S"), "122", 35), // FIXME: Better mass and some gj?
323 IsotopeRecord(fromShortName("H2S"), "131", 34.987105, 4),
324 IsotopeRecord(fromShortName("H2S"), "141", 35.983515, 1),
328 deal_with_spec(FormicAcid)
329 IsotopeRecord(fromShortName("HCOOH"), "126", 46.005480, 4),
330 IsotopeRecord(fromShortName("HCOOH"), "136", 47), // FIXME: Better mass and some gj?
334 deal_with_spec(LeftHeavyFormicAcid)
335 IsotopeRecord(fromShortName("DCOOH"), "266", 47), // FIXME: Better mass and some gj? What is the AFGL code???
339 deal_with_spec(RightHeavyFormicAcid)
340 IsotopeRecord(fromShortName("HCOOD"), "266", 47), // FIXME: Better mass and some gj? What is the AFGL code???
344 deal_with_spec(Hydroperoxyl)
345 IsotopeRecord(fromShortName("HO2"), "166", 32.997655, 2),
349 deal_with_spec(OxygenAtom)
350 IsotopeRecord(fromShortName("O"), "6", 15.994915, 1),
354 deal_with_spec(ChlorineNitrate)
355 IsotopeRecord(fromShortName("ClONO2"), "5646", 96.956672, 12),
356 IsotopeRecord(fromShortName("ClONO2"), "7646", 98.953723, 12),
360 deal_with_spec(NitricOxideCation)
361 IsotopeRecord(fromShortName("NO+"), "46", 29.997989, 3),
365 deal_with_spec(ChlorineDioxide)
366 IsotopeRecord(fromShortName("OClO"), "656", 67), // FIXME: Better mass and some gj?
367 IsotopeRecord(fromShortName("OClO"), "676", 69), // FIXME: Better mass and some gj?
371 deal_with_spec(BromineMonoxide)
372 IsotopeRecord(fromShortName("BrO"), "16", 97), // FIXME: Better mass and some gj?
373 IsotopeRecord(fromShortName("BrO"), "96", 95), // FIXME: Better mass and some gj?
377 deal_with_spec(SulfuricAcid)
378 IsotopeRecord(fromShortName("H2SO4"), "126", 98), // FIXME: Better mass and some gj?
382 deal_with_spec(ChlorineMonoxideDimer)
383 IsotopeRecord(fromShortName("Cl2O2"), "565", 102), // FIXME: Better mass and some gj?
384 IsotopeRecord(fromShortName("Cl2O2"), "765", 104), // FIXME: Better mass and some gj?
388 deal_with_spec(HypobromousAcid)
389 IsotopeRecord(fromShortName("HOBr"), "161", 97.919027, 8),
390 IsotopeRecord(fromShortName("HOBr"), "169", 95.921076, 8),
394 deal_with_spec(Ethylene)
395 IsotopeRecord(fromShortName("C2H4"), "221", 28.031300, 1),
396 IsotopeRecord(fromShortName("C2H4"), "231", 29.034655, 2),
400 deal_with_spec(Methanol)
401 IsotopeRecord(fromShortName("CH3OH"), "2161", 32.026215, 2),
405 deal_with_spec(Bromomethane)
406 IsotopeRecord(fromShortName("CH3Br"), "211", 95.939764, 4),
407 IsotopeRecord(fromShortName("CH3Br"), "219", 93.941811, 4),
411 deal_with_spec(Acetonitrile)
412 IsotopeRecord(fromShortName("CH3CN"), "2124", 41.026549, 3),
413 IsotopeRecord(fromShortName("CH3CN"), "2125", 42), // FIXME: Better mass and some gj?
414 IsotopeRecord(fromShortName("CH3CN"), "2134", 42), // FIXME: Better mass and some gj?
415 IsotopeRecord(fromShortName("CH3CN"), "3124", 42), // FIXME: Better mass and some gj?
419 deal_with_spec(HeavyAcetonitrile)
420 IsotopeRecord(fromShortName("CH2DCN"), "224", 42), // FIXME: Better mass and some gj? What is the AFGL code???
424 deal_with_spec(CarbonTetrafluoride)
425 IsotopeRecord(fromShortName("CF4"), "29", 87.993616, 1),
429 deal_with_spec(Diacetylene)
430 IsotopeRecord(fromShortName("C4H2"), "2211", 50.015650, 1),
434 deal_with_spec(Cyanoacetylene)
435 IsotopeRecord(fromShortName("HC3N"), "12224", 51.010899, 6),
436 IsotopeRecord(fromShortName("HC3N"), "12225", 52), // FIXME: Better mass and some gj?
437 IsotopeRecord(fromShortName("HC3N"), "12234", 52), // FIXME: Better mass and some gj?
438 IsotopeRecord(fromShortName("HC3N"), "12324", 52), // FIXME: Better mass and some gj?
439 IsotopeRecord(fromShortName("HC3N"), "13224", 52), // FIXME: Better mass and some gj?
440 IsotopeRecord(fromShortName("HC3N"), "22224", 52), // FIXME: Better mass and some gj?
444 deal_with_spec(Hydrogen)
445 IsotopeRecord(fromShortName("H2"), "11", 2.015650, 1),
446 IsotopeRecord(fromShortName("H2"), "12", 3.021825, 6),
450 deal_with_spec(CarbonMonosulfide)
451 IsotopeRecord(fromShortName("CS"), "22", 43.971036, 1),
452 IsotopeRecord(fromShortName("CS"), "23", 44.970399, 4),
453 IsotopeRecord(fromShortName("CS"), "24", 45.966787, 1),
454 IsotopeRecord(fromShortName("CS"), "32", 44.974368, 2),
458 deal_with_spec(HydrogenIsocyanide)
459 IsotopeRecord(fromShortName("HNC"), "142", 27), // FIXME: Better mass and some gj?
460 IsotopeRecord(fromShortName("HNC"), "143", 28), // FIXME: Better mass and some gj?
461 IsotopeRecord(fromShortName("HNC"), "152", 28), // FIXME: Better mass and some gj?
462 IsotopeRecord(fromShortName("HNC"), "242", 28), // FIXME: Better mass and some gj?
466 deal_with_spec(SulfurMonoxide)
467 IsotopeRecord(fromShortName("SO"), "26", 47.966986, 1),
468 IsotopeRecord(fromShortName("SO"), "28", 49.971231, 1),
469 IsotopeRecord(fromShortName("SO"), "46", 49.962782, 1),
473 deal_with_spec(Propane)
474 IsotopeRecord(fromShortName("C3H8"), "21", 54), // FIXME: Better mass and some gj?
478 deal_with_spec(HydrogenAtom)
479 IsotopeRecord(fromShortName("H"), "1", 1), // FIXME: Better mass and some gj?
483 deal_with_spec(Helium)
484 IsotopeRecord(fromShortName("He"), "4", 4), // FIXME: Better mass and some gj?
488 deal_with_spec(Argon)
489 IsotopeRecord(fromShortName("Ar"), "8", 39.948), // FIXME: Better mass and some gj?
493 deal_with_spec(SulfurTrioxide)
494 IsotopeRecord(fromShortName("SO3"), "26", 79.956820, 1),
498 deal_with_spec(Cyanogen)
499 IsotopeRecord(fromShortName("C2N2"), "4224", 52.006148, 1),
503 deal_with_spec(Phosgene)
504 IsotopeRecord(fromShortName("COCl2"), "2655", 97.932620, 1),
505 IsotopeRecord(fromShortName("COCl2"), "2657", 99.929670, 16),
509 deal_with_spec(CarbonDisulfide)
510 IsotopeRecord(fromShortName("CS2"), "222", 75.944140, 1),
511 IsotopeRecord(fromShortName("CS2"), "223", 76.943256, 4),
512 IsotopeRecord(fromShortName("CS2"), "224", 77.939940, 1),
513 IsotopeRecord(fromShortName("CS2"), "232", 76.947495, 2),
516 deal_with_spec(Methyl)
517 deal_with_spec(Cyclopropene)
518 deal_with_spec(Hexafluoroethane)
519 deal_with_spec(Perfluoropropane)
520 deal_with_spec(Perfluorobutane)
521 deal_with_spec(Perfluoropentane)
522 deal_with_spec(Perfluorohexane)
523 deal_with_spec(Perfluorooctane)
524 deal_with_spec(Perfluorocyclobutane)
525 deal_with_spec(CarbonTetrachloride)
526 deal_with_spec(CFC11)
527 deal_with_spec(CFC113)
528 deal_with_spec(CFC114)
529 deal_with_spec(CFC115)
530 deal_with_spec(CFC12)
531 deal_with_spec(Dichloromethane)
532 deal_with_spec(Trichloroethane)
533 deal_with_spec(Trichloromethane)
534 deal_with_spec(Bromochlorodifluoromethane)
535 deal_with_spec(Bromotrifluoromethane)
536 deal_with_spec(Dibromotetrafluoroethane)
537 deal_with_spec(HCFC141b)
538 deal_with_spec(HCFC142b)
539 deal_with_spec(HCFC22)
540 deal_with_spec(HFC125)
541 deal_with_spec(HFC134a)
542 deal_with_spec(HFC143a)
543 deal_with_spec(HFC152a)
544 deal_with_spec(HFC227ea)
545 deal_with_spec(HFC23)
546 deal_with_spec(HFC236fa)
547 deal_with_spec(HFC245fa)
548 deal_with_spec(HFC32)
549 deal_with_spec(HFC365mfc)
550
551
552 deal_with_spec(NitrogenTrifluoride)
553 IsotopeRecord(fromShortName("NF3"), "4999", 70.998286, 3),
556 deal_with_spec(SulfurylFluoride)
557 deal_with_spec(HFC4310mee)
558
559
560 deal_with_spec(Germane)
561 IsotopeRecord(fromShortName("GeH4"), "011", 73.955550, 1),
562 IsotopeRecord(fromShortName("GeH4"), "211", 75.953380, 1),
563 IsotopeRecord(fromShortName("GeH4"), "311", 76.954764, 10),
564 IsotopeRecord(fromShortName("GeH4"), "411", 77.952479, 1),
565 IsotopeRecord(fromShortName("GeH4"), "611", 79.952703, 1),
569 deal_with_spec(Iodomethane)
570 IsotopeRecord(fromShortName("CH3I"), "217", 141.927947, 6),
574 deal_with_spec(Fluoromethane)
575 IsotopeRecord(fromShortName("CH3F"), "219", 34.021878, 2),
579 deal_with_spec(liquidcloud)
580 IsotopeRecord(Species::liquidcloud, "ELL07"),
581 deal_with_spec(icecloud)
582 deal_with_spec(rain)
583 deal_with_spec(free_electrons)
584 deal_with_spec(particles)
586};
587
588#undef deal_with_spec
589
590consteval std::array<std::size_t, std::size_t(Species::FINAL)+1> start_positions() noexcept {
591 std::array<bool, std::size_t(Species::FINAL)> found{};
592 for (auto& x: found) x = false;
593
594 std::array<std::size_t, std::size_t(Species::FINAL)+1> out{};
595 for (auto& x: out) x = Isotopologues.size();
596
597 for (std::size_t i=0; i<Isotopologues.size(); i++) {
598 const auto ind = std::size_t(Isotopologues[i].spec);
599 if (not found[ind]) {
600 found[ind] = true;
601 out[ind] = i;
602 }
603 }
604 return out;
605}
606
607inline constexpr auto IsotopologuesStart = start_positions();
608
609template <Species spec>
610consteval std::size_t count_isotopologues() noexcept {
611 return IsotopologuesStart[std::size_t(spec) + 1] - IsotopologuesStart[std::size_t(spec)];
612}
613
614template <Species spec>
615consteval std::array<IsotopeRecord, count_isotopologues<spec>()> isotopologues() noexcept {
616 static_assert(count_isotopologues<spec>() not_eq 0, "All species must be defined in the Isotopologues!");
617 std::array<IsotopeRecord, count_isotopologues<spec>()> isots;
618 for (std::size_t i=0; i<count_isotopologues<spec>(); i++) {
619 isots[i] = Isotopologues[i + IsotopologuesStart[std::size_t(spec)]];
620 }
621 return isots;
622}
623
625
626constexpr Index find_species_index(const Species spec,
627 const std::string_view isot) noexcept {
628 if (good_enum(spec)) {
629 for (std::size_t i=IsotopologuesStart[std::size_t(spec)]; i<IsotopologuesStart[std::size_t(spec) + 1]; i++) {
630 if (isot == Isotopologues[i].isotname) {
631 return i;
632 }
633 }
634 }
635 return -1;
636}
637
638
639constexpr Index find_species_index(const IsotopeRecord ir) noexcept {
640 return find_species_index(ir.spec, ir.isotname);
641}
642
643constexpr Index find_species_index(const std::string_view spec,
644 const std::string_view isot) noexcept {
645 return find_species_index(fromShortName(spec), isot);
646}
647
648constexpr Index find_species_index(std::string_view s) {
649 auto minus = s.find('-');
650 return find_species_index(s.substr(0, minus), s.substr(minus+1));
651}
652
653constexpr const IsotopeRecord& select(Species spec, const std::string_view isotname) noexcept {
654 return Isotopologues[find_species_index(spec, isotname)];
655}
656
657constexpr const IsotopeRecord& select(const std::string_view spec,
658 const std::string_view isotname) noexcept {
659 return Isotopologues[find_species_index(spec, isotname)];
660}
661
662constexpr const IsotopeRecord& select_joker(Species spec) noexcept {
663 return select(spec, Joker);
664}
665
666constexpr const IsotopeRecord& select_joker(std::string_view spec) noexcept {
667 return select(fromShortName(spec), Joker);
668}
669
671
672constexpr bool is_predefined_model(const IsotopeRecord& ir) noexcept {
673 return not (nonstd::isdigit(ir.isotname[0]) or ir.isotname == Joker);
674}
675
676constexpr bool is_normal_isotopologue(const IsotopeRecord& ir) noexcept {
677 return nonstd::isdigit(ir.isotname[0]) and ir.isotname not_eq Joker;
678}
679
681
682constexpr bool same_or_joker(const IsotopeRecord& ir1, const IsotopeRecord& ir2) noexcept {
683 if (ir1.spec not_eq ir2.spec) return false;
684 if (ir1.joker() or ir2.joker()) return true;
685 return ir1.isotname == ir2.isotname;
686}
687
689 static constexpr Index maxsize = Index(Isotopologues.size());
690 std::array<Numeric, maxsize> data;
691
692 constexpr IsotopologueRatios() noexcept : data() {
693 for (auto& x: data) x = std::numeric_limits<Numeric>::quiet_NaN();
694 }
695
696 constexpr Numeric operator[](const Index spec_ind) const ARTS_NOEXCEPT {
697 ARTS_ASSERT(spec_ind < maxsize and spec_ind >= 0)
698 return data[spec_ind];
699 }
700
701 constexpr Numeric operator[](const IsotopeRecord& ir) const {
702 const Index spec_ind = find_species_index(ir);
703 ARTS_USER_ERROR_IF(spec_ind >= maxsize or spec_ind < 0,
704 "Cannot understand: ", ir.FullName(), " as a valid species")
705 return data[spec_ind];
706 }
707
708 friend std::ostream& operator<<(std::ostream& os, const IsotopologueRatios& iso_rat) {
709 for (size_t i=0; i<iso_rat.maxsize; i++) {
710 if (i not_eq 0)
711 os << '\n';
712 os << Isotopologues[i].FullName() << ' ' << iso_rat.data[i];
713 }
714 return os;
715 }
716
717 [[nodiscard]] constexpr bool all_isotopes_have_a_value() const noexcept {
718 for (Index i=0; i<maxsize; i++) {
719 if (not is_predefined_model(Isotopologues[i]) and not Isotopologues[i].joker() and nonstd::isnan(data[i])) {
720 return false;
721 }
722 }
723 return true;
724 }
725};
726
728 IsotopologueRatios isotopologue_ratios;
729
730 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("H2O", ISOT)] = VAL
731 set_isot_val("161", .997317E+00);
732 set_isot_val("181", 1.99983E-03);
733 set_isot_val("171", 3.71884E-04);
734 set_isot_val("162", 3.10693E-04);
735 set_isot_val("182", 6.23003E-07);
736 set_isot_val("172", 1.15853E-07);
737 set_isot_val("262", 2.41970E-08);
738 #undef set_isot_val
739
740 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CO2", ISOT)] = VAL
741 set_isot_val("626", .984204E+00);
742 set_isot_val("636", 1.10574E-02);
743 set_isot_val("628", 3.94707E-03);
744 set_isot_val("627", 7.33989E-04);
745 set_isot_val("638", 4.43446E-05);
746 set_isot_val("637", 8.24623E-06);
747 set_isot_val("828", 3.95734E-06);
748 set_isot_val("827", 1.47180E-06);
749 set_isot_val("727", 1.36847E-07);
750 set_isot_val("838", 4.44600E-08);
751 set_isot_val("837", 1.65354E-08);
752 set_isot_val("737", 1.53750E-09);
753 #undef set_isot_val
754
755 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("O3", ISOT)] = VAL
756 set_isot_val("666", .992901E+00);
757 set_isot_val("668", 3.98194E-03);
758 set_isot_val("686", 1.99097E-03);
759 set_isot_val("667", 7.40475E-04);
760 set_isot_val("676", 3.70237E-04);
761 #undef set_isot_val
762
763 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("N2O", ISOT)] = VAL
764 set_isot_val("446", .990333E+00);
765 set_isot_val("456", 3.64093E-03);
766 set_isot_val("546", 3.64093E-03);
767 set_isot_val("448", 1.98582E-03);
768 set_isot_val("447", 3.69280E-04);
769 #undef set_isot_val
770
771 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CO", ISOT)] = VAL
772 set_isot_val("26", .986544E+00);
773 set_isot_val("36", 1.10836E-02);
774 set_isot_val("28", 1.97822E-03);
775 set_isot_val("27", 3.67867E-04);
776 set_isot_val("38", 2.22250E-05);
777 set_isot_val("37", 4.13292E-06);
778 #undef set_isot_val
779
780 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH4", ISOT)] = VAL
781 set_isot_val("211", .988274E+00);
782 set_isot_val("311", 1.11031E-02);
783 set_isot_val("212", 6.15751E-04);
784 set_isot_val("312", 6.91785E-06);
785 #undef set_isot_val
786
787 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("O2", ISOT)] = VAL
788 set_isot_val("66", .995262E+00);
789 set_isot_val("68", 3.99141E-03);
790 set_isot_val("67", 7.42235E-04);
791 #undef set_isot_val
792
793 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("NO", ISOT)] = VAL
794 set_isot_val("46", .993974E+00);
795 set_isot_val("56", 3.65431E-03);
796 set_isot_val("48", 1.99312E-03);
797 #undef set_isot_val
798
799 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("SO2", ISOT)] = VAL
800 set_isot_val("626", .945678E+00);
801 set_isot_val("646", 4.19503E-02);
802 set_isot_val("636", 0.0074989421);
803 set_isot_val("628", 0.0020417379);
804 #undef set_isot_val
805
806 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("NO2", ISOT)] = VAL
807 set_isot_val("646", .991616E+00);
808 set_isot_val("656", 3.64564E-03);
809 #undef set_isot_val
810
811 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("NH3", ISOT)] = VAL
812 set_isot_val("4111", .995872E+00);
813 set_isot_val("5111", 3.66129E-03);
814 set_isot_val("4112", 0.00044792294);
815 #undef set_isot_val
816
817 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HNO3", ISOT)] = VAL
818 set_isot_val("146", .989110E+00);
819 set_isot_val("156", 3.63600E-03);
820 #undef set_isot_val
821
822 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("OH", ISOT)] = VAL
823 set_isot_val("61", .997473E+00);
824 set_isot_val("81", 2.00014E-03);
825 set_isot_val("62", 1.55371E-04);
826 #undef set_isot_val
827
828 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HF", ISOT)] = VAL
829 set_isot_val("19", .999844E+00);
830 set_isot_val("29", 1.55741E-04);
831 #undef set_isot_val
832
833 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HCl", ISOT)] = VAL
834 set_isot_val("15", .757587E+00);
835 set_isot_val("17", .242257E+00);
836 set_isot_val("25", 1.18005E-04);
837 set_isot_val("27", 3.77350E-05);
838 #undef set_isot_val
839
840 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HBr", ISOT)] = VAL
841 set_isot_val("19", .506781E+00);
842 set_isot_val("11", .493063E+00);
843 set_isot_val("29", 7.89384E-05);
844 set_isot_val("21", 7.68016E-05);
845 #undef set_isot_val
846
847 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HI", ISOT)] = VAL
848 set_isot_val("17", .999844E+00);
849 set_isot_val("27", 1.55741E-04);
850 #undef set_isot_val
851
852 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("ClO", ISOT)] = VAL
853 set_isot_val("56", .755908E+00);
854 set_isot_val("76", .241720E+00);
855 #undef set_isot_val
856
857 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("OCS", ISOT)] = VAL
858 set_isot_val("622", .937395E+00);
859 set_isot_val("624", 4.15828E-02);
860 set_isot_val("632", 1.05315E-02);
861 set_isot_val("623", 7.39908E-03);
862 set_isot_val("822", 1.87967E-03);
863 set_isot_val("634", 4.67508E-04);
864 #undef set_isot_val
865
866 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("H2CO", ISOT)] = VAL
867 set_isot_val("126", .986237E+00);
868 set_isot_val("136", 1.10802E-02);
869 set_isot_val("128", 1.97761E-03);
870 #undef set_isot_val
871
872 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HDCO", ISOT)] = VAL
873 set_isot_val("26", 0.00029578940);
874 #undef set_isot_val
875
876 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("D2CO", ISOT)] = VAL
877 set_isot_val("26", 2.2181076E-08);
878 #undef set_isot_val
879
880 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HOCl", ISOT)] = VAL
881 set_isot_val("165", .755790E+00);
882 set_isot_val("167", .241683E+00);
883 #undef set_isot_val
884
885 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("N2", ISOT)] = VAL
886 set_isot_val("44", .992687E+00);
887 set_isot_val("45", 7.47809E-03);
888 #undef set_isot_val
889
890 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HCN", ISOT)] = VAL
891 set_isot_val("124", .985114E+00);
892 set_isot_val("134", 1.10676E-02);
893 set_isot_val("125", 3.62174E-03);
894 set_isot_val("224", 0.00014773545);
895 #undef set_isot_val
896
897 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH3Cl", ISOT)] = VAL
898 set_isot_val("215", .748937E+00);
899 set_isot_val("217", .239491E+00);
900 #undef set_isot_val
901
902 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("H2O2", ISOT)] = VAL
903 set_isot_val("1661", .994952E+00);
904 #undef set_isot_val
905
906 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("C2H2", ISOT)] = VAL
907 set_isot_val("1221", .977599E+00);
908 set_isot_val("1231", 2.19663E-02);
909 set_isot_val("1222", 3.04550E-04);
910 #undef set_isot_val
911
912 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("C2H6", ISOT)] = VAL
913 set_isot_val("1221", .976990E+00);
914 set_isot_val("1231", 2.19526E-02);
915 #undef set_isot_val
916
917 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("PH3", ISOT)] = VAL
918 set_isot_val("1111", .999533E+00);
919 #undef set_isot_val
920
921 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("COF2", ISOT)] = VAL
922 set_isot_val("269", .986544E+00);
923 set_isot_val("369", 1.10834E-02);
924 #undef set_isot_val
925
926 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("SF6", ISOT)] = VAL
927 set_isot_val("29", .950180E+00);
928 #undef set_isot_val
929
930 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("H2S", ISOT)] = VAL
931 set_isot_val("121", .949884E+00);
932 set_isot_val("141", 4.21369E-02);
933 set_isot_val("131", 7.49766E-03);
934 set_isot_val("122", 0.00029991625);
935 #undef set_isot_val
936
937 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HCOOH", ISOT)] = VAL
938 set_isot_val("126", .983898E+00);
939 set_isot_val("136", 0.010913149);
940 #undef set_isot_val
941
942 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("DCOOH", ISOT)] = VAL
943 set_isot_val("266", 0.00014755369);
944 #undef set_isot_val
945
946 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HCOOD", ISOT)] = VAL
947 set_isot_val("266", 0.00014755369);
948 #undef set_isot_val
949
950 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HO2", ISOT)] = VAL
951 set_isot_val("166", .995107E+00);
952 #undef set_isot_val
953
954 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("O", ISOT)] = VAL
955 set_isot_val("6", .997628E+00);
956 #undef set_isot_val
957
958 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("ClONO2", ISOT)] = VAL
959 set_isot_val("5646", .749570E+00);
960 set_isot_val("7646", .239694E+00);
961 #undef set_isot_val
962
963 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("NO+", ISOT)] = VAL
964 set_isot_val("46", .993974E+00);
965 #undef set_isot_val
966
967 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("OClO", ISOT)] = VAL
968 set_isot_val("656", 0.75509223);
969 set_isot_val("676", 0.24490632);
970 #undef set_isot_val
971
972 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("BrO", ISOT)] = VAL
973 set_isot_val("96", 0.50582466);
974 set_isot_val("16", 0.49431069);
975 #undef set_isot_val
976
977 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("H2SO4", ISOT)] = VAL
978 set_isot_val("126", 0.95060479);
979 #undef set_isot_val
980
981 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("Cl2O2", ISOT)] = VAL
982 set_isot_val("565", 0.57016427);
983 set_isot_val("765", 0.36982818);
984 #undef set_isot_val
985
986 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HOBr", ISOT)] = VAL
987 set_isot_val("169", .505579E+00);
988 set_isot_val("161", .491894E+00);
989 #undef set_isot_val
990
991 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("C2H4", ISOT)] = VAL
992 set_isot_val("221", .977294E+00);
993 set_isot_val("231", .219595E-01);
994 #undef set_isot_val
995
996 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH3OH", ISOT)] = VAL
997 set_isot_val("2161", .985930E+00);
998 #undef set_isot_val
999
1000 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH3Br", ISOT)] = VAL
1001 set_isot_val("219", .500995E+00);
1002 set_isot_val("211", .487433E+00);
1003 #undef set_isot_val
1004
1005 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH3CN", ISOT)] = VAL
1006 set_isot_val("2124", .973866E+00);
1007 set_isot_val("3124", .102683e-01);
1008 set_isot_val("2134", .102683e-01);
1009 set_isot_val("2125", .347136e-02);
1010 #undef set_isot_val
1011
1012 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH2DCN", ISOT)] = VAL
1013 set_isot_val("224", .441185e-03);
1014 #undef set_isot_val
1015
1016 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CF4", ISOT)] = VAL
1017 set_isot_val("29", .988890E+00);
1018 #undef set_isot_val
1019
1020 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HC3N", ISOT)] = VAL
1021 set_isot_val("12224", .963346E+00);
1022 set_isot_val("12234", .106852e-01);
1023 set_isot_val("12324", .106852e-01);
1024 set_isot_val("13224", .106852e-01);
1025 set_isot_val("12225", .356272e-02);
1026 set_isot_val("22224", .144472e-03);
1027 #undef set_isot_val
1028
1029 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CS", ISOT)] = VAL
1030 set_isot_val("22", .939624E+00);
1031 set_isot_val("24", .416817E-01);
1032 set_isot_val("32", .105565E-01);
1033 set_isot_val("23", .741668E-02);
1034 #undef set_isot_val
1035
1036 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("HNC", ISOT)] = VAL
1037 set_isot_val("142", .985280e+00);
1038 set_isot_val("143", .109285e-01);
1039 set_isot_val("152", .364384e-02);
1040 set_isot_val("242", .147761e-03);
1041 #undef set_isot_val
1042
1043 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("SO", ISOT)] = VAL
1044 set_isot_val("26", .950605e+00);
1045 set_isot_val("46", .420727e-01);
1046 set_isot_val("28", .194089e-02);
1047 #undef set_isot_val
1048
1049 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("C3H8", ISOT)] = VAL
1050 set_isot_val("21", 9.66290e-01);
1051 #undef set_isot_val
1052
1053 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("H2", ISOT)] = VAL
1054 set_isot_val("11", .999688E+00);
1055 set_isot_val("12", 3.11432E-04);
1056 #undef set_isot_val
1057
1058 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("H", ISOT)] = VAL
1059 set_isot_val("1", 1.00);
1060 #undef set_isot_val
1061
1062 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("He", ISOT)] = VAL
1063 set_isot_val("4", 1.00);
1064 #undef set_isot_val
1065
1066 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("Ar", ISOT)] = VAL
1067 set_isot_val("8", 1.00);
1068 #undef set_isot_val
1069
1070 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("C4H2", ISOT)] = VAL
1071 set_isot_val("2211", .955998E+00);
1072 #undef set_isot_val
1073
1074 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("SO3", ISOT)] = VAL
1075 set_isot_val("26", .943400E+00);
1076 #undef set_isot_val
1077
1078 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CS2", ISOT)] = VAL
1079 set_isot_val("222", 8.92811E-01);
1080 set_isot_val("224", 7.92600E-02);
1081 set_isot_val("223", 1.40940E-02);
1082 set_isot_val("232", 1.03100E-02);
1083 #undef set_isot_val
1084
1085 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("C2N2", ISOT)] = VAL
1086 set_isot_val("4224", 9.70752E-01);
1087 #undef set_isot_val
1088
1089 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("COCl2", ISOT)] = VAL
1090 set_isot_val("2655", 5.66392E-01);
1091 set_isot_val("2657", 3.62235E-01);
1092 #undef set_isot_val
1093
1094 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH3F", ISOT)] = VAL
1095 set_isot_val("219", 9.88428E-01);
1096 #undef set_isot_val
1097
1098 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("GeH4", ISOT)] = VAL
1099 set_isot_val("411", 3.65172E-01);
1100 set_isot_val("211", 2.74129E-01);
1101 set_isot_val("011", 2.05072E-01);
1102 set_isot_val("311", 7.75517E-01);
1103 set_isot_val("611", 7.75517E-01);
1104 #undef set_isot_val
1105
1106 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("CH3I", ISOT)] = VAL
1107 set_isot_val("217", 9.88428E-01);
1108 #undef set_isot_val
1109
1110 #define set_isot_val(ISOT, VAL) isotopologue_ratios.data[find_species_index("NF3", ISOT)] = VAL
1111 set_isot_val("4999", 9.96337E-01);
1112 #undef set_isot_val
1113
1114 return isotopologue_ratios;
1115}
1116
1127constexpr Numeric mean_mass(Species spec, const IsotopologueRatios& ir) noexcept {
1128 Numeric sum_rm=0;
1129 Numeric sum_r =0;
1130 for (std::size_t i=IsotopologuesStart[std::size_t(spec)]; i <IsotopologuesStart[std::size_t(spec) + 1]; i++) {
1131 if (not nonstd::isnan(Isotopologues[i].mass) and not nonstd::isnan(ir[i])) {
1132 sum_rm += ir[i] * Isotopologues[i].mass;
1133 sum_r += ir[i];
1134 }
1135 }
1136 if (sum_r not_eq 0) return sum_rm / sum_r;
1137 return std::numeric_limits<Numeric>::signaling_NaN();
1138}
1139
1149String update_isot_name(const String& old_name);
1150
1151constexpr bool all_have_ratio(const Species spec, const IsotopologueRatios& ir) noexcept {
1152 for (std::size_t i=IsotopologuesStart[std::size_t(spec)]; i<IsotopologuesStart[std::size_t(spec) + 1]; i++) {
1153 if (not Isotopologues[i].joker() and not is_predefined_model(Isotopologues[i]) and nonstd::isnan(ir[i])) {
1154 return false;
1155 }
1156 }
1157 return true;
1158}
1159
1160std::pair<ArrayOfString, ArrayOfString> names_of_have_and_havenot_ratio(const Species spec, const IsotopologueRatios& ir) noexcept;
1161} // namespace Species
1162
1164
1166
1168
1170
1171#endif // isotopologues_h
This can be used to make arrays out of anything.
Definition array.h:31
#define ARTS_NOEXCEPT
Definition debug.h:83
#define ARTS_ASSERT(condition,...)
Definition debug.h:86
#define ARTS_USER_ERROR_IF(condition,...)
Definition debug.h:137
constexpr bool good_enum(EnumType x) noexcept
Checks if the enum number is good.
Definition enums.h:21
#define deal_with_spec(SPEC)
#define set_isot_val(ISOT, VAL)
This file contains the definition of String, the ARTS string class.
my_basic_string< char > String
The String type for ARTS.
Definition mystring.h:199
String isotopologues_names(Species spec)
consteval std::size_t count_isotopologues() noexcept
constexpr bool all_have_ratio(const Species spec, const IsotopologueRatios &ir) noexcept
consteval std::array< std::size_t, std::size_t(Species::FINAL)+1 > start_positions() noexcept
constexpr Numeric mean_mass(Species spec, const IsotopologueRatios &ir) noexcept
constexpr const IsotopeRecord & select_joker(Species spec) noexcept
constexpr bool is_predefined_model(const IsotopeRecord &ir) noexcept
constexpr std::array Isotopologues
A list of all ARTS isotopologues, note how the species enum class input HAS to be sorted.
constexpr bool is_normal_isotopologue(const IsotopeRecord &ir) noexcept
constexpr bool same_or_joker(const IsotopeRecord &ir1, const IsotopeRecord &ir2) noexcept
constexpr auto IsotopologuesStart
std::pair< ArrayOfString, ArrayOfString > names_of_have_and_havenot_ratio(const Species spec, const IsotopologueRatios &ir) noexcept
consteval std::array< IsotopeRecord, count_isotopologues< spec >()> isotopologues() noexcept
constexpr IsotopologueRatios isotopologue_ratiosInitFromBuiltin()
String update_isot_name(const String &old_name)
Updates the name of the isotopologue based on updates of the isotopologues.
String predefined_model_names() noexcept
constexpr const IsotopeRecord & select(Species spec, const std::string_view isotname) noexcept
constexpr Index find_species_index(const Species spec, const std::string_view isot) noexcept
constexpr std::string_view Joker
constexpr int isdigit(int ch) noexcept
Definition nonstd.h:24
constexpr bool isnan(double d) noexcept
Definition nonstd.h:53
Struct containing all information needed about one isotope.
String FullName() const noexcept
Index gi
The degeneracy of states of the molecule. It is -1 if not defined.
Species spec
Species type as defined in species.h.
Numeric mass
The mass of the isotope in units of grams per mol. It is Nan if not defined.
std::string_view isotname
A custom name that is unique for this Species type.
constexpr bool joker() const noexcept
friend std::ostream & operator<<(std::ostream &os, const IsotopeRecord &ir)
constexpr IsotopeRecord(Species spec_, const std::string_view isotname_=Joker, Numeric mass_=std::numeric_limits< Numeric >::quiet_NaN(), Index gi_=-1) noexcept
constexpr IsotopeRecord() noexcept
constexpr bool OK() const noexcept
constexpr bool operator==(const IsotopeRecord &that) const noexcept
constexpr bool operator!=(T x) const noexcept
constexpr bool operator==(const std::string_view specstr) const noexcept
A comparison with pure named string (this is not an exact comparison)
constexpr bool all_isotopes_have_a_value() const noexcept
friend std::ostream & operator<<(std::ostream &os, const IsotopologueRatios &iso_rat)
constexpr Numeric operator[](const IsotopeRecord &ir) const
constexpr IsotopologueRatios() noexcept
constexpr Numeric operator[](const Index spec_ind) const ARTS_NOEXCEPT
std::array< Numeric, maxsize > data
static constexpr Index maxsize