diff --git a/examples/arts-catalogue-data/cia/cia.py b/examples/arts-catalogue-data/cia/cia.py
index 38b6619e9c..4c749ac265 100644
--- a/examples/arts-catalogue-data/cia/cia.py
+++ b/examples/arts-catalogue-data/cia/cia.py
@@ -58,7 +58,7 @@
set so that our automatic agenda routine can do its work
"""
-ws.absorption_bands = []
+ws.absorption_bands = {}
"""
diff --git a/examples/arts-catalogue-data/lines/lines.py b/examples/arts-catalogue-data/lines/lines.py
index 5d1cd1455a..5619bea1da 100644
--- a/examples/arts-catalogue-data/lines/lines.py
+++ b/examples/arts-catalogue-data/lines/lines.py
@@ -135,12 +135,16 @@
"""
ws.jacobian_targets = pyarts.arts.JacobianTargets()
-ws.frequency_grid = np.linspace(40e9, 120e9, 1001) # Frequencies between 40 and 120 GHz
+ws.frequency_grid = np.linspace(
+ 40e9, 120e9, 11
+) # Frequencies between 40 and 120 GHz
ws.ray_path_point # No particular POSLOS
ws.atmospheric_pointInit()
ws.atmospheric_point.temperature = 295 # At room temperature
ws.atmospheric_point.pressure = 1e5 # At 1 bar
-ws.atmospheric_point[ws.absorption_species[0]] = 0.21 # At 21% atmospheric Oxygen
+ws.atmospheric_point[ws.absorption_species[0]] = (
+ 0.21 # At 21% atmospheric Oxygen
+)
# Call the agenda with inputs above
ws.propagation_matrix_agendaExecute()
@@ -163,8 +167,19 @@
# ws.propagation_matrix.savexml("lines_test_result.xml", type="ascii")
# test that we are still OK
-propagation_matrix_agenda = \
- pyarts.arts.PropmatVector.fromxml("lines_test_result.xml")
assert np.allclose(
- propagation_matrix_agenda, ws.propagation_matrix
+ [
+ 8.92664373e-06,
+ 2.88107577e-05,
+ 1.55470464e-03,
+ 1.55360514e-03,
+ 5.57640699e-05,
+ 2.51926728e-05,
+ 1.72272988e-05,
+ 1.43453057e-05,
+ 1.46251762e-05,
+ 2.71389841e-05,
+ 1.97382384e-04,
+ ],
+ ws.propagation_matrix[:, 0],
), "O2 Absorption has changed"
diff --git a/examples/arts-catalogue-data/lines/lines_test_result.xml b/examples/arts-catalogue-data/lines/lines_test_result.xml
deleted file mode 100644
index 6bf225238c..0000000000
--- a/examples/arts-catalogue-data/lines/lines_test_result.xml
+++ /dev/null
@@ -1,1006 +0,0 @@
-
-
-
-9.02213429888367e-06 0 0 0 0 0 0
-9.09276486572987e-06 0 0 0 0 0 0
-9.16447375946901e-06 0 0 0 0 0 0
-9.23728175112035e-06 0 0 0 0 0 0
-9.31121011111257e-06 0 0 0 0 0 0
-9.38628062391456e-06 0 0 0 0 0 0
-9.46251560317747e-06 0 0 0 0 0 0
-9.53993790740934e-06 0 0 0 0 0 0
-9.61857095620397e-06 0 0 0 0 0 0
-9.6984387470473e-06 0 0 0 0 0 0
-9.77956587272538e-06 0 0 0 0 0 0
-9.86197753935921e-06 0 0 0 0 0 0
-9.94569958509289e-06 0 0 0 0 0 0
-1.00307584994634e-05 0 0 0 0 0 0
-1.01171814434805e-05 0 0 0 0 0 0
-1.02049962704482e-05 0 0 0 0 0 0
-1.02942315475599e-05 0 0 0 0 0 0
-1.03849165783e-05 0 0 0 0 0 0
-1.04770814256898e-05 0 0 0 0 0 0
-1.05707569364126e-05 0 0 0 0 0 0
-1.06659747658596e-05 0 0 0 0 0 0
-1.07627674041362e-05 0 0 0 0 0 0
-1.08611682030736e-05 0 0 0 0 0 0
-1.09612114042908e-05 0 0 0 0 0 0
-1.10629321683566e-05 0 0 0 0 0 0
-1.11663666051004e-05 0 0 0 0 0 0
-1.12715518051276e-05 0 0 0 0 0 0
-1.13785258725959e-05 0 0 0 0 0 0
-1.14873279593112e-05 0 0 0 0 0 0
-1.15979983002073e-05 0 0 0 0 0 0
-1.1710578250276e-05 0 0 0 0 0 0
-1.1825110323018e-05 0 0 0 0 0 0
-1.19416382304885e-05 0 0 0 0 0 0
-1.20602069250173e-05 0 0 0 0 0 0
-1.21808626426861e-05 0 0 0 0 0 0
-1.23036529486521e-05 0 0 0 0 0 0
-1.24286267844099e-05 0 0 0 0 0 0
-1.25558345170927e-05 0 0 0 0 0 0
-1.26853279909169e-05 0 0 0 0 0 0
-1.28171605808816e-05 0 0 0 0 0 0
-1.29513872488425e-05 0 0 0 0 0 0
-1.30880646020843e-05 0 0 0 0 0 0
-1.32272509545279e-05 0 0 0 0 0 0
-1.33690063907118e-05 0 0 0 0 0 0
-1.35133928327021e-05 0 0 0 0 0 0
-1.36604741100907e-05 0 0 0 0 0 0
-1.38103160332543e-05 0 0 0 0 0 0
-1.3962986470058e-05 0 0 0 0 0 0
-1.41185554261993e-05 0 0 0 0 0 0
-1.42770951294022e-05 0 0 0 0 0 0
-1.4438680117685e-05 0 0 0 0 0 0
-1.46033873319415e-05 0 0 0 0 0 0
-1.47712962130936e-05 0 0 0 0 0 0
-1.49424888040884e-05 0 0 0 0 0 0
-1.51170498570377e-05 0 0 0 0 0 0
-1.52950669458164e-05 0 0 0 0 0 0
-1.54766305844609e-05 0 0 0 0 0 0
-1.56618343517363e-05 0 0 0 0 0 0
-1.58507750222687e-05 0 0 0 0 0 0
-1.60435527046696e-05 0 0 0 0 0 0
-1.6240270987116e-05 0 0 0 0 0 0
-1.64410370908864e-05 0 0 0 0 0 0
-1.6645962032394e-05 0 0 0 0 0 0
-1.68551607943073e-05 0 0 0 0 0 0
-1.70687525063964e-05 0 0 0 0 0 0
-1.72868606368016e-05 0 0 0 0 0 0
-1.75096131944844e-05 0 0 0 0 0 0
-1.77371429436885e-05 0 0 0 0 0 0
-1.79695876313204e-05 0 0 0 0 0 0
-1.82070902282425e-05 0 0 0 0 0 0
-1.84497991855729e-05 0 0 0 0 0 0
-1.8697868707192e-05 0 0 0 0 0 0
-1.89514590397842e-05 0 0 0 0 0 0
-1.92107367818756e-05 0 0 0 0 0 0
-1.94758752134895e-05 0 0 0 0 0 0
-1.97470546482133e-05 0 0 0 0 0 0
-2.0024462809669e-05 0 0 0 0 0 0
-2.03082952346011e-05 0 0 0 0 0 0
-2.05987557050397e-05 0 0 0 0 0 0
-2.08960567122757e-05 0 0 0 0 0 0
-2.12004199556866e-05 0 0 0 0 0 0
-2.15120768797807e-05 0 0 0 0 0 0
-2.1831269253194e-05 0 0 0 0 0 0
-2.21582497937467e-05 0 0 0 0 0 0
-2.24932828440724e-05 0 0 0 0 0 0
-2.28366451027389e-05 0 0 0 0 0 0
-2.31886264161925e-05 0 0 0 0 0 0
-2.35495306372807e-05 0 0 0 0 0 0
-2.39196765565403e-05 0 0 0 0 0 0
-2.42993989129279e-05 0 0 0 0 0 0
-2.46890494912537e-05 0 0 0 0 0 0
-2.50889983142916e-05 0 0 0 0 0 0
-2.54996349383143e-05 0 0 0 0 0 0
-2.59213698612903e-05 0 0 0 0 0 0
-2.63546360523445e-05 0 0 0 0 0 0
-2.67998906078636e-05 0 0 0 0 0 0
-2.72576165321749e-05 0 0 0 0 0 0
-2.77283246286212e-05 0 0 0 0 0 0
-2.82125554735205e-05 0 0 0 0 0 0
-2.87108814405014e-05 0 0 0 0 0 0
-2.92239087606634e-05 0 0 0 0 0 0
-2.97522796569363e-05 0 0 0 0 0 0
-3.02966746751537e-05 0 0 0 0 0 0
-3.08578154200165e-05 0 0 0 0 0 0
-3.14364679407579e-05 0 0 0 0 0 0
-3.20334469546104e-05 0 0 0 0 0 0
-3.26496209467518e-05 0 0 0 0 0 0
-3.32859180093823e-05 0 0 0 0 0 0
-3.39433321817481e-05 0 0 0 0 0 0
-3.4622930088694e-05 0 0 0 0 0 0
-3.53258578066931e-05 0 0 0 0 0 0
-3.60533479950587e-05 0 0 0 0 0 0
-3.68067273325173e-05 0 0 0 0 0 0
-3.75874242441857e-05 0 0 0 0 0 0
-3.83969769411373e-05 0 0 0 0 0 0
-3.92370420128579e-05 0 0 0 0 0 0
-4.01094040911243e-05 0 0 0 0 0 0
-4.10159871557496e-05 0 0 0 0 0 0
-4.19588676865083e-05 0 0 0 0 0 0
-4.29402892544922e-05 0 0 0 0 0 0
-4.39626778085752e-05 0 0 0 0 0 0
-4.50286572991355e-05 0 0 0 0 0 0
-4.61410662548488e-05 0 0 0 0 0 0
-4.73029766718822e-05 0 0 0 0 0 0
-4.85177162030986e-05 0 0 0 0 0 0
-4.97888931248076e-05 0 0 0 0 0 0
-5.1120422110052e-05 0 0 0 0 0 0
-5.25165490505329e-05 0 0 0 0 0 0
-5.39818754636066e-05 0 0 0 0 0 0
-5.55213857240681e-05 0 0 0 0 0 0
-5.71404807177086e-05 0 0 0 0 0 0
-5.88450182404032e-05 0 0 0 0 0 0
-6.06413556715651e-05 0 0 0 0 0 0
-6.25363886465036e-05 0 0 0 0 0 0
-6.45375836280609e-05 0 0 0 0 0 0
-6.66530101549974e-05 0 0 0 0 0 0
-6.88913830985266e-05 0 0 0 0 0 0
-7.12621204658259e-05 0 0 0 0 0 0
-7.37754098195943e-05 0 0 0 0 0 0
-7.6442266540422e-05 0 0 0 0 0 0
-7.92745711037521e-05 0 0 0 0 0 0
-8.22850909052523e-05 0 0 0 0 0 0
-8.54875107994535e-05 0 0 0 0 0 0
-8.88964962491714e-05 0 0 0 0 0 0
-9.25277877756758e-05 0 0 0 0 0 0
-9.63982928344224e-05 0 0 0 0 0 0
-0.000100526132201369 0 0 0 0 0 0
-0.000104930629334001 0 0 0 0 0 0
-0.000109632284212808 0 0 0 0 0 0
-0.000114652801490848 0 0 0 0 0 0
-0.000120015210744511 0 0 0 0 0 0
-0.000125744037985873 0 0 0 0 0 0
-0.000131865425975433 0 0 0 0 0 0
-0.000138407120829045 0 0 0 0 0 0
-0.000145398346027813 0 0 0 0 0 0
-0.000152869693307835 0 0 0 0 0 0
-0.000160853169837817 0 0 0 0 0 0
-0.000169382419370043 0 0 0 0 0 0
-0.000178492967031379 0 0 0 0 0 0
-0.000188222272658148 0 0 0 0 0 0
-0.000198609500995737 0 0 0 0 0 0
-0.000209695152931551 0 0 0 0 0 0
-0.000221520851172426 0 0 0 0 0 0
-0.000234129477396927 0 0 0 0 0 0
-0.000247565555322536 0 0 0 0 0 0
-0.000261875506227676 0 0 0 0 0 0
-0.000277107427222151 0 0 0 0 0 0
-0.000293310393318449 0 0 0 0 0 0
-0.000310533699372809 0 0 0 0 0 0
-0.000328826564551021 0 0 0 0 0 0
-0.00034823846216086 0 0 0 0 0 0
-0.000368819652235489 0 0 0 0 0 0
-0.000390621173793578 0 0 0 0 0 0
-0.000413693835385166 0 0 0 0 0 0
-0.00043808647575424 0 0 0 0 0 0
-0.000463844366905678 0 0 0 0 0 0
-0.000491008539591939 0 0 0 0 0 0
-0.000519615999710617 0 0 0 0 0 0
-0.000549699891383476 0 0 0 0 0 0
-0.000581288465970793 0 0 0 0 0 0
-0.000614402558002551 0 0 0 0 0 0
-0.000649052606851178 0 0 0 0 0 0
-0.000685237024926459 0 0 0 0 0 0
-0.00072294314155594 0 0 0 0 0 0
-0.000762150291936857 0 0 0 0 0 0
-0.000802833049815647 0 0 0 0 0 0
-0.000844962370730889 0 0 0 0 0 0
-0.000888503825873378 0 0 0 0 0 0
-0.000933414192203646 0 0 0 0 0 0
-0.000979638862652228 0 0 0 0 0 0
-0.00102711191414581 0 0 0 0 0 0
-0.00107575866278156 0 0 0 0 0 0
-0.00112549865110122 0 0 0 0 0 0
-0.00117624667688847 0 0 0 0 0 0
-0.00122791093925126 0 0 0 0 0 0
-0.00128038953870647 0 0 0 0 0 0
-0.00133356781331158 0 0 0 0 0 0
-0.0013873184339569 0 0 0 0 0 0
-0.00144150429387581 0 0 0 0 0 0
-0.00149598244723087 0 0 0 0 0 0
-0.00155060697965228 0 0 0 0 0 0
-0.00160522993878245 0 0 0 0 0 0
-0.0016597013156227 0 0 0 0 0 0
-0.00171387011454135 0 0 0 0 0 0
-0.00176758798021053 0 0 0 0 0 0
-0.00182071506463228 0 0 0 0 0 0
-0.00187312610531113 0 0 0 0 0 0
-0.00192471428385355 0 0 0 0 0 0
-0.00197539165029028 0 0 0 0 0 0
-0.00202508690459656 0 0 0 0 0 0
-0.00207374275302395 0 0 0 0 0 0
-0.00212131494448149 0 0 0 0 0 0
-0.00216777354034222 0 0 0 0 0 0
-0.00221310504747308 0 0 0 0 0 0
-0.00225731305308744 0 0 0 0 0 0
-0.00230041561442294 0 0 0 0 0 0
-0.00234243948754307 0 0 0 0 0 0
-0.00238341314729953 0 0 0 0 0 0
-0.00242336125492955 0 0 0 0 0 0
-0.00246230231298253 0 0 0 0 0 0
-0.00250024926692723 0 0 0 0 0 0
-0.00253721098783617 0 0 0 0 0 0
-0.00257319204351176 0 0 0 0 0 0
-0.002608189328046 0 0 0 0 0 0
-0.00264218638415394 0 0 0 0 0 0
-0.00267514837963071 0 0 0 0 0 0
-0.00270702147775246 0 0 0 0 0 0
-0.00273773922827171 0 0 0 0 0 0
-0.00276723599418824 0 0 0 0 0 0
-0.00279546444420793 0 0 0 0 0 0
-0.00282241209922746 0 0 0 0 0 0
-0.00284811173400309 0 0 0 0 0 0
-0.00287264221397877 0 0 0 0 0 0
-0.00289611938328498 0 0 0 0 0 0
-0.00291867972582916 0 0 0 0 0 0
-0.00294046155636396 0 0 0 0 0 0
-0.00296158881952174 0 0 0 0 0 0
-0.00298216122559193 0 0 0 0 0 0
-0.00300225205658402 0 0 0 0 0 0
-0.00302191244112718 0 0 0 0 0 0
-0.00304117906186892 0 0 0 0 0 0
-0.00306008161876824 0 0 0 0 0 0
-0.00307864694606977 0 0 0 0 0 0
-0.0030968980753342 0 0 0 0 0 0
-0.00311484816600429 0 0 0 0 0 0
-0.00313249059008853 0 0 0 0 0 0
-0.00314978733125927 0 0 0 0 0 0
-0.00316665827830934 0 0 0 0 0 0
-0.00318297409427922 0 0 0 0 0 0
-0.00319855517082401 0 0 0 0 0 0
-0.00321317861697112 0 0 0 0 0 0
-0.00322659410299733 0 0 0 0 0 0
-0.00323854763657602 0 0 0 0 0 0
-0.00324881023979443 0 0 0 0 0 0
-0.00325720659134143 0 0 0 0 0 0
-0.00326363772390992 0 0 0 0 0 0
-0.00326809240727224 0 0 0 0 0 0
-0.00327064403781393 0 0 0 0 0 0
-0.00327143321783843 0 0 0 0 0 0
-0.00327063974472817 0 0 0 0 0 0
-0.00326845026845482 0 0 0 0 0 0
-0.0032650285315775 0 0 0 0 0 0
-0.003260493657658 0 0 0 0 0 0
-0.00325490896149975 0 0 0 0 0 0
-0.00324828035948447 0 0 0 0 0 0
-0.0032405609381081 0 0 0 0 0 0
-0.00323165747940485 0 0 0 0 0 0
-0.00322143584741941 0 0 0 0 0 0
-0.0032097243781773 0 0 0 0 0 0
-0.003196316568563 0 0 0 0 0 0
-0.00318097533825887 0 0 0 0 0 0
-0.00316344055159103 0 0 0 0 0 0
-0.00314343983659921 0 0 0 0 0 0
-0.00312070112106621 0 0 0 0 0 0
-0.0030949647455494 0 0 0 0 0 0
-0.00306599383192163 0 0 0 0 0 0
-0.0030335831777492 0 0 0 0 0 0
-0.00299756815267699 0 0 0 0 0 0
-0.00295783494120895 0 0 0 0 0 0
-0.00291433193574244 0 0 0 0 0 0
-0.00286708006414821 0 0 0 0 0 0
-0.00281617871111229 0 0 0 0 0 0
-0.00276180457250197 0 0 0 0 0 0
-0.00270420305499635 0 0 0 0 0 0
-0.00264367442960787 0 0 0 0 0 0
-0.0025805583403208 0 0 0 0 0 0
-0.00251521969200296 0 0 0 0 0 0
-0.00244803692212733 0 0 0 0 0 0
-0.00237939166695275 0 0 0 0 0 0
-0.00230965825342674 0 0 0 0 0 0
-0.00223919260425111 0 0 0 0 0 0
-0.0021683220468498 0 0 0 0 0 0
-0.00209733858312258 0 0 0 0 0 0
-0.00202649740696062 0 0 0 0 0 0
-0.00195602022198912 0 0 0 0 0 0
-0.00188610073775055 0 0 0 0 0 0
-0.00181690918705679 0 0 0 0 0 0
-0.00174859424578477 0 0 0 0 0 0
-0.00168128325004514 0 0 0 0 0 0
-0.0016150832239265 0 0 0 0 0 0
-0.00155008470834075 0 0 0 0 0 0
-0.00148636808178149 0 0 0 0 0 0
-0.00142400974964711 0 0 0 0 0 0
-0.00136308510716097 0 0 0 0 0 0
-0.00130366705841781 0 0 0 0 0 0
-0.00124582179403499 0 0 0 0 0 0
-0.00118960531399493 0 0 0 0 0 0
-0.00113506344711561 0 0 0 0 0 0
-0.00108223536825028 0 0 0 0 0 0
-0.00103115788555507 0 0 0 0 0 0
-0.00098186709139529 0 0 0 0 0 0
-0.00093439582024854 0 0 0 0 0 0
-0.000888768317330867 0 0 0 0 0 0
-0.000844995397810347 0 0 0 0 0 0
-0.000803072882751155 0 0 0 0 0 0
-0.000762983764813198 0 0 0 0 0 0
-0.000724702199494921 0 0 0 0 0 0
-0.000688196688228801 0 0 0 0 0 0
-0.00065343101383769 0 0 0 0 0 0
-0.000620363474722596 0 0 0 0 0 0
-0.00058894617945336 0 0 0 0 0 0
-0.000559125827530871 0 0 0 0 0 0
-0.000530845998251852 0 0 0 0 0 0
-0.000504049716460322 0 0 0 0 0 0
-0.000478680902776309 0 0 0 0 0 0
-0.000454684236238613 0 0 0 0 0 0
-0.000432004126113839 0 0 0 0 0 0
-0.00041058399066539 0 0 0 0 0 0
-0.000390366585022232 0 0 0 0 0 0
-0.000371295182767332 0 0 0 0 0 0
-0.000353314769505891 0 0 0 0 0 0
-0.000336372495613068 0 0 0 0 0 0
-0.000320417284132869 0 0 0 0 0 0
-0.000305399123460089 0 0 0 0 0 0
-0.000291268714059596 0 0 0 0 0 0
-0.000277977752851495 0 0 0 0 0 0
-0.000265479600472011 0 0 0 0 0 0
-0.000253729816039257 0 0 0 0 0 0
-0.000242686214439761 0 0 0 0 0 0
-0.000232308504950867 0 0 0 0 0 0
-0.000222557864097421 0 0 0 0 0 0
-0.000213396776252247 0 0 0 0 0 0
-0.000204789210457491 0 0 0 0 0 0
-0.0001967009327375 0 0 0 0 0 0
-0.000189099682146655 0 0 0 0 0 0
-0.000181955083665794 0 0 0 0 0 0
-0.000175238384286354 0 0 0 0 0 0
-0.000168922208499347 0 0 0 0 0 0
-0.000162980474228723 0 0 0 0 0 0
-0.000157388463529081 0 0 0 0 0 0
-0.000152122930714302 0 0 0 0 0 0
-0.000147162128554663 0 0 0 0 0 0
-0.000142485718733031 0 0 0 0 0 0
-0.000138074623801487 0 0 0 0 0 0
-0.000133910906171424 0 0 0 0 0 0
-0.000129977718680595 0 0 0 0 0 0
-0.000126259307266159 0 0 0 0 0 0
-0.000122741011846047 0 0 0 0 0 0
-0.000119409225209009 0 0 0 0 0 0
-0.000116251310134939 0 0 0 0 0 0
-0.000113255505877563 0 0 0 0 0 0
-0.000110410855917122 0 0 0 0 0 0
-0.000107707166211228 0 0 0 0 0 0
-0.000105134979476452 0 0 0 0 0 0
-0.000102685544034453 0 0 0 0 0 0
-0.000100350766485843 0 0 0 0 0 0
-9.81231535841846e-05 0 0 0 0 0 0
-9.59957568781866e-05 0 0 0 0 0 0
-9.39621298654057e-05 0 0 0 0 0 0
-9.20162973961624e-05 0 0 0 0 0 0
-9.01527298089272e-05 0 0 0 0 0 0
-8.83663143884616e-05 0 0 0 0 0 0
-8.66523222201744e-05 0 0 0 0 0 0
-8.50063739229635e-05 0 0 0 0 0 0
-8.34244091035307e-05 0 0 0 0 0 0
-8.19026617520373e-05 0 0 0 0 0 0
-8.04376401818464e-05 0 0 0 0 0 0
-7.9026108428648e-05 0 0 0 0 0 0
-7.76650669868622e-05 0 0 0 0 0 0
-7.63517329501926e-05 0 0 0 0 0 0
-7.50835210954669e-05 0 0 0 0 0 0
-7.3858027319413e-05 0 0 0 0 0 0
-7.26730146472253e-05 0 0 0 0 0 0
-7.1526400952874e-05 0 0 0 0 0 0
-7.04162473302639e-05 0 0 0 0 0 0
-6.93407466412849e-05 0 0 0 0 0 0
-6.82982124983875e-05 0 0 0 0 0 0
-6.72870692444268e-05 0 0 0 0 0 0
-6.6305843269713e-05 0 0 0 0 0 0
-6.53531555626062e-05 0 0 0 0 0 0
-6.44277150986444e-05 0 0 0 0 0 0
-6.35283126846812e-05 0 0 0 0 0 0
-6.26538150769076e-05 0 0 0 0 0 0
-6.18031593743871e-05 0 0 0 0 0 0
-6.09753477322641e-05 0 0 0 0 0 0
-6.01694423758631e-05 0 0 0 0 0 0
-5.93845608435005e-05 0 0 0 0 0 0
-5.86198714177444e-05 0 0 0 0 0 0
-5.78745888008386e-05 0 0 0 0 0 0
-5.71479701680697e-05 0 0 0 0 0 0
-5.64393117293945e-05 0 0 0 0 0 0
-5.57479458472427e-05 0 0 0 0 0 0
-5.50732386516625e-05 0 0 0 0 0 0
-5.44145880211538e-05 0 0 0 0 0 0
-5.3771421784205e-05 0 0 0 0 0 0
-5.31431960315278e-05 0 0 0 0 0 0
-5.25293934826725e-05 0 0 0 0 0 0
-5.19295218962649e-05 0 0 0 0 0 0
-5.13431125378834e-05 0 0 0 0 0 0
-5.07697187249248e-05 0 0 0 0 0 0
-5.02089144619956e-05 0 0 0 0 0 0
-4.96602931716621e-05 0 0 0 0 0 0
-4.91234665185494e-05 0 0 0 0 0 0
-4.85980633210341e-05 0 0 0 0 0 0
-4.80837285435263e-05 0 0 0 0 0 0
-4.75801223624433e-05 0 0 0 0 0 0
-4.70869192996188e-05 0 0 0 0 0 0
-4.66038074175781e-05 0 0 0 0 0 0
-4.61304875716968e-05 0 0 0 0 0 0
-4.56666727147169e-05 0 0 0 0 0 0
-4.52120872494591e-05 0 0 0 0 0 0
-4.47664664258847e-05 0 0 0 0 0 0
-4.43295557789444e-05 0 0 0 0 0 0
-4.39011106039251e-05 0 0 0 0 0 0
-4.34808954662666e-05 0 0 0 0 0 0
-4.30686837430723e-05 0 0 0 0 0 0
-4.26642571937796e-05 0 0 0 0 0 0
-4.22674055576767e-05 0 0 0 0 0 0
-4.18779261761655e-05 0 0 0 0 0 0
-4.14956236378601e-05 0 0 0 0 0 0
-4.11203094447834e-05 0 0 0 0 0 0
-4.07518016980873e-05 0 0 0 0 0 0
-4.03899248018587e-05 0 0 0 0 0 0
-4.00345091837092e-05 0 0 0 0 0 0
-3.96853910309556e-05 0 0 0 0 0 0
-3.93424120413044e-05 0 0 0 0 0 0
-3.90054191870506e-05 0 0 0 0 0 0
-3.86742644918763e-05 0 0 0 0 0 0
-3.8348804819419e-05 0 0 0 0 0 0
-3.8028901672841e-05 0 0 0 0 0 0
-3.77144210046952e-05 0 0 0 0 0 0
-3.74052330364388e-05 0 0 0 0 0 0
-3.71012120869931e-05 0 0 0 0 0 0
-3.6802236409797e-05 0 0 0 0 0 0
-3.65081880378402e-05 0 0 0 0 0 0
-3.62189526362014e-05 0 0 0 0 0 0
-3.59344193616504e-05 0 0 0 0 0 0
-3.56544807289021e-05 0 0 0 0 0 0
-3.53790324831457e-05 0 0 0 0 0 0
-3.51079734784898e-05 0 0 0 0 0 0
-3.48412055619936e-05 0 0 0 0 0 0
-3.45786334629782e-05 0 0 0 0 0 0
-3.43201646873248e-05 0 0 0 0 0 0
-3.40657094164945e-05 0 0 0 0 0 0
-3.38151804110148e-05 0 0 0 0 0 0
-3.35684929181974e-05 0 0 0 0 0 0
-3.33255645838658e-05 0 0 0 0 0 0
-3.30863153678845e-05 0 0 0 0 0 0
-3.28506674632952e-05 0 0 0 0 0 0
-3.26185452188765e-05 0 0 0 0 0 0
-3.23898750649543e-05 0 0 0 0 0 0
-3.21645854423022e-05 0 0 0 0 0 0
-3.19426067339772e-05 0 0 0 0 0 0
-3.17238711999488e-05 0 0 0 0 0 0
-3.15083129143855e-05 0 0 0 0 0 0
-3.12958677054693e-05 0 0 0 0 0 0
-3.10864730976202e-05 0 0 0 0 0 0
-3.08800682560148e-05 0 0 0 0 0 0
-3.06765939332921e-05 0 0 0 0 0 0
-3.04759924183444e-05 0 0 0 0 0 0
-3.02782074870977e-05 0 0 0 0 0 0
-3.00831843551898e-05 0 0 0 0 0 0
-2.98908696324605e-05 0 0 0 0 0 0
-2.9701211279172e-05 0 0 0 0 0 0
-2.95141585638812e-05 0 0 0 0 0 0
-2.93296620228931e-05 0 0 0 0 0 0
-2.9147673421222e-05 0 0 0 0 0 0
-2.89681457149981e-05 0 0 0 0 0 0
-2.87910330152546e-05 0 0 0 0 0 0
-2.86162905530355e-05 0 0 0 0 0 0
-2.844387464577e-05 0 0 0 0 0 0
-2.82737426648566e-05 0 0 0 0 0 0
-2.81058530044082e-05 0 0 0 0 0 0
-2.79401650511078e-05 0 0 0 0 0 0
-2.77766391551308e-05 0 0 0 0 0 0
-2.76152366020863e-05 0 0 0 0 0 0
-2.74559195859393e-05 0 0 0 0 0 0
-2.72986511828713e-05 0 0 0 0 0 0
-2.71433953260424e-05 0 0 0 0 0 0
-2.69901167812173e-05 0 0 0 0 0 0
-2.68387811232226e-05 0 0 0 0 0 0
-2.66893547132008e-05 0 0 0 0 0 0
-2.65418046766296e-05 0 0 0 0 0 0
-2.63960988820768e-05 0 0 0 0 0 0
-2.62522059206631e-05 0 0 0 0 0 0
-2.61100950862029e-05 0 0 0 0 0 0
-2.59697363559989e-05 0 0 0 0 0 0
-2.58311003722653e-05 0 0 0 0 0 0
-2.56941584241544e-05 0 0 0 0 0 0
-2.55588824303653e-05 0 0 0 0 0 0
-2.54252449223114e-05 0 0 0 0 0 0
-2.5293219027827e-05 0 0 0 0 0 0
-2.5162778455392e-05 0 0 0 0 0 0
-2.50338974788559e-05 0 0 0 0 0 0
-2.49065509226428e-05 0 0 0 0 0 0
-2.47807141474195e-05 0 0 0 0 0 0
-2.46563630362103e-05 0 0 0 0 0 0
-2.45334739809419e-05 0 0 0 0 0 0
-2.44120238694029e-05 0 0 0 0 0 0
-2.4291990072604e-05 0 0 0 0 0 0
-2.41733504325228e-05 0 0 0 0 0 0
-2.40560832502215e-05 0 0 0 0 0 0
-2.39401672743233e-05 0 0 0 0 0 0
-2.38255816898352e-05 0 0 0 0 0 0
-2.37123061073046e-05 0 0 0 0 0 0
-2.36003205522999e-05 0 0 0 0 0 0
-2.3489605455201e-05 0 0 0 0 0 0
-2.33801416412922e-05 0 0 0 0 0 0
-2.3271910321145e-05 0 0 0 0 0 0
-2.31648930812813e-05 0 0 0 0 0 0
-2.30590718751092e-05 0 0 0 0 0 0
-2.29544290141194e-05 0 0 0 0 0 0
-2.28509471593365e-05 0 0 0 0 0 0
-2.27486093130137e-05 0 0 0 0 0 0
-2.26473988105663e-05 0 0 0 0 0 0
-2.2547299312732e-05 0 0 0 0 0 0
-2.2448294797955e-05 0 0 0 0 0 0
-2.23503695549828e-05 0 0 0 0 0 0
-2.22535081756713e-05 0 0 0 0 0 0
-2.21576955479901e-05 0 0 0 0 0 0
-2.20629168492225e-05 0 0 0 0 0 0
-2.1969157539353e-05 0 0 0 0 0 0
-2.18764033546373e-05 0 0 0 0 0 0
-2.17846403013484e-05 0 0 0 0 0 0
-2.16938546496934e-05 0 0 0 0 0 0
-2.16040329278955e-05 0 0 0 0 0 0
-2.15151619164369e-05 0 0 0 0 0 0
-2.1427228642456e-05 0 0 0 0 0 0
-2.13402203742955e-05 0 0 0 0 0 0
-2.12541246161969e-05 0 0 0 0 0 0
-2.11689291031348e-05 0 0 0 0 0 0
-2.10846217957896e-05 0 0 0 0 0 0
-2.10011908756528e-05 0 0 0 0 0 0
-2.09186247402606e-05 0 0 0 0 0 0
-2.08369119985529e-05 0 0 0 0 0 0
-2.07560414663536e-05 0 0 0 0 0 0
-2.06760021619683e-05 0 0 0 0 0 0
-2.05967833018961e-05 0 0 0 0 0 0
-2.05183742966525e-05 0 0 0 0 0 0
-2.04407647466996e-05 0 0 0 0 0 0
-2.03639444384803e-05 0 0 0 0 0 0
-2.02879033405548e-05 0 0 0 0 0 0
-2.0212631599834e-05 0 0 0 0 0 0
-2.01381195379106e-05 0 0 0 0 0 0
-2.00643576474804e-05 0 0 0 0 0 0
-1.99913365888558e-05 0 0 0 0 0 0
-1.99190471865664e-05 0 0 0 0 0 0
-1.98474804260439e-05 0 0 0 0 0 0
-1.97766274503907e-05 0 0 0 0 0 0
-1.97064795572282e-05 0 0 0 0 0 0
-1.96370281956239e-05 0 0 0 0 0 0
-1.95682649630939e-05 0 0 0 0 0 0
-1.95001816026791e-05 0 0 0 0 0 0
-1.94327700000945e-05 0 0 0 0 0 0
-1.93660221809466e-05 0 0 0 0 0 0
-1.929993030802e-05 0 0 0 0 0 0
-1.92344866786295e-05 0 0 0 0 0 0
-1.91696837220371e-05 0 0 0 0 0 0
-1.91055139969312e-05 0 0 0 0 0 0
-1.90419701889659e-05 0 0 0 0 0 0
-1.89790451083618e-05 0 0 0 0 0 0
-1.89167316875621e-05 0 0 0 0 0 0
-1.88550229789465e-05 0 0 0 0 0 0
-1.87939121525989e-05 0 0 0 0 0 0
-1.8733392494129e-05 0 0 0 0 0 0
-1.86734574025455e-05 0 0 0 0 0 0
-1.861410038818e-05 0 0 0 0 0 0
-1.85553150706595e-05 0 0 0 0 0 0
-1.84970951769284e-05 0 0 0 0 0 0
-1.84394345393156e-05 0 0 0 0 0 0
-1.83823270936484e-05 0 0 0 0 0 0
-1.83257668774098e-05 0 0 0 0 0 0
-1.82697480279401e-05 0 0 0 0 0 0
-1.82142647806801e-05 0 0 0 0 0 0
-1.81593114674561e-05 0 0 0 0 0 0
-1.81048825148041e-05 0 0 0 0 0 0
-1.80509724423338e-05 0 0 0 0 0 0
-1.79975758611316e-05 0 0 0 0 0 0
-1.79446874721991e-05 0 0 0 0 0 0
-1.78923020649292e-05 0 0 0 0 0 0
-1.78404145156183e-05 0 0 0 0 0 0
-1.77890197860115e-05 0 0 0 0 0 0
-1.7738112921883e-05 0 0 0 0 0 0
-1.7687689051649e-05 0 0 0 0 0 0
-1.76377433850132e-05 0 0 0 0 0 0
-1.75882712116435e-05 0 0 0 0 0 0
-1.75392678998798e-05 0 0 0 0 0 0
-1.74907288954718e-05 0 0 0 0 0 0
-1.74426497203461e-05 0 0 0 0 0 0
-1.73950259714023e-05 0 0 0 0 0 0
-1.7347853319337e-05 0 0 0 0 0 0
-1.73011275074954e-05 0 0 0 0 0 0
-1.725484435075e-05 0 0 0 0 0 0
-1.72089997344048e-05 0 0 0 0 0 0
-1.71635896131262e-05 0 0 0 0 0 0
-1.71186100098984e-05 0 0 0 0 0 0
-1.70740570150038e-05 0 0 0 0 0 0
-1.70299267850274e-05 0 0 0 0 0 0
-1.69862155418843e-05 0 0 0 0 0 0
-1.69429195718713e-05 0 0 0 0 0 0
-1.69000352247403e-05 0 0 0 0 0 0
-1.6857558912794e-05 0 0 0 0 0 0
-1.68154871100039e-05 0 0 0 0 0 0
-1.67738163511487e-05 0 0 0 0 0 0
-1.67325432309741e-05 0 0 0 0 0 0
-1.66916644033734e-05 0 0 0 0 0 0
-1.66511765805869e-05 0 0 0 0 0 0
-1.66110765324226e-05 0 0 0 0 0 0
-1.65713610854948e-05 0 0 0 0 0 0
-1.65320271224827e-05 0 0 0 0 0 0
-1.6493071581407e-05 0 0 0 0 0 0
-1.64544914549246e-05 0 0 0 0 0 0
-1.64162837896418e-05 0 0 0 0 0 0
-1.6378445685445e-05 0 0 0 0 0 0
-1.63409742948485e-05 0 0 0 0 0 0
-1.63038668223589e-05 0 0 0 0 0 0
-1.62671205238574e-05 0 0 0 0 0 0
-1.62307327059975e-05 0 0 0 0 0 0
-1.61947007256193e-05 0 0 0 0 0 0
-1.61590219891798e-05 0 0 0 0 0 0
-1.61236939521987e-05 0 0 0 0 0 0
-1.60887141187196e-05 0 0 0 0 0 0
-1.60540800407868e-05 0 0 0 0 0 0
-1.60197893179367e-05 0 0 0 0 0 0
-1.59858395967041e-05 0 0 0 0 0 0
-1.59522285701431e-05 0 0 0 0 0 0
-1.59189539773625e-05 0 0 0 0 0 0
-1.58860136030751e-05 0 0 0 0 0 0
-1.58534052771611e-05 0 0 0 0 0 0
-1.58211268742456e-05 0 0 0 0 0 0
-1.57891763132895e-05 0 0 0 0 0 0
-1.57575515571939e-05 0 0 0 0 0 0
-1.57262506124181e-05 0 0 0 0 0 0
-1.56952715286104e-05 0 0 0 0 0 0
-1.56646123982525e-05 0 0 0 0 0 0
-1.56342713563163e-05 0 0 0 0 0 0
-1.56042465799341e-05 0 0 0 0 0 0
-1.5574536288081e-05 0 0 0 0 0 0
-1.554513874127e-05 0 0 0 0 0 0
-1.55160522412601e-05 0 0 0 0 0 0
-1.54872751307759e-05 0 0 0 0 0 0
-1.54588057932403e-05 0 0 0 0 0 0
-1.54306426525194e-05 0 0 0 0 0 0
-1.54027841726787e-05 0 0 0 0 0 0
-1.53752288577526e-05 0 0 0 0 0 0
-1.53479752515245e-05 0 0 0 0 0 0
-1.53210219373208e-05 0 0 0 0 0 0
-1.52943675378147e-05 0 0 0 0 0 0
-1.52680107148433e-05 0 0 0 0 0 0
-1.52419501692363e-05 0 0 0 0 0 0
-1.52161846406558e-05 0 0 0 0 0 0
-1.51907129074489e-05 0 0 0 0 0 0
-1.5165533786511e-05 0 0 0 0 0 0
-1.51406461331623e-05 0 0 0 0 0 0
-1.51160488410341e-05 0 0 0 0 0 0
-1.50917408419689e-05 0 0 0 0 0 0
-1.50677211059305e-05 0 0 0 0 0 0
-1.50439886409275e-05 0 0 0 0 0 0
-1.50205424929467e-05 0 0 0 0 0 0
-1.49973817459008e-05 0 0 0 0 0 0
-1.49745055215851e-05 0 0 0 0 0 0
-1.49519129796486e-05 0 0 0 0 0 0
-1.49296033175758e-05 0 0 0 0 0 0
-1.49075757706804e-05 0 0 0 0 0 0
-1.48858296121121e-05 0 0 0 0 0 0
-1.48643641528741e-05 0 0 0 0 0 0
-1.48431787418543e-05 0 0 0 0 0 0
-1.48222727658677e-05 0 0 0 0 0 0
-1.48016456497117e-05 0 0 0 0 0 0
-1.47812968562342e-05 0 0 0 0 0 0
-1.47612258864135e-05 0 0 0 0 0 0
-1.47414322794513e-05 0 0 0 0 0 0
-1.47219156128794e-05 0 0 0 0 0 0
-1.47026755026778e-05 0 0 0 0 0 0
-1.4683711603407e-05 0 0 0 0 0 0
-1.46650236083535e-05 0 0 0 0 0 0
-1.46466112496887e-05 0 0 0 0 0 0
-1.46284742986406e-05 0 0 0 0 0 0
-1.46106125656807e-05 0 0 0 0 0 0
-1.45930259007237e-05 0 0 0 0 0 0
-1.45757141933417e-05 0 0 0 0 0 0
-1.4558677372993e-05 0 0 0 0 0 0
-1.45419154092652e-05 0 0 0 0 0 0
-1.45254283121335e-05 0 0 0 0 0 0
-1.45092161322328e-05 0 0 0 0 0 0
-1.44932789611472e-05 0 0 0 0 0 0
-1.44776169317128e-05 0 0 0 0 0 0
-1.44622302183379e-05 0 0 0 0 0 0
-1.44471190373385e-05 0 0 0 0 0 0
-1.44322836472901e-05 0 0 0 0 0 0
-1.44177243493971e-05 0 0 0 0 0 0
-1.44034414878775e-05 0 0 0 0 0 0
-1.43894354503671e-05 0 0 0 0 0 0
-1.4375706668339e-05 0 0 0 0 0 0
-1.4362255617543e-05 0 0 0 0 0 0
-1.43490828184626e-05 0 0 0 0 0 0
-1.43361888367903e-05 0 0 0 0 0 0
-1.43235742839233e-05 0 0 0 0 0 0
-1.43112398174773e-05 0 0 0 0 0 0
-1.42991861418216e-05 0 0 0 0 0 0
-1.42874140086339e-05 0 0 0 0 0 0
-1.42759242174759e-05 0 0 0 0 0 0
-1.42647176163912e-05 0 0 0 0 0 0
-1.42537951025237e-05 0 0 0 0 0 0
-1.424315762276e-05 0 0 0 0 0 0
-1.42328061743933e-05 0 0 0 0 0 0
-1.42227418058118e-05 0 0 0 0 0 0
-1.42129656172104e-05 0 0 0 0 0 0
-1.42034787613282e-05 0 0 0 0 0 0
-1.41942824442099e-05 0 0 0 0 0 0
-1.41853779259939e-05 0 0 0 0 0 0
-1.41767665217275e-05 0 0 0 0 0 0
-1.41684496022081e-05 0 0 0 0 0 0
-1.41604285948537e-05 0 0 0 0 0 0
-1.41527049846015e-05 0 0 0 0 0 0
-1.41452803148358e-05 0 0 0 0 0 0
-1.41381561883471e-05 0 0 0 0 0 0
-1.41313342683216e-05 0 0 0 0 0 0
-1.41248162793628e-05 0 0 0 0 0 0
-1.41186040085464e-05 0 0 0 0 0 0
-1.41126993065089e-05 0 0 0 0 0 0
-1.41071040885704e-05 0 0 0 0 0 0
-1.41018203358942e-05 0 0 0 0 0 0
-1.40968500966825e-05 0 0 0 0 0 0
-1.40921954874099e-05 0 0 0 0 0 0
-1.40878586940962e-05 0 0 0 0 0 0
-1.40838419736197e-05 0 0 0 0 0 0
-1.40801476550705e-05 0 0 0 0 0 0
-1.40767781411479e-05 0 0 0 0 0 0
-1.40737359096006e-05 0 0 0 0 0 0
-1.40710235147122e-05 0 0 0 0 0 0
-1.40686435888336e-05 0 0 0 0 0 0
-1.40665988439629e-05 0 0 0 0 0 0
-1.40648920733751e-05 0 0 0 0 0 0
-1.40635261533021e-05 0 0 0 0 0 0
-1.40625040446664e-05 0 0 0 0 0 0
-1.40618287948676e-05 0 0 0 0 0 0
-1.40615035396257e-05 0 0 0 0 0 0
-1.40615315048822e-05 0 0 0 0 0 0
-1.40619160087599e-05 0 0 0 0 0 0
-1.4062660463585e-05 0 0 0 0 0 0
-1.40637683779719e-05 0 0 0 0 0 0
-1.40652433589743e-05 0 0 0 0 0 0
-1.40670891143033e-05 0 0 0 0 0 0
-1.40693094546155e-05 0 0 0 0 0 0
-1.40719082958735e-05 0 0 0 0 0 0
-1.4074889661781e-05 0 0 0 0 0 0
-1.40782576862942e-05 0 0 0 0 0 0
-1.40820166162146e-05 0 0 0 0 0 0
-1.4086170813862e-05 0 0 0 0 0 0
-1.40907247598345e-05 0 0 0 0 0 0
-1.40956830558556e-05 0 0 0 0 0 0
-1.41010504277125e-05 0 0 0 0 0 0
-1.41068317282894e-05 0 0 0 0 0 0
-1.41130319406972e-05 0 0 0 0 0 0
-1.41196561815051e-05 0 0 0 0 0 0
-1.41267097040761e-05 0 0 0 0 0 0
-1.41341979020115e-05 0 0 0 0 0 0
-1.41421263127059e-05 0 0 0 0 0 0
-1.415050062102e-05 0 0 0 0 0 0
-1.41593266630721e-05 0 0 0 0 0 0
-1.41686104301553e-05 0 0 0 0 0 0
-1.41783580727826e-05 0 0 0 0 0 0
-1.41885759048662e-05 0 0 0 0 0 0
-1.41992704080359e-05 0 0 0 0 0 0
-1.42104482361001e-05 0 0 0 0 0 0
-1.42221162196564e-05 0 0 0 0 0 0
-1.42342813708566e-05 0 0 0 0 0 0
-1.42469508883323e-05 0 0 0 0 0 0
-1.42601321622857e-05 0 0 0 0 0 0
-1.42738327797544e-05 0 0 0 0 0 0
-1.42880605300539e-05 0 0 0 0 0 0
-1.4302823410407e-05 0 0 0 0 0 0
-1.43181296317652e-05 0 0 0 0 0 0
-1.43339876248316e-05 0 0 0 0 0 0
-1.43504060462908e-05 0 0 0 0 0 0
-1.43673937852559e-05 0 0 0 0 0 0
-1.43849599699393e-05 0 0 0 0 0 0
-1.44031139745579e-05 0 0 0 0 0 0
-1.442186542648e-05 0 0 0 0 0 0
-1.44412242136251e-05 0 0 0 0 0 0
-1.44612004921251e-05 0 0 0 0 0 0
-1.44818046942598e-05 0 0 0 0 0 0
-1.4503047536674e-05 0 0 0 0 0 0
-1.45249400288919e-05 0 0 0 0 0 0
-1.4547493482137e-05 0 0 0 0 0 0
-1.45707195184728e-05 0 0 0 0 0 0
-1.45946300802753e-05 0 0 0 0 0 0
-1.46192374400531e-05 0 0 0 0 0 0
-1.46445542106275e-05 0 0 0 0 0 0
-1.46705933556888e-05 0 0 0 0 0 0
-1.46973682007443e-05 0 0 0 0 0 0
-1.47248924444747e-05 0 0 0 0 0 0
-1.47531801705147e-05 0 0 0 0 0 0
-1.47822458596787e-05 0 0 0 0 0 0
-1.48121044026475e-05 0 0 0 0 0 0
-1.48427711131382e-05 0 0 0 0 0 0
-1.48742617415764e-05 0 0 0 0 0 0
-1.49065924892943e-05 0 0 0 0 0 0
-1.49397800232755e-05 0 0 0 0 0 0
-1.49738414914726e-05 0 0 0 0 0 0
-1.50087945387217e-05 0 0 0 0 0 0
-1.50446573232797e-05 0 0 0 0 0 0
-1.50814485340139e-05 0 0 0 0 0 0
-1.51191874082721e-05 0 0 0 0 0 0
-1.51578937504634e-05 0 0 0 0 0 0
-1.51975879513822e-05 0 0 0 0 0 0
-1.52382910083111e-05 0 0 0 0 0 0
-1.52800245459342e-05 0 0 0 0 0 0
-1.53228108381035e-05 0 0 0 0 0 0
-1.53666728304927e-05 0 0 0 0 0 0
-1.54116341641833e-05 0 0 0 0 0 0
-1.54577192002258e-05 0 0 0 0 0 0
-1.55049530452201e-05 0 0 0 0 0 0
-1.55533615779665e-05 0 0 0 0 0 0
-1.56029714772349e-05 0 0 0 0 0 0
-1.56538102507095e-05 0 0 0 0 0 0
-1.57059062651612e-05 0 0 0 0 0 0
-1.57592887779114e-05 0 0 0 0 0 0
-1.58139879696471e-05 0 0 0 0 0 0
-1.58700349786548e-05 0 0 0 0 0 0
-1.59274619365432e-05 0 0 0 0 0 0
-1.59863020055277e-05 0 0 0 0 0 0
-1.60465894173553e-05 0 0 0 0 0 0
-1.61083595139517e-05 0 0 0 0 0 0
-1.61716487898774e-05 0 0 0 0 0 0
-1.62364949366853e-05 0 0 0 0 0 0
-1.63029368892752e-05 0 0 0 0 0 0
-1.637101487435e-05 0 0 0 0 0 0
-1.64407704610804e-05 0 0 0 0 0 0
-1.65122466140921e-05 0 0 0 0 0 0
-1.65854877489002e-05 0 0 0 0 0 0
-1.66605397899161e-05 0 0 0 0 0 0
-1.67374502311636e-05 0 0 0 0 0 0
-1.68162681998504e-05 0 0 0 0 0 0
-1.68970445229454e-05 0 0 0 0 0 0
-1.6979831796925e-05 0 0 0 0 0 0
-1.70646844608605e-05 0 0 0 0 0 0
-1.71516588730275e-05 0 0 0 0 0 0
-1.72408133912316e-05 0 0 0 0 0 0
-1.7332208457056e-05 0 0 0 0 0 0
-1.74259066842474e-05 0 0 0 0 0 0
-1.7521972951474e-05 0 0 0 0 0 0
-1.76204744996982e-05 0 0 0 0 0 0
-1.77214810344301e-05 0 0 0 0 0 0
-1.78250648331343e-05 0 0 0 0 0 0
-1.79313008580918e-05 0 0 0 0 0 0
-1.80402668750262e-05 0 0 0 0 0 0
-1.81520435778332e-05 0 0 0 0 0 0
-1.82667147197683e-05 0 0 0 0 0 0
-1.83843672514742e-05 0 0 0 0 0 0
-1.8505091466251e-05 0 0 0 0 0 0
-1.8628981153004e-05 0 0 0 0 0 0
-1.87561337573278e-05 0 0 0 0 0 0
-1.88866505512193e-05 0 0 0 0 0 0
-1.90206368119438e-05 0 0 0 0 0 0
-1.91582020106162e-05 0 0 0 0 0 0
-1.92994600110936e-05 0 0 0 0 0 0
-1.94445292798215e-05 0 0 0 0 0 0
-1.95935331073165e-05 0 0 0 0 0 0
-1.97465998420177e-05 0 0 0 0 0 0
-1.99038631372897e-05 0 0 0 0 0 0
-2.0065462212415e-05 0 0 0 0 0 0
-2.02315421284745e-05 0 0 0 0 0 0
-2.04022540800769e-05 0 0 0 0 0 0
-2.05777557039672e-05 0 0 0 0 0 0
-2.07582114056213e-05 0 0 0 0 0 0
-2.09437927050109e-05 0 0 0 0 0 0
-2.11346786028109e-05 0 0 0 0 0 0
-2.1331055968416e-05 0 0 0 0 0 0
-2.15331199512332e-05 0 0 0 0 0 0
-2.17410744168267e-05 0 0 0 0 0 0
-2.19551324096094e-05 0 0 0 0 0 0
-2.21755166439039e-05 0 0 0 0 0 0
-2.24024600253335e-05 0 0 0 0 0 0
-2.26362062046529e-05 0 0 0 0 0 0
-2.28770101662914e-05 0 0 0 0 0 0
-2.31251388540558e-05 0 0 0 0 0 0
-2.33808718366309e-05 0 0 0 0 0 0
-2.3644502015721e-05 0 0 0 0 0 0
-2.39163363798984e-05 0 0 0 0 0 0
-2.41966968074694e-05 0 0 0 0 0 0
-2.4485920921927e-05 0 0 0 0 0 0
-2.47843630038472e-05 0 0 0 0 0 0
-2.50923949633944e-05 0 0 0 0 0 0
-2.54104073779343e-05 0 0 0 0 0 0
-2.5738810599621e-05 0 0 0 0 0 0
-2.6078035938215e-05 0 0 0 0 0 0
-2.64285369248216e-05 0 0 0 0 0 0
-2.6790790662704e-05 0 0 0 0 0 0
-2.71652992718292e-05 0 0 0 0 0 0
-2.75525914343556e-05 0 0 0 0 0 0
-2.7953224048867e-05 0 0 0 0 0 0
-2.8367784001803e-05 0 0 0 0 0 0
-2.87968900652373e-05 0 0 0 0 0 0
-2.92411949309185e-05 0 0 0 0 0 0
-2.97013873913094e-05 0 0 0 0 0 0
-3.01781946792562e-05 0 0 0 0 0 0
-3.06723849788874e-05 0 0 0 0 0 0
-3.11847701213843e-05 0 0 0 0 0 0
-3.17162084803986e-05 0 0 0 0 0 0
-3.2267608083113e-05 0 0 0 0 0 0
-3.2839929954249e-05 0 0 0 0 0 0
-3.34341917117456e-05 0 0 0 0 0 0
-3.40514714343423e-05 0 0 0 0 0 0
-3.4692911822926e-05 0 0 0 0 0 0
-3.5359724679229e-05 0 0 0 0 0 0
-3.6053195727302e-05 0 0 0 0 0 0
-3.67746898051358e-05 0 0 0 0 0 0
-3.75256564558416e-05 0 0 0 0 0 0
-3.83076359499437e-05 0 0 0 0 0 0
-3.91222657725429e-05 0 0 0 0 0 0
-3.99712876113792e-05 0 0 0 0 0 0
-4.08565548841016e-05 0 0 0 0 0 0
-4.17800408453244e-05 0 0 0 0 0 0
-4.27438473162297e-05 0 0 0 0 0 0
-4.37502140815017e-05 0 0 0 0 0 0
-4.48015290001532e-05 0 0 0 0 0 0
-4.59003388781761e-05 0 0 0 0 0 0
-4.70493611517726e-05 0 0 0 0 0 0
-4.8251496429967e-05 0 0 0 0 0 0
-4.9509841944386e-05 0 0 0 0 0 0
-5.08277059515909e-05 0 0 0 0 0 0
-5.22086231290868e-05 0 0 0 0 0 0
-5.36563709994867e-05 0 0 0 0 0 0
-5.51749874075527e-05 0 0 0 0 0 0
-5.67687890611279e-05 0 0 0 0 0 0
-5.84423911282018e-05 0 0 0 0 0 0
-6.02007278571856e-05 0 0 0 0 0 0
-6.2049074154238e-05 0 0 0 0 0 0
-6.399306800812e-05 0 0 0 0 0 0
-6.60387335970326e-05 0 0 0 0 0 0
-6.81925048401093e-05 0 0 0 0 0 0
-7.04612490649145e-05 0 0 0 0 0 0
-7.28522903468666e-05 0 0 0 0 0 0
-7.53734319314327e-05 0 0 0 0 0 0
-7.8032976968676e-05 0 0 0 0 0 0
-8.0839746564428e-05 0 0 0 0 0 0
-8.38030938739518e-05 0 0 0 0 0 0
-8.69329126218895e-05 0 0 0 0 0 0
-9.02396380147323e-05 0 0 0 0 0 0
-9.37342375059273e-05 0 0 0 0 0 0
-9.74281882652691e-05 0 0 0 0 0 0
-0.000101333437479613 0 0 0 0 0 0
-0.000105462340758853 0 0 0 0 0 0
-0.000109827572930684 0 0 0 0 0 0
-0.000114442004377838 0 0 0 0 0 0
-0.000119318534811913 0 0 0 0 0 0
-0.000124469875016352 0 0 0 0 0 0
-0.000129908265683197 0 0 0 0 0 0
-0.000135645121109424 0 0 0 0 0 0
-0.000141690584359945 0 0 0 0 0 0
-0.000148052979771374 0 0 0 0 0 0
-0.000154738148684638 0 0 0 0 0 0
-0.00016174865549353 0 0 0 0 0 0
-0.00016908285405136 0 0 0 0 0 0
-0.00017673380989603 0 0 0 0 0 0
-0.000184688082455587 0 0 0 0 0 0
-0.00019292438424915 0 0 0 0 0 0
-0.0002014121518847 0 0 0 0 0 0
-0.000210110086851757 0 0 0 0 0 0
-0.0002189647525554 0 0 0 0 0 0
-0.000227909346514898 0 0 0 0 0 0
-0.000236862800376246 0 0 0 0 0 0
-0.000245729390587109 0 0 0 0 0 0
-0.000254399062283497 0 0 0 0 0 0
-0.000262748669286353 0 0 0 0 0 0
-0.00027064430449272 0 0 0 0 0 0
-0.000277944829140879 0 0 0 0 0 0
-0.000284506602656729 0 0 0 0 0 0
-0.000290189271174628 0 0 0 0 0 0
-0.000294862307084681 0 0 0 0 0 0
-0.000298411829807868 0 0 0 0 0 0
-0.000300747112942397 0 0 0 0 0 0
-0.000301806129026728 0 0 0 0 0 0
-0.000301559525179553 0 0 0 0 0 0
-0.000300012566806299 0 0 0 0 0 0
-0.000297204814564875 0 0 0 0 0 0
-0.000293207572335121 0 0 0 0 0 0
-0.000288119409427309 0 0 0 0 0 0
-0.00028206026899406 0 0 0 0 0 0
-0.000275164792082547 0 0 0 0 0 0
-0.000267575501528076 0 0 0 0 0 0
-0.000259436413655919 0 0 0 0 0 0
-0.000250887506806146 0 0 0 0 0 0
-0.000242060308933425 0 0 0 0 0 0
-0.000233074704048841 0 0 0 0 0 0
-0.00022403692209114 0 0 0 0 0 0
-0.000215038580723034 0 0 0 0 0 0
-0.000206156592249088 0 0 0 0 0 0
-0.000197453729011842 0 0 0 0 0 0
-
-
diff --git a/examples/getting-started/2-clearsky-radiative-transfer/1.zeeman.py b/examples/getting-started/2-clearsky-radiative-transfer/1.zeeman.py
index 5bb967d9ef..b7fdfdb4ae 100644
--- a/examples/getting-started/2-clearsky-radiative-transfer/1.zeeman.py
+++ b/examples/getting-started/2-clearsky-radiative-transfer/1.zeeman.py
@@ -56,17 +56,17 @@
ws.spectral_radiance[::100],
np.array(
[
- [2.27786279e02, -2.23644583e-04, -3.77015913e-04, 5.69269522e-02],
- [2.30865312e02, -3.48096654e-04, -5.82873607e-04, 7.04140485e-02],
- [2.34807995e02, -6.21529170e-04, -1.02888198e-03, 9.33839855e-02],
- [2.40362302e02, -1.41676334e-03, -2.28982732e-03, 1.40030558e-01],
- [2.49783915e02, -5.60528357e-03, -8.33754971e-03, 2.69733178e-01],
- [2.07245890e02, -4.30794421e00, -2.14467490e01, 1.24566607e-05],
- [2.49783382e02, -5.60754703e-03, -8.34040843e-03, -2.69809821e-01],
- [2.40361281e02, -1.41779460e-03, -2.29136074e-03, -1.40106384e-01],
- [2.34806526e02, -6.22190182e-04, -1.02991615e-03, -9.34592546e-02],
- [2.30863403e02, -3.48585873e-04, -5.83658317e-04, -7.04893428e-02],
- [2.27783939e02, -2.24035725e-04, -3.77652642e-04, -5.70022211e-02],
+ [2.27784834e02, -2.23635319e-04, -3.77001634e-04, 5.69266632e-02],
+ [2.30863853e02, -3.48081919e-04, -5.82851478e-04, 7.04138002e-02],
+ [2.34806521e02, -6.21501805e-04, -1.02884266e-03, 9.33836080e-02],
+ [2.40360801e02, -1.41669913e-03, -2.28974401e-03, 1.40029968e-01],
+ [2.49782407e02, -5.60506178e-03, -8.33739163e-03, 2.69735122e-01],
+ [2.07248447e02, -4.30842579e00, -2.14475851e01, 1.25057382e-05],
+ [2.49781840e02, -5.60734272e-03, -8.34027514e-03, -2.69812575e-01],
+ [2.40359708e02, -1.41773814e-03, -2.29128954e-03, -1.40106546e-01],
+ [2.34804943e02, -6.22167771e-04, -1.02988483e-03, -9.34596090e-02],
+ [2.30861802e02, -3.48574780e-04, -5.83642167e-04, -7.04898114e-02],
+ [2.27782317e02, -2.24029336e-04, -3.77643130e-04, -5.70026253e-02],
]
),
), "Values have drifted from expected results in spectral radiance"
diff --git a/examples/getting-started/2-clearsky-radiative-transfer/2.zeeman-sensor.py b/examples/getting-started/2-clearsky-radiative-transfer/2.zeeman-sensor.py
index 9e741826e9..e681547dbd 100644
--- a/examples/getting-started/2-clearsky-radiative-transfer/2.zeeman-sensor.py
+++ b/examples/getting-started/2-clearsky-radiative-transfer/2.zeeman-sensor.py
@@ -64,17 +64,17 @@
result[::100],
np.array(
[
- 227.78791323,
- 230.8653163,
- 234.80800379,
- 240.3623207,
- 249.78397782,
- 207.61855855,
- 249.78344508,
- 240.36129972,
- 234.80653428,
- 230.86340781,
- 227.78557379,
+ 227.78646795,
+ 230.8638575,
+ 234.80652899,
+ 240.36081974,
+ 249.78247057,
+ 207.62113428,
+ 249.78190355,
+ 240.35972683,
+ 234.80495168,
+ 230.86180615,
+ 227.78395156,
]
),
)
diff --git a/examples/getting-started/3-disort/2.clearsky-flux.py b/examples/getting-started/3-disort/2.clearsky-flux.py
index 1068244d65..eb52955465 100644
--- a/examples/getting-started/3-disort/2.clearsky-flux.py
+++ b/examples/getting-started/3-disort/2.clearsky-flux.py
@@ -59,36 +59,36 @@
ws.disort_spectral_flux_field[:, :2].flatten()
/ np.array(
[
- 2.65884980e-15,
- 2.66123187e-15,
+ 2.65924430e-15,
+ 2.66162733e-15,
2.75440515e-15,
- 9.57958301e-18,
- 2.08163832e-17,
- 5.41861020e-16,
- 2.93041798e-15,
- 2.93324940e-15,
+ 9.57958182e-18,
+ 2.08076327e-17,
+ 5.39749082e-16,
+ 2.93074072e-15,
+ 2.93357370e-15,
3.03918211e-15,
- 9.99616715e-18,
- 2.34556308e-17,
- 6.14497069e-16,
- 3.19240354e-15,
- 3.19640875e-15,
+ 9.99616600e-18,
+ 2.34511632e-17,
+ 6.12773186e-16,
+ 3.19264874e-15,
+ 3.19665668e-15,
3.33784028e-15,
- 1.03768106e-17,
- 3.05931058e-17,
- 8.09137668e-16,
- 3.35237338e-15,
- 3.36061097e-15,
+ 1.03768102e-17,
+ 3.05943372e-17,
+ 8.07853130e-16,
+ 3.35251230e-15,
+ 3.36075470e-15,
3.65036247e-15,
- 1.07209030e-17,
- 6.78813350e-17,
- 1.56228981e-15,
- 3.37235564e-15,
- 2.86991074e-15,
+ 1.07209025e-17,
+ 6.78926741e-17,
+ 1.56163327e-15,
+ 3.37235023e-15,
+ 2.86992821e-15,
3.97673151e-15,
- 1.52461809e-15,
- 2.80896218e-15,
- 3.94568143e-15,
+ 1.52446216e-15,
+ 2.80896759e-15,
+ 3.94566396e-15,
]
),
1,
diff --git a/examples/recipes/SingleSpeciesAbsorption/species_absorption.ipynb b/examples/recipes/SingleSpeciesAbsorption/species_absorption.ipynb
index c2fa32fd7e..c29c53cde5 100644
--- a/examples/recipes/SingleSpeciesAbsorption/species_absorption.ipynb
+++ b/examples/recipes/SingleSpeciesAbsorption/species_absorption.ipynb
@@ -162,11 +162,11 @@
"metadata": {},
"outputs": [],
"source": [
- "assert np.isclose(6.7940695853245560e-28 / xsec.mean(), 1)\n",
- "assert np.isclose(5.4406909239279050e-24 / xsec.sum(), 1)\n",
- "assert np.isclose(1.3361953365612772e-24 / xsec.max(), 1)\n",
- "assert np.isclose(2.5383142016771395e-26 / xsec.std(), 1)\n",
- "assert np.isclose(8.2386317491421410e-35 / xsec.min(), 1)"
+ "assert np.isclose(6.792977548868407e-28 / xsec.mean(), 1)\n",
+ "assert np.isclose(5.43981642113382e-24 / xsec.sum(), 1)\n",
+ "assert np.isclose(1.3359834491781882e-24 / xsec.max(), 1)\n",
+ "assert np.isclose(2.537911691540087e-26 / xsec.std(), 1)\n",
+ "assert np.isclose(8.236637542411964e-35 / xsec.min(), 1)"
]
}
],
diff --git a/python/src/pyarts/recipe/AtmosphericFlux.py b/python/src/pyarts/recipe/AtmosphericFlux.py
index f39680441b..19592dfa08 100644
--- a/python/src/pyarts/recipe/AtmosphericFlux.py
+++ b/python/src/pyarts/recipe/AtmosphericFlux.py
@@ -66,8 +66,8 @@ def __init__(
self.ws.ReadCatalogData()
for band in self.ws.absorption_bands:
- band.data.cutoff = "ByLine"
- band.data.cutoff_value = 750e9
+ self.ws.absorption_bands[band].cutoff = "ByLine"
+ self.ws.absorption_bands[band].cutoff_value = 750e9
self.ws.propagation_matrix_agendaAuto()
diff --git a/python/src/pyarts/recipe/SpectralAtmosphericFlux.py b/python/src/pyarts/recipe/SpectralAtmosphericFlux.py
index abad1424f8..e1167a05d5 100644
--- a/python/src/pyarts/recipe/SpectralAtmosphericFlux.py
+++ b/python/src/pyarts/recipe/SpectralAtmosphericFlux.py
@@ -65,8 +65,8 @@ def __init__(
self.ws.ReadCatalogData()
for band in self.ws.absorption_bands:
- band.data.cutoff = "ByLine"
- band.data.cutoff_value = 750e9
+ self.ws.absorption_bands[band].cutoff = "ByLine"
+ self.ws.absorption_bands[band].cutoff_value = 750e9
self.ws.propagation_matrix_agendaAuto()
diff --git a/python/test/workspace/test_groups.py b/python/test/workspace/test_groups.py
index 9de3aeb6f6..8e6babe66b 100644
--- a/python/test/workspace/test_groups.py
+++ b/python/test/workspace/test_groups.py
@@ -1027,4 +1027,4 @@ def test_construct_empty(self):
if __name__ == "__main__":
x = TestGroups()
- x.testArrayOfAtmPoint()
+ x.test_construct_empty()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7d744fc6ce..fbf85c0075 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -149,6 +149,7 @@ add_library(artsworkspace STATIC
xml_io_array_types.cc
xml_io_basic_types.cc
xml_io_compound_types.cc
+ xml_io_map_types.cc
xml_io_rtepack.cc
xml_operators.cc
${NETCDF_CC_FILES}
diff --git a/src/core/file.cc b/src/core/file.cc
index 7826333f32..fc8fa81a7f 100644
--- a/src/core/file.cc
+++ b/src/core/file.cc
@@ -14,12 +14,15 @@
// External declarations
////////////////////////////////////////////////////////////////////////////
+#include "file.h"
+
+#include
+
#include
#include
#include
#include
-#include "file.h"
#include "parameters.h"
////////////////////////////////////////////////////////////////////////////
@@ -132,7 +135,14 @@ void open_input_file(std::ifstream& file, const std::string_view name) {
// g++ stream exceptions work properly.
ARTS_USER_ERROR_IF(!file,
"Cannot open input file: {}"
- "\nMaybe the file does not exist?", ename);
+ "\nMaybe the file does not exist?",
+ ename);
+}
+
+std::ifstream open_input_file(const std::string_view name) {
+ std::ifstream file;
+ open_input_file(file, name);
+ return file;
}
/**
@@ -207,7 +217,9 @@ ArrayOfString read_text_from_file(const std::string_view name) {
@param with The replacement.
@author Stefan Buehler */
-void replace_all(String& s, const std::string_view what, const std::string_view with) {
+void replace_all(String& s,
+ const std::string_view what,
+ const std::string_view with) {
Size j = s.find(what);
while (j != s.npos) {
s.replace(j, 1, with);
@@ -226,7 +238,7 @@ void replace_all(String& s, const std::string_view what, const std::string_view
@author Oliver Lemke
*/
int check_newline(const std::string_view s) {
- String d = String{s};
+ String d = String{s};
int result = 0;
// Remove all whitespaces except \n
@@ -363,11 +375,11 @@ bool find_xml_file_existence(String& filename) {
extern Parameters parameters;
ArrayOfString allpaths = parameters.includepath;
allpaths.insert(
- allpaths.end(), parameters.datapath.begin(), parameters.datapath.end());
-
+ allpaths.end(), parameters.datapath.begin(), parameters.datapath.end());
+
ArrayOfString matching_files;
find_file(matching_files, filename, allpaths, {"", ".xml", ".gz", ".xml.gz"});
-
+
if (matching_files.size()) {
filename = matching_files[0];
return true;
@@ -456,8 +468,7 @@ ArrayOfString list_directory(const std::string_view dirname) {
dirname)
ArrayOfString files{};
- for (const auto& filename :
- std::filesystem::directory_iterator{dirname}) {
+ for (const auto& filename : std::filesystem::directory_iterator{dirname}) {
files.push_back(filename.path().string());
}
@@ -476,7 +487,8 @@ ArrayOfString list_directory(const std::string_view dirname) {
\author Oliver Lemke
*/
-String make_filename_unique(const std::string_view filename, const String& extension) {
+String make_filename_unique(const std::string_view filename,
+ const String& extension) {
String basename = String{filename};
String extensionname;
diff --git a/src/core/file.h b/src/core/file.h
index 20f880289f..c9333f0011 100644
--- a/src/core/file.h
+++ b/src/core/file.h
@@ -35,6 +35,8 @@ void cleanup_output_file(std::ofstream& file, const std::string_view name);
void open_input_file(std::ifstream& file, const std::string_view name);
+std::ifstream open_input_file(const std::string_view name);
+
[[nodiscard]] ArrayOfString read_text_from_stream(std::istream& is);
[[nodiscard]] ArrayOfString read_text_from_file(const std::string_view name);
diff --git a/src/core/fwd/fwd_propmat.cpp b/src/core/fwd/fwd_propmat.cpp
index 2733ee9e16..141e3b837f 100644
--- a/src/core/fwd/fwd_propmat.cpp
+++ b/src/core/fwd/fwd_propmat.cpp
@@ -8,7 +8,7 @@
namespace fwd {
propmat::propmat(std::shared_ptr atm_,
- std::shared_ptr lines_,
+ std::shared_ptr lines_,
std::shared_ptr cia_,
std::shared_ptr xsec_,
std::shared_ptr predef_,
@@ -68,7 +68,7 @@ void propmat::set_ciaextrap(Numeric extrap) { cia.set_extrap(extrap); }
void propmat::set_ciarobust(Index robust) { cia.set_robust(robust); }
-void propmat::set_bands(std::shared_ptr lines_) {
+void propmat::set_bands(std::shared_ptr lines_) {
lines.set_model(std::move(lines_));
}
diff --git a/src/core/fwd/fwd_propmat.h b/src/core/fwd/fwd_propmat.h
index 38bb4d0b69..af15b26da4 100644
--- a/src/core/fwd/fwd_propmat.h
+++ b/src/core/fwd/fwd_propmat.h
@@ -29,7 +29,7 @@ class propmat {
propmat& operator=(propmat&&) = default;
propmat(std::shared_ptr atm,
- std::shared_ptr lines,
+ std::shared_ptr lines,
std::shared_ptr cia,
std::shared_ptr xsec,
std::shared_ptr predef,
@@ -42,7 +42,7 @@ class propmat {
void set_atm(std::shared_ptr atm);
void set_ciaextrap(Numeric extrap);
void set_ciarobust(Index robust);
- void set_bands(std::shared_ptr lines);
+ void set_bands(std::shared_ptr lines);
void set_cia(std::shared_ptr cia);
void set_predef(std::shared_ptr predef);
void set_model(std::shared_ptr xsec);
diff --git a/src/core/fwd/fwd_spectral_radiance.cpp b/src/core/fwd/fwd_spectral_radiance.cpp
index 136ed13236..dabae6673c 100644
--- a/src/core/fwd/fwd_spectral_radiance.cpp
+++ b/src/core/fwd/fwd_spectral_radiance.cpp
@@ -92,7 +92,7 @@ spectral_radiance::spectral_radiance(
AscendingGrid lon_,
const AtmField& atm_,
const SurfaceField& surf,
- const std::shared_ptr& lines,
+ const std::shared_ptr& lines,
const std::shared_ptr& cia,
const std::shared_ptr& xsec,
const std::shared_ptr& predef,
diff --git a/src/core/fwd/fwd_spectral_radiance.h b/src/core/fwd/fwd_spectral_radiance.h
index bbe0edd5de..902de0fbd4 100644
--- a/src/core/fwd/fwd_spectral_radiance.h
+++ b/src/core/fwd/fwd_spectral_radiance.h
@@ -48,7 +48,7 @@ struct spectral_radiance {
AscendingGrid lon,
const AtmField& atm,
const SurfaceField& surf,
- const std::shared_ptr& lines,
+ const std::shared_ptr& lines,
const std::shared_ptr& cia,
const std::shared_ptr& xsec,
const std::shared_ptr& predef,
diff --git a/src/core/jacobian.cc b/src/core/jacobian.cc
index e9152d119b..d30156ca84 100644
--- a/src/core/jacobian.cc
+++ b/src/core/jacobian.cc
@@ -43,7 +43,7 @@ std::ostream& operator<<(std::ostream& os, const LineTarget&) {
return os << "Line key value: ";
}
-void LineTarget::update(ArrayOfAbsorptionBand& absorption_bands,
+void LineTarget::update(AbsorptionBands& absorption_bands,
const Vector& x) const {
const auto sz = static_cast(x.size());
ARTS_USER_ERROR_IF(sz < (x_start + x_size), "Got too small vector.")
@@ -51,7 +51,7 @@ void LineTarget::update(ArrayOfAbsorptionBand& absorption_bands,
}
void LineTarget::update(Vector& x,
- const ArrayOfAbsorptionBand& absorption_bands) const {
+ const AbsorptionBands& absorption_bands) const {
const auto sz = static_cast(x.size());
ARTS_USER_ERROR_IF(sz < (x_start + x_size), "Got too small vector.")
set_state(x.slice(x_start, x_size), absorption_bands, type);
@@ -77,7 +77,7 @@ std::vector& Targets::line() { return target(); }
void Targets::finalize(const AtmField& atmospheric_field,
const SurfaceField& surface_field,
- const ArrayOfAbsorptionBand&) {
+ const AbsorptionBands&) {
zero_out_x();
const Size natm = atm().size();
diff --git a/src/core/jacobian.h b/src/core/jacobian.h
index 974e5b4c9f..bb3d3b67b9 100644
--- a/src/core/jacobian.h
+++ b/src/core/jacobian.h
@@ -141,15 +141,15 @@ struct LineTarget {
Size x_size{std::numeric_limits::max()};
std::function
+ ExhaustiveVectorView, const AbsorptionBands&, const LblLineKey&)>
set_state{[](ExhaustiveVectorView x,
- const ArrayOfAbsorptionBand& bands,
+ const AbsorptionBands& bands,
const LblLineKey& key) { x = key.get_value(bands); }};
- std::function
- set_model{[](ArrayOfAbsorptionBand& bands,
+ set_model{[](AbsorptionBands& bands,
const LblLineKey& key,
const ExhaustiveConstVectorView x) {
ExhaustiveVectorView{key.get_value(bands)} = x;
@@ -157,9 +157,9 @@ struct LineTarget {
friend std::ostream& operator<<(std::ostream& os, const LineTarget&);
- void update(ArrayOfAbsorptionBand&, const Vector&) const;
+ void update(AbsorptionBands&, const Vector&) const;
- void update(Vector&, const ArrayOfAbsorptionBand&) const;
+ void update(Vector&, const AbsorptionBands&) const;
};
template
@@ -290,7 +290,7 @@ struct Targets final : targets_t {
//! Sets the sizes and x-positions of the targets.
void finalize(const AtmField& atmospheric_field,
const SurfaceField& surface_field,
- const ArrayOfAbsorptionBand& absorption_bands);
+ const AbsorptionBands& absorption_bands);
friend std::ostream& operator<<(std::ostream& os, const Targets& targets);
};
diff --git a/src/core/lbl/CMakeLists.txt b/src/core/lbl/CMakeLists.txt
index 0ca26b64eb..1ba6d26019 100644
--- a/src/core/lbl/CMakeLists.txt
+++ b/src/core/lbl/CMakeLists.txt
@@ -1,6 +1,7 @@
add_library(lbl STATIC
lbl_data.cpp
lbl_fwd.cpp
+ lbl_hitran.cpp
lbl_lineshape.cpp
lbl_lineshape_linemixing.cpp
lbl_lineshape_model.cpp
@@ -14,5 +15,5 @@ add_library(lbl STATIC
lbl_zeeman.cpp
)
-target_link_libraries(lbl PUBLIC matpack atm Faddeeva predef quantum surface wigner util)
+target_link_libraries(lbl PUBLIC matpack atm Faddeeva predef quantum surface wigner util arts_options)
target_include_directories(lbl PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/..)
diff --git a/src/core/lbl/lbl.h b/src/core/lbl/lbl.h
index 93aed163d4..4fa70c19f2 100644
--- a/src/core/lbl/lbl.h
+++ b/src/core/lbl/lbl.h
@@ -2,6 +2,7 @@
#include "lbl_data.h"
#include "lbl_fwd.h"
+#include "lbl_hitran.h"
#include "lbl_lineshape.h"
#include "lbl_lineshape_model.h"
#include "lbl_lineshape_voigt_ecs.h"
diff --git a/src/core/lbl/lbl_data.cpp b/src/core/lbl/lbl_data.cpp
index 0d302329e8..8fa9cf2fe9 100644
--- a/src/core/lbl/lbl_data.cpp
+++ b/src/core/lbl/lbl_data.cpp
@@ -5,20 +5,27 @@
#include
#include
#include
+#include
#include
#include "arts_constants.h"
#include "arts_constexpr_math.h"
#include "debug.h"
#include "double_imanip.h"
+#include "hitran_species.h"
+#include "partfun.h"
#include "quantum_numbers.h"
//! In CPP file
+using Constant::c;
+using Constant::h;
using Constant::k;
+using Constant::pi;
using Math::pow2;
using Math::pow3;
using Math::pow4;
using std::exp;
+using std::expm1;
namespace lbl {
Numeric line::s(Numeric T, Numeric Q) const {
@@ -45,15 +52,9 @@ Numeric line::ds_da(Numeric T, Numeric Q) const {
void band_data::sort(LineByLineVariable v) {
using enum LineByLineVariable;
switch (v) {
- case f0:
- std::ranges::sort(lines, {}, &line::f0);
- break;
- case e0:
- std::ranges::sort(lines, {}, &line::e0);
- break;
- case a:
- std::ranges::sort(lines, {}, &line::a);
- break;
+ case f0: std::ranges::sort(lines, {}, &line::f0); break;
+ case e0: std::ranges::sort(lines, {}, &line::e0); break;
+ case a: std::ranges::sort(lines, {}, &line::a); break;
}
}
@@ -91,15 +92,11 @@ std::ostream& operator<<(std::ostream& os, const band_data& x) {
<< x.lines;
}
-std::ostream& operator<<(std::ostream& os, const band& x) {
- return os << x.key << '\n' << x.data;
-}
-
-std::ostream& operator<<(std::ostream& os, const std::vector& x) {
+std::ostream& operator<<(std::ostream& os, const AbsorptionBands& x) {
constexpr std::string_view endl = "\n";
std::string_view sep = "";
- for (auto& y : x) {
- os << sep << y;
+ for (auto& [key, data] : x) {
+ os << sep << key << '\n' << data;
std::exchange(sep, endl);
}
return os;
@@ -139,16 +136,13 @@ std::ostream& operator<<(std::ostream& os, const line_key& x) {
template
auto local_get_value(T& absorption_bands, const line_key& type)
-> std::conditional_t, const Numeric&, Numeric&> {
- auto& band =
- [&type, &absorption_bands]() {
- auto ptr =
- std::ranges::find(absorption_bands, type.band, &lbl::band::key);
- ARTS_USER_ERROR_IF(ptr == absorption_bands.end(),
- "No band with quantum identifier: {}",
- type.band);
- return ptr;
- }()
- ->data;
+ auto ptr = absorption_bands.find(type.band);
+
+ ARTS_USER_ERROR_IF(ptr == absorption_bands.end(),
+ "No band with quantum identifier: {}",
+ type.band);
+
+ auto& band = ptr->second;
ARTS_USER_ERROR_IF(type.line >= band.lines.size(),
"Line index out of range: {}"
@@ -184,22 +178,42 @@ auto local_get_value(T& absorption_bands, const line_key& type)
}
switch (type.var) {
- case LineByLineVariable::f0:
- return line.f0;
- case LineByLineVariable::e0:
- return line.e0;
- case LineByLineVariable::a:
- return line.a;
+ case LineByLineVariable::f0: return line.f0;
+ case LineByLineVariable::e0: return line.e0;
+ case LineByLineVariable::a: return line.a;
}
std::unreachable();
}
-Numeric& line_key::get_value(std::vector& b) const {
+Numeric& line_key::get_value(AbsorptionBands& b) const {
return local_get_value(b, *this);
}
-const Numeric& line_key::get_value(const std::vector& b) const {
+const Numeric& line_key::get_value(const AbsorptionBands& b) const {
return local_get_value(b, *this);
}
+
+[[nodiscard]] Numeric line::hitran_a(const Numeric hitran_s,
+ const SpeciesIsotope& isot) {
+ constexpr Numeric T0 = 296.0;
+ const Numeric Q0 = PartitionFunctions::Q(T0, isot);
+ const Numeric Ia = Hitran::isotopologue_ratios()[isot];
+
+ //! Note negative value because expm1 is used as a more accurate form of (1 - exp(x)) for exp(x) close to 1.
+ return -8.0 * pi * Q0 * hitran_s /
+ (Ia * gu * exp(-e0 / (k * T0)) * expm1(-(h * f0) / (k * T0)) *
+ pow2(c / f0));
+}
+
+bool band_data::merge(const line& linedata) {
+ for (auto& line : lines) {
+ if (line.qn == linedata.qn) {
+ line = linedata;
+ return false;
+ }
+ }
+ lines.push_back(linedata);
+ return true;
+}
} // namespace lbl
diff --git a/src/core/lbl/lbl_data.h b/src/core/lbl/lbl_data.h
index 0a2b0c9be0..684e6c6bb8 100644
--- a/src/core/lbl/lbl_data.h
+++ b/src/core/lbl/lbl_data.h
@@ -115,6 +115,14 @@ struct line {
*/
[[nodiscard]] Numeric ds_dT(Numeric T, Numeric Q, Numeric dQ_dt) const;
+ /** Compute the HITRAN linestrength for this line
+ *
+ * @param hitran_s The HITRAN line strength
+ * @param isot The isotope to use - required to get the correct partition function
+ * @return Numeric Hitran equivalent linestrength
+ */
+ [[nodiscard]] Numeric hitran_a(const Numeric hitran_s, const SpeciesIsotope& isot);
+
friend std::ostream& operator<<(std::ostream& os, const line& x);
friend std::istream& operator>>(std::istream& is, line& x);
@@ -168,14 +176,10 @@ struct band_data {
[[nodiscard]] Rational max(QuantumNumberType) const;
- friend std::ostream& operator<<(std::ostream& os, const band_data& x);
-};
+ //! Returns true if the line is new for the band_data (based on quantum numbers)
+ bool merge(const line& linedata);
-struct band {
- QuantumIdentifier key{"Ar-8"};
- band_data data{};
-
- friend std::ostream& operator<<(std::ostream& os, const band&);
+ friend std::ostream& operator<<(std::ostream& os, const band_data& x);
};
struct line_pos {
@@ -217,13 +221,13 @@ struct line_key {
friend std::ostream& operator<<(std::ostream& os, const line_key& x);
- [[nodiscard]] Numeric& get_value(std::vector&) const;
- [[nodiscard]] const Numeric& get_value(const std::vector&) const;
+ [[nodiscard]] Numeric& get_value(std::unordered_map&) const;
+ [[nodiscard]] const Numeric& get_value(const std::unordered_map&) const;
};
std::ostream& operator<<(std::ostream& os, const std::vector& x);
-std::ostream& operator<<(std::ostream& os, const std::vector& x);
+std::ostream& operator<<(std::ostream& os, const std::unordered_map& x);
} // namespace lbl
//! Support hashing of line keys
@@ -237,10 +241,10 @@ struct std::hash {
using LblLineKey = lbl::line_key;
-using AbsorptionBand = lbl::band;
+using AbsorptionBand = lbl::band_data;
//! A list of multiple bands
-using ArrayOfAbsorptionBand = std::vector;
+using AbsorptionBands = std::unordered_map;
template <>
struct std::formatter {
@@ -290,24 +294,6 @@ struct std::formatter {
}
};
-template <>
-struct std::formatter {
- format_tags tags;
-
- [[nodiscard]] constexpr auto& inner_fmt() { return *this; }
- [[nodiscard]] constexpr auto& inner_fmt() const { return *this; }
-
- constexpr std::format_parse_context::iterator parse(
- std::format_parse_context& ctx) {
- return parse_format_tags(tags, ctx);
- }
-
- template
- FmtContext::iterator format(const AbsorptionBand& v, FmtContext& ctx) const {
- return tags.format(ctx, v.key, tags.sep(), v.data);
- }
-};
-
template <>
struct std::formatter {
format_tags tags;
diff --git a/src/core/lbl/lbl_fwd.cpp b/src/core/lbl/lbl_fwd.cpp
index be4e05bdfd..0ff8d792ad 100644
--- a/src/core/lbl/lbl_fwd.cpp
+++ b/src/core/lbl/lbl_fwd.cpp
@@ -222,17 +222,17 @@ std::pair nlte::operator()(const Numeric frequency) const {
return {scl * (a + ac), scl * (s + sc)};
}
-void lte::set_model(std::shared_ptr bands_) {
+void lte::set_model(std::shared_ptr bands_) {
bands = std::move(bands_);
adapt();
}
-void lte_mirror::set_model(std::shared_ptr bands_) {
+void lte_mirror::set_model(std::shared_ptr bands_) {
bands = std::move(bands_);
adapt();
}
-void nlte::set_model(std::shared_ptr bands_) {
+void nlte::set_model(std::shared_ptr bands_) {
bands = std::move(bands_);
adapt();
}
@@ -267,7 +267,7 @@ void nlte::set_pol(zeeman::pol pol_) {
adapt();
}
-void lte::set(std::shared_ptr bands_,
+void lte::set(std::shared_ptr bands_,
std::shared_ptr atm_,
zeeman::pol pol_) {
bands = std::move(bands_);
@@ -276,7 +276,7 @@ void lte::set(std::shared_ptr bands_,
adapt();
}
-void lte_mirror::set(std::shared_ptr bands_,
+void lte_mirror::set(std::shared_ptr bands_,
std::shared_ptr atm_,
zeeman::pol pol_) {
bands = std::move(bands_);
@@ -285,7 +285,7 @@ void lte_mirror::set(std::shared_ptr bands_,
adapt();
}
-void nlte::set(std::shared_ptr bands_,
+void nlte::set(std::shared_ptr bands_,
std::shared_ptr atm_,
zeeman::pol pol_) {
bands = std::move(bands_);
@@ -296,7 +296,7 @@ void nlte::set(std::shared_ptr bands_,
} // namespace models
line_storage::line_storage(std::shared_ptr atm_,
- std::shared_ptr bands_)
+ std::shared_ptr bands_)
: atm(std::move(atm_)), bands(std::move(bands_)) {
for (auto& [qid, band] : *bands) {
ARTS_USER_ERROR_IF(
@@ -328,7 +328,7 @@ line_storage::line_storage(std::shared_ptr atm_,
nlte[static_cast(zeeman::pol::no)].set(bands, atm, zeeman::pol::no);
}
-void line_storage::set_model(std::shared_ptr bands_) {
+void line_storage::set_model(std::shared_ptr bands_) {
for (auto& m : lte) m.set_model(bands_);
for (auto& m : lte_mirror) m.set_model(bands_);
for (auto& m : nlte) m.set_model(bands_);
diff --git a/src/core/lbl/lbl_fwd.h b/src/core/lbl/lbl_fwd.h
index f99af533db..b8592b9b57 100644
--- a/src/core/lbl/lbl_fwd.h
+++ b/src/core/lbl/lbl_fwd.h
@@ -12,7 +12,7 @@ namespace lbl::fwd {
namespace models {
class lte {
std::shared_ptr atm{};
- std::shared_ptr bands{};
+ std::shared_ptr bands{};
zeeman::pol pol{};
voigt::lte::band_shape lines{};
@@ -25,16 +25,16 @@ class lte {
public:
std::pair operator()(const Numeric frequency) const;
- void set_model(std::shared_ptr bands);
+ void set_model(std::shared_ptr bands);
void set_atm(std::shared_ptr atm);
void set_pol(zeeman::pol pol);
- void set(std::shared_ptr bands, std::shared_ptr atm,
+ void set(std::shared_ptr bands, std::shared_ptr atm,
zeeman::pol pol);
};
class lte_mirror {
std::shared_ptr atm{};
- std::shared_ptr bands{};
+ std::shared_ptr bands{};
zeeman::pol pol{};
voigt::lte_mirror::band_shape lines{};
@@ -47,16 +47,16 @@ class lte_mirror {
public:
std::pair operator()(const Numeric frequency) const;
- void set_model(std::shared_ptr bands);
+ void set_model(std::shared_ptr bands);
void set_atm(std::shared_ptr atm);
void set_pol(zeeman::pol pol);
- void set(std::shared_ptr bands, std::shared_ptr atm,
+ void set(std::shared_ptr bands, std::shared_ptr atm,
zeeman::pol pol);
};
class nlte {
std::shared_ptr atm{};
- std::shared_ptr bands{};
+ std::shared_ptr bands{};
zeeman::pol pol{};
voigt::nlte::band_shape lines{};
@@ -69,17 +69,17 @@ class nlte {
public:
std::pair operator()(const Numeric frequency) const;
- void set_model(std::shared_ptr bands);
+ void set_model(std::shared_ptr bands);
void set_atm(std::shared_ptr atm);
void set_pol(zeeman::pol pol);
- void set(std::shared_ptr bands, std::shared_ptr atm,
+ void set(std::shared_ptr bands, std::shared_ptr atm,
zeeman::pol pol);
};
} // namespace models
class line_storage {
std::shared_ptr atm{};
- std::shared_ptr bands{};
+ std::shared_ptr bands{};
std::array lte{};
std::array lte_mirror{};
@@ -93,11 +93,11 @@ class line_storage {
line_storage& operator=(line_storage&&) = default;
line_storage(std::shared_ptr atm,
- std::shared_ptr bands);
+ std::shared_ptr bands);
std::pair operator()(const Numeric frequency, const zeeman::pol pol) const;
- void set_model(std::shared_ptr bands);
+ void set_model(std::shared_ptr bands);
void set_atm(std::shared_ptr atm);
}; // struct frequency
} // namespace lbl::fwd
diff --git a/src/core/lbl/lbl_hitran.cpp b/src/core/lbl/lbl_hitran.cpp
new file mode 100644
index 0000000000..d3c3ddf00b
--- /dev/null
+++ b/src/core/lbl/lbl_hitran.cpp
@@ -0,0 +1,200 @@
+#include
+#include
+#include
+
+#include "partfun.h"
+
+namespace lbl {
+struct reader {
+ std::string::const_iterator it;
+ std::string::const_iterator end;
+
+ reader(const std::string& s) : it(s.begin()), end(s.end()) {}
+
+ template
+ constexpr T read_next(Size n) {
+ std::string_view orig(it, it + n);
+ std::string_view sv = orig;
+ skip(n);
+
+ if constexpr (std::same_as) {
+ ARTS_ASSERT(n == 1)
+ return orig[0];
+ } else {
+ while (sv.size() and sv.front() == ' ') sv.remove_prefix(1);
+ while (sv.size() and sv.back() == ' ') sv.remove_suffix(1);
+
+ T x{};
+ if constexpr (std::same_as or std::same_as) {
+ auto res = fast_float::from_chars(sv.data(), sv.data() + sv.size(), x);
+ ARTS_USER_ERROR_IF(res.ec != std::errc{},
+ "Failed to parse value from string \"{}\"",
+ orig)
+ ARTS_USER_ERROR_IF(res.ptr != sv.data() + sv.size(),
+ "Failed to fully parse string \"{}\"",
+ orig)
+ } else {
+ auto res = std::from_chars(sv.data(), sv.data() + sv.size(), x);
+ ARTS_USER_ERROR_IF(res.ec != std::errc{},
+ "Failed to parse value from string \"{}\"",
+ orig)
+ ARTS_USER_ERROR_IF(res.ptr != sv.data() + sv.size(),
+ "Failed to fully parse string \"{}\"",
+ orig)
+ }
+
+ return x;
+ }
+ }
+
+ constexpr void skip(Size n) {
+ ARTS_USER_ERROR_IF(it + n > end, "Unexpected end of string");
+ it += n;
+ }
+
+ [[nodiscard]] constexpr bool end_of_string() const { return it == end; }
+};
+
+bool read_hitran_par_record(hitran_record& record,
+ const std::string& linedata,
+ const Numeric fmin) try {
+ using namespace Conversion;
+
+ reader data(linedata);
+
+ const auto M = data.read_next(2);
+ const auto I = data.read_next(1);
+
+ record.f0 = kaycm2freq(data.read_next(12));
+ if (record.f0 < fmin) return false;
+
+ // Set this after the frequency check to avoid unnecessary work
+ record.qid = Hitran::id_from_lookup(M, I);
+
+ record.S = kaycm_per_cmsquared2hz_per_msquared(data.read_next(10));
+ record.A = data.read_next(10);
+ record.gamma_air = kaycm_per_atm2hz_per_pa(data.read_next(5));
+ record.gamma_self = kaycm_per_atm2hz_per_pa(data.read_next(5));
+ record.E = kaycm2joule(data.read_next(10));
+ record.n = data.read_next(4);
+ record.delta = kaycm_per_atm2hz_per_pa(data.read_next(8));
+ data.skip(79);
+ record.g_upp = data.read_next(7);
+ record.g_low = data.read_next(7);
+
+ if (not data.end_of_string()) {
+ const std::string_view remainder{data.it + 1, data.end};
+ const std::string_view::const_iterator space =
+ std::ranges::find_if(remainder, nonstd::isspace);
+ ARTS_USER_ERROR_IF(space == remainder.end(),
+ "Failed to parse HITRAN Quantum numbers:\n\n{}",
+ remainder);
+
+ record.qid.val = Quantum::Number::from_hitran(
+ std::string_view{remainder.begin(), space},
+ std::string_view{space + 1, remainder.end()});
+ }
+
+ return true;
+} catch (std::exception& e) {
+ ARTS_USER_ERROR(
+ "Internal error:\n\n{}\n\nFailed to read HITRAN line record:\n\n{}",
+ e.what(),
+ linedata);
+}
+
+hitran_data read_hitran_par(std::istream& file,
+ const Vector2& frequency_range) {
+ hitran_data out;
+
+ std::string linedata;
+ bool last_ok = true;
+
+ while (std::getline(file, linedata)) {
+ last_ok = read_hitran_par_record(last_ok ? out.emplace_back() : out.back(),
+ linedata,
+ frequency_range[0]);
+
+ if (last_ok and out.back().f0 > frequency_range[1]) {
+ out.pop_back();
+ break;
+ }
+ }
+
+ if (not last_ok) out.pop_back();
+
+ return out;
+}
+
+hitran_data read_hitran_par(std::istream&& file,
+ const Vector2& frequency_range) {
+ return read_hitran_par(file, frequency_range);
+}
+
+line hitran_record::from(HitranLineStrengthOption ls,
+ QuantumNumberLocalState&& local,
+ bool do_zeeman) const {
+ line l;
+ l.a = A;
+ l.f0 = f0;
+ l.e0 = E;
+ l.gu = g_upp;
+ l.gl = g_low;
+
+ switch (ls) {
+ case HitranLineStrengthOption::S:
+ if (g_upp == 0.0) {
+ l.gu = -1.0;
+ l.gl = -1.0;
+ }
+
+ l.a = l.hitran_a(S, qid.Isotopologue());
+
+ break;
+ case HitranLineStrengthOption::A: break;
+ }
+
+ ARTS_USER_ERROR_IF(
+ not std::isnormal(l.a) or not std::isnormal(l.gu),
+ "Invalid Einstein coefficient {} or gu {} for full HITRAN RECORD: {}",
+ l.a,
+ l.gu,
+ *this)
+
+ if (do_zeeman) {
+ l.z = lbl::zeeman::GetAdvancedModel(qid);
+ } else {
+ l.z = {};
+ }
+ l.z.on = false;
+
+ // Set the line shape
+ l.ls = line_shape::model{};
+ l.ls.T0 = 296.0;
+ l.ls.one_by_one = false;
+ l.ls.single_models.resize(2);
+
+ l.ls.single_models[0].species = qid.Species();
+ l.ls.single_models[0].data.emplace_back(
+ LineShapeModelVariable::G0,
+ lbl::temperature::data{LineShapeModelType::T1, Vector{gamma_self, n}});
+
+ l.ls.single_models[1].species = SpeciesEnum::Bath;
+ l.ls.single_models[1].data.emplace_back(
+ LineShapeModelVariable::G0,
+ lbl::temperature::data{LineShapeModelType::T1, Vector{gamma_air, n}});
+
+ if (delta != 0) {
+ l.ls.single_models[0].data.emplace_back(
+ LineShapeModelVariable::D0,
+ lbl::temperature::data{LineShapeModelType::T0, Vector{delta}});
+ l.ls.single_models[1].data.emplace_back(
+ LineShapeModelVariable::D0,
+ lbl::temperature::data{LineShapeModelType::T0, Vector{delta}});
+ }
+
+ l.qn = std::move(local);
+
+ return l;
+}
+} // namespace lbl
\ No newline at end of file
diff --git a/src/core/lbl/lbl_hitran.h b/src/core/lbl/lbl_hitran.h
new file mode 100644
index 0000000000..ff8dc45275
--- /dev/null
+++ b/src/core/lbl/lbl_hitran.h
@@ -0,0 +1,75 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+namespace lbl {
+struct hitran_record {
+ QuantumIdentifier qid;
+ Numeric f0;
+ Numeric S;
+ Numeric A;
+ Numeric gamma_air;
+ Numeric gamma_self;
+ Numeric E;
+ Numeric n;
+ Numeric delta;
+ Numeric g_upp;
+ Numeric g_low;
+
+ [[nodiscard]] line from(HitranLineStrengthOption ls,
+ QuantumNumberLocalState&& local,
+ bool do_zeeman) const;
+};
+using hitran_data = std::vector;
+
+hitran_data read_hitran_par(std::istream& file, const Vector2& frequency_range);
+hitran_data read_hitran_par(std::istream&& file,
+ const Vector2& frequency_range);
+} // namespace lbl
+
+template <>
+struct std::formatter {
+ format_tags tags;
+
+ [[nodiscard]] constexpr auto& inner_fmt() { return *this; }
+ [[nodiscard]] constexpr auto& inner_fmt() const { return *this; }
+
+ constexpr std::format_parse_context::iterator parse(
+ std::format_parse_context& ctx) {
+ return parse_format_tags(tags, ctx);
+ }
+
+ template
+ FmtContext::iterator format(const lbl::hitran_record& v,
+ FmtContext& ctx) const {
+ const auto sep = tags.sep();
+ tags.add_if_bracket(ctx, '[');
+ tags.format(ctx,
+ v.qid,
+ sep,
+ v.f0,
+ sep,
+ v.S,
+ sep,
+ v.A,
+ sep,
+ v.gamma_air,
+ sep,
+ v.gamma_self,
+ sep,
+ v.E,
+ sep,
+ v.n,
+ sep,
+ v.delta,
+ sep,
+ v.g_upp,
+ sep,
+ v.g_low);
+ tags.add_if_bracket(ctx, ']');
+ return ctx.out();
+ }
+};
diff --git a/src/core/lbl/lbl_lineshape.cpp b/src/core/lbl/lbl_lineshape.cpp
index 62f837e4ba..200fb4a127 100644
--- a/src/core/lbl/lbl_lineshape.cpp
+++ b/src/core/lbl/lbl_lineshape.cpp
@@ -2,6 +2,7 @@
#include
#include
+#include
#include "debug.h"
#include "lbl_data.h"
@@ -17,26 +18,24 @@
namespace lbl {
std::unique_ptr init_voigt_lte_data(
const ExhaustiveConstVectorView& f_grid,
- const std::span& bnds,
+ const AbsorptionBands& bnds,
const AtmPoint& atm,
const Vector2 los) {
if (std::ranges::any_of(
- bnds,
- [](auto& bnd) { return bnd.lineshape == LineByLineLineshape::VP_LTE; },
- &band::data))
+ bnds |std::ranges::views::values,
+ [](auto& bnd) { return bnd.lineshape == LineByLineLineshape::VP_LTE; }))
return std::make_unique(
f_grid, atm, los, zeeman::pol::no);
return nullptr;
}
std::unique_ptr init_voigt_lte_mirrored_data(
const ExhaustiveConstVectorView& f_grid,
- const std::span& bnds,
+ const AbsorptionBands& bnds,
const AtmPoint& atm,
const Vector2 los) {
if (std::ranges::any_of(
- bnds,
- [](auto& bnd) { return bnd.lineshape == LineByLineLineshape::VP_LTE_MIRROR; },
- &band::data))
+ bnds|std::ranges::views::values,
+ [](auto& bnd) { return bnd.lineshape == LineByLineLineshape::VP_LTE_MIRROR; }))
return std::make_unique(
f_grid, atm, los, zeeman::pol::no);
return nullptr;
@@ -44,13 +43,12 @@ std::unique_ptr init_voigt_lte_mirrored_data(
std::unique_ptr init_voigt_line_nlte_data(
const ExhaustiveConstVectorView& f_grid,
- const std::span& bnds,
+ const AbsorptionBands& bnds,
const AtmPoint& atm,
const Vector2 los) {
if (std::ranges::any_of(
- bnds,
- [](auto& bnd) { return bnd.lineshape == LineByLineLineshape::VP_LINE_NLTE; },
- &band::data))
+ bnds|std::ranges::views::values,
+ [](auto& bnd) { return bnd.lineshape == LineByLineLineshape::VP_LINE_NLTE; }))
return std::make_unique(
f_grid, atm, los, zeeman::pol::no);
return nullptr;
@@ -58,16 +56,15 @@ std::unique_ptr init_voigt_line_nlte_data(
std::unique_ptr init_voigt_ecs_data(
const ExhaustiveConstVectorView& f_grid,
- const std::span& bnds,
+ const AbsorptionBands& bnds,
const AtmPoint& atm,
const Vector2 los) {
if (std::ranges::any_of(
- bnds,
+ bnds|std::ranges::views::values,
[](auto& bnd) {
return bnd.lineshape == LineByLineLineshape::VP_ECS_MAKAROV or
bnd.lineshape == LineByLineLineshape::VP_ECS_HARTMANN;
- },
- &band::data))
+ }))
return std::make_unique(
f_grid, atm, los, zeeman::pol::no);
return nullptr;
@@ -80,7 +77,7 @@ void calculate(PropmatVectorView pm,
const ExhaustiveConstVectorView& f_grid,
const Jacobian::Targets& jacobian_targets,
const SpeciesEnum species,
- const std::span& bnds,
+ const AbsorptionBands& bnds,
const linemixing::isot_map& ecs_data,
const AtmPoint& atm,
const Vector2 los,
diff --git a/src/core/lbl/lbl_lineshape.h b/src/core/lbl/lbl_lineshape.h
index 63c889ef57..3e512faf3b 100644
--- a/src/core/lbl/lbl_lineshape.h
+++ b/src/core/lbl/lbl_lineshape.h
@@ -15,7 +15,7 @@ void calculate(PropmatVectorView pm,
const ExhaustiveConstVectorView& f_grid,
const Jacobian::Targets& jacobian_targets,
const SpeciesEnum species,
- const std::span& bnds,
+ const AbsorptionBands& bnds,
const linemixing::isot_map& ecs_data,
const AtmPoint& atm,
const Vector2 los,
diff --git a/src/core/lbl/lbl_lineshape_model.h b/src/core/lbl/lbl_lineshape_model.h
index 5f16bf4797..1e49d4d5be 100644
--- a/src/core/lbl/lbl_lineshape_model.h
+++ b/src/core/lbl/lbl_lineshape_model.h
@@ -19,6 +19,12 @@ struct species_model {
std::vector> data{};
+ //! Removes the variables from the model.
+ template
+ std::vector>::size_type remove_variables() {
+ return (std::erase_if(data, [v = V](const auto& x) { return x.first == v; }) + ...);
+ }
+
#define VARIABLE(name) \
[[nodiscard]] Numeric name(Numeric T0, Numeric T, Numeric P) const
diff --git a/src/core/lbl/lbl_zeeman.cpp b/src/core/lbl/lbl_zeeman.cpp
index b26bb8c64d..cb2b3f03ac 100644
--- a/src/core/lbl/lbl_zeeman.cpp
+++ b/src/core/lbl/lbl_zeeman.cpp
@@ -130,9 +130,9 @@ data GetAdvancedModel(const QuantumIdentifier& qid) {
if (qid.Isotopologue() == "O2-66"_isot) {
if (qid.val.has(QuantumNumberType::J,
QuantumNumberType::N,
- QuantumNumberType::v1)) {
- if (qid.val[QuantumNumberType::v1].low() == 0 and
- qid.val[QuantumNumberType::v1].upp() == 0) {
+ QuantumNumberType::v)) {
+ if (qid.val[QuantumNumberType::v].low() == 0 and
+ qid.val[QuantumNumberType::v].upp() == 0) {
constexpr Numeric GS = 2.002084;
constexpr Numeric GLE = 2.77e-3;
constexpr Numeric GR = -1.16e-4;
@@ -163,9 +163,9 @@ data GetAdvancedModel(const QuantumIdentifier& qid) {
} else if (qid.Isotopologue() == "O2-68"_isot) {
if (qid.val.has(QuantumNumberType::J,
QuantumNumberType::N,
- QuantumNumberType::v1)) {
- if (qid.val[QuantumNumberType::v1].low() == 0 and
- qid.val[QuantumNumberType::v1].upp() == 0) {
+ QuantumNumberType::v)) {
+ if (qid.val[QuantumNumberType::v].low() == 0 and
+ qid.val[QuantumNumberType::v].upp() == 0) {
constexpr Numeric GS = 2.002025;
constexpr Numeric GLE = 2.813e-3;
constexpr Numeric GR = -1.26e-4;
diff --git a/src/core/matpack/matpack_concepts.h b/src/core/matpack/matpack_concepts.h
index 3094bb8fc3..e4290e612b 100644
--- a/src/core/matpack/matpack_concepts.h
+++ b/src/core/matpack/matpack_concepts.h
@@ -63,6 +63,27 @@ concept is_always_exhaustive_v = std::remove_cvref_t::is_always_exhaustive();
template
concept arithmetic = std::is_arithmetic_v>;
+//! The two types are arithmetic together
+template
+concept arithmetic_addition_with = requires(T a, U b) {
+ { a + b } -> std::convertible_to;
+};
+
+template
+concept arithmetic_subtraction_with = requires(T a, U b) {
+ { a - b } -> std::convertible_to;
+};
+
+template
+concept arithmetic_multiplication_with = requires(T a, U b) {
+ { a * b } -> std::convertible_to;
+};
+
+template
+concept arithmetic_division_with = requires(T a, U b) {
+ { a / b } -> std::convertible_to;
+};
+
//! Checks that the type is a pure arithmetic complex type
template
concept complex_type =
diff --git a/src/core/matpack/matpack_view.h b/src/core/matpack/matpack_view.h
index d6d261ceea..5a1f5afae8 100644
--- a/src/core/matpack/matpack_view.h
+++ b/src/core/matpack/matpack_view.h
@@ -6,8 +6,8 @@
#include
#include
#include
-#include
#include
+#include
#include
#include
#include
@@ -1111,8 +1111,8 @@ class matpack_view {
return *this;
}
- template
- constexpr matpack_view& operator+=(const matpack_view& x)
+ template U, bool c, bool s>
+ constexpr matpack_view& operator+=(const matpack_view& x)
requires(not constant)
{
ARTS_ASSERT(shape() == x.shape(), "{} vs {}", shape(), x.shape())
@@ -1126,8 +1126,15 @@ class matpack_view {
[](auto a, auto b) { return a + b; });
return *this;
}
- template
- constexpr matpack_view& operator-=(const matpack_view& x)
+ template U>
+ constexpr matpack_view& operator+=(const matpack_data& x)
+ requires(not constant)
+ {
+ *this += x.view;
+ return *this;
+ }
+ template U, bool c, bool s>
+ constexpr matpack_view& operator-=(const matpack_view& x)
requires(not constant)
{
ARTS_ASSERT(shape() == x.shape(), "{} vs {}", shape(), x.shape())
@@ -1141,8 +1148,15 @@ class matpack_view {
[](auto a, auto b) { return a - b; });
return *this;
}
- template
- constexpr matpack_view& operator*=(const matpack_view& x)
+ template U>
+ constexpr matpack_view& operator-=(const matpack_data& x)
+ requires(not constant)
+ {
+ *this -= x.view;
+ return *this;
+ }
+ template U, bool c, bool s>
+ constexpr matpack_view& operator*=(const matpack_view& x)
requires(not constant)
{
ARTS_ASSERT(shape() == x.shape(), "{} vs {}", shape(), x.shape())
@@ -1156,8 +1170,15 @@ class matpack_view {
[](auto a, auto b) { return a * b; });
return *this;
}
- template
- constexpr matpack_view& operator/=(const matpack_view& x)
+ template U>
+ constexpr matpack_view& operator*=(const matpack_data& x)
+ requires(not constant)
+ {
+ *this *= x.view;
+ return *this;
+ }
+ template U, bool c, bool s>
+ constexpr matpack_view& operator/=(const matpack_view& x)
requires(not constant)
{
ARTS_ASSERT(shape() == x.shape(), "{} vs {}", shape(), x.shape())
@@ -1171,6 +1192,13 @@ class matpack_view {
[](auto a, auto b) { return a / b; });
return *this;
}
+ template U>
+ constexpr matpack_view& operator/=(const matpack_data& x)
+ requires(not constant)
+ {
+ *this /= x.view;
+ return *this;
+ }
constexpr matpack_view& operator+=(const data_t& x)
requires(not constant)
{
diff --git a/src/core/matpack/rational.h b/src/core/matpack/rational.h
index 46fd1e9983..e9719ac846 100644
--- a/src/core/matpack/rational.h
+++ b/src/core/matpack/rational.h
@@ -15,8 +15,8 @@
#include
#include
-#include
#include
+#include
using std::gcd;
@@ -940,8 +940,8 @@ struct std::formatter {
template
FmtContext::iterator format(const Rational& v, FmtContext& ctx) const {
- const std::string_view div = tags.comma ? ","sv : "/"sv;
- return std::format_to(ctx.out(), "{}{}{}", v.numer, div, v.denom);
+ if (v.denom == 1) return tags.format(ctx, v.numer);
+ return tags.format(ctx, v.numer, '/', v.denom);
}
};
diff --git a/src/core/options/arts_options.cc b/src/core/options/arts_options.cc
index 320cd3c831..123c05151b 100644
--- a/src/core/options/arts_options.cc
+++ b/src/core/options/arts_options.cc
@@ -14,6 +14,21 @@ using Value = std::vector;
std::vector internal_options_create() {
std::vector opts;
+ opts.emplace_back(EnumeratedOption{
+ .name = "HitranLineStrengthOption",
+ .desc =
+ R"(The way line strength is computed in ARTS when reading Hitran data.
+
+ARTS uses Einstein A-coefficients to compute the line strength. Hitran provides
+both the line strength and the Einstein A-coefficient. There is a 1-to-1 conversion
+between these two. However, as with all data, the numbers might differ slightly even
+if good cases, so we have provide this selection mechanism to make them match.
+)",
+ .values_and_desc = {
+ Value{"S", "s", "strenght", "s0", "S0", "Line strength"},
+ Value{"A", "a", "einstein", "ein", "A0", "Absorption intensity"},
+ }});
+
opts.emplace_back(EnumeratedOption{
.name = "TimeStepType",
.desc =
@@ -60,20 +75,20 @@ std::vector internal_options_create() {
Value{"wind_w", "Wind field W-component [m/s]"},
}});
- opts.emplace_back(
- EnumeratedOption{.name = "AtmKey",
- .desc = R"(A key to identify an atmospheric property.
+ opts.emplace_back(EnumeratedOption{
+ .name = "AtmKey",
+ .desc = R"(A key to identify an atmospheric property.
)",
- .values_and_desc = {
- Value{"t", "temperature", "Temperature [K]"},
- Value{"p", "pressure", "Pressure [Pa]"},
- Value{"wind_u", "WindU", "Wind field U-component [m/s]"},
- Value{"wind_v", "WindV", "Wind field V-component [m/s]"},
- Value{"wind_w", "WindW", "Wind field W-component [m/s]"},
- Value{"mag_u", "MagU", "Magnetic field U-component [T]"},
- Value{"mag_v", "MagV", "Magnetic field V-component [T]"},
- Value{"mag_w", "MagW", "Magnetic field W-component [T]"},
- }});
+ .values_and_desc = {
+ Value{"t", "temperature", "Temperature [K]"},
+ Value{"p", "pressure", "Pressure [Pa]"},
+ Value{"wind_u", "WindU", "Wind field U-component [m/s]"},
+ Value{"wind_v", "WindV", "Wind field V-component [m/s]"},
+ Value{"wind_w", "WindW", "Wind field W-component [m/s]"},
+ Value{"mag_u", "MagU", "Magnetic field U-component [T]"},
+ Value{"mag_v", "MagV", "Magnetic field V-component [T]"},
+ Value{"mag_w", "MagW", "Magnetic field W-component [T]"},
+ }});
opts.emplace_back(EnumeratedOption{
.name = "InterpolationExtrapolation",
@@ -1047,7 +1062,8 @@ radiation).
opts.emplace_back(EnumeratedOption{
.name = "ParticulateProperty",
- .desc = R"(Numerical properties used to numerically represent particle populations.
+ .desc =
+ R"(Numerical properties used to numerically represent particle populations.
)",
.values_and_desc =
{Value{"MassDensity", "m", "Mass density in kg/m^{-3}"},
@@ -1092,12 +1108,12 @@ std::string EnumeratedOption::docs() const {
const auto n = values_and_desc.front().size();
- os << "Group name: " << '"'<< name<< '"' << "\n\n"
+ os << "Group name: " << '"' << name << '"' << "\n\n"
<< desc << "\n\nValid options:\n\n";
for (auto& v : values_and_desc) {
std::string_view x = "- ";
for (auto& s : v | std::views::take(n - 1)) {
- os << std::exchange(x, " or ") << "``" << '"'<< s<< '"' << "``";
+ os << std::exchange(x, " or ") << "``" << '"' << s << '"' << "``";
}
os << ": " << v.back() << '\n';
}
diff --git a/src/core/quantum/quantum_numbers.cc b/src/core/quantum/quantum_numbers.cc
index 84d255db6d..02022b03e0 100644
--- a/src/core/quantum/quantum_numbers.cc
+++ b/src/core/quantum/quantum_numbers.cc
@@ -1003,7 +1003,7 @@ std::strong_ordering ValueList::operator<=>(const ValueList& v) const {
const std::size_t n = std::min(values.size(), v.values.size());
if (auto f = values.size() <=> v.values.size();
- f == std::strong_ordering::equal) {
+ f != std::strong_ordering::equal) {
return f;
}
diff --git a/src/core/quantum/quantum_numbers.h b/src/core/quantum/quantum_numbers.h
index 1b2c88a154..3a47aea8d6 100644
--- a/src/core/quantum/quantum_numbers.h
+++ b/src/core/quantum/quantum_numbers.h
@@ -184,8 +184,8 @@ struct TwoLevelValueHolder {
* @param s Some view of a string
* @return constexpr ValueDescription
*/
-[[nodiscard]] ValueDescription value_holder(std::string_view s,
- QuantumNumberType t) ;
+[[nodiscard]] ValueDescription value_holder(std::string_view s,
+ QuantumNumberType t);
//! Struct that converts to bool automatically but allows checking both energy levels matching status
struct LevelMatch {
@@ -203,28 +203,28 @@ struct LevelMatch {
* @param s Any set of characters
* @return constexpr Index The number of space-separated items in s
*/
- Index count_items(std::string_view s) noexcept;
+Index count_items(std::string_view s) noexcept;
/** Strips spaces at the end of x before returning it
*
* @param x any string view
* @return constexpr std::string_view stripped
*/
- std::string_view rstrip(std::string_view x);
+std::string_view rstrip(std::string_view x);
/** Strips spaces at the beginning x before returning it
*
* @param x any string view
* @return constexpr std::string_view stripped
*/
- std::string_view lstrip(std::string_view x);
+std::string_view lstrip(std::string_view x);
/** Strips spaces at the beginning and end of x before returning it
*
* @param x any string view
* @return constexpr std::string_view stripped
*/
- std::string_view strip(std::string_view x);
+std::string_view strip(std::string_view x);
/** Get a view of a number of space-separated items from the list
*
@@ -239,29 +239,30 @@ struct LevelMatch {
* @param n The length of the list of items
* @return constexpr std::string_view
*/
-std::string_view items(std::string_view s, std::size_t i, std::size_t n=1) noexcept;
+std::string_view items(std::string_view s,
+ std::size_t i,
+ std::size_t n = 1) noexcept;
//! A complete quantum number value with type information
struct Value {
QuantumNumberType type;
TwoLevelValueHolder qn;
- std::strong_ordering operator<=>(const Value& v) const;
+ std::strong_ordering operator<=>(const Value& v) const;
- Value(QuantumNumberType t = QuantumNumberType::term)
- : type(t), qn(type) {}
+ Value(QuantumNumberType t = QuantumNumberType::term) : type(t), qn(type) {}
Value(const Value&) = default;
Value(Value&&) noexcept = default;
Value& operator=(const Value&) = default;
Value& operator=(Value&&) noexcept = default;
- Value(QuantumNumberType t, Rational upp_, Rational low_);
+ Value(QuantumNumberType t, Rational upp_, Rational low_);
//! Default constructor from some string of values
- Value(std::string_view s);
+ Value(std::string_view s);
//! Returns the upper quantum number rational if it exists or an undefined
- [[nodiscard]] Rational upp() const noexcept;
+ [[nodiscard]] Rational upp() const noexcept;
//! Returns the lower quantum number rational if it exists or an undefined
[[nodiscard]] Rational low() const noexcept;
@@ -316,13 +317,13 @@ struct CheckMatch {
};
//! Updates old by what a new check says it should be
- CheckValue update(CheckValue val, CheckValue res) noexcept ;
+CheckValue update(CheckValue val, CheckValue res) noexcept;
//! Updates old by what a new check says it should be
- CheckMatch update(CheckMatch val, CheckValue res) noexcept ;
+CheckMatch update(CheckMatch val, CheckValue res) noexcept;
//! Updates old by what a new check says it should be
- CheckMatch update(CheckMatch val, CheckMatch res) noexcept;
+CheckMatch update(CheckMatch val, CheckMatch res) noexcept;
/** Checks if an array of types is sorted
*
@@ -385,29 +386,29 @@ struct ValueList {
void finalize();
//! Return number of quantum numbers
- [[nodiscard]] Index size() const { return values.size(); }
+ [[nodiscard]] Index size() const { return values.size(); }
//! Finds whether two ValueList describe completely different sets of quantum numbers (e.g., local vs global)
- [[nodiscard]] bool perpendicular(const ValueList& that) const ;
+ [[nodiscard]] bool perpendicular(const ValueList& that) const;
//! Returns whether all the Types are part of the list, the types must be sorted
- template
- [[nodiscard]] bool has(Types... ts) const {
- static_assert(sizeof...(Types) > 0);
-
- ARTS_ASSERT(is_sorted(std::array{QuantumNumberType(ts)...}))
-
- auto ptr = cbegin();
- auto end = cend();
- for (QuantumNumberType t : {QuantumNumberType(ts)...}) {
- ptr = std::find_if(ptr, end, [t](auto& x) { return x.type == t; });
- if (ptr == end) return false;
+ template
+ [[nodiscard]] bool has(Types... ts) const
+ requires(N > Size{0})
+ {
+ if constexpr (N > 1) {
+ return (has(ts) and ...);
+ } else {
+ return cend() !=
+ std::find_if(cbegin(),
+ cend(),
+ [t = std::array{QuantumNumberType(ts)...}[0]](
+ const Value& v) { return v.type == t; });
}
- return true;
}
//! Returns the value of the Type (assumes it exist)
- const Value& operator[](QuantumNumberType t) const ;
+ const Value& operator[](QuantumNumberType t) const;
//! Legacy manipulation operator access
Value& operator[](Index i) { return values.at(i); }
@@ -425,8 +426,7 @@ struct ValueList {
void set(Index i, std::string_view upp, std::string_view low);
//! Returns upper and lower matching status
- [[nodiscard]] CheckMatch check_match(const ValueList& other) const
- ;
+ [[nodiscard]] CheckMatch check_match(const ValueList& other) const;
//! ouptut stream if all values
friend std::ostream& operator<<(std::ostream& os, const ValueList& vl);
@@ -454,7 +454,7 @@ struct LocalState {
ValueList val{};
std::strong_ordering operator<=>(const LocalState& l) const;
- bool operator==(const LocalState& l) const ;
+ bool operator==(const LocalState& l) const;
bool operator!=(const LocalState& l) const;
LocalState() = default;
@@ -546,9 +546,9 @@ struct StateMatch {
StateMatch(const GlobalState& target, const GlobalState& key);
//! It is of the desired type if it is less than the value, bar None
- bool operator==(StateMatchType x) const noexcept ;
+ bool operator==(StateMatchType x) const noexcept;
- bool operator!=(StateMatchType x) const noexcept ;
+ bool operator!=(StateMatchType x) const noexcept;
};
//! VAMDC classes of quantum number cases
@@ -577,7 +577,7 @@ enum class VAMDC : char {
* @return true If it can belong to the VAMDC type
* @return false If it cannot belong to the VAMDC type
*/
-bool vamdcCheck(const ValueList& l, VAMDC type) ;
+bool vamdcCheck(const ValueList& l, VAMDC type);
//! A default state of global quantum numbers
[[maybe_unused]] inline constexpr std::array global_types{
@@ -654,6 +654,41 @@ bool vamdcCheck(const ValueList& l, VAMDC type) ;
QuantumNumberType::Kc,
QuantumNumberType::N};
+/** Selects the global state
+ *
+ * @param qns Quantum numbers to select, must just be iterable for template to work
+ * @param qid State to select from
+ * @return State of all qns in qid
+ */
+template
+[[nodiscard]] GlobalState global_state(const list_type& qns,
+ const GlobalState& qid) {
+ GlobalState out(qid.Isotopologue());
+ for (auto qn : qns) {
+ if (qid.val.has(qn)) {
+ out.val.set(qid.val[qn]);
+ }
+ }
+ return out;
+}
+/** Selects the global state
+ *
+ * @param qns Quantum numbers to select, must just be iterable for template to work
+ * @param qid State to select from
+ * @return State of all qns in qid
+ */
+template
+[[nodiscard]] LocalState local_state(const list_type& qns,
+ const GlobalState& qid) {
+ LocalState out;
+ for (auto qn : qns) {
+ if (qid.val.has(qn)) {
+ out.val.add(qid.val[qn]);
+ }
+ }
+ return out;
+}
+
std::ostream& operator<<(std::ostream& os, const Array& a);
} // namespace Quantum::Number
@@ -796,11 +831,7 @@ struct std::formatter {
template
FmtContext::iterator format(const QuantumIdentifier& v,
FmtContext& ctx) const {
- tags.add_if_bracket(ctx, '[');
- tags.format(ctx, v.Isotopologue().FullName(), tags.sep(), v.val);
- tags.add_if_bracket(ctx, ']');
-
- return ctx.out();
+ return format_to(ctx.out(), "{}{} {}{}"sv, tags.quote(), v.Isotopologue().FullName(), v.val, tags.quote());
}
};
diff --git a/src/m_abs.cc b/src/m_abs.cc
index d7166be5c0..c72d8fd83c 100644
--- a/src/m_abs.cc
+++ b/src/m_abs.cc
@@ -521,7 +521,7 @@ void propagation_matrix_agendaAuto( // Workspace reference:
Agenda& propagation_matrix_agenda,
// WS Input:
const ArrayOfArrayOfSpeciesTag& absorption_species,
- const ArrayOfAbsorptionBand& absorption_bands,
+ const AbsorptionBands& absorption_bands,
// WS Generic Input:
const Numeric& T_extrapolfac,
const Numeric& force_p,
diff --git a/src/m_absorptionlines.cc b/src/m_absorptionlines.cc
index d3b688b1da..d459e22974 100644
--- a/src/m_absorptionlines.cc
+++ b/src/m_absorptionlines.cc
@@ -165,23 +165,6 @@ void merge_local_lines(ArrayOfAbsorptionLines& abs_lines,
}
}
-/** Selects the global quantum numbers
- *
- * @param qns Quantum numbers to select
- * @param qid Identifeier to select from
- * @return QuantumIdentifier of all qns in qid
- */
-QuantumIdentifier global_quantumidentifier(const Array& qns,
- const QuantumIdentifier& qid) {
- QuantumIdentifier out(qid.Isotopologue());
- for (auto qn : qns) {
- if (qid.val.has(qn)) {
- out.val.set(qid.val[qn]);
- }
- }
- return out;
-}
-
/** Get a list of quantum numbers from a string
*
* @param[in] qnstr A string such as "J N v1"
@@ -323,7 +306,7 @@ void ReadArrayOfARTSCAT(ArrayOfAbsorptionLines& abs_lines,
// Get the global quantum number identifier
const QuantumIdentifier global_qid =
- global_quantumidentifier(global_nums, sline.quantumidentity);
+ Quantum::Number::global_state(global_nums, sline.quantumidentity);
// Get local quantum numbers into the line
for (auto qn : local_nums) {
@@ -455,7 +438,7 @@ void ReadARTSCAT(ArrayOfAbsorptionLines& abs_lines,
// Get the global quantum number identifier
const QuantumIdentifier global_qid =
- global_quantumidentifier(global_nums, sline.quantumidentity);
+ Quantum::Number::global_state(global_nums, sline.quantumidentity);
// Get local quantum numbers into the line
for (auto qn : local_nums) {
@@ -626,7 +609,7 @@ void ReadHITRAN(ArrayOfAbsorptionLines& abs_lines,
// Get the global quantum number identifier
const QuantumIdentifier global_qid =
- global_quantumidentifier(global_nums, sline.quantumidentity);
+ Quantum::Number::global_state(global_nums, sline.quantumidentity);
// Get local quantum numbers into the line
for (auto qn : local_nums) {
diff --git a/src/m_atm.cc b/src/m_atm.cc
index a0a7621762..92cc05a957 100644
--- a/src/m_atm.cc
+++ b/src/m_atm.cc
@@ -178,13 +178,12 @@ void atmospheric_fieldAppendBaseData(AtmField &atmospheric_field,
}
break;
- case MissingFieldComponentError::Ignore:
- break;
+ case MissingFieldComponentError::Ignore: break;
}
}
void keysSpecies(std::unordered_map keys,
- const ArrayOfAbsorptionBand &absorption_bands) {
+ const AbsorptionBands &absorption_bands) {
if (absorption_bands.empty()) return;
for (auto &[key, value] : absorption_bands) {
@@ -200,7 +199,7 @@ void keysSpecies(std::unordered_map keys,
void atmospheric_fieldAppendLineSpeciesData(
AtmField &atmospheric_field,
- const ArrayOfAbsorptionBand &absorption_bands,
+ const AbsorptionBands &absorption_bands,
const String &basename,
const String &extrapolation,
const Index &missing_is_zero,
@@ -219,7 +218,7 @@ void atmospheric_fieldAppendLineSpeciesData(
}
void keysIsotopologue(std::unordered_map