/*******************************************************************/
/* XDMF */
/* eXtensible Data Model and Format */
/* */
/* Id : Id */
/* Date : $Date$ */
/* Version : $Revision$ */
/* */
/* Author: */
/* Jerry A. Clarke */
/* clarke@arl.army.mil */
/* US Army Research Laboratory */
/* Aberdeen Proving Ground, MD */
/* */
/* Copyright @ 2002 US Army Research Laboratory */
/* All Rights Reserved */
/* See Copyright.txt or http://www.arl.hpc.mil/ice for details */
/* */
/* This software is distributed WITHOUT ANY WARRANTY; without */
/* even the implied warranty of MERCHANTABILITY or FITNESS */
/* FOR A PARTICULAR PURPOSE. See the above copyright notice */
/* for more information. */
/* */
/*******************************************************************/
#ifndef __XdmfGrid_h
#define __XdmfGrid_h
#include "XdmfElement.h"
namespace xdmf2
{
class XdmfGeometry;
class XdmfTopology;
class XdmfInformation;
class XdmfAttribute;
class XdmfArray;
class XdmfTime;
class XdmfSet;
#define XDMF_GRID_UNIFORM 0x00000 // Type xor XDMF_GRID_MASK = XdmfTopology Type
#define XDMF_GRID_COLLECTION 0x10000
#define XDMF_GRID_TREE 0x20000
#define XDMF_GRID_SUBSET 0x40000
#define XDMF_GRID_UNSET 0x0FFFF
#define XDMF_GRID_MASK 0xF0000
#define XDMF_GRID_SECTION_ALL 0x100000
#define XDMF_GRID_SECTION_DATA_ITEM 0x200000
#define XDMF_GRID_SECTION_MASK 0xF00000
#define XDMF_GRID_COLLECTION_TEMPORAL 0x0001
#define XDMF_GRID_COLLECTION_SPATIAL 0x0002
#define XDMF_GRID_COLLECTION_UNSET 0x0FFFF
//! In memory representation of an XDMF Grid
/*!
XdmfGrid is the in memory representation of the Xdmf Grid
structure defined in the XML. XdmfGrids can be one of four
types : \b Uniform , \b Collection \b Tree or \b Subset. Uniform is a
Homogeneous Single Grid (i.e. a group of triangles). A \b Collection
is an array of Uniform grids. A Subset specifies a cell selection
of a previously defined grid. A Tree is a Hierarchial group.
Uniform XdmfGrids have \b Topolgy (i.e.
what type of grid and the connectivity if it's unstructured )
\b Geometry ( the XYZ values for the grid nodes ) and zero
or more \b Attributes (the computed values such as scalars,
vectors, tensors, etc.)
The XML for a Uniform Grid might look like :
\verbatim
Shapes.h5:/Block 1/Connections
Shapes.h5:/Geometry
0 0 1 3 1309 1
Shapes.h5:/Geometry
XML Element : Grid
XML Attribute : Name = Any String
XML Attribute : GridType = Uniform* | Collection | Tree | Subset
XML Attribute : Section = DataItem* | All (Only Meaningful if GridType="Subset")
\endverbatim
Typical API usage might look like :
\code
XdmfDOM *DOM = new XdmfDOM();
XdmfGrid *Grid = new XdmfGrid();
XdmfAttribute *XPos;
XdmfXNode *GridNode;
DOM->SetInputFileName("MyData.xmf");
DOM->Parse();
GridNode = DOM->FindElement("Grid");
Grid->SetDOM(DOM);
Grid->SetElement(GridNode);
Grid->UpdateInformation(GridNode);
cout << "First Grid has " << Grid->GetNumberOfAttributes() << " Attributes" << endl;
Grid->AssignAttributeByName("X Position");
XPos = Grid->GetAssignedAttribute();
\endcode
*/
class XDMF_EXPORT XdmfGrid : public XdmfElement {
public:
XdmfGrid();
~XdmfGrid();
XdmfConstString GetClassName() { return ( "XdmfGrid" ) ; };
//! Explicitly set the XdmfGeometry for an XdmfGrid
XdmfSetValueMacro( Geometry, XdmfGeometry *);
//! Get the XdmfGeometry for an XdmfGrid
XdmfGetValueMacro( Geometry, XdmfGeometry *);
//! Explicitly set the XdmfTopology for an XdmfGrid
XdmfSetValueMacro( Topology, XdmfTopology *);
//! Get the XdmfTopology for an XdmfGrid
XdmfGetValueMacro( Topology, XdmfTopology *);
//! Explicitly set the XdmfTime for an XdmfGrid
XdmfSetValueMacro( Time, XdmfTime *);
//! Get the XdmfTime for an XdmfGrid
XdmfGetValueMacro( Time, XdmfTime *);
//! Get the Grid Type as a string
XdmfConstString GetGridTypeAsString();
XdmfInt32 SetGridTypeFromString(XdmfConstString GridType);
//! Get the Collection Type as a string
XdmfConstString GetCollectionTypeAsString();
XdmfInt32 SetCollectionTypeFromString(XdmfConstString CollectionType);
//! Build the XML (OUTPUT)
XdmfInt32 Build();
//! Create a XML node for the Topology of a Uniform Grid
XdmfInt32 InsertTopology();
//! Create a XML node for the Geometry of a Uniform Grid
XdmfInt32 InsertGeometry();
//! Insert an Element
XdmfInt32 Insert(XdmfElement *Child);
//! Get the Grid Type
XdmfGetValueMacro( GridType, XdmfInt32);
//! Set the Grid Type
XdmfSetValueMacro( GridType, XdmfInt32);
//! Get the Collection Type
XdmfGetValueMacro( CollectionType, XdmfInt32);
//! Set the Collection Type
XdmfSetValueMacro( CollectionType, XdmfInt32);
//! Get Build Time Flag
XdmfGetValueMacro( BuildTime, XdmfInt32);
//! Set the Build Time Flag
XdmfSetValueMacro( BuildTime, XdmfInt32);
//! Copy Information from Another DataItem
XdmfInt32 Copy(XdmfElement *Source);
//! Get the Number of Children
XdmfGetValueMacro( NumberOfChildren, XdmfInt32);
//! Set the Number Of Children
XdmfSetValueMacro( NumberOfChildren, XdmfInt32);
//! Is this a Uniform Grid ?
XdmfInt32 IsUniform();
//! Get the number of Attributes defined for this grid.
/*!
Attributes can be Scalars(1 value), Vectors(3 values),
Tensors(9 values), or Matrix(NxM array). Attributes can be centered
on the Node, Cell, Edge, Face, or Grid.
*/
XdmfGetValueMacro( NumberOfAttributes, XdmfInt32 );
//! Get Number of Sets
XdmfGetValueMacro( NumberOfSets, XdmfInt32 );
//! Get Number of Informations
XdmfGetValueMacro( NumberOfInformations, XdmfInt32 );
//! Retreive a particilar XdmfAttribute
/*!
Returns the Xdmf Attribute from the grid.
\param Index 0 based index of the Attribute to retreive
*/
XdmfGetIndexValueMacro( Attribute, XdmfAttribute * );
//! Get a particular Set
XdmfGetIndexValueMacro( Sets, XdmfSet * );
//! Update an Attribute and Mark it as Primary
/*!
When an XdmfGrid is read using SetGridFromElement() the Attribute
values are not read in since there could potentially be an enourmous
amout of data associated with the computational grid. Instead, for
each Attribute of interest, AssignAttribute is called. This updates
the Heavy Data and marks it as the primary attribute. So the last
Attribute read will be one marked : visualization readers might
use this information in their filters. (i.e. An isosurface generator
might use the primary scalar to determine the scalar value on which
to generate the surface.
\param Index 0 based index of the Attribute to retreive
*/
XdmfInt32 AssignAttribute( XdmfInt64 Index );
#ifndef SWIG
XdmfInt32 AssignAttribute( XdmfAttribute *Attribute );
#endif
//! Same as AssignAttribute (more verbose for scripting languages)
XdmfInt32 AssignAttributeByIndex( XdmfInt64 Index );
//! Assign the Attribute with the specified name
/*!
In the XML of the grid, if an Attribute has a
\b Name value, this Attribute will be assigned.
Example:
\verbatim
Pressure.h5:/Time01/Pressure
\endverbatim
*/
XdmfInt32 AssignAttributeByName( XdmfString Name );
//! Return the currently marked as Primary
XdmfAttribute *GetAssignedAttribute( void ) { return( this->AssignedAttribute ); };
//! Returns the index of the Attribute currently marked as Primary
XdmfInt64 GetAssignedAttributeIndex( void );
//! Initialize Grid from XML but don't access Heavy Data
/*!
Initializes the basic grid structure based on the information found
in the specified XML Node but does not read any of the underlying
Heavy data. This can be used to determine the type of grid (structured
or unstructured, Hex or Tet) and to determine the rank and dimensions
of the grid.
*/
XdmfInt32 UpdateInformation();
//! Initialize the grid and read the Heavy Data
/*!
Initializes the basic grid structure based on the information found
in the specified XML Node and Read the associated Heavy Data for the
Topology and Geometry. Heavy Data for the Attreibute(s) is not read.
Use AssignAttribute to update Attribute Heavy Data.
*/
XdmfInt32 Update();
//! Get one of the child Grids from a Collection or Tree
XdmfGrid *GetChild(XdmfInt32 Index);
//! Get one of the child Grids from a Collection or Tree
XdmfInformation *GetInformation(XdmfInt32 Index);
//! Return indexes of first level children that are valid at a time
XdmfInt32 FindGridsInTimeRange(XdmfFloat64 TimeMin, XdmfFloat64 TimeMax, XdmfArray *ArrayToFill);
//! Return indexes of first level children that are valid at a time
XdmfInt32 FindGridsAtTime(XdmfTime *Time, XdmfArray *ArrayToFill, XdmfFloat64 Epsilon = 0.0, XdmfInt32 Append=0);
//! Release Big Data
XdmfInt32 Release();
protected:
XdmfGeometry *Geometry;
XdmfTopology *Topology;
XdmfTime *Time;
XdmfInt32 GeometryIsMine;
XdmfInt32 TopologyIsMine;
XdmfInt32 TimeIsMine;
XdmfInt32 NumberOfAttributes;
XdmfInt32 NumberOfInformations;
XdmfInt32 NumberOfSets;
XdmfInt32 GridType;
XdmfInt32 CollectionType;
XdmfInt32 NumberOfChildren;
XdmfInt32 BuildTime;
XdmfGrid **Children;
XdmfSet **Sets;
XdmfAttribute **Attribute;
XdmfInformation **Informations;
XdmfAttribute *AssignedAttribute;
};
//! Using a SWIG style Pointer return an XdmfGrid Pointer
extern XDMF_EXPORT XdmfGrid *HandleToXdmfGrid( XdmfString Source);
}
#endif // __XdmfGrid_h