ARTS 2.5.11 (git: 6827797f)
xml_io_compound_types.cc
Go to the documentation of this file.
1
2// File description
4
12#include "arts.h"
13#include "cloudbox.h"
14#include "debug.h"
15#include "global_data.h"
16#include "predefined/predef_data.h"
17#include "xml_io.h"
18#include <sstream>
19
21// Overloaded functions for reading/writing data from/to XML stream
23
24//=== CIARecord ================================================
25
27
32void xml_read_from_stream(istream& is_xml,
33 CIARecord& cr,
34 bifstream* pbifs,
35 const Verbosity& verbosity) {
36 ArtsXMLTag tag(verbosity);
37 String name;
38 String molecule1;
39 String molecule2;
40 Species::Species species1;
41 Species::Species species2;
42
43 tag.read_from_stream(is_xml);
44 tag.check_name("CIARecord");
45 tag.get_attribute_value("molecule1", molecule1);
46 tag.get_attribute_value("molecule2", molecule2);
47
48 species1 = Species::fromShortName(molecule1);
49 species2 = Species::fromShortName(molecule2);
50
51 if (not good_enum(species1)) {
52 ostringstream os;
53 os << "Unknown species (1st molecule) in CIARecord: " << molecule1;
54 throw runtime_error(os.str());
55 }
56 if (not good_enum(species2)) {
57 ostringstream os;
58 os << "Unknown species (2nd molecule) in CIARecord: " << molecule2;
59 throw runtime_error(os.str());
60 }
61
62 cr.SetSpecies(species1, species2);
63
64 xml_read_from_stream(is_xml, cr.mdata, pbifs, verbosity);
65
66 tag.read_from_stream(is_xml);
67 tag.check_name("/CIARecord");
68}
69
71
77void xml_write_to_stream(ostream& os_xml,
78 const CIARecord& cr,
79 bofstream* pbofs,
80 const String& name _U_,
81 const Verbosity& verbosity) {
82 ArtsXMLTag open_tag(verbosity);
83 ArtsXMLTag close_tag(verbosity);
84
85 open_tag.set_name("CIARecord");
86 open_tag.add_attribute("molecule1", cr.MoleculeName(0));
87 open_tag.add_attribute("molecule2", cr.MoleculeName(1));
88 open_tag.write_to_stream(os_xml);
89 os_xml << '\n';
90
91 xml_write_to_stream(os_xml, cr.Data(), pbofs, "", verbosity);
92
93 close_tag.set_name("/CIARecord");
94 close_tag.write_to_stream(os_xml);
95 os_xml << '\n';
96}
97
99
105void xml_read_from_stream(istream& is_xml,
106 CovarianceMatrix& covmat,
107 bifstream* pbifs,
108 const Verbosity& verbosity) {
109 ArtsXMLTag tag(verbosity);
110 String name, type;
111 Index n_blocks, row_start, row_extent, column_start, column_extent, row_index,
112 column_index, is_inverse;
113
114 tag.read_from_stream(is_xml);
115 tag.check_name("CovarianceMatrix");
116 tag.get_attribute_value("n_blocks", n_blocks);
117
118 covmat = CovarianceMatrix();
119 for (Index i = 0; i < n_blocks; i++) {
120 tag.read_from_stream(is_xml);
121 tag.check_name("Block");
122
123 tag.get_attribute_value("row_index", row_index);
124 tag.get_attribute_value("column_index", column_index);
125 tag.get_attribute_value("row_start", row_start);
126 tag.get_attribute_value("row_extent", row_extent);
127 tag.get_attribute_value("column_start", column_start);
128 tag.get_attribute_value("column_extent", column_extent);
129 tag.get_attribute_value("type", type);
130 tag.get_attribute_value("is_inverse", is_inverse);
131
132 Range row_range(row_start, row_extent);
133 Range column_range(column_start, column_extent);
134 if (type == "Matrix") {
135 std::shared_ptr<Matrix> M =
136 std::make_shared<Matrix>(row_extent, column_extent);
137 xml_read_from_stream(is_xml, *M, pbifs, verbosity);
138 if (!is_inverse) {
139 covmat.correlations_.emplace_back(
140 row_range,
141 column_range,
142 std::make_pair(row_index, column_index),
143 M);
144 } else {
145 covmat.inverses_.emplace_back(row_range,
146 column_range,
147 std::make_pair(row_index, column_index),
148 M);
149 }
150 } else if (type == "Sparse") {
151 std::shared_ptr<Sparse> M =
152 std::make_shared<Sparse>(row_extent, column_extent);
153 xml_read_from_stream(is_xml, *M, pbifs, verbosity);
154 if (!is_inverse) {
155 covmat.correlations_.emplace_back(
156 row_range,
157 column_range,
158 std::make_pair(row_index, column_index),
159 M);
160 } else {
161 covmat.inverses_.emplace_back(row_range,
162 column_range,
163 std::make_pair(row_index, column_index),
164 M);
165 }
166 }
167 tag.read_from_stream(is_xml);
168 tag.check_name("/Block");
169 }
170 tag.read_from_stream(is_xml);
171 tag.check_name("/CovarianceMatrix");
172}
173
174//=== CovarianceMatrix =========================================================
175
177
184void xml_write_to_stream(ostream& os_xml,
185 const CovarianceMatrix& covmat,
186 bofstream* pbofs,
187 const String& name _U_,
188 const Verbosity& verbosity) {
189 ArtsXMLTag covmat_tag(verbosity);
190 ArtsXMLTag close_tag(verbosity);
191
192 covmat_tag.set_name("CovarianceMatrix");
193 covmat_tag.add_attribute(
194 "n_blocks", Index(covmat.correlations_.size() + covmat.inverses_.size()));
195 covmat_tag.write_to_stream(os_xml);
196 os_xml << '\n';
197 for (const Block& c : covmat.correlations_) {
198 ArtsXMLTag block_tag(verbosity);
199 block_tag.set_name("Block");
200
201 Index i, j;
202 std::tie(i, j) = c.get_indices();
203 block_tag.add_attribute("row_index", i);
204 block_tag.add_attribute("column_index", j);
205
206 Range row_range = c.get_row_range();
207 Range column_range = c.get_column_range();
208 block_tag.add_attribute("row_start", row_range.offset);
209 block_tag.add_attribute("row_extent", row_range.extent);
210 block_tag.add_attribute("column_start", column_range.offset);
211 block_tag.add_attribute("column_extent", column_range.extent);
212 block_tag.add_attribute("is_inverse", Index(0));
213 if (c.get_matrix_type() == Block::MatrixType::dense) {
214 block_tag.add_attribute("type", "Matrix");
215 block_tag.write_to_stream(os_xml);
216 os_xml << '\n';
217 xml_write_to_stream(os_xml, c.get_dense(), pbofs, name, verbosity);
218 } else {
219 block_tag.add_attribute("type", "Sparse");
220 block_tag.write_to_stream(os_xml);
221 os_xml << '\n';
222 xml_write_to_stream(os_xml, c.get_sparse(), pbofs, name, verbosity);
223 }
224 close_tag.set_name("/Block");
225 close_tag.write_to_stream(os_xml);
226 os_xml << '\n';
227 }
228 for (const Block& c : covmat.inverses_) {
229 ArtsXMLTag block_tag(verbosity);
230 block_tag.set_name("Block");
231
232 Index i, j;
233 std::tie(i, j) = c.get_indices();
234 block_tag.add_attribute("row_index", i);
235 block_tag.add_attribute("column_index", j);
236
237 Range row_range = c.get_row_range();
238 Range column_range = c.get_column_range();
239 block_tag.add_attribute("row_start", row_range.offset);
240 block_tag.add_attribute("row_extent", row_range.extent);
241 block_tag.add_attribute("column_start", column_range.offset);
242 block_tag.add_attribute("column_extent", column_range.extent);
243 block_tag.add_attribute("is_inverse", Index(1));
244 if (c.get_matrix_type() == Block::MatrixType::dense) {
245 block_tag.add_attribute("type", "Matrix");
246 block_tag.write_to_stream(os_xml);
247 os_xml << '\n';
248 xml_write_to_stream(os_xml, c.get_dense(), pbofs, name, verbosity);
249 } else {
250 block_tag.add_attribute("type", "Sparse");
251 block_tag.write_to_stream(os_xml);
252 os_xml << '\n';
253 xml_write_to_stream(os_xml, c.get_sparse(), pbofs, name, verbosity);
254 }
255 close_tag.set_name("/Block");
256 close_tag.write_to_stream(os_xml);
257 os_xml << '\n';
258 }
259 os_xml << '\n';
260 close_tag.set_name("/CovarianceMatrix");
261 close_tag.write_to_stream(os_xml);
262}
263
264//=== EnergyLevelMap ===========================================================
265
267
272void xml_read_from_stream(istream& is_xml,
273 EnergyLevelMap& elm,
274 bifstream* pbifs,
275 const Verbosity& verbosity) {
276 ArtsXMLTag tag(verbosity);
277
278 tag.read_from_stream(is_xml);
279
280 tag.check_name("EnergyLevelMap");
281 String type;
282 tag.get_attribute_value("type", type);
284
285 xml_read_from_stream(is_xml, elm.levels, pbifs, verbosity);
286 xml_read_from_stream(is_xml, elm.value, pbifs, verbosity);
287 xml_read_from_stream(is_xml, elm.vib_energy, pbifs, verbosity);
288
289 tag.read_from_stream(is_xml);
290 tag.check_name("/EnergyLevelMap");
291
292 elm.ThrowIfNotOK();
293}
294
296
302void xml_write_to_stream(ostream& os_xml,
303 const EnergyLevelMap& elm,
304 bofstream* pbofs,
305 const String& name,
306 const Verbosity& verbosity) {
307 ArtsXMLTag open_tag(verbosity);
308 ArtsXMLTag close_tag(verbosity);
309
310 open_tag.set_name("EnergyLevelMap");
311 if (name.length()) open_tag.add_attribute("name", name);
312 open_tag.add_attribute("type", toString(elm.type));
313 open_tag.write_to_stream(os_xml);
314
315 xml_write_to_stream(os_xml, elm.levels, pbofs, "Energy Levels", verbosity);
316 xml_write_to_stream(os_xml, elm.value, pbofs, "Level Data", verbosity);
317 xml_write_to_stream(os_xml, elm.vib_energy, pbofs, "Level Energy", verbosity);
318
319 close_tag.set_name("/EnergyLevelMap");
320 close_tag.write_to_stream(os_xml);
321 os_xml << '\n';
322}
323
324//=== GasAbsLookup ===========================================================
325
327
332void xml_read_from_stream(istream& is_xml,
333 GasAbsLookup& gal,
334 bifstream* pbifs,
335 const Verbosity& verbosity) {
336 ArtsXMLTag tag(verbosity);
337
338 tag.read_from_stream(is_xml);
339 tag.check_name("GasAbsLookup");
340
341 xml_read_from_stream(is_xml, gal.species, pbifs, verbosity);
342 xml_read_from_stream(is_xml, gal.nonlinear_species, pbifs, verbosity);
343 xml_read_from_stream(is_xml, gal.f_grid, pbifs, verbosity);
344 xml_read_from_stream(is_xml, gal.p_grid, pbifs, verbosity);
345 xml_read_from_stream(is_xml, gal.vmrs_ref, pbifs, verbosity);
346 xml_read_from_stream(is_xml, gal.t_ref, pbifs, verbosity);
347 xml_read_from_stream(is_xml, gal.t_pert, pbifs, verbosity);
348 xml_read_from_stream(is_xml, gal.nls_pert, pbifs, verbosity);
349 xml_read_from_stream(is_xml, gal.xsec, pbifs, verbosity);
350
351 tag.read_from_stream(is_xml);
352 tag.check_name("/GasAbsLookup");
353}
354
356
362void xml_write_to_stream(ostream& os_xml,
363 const GasAbsLookup& gal,
364 bofstream* pbofs,
365 const String& name,
366 const Verbosity& verbosity) {
367 ArtsXMLTag open_tag(verbosity);
368 ArtsXMLTag close_tag(verbosity);
369
370 open_tag.set_name("GasAbsLookup");
371 if (name.length()) open_tag.add_attribute("name", name);
372 open_tag.write_to_stream(os_xml);
373
374 xml_write_to_stream(os_xml, gal.species, pbofs, "", verbosity);
376 os_xml, gal.nonlinear_species, pbofs, "NonlinearSpecies", verbosity);
377 xml_write_to_stream(os_xml, gal.f_grid, pbofs, "FrequencyGrid", verbosity);
378 xml_write_to_stream(os_xml, gal.p_grid, pbofs, "PressureGrid", verbosity);
380 os_xml, gal.vmrs_ref, pbofs, "ReferenceVmrProfiles", verbosity);
382 os_xml, gal.t_ref, pbofs, "ReferenceTemperatureProfile", verbosity);
384 os_xml, gal.t_pert, pbofs, "TemperaturePerturbations", verbosity);
385 xml_write_to_stream(os_xml,
386 gal.nls_pert,
387 pbofs,
388 "NonlinearSpeciesVmrPerturbations",
389 verbosity);
391 os_xml, gal.xsec, pbofs, "AbsorptionCrossSections", verbosity);
392
393 close_tag.set_name("/GasAbsLookup");
394 close_tag.write_to_stream(os_xml);
395 os_xml << '\n';
396}
397
398//=== GriddedField ===========================================================
399
401
406void xml_read_from_stream(istream& is_xml,
407 GriddedField& gfield,
408 bifstream* pbifs,
409 const Verbosity& verbosity) {
410 XMLTag tag(verbosity);
411
412 for (Index i = 0; i < gfield.get_dim(); i++) {
413 tag.read_from_stream(is_xml);
414 if (tag.get_name() == "Vector") {
415 String s;
416 tag.get_attribute_value("name", s);
417 if (s.length()) gfield.set_grid_name(i, s);
418
419 Vector v;
420 xml_parse_from_stream(is_xml, v, pbifs, tag, verbosity);
421 gfield.set_grid(i, v);
422 tag.read_from_stream(is_xml);
423 tag.check_name("/Vector");
424 } else if (tag.get_name() == "Array") {
425 String s;
426 tag.get_attribute_value("name", s);
427 if (s.length()) gfield.set_grid_name(i, s);
428
429 tag.get_attribute_value("type", s);
430 if (s == "String") {
431 ArrayOfString as;
432 xml_parse_from_stream(is_xml, as, pbifs, tag, verbosity);
433 gfield.set_grid(i, as);
434 tag.read_from_stream(is_xml);
435 tag.check_name("/Array");
436
437 } else {
439 "Grids must be of type *Vector* or *ArrayOfString*\n"
440 "but *ArrayOf" +
441 s + "* found.");
442 }
443 } else {
444 ostringstream os;
445 os << "Grids must be of type *Vector* or *ArrayOfString*\n"
446 << "but tag <" + tag.get_name() + "> found.";
447 if (tag.get_name() == "ArrayOfString")
448 os << "\nCorrect XML tag for *ArrayOfString* is <Array type=\"String\" ...>.";
449 xml_parse_error(os.str());
450 }
451 }
452}
453
455
460void xml_write_to_stream(ostream& os_xml,
461 const GriddedField& gfield,
462 bofstream* pbofs,
463 const String& /* name */,
464 const Verbosity& verbosity) {
465 for (Index i = 0; i < gfield.get_dim(); i++) {
466 switch (gfield.get_grid_type(i)) {
468 xml_write_to_stream(os_xml,
469 gfield.get_numeric_grid(i),
470 pbofs,
471 gfield.get_grid_name(i),
472 verbosity);
473 break;
474 case GRID_TYPE_STRING:
475 xml_write_to_stream(os_xml,
476 gfield.get_string_grid(i),
477 pbofs,
478 gfield.get_grid_name(i),
479 verbosity);
480 break;
481 }
482 }
483}
484
485//=== GriddedField1 ===========================================================
486
488
493void xml_read_from_stream(istream& is_xml,
494 GriddedField1& gfield,
495 bifstream* pbifs,
496 const Verbosity& verbosity) {
497 ArtsXMLTag tag(verbosity);
498
499 tag.read_from_stream(is_xml);
500 tag.check_name("GriddedField1");
501
502 String s;
503 tag.get_attribute_value("name", s);
504 if (s.length()) gfield.set_name(s);
505
506 xml_read_from_stream(is_xml, *((GriddedField*)&gfield), pbifs, verbosity);
507 xml_read_from_stream(is_xml, gfield.data, pbifs, verbosity);
508
509 tag.read_from_stream(is_xml);
510 tag.check_name("/GriddedField1");
511
512 gfield.checksize_strict();
513}
514
516
522void xml_write_to_stream(ostream& os_xml,
523 const GriddedField1& gfield,
524 bofstream* pbofs,
525 const String& name,
526 const Verbosity& verbosity) {
527 ArtsXMLTag open_tag(verbosity);
528 ArtsXMLTag close_tag(verbosity);
529
530 open_tag.set_name("GriddedField1");
531 if (!name.length() && (gfield.get_name().length()))
532 open_tag.add_attribute("name", gfield.get_name());
533 else if (name.length())
534 open_tag.add_attribute("name", name);
535
536 open_tag.write_to_stream(os_xml);
537 os_xml << '\n';
538
539 xml_write_to_stream(os_xml, *((GriddedField*)&gfield), pbofs, "", verbosity);
540 xml_write_to_stream(os_xml, gfield.data, pbofs, "Data", verbosity);
541
542 close_tag.set_name("/GriddedField1");
543 close_tag.write_to_stream(os_xml);
544 os_xml << '\n';
545}
546
547//=== GriddedField2 ===========================================================
548
550
555void xml_read_from_stream(istream& is_xml,
556 GriddedField2& gfield,
557 bifstream* pbifs,
558 const Verbosity& verbosity) {
559 ArtsXMLTag tag(verbosity);
560
561 tag.read_from_stream(is_xml);
562 tag.check_name("GriddedField2");
563
564 String s;
565 tag.get_attribute_value("name", s);
566 if (s.length()) gfield.set_name(s);
567
568 xml_read_from_stream(is_xml, *((GriddedField*)&gfield), pbifs, verbosity);
569 xml_read_from_stream(is_xml, gfield.data, pbifs, verbosity);
570
571 tag.read_from_stream(is_xml);
572 tag.check_name("/GriddedField2");
573
574 gfield.checksize_strict();
575}
576
578
584void xml_write_to_stream(ostream& os_xml,
585 const GriddedField2& gfield,
586 bofstream* pbofs,
587 const String& name,
588 const Verbosity& verbosity) {
589 ArtsXMLTag open_tag(verbosity);
590 ArtsXMLTag close_tag(verbosity);
591
592 open_tag.set_name("GriddedField2");
593 if (!name.length() && (gfield.get_name().length()))
594 open_tag.add_attribute("name", gfield.get_name());
595 else if (name.length())
596 open_tag.add_attribute("name", name);
597
598 open_tag.write_to_stream(os_xml);
599 os_xml << '\n';
600
601 xml_write_to_stream(os_xml, *((GriddedField*)&gfield), pbofs, "", verbosity);
602 xml_write_to_stream(os_xml, gfield.data, pbofs, "Data", verbosity);
603
604 close_tag.set_name("/GriddedField2");
605 close_tag.write_to_stream(os_xml);
606 os_xml << '\n';
607}
608
609//=== GriddedField3 ===========================================================
610
612
617void xml_read_from_stream(istream& is_xml,
618 GriddedField3& gfield,
619 bifstream* pbifs,
620 const Verbosity& verbosity) {
621 ArtsXMLTag tag(verbosity);
622
623 tag.read_from_stream(is_xml);
624 tag.check_name("GriddedField3");
625
626 String s;
627 tag.get_attribute_value("name", s);
628 if (s.length()) gfield.set_name(s);
629
630 xml_read_from_stream(is_xml, *((GriddedField*)&gfield), pbifs, verbosity);
631 xml_read_from_stream(is_xml, gfield.data, pbifs, verbosity);
632
633 tag.read_from_stream(is_xml);
634 tag.check_name("/GriddedField3");
635
636 gfield.checksize_strict();
637}
638
640
646void xml_write_to_stream(ostream& os_xml,
647 const GriddedField3& gfield,
648 bofstream* pbofs,
649 const String& name,
650 const Verbosity& verbosity) {
651 ArtsXMLTag open_tag(verbosity);
652 ArtsXMLTag close_tag(verbosity);
653
654 open_tag.set_name("GriddedField3");
655 if (!name.length() && (gfield.get_name().length()))
656 open_tag.add_attribute("name", gfield.get_name());
657 else if (name.length())
658 open_tag.add_attribute("name", name);
659
660 open_tag.write_to_stream(os_xml);
661 os_xml << '\n';
662
663 xml_write_to_stream(os_xml, *((GriddedField*)&gfield), pbofs, "", verbosity);
664 xml_write_to_stream(os_xml, gfield.data, pbofs, "Data", verbosity);
665
666 close_tag.set_name("/GriddedField3");
667 close_tag.write_to_stream(os_xml);
668 os_xml << '\n';
669}
670
671//=== GriddedField4 ===========================================================
672
674
679void xml_read_from_stream(istream& is_xml,
680 GriddedField4& gfield,
681 bifstream* pbifs,
682 const Verbosity& verbosity) {
683 ArtsXMLTag tag(verbosity);
684
685 tag.read_from_stream(is_xml);
686 tag.check_name("GriddedField4");
687
688 String s;
689 tag.get_attribute_value("name", s);
690 if (s.length()) gfield.set_name(s);
691
692 xml_read_from_stream(is_xml, *((GriddedField*)&gfield), pbifs, verbosity);
693 xml_read_from_stream(is_xml, gfield.data, pbifs, verbosity);
694
695 tag.read_from_stream(is_xml);
696 tag.check_name("/GriddedField4");
697
698 gfield.checksize_strict();
699}
700
702
708void xml_write_to_stream(ostream& os_xml,
709 const GriddedField4& gfield,
710 bofstream* pbofs,
711 const String& name,
712 const Verbosity& verbosity) {
713 ArtsXMLTag open_tag(verbosity);
714 ArtsXMLTag close_tag(verbosity);
715
716 open_tag.set_name("GriddedField4");
717 if (!name.length() && (gfield.get_name().length()))
718 open_tag.add_attribute("name", gfield.get_name());
719 else if (name.length())
720 open_tag.add_attribute("name", name);
721
722 open_tag.write_to_stream(os_xml);
723 os_xml << '\n';
724
725 xml_write_to_stream(os_xml, *((GriddedField*)&gfield), pbofs, "", verbosity);
726 xml_write_to_stream(os_xml, gfield.data, pbofs, "Data", verbosity);
727
728 close_tag.set_name("/GriddedField4");
729 close_tag.write_to_stream(os_xml);
730 os_xml << '\n';
731}
732
733//=== GriddedField5 ===========================================================
734
736
741void xml_read_from_stream(istream& is_xml,
742 GriddedField5& gfield,
743 bifstream* pbifs,
744 const Verbosity& verbosity) {
745 ArtsXMLTag tag(verbosity);
746
747 tag.read_from_stream(is_xml);
748 tag.check_name("GriddedField5");
749
750 String s;
751 tag.get_attribute_value("name", s);
752 if (s.length()) gfield.set_name(s);
753
754 xml_read_from_stream(is_xml, *((GriddedField*)&gfield), pbifs, verbosity);
755 xml_read_from_stream(is_xml, gfield.data, pbifs, verbosity);
756
757 tag.read_from_stream(is_xml);
758 tag.check_name("/GriddedField5");
759
760 gfield.checksize_strict();
761}
762
764
770void xml_write_to_stream(ostream& os_xml,
771 const GriddedField5& gfield,
772 bofstream* pbofs,
773 const String& name,
774 const Verbosity& verbosity) {
775 ArtsXMLTag open_tag(verbosity);
776 ArtsXMLTag close_tag(verbosity);
777
778 open_tag.set_name("GriddedField5");
779 if (!name.length() && (gfield.get_name().length()))
780 open_tag.add_attribute("name", gfield.get_name());
781 else if (name.length())
782 open_tag.add_attribute("name", name);
783
784 open_tag.write_to_stream(os_xml);
785 os_xml << '\n';
786
787 xml_write_to_stream(os_xml, *((GriddedField*)&gfield), pbofs, "", verbosity);
788 xml_write_to_stream(os_xml, gfield.data, pbofs, "Data", verbosity);
789
790 close_tag.set_name("/GriddedField5");
791 close_tag.write_to_stream(os_xml);
792 os_xml << '\n';
793}
794
795//=== GriddedField6 ===========================================================
796
798
803void xml_read_from_stream(istream& is_xml,
804 GriddedField6& gfield,
805 bifstream* pbifs,
806 const Verbosity& verbosity) {
807 ArtsXMLTag tag(verbosity);
808
809 tag.read_from_stream(is_xml);
810 tag.check_name("GriddedField6");
811
812 String s;
813 tag.get_attribute_value("name", s);
814 if (s.length()) gfield.set_name(s);
815
816 xml_read_from_stream(is_xml, *((GriddedField*)&gfield), pbifs, verbosity);
817 xml_read_from_stream(is_xml, gfield.data, pbifs, verbosity);
818
819 tag.read_from_stream(is_xml);
820 tag.check_name("/GriddedField6");
821
822 gfield.checksize_strict();
823}
824
826
832void xml_write_to_stream(ostream& os_xml,
833 const GriddedField6& gfield,
834 bofstream* pbofs,
835 const String& name,
836 const Verbosity& verbosity) {
837 ArtsXMLTag open_tag(verbosity);
838 ArtsXMLTag close_tag(verbosity);
839
840 open_tag.set_name("GriddedField6");
841 if (!name.length() && (gfield.get_name().length()))
842 open_tag.add_attribute("name", gfield.get_name());
843 else if (name.length())
844 open_tag.add_attribute("name", name);
845
846 open_tag.write_to_stream(os_xml);
847 os_xml << '\n';
848
849 xml_write_to_stream(os_xml, *((GriddedField*)&gfield), pbofs, "", verbosity);
850 xml_write_to_stream(os_xml, gfield.data, pbofs, "Data", verbosity);
851
852 close_tag.set_name("/GriddedField6");
853 close_tag.write_to_stream(os_xml);
854 os_xml << '\n';
855}
856
857//=== GridPos =====================================================
858
860
865void xml_read_from_stream(istream& is_xml,
866 GridPos& gpos,
867 bifstream* pbifs,
868 const Verbosity& verbosity) {
869 ArtsXMLTag tag(verbosity);
870
871 tag.read_from_stream(is_xml);
872 tag.check_name("GridPos");
873
874 xml_read_from_stream(is_xml, gpos.idx, pbifs, verbosity);
875 xml_read_from_stream(is_xml, gpos.fd[0], pbifs, verbosity);
876 xml_read_from_stream(is_xml, gpos.fd[1], pbifs, verbosity);
877
878 tag.read_from_stream(is_xml);
879 tag.check_name("/GridPos");
880}
881
883
889void xml_write_to_stream(ostream& os_xml,
890 const GridPos& gpos,
891 bofstream* pbofs,
892 const String& name,
893 const Verbosity& verbosity) {
894 ArtsXMLTag open_tag(verbosity);
895 ArtsXMLTag close_tag(verbosity);
896
897 open_tag.set_name("GridPos");
898 if (name.length()) open_tag.add_attribute("name", name);
899 open_tag.write_to_stream(os_xml);
900
901 xml_write_to_stream(os_xml,
902 gpos.idx,
903 pbofs,
904 "OriginalGridIndexBelowInterpolationPoint",
905 verbosity);
907 os_xml, gpos.fd[0], pbofs, "FractionalDistanceToNextPoint_1", verbosity);
909 os_xml, gpos.fd[1], pbofs, "FractionalDistanceToNextPoint_2", verbosity);
910
911 close_tag.set_name("/GridPos");
912 close_tag.write_to_stream(os_xml);
913 os_xml << '\n';
914}
915
916//=== HitranRelaxationMatrixData ================================================
917
919
924void xml_read_from_stream(istream& is_xml,
926 bifstream* pbifs,
927 const Verbosity& verbosity) {
928 ArtsXMLTag tag(verbosity);
929
930 tag.read_from_stream(is_xml);
931 tag.check_name("HitranRelaxationMatrixData");
932
933 xml_read_from_stream(is_xml, hitran.W0pp, pbifs, verbosity);
934 xml_read_from_stream(is_xml, hitran.B0pp, pbifs, verbosity);
935 xml_read_from_stream(is_xml, hitran.W0rp, pbifs, verbosity);
936 xml_read_from_stream(is_xml, hitran.B0rp, pbifs, verbosity);
937 xml_read_from_stream(is_xml, hitran.W0qp, pbifs, verbosity);
938 xml_read_from_stream(is_xml, hitran.B0qp, pbifs, verbosity);
939 xml_read_from_stream(is_xml, hitran.W0pr, pbifs, verbosity);
940 xml_read_from_stream(is_xml, hitran.B0pr, pbifs, verbosity);
941 xml_read_from_stream(is_xml, hitran.W0rr, pbifs, verbosity);
942 xml_read_from_stream(is_xml, hitran.B0rr, pbifs, verbosity);
943 xml_read_from_stream(is_xml, hitran.W0qr, pbifs, verbosity);
944 xml_read_from_stream(is_xml, hitran.B0qr, pbifs, verbosity);
945 xml_read_from_stream(is_xml, hitran.W0pq, pbifs, verbosity);
946 xml_read_from_stream(is_xml, hitran.B0pq, pbifs, verbosity);
947 xml_read_from_stream(is_xml, hitran.W0rq, pbifs, verbosity);
948 xml_read_from_stream(is_xml, hitran.B0rq, pbifs, verbosity);
949 xml_read_from_stream(is_xml, hitran.W0qq, pbifs, verbosity);
950 xml_read_from_stream(is_xml, hitran.B0qq, pbifs, verbosity);
951
952 tag.read_from_stream(is_xml);
953 tag.check_name("/HitranRelaxationMatrixData");
954}
955
957
963void xml_write_to_stream(ostream& os_xml,
964 const HitranRelaxationMatrixData& hitran,
965 bofstream* pbofs,
966 const String& name,
967 const Verbosity& verbosity) {
968 ArtsXMLTag open_tag(verbosity);
969 ArtsXMLTag close_tag(verbosity);
970
971 open_tag.set_name("HitranRelaxationMatrixData");
972 if (name.length()) open_tag.add_attribute("name", name);
973 open_tag.write_to_stream(os_xml);
974 os_xml << '\n';
975
976 xml_write_to_stream(os_xml, hitran.W0pp, pbofs, "W0pp", verbosity);
977 xml_write_to_stream(os_xml, hitran.B0pp, pbofs, "B0pp", verbosity);
978 xml_write_to_stream(os_xml, hitran.W0rp, pbofs, "W0rp", verbosity);
979 xml_write_to_stream(os_xml, hitran.B0rp, pbofs, "B0rp", verbosity);
980 xml_write_to_stream(os_xml, hitran.W0qp, pbofs, "W0qp", verbosity);
981 xml_write_to_stream(os_xml, hitran.B0qp, pbofs, "B0qp", verbosity);
982 xml_write_to_stream(os_xml, hitran.W0pr, pbofs, "W0pr", verbosity);
983 xml_write_to_stream(os_xml, hitran.B0pr, pbofs, "B0pr", verbosity);
984 xml_write_to_stream(os_xml, hitran.W0rr, pbofs, "W0rr", verbosity);
985 xml_write_to_stream(os_xml, hitran.B0rr, pbofs, "B0rr", verbosity);
986 xml_write_to_stream(os_xml, hitran.W0qr, pbofs, "W0qr", verbosity);
987 xml_write_to_stream(os_xml, hitran.B0qr, pbofs, "B0qr", verbosity);
988 xml_write_to_stream(os_xml, hitran.W0pq, pbofs, "W0pq", verbosity);
989 xml_write_to_stream(os_xml, hitran.B0pq, pbofs, "B0pq", verbosity);
990 xml_write_to_stream(os_xml, hitran.W0rq, pbofs, "W0rq", verbosity);
991 xml_write_to_stream(os_xml, hitran.B0rq, pbofs, "B0rq", verbosity);
992 xml_write_to_stream(os_xml, hitran.W0qq, pbofs, "W0qq", verbosity);
993 xml_write_to_stream(os_xml, hitran.B0qq, pbofs, "B0qq", verbosity);
994
995 close_tag.set_name("/HitranRelaxationMatrixData");
996 close_tag.write_to_stream(os_xml);
997 os_xml << '\n';
998}
999
1000//=== Ppath =====================================================
1001
1003
1008void xml_read_from_stream(istream& is_xml,
1009 Ppath& ppath,
1010 bifstream* pbifs,
1011 const Verbosity& verbosity) {
1012 ArtsXMLTag tag(verbosity);
1013
1014 tag.read_from_stream(is_xml);
1015 tag.check_name("Ppath");
1016
1017 xml_read_from_stream(is_xml, ppath.dim, pbifs, verbosity);
1018 xml_read_from_stream(is_xml, ppath.np, pbifs, verbosity);
1019 xml_read_from_stream(is_xml, ppath.constant, pbifs, verbosity);
1020 xml_read_from_stream(is_xml, ppath.background, pbifs, verbosity);
1021 xml_read_from_stream(is_xml, ppath.start_pos, pbifs, verbosity);
1022 xml_read_from_stream(is_xml, ppath.start_los, pbifs, verbosity);
1023 xml_read_from_stream(is_xml, ppath.start_lstep, pbifs, verbosity);
1024 xml_read_from_stream(is_xml, ppath.pos, pbifs, verbosity);
1025 xml_read_from_stream(is_xml, ppath.los, pbifs, verbosity);
1026 xml_read_from_stream(is_xml, ppath.r, pbifs, verbosity);
1027 xml_read_from_stream(is_xml, ppath.lstep, pbifs, verbosity);
1028 xml_read_from_stream(is_xml, ppath.end_pos, pbifs, verbosity);
1029 xml_read_from_stream(is_xml, ppath.end_los, pbifs, verbosity);
1030 xml_read_from_stream(is_xml, ppath.end_lstep, pbifs, verbosity);
1031 xml_read_from_stream(is_xml, ppath.nreal, pbifs, verbosity);
1032 xml_read_from_stream(is_xml, ppath.ngroup, pbifs, verbosity);
1033 xml_read_from_stream(is_xml, ppath.gp_p, pbifs, verbosity);
1034 xml_read_from_stream(is_xml, ppath.gp_lat, pbifs, verbosity);
1035 xml_read_from_stream(is_xml, ppath.gp_lon, pbifs, verbosity);
1036
1037 tag.read_from_stream(is_xml);
1038 tag.check_name("/Ppath");
1039}
1040
1042
1048void xml_write_to_stream(ostream& os_xml,
1049 const Ppath& ppath,
1050 bofstream* pbofs,
1051 const String& name,
1052 const Verbosity& verbosity) {
1053 ArtsXMLTag open_tag(verbosity);
1054 ArtsXMLTag close_tag(verbosity);
1055
1056 open_tag.set_name("Ppath");
1057 if (name.length()) open_tag.add_attribute("name", name);
1058 open_tag.write_to_stream(os_xml);
1059
1061 os_xml, ppath.dim, pbofs, "AtmosphericDimensionality", verbosity);
1063 os_xml, ppath.np, pbofs, "NumberOfPositionInPropagationPath", verbosity);
1065 os_xml, ppath.constant, pbofs, "PropagationPathConstant", verbosity);
1067 os_xml, ppath.background, pbofs, "RadiativeBackground", verbosity);
1068 xml_write_to_stream(os_xml,
1069 ppath.start_pos,
1070 pbofs,
1071 "StartPositionOfPropagationPath",
1072 verbosity);
1074 os_xml, ppath.start_los, pbofs, "StartLOSOfPropagationPath", verbosity);
1075 xml_write_to_stream(os_xml,
1076 ppath.start_lstep,
1077 pbofs,
1078 "StartLstepOfPropagationPath",
1079 verbosity);
1081 os_xml, ppath.pos, pbofs, "PropagationPathPointPositions", verbosity);
1082 xml_write_to_stream(os_xml, ppath.los, pbofs, "LineOfSight", verbosity);
1084 os_xml, ppath.r, pbofs, "PropagationPathPointRadii", verbosity);
1086 os_xml, ppath.lstep, pbofs, "PropagationPathPositionLength", verbosity);
1088 os_xml, ppath.end_pos, pbofs, "EndPositionOfPropagationPath", verbosity);
1090 os_xml, ppath.end_los, pbofs, "EndLOSOfPropagationPath", verbosity);
1092 os_xml, ppath.end_lstep, pbofs, "EndLstepPropagationPath", verbosity);
1094 os_xml, ppath.nreal, pbofs, "RefractiveIndexRealPart", verbosity);
1096 os_xml, ppath.ngroup, pbofs, "GroupRefractiveIndex", verbosity);
1098 os_xml, ppath.gp_p, pbofs, "PressureGridIndexPosition", verbosity);
1100 os_xml, ppath.gp_lat, pbofs, "LatitudeGridIndexPosition", verbosity);
1102 os_xml, ppath.gp_lon, pbofs, "LongitudeGridIndexPosition", verbosity);
1103
1104 close_tag.set_name("/Ppath");
1105 close_tag.write_to_stream(os_xml);
1106 os_xml << '\n';
1107}
1108
1109//=== PropagationMatrix ======================================================
1110
1112
1117void xml_read_from_stream(istream& is_xml,
1118 PropagationMatrix& pm,
1119 bifstream* pbifs,
1120 const Verbosity& verbosity) {
1121 ArtsXMLTag tag(verbosity);
1122
1123 tag.read_from_stream(is_xml);
1124 tag.check_name("PropagationMatrix");
1125
1126 try {
1127 Tensor4 d;
1128 xml_read_from_stream(is_xml, d, pbifs, verbosity);
1129 Index naa = d.nbooks();
1130 Index nza = d.npages();
1131 Index nf = d.nrows();
1132 Index nstokes_needed = d.ncols();
1133 pm = PropagationMatrix(nf, need2stokes<true>(nstokes_needed), nza, naa);
1134 pm.Data() = std::move(d); // destructive takeover
1135 } catch (const std::runtime_error& e) {
1136 ostringstream os;
1137 os << "Error reading PropagationMatrix: "
1138 << "\n"
1139 << e.what();
1140 throw runtime_error(os.str());
1141 }
1142
1143 tag.read_from_stream(is_xml);
1144 tag.check_name("/PropagationMatrix");
1145}
1146
1148
1154void xml_write_to_stream(ostream& os_xml,
1155 const PropagationMatrix& pm,
1156 bofstream* pbofs,
1157 const String& name,
1158 const Verbosity& verbosity) {
1159 ArtsXMLTag open_tag(verbosity);
1160 ArtsXMLTag close_tag(verbosity);
1161
1162 open_tag.set_name("PropagationMatrix");
1163 if (name.length()) open_tag.add_attribute("name", name);
1164
1165 open_tag.write_to_stream(os_xml);
1166 os_xml << '\n';
1167
1168 xml_write_to_stream(os_xml, pm.Data(), pbofs, "", verbosity);
1169
1170 close_tag.set_name("/PropagationMatrix");
1171 close_tag.write_to_stream(os_xml);
1172
1173 os_xml << '\n';
1174}
1175
1176//=== QuantumIdentifier =========================================
1177
1179
1184void xml_read_from_stream(istream& is_xml,
1186 bifstream* pbifs _U_,
1187 const Verbosity& verbosity) {
1188 static_assert(QuantumIdentifier::version == 1);
1189
1190 ArtsXMLTag tag(verbosity);
1191
1192 tag.read_from_stream(is_xml);
1193 tag.check_name("QuantumIdentifier");
1194
1195 Index version;
1196 if (tag.has_attribute("version")) {
1197 tag.get_attribute_value("version", version);
1198 } else {
1199 version = 0;
1200 }
1203 "The version of this quantum identifier is too new. You need to upgrade ARTS to use it.")
1204
1205 try {
1206 String qi_str;
1207 parse_xml_tag_content_as_string(is_xml, qi_str);
1208 qi = QuantumIdentifier(qi_str, version);
1209 } catch (const std::runtime_error& e) {
1210 ostringstream os;
1211 os << "Error reading QuantumIdentifier: "
1212 << "\n"
1213 << e.what();
1214 throw runtime_error(os.str());
1215 }
1216
1217 tag.read_from_stream(is_xml);
1218 tag.check_name("/QuantumIdentifier");
1219}
1220
1222
1228void xml_write_to_stream(ostream& os_xml,
1229 const QuantumIdentifier& qi,
1230 bofstream* pbofs _U_,
1231 const String& name,
1232 const Verbosity& verbosity) {
1233 ArtsXMLTag open_tag(verbosity);
1234 ArtsXMLTag close_tag(verbosity);
1235
1236 static_assert(QuantumIdentifier::version == 1);
1237
1238 open_tag.set_name("QuantumIdentifier");
1239 open_tag.add_attribute("version", QuantumIdentifier::version);
1240 if (name.length()) open_tag.add_attribute("name", name);
1241 open_tag.write_to_stream(os_xml);
1242
1243 os_xml << qi;
1244
1245 close_tag.set_name("/QuantumIdentifier");
1246 close_tag.write_to_stream(os_xml);
1247 os_xml << endl;
1248}
1249
1250//=== RetrievalQuantity =========================================
1251
1253
1258void xml_read_from_stream(istream& is_xml,
1260 bifstream* pbifs,
1261 const Verbosity& verbosity) {
1262 ArtsXMLTag tag(verbosity);
1263 Jacobian::Target target;
1264 String subtag;
1265 String subsubtag;
1266 String mode;
1267 ArrayOfVector grids;
1268
1269 tag.read_from_stream(is_xml);
1270 tag.check_name("RetrievalQuantity");
1271
1272 xml_read_from_stream(is_xml, target, pbifs, verbosity);
1273 xml_read_from_stream(is_xml, subtag, pbifs, verbosity);
1274 xml_read_from_stream(is_xml, subsubtag, pbifs, verbosity);
1275 xml_read_from_stream(is_xml, mode, pbifs, verbosity);
1276 xml_read_from_stream(is_xml, grids, pbifs, verbosity);
1277
1278 tag.read_from_stream(is_xml);
1279 tag.check_name("/RetrievalQuantity");
1280
1281 rq = RetrievalQuantity(
1282 target, subtag, subsubtag, mode, target.perturbation, grids);
1283}
1284
1286
1292void xml_write_to_stream(ostream& os_xml,
1293 const RetrievalQuantity& rq,
1294 bofstream* pbofs,
1295 const String& name,
1296 const Verbosity& verbosity) {
1297 ArtsXMLTag open_tag(verbosity);
1298 ArtsXMLTag close_tag(verbosity);
1299
1300 open_tag.set_name("RetrievalQuantity");
1301 if (name.length()) open_tag.add_attribute("name", name);
1302 open_tag.write_to_stream(os_xml);
1303
1304 xml_write_to_stream(os_xml, rq.Target(), pbofs, "", verbosity);
1305 xml_write_to_stream(os_xml, rq.Subtag(), pbofs, "Subtag", verbosity);
1306 xml_write_to_stream(os_xml, rq.SubSubtag(), pbofs, "SubSubtag", verbosity);
1307 xml_write_to_stream(os_xml, rq.Mode(), pbofs, "Mode", verbosity);
1308 xml_write_to_stream(os_xml, rq.Grids(), pbofs, "Grids", verbosity);
1309
1310 close_tag.set_name("/RetrievalQuantity");
1311 close_tag.write_to_stream(os_xml);
1312 os_xml << '\n';
1313}
1314
1315//=== SingleScatteringData ======================================
1316
1318
1323void xml_read_from_stream(istream& is_xml,
1324 SingleScatteringData& ssdata,
1325 bifstream* pbifs,
1326 const Verbosity& verbosity) {
1327 ArtsXMLTag tag(verbosity);
1328 String version;
1329
1330 tag.read_from_stream(is_xml);
1331 tag.check_name("SingleScatteringData");
1332 tag.get_attribute_value("version", version);
1333
1334 if (version == "3") {
1335 String ptype_string;
1336 xml_read_from_stream(is_xml, ptype_string, pbifs, verbosity);
1337 ssdata.ptype = PTypeFromString(ptype_string);
1338 } else if (version == "2") {
1339 String ptype_string;
1340 xml_read_from_stream(is_xml, ptype_string, pbifs, verbosity);
1341 ssdata.ptype = PType2FromString(ptype_string);
1342 } else {
1343 Index ptype;
1344 xml_read_from_stream(is_xml, ptype, pbifs, verbosity);
1345 if (ptype != PTYPE_GENERAL && ptype != PTYPE_TOTAL_RND &&
1346 ptype != PTYPE_AZIMUTH_RND) {
1347 ostringstream os;
1348 os << "Ptype value (" << ptype << ") is wrong."
1349 << "It must be \n"
1350 << PTYPE_TOTAL_RND << " - totally randomly oriented particles,\n"
1352 << " - azimuthally randomly oriented particles, or\n"
1353 << PTYPE_GENERAL << " - arbitrary oriented particles.\n";
1354 throw runtime_error(os.str());
1355 }
1356 ssdata.ptype = PType(ptype);
1357 }
1358 xml_read_from_stream(is_xml, ssdata.description, pbifs, verbosity);
1359 xml_read_from_stream(is_xml, ssdata.f_grid, pbifs, verbosity);
1360 xml_read_from_stream(is_xml, ssdata.T_grid, pbifs, verbosity);
1361 xml_read_from_stream(is_xml, ssdata.za_grid, pbifs, verbosity);
1362 /* Verify that we have a good coverage for the za grid */
1363 if ((ssdata.za_grid[0] > 1) ||
1364 ssdata.za_grid[ssdata.za_grid.nelem() - 1] < 179) {
1365 ostringstream os;
1366 os << "Missing data in xml-stream. Expected za_grid: [0, 180]. "
1367 << "Found za_grid: [" << ssdata.za_grid[0] << ", "
1368 << ssdata.za_grid[ssdata.za_grid.nelem() - 1] << "]";
1369 throw runtime_error(os.str());
1370 }
1371 xml_read_from_stream(is_xml, ssdata.aa_grid, pbifs, verbosity);
1372
1373 xml_read_from_stream(is_xml, ssdata.pha_mat_data, pbifs, verbosity);
1374 if (ssdata.pha_mat_data.nlibraries() != ssdata.f_grid.nelem()) {
1375 throw runtime_error(
1376 "Number of frequencies in f_grid and pha_mat_data "
1377 "not matching!!!");
1378 }
1379
1380 xml_read_from_stream(is_xml, ssdata.ext_mat_data, pbifs, verbosity);
1381 xml_read_from_stream(is_xml, ssdata.abs_vec_data, pbifs, verbosity);
1382
1383 tag.read_from_stream(is_xml);
1384 tag.check_name("/SingleScatteringData");
1385
1386 if (version != "3" && ssdata.ptype == PTYPE_AZIMUTH_RND) {
1388 }
1389
1390 chk_scat_data(ssdata, verbosity);
1391}
1392
1394
1400void xml_write_to_stream(ostream& os_xml,
1401 const SingleScatteringData& ssdata,
1402 bofstream* pbofs,
1403 const String& name,
1404 const Verbosity& verbosity) {
1405 ArtsXMLTag open_tag(verbosity);
1406 ArtsXMLTag close_tag(verbosity);
1407
1408 open_tag.set_name("SingleScatteringData");
1409 if (name.length()) open_tag.add_attribute("name", name);
1410 open_tag.add_attribute("version", "3");
1411 open_tag.write_to_stream(os_xml);
1412
1413 os_xml << '\n';
1415 os_xml, PTypeToString(ssdata.ptype), pbofs, "", verbosity);
1416 xml_write_to_stream(os_xml, ssdata.description, pbofs, "", verbosity);
1417 xml_write_to_stream(os_xml, ssdata.f_grid, pbofs, "", verbosity);
1418 xml_write_to_stream(os_xml, ssdata.T_grid, pbofs, "", verbosity);
1419 xml_write_to_stream(os_xml, ssdata.za_grid, pbofs, "", verbosity);
1420 xml_write_to_stream(os_xml, ssdata.aa_grid, pbofs, "", verbosity);
1421 xml_write_to_stream(os_xml, ssdata.pha_mat_data, pbofs, "", verbosity);
1422 xml_write_to_stream(os_xml, ssdata.ext_mat_data, pbofs, "", verbosity);
1423 xml_write_to_stream(os_xml, ssdata.abs_vec_data, pbofs, "", verbosity);
1424
1425 close_tag.set_name("/SingleScatteringData");
1426 close_tag.write_to_stream(os_xml);
1427 os_xml << '\n';
1428}
1429
1430//=== ScatteringMetaData ======================================
1431
1433
1438void xml_read_from_stream(istream& is_xml,
1439 ScatteringMetaData& smdata,
1440 bifstream* pbifs,
1441 const Verbosity& verbosity) {
1442 ArtsXMLTag tag(verbosity);
1443 String version;
1444
1445 tag.read_from_stream(is_xml);
1446 tag.check_name("ScatteringMetaData");
1447 tag.get_attribute_value("version", version);
1448
1449 if (version != "3") {
1450 ostringstream os;
1451 os << "Only ScatteringMetaData version 3 can be handled. "
1452 << "Versions 1 and 2 are obsolete.";
1453 throw runtime_error(os.str());
1454 }
1455
1456 xml_read_from_stream(is_xml, smdata.description, pbifs, verbosity);
1457 xml_read_from_stream(is_xml, smdata.source, pbifs, verbosity);
1458 xml_read_from_stream(is_xml, smdata.refr_index, pbifs, verbosity);
1459 xml_read_from_stream(is_xml, smdata.mass, pbifs, verbosity);
1460 xml_read_from_stream(is_xml, smdata.diameter_max, pbifs, verbosity);
1461 xml_read_from_stream(is_xml, smdata.diameter_volume_equ, pbifs, verbosity);
1463 is_xml, smdata.diameter_area_equ_aerodynamical, pbifs, verbosity);
1464
1465 tag.read_from_stream(is_xml);
1466 tag.check_name("/ScatteringMetaData");
1467}
1468
1470
1476void xml_write_to_stream(ostream& os_xml,
1477 const ScatteringMetaData& smdata,
1478 bofstream* pbofs,
1479 const String& name,
1480 const Verbosity& verbosity) {
1481 ArtsXMLTag open_tag(verbosity);
1482 ArtsXMLTag close_tag(verbosity);
1483
1484 open_tag.set_name("ScatteringMetaData");
1485 if (name.length()) open_tag.add_attribute("name", name);
1486 open_tag.add_attribute("version", "3");
1487 open_tag.write_to_stream(os_xml);
1488
1489 xml_write_to_stream(os_xml, smdata.description, pbofs, "", verbosity);
1490 xml_write_to_stream(os_xml, smdata.source, pbofs, "", verbosity);
1491 xml_write_to_stream(os_xml, smdata.refr_index, pbofs, "", verbosity);
1492 xml_write_to_stream(os_xml, smdata.mass, pbofs, "", verbosity);
1493 xml_write_to_stream(os_xml, smdata.diameter_max, pbofs, "", verbosity);
1494 xml_write_to_stream(os_xml, smdata.diameter_volume_equ, pbofs, "", verbosity);
1496 os_xml, smdata.diameter_area_equ_aerodynamical, pbofs, "", verbosity);
1497
1498 close_tag.set_name("/ScatteringMetaData");
1499 close_tag.write_to_stream(os_xml);
1500 os_xml << '\n';
1501}
1502
1503//=== SLIData2 =====================================================
1505
1511void xml_read_from_stream(istream& is_xml,
1512 SLIData2& slidata,
1513 bifstream* pbifs,
1514 const Verbosity& verbosity) {
1515 ArtsXMLTag tag(verbosity);
1516
1517 tag.read_from_stream(is_xml);
1518 tag.check_name("SLIData2");
1519
1520 xml_read_from_stream(is_xml, slidata.x1a, pbifs, verbosity);
1521 xml_read_from_stream(is_xml, slidata.x2a, pbifs, verbosity);
1522 xml_read_from_stream(is_xml, slidata.ya, pbifs, verbosity);
1523
1524 tag.read_from_stream(is_xml);
1525 tag.check_name("/SLIData2");
1526}
1527
1528void xml_write_to_stream(ostream& os_xml,
1529 const SLIData2& slidata,
1530 bofstream* pbofs,
1531 const String& name,
1532 const Verbosity& verbosity) {
1533 ArtsXMLTag open_tag(verbosity);
1534 ArtsXMLTag close_tag(verbosity);
1535
1536 open_tag.set_name("SLIData2");
1537 if (name.length()) open_tag.add_attribute("name", name);
1538 open_tag.write_to_stream(os_xml);
1539
1540 xml_write_to_stream(os_xml, slidata.x1a, pbofs, "", verbosity);
1541 xml_write_to_stream(os_xml, slidata.x2a, pbofs, "", verbosity);
1542 xml_write_to_stream(os_xml, slidata.ya, pbofs, "", verbosity);
1543
1544 close_tag.set_name("/SLIData2");
1545 close_tag.write_to_stream(os_xml);
1546 os_xml << '\n';
1547}
1548
1549//=== SpeciesIsotopologueRatios ===========================================
1550
1552
1557void xml_read_from_stream(istream& is_xml,
1559 bifstream* pbifs,
1560 const Verbosity& verbosity) {
1561 ARTS_USER_ERROR_IF(pbifs, "No support for binary IO for (SpeciesIsotopologueRatios)")
1562
1564
1565 iso_rat = SpeciesIsotopologueRatios{};
1566
1567 ArtsXMLTag tag(verbosity);
1568
1569 tag.read_from_stream(is_xml);
1570 tag.check_name("SpeciesIsotopologueRatios");
1571
1572 Index nelem;
1573 tag.get_attribute_value("nelem", nelem);
1574
1575 String name;
1576 Numeric val;
1577 for (Index n = 0; n < nelem; n++) {
1578 is_xml >> name >> double_imanip() >> val;
1579
1580 if (is_xml.fail()) {
1581 ostringstream os;
1582 os << " near "
1583 << "\n Element: " << n;
1584 xml_data_parse_error(tag, os.str());
1585 }
1586
1587 const Index i = Species::find_species_index(Species::Tag(name).Isotopologue());
1588 ARTS_USER_ERROR_IF(i < 0 or i >= iso_rat.maxsize,
1589 "Species: ", name, " cannot be understood as a species by your compiled version of ARTS")
1590
1591 iso_rat.data[i] = val;
1592 }
1593
1594 tag.read_from_stream(is_xml);
1595 tag.check_name("/SpeciesIsotopologueRatios");
1596}
1597
1599
1605void xml_write_to_stream(ostream& os_xml,
1606 const SpeciesIsotopologueRatios& iso_rat,
1607 bofstream* pbofs,
1608 const String& name,
1609 const Verbosity& verbosity)
1610
1611{
1612 ARTS_USER_ERROR_IF(pbofs, "No support for binary IO for (SpeciesIsotopologueRatios)")
1613
1614 ArtsXMLTag open_tag(verbosity);
1615 ArtsXMLTag close_tag(verbosity);
1616
1617 open_tag.set_name("SpeciesIsotopologueRatios");
1618 if (name.length()) open_tag.add_attribute("name", name);
1619 open_tag.add_attribute("nelem", iso_rat.maxsize);
1620
1621 open_tag.write_to_stream(os_xml);
1622 os_xml << '\n';
1623
1625 os_xml << iso_rat << '\n';
1626
1627 close_tag.set_name("/SpeciesIsotopologueRatios");
1628 close_tag.write_to_stream(os_xml);
1629
1630 os_xml << '\n';
1631}
1632
1633//=== SpeciesTag ================================================
1634
1636
1640/* param pbifs Pointer to binary input stream. NULL in case of ASCII file.
1641 Ignored because SpeciesTag is always stored in ASCII format.*/
1642void xml_read_from_stream(istream& is_xml,
1643 SpeciesTag& stag,
1644 bifstream* /* pbifs */,
1645 const Verbosity& verbosity) {
1646 ArtsXMLTag tag(verbosity);
1647 stringbuf strbuf;
1648 char dummy;
1649
1650 tag.read_from_stream(is_xml);
1651 tag.check_name("SpeciesTag");
1652
1653 // Skip whitespaces
1654 bool string_starts_with_quotes = true;
1655 do {
1656 is_xml >> dummy;
1657 switch (dummy) {
1658 case ' ':
1659 case '\"':
1660 case '\n':
1661 case '\r':
1662 case '\t':
1663 break;
1664 default:
1665 string_starts_with_quotes = false;
1666 }
1667 } while (is_xml.good() && dummy != '"' && string_starts_with_quotes);
1668
1669 // Throw exception if first char after whitespaces is not a quote
1670 if (!string_starts_with_quotes) {
1671 xml_parse_error("SpeciesTag must begin with \"");
1672 }
1673
1674 is_xml.get(strbuf, '"');
1675 if (is_xml.fail()) {
1676 xml_parse_error("SpeciesTag must end with \"");
1677 }
1678
1679 stag = SpeciesTag(strbuf.str());
1680
1681 // Ignore quote
1682 is_xml >> dummy;
1683
1684 tag.read_from_stream(is_xml);
1685 tag.check_name("/SpeciesTag");
1686}
1687
1689
1694/* param pbofs Pointer to binary file stream. NULL for ASCII output.
1695 Ignore because SpeciesTag is always stored in ASCII format. */
1696void xml_write_to_stream(ostream& os_xml,
1697 const SpeciesTag& stag,
1698 bofstream* /* pbofs */,
1699 const String& name,
1700 const Verbosity& verbosity) {
1701 ArtsXMLTag open_tag(verbosity);
1702 ArtsXMLTag close_tag(verbosity);
1703
1704 open_tag.set_name("SpeciesTag");
1705 if (name.length()) open_tag.add_attribute("name", name);
1706 open_tag.write_to_stream(os_xml);
1707
1708 os_xml << '\"' << stag.Name() << '\"';
1709
1710 close_tag.set_name("/SpeciesTag");
1711 close_tag.write_to_stream(os_xml);
1712 os_xml << '\n';
1713}
1714
1715//=== Sun =====================================================
1716
1718
1723void xml_read_from_stream(istream& is_xml,
1724 Sun& sun,
1725 bifstream* pbifs,
1726 const Verbosity& verbosity) {
1727 ArtsXMLTag tag(verbosity);
1728
1729 tag.read_from_stream(is_xml);
1730 tag.check_name("Sun");
1731
1732 xml_read_from_stream(is_xml, sun.description, pbifs, verbosity);
1733 xml_read_from_stream(is_xml, sun.spectrum, pbifs, verbosity);
1734 xml_read_from_stream(is_xml, sun.radius, pbifs, verbosity);
1735 xml_read_from_stream(is_xml, sun.distance, pbifs, verbosity);
1736 xml_read_from_stream(is_xml, sun.latitude, pbifs, verbosity);
1737 xml_read_from_stream(is_xml, sun.longitude, pbifs, verbosity);
1738
1739 tag.read_from_stream(is_xml);
1740 tag.check_name("/Sun");
1741}
1742
1744
1750void xml_write_to_stream(ostream& os_xml,
1751 const Sun& sun,
1752 bofstream* pbofs,
1753 const String& name,
1754 const Verbosity& verbosity) {
1755 ArtsXMLTag open_tag(verbosity);
1756 ArtsXMLTag close_tag(verbosity);
1757
1758 open_tag.set_name("Sun");
1759 if (name.length()) open_tag.add_attribute("name", name);
1760 open_tag.write_to_stream(os_xml);
1761
1762 xml_write_to_stream(os_xml, sun.description, pbofs, "StarType", verbosity);
1763 xml_write_to_stream(os_xml, sun.spectrum, pbofs, "StarSpectrum", verbosity);
1764 xml_write_to_stream(os_xml, sun.radius, pbofs, "StarRadius", verbosity);
1765 xml_write_to_stream(os_xml, sun.distance, pbofs, "StarDistance", verbosity);
1766 xml_write_to_stream(os_xml, sun.latitude, pbofs, "StarLatitude", verbosity);
1768 os_xml, sun.longitude, pbofs, "StarLongitude", verbosity);
1769
1770 close_tag.set_name("/Sun");
1771 close_tag.write_to_stream(os_xml);
1772 os_xml << '\n';
1773}
1774
1775//=== StokesVector ======================================================
1776
1778
1783void xml_read_from_stream(istream& is_xml,
1784 StokesVector& sv,
1785 bifstream* pbifs,
1786 const Verbosity& verbosity) {
1787 ArtsXMLTag tag(verbosity);
1788
1789 tag.read_from_stream(is_xml);
1790 tag.check_name("StokesVector");
1791
1792 try {
1793 Tensor4 d;
1794 xml_read_from_stream(is_xml, d, pbifs, verbosity);
1795 Index naa = d.nbooks();
1796 Index nza = d.npages();
1797 Index nf = d.nrows();
1798 Index nstokes_needed = d.ncols();
1799 sv = StokesVector(nf, need2stokes<false>(nstokes_needed), nza, naa);
1800 sv.Data() = std::move(d); // destructive takeover
1801 } catch (const std::runtime_error& e) {
1802 ostringstream os;
1803 os << "Error reading StokesVector: "
1804 << "\n"
1805 << e.what();
1806 throw runtime_error(os.str());
1807 }
1808
1809 tag.read_from_stream(is_xml);
1810 tag.check_name("/StokesVector");
1811}
1812
1814
1820void xml_write_to_stream(ostream& os_xml,
1821 const StokesVector& sv,
1822 bofstream* pbofs,
1823 const String& name,
1824 const Verbosity& verbosity) {
1825 ArtsXMLTag open_tag(verbosity);
1826 ArtsXMLTag close_tag(verbosity);
1827
1828 open_tag.set_name("StokesVector");
1829 if (name.length()) open_tag.add_attribute("name", name);
1830
1831 open_tag.write_to_stream(os_xml);
1832 os_xml << '\n';
1833
1834 xml_write_to_stream(os_xml, sv.Data(), pbofs, "", verbosity);
1835
1836 close_tag.set_name("/StokesVector");
1837 close_tag.write_to_stream(os_xml);
1838
1839 os_xml << '\n';
1840}
1841
1842//=== TelsemAtlas ======================================================
1843
1845
1850void xml_read_from_stream(istream& is_xml,
1851 TelsemAtlas& ta,
1852 bifstream* pbifs,
1853 const Verbosity& verbosity) {
1854 ArtsXMLTag tag(verbosity);
1855
1856 tag.read_from_stream(is_xml);
1857 tag.check_name("TelsemAtlas");
1858
1859 xml_read_from_stream(is_xml, ta.ndat, pbifs, verbosity);
1860 xml_read_from_stream(is_xml, ta.nchan, pbifs, verbosity);
1861 xml_read_from_stream(is_xml, ta.name, pbifs, verbosity);
1862 xml_read_from_stream(is_xml, ta.month, pbifs, verbosity);
1863 xml_read_from_stream(is_xml, ta.dlat, pbifs, verbosity);
1864 xml_read_from_stream(is_xml, ta.emis, pbifs, verbosity);
1865 xml_read_from_stream(is_xml, ta.correl, pbifs, verbosity);
1866 xml_read_from_stream(is_xml, ta.emis_err, pbifs, verbosity);
1867 xml_read_from_stream(is_xml, ta.classes1, pbifs, verbosity);
1868 xml_read_from_stream(is_xml, ta.classes2, pbifs, verbosity);
1869 xml_read_from_stream(is_xml, ta.cellnums, pbifs, verbosity);
1871 tag.read_from_stream(is_xml);
1872 tag.check_name("/TelsemAtlas");
1873}
1874
1876
1882void xml_write_to_stream(ostream& os_xml,
1883 const TelsemAtlas& ta,
1884 bofstream* pbofs,
1885 const String& name,
1886 const Verbosity& verbosity) {
1887 ArtsXMLTag open_tag(verbosity);
1888 ArtsXMLTag close_tag(verbosity);
1889
1890 open_tag.set_name("TelsemAtlas");
1891 if (name.length()) open_tag.add_attribute("name", name);
1892
1893 open_tag.write_to_stream(os_xml);
1894 os_xml << '\n';
1895 xml_write_to_stream(os_xml, ta.ndat, pbofs, "ndat", verbosity);
1896 xml_write_to_stream(os_xml, ta.nchan, pbofs, "nchan", verbosity);
1897 xml_write_to_stream(os_xml, ta.name, pbofs, "name", verbosity);
1898 xml_write_to_stream(os_xml, ta.month, pbofs, "month", verbosity);
1899 xml_write_to_stream(os_xml, ta.dlat, pbofs, "dlat", verbosity);
1900 xml_write_to_stream(os_xml, ta.emis, pbofs, "emis", verbosity);
1901 xml_write_to_stream(os_xml, ta.correl, pbofs, "correl", verbosity);
1902 xml_write_to_stream(os_xml, ta.emis_err, pbofs, "emis_err", verbosity);
1903 xml_write_to_stream(os_xml, ta.classes1, pbofs, "class1", verbosity);
1904 xml_write_to_stream(os_xml, ta.classes2, pbofs, "class2", verbosity);
1905 xml_write_to_stream(os_xml, ta.cellnums, pbofs, "cellnum", verbosity);
1906 close_tag.set_name("/TelsemAtlas");
1907 close_tag.write_to_stream(os_xml);
1908
1909 os_xml << '\n';
1910}
1911
1912//=== XsecRecord ======================================================
1913
1915
1920void xml_read_from_stream(istream& is_xml,
1921 XsecRecord& xd,
1922 bifstream* pbifs,
1923 const Verbosity& verbosity) {
1925 ArtsXMLTag tag(verbosity);
1926 Index version;
1927
1928 tag.read_from_stream(is_xml);
1929 tag.check_name("XsecRecord");
1930 tag.get_attribute_value("version", version);
1931 xd.SetVersion(version);
1932
1933 String species_name;
1934 xml_read_from_stream(is_xml, species_name, pbifs, verbosity);
1935
1936 const Species::Species species = Species::fromShortName(species_name);
1937 if (not good_enum(species)) {
1938 ostringstream os;
1939 os << " Unknown species in XsecRecord: " << species_name;
1940 throw std::runtime_error(os.str());
1941 }
1942 xd.SetSpecies(species);
1943
1944 ARTS_USER_ERROR_IF(version != 2, "Only XsecRecord version 2 is supported")
1945
1946 xml_read_from_stream(is_xml, xd.FitMinPressures(), pbifs, verbosity);
1947 xml_read_from_stream(is_xml, xd.FitMaxPressures(), pbifs, verbosity);
1948 xml_read_from_stream(is_xml, xd.FitMinTemperatures(), pbifs, verbosity);
1949 xml_read_from_stream(is_xml, xd.FitMaxTemperatures(), pbifs, verbosity);
1950 xml_read_from_stream(is_xml, xd.FitCoeffs(), pbifs, verbosity);
1951
1952 for (const auto& fitcoeffs : xd.FitCoeffs()) {
1953 const Index ncoeff = fitcoeffs.data.ncols();
1955 ncoeff != 4, "Wrong number of coefficients, expected 4, found ", ncoeff)
1956 }
1957
1958 tag.read_from_stream(is_xml);
1959 tag.check_name("/XsecRecord");
1960}
1961
1963
1969void xml_write_to_stream(ostream& os_xml,
1970 const XsecRecord& xd,
1971 bofstream* pbofs,
1972 const String& name,
1973 const Verbosity& verbosity) {
1974 ArtsXMLTag open_tag(verbosity);
1975 ArtsXMLTag close_tag(verbosity);
1976
1977 open_tag.set_name("XsecRecord");
1978 if (name.length()) open_tag.add_attribute("name", name);
1979 open_tag.add_attribute("version", xd.Version());
1980
1981 open_tag.write_to_stream(os_xml);
1982 os_xml << '\n';
1983 xml_write_to_stream(os_xml, xd.SpeciesName(), pbofs, "species", verbosity);
1984
1985 xml_write_to_stream(os_xml,
1986 xd.FitMinPressures(),
1987 pbofs,
1988 "Mininum pressures from fit",
1989 verbosity);
1990 xml_write_to_stream(os_xml,
1991 xd.FitMaxPressures(),
1992 pbofs,
1993 "Maximum pressures from fit",
1994 verbosity);
1995 xml_write_to_stream(os_xml,
1996 xd.FitMinTemperatures(),
1997 pbofs,
1998 "Mininum temperatures from fit",
1999 verbosity);
2000 xml_write_to_stream(os_xml,
2001 xd.FitMaxTemperatures(),
2002 pbofs,
2003 "Maximum temperatures from fit",
2004 verbosity);
2006 os_xml, xd.FitCoeffs(), pbofs, "Fit coefficients", verbosity);
2007
2008 close_tag.set_name("/XsecRecord");
2009 close_tag.write_to_stream(os_xml);
2010
2011 os_xml << '\n';
2012}
2013
2014//=== MapOfErrorCorrectedSuddenData ======================================================
2015
2017
2022void xml_read_from_stream(istream& is_xml,
2024 bifstream* pbifs,
2025 const Verbosity& verbosity) {
2026 ARTS_USER_ERROR_IF(pbifs not_eq nullptr, "No binary data")
2027
2029 ArtsXMLTag open_tag(verbosity);
2030 open_tag.read_from_stream(is_xml);
2031 open_tag.check_name("MapOfErrorCorrectedSuddenData");
2032
2033 Index nelem;
2034 open_tag.get_attribute_value("nelem", nelem);
2035
2036 for (Index i=0; i<nelem; i++) {
2037 ArtsXMLTag internal_open_tag(verbosity);
2038 internal_open_tag.read_from_stream(is_xml);
2039 internal_open_tag.check_name("ErrorCorrectedSuddenData");
2040
2041 // Get key
2042 String val;
2043 internal_open_tag.get_attribute_value("key", val);
2044 auto& data = rvb[QuantumIdentifier(val)];
2045
2046 // Get size
2047 Index nelem_specs;
2048 internal_open_tag.get_attribute_value("nelem", nelem_specs);
2049
2050 // Get values
2051 for (Index j=0; j<nelem_specs; j++) {
2053 is_xml >> secds;
2054 data[secds.spec] = secds;
2055 }
2056
2057 ArtsXMLTag internal_close_tag(verbosity);
2058 internal_close_tag.read_from_stream(is_xml);
2059 internal_close_tag.check_name("/ErrorCorrectedSuddenData");
2060
2061 }
2062
2063 ArtsXMLTag close_tag(verbosity);
2064 close_tag.read_from_stream(is_xml);
2065 close_tag.check_name("/MapOfErrorCorrectedSuddenData");
2066
2067 // Sanity check, it is not OK to not have AIR as catch-all broadener
2068 for (auto& x: rvb) {
2069 bool found_air=false;
2070 for (auto& y: x.data) {
2071 found_air = found_air or (y.spec == Species::Species::Bath);
2072 }
2073 ARTS_USER_ERROR_IF(not found_air,
2074 "Incomplete ErrorCorrectedSuddenData, must contain air, contains:\n",
2075 x)
2076 }
2077}
2078
2080
2086void xml_write_to_stream(ostream& os_xml,
2088 bofstream* pbofs,
2089 const String& name,
2090 const Verbosity& verbosity) {
2091 ARTS_USER_ERROR_IF(pbofs not_eq nullptr, "No binary data")
2092
2093 ArtsXMLTag open_tag(verbosity);
2094 ArtsXMLTag close_tag(verbosity);
2095
2096 open_tag.set_name("MapOfErrorCorrectedSuddenData");
2097 if (name.length()) open_tag.add_attribute("name", name);
2098 open_tag.add_attribute("nelem", rvb.nelem());
2099 open_tag.write_to_stream(os_xml);
2100 os_xml << '\n';
2101
2103
2104 for (auto& r: rvb) {
2105 ArtsXMLTag internal_open_tag(verbosity);
2106 internal_open_tag.set_name("ErrorCorrectedSuddenData");
2107 internal_open_tag.add_attribute("key", var_string(r.id));
2108 internal_open_tag.add_attribute("nelem", r.data.nelem());
2109 internal_open_tag.write_to_stream(os_xml);
2110 os_xml << '\n';
2111
2112 // Set values
2113 os_xml << r << '\n';
2114
2115 ArtsXMLTag internal_close_tag(verbosity);
2116 internal_close_tag.set_name("/ErrorCorrectedSuddenData");
2117 internal_close_tag.write_to_stream(os_xml);
2118 os_xml << '\n';
2119 }
2120
2121 close_tag.set_name("/MapOfErrorCorrectedSuddenData");
2122 close_tag.write_to_stream(os_xml);
2123
2124 os_xml << '\n';
2125}
2126
2127
2128
2129//=== PredefinedModelData =========================================
2135void xml_read_from_stream(istream& is_xml,
2136 PredefinedModelData& pmd,
2137 bifstream* pbifs,
2138 const Verbosity& verbosity) {
2139 ARTS_USER_ERROR_IF(pbifs, "No binary data")
2140
2141 pmd = PredefinedModelData{}; // overwrite
2142
2144 ArtsXMLTag open_tag(verbosity);
2145 open_tag.read_from_stream(is_xml);
2146 open_tag.check_name("PredefinedModelData");
2147
2148 Index nelem;
2149 open_tag.get_attribute_value("nelem", nelem);
2150
2151 for (Index i = 0; i < nelem; i++) {
2152 ArtsXMLTag internal_open_tag(verbosity);
2153 internal_open_tag.read_from_stream(is_xml);
2154 internal_open_tag.check_name("Data");
2155
2156 // Get key
2157 String key_str;
2158 internal_open_tag.get_attribute_value("key", key_str);
2159 auto key =
2160 Absorption::PredefinedModel::toDataKeyOrThrow(key_str);
2161
2162 String sizes_str;
2163 internal_open_tag.get_attribute_value("sizes", sizes_str);
2164
2165 Index sizes_len;
2166 internal_open_tag.get_attribute_value("sizes_nelem", sizes_len);
2167
2168 std::vector<std::size_t> sizes(sizes_len);
2169 std::istringstream values(sizes_str);
2170 for (auto& sz : sizes) values >> sz;
2171
2172 pmd.resize(sizes, key);
2173 pmd.set_data_from_stream(is_xml, key);
2174
2175 ArtsXMLTag internal_close_tag(verbosity);
2176 internal_close_tag.read_from_stream(is_xml);
2177 internal_close_tag.check_name("/Data");
2178 }
2179
2180 ArtsXMLTag close_tag(verbosity);
2181 close_tag.read_from_stream(is_xml);
2182 close_tag.check_name("/PredefinedModelData");
2183}
2184
2191void xml_write_to_stream(ostream& os_xml,
2192 const PredefinedModelData& pmd,
2193 bofstream* pbofs,
2194 const String& name,
2195 const Verbosity& verbosity) {
2196 ARTS_USER_ERROR_IF(pbofs, "No binary data")
2197
2198 ArtsXMLTag open_tag(verbosity);
2199 ArtsXMLTag close_tag(verbosity);
2200
2201 open_tag.set_name("PredefinedModelData");
2202 if (name.length()) open_tag.add_attribute("name", name);
2203 open_tag.add_attribute("nelem", Index(pmd.size()));
2204 open_tag.write_to_stream(os_xml);
2205 os_xml << '\n';
2206
2208 const auto keys = pmd.keys();
2209
2210 for (auto& key : keys) {
2211 ArtsXMLTag internal_open_tag(verbosity);
2212 internal_open_tag.set_name("Data");
2213 internal_open_tag.add_attribute("key", toString(key));
2214
2215 auto sizes = pmd.data_size(key);
2216 internal_open_tag.add_attribute("sizes_nelem", Index(sizes.size()));
2217
2218 String sizes_str = "";
2219 for (std::size_t i = 0; i < sizes.size(); i++) {
2220 if (i > 0) sizes_str += " ";
2221 sizes_str += var_string(sizes[i]);
2222 }
2223 internal_open_tag.add_attribute("sizes", sizes_str);
2224
2225 internal_open_tag.write_to_stream(os_xml);
2226 os_xml << '\n';
2227
2228 // Set values
2229 pmd.output_data_to_stream(os_xml, key);
2230 os_xml << '\n';
2231
2232 ArtsXMLTag internal_close_tag(verbosity);
2233 internal_close_tag.set_name("/Data");
2234 internal_close_tag.write_to_stream(os_xml);
2235 os_xml << '\n';
2236 }
2237
2238 close_tag.set_name("/PredefinedModelData");
2239 close_tag.write_to_stream(os_xml);
2240
2241 os_xml << '\n';
2242}
2243
2244
2246// Dummy funtion for groups for which
2247// IO function have not yet been implemented
2249
2250// FIXME: These should be implemented, sooner or later...
2251
2253 Agenda&,
2254 bifstream* /* pbifs */,
2255 const Verbosity&) {
2256 ARTS_USER_ERROR("Method not implemented!");
2257}
2258
2260 const Agenda&,
2261 bofstream* /* pbofs */,
2262 const String& /* name */,
2263 const Verbosity&) {
2264 ARTS_USER_ERROR("Method not implemented!");
2265}
2266
2267//=== MCAntenna ================================================
2268
2270 MCAntenna&,
2271 bifstream* /* pbifs */,
2272 const Verbosity&) {
2273 ARTS_USER_ERROR("Method not implemented!");
2274}
2275
2277 const MCAntenna&,
2278 bofstream* /* pbofs */,
2279 const String& /* name */,
2280 const Verbosity&) {
2281 ARTS_USER_ERROR("Method not implemented!");
2282}
2283
2284//=== TessemNN ================================================
2285
2287 TessemNN&,
2288 bifstream* /* pbifs */,
2289 const Verbosity&) {
2290 ARTS_USER_ERROR("Method not implemented!");
2291}
2292
2294 const TessemNN&,
2295 bofstream* /* pbofs */,
2296 const String& /* name */,
2297 const Verbosity&) {
2298 ARTS_USER_ERROR("Method not implemented!");
2299}
2300
2301//=== Verbosity ================================================
2302
2304 Verbosity&,
2305 bifstream* /* pbifs */,
2306 const Verbosity&) {
2307 ARTS_USER_ERROR("Method not implemented!");
2308}
2309
2311 const Verbosity&,
2312 bofstream* /* pbofs */,
2313 const String& /* name */,
2314 const Verbosity&) {
2315 ARTS_USER_ERROR("Method not implemented!");
2316}
2317
2318//=== CallbackFunction =========================================
2319
2322 bifstream* /* pbifs */,
2323 const Verbosity&) {
2324 ARTS_USER_ERROR("Method not implemented!");
2325}
2326
2328 const CallbackFunction&,
2329 bofstream* /* pbofs */,
2330 const String& /* name */,
2331 const Verbosity&) {
2332 ARTS_USER_ERROR("Method not implemented!");
2333}
The global header file for ARTS.
The Agenda class.
Definition: agenda_class.h:52
Index nelem() const ARTS_NOEXCEPT
Definition: array.h:75
The ARTS XML tag class.
Definition: xml_io.h:28
void add_attribute(const String &aname, const std::vector< QuantumNumberType > &value)
Adds value of attribute as type std::vector<QuantumNumberType> to tag.
Definition: xml_io.cc:25
void get_attribute_value(const String &aname, SpeciesTag &value)
Returns value of attribute as type SpeciesTag.
Definition: xml_io.cc:53
CIA data for a single pair of molecules.
Definition: cia.h:51
void SetSpecies(const Species::Species first, const Species::Species second)
Set CIA species.
Definition: cia.h:131
ArrayOfGriddedField2 mdata
The data itself, directly from the HITRAN file.
Definition: cia.h:227
const ArrayOfGriddedField2 & Data() const
Return CIA data.
Definition: cia.h:121
String MoleculeName(const Index i) const
Return each molecule name (as a string) that is associated with this CIARecord.
Definition: cia.cc:239
std::vector< Block > correlations_
std::vector< Block > inverses_
An absorption lookup table.
Vector p_grid
The pressure grid for the table [Pa].
Tensor4 xsec
Absorption cross sections.
Vector t_pert
The vector of temperature perturbations [K].
Vector f_grid
The frequency grid [Hz].
Matrix vmrs_ref
The reference VMR profiles.
Vector nls_pert
The vector of perturbations for the VMRs of the nonlinear species.
Vector t_ref
The reference temperature profile [K].
ArrayOfIndex nonlinear_species
The species tags with non-linear treatment.
ArrayOfArrayOfSpeciesTag species
The species tags for which the table is valid.
void checksize_strict() const final
Strict consistency check.
void checksize_strict() const final
Strict consistency check.
void checksize_strict() const final
Strict consistency check.
void checksize_strict() const final
Strict consistency check.
void checksize_strict() const final
Strict consistency check.
void checksize_strict() const final
Strict consistency check.
const String & get_name() const
Get the name of this gridded field.
void set_name(const String &s)
Set name of this gridded field.
const ArrayOfString & get_string_grid(Index i) const
Get a string grid.
Index get_dim() const
Get the dimension of this gridded field.
void set_grid_name(Index i, const String &s)
Set grid name.
void set_grid(Index i, const Vector &g)
Set a numeric grid.
GridType get_grid_type(Index i) const
Get grid type.
const Vector & get_numeric_grid(Index i) const
Get a numeric grid.
const String & get_grid_name(Index i) const
Get grid name.
Deals with internal derivatives, Jacobian definition, and OEM calculations.
Definition: jacobian.h:310
const String & Mode() const
Returns the mode.
Definition: jacobian.h:379
Jacobian::Target & Target()
Get the Jacobian Target.
Definition: jacobian.h:416
const String & SubSubtag() const
Returns the sub-sub-tag.
Definition: jacobian.h:364
const ArrayOfVector & Grids() const
Returns the grids of the retrieval.
Definition: jacobian.h:393
const String & Subtag() const
Returns the sub-tag.
Definition: jacobian.h:350
A 2D sequential linear interpolation (SLI) lookup table This class holds the gridded for 2D SLI as we...
Definition: mc_interp.h:35
ArrayOfVector x2a
Definition: mc_interp.h:40
ArrayOfVector ya
Definition: mc_interp.h:42
Vector x1a
Definition: mc_interp.h:38
A telsem atlas.
Definition: telsem.h:42
Matrix emis
Definition: telsem.h:350
Tensor3 correl
Definition: telsem.h:354
ArrayOfIndex classes2
Definition: telsem.h:357
Index nchan
Definition: telsem.h:338
Numeric dlat
Definition: telsem.h:344
Matrix emis_err
Definition: telsem.h:352
ArrayOfIndex cellnums
Definition: telsem.h:359
ArrayOfIndex classes1
Definition: telsem.h:356
Index month
Definition: telsem.h:342
void telsem_calc_correspondence()
Definition: telsem.cc:116
Index ndat
Definition: telsem.h:336
String name
Definition: telsem.h:340
The ARTS XML tag class.
Definition: xml_io_base.h:53
bool has_attribute(const String &aname) const
Returns if the attribute exists or not.
Definition: xml_io_base.cc:108
void write_to_stream(ostream &os)
Write XML tag.
Definition: xml_io_base.cc:305
void check_name(const String &expected_name)
Check tag name.
Definition: xml_io_base.cc:37
void read_from_stream(istream &is)
Reads next XML tag.
Definition: xml_io_base.cc:184
void get_attribute_value(const String &aname, String &value)
Definition: xml_io_base.cc:123
void set_name(const String &new_name)
Definition: xml_io_base.h:61
String & get_name()
Definition: xml_io_base.h:57
Hitran crosssection class.
Definition: xsec_fit.h:26
const Vector & FitMinPressures() const
Get mininum pressures from fit.
Definition: xsec_fit.h:62
const Vector & FitMinTemperatures() const
Get mininum temperatures from fit.
Definition: xsec_fit.h:72
String SpeciesName() const
Return species name.
Definition: xsec_fit.cc:21
void SetVersion(Index version)
Set species name.
Definition: xsec_fit.cc:27
Index Version() const
Return species index.
Definition: xsec_fit.h:38
const Vector & FitMaxPressures() const
Get maximum pressures from fit.
Definition: xsec_fit.h:67
const Vector & FitMaxTemperatures() const
Get maximum temperatures.
Definition: xsec_fit.h:77
void SetSpecies(const Species::Species species)
Set species name.
Definition: xsec_fit.h:35
const ArrayOfGriddedField2 & FitCoeffs() const
Get coefficients.
Definition: xsec_fit.h:82
Binary output file stream class.
Definition: bifstream.h:26
Binary output file stream class.
Definition: bofstream.h:25
Input manipulator class for doubles to enable nan and inf parsing.
Definition: double_imanip.h:25
void chk_scat_data(const SingleScatteringData &scat_data_single, const Verbosity &verbosity)
Check single scattering data.
Definition: cloudbox.cc:275
Internal cloudbox functions.
#define _U_
Definition: config.h:177
Helper macros for debugging.
#define ARTS_USER_ERROR(...)
Definition: debug.h:151
std::string var_string(Args &&... args)
Definition: debug.h:18
#define ARTS_USER_ERROR_IF(condition,...)
Definition: debug.h:135
EnergyLevelMapType toEnergyLevelMapTypeOrThrow(std::string_view s)
constexpr std::string_view toString(EnergyLevelMapType x) noexcept
constexpr bool good_enum(EnumType x) noexcept
Checks if the enum number is good.
Definition: enums.h:21
@ GRID_TYPE_NUMERIC
@ GRID_TYPE_STRING
#define CREATE_OUT2
Definition: messages.h:188
constexpr Index find_species_index(const Species spec, const std::string_view isot) noexcept
PType PType2FromString(const String &ptype_string)
Convert ptype name to enum value.
PType PTypeFromString(const String &ptype_string)
Convert ptype name to enum value.
void ConvertAzimuthallyRandomSingleScatteringData(SingleScatteringData &ssd)
Convert azimuthally-random oriented SingleScatteringData to latest version.
String PTypeToString(const PType &ptype)
Convert particle type enum value to String.
PType
An attribute to classify the particle type (ptype) of a SingleScatteringData.
Definition: optproperties.h:35
@ PTYPE_GENERAL
Definition: optproperties.h:36
@ PTYPE_AZIMUTH_RND
Definition: optproperties.h:37
@ PTYPE_TOTAL_RND
Definition: optproperties.h:38
Quantum::Number::GlobalState QuantumIdentifier
Species::Tag SpeciesTag
Definition: species_tags.h:94
ArrayOfQuantumIdentifier levels
EnergyLevelMapType type
void ThrowIfNotOK() const ARTS_NOEXCEPT
Structure to store a grid position.
Definition: interpolation.h:56
std::array< Numeric, 2 > fd
Definition: interpolation.h:58
Index idx
Definition: interpolation.h:57
Holds all information required for individual partial derivatives.
Definition: jacobian.h:93
Numeric perturbation
Perturbations for methods where theoretical computations are impossible or plain slow.
Definition: jacobian.h:110
An Antenna object used by MCGeneral.
Definition: mc_antenna.h:33
The structure to describe a propagation path and releated quantities.
Definition: ppath_struct.h:17
Matrix los
Line-of-sight at each ppath point.
Definition: ppath_struct.h:35
ArrayOfGridPos gp_lon
Index position with respect to the longitude grid.
Definition: ppath_struct.h:55
String background
Radiative background.
Definition: ppath_struct.h:25
Index np
Number of points describing the ppath.
Definition: ppath_struct.h:21
Matrix pos
The distance between start pos and the last position in pos.
Definition: ppath_struct.h:33
ArrayOfGridPos gp_lat
Index position with respect to the latitude grid.
Definition: ppath_struct.h:53
Numeric end_lstep
The distance between end pos and the first position in pos.
Definition: ppath_struct.h:45
Vector start_pos
Start position.
Definition: ppath_struct.h:27
Vector lstep
The length between ppath points.
Definition: ppath_struct.h:39
Numeric start_lstep
Length between sensor and atmospheric boundary.
Definition: ppath_struct.h:31
Numeric constant
The propagation path constant (only used for 1D)
Definition: ppath_struct.h:23
Vector r
Radius of each ppath point.
Definition: ppath_struct.h:37
ArrayOfGridPos gp_p
Index position with respect to the pressure grid.
Definition: ppath_struct.h:51
Vector ngroup
The group index of refraction.
Definition: ppath_struct.h:49
Index dim
Atmospheric dimensionality.
Definition: ppath_struct.h:19
Vector end_pos
End position.
Definition: ppath_struct.h:41
Vector start_los
Start line-of-sight.
Definition: ppath_struct.h:29
Vector nreal
The real part of the refractive index at each path position.
Definition: ppath_struct.h:47
Vector end_los
End line-of-sight.
Definition: ppath_struct.h:43
A logical struct for global quantum numbers with species identifiers.
static constexpr Index version
Numeric diameter_area_equ_aerodynamical
Definition: optproperties.h:97
Numeric diameter_volume_equ
Definition: optproperties.h:96
std::array< Numeric, maxsize > data
static constexpr Index maxsize
The structure to describe a propagation path and releated quantities.
Definition: sun.h:38
String description
Sun description.
Definition: sun.h:40
Matrix spectrum
Sun spectrum, monochrmatic radiance spectrum at the surface of the sun.
Definition: sun.h:42
Numeric latitude
latitude of the sun in the sky of the planet
Definition: sun.h:48
Numeric longitude
longitude of the sun in the sky of the planet
Definition: sun.h:50
Numeric distance
distance from center of planet to center of sun
Definition: sun.h:46
Numeric radius
Sun radius.
Definition: sun.h:44
#define d
#define v
#define c
void xml_data_parse_error(ArtsXMLTag &tag, String str_error)
Throws XML parser runtime error.
Definition: xml_io.cc:162
This file contains basic functions to handle XML data files.
void xml_parse_from_stream(istream &, Vector &, bifstream *, ArtsXMLTag &, const Verbosity &verbosity)
void parse_xml_tag_content_as_string(std::istream &is_xml, String &content)
Get the content of an xml tag as a string.
Definition: xml_io_base.cc:706
void xml_set_stream_precision(ostream &os)
Definition: xml_io_base.cc:688
void xml_parse_error(const String &str_error)
Throws XML parser runtime error.
Definition: xml_io_base.cc:522
void xml_read_from_stream(istream &is_xml, CIARecord &cr, bifstream *pbifs, const Verbosity &verbosity)
Reads CIARecord from XML input stream.
void xml_write_to_stream(ostream &os_xml, const CIARecord &cr, bofstream *pbofs, const String &name, const Verbosity &verbosity)
Writes CIARecord to XML output stream.