@@ -21,6 +21,7 @@ inline FileAdios2::FileAdios2(adios2::ADIOS& ad, const std::string& name,
2121 io_name_ = io_name;
2222 }
2323 io_ = ad.DeclareIO (io_name_);
24+ // io_.SetEngine("BP4");
2425 adios2::Mode adios2_mode;
2526 if (mode == Mode::Read) {
2627 adios2_mode = adios2::Mode::Read;
@@ -179,6 +180,21 @@ inline Dims FileAdios2::shapeVariable(const std::string& name) const
179180 std::abort ();
180181}
181182
183+ template <typename T>
184+ inline void FileAdios2::putAttribute (const std::string& name, const T& datum)
185+ {
186+ // if (mpiRank() != 0) { // FIXME, should we do this?
187+ // return;
188+ // }
189+ auto attr = io_.InquireAttribute <T>(name);
190+ if (attr) {
191+ mprintf (" attr '%s' already exists -- ignoring it!\n " , name.c_str ());
192+ } else {
193+ // FIXME? we're never using "single value", just an array of size 1
194+ io_.DefineAttribute <T>(name, datum);
195+ }
196+ }
197+
182198template <typename T>
183199inline void FileAdios2::putAttribute (const std::string& name, const T* data,
184200 size_t size)
@@ -224,6 +240,27 @@ inline void FileAdios2::getAttribute(const std::string& name, TypePointer data)
224240 mpark::visit (GetAttribute{*this , name}, data);
225241}
226242
243+ struct FileAdios2 ::PutAttributeScalar
244+ {
245+ PutAttributeScalar (FileAdios2& self, const std::string& name)
246+ : self{self}, name{name}
247+ {}
248+
249+ template <typename T>
250+ void operator ()(const T& datum)
251+ {
252+ self.putAttribute (name, datum);
253+ }
254+
255+ FileAdios2& self;
256+ const std::string& name;
257+ };
258+
259+ inline void FileAdios2::putAttribute (const std::string& name, const Type& datum)
260+ {
261+ mpark::visit (PutAttributeScalar{*this , name}, datum);
262+ }
263+
227264struct FileAdios2 ::PutAttribute
228265{
229266 PutAttribute (FileAdios2& self, const std::string& name, size_t size)
0 commit comments