11#include " openPMD/backend/ScientificDefaults.hpp"
2+ #include " openPMD/IO/AbstractIOHandler.hpp"
23#include " openPMD/ThrowError.hpp"
34#include " openPMD/backend/ScientificDefaults_internal.hpp"
45
@@ -99,23 +100,23 @@ template <typename GetDefaultValue>
99100
100101template <typename Child>
101102template <typename Parent, bool write>
102- void ScientificDefaults<Child>::addParentDefaults()
103+ void ScientificDefaults<Child>::addParentDefaults(OpenpmdStandard standard )
103104{
104105 // Cannot directly call read_impl as it is private
105106 if constexpr (write)
106107 {
107- asChild ().ScientificDefaults <Parent>::addDefaults ();
108+ asChild ().ScientificDefaults <Parent>::addDefaults (standard );
108109 }
109110 else
110111 {
111- asChild ().ScientificDefaults <Parent>::readDefaults ();
112+ asChild ().ScientificDefaults <Parent>::readDefaults (standard );
112113 }
113114}
114115
115116template <typename Child>
116- void ScientificDefaults<Child>::addDefaultsRecursively()
117+ void ScientificDefaults<Child>::addDefaultsRecursively(OpenpmdStandard standard )
117118{
118- addDefaults ();
119+ addDefaults (standard );
119120 if constexpr (IsContainer_v<Child>)
120121 {
121122 using Container_t = AsContainer_t<Child>;
@@ -125,7 +126,8 @@ void ScientificDefaults<Child>::addDefaultsRecursively()
125126 for (auto &[_, right] : asChild ())
126127 {
127128 (void )_;
128- right.ScientificDefaults <mapped_type>::addDefaultsRecursively ();
129+ right.ScientificDefaults <mapped_type>::addDefaultsRecursively (
130+ standard);
129131 }
130132 }
131133 }
@@ -136,20 +138,22 @@ void ScientificDefaults<Child>::addDefaultsRecursively()
136138 for (auto &[_, right] : asChild ().meshes )
137139 {
138140 (void )_;
139- right.ScientificDefaults <Mesh>::addDefaultsRecursively ();
141+ right.ScientificDefaults <Mesh>::addDefaultsRecursively (standard );
140142 }
141143 for (auto &[_, right] : asChild ().particles )
142144 {
143145 (void )_;
144- right.ScientificDefaults <ParticleSpecies>::addDefaultsRecursively ();
146+ right.ScientificDefaults <ParticleSpecies>::addDefaultsRecursively (
147+ standard);
145148 }
146149 }
147150 else if constexpr (std::is_same_v<Child, ParticleSpecies>)
148151 {
149152 for (auto &[_, right] : asChild ().particlePatches )
150153 {
151154 (void )_;
152- right.ScientificDefaults <PatchRecord>::addDefaultsRecursively ();
155+ right.ScientificDefaults <PatchRecord>::addDefaultsRecursively (
156+ standard);
153157 }
154158 }
155159}
@@ -220,7 +224,7 @@ auto ensureFloatingScalar(SetterFunctor &&set)
220224
221225template <typename Child>
222226template <bool write>
223- void ScientificDefaults<Child>::defaults_impl()
227+ void ScientificDefaults<Child>::defaults_impl(OpenpmdStandard standard )
224228{
225229 using maybe_read_error = std::optional<error::ReadError>;
226230 constexpr auto const wor = write ? WriteOrRead::Write : WriteOrRead::Read;
@@ -376,7 +380,32 @@ void ScientificDefaults<Child>::defaults_impl()
376380 asChild ().setAttribute (" timeOffset" , val);
377381 }))(wor);
378382
379- addParentDefaults<BaseRecord<MeshRecordComponent>, write>();
383+ if (standard >= OpenpmdStandard::v_2_0_0)
384+ {
385+ defaultAttribute (
386+ " gridUnitSI" ,
387+ [&]() {
388+ if (dimensionality < 100 )
389+ {
390+ return std::vector<double >(dimensionality, 1 .);
391+ }
392+ else
393+ {
394+ return std::vector<double >{1 .};
395+ }
396+ })
397+ .template withSetter <std::vector<double > const &>(
398+ &Mesh::setGridUnitSIPerDimension)
399+ .withReader ()(wor);
400+ }
401+ else
402+ {
403+ defaultAttribute (" gridUnitSI" , 1.0 )
404+ .withSetter (&Mesh::setGridUnitSI)
405+ .withReader ()(wor);
406+ }
407+
408+ addParentDefaults<BaseRecord<MeshRecordComponent>, write>(standard);
380409 }
381410 else if constexpr (std::is_same_v<Child, Record>)
382411 {
@@ -401,11 +430,11 @@ void ScientificDefaults<Child>::defaults_impl()
401430 asChild ().setAttribute (" timeOffset" , val);
402431 }))(wor);
403432
404- addParentDefaults<BaseRecord<RecordComponent>, write>();
433+ addParentDefaults<BaseRecord<RecordComponent>, write>(standard );
405434 }
406435 else if constexpr (std::is_same_v<Child, PatchRecord>)
407436 {
408- addParentDefaults<BaseRecord<PatchRecordComponent>, write>();
437+ addParentDefaults<BaseRecord<PatchRecordComponent>, write>(standard );
409438 }
410439 else if constexpr (std::is_same_v<Child, RecordComponent>)
411440 {
@@ -434,7 +463,7 @@ void ScientificDefaults<Child>::defaults_impl()
434463 this ->asChild ().setPosition (static_cast <decltype (val)>(val));
435464 }))(wor);
436465
437- addParentDefaults<RecordComponent, write>();
466+ addParentDefaults<RecordComponent, write>(standard );
438467 }
439468 else if constexpr (std::is_same_v<Child, PatchRecordComponent>)
440469 {
@@ -451,15 +480,15 @@ void ScientificDefaults<Child>::defaults_impl()
451480}
452481
453482template <typename Child>
454- void ScientificDefaults<Child>::addDefaults()
483+ void ScientificDefaults<Child>::addDefaults(OpenpmdStandard standard )
455484{
456- defaults_impl</* write = */ true >();
485+ defaults_impl</* write = */ true >(standard );
457486}
458487
459488template <typename Child>
460- void ScientificDefaults<Child>::readDefaults()
489+ void ScientificDefaults<Child>::readDefaults(OpenpmdStandard standard )
461490{
462- defaults_impl</* write = */ false >();
491+ defaults_impl</* write = */ false >(standard );
463492}
464493
465494template class ScientificDefaults <Iteration>;
0 commit comments