MFEM v4.7.0
Finite element discretization library
Loading...
Searching...
No Matches
sidredatacollection.hpp
Go to the documentation of this file.
1// Copyright (c) 2010-2024, Lawrence Livermore National Security, LLC. Produced
2// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
3// LICENSE and NOTICE for details. LLNL-CODE-806117.
4//
5// This file is part of the MFEM library. For more information and source code
6// availability visit https://mfem.org.
7//
8// MFEM is free software; you can redistribute it and/or modify it under the
9// terms of the BSD-3 license. We welcome feedback and contributions, see file
10// CONTRIBUTING.md for details.
11
12#ifndef MFEM_SIDREDATACOLLECTION
13#define MFEM_SIDREDATACOLLECTION
14
15#include "../config/config.hpp"
16
17#ifdef MFEM_USE_SIDRE
18
19#include "datacollection.hpp"
20
21// Ignore warnings from the axom/sidre header (GCC + Clang versions)
22#ifdef MFEM_HAVE_GCC_PRAGMA_DIAGNOSTIC
23# pragma GCC diagnostic push
24# if defined(__clang__)
25# pragma GCC diagnostic ignored "-Wextra-semi"
26# else // real GCC?
27# pragma GCC diagnostic ignored "-Wpedantic"
28# endif
29#endif
30#include <axom/sidre.hpp>
31#ifdef MFEM_HAVE_GCC_PRAGMA_DIAGNOSTIC
32# pragma GCC diagnostic pop
33#endif
34
35namespace mfem
36{
37
38/** @brief Data collection with Sidre routines following the Conduit mesh
39 blueprint specification. */
40/** SidreDataCollection provides an HDF5-based file format for visualization or
41 restart capability. This functionality is aimed primarily at customers of
42 LLNL's axom project that run problems at extreme scales.
43
44 For more information, see:
45 - Sidre component of LLNL's axom project (to be open-sourced), http://goo.gl/cZyJdn
46 - LLNL conduit/blueprint library, https://github.com/LLNL/conduit
47 - HDF5 library, https://support.hdfgroup.org/HDF5
48
49 The layout created in the Sidre DataStore is: (`"──"` denote groups,
50 `"─•"` denote views, `"─>"` denote links, i.e. shallow-copy view)
51
52 <root>
53 ├── <collection-name>_global (global group)
54 │ └── blueprint_index
55 │ └── <collection-name> (bp_index group)
56 │ ├── state
57 │ │ ├─• cycle
58 │ │ ├─• time
59 │ │ └─• number_of_domains = <mesh-mpi-comm-size>
60 │ ├── coordsets
61 │ │ └── coords
62 │ │ ├─• path = "<bp-path>/coordsets/coords"
63 │ │ ├─• type ─> <bp-grp>/coordsets/coords/type = "explicit"
64 │ │ └─• coord_system = "x"|"xy"|"xyz"
65 │ ├── topologies
66 │ │ ├── mesh
67 │ │ │ ├─• path = "<bp-path>/topologies/mesh"
68 │ │ │ ├─• type ─> <bp-grp>/topologies/mesh/type = "unstructured"
69 │ │ │ ├─• coordset ─> <bp-grp>/topologies/mesh/coordset = "coords"
70 │ │ │ ├─• grid_function ─> <bp-grp>/topologies/mesh/grid_function = "<nodes-field-name>"
71 │ │ │ └─• boundary_topology ─> <bp-grp>/topologies/mesh/boundary_topology = "boundary"
72 │ │ └── boundary
73 │ │ ├─• path = "<bp-path>/topologies/mesh"
74 │ │ ├─• type ─> <bp-grp>/topologies/boundary/type = "unstructured"
75 │ │ └─• coordset ─> <bp-grp>/topologies/boundary/coordset = "coords"
76 │ └── fields
77 │ ├── mesh_material_attribute
78 │ │ ├─• path = "<bp-path>/fields/mesh_material_attribute"
79 │ │ ├─• association ─> <bp-grp>/fields/mesh_material_attribute/association = "element"
80 │ │ ├─• topology ─> <bp-grp>/fields/mesh_material_attribute/topology = "mesh"
81 │ │ └─• number_of_components = 1
82 │ ├── boundary_material_attribute
83 │ │ ├─• path = "<bp-path>/fields/boundary_material_attribute"
84 │ │ ├─• association ─> <bp-grp>/fields/boundary_material_attribute/association = "element"
85 │ │ ├─• topology ─> <bp-grp>/fields/boundary_material_attribute/topology = "boundary"
86 │ │ └─• number_of_components = 1
87 │ ├── grid-function-1
88 │ │ ├─• path = "<bp-path>/fields/grid-function-1"
89 │ │ ├─• basis ─> <bp-grp>/fields/grid-function-1/basis = "<fe-coll-name>"
90 │ │ ├─• topology ─> <bp-grp>/fields/grid-function-1/topology = "mesh"
91 │ │ └─• number_of_components = gf1->VectorDim()
92 │ ├── grid-function-2
93 │ │ ├─• path = "<bp-path>/fields/grid-function-2"
94 │ │ ├─• basis ─> <bp-grp>/fields/grid-function-2/basis = "<fe-coll-name>"
95 │ │ ├─• topology ─> <bp-grp>/fields/grid-function-2/topology = "mesh"
96 │ │ └─• number_of_components = gf2->VectorDim()
97 │ ├── ...
98 │ ...
99 └── <collection-name> (domain group)
100 ├── blueprint (blueprint group)
101 │ ├── state
102 │ │ ├─• cycle
103 │ │ ├─• time
104 │ │ ├─• domain = <mesh-mpi-rank>
105 │ │ └─• time_step
106 │ ├── coordsets
107 │ │ └── coords
108 │ │ ├─• type = "explicit"
109 │ │ └── values
110 │ │ ├─• x = view in <vertex-coords-buffer>/<ext-double-data>
111 │ │ ├─• y = view in <vertex-coords-buffer>/<ext-double-data>
112 │ │ └─• z = view in <vertex-coords-buffer>/<ext-double-data>
113 │ ├── topologies
114 │ │ ├── mesh
115 │ │ │ ├─• type = "unstructured"
116 │ │ │ ├── elements
117 │ │ │ │ ├─• shape = "points"|"lines"|...
118 │ │ │ │ └─• connectivity = <vert-idx-array>
119 │ │ │ ├─• coordset = "coords"
120 │ │ │ ├─• grid_function = "<nodes-field-name>"
121 │ │ │ └─• boundary_topology = "boundary"
122 │ │ └── boundary
123 │ │ ├─• type = "unstructured"
124 │ │ ├── elements
125 │ │ │ ├─• shape = "points"|"lines"|...
126 │ │ │ └─• connectivity = <vert-idx-array>
127 │ │ └─• coordset = "coords"
128 │ └── fields
129 │ ├── mesh_material_attribute
130 │ │ ├─• association = "element"
131 │ │ ├─• topology = "mesh"
132 │ │ └─• values = <attr-array>
133 │ ├── boundary_material_attribute
134 │ │ ├─• association = "element"
135 │ │ ├─• topology = "boundary"
136 │ │ └─• values = <attr-array>
137 │ ├── grid-function-1 (name can include path)
138 │ │ ├─• basis = "<fe-coll-name>"
139 │ │ ├─• topology = "mesh"
140 │ │ └─• values = <ext-double-array>/<named-buffer> (vdim == 1)
141 │ ├── grid-function-2 (name can include path)
142 │ │ ├─• basis = "<fe-coll-name>"
143 │ │ ├─• topology = "mesh"
144 │ │ └── values (vdim > 1)
145 │ │ ├─• x0 = view into <ext-double-array>/<named-buffer>
146 │ │ ├─• x1 = view into <ext-double-array>/<named-buffer>
147 │ │ └─• x2 = view into <ext-double-array>/<named-buffer>
148 │ ├── ...
149 │ ...
150 └── named_buffers (named_buffers group)
151 ├─• vertex_coords = <double-array>
152 ├─• grid-function-1 = <double-array>
153 ├─• grid-function-2 = <double-array>
154 ...
155
156 @note blueprint_index is used both in serial and in parallel. In parallel,
157 only rank 0 will add entries to the blueprint index.
158
159 @note QuadratureFunction%s (q-fields) are not supported.
160
161 @note SidreDataCollection does not manage the FiniteElementSpace%s and
162 FiniteElementCollection%s associated with registered GridFunction%s.
163 Therefore, field registration is left to the user of SidreDataCollection and
164 there are no methods that automatically register GridFunction%s using just
165 the content of the Sidre DataStore. Such capabilities can be implemented in
166 a derived class, adding any desired object management routines.
167
168 @warning This class is still _experimental_, meaning that in future
169 releases, it may not be backward compatible, and the output files generated
170 by the current version may become unreadable.
171*/
173{
174public:
177
178public:
179
180 /// Constructor that allocates and initializes a Sidre DataStore.
181 /**
182 @param[in] collection_name Name of the collection used as a file name
183 when saving
184 @param[in] the_mesh Mesh shared by all grid functions in the
185 collection (can be NULL)
186 @param[in] owns_mesh_data Does the SidreDC own the mesh vertices?
187
188 With this constructor, the SidreDataCollection owns the allocated Sidre
189 DataStore.
190 */
191 SidreDataCollection(const std::string& collection_name,
192 Mesh *the_mesh = NULL,
193 bool owns_mesh_data = false);
194
195 /// Constructor that links to an external Sidre DataStore.
196 /** Specifically, the global and domain groups can be at arbitrary paths.
197
198 @param[in] collection_name Name of the collection used as a file name
199 when saving
200 @param[in] bp_index_grp Pointer to the blueprint index group in the
201 datastore, see the above schematic
202 @param[in] domain_grp Pointer to the domain group in the datastore,
203 see the above schematic
204 @param[in] owns_mesh_data Does the SidreDC own the mesh vertices?
205
206 With this constructor, the SidreDataCollection does not own the Sidre
207 DataStore.
208 @note No mesh or fields are read from the given Groups. The mesh has
209 to be set with SetMesh() and fields registered with RegisterField().
210 */
211 SidreDataCollection(const std::string& collection_name,
212 axom::sidre::Group * bp_index_grp,
213 axom::sidre::Group * domain_grp,
214 bool owns_mesh_data = false);
215
216#ifdef MFEM_USE_MPI
217 /// Associate an MPI communicator with the collection.
218 /** If no mesh was associated with the collection, this method should be
219 called before using any of the Load() methods to read parallel data. */
220 void SetComm(MPI_Comm comm);
221#endif
222
223 /// Register a GridFunction in the Sidre DataStore.
224 /** This method is a shortcut for the call
225 `RegisterField(field_name, gf, field_name, 0)`.
226 */
227 virtual void RegisterField(const std::string &field_name, GridFunction *gf)
228 {
229 RegisterField(field_name, gf, field_name, 0);
230 }
231
232 /// Register a GridFunction in the Sidre DataStore.
233 /** The registration procedure is as follows:
234 - if (@a gf's data is NULL), allocate named buffer with the name
235 @a buffer_name with size _offset + gf->FESpace()->GetVSize()_ and use
236 its data (plus the given @a offset) to set @a gf's data;
237 - else, if (DataStore has a named buffer @a buffer_name), replace @a gf's
238 data array with that named buffer plus the given @a offset;
239 - else, use @a gf's data as external data associated with @a field_name
240 in the DataStore;
241 - register @a field_name in #field_map.
242
243 Both the @a field_name and @a buffer_name can contain a path prefix.
244 @note If @a field_name or @a buffer_name is empty, the method does
245 nothing.
246 @note If the GridFunction pointer @a gf or it's FiniteElementSpace
247 pointer are NULL, the method does nothing.
248 */
249 void RegisterField(const std::string &field_name, GridFunction *gf,
250 const std::string &buffer_name,
251 axom::sidre::IndexType offset);
252
253 /// Registers an attribute field in the Sidre DataStore
254 /** The registration process is similar to that of RegisterField()
255 The attribute field is associated with the elements of the mesh
256 when @a is_bdry is false, and with the boundary elements, when
257 @a is_bdry is true.
258 @sa RegisterField() */
259 void RegisterAttributeField(const std::string& name, bool is_bdry);
260 void DeregisterAttributeField(const std::string& name);
261
262 /** Returns a pointer to the attribute field associated with
263 @a field_name, or NULL when there is no associated field */
264 Array<int>* GetAttributeField(const std::string& field_name) const
265 { return attr_map.Get(field_name); }
266
267 /** Checks if there is an attribute field associated with @a field_name */
268 bool HasAttributeField(const std::string& field_name) const
269 { return attr_map.Has(field_name); }
270
271 /** Checks if any rank in the mesh has boundary elements */
272 bool HasBoundaryMesh() const;
273
274 /// Set the name of the mesh nodes field.
275 /** This name will be used by SetMesh() to register the mesh nodes, if not
276 already registered. Also, this method should be called if the mesh nodes
277 GridFunction was or will be registered directly by the user. The default
278 value for the name is "mesh_nodes". */
279 void SetMeshNodesName(const std::string &nodes_name)
280 {
281 if (!nodes_name.empty()) { m_meshNodesGFName = nodes_name; }
282 }
283
284 /// De-register @a field_name from the SidreDataCollection.
285 /** The field is removed from the #field_map and the DataStore, including
286 deleting it from the named_buffers group, if allocated. */
287 virtual void DeregisterField(const std::string& field_name);
288
289 /// Delete all owned data.
290 virtual ~SidreDataCollection();
291
292 /// Set/change the mesh associated with the collection
293 /** Uses the field name "mesh_nodes" or the value set by SetMeshNodesName()
294 to register the mesh nodes GridFunction, if the mesh uses nodes. */
295 virtual void SetMesh(Mesh *new_mesh);
296
297#ifdef MFEM_USE_MPI
298 /// Set/change the mesh associated with the collection
299 /** Uses the field name "mesh_nodes" or the value set by SetMeshNodesName()
300 to register the mesh nodes GridFunction, if the mesh uses nodes. */
301 virtual void SetMesh(MPI_Comm comm, Mesh *new_mesh);
302#endif
303
304 /// Reset the domain and global datastore group pointers.
305 /** These are set in the constructor, but if a host code changes the
306 datastore contents ( such as wiping out the datastore and loading in new
307 contents from a file, i.e. a restart ) these pointers will need to be
308 reset to valid groups in the datastore.
309 @sa Load(const std::string &path, const std::string &protocol).
310 */
311 void SetGroupPointers(axom::sidre::Group * global_grp,
312 axom::sidre::Group * domain_grp);
313
314 axom::sidre::Group * GetBPGroup() { return m_bp_grp; }
315 axom::sidre::Group * GetBPIndexGroup() { return m_bp_index_grp; }
316
317 /// Prepare the DataStore for writing
318 virtual void PrepareToSave();
319
320 /// Save the collection to file.
321 /** This method calls `Save(collection_name, "sidre_hdf5")`. */
322 virtual void Save();
323
324 /// Save the collection to @a filename.
325 /** The collection path prefix is prepended to the @a filename and the
326 current cycle is appended, if cycle >= 0. */
327 void Save(const std::string& filename, const std::string& protocol);
328
329 /// Load the Sidre DataStore from file.
330 /** No mesh or fields are read from the loaded DataStore.
331
332 If the data collection created the datastore, it knows the layout of
333 where the domain and global groups are, and can restore them after the
334 Load().
335
336 If, however, the data collection does not own the datastore (e.g. it did
337 not create the datastore), the host code must reset these pointers after
338 the load operation, using SetGroupPointers(), and also reset the state
339 variables, using UpdateStateFromDS().
340 */
341 void Load(const std::string& path, const std::string& protocol);
342
343 /// Load SidreDataCollection from file.
344 /** The used file path is based on the current prefix path, collection name,
345 and the given @a cycle_. The protocol is "sidre_hdf5".
346 @sa Load(const std::string &path, const std::string &protocol).
347 */
348 virtual void Load(int cycle_ = 0)
349 {
350 SetCycle(cycle_);
351 Load(get_file_path(name), "sidre_hdf5");
352 }
353
354 /// Load external data after registering externally owned fields.
355 void LoadExternalData(const std::string& path);
356
357 /** @brief Updates the DataCollection's cycle, time, and time-step variables
358 with the values from the data store. */
359 void UpdateStateFromDS();
360
361 /** @brief Updates the data store's cycle, time, and time-step variables with
362 the values from the SidreDataCollection. */
363 void UpdateStateToDS();
364
365 /** @name Methods for named buffer access and manipulation. */
366 ///@{
367
368 /** @brief Get a pointer to the sidre::View holding the named buffer for
369 @a buffer_name. */
370 /** If such named buffer is not allocated, the method returns NULL.
371 @note To access the underlying pointer, use View::getData().
372 @note To query the size of the buffer, use View::getNumElements().
373 */
374 axom::sidre::View *
375 GetNamedBuffer(const std::string& buffer_name) const
376 {
377 return named_buffers_grp()->hasView(buffer_name)
378 ? named_buffers_grp()->getView(buffer_name)
379 : NULL;
380 }
381
382 /// Return newly allocated or existing named buffer for @a buffer_name.
383 /** The buffer is stored in the named_buffers group. If the currently
384 allocated buffer size is smaller than @a sz, then the buffer is
385 reallocated with size @a sz, destroying its contents.
386 @note To access the underlying pointer, use View::getData().
387 */
388 axom::sidre::View *
389 AllocNamedBuffer(const std::string& buffer_name,
390 axom::sidre::IndexType sz,
391 axom::sidre::TypeID type =
392 axom::sidre::DOUBLE_ID);
393
394 /// Deallocate the named buffer @a buffer_name.
395 void FreeNamedBuffer(const std::string& buffer_name)
396 { named_buffers_grp()->destroyViewAndData(buffer_name); }
397
398 ///@}
399
400private:
401 // Used if the Sidre data collection is providing the datastore itself.
402 const bool m_owns_datastore;
403
404 // TODO - Need to evaluate if this bool member can be combined with own_data
405 // in parent data collection class. m_owns_mesh_data indicates whether the
406 // Sidre dc owns the mesh element data and node positions gf. The DC base
407 // class own_data indicates if the dc owns the mesh object pointer itself and
408 // GF objects. Can we use one flag and just have DC own all objects vs none?
409 const bool m_owns_mesh_data;
410
411 // Name to be used for registering the mesh nodes in the SidreDataCollection.
412 // This name is used by SetMesh() and can be overwritten by the method
413 // SetMeshNodesName().
414 // Default value: "mesh_nodes".
415 std::string m_meshNodesGFName;
416
417 // If the data collection owns the datastore, it will store a pointer to it.
418 // Otherwise, this pointer is NULL.
419 axom::sidre::DataStore * m_datastore_ptr;
420
421protected:
422 axom::sidre::Group *named_buffers_grp() const;
423
424 axom::sidre::View *
425 alloc_view(axom::sidre::Group *grp,
426 const std::string &view_name);
427
428 axom::sidre::View *
429 alloc_view(axom::sidre::Group *grp,
430 const std::string &view_name,
431 const axom::sidre::DataType &dtype);
432
433 axom::sidre::Group *
434 alloc_group(axom::sidre::Group *grp,
435 const std::string &group_name);
436
437 // return the filename based on prefix_path, collection name and cycle.
438 std::string get_file_path(const std::string &filename) const;
439
440private:
441 // If the data collection does not own the datastore, it will need pointers
442 // to the blueprint and blueprint index group to use.
443 axom::sidre::Group * m_bp_grp;
444 axom::sidre::Group * m_bp_index_grp;
445
446 // This is stored for convenience.
447 axom::sidre::Group * m_named_bufs_grp;
448
449 // Private helper functions
450
451 void RegisterFieldInBPIndex(const std::string& field_name,
452 GridFunction *gf);
453 void DeregisterFieldInBPIndex(const std::string & field_name);
454
455 void RegisterAttributeFieldInBPIndex(const std::string& attr_name);
456 void DeregisterAttributeFieldInBPIndex(const std::string& attr_name);
457
458 /** @brief Return a string with the conduit blueprint name for the given
459 Element::Type. */
460 std::string getElementName( Element::Type elementEnum );
461
462 /**
463 * \brief A private helper function to set up the views associated with the
464 data of a scalar valued grid function in the blueprint style.
465 * \pre gf is not null
466 * \note This function is expected to be called by RegisterField()
467 * \note Handles cases where hierarchy is already set up,
468 * where the data was allocated by this data collection
469 * and where the gridfunction data is external to Sidre
470 */
471 void addScalarBasedGridFunction(const std::string& field_name,
472 GridFunction* gf,
473 const std::string &buffer_name,
474 axom::sidre::IndexType offset);
475
476 /**
477 * \brief A private helper function to set up the views associated with the
478 data of a vector valued grid function in the blueprint style.
479 * \pre gf is not null
480 * \note This function is expected to be called by RegisterField()
481 * \note Handles cases where hierarchy is already set up,
482 * where the data was allocated by this data collection
483 * and where the gridfunction data is external to Sidre
484 */
485 void addVectorBasedGridFunction(const std::string& field_name,
486 GridFunction* gf,
487 const std::string &buffer_name,
488 axom::sidre::IndexType offset);
489
490 /** @brief A private helper function to set up the Views associated with
491 attribute field named @a field_name */
492 void addIntegerAttributeField(const std::string& field_name, bool is_bdry);
493
494 /// Sets up the four main mesh blueprint groups.
495 /**
496 * \param hasBP Indicates whether the blueprint has already been set up.
497 */
498 void createMeshBlueprintStubs(bool hasBP);
499
500 /// Sets up the mesh blueprint 'state' group.
501 /**
502 * \param hasBP Indicates whether the blueprint has already been set up.
503 */
504 void createMeshBlueprintState(bool hasBP);
505
506 /// Sets up the mesh blueprint 'coordsets' group.
507 /**
508 * \param hasBP Indicates whether the blueprint has already been set up.
509 */
510 void createMeshBlueprintCoordset(bool hasBP);
511
512 /// Sets up the mesh blueprint 'topologies' group.
513 /**
514 * This method is called from SetMesh().
515 * \param hasBP Indicates whether the blueprint has already been set up.
516 * \param mesh_name The name of the topology.
517 * \note Valid values for @a mesh_name are "mesh" and "boundary" and the
518 former has to be created with this method before the latter.
519 */
520 void createMeshBlueprintTopologies(bool hasBP, const std::string& mesh_name);
521
522#ifdef MFEM_USE_MPI
523 /// Sets up the mesh blueprint 'adjacencies' group.
524 /**
525 * \param hasBP Indicates whether the blueprint has already been set up.
526 * \note Only valid when using parallel meshes
527 */
528 void createMeshBlueprintAdjacencies(bool hasBP);
529#endif
530
531 /// Verifies that the contents of the mesh blueprint data is valid.
532 void verifyMeshBlueprint();
533};
534
535} // end namespace mfem
536
537#endif
538
539#endif
void SetCycle(int c)
Set time cycle (for time-dependent simulations)
std::string name
Name of the collection, used as a directory name when saving.
Type
Constants for the classes derived from Element.
Definition element.hpp:41
Class for grid function - Vector with associated FE space.
Definition gridfunc.hpp:31
Mesh data type.
Definition mesh.hpp:56
Lightweight adaptor over an std::map from strings to pointer to T.
bool Has(const std::string &fname) const
Predicate to check if a field is associated with name fname.
T * Get(const std::string &fname) const
Get a pointer to the field associated with name fname.
Data collection with Sidre routines following the Conduit mesh blueprint specification.
virtual void Save()
Save the collection to file.
void RegisterAttributeField(const std::string &name, bool is_bdry)
Registers an attribute field in the Sidre DataStore.
void SetGroupPointers(axom::sidre::Group *global_grp, axom::sidre::Group *domain_grp)
Reset the domain and global datastore group pointers.
void FreeNamedBuffer(const std::string &buffer_name)
Deallocate the named buffer buffer_name.
NamedFieldsMap< Array< int > > AttributeFieldMap
virtual void DeregisterField(const std::string &field_name)
De-register field_name from the SidreDataCollection.
axom::sidre::Group * named_buffers_grp() const
std::string get_file_path(const std::string &filename) const
axom::sidre::Group * GetBPGroup()
axom::sidre::View * AllocNamedBuffer(const std::string &buffer_name, axom::sidre::IndexType sz, axom::sidre::TypeID type=axom::sidre::DOUBLE_ID)
Return newly allocated or existing named buffer for buffer_name.
void Load(const std::string &path, const std::string &protocol)
Load the Sidre DataStore from file.
axom::sidre::View * GetNamedBuffer(const std::string &buffer_name) const
Get a pointer to the sidre::View holding the named buffer for buffer_name.
SidreDataCollection(const std::string &collection_name, Mesh *the_mesh=NULL, bool owns_mesh_data=false)
Constructor that allocates and initializes a Sidre DataStore.
void SetComm(MPI_Comm comm)
Associate an MPI communicator with the collection.
virtual void RegisterField(const std::string &field_name, GridFunction *gf)
Register a GridFunction in the Sidre DataStore.
axom::sidre::Group * GetBPIndexGroup()
void UpdateStateToDS()
Updates the data store's cycle, time, and time-step variables with the values from the SidreDataColle...
void UpdateStateFromDS()
Updates the DataCollection's cycle, time, and time-step variables with the values from the data store...
bool HasAttributeField(const std::string &field_name) const
axom::sidre::View * alloc_view(axom::sidre::Group *grp, const std::string &view_name)
virtual void PrepareToSave()
Prepare the DataStore for writing.
virtual void SetMesh(Mesh *new_mesh)
Set/change the mesh associated with the collection.
virtual void Load(int cycle_=0)
Load SidreDataCollection from file.
virtual ~SidreDataCollection()
Delete all owned data.
Array< int > * GetAttributeField(const std::string &field_name) const
void LoadExternalData(const std::string &path)
Load external data after registering externally owned fields.
void SetMeshNodesName(const std::string &nodes_name)
Set the name of the mesh nodes field.
void DeregisterAttributeField(const std::string &name)
axom::sidre::Group * alloc_group(axom::sidre::Group *grp, const std::string &group_name)