/*******************************************************************/ /* 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 __XdmfDataItem_h #define __XdmfDataItem_h #include "XdmfElement.h" namespace xdmf2 { class XdmfDataDesc; class XdmfArray; class XdmfValues; #define XDMF_FORMAT_XML 0 #define XDMF_FORMAT_HDF 1 #define XDMF_FORMAT_MYSQL 2 #define XDMF_FORMAT_BINARY 3 // Organizations #define XDMF_ITEM_UNIFORM 0x00 #define XDMF_ITEM_HYPERSLAB 0x01 #define XDMF_ITEM_COORDINATES 0x02 #define XDMF_ITEM_FUNCTION 0x03 #define XDMF_ITEM_COLLECTION 0x14 #define XDMF_ITEM_TREE 0x15 #define XDMF_ITEM_MASK 0xF0 // Evaluates to a Single Array ? //! Data Container Object. /*! An XdmfDataItem is a container for data. It is of one of three types : \verbatim Uniform ...... A single DataStructure HyperSlab .... A DataTransform that Subsamples some DataStructure Coordinates .. A DataTransform that Subsamples via Parametric Coordinates Function ..... A DataTransform described by some function Collection ... Contains an Array of 1 or more DataStructures or DataTransforms Tree ......... A Hierarchical group of other DataItems \endverbatim If not specified in the "ItemType" a Uniform item is assumed. A Uniform DataItem is a XdmfDataStructure or an XdmfDataTransform. Both XdmfDataStructure and XdmfDataTransform are maintined for backwards compatibility. A Uniform XdmfDataItem represents an XdmfArray in XML. DataItems have an optional name. Rank is also optional since it can be determined from the dimensions. Dimensions are listed with the slowest varying dimension first. (i.e. KDim JDim IDim). Type is "Char | Float | Int | Compound" with the default being Float. Precision is BytesPerElement and defaults to 4 for Ints and Floats. Format is any supported XDMF format but usually XML | HDF. Examples : \verbatim 1 2 3 XML Element : DataItem XML Attribute : Name = Any String XML Attribute : ItemType = Uniform* | Collection | Tree | HyperSlab | Coordinates | Function XML Attribute : Dimensions = K J I XML Attribute : NumberType = Float* | Int | UInt | Char | UChar XML Attribute : Precision = 1 | 4 | 8 XML Attribute : Format = XML* | HDF \endverbatim */ class XDMF_EXPORT XdmfDataItem : public XdmfElement { public: XdmfDataItem(); virtual ~XdmfDataItem(); XdmfConstString GetClassName() { return ( "XdmfDataItem" ) ; }; //! Get the data values access object XdmfGetValueMacro(Values, XdmfValues *); //! Get the format of the data. Usually XML | HDF XdmfGetValueMacro(Format, XdmfInt32); //! Set the format of the data. Usually XML | HDF. Default is XML. XdmfSetValueMacro(Format, XdmfInt32); //! Insert an Element XdmfInt32 Insert(XdmfElement *Child); //! Tells the DataItem is it owns the Array and is thus allowed to delete it. XdmfSetValueMacro(ArrayIsMine, XdmfInt32); //! Get the Value it the DataItem owns the Array XdmfGetValueMacro(ArrayIsMine, XdmfInt32); //! Update Structure From XML (INPUT) XdmfInt32 UpdateInformation(); //! Update Structre and Values potentially reading Heavy Data (INPUT) XdmfInt32 Update(); //! Update the DOM (OUTPUT) XdmfInt32 Build(); //! Get the Internal XdmfDataDesc XdmfGetValueMacro(DataDesc, XdmfDataDesc *); //! Set the XdmfDataDesc. XdmfInt32 SetDataDesc(XdmfDataDesc *DataDesc); //! Get the Internal Array XdmfArray *GetArray(XdmfInt32 Create=1); //! Set the Array. Also sets ArrayIsMine = 0 XdmfInt32 SetArray(XdmfArray *Array); //! Convenience Function to access Array /*! The more robust access is via : \verbatim array = XdmfDataItem->GetArray(); array->GetValues(....) \endverbatim */ XdmfString GetDataValues( XdmfInt64 Index = 0, XdmfInt64 NumberOfValues = 0, XdmfInt64 ArrayStride = 1); //! Convenience Function to access Array /*! The more robust access is via : \verbatim array = XdmfDataItem->GetArray(); array->SetValues(....) \endverbatim */ XdmfInt32 SetDataValues( XdmfInt64 Index, XdmfConstString Values, XdmfInt64 ArrayStride = 1, XdmfInt64 ValuesStride = 1 ); //! Get Rank of the Dimensions XdmfInt32 GetRank(); //! Set the Shape (Rank and Dimensions) XdmfInt32 SetShape(XdmfInt32 Rank, XdmfInt64 *Dimensions); //! Returns Rank and Fills in the Dimensions XdmfInt32 GetShape(XdmfInt64 *Dimensions); //! Returns Shape as String XdmfConstString GetShapeAsString(); //! Convenience Function XdmfConstString GetDimensions(){return this->GetShapeAsString();}; //! Convenience Function XdmfInt32 SetDimensions(XdmfInt32 Rank, XdmfInt64 *Dimensions){return this->SetShape(Rank, Dimensions);}; //! Convenience Function XdmfInt32 SetDimensionsFromString(XdmfConstString Dimensions); //! Set the name of the Heavy Data Set (if applicable) XdmfSetStringMacro(HeavyDataSetName); //! Get the name of the Heavy Data Set (if applicable) XdmfGetValueMacro(HeavyDataSetName, XdmfConstString); //! Copy Information from Another DataItem XdmfInt32 Copy(XdmfElement *Source); //! Set the Type. One of : XDMF_ITEM_UNIFORM, XDMF_ITEM_COLLECTION, XDMF_ITEM_TREE XdmfSetValueMacro(ItemType, XdmfInt32); //! Get the Type. One of : XDMF_ITEM_UNIFORM, XDMF_ITEM_COLLECTION, XDMF_ITEM_TREE XdmfGetValueMacro(ItemType, XdmfInt32); //! Get if ItemType evaluates to a Single or Multiple XdmfArray. Collection and tree are multiple. XdmfInt32 GetIsMultiple() { return((this->ItemType & XDMF_ITEM_MASK) ? 1: 0); }; //! Set the Function String XdmfSetStringMacro(Function); //! Get the Function String XdmfGetStringMacro(Function); //! Release Large Data XdmfInt32 Release(); XdmfGetValueMacro(ColumnMajor, XdmfInt32); XdmfSetValueMacro(ColumnMajor, XdmfInt32); XdmfGetValueMacro(TransposeInMemory, XdmfInt32); XdmfSetValueMacro(TransposeInMemory, XdmfInt32); protected: XdmfInt32 Format; XdmfInt32 DataDescIsMine; XdmfInt32 ArrayIsMine; XdmfInt32 ItemType; XdmfDataDesc *DataDesc; XdmfArray *Array; XdmfValues *Values; XdmfString HeavyDataSetName; XdmfString Function; XdmfInt32 ColumnMajor; XdmfInt32 TransposeInMemory; //! Make sure this->Values is correct XdmfInt32 CheckValues(XdmfInt32 Format); XdmfInt32 UpdateInformationUniform(); XdmfInt32 UpdateInformationCollection(); XdmfInt32 UpdateInformationTree(); XdmfInt32 UpdateInformationFunction(); // HyperSlab, Coordinates or Function XdmfInt32 UpdateFunction(); // HyperSlab, Coordinates or Function }; } #endif // __XdmfDataItem_h