Skip to content

Commit d8c66a6

Browse files
committed
Add gridUnitDimension in ScientificDefaults
requires distinguishing openPMD standard versions
1 parent 0b3a8af commit d8c66a6

6 files changed

Lines changed: 61 additions & 83 deletions

File tree

include/openPMD/backend/ScientificDefaults.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "openPMD/IO/AbstractIOHandler.hpp"
34
#include "openPMD/IO/Access.hpp"
45

56
#include <type_traits>
@@ -25,15 +26,15 @@ class ScientificDefaults
2526
-> ConfigAttribute<Child, GetDefaultValue>;
2627

2728
template <typename Parent, bool write>
28-
void addParentDefaults();
29+
void addParentDefaults(OpenpmdStandard);
2930

3031
template <bool write>
31-
void defaults_impl();
32+
void defaults_impl(OpenpmdStandard);
3233

3334
protected:
34-
void addDefaultsRecursively();
35-
void addDefaults();
36-
void readDefaults();
35+
void addDefaultsRecursively(OpenpmdStandard);
36+
void addDefaults(OpenpmdStandard);
37+
void readDefaults(OpenpmdStandard);
3738
};
3839

3940
template <typename Child>

src/Iteration.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ Iteration &Iteration::close(bool _flush)
113113

114114
if (access::write(IOHandler()->m_frontendAccess))
115115
{
116-
addDefaultsRecursively();
116+
addDefaultsRecursively(IOHandler()->m_standard);
117117
}
118118

119119
if (_flush)
@@ -503,7 +503,8 @@ void Iteration::read_impl(std::string const &groupPath)
503503
pOpen.path = groupPath;
504504
IOHandler()->enqueue(IOTask(this, pOpen));
505505

506-
internal::ScientificDefaults<Iteration>::readDefaults();
506+
internal::ScientificDefaults<Iteration>::readDefaults(
507+
IOHandler()->m_standard);
507508

508509
/* Find the root point [Series] of this file,
509510
* meshesPath and particlesPath are stored there */

src/Mesh.cpp

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,6 @@ void Mesh::flush_impl(
412412
comp.second.flush(comp.first, flushParams);
413413
}
414414
}
415-
if (!containsAttribute("gridUnitSI"))
416-
{
417-
if (IOHandler()->m_standard < OpenpmdStandard::v_2_0_0)
418-
{
419-
setGridUnitSI(1);
420-
}
421-
else
422-
{
423-
setGridUnitSIPerDimension(
424-
std::vector<double>(retrieveDimensionality(), 1));
425-
}
426-
}
427415
flushAttributes(flushParams);
428416
}
429417
}
@@ -434,50 +422,7 @@ void Mesh::read()
434422
IOHandler()->m_verify_homogeneous_extents);
435423
internal::EraseStaleEntries<Mesh> map{*this};
436424

437-
internal::ScientificDefaults<Mesh>::readDefaults();
438-
439-
Parameter<Operation::READ_ATT> aRead;
440-
441-
// TODO move this to ScientificDefaults
442-
aRead.name = "gridUnitSI";
443-
IOHandler()->enqueue(IOTask(this, aRead));
444-
IOHandler()->flush(internal::defaultFlushParams);
445-
if (IOHandler()->m_standard >= OpenpmdStandard::v_2_0_0)
446-
{
447-
if (auto val = Attribute(Attribute::from_any, *aRead.m_resource)
448-
.getOptional<std::vector<double>>();
449-
val.has_value())
450-
setGridUnitSIPerDimension(val.value());
451-
else
452-
throw error::ReadError(
453-
error::AffectedObject::Attribute,
454-
error::Reason::UnexpectedContent,
455-
{},
456-
"Unexpected Attribute datatype for 'gridUnitSI' "
457-
"(expected vector of double, found " +
458-
datatypeToString(
459-
Attribute(Attribute::from_any, *aRead.m_resource)
460-
.dtype) +
461-
")");
462-
}
463-
else
464-
{
465-
if (auto val = Attribute(Attribute::from_any, *aRead.m_resource)
466-
.getOptional<double>();
467-
val.has_value())
468-
setGridUnitSI(val.value());
469-
else
470-
throw error::ReadError(
471-
error::AffectedObject::Attribute,
472-
error::Reason::UnexpectedContent,
473-
{},
474-
"Unexpected Attribute datatype for 'gridUnitSI' "
475-
"(expected double, found " +
476-
datatypeToString(
477-
Attribute(Attribute::from_any, *aRead.m_resource)
478-
.dtype) +
479-
")");
480-
}
425+
internal::ScientificDefaults<Mesh>::readDefaults(IOHandler()->m_standard);
481426

482427
if (scalar())
483428
{

src/backend/BaseRecord.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,8 @@ inline bool BaseRecord<T_elem>::scalar() const
768768
template <typename T_elem>
769769
inline void BaseRecord<T_elem>::readBase()
770770
{
771-
internal::ScientificDefaults<BaseRecord<T_elem>>::readDefaults();
771+
internal::ScientificDefaults<BaseRecord<T_elem>>::readDefaults(
772+
this->IOHandler()->m_standard);
772773
}
773774

774775
template <typename T_elem>

src/backend/MeshRecordComponent.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ MeshRecordComponent::MeshRecordComponent(
3939

4040
void MeshRecordComponent::read()
4141
{
42-
internal::ScientificDefaults<MeshRecordComponent>::readDefaults();
42+
internal::ScientificDefaults<MeshRecordComponent>::readDefaults(
43+
IOHandler()->m_standard);
4344

4445
readBase();
4546
}

src/backend/ScientificDefaults.cpp

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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

100101
template <typename Child>
101102
template <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

115116
template <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

221225
template <typename Child>
222226
template <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

453482
template <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

459488
template <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

465494
template class ScientificDefaults<Iteration>;

0 commit comments

Comments
 (0)