/*========================================================================= Program: Visualization Toolkit Module: vtkXdmfWriter.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm 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. =========================================================================*/ /** * @class vtkXdmfWriter * @brief write eXtensible Data Model and Format files * * vtkXdmfWriter converts vtkDataObjects to XDMF format. This is intended to * replace vtkXdmfWriter, which is not up to date with the capabilities of the * newer XDMF2 library. This writer understands VTK's composite data types and * produces full trees in the output XDMF files. */ #ifndef vtkXdmfWriter_h #define vtkXdmfWriter_h #include "vtkIOXdmf2Module.h" // For export macro #include "vtkDataObjectAlgorithm.h" #include // Needed for private members #include // class vtkExecutive; class vtkCompositeDataSet; class vtkDataArray; class vtkDataSet; class vtkDataObject; class vtkFieldData; class vtkInformation; class vtkInformationVector; class vtkXdmfWriterDomainMemoryHandler; namespace xdmf2 { class XdmfArray; class XdmfDOM; class XdmfElement; class XdmfGrid; class XdmfGeometry; class XdmfTopology; } class VTKIOXDMF2_EXPORT vtkXdmfWriter : public vtkDataObjectAlgorithm { public: static vtkXdmfWriter* New(); vtkTypeMacro(vtkXdmfWriter, vtkDataObjectAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) override; /** * Set the input data set. */ virtual void SetInputData(vtkDataObject* dobj); ///@{ /** * Set or get the file name of the xdmf file. */ vtkSetFilePathMacro(FileName); vtkGetFilePathMacro(FileName); ///@} ///@{ /** * Set or get the file name of the hdf5 file. * Note that if the File name is not specified, then the group name is ignore */ vtkSetFilePathMacro(HeavyDataFileName); vtkGetFilePathMacro(HeavyDataFileName); ///@} ///@{ /** * Set or get the group name into which data will be written * it may contain nested groups as in "/Proc0/Block0" */ vtkSetStringMacro(HeavyDataGroupName); vtkGetStringMacro(HeavyDataGroupName); ///@} /** * Write data to output. Method executes subclasses WriteData() method, as * well as StartMethod() and EndMethod() methods. * Returns 1 on success and 0 on failure. */ virtual int Write(); ///@{ /** * Topology Geometry and Attribute arrays smaller than this are written in line into the XML. * Default is 100. * Node: LightDataLimit is forced to 1 when MeshStaticOverTime is TRUE. */ vtkSetMacro(LightDataLimit, int); vtkGetMacro(LightDataLimit, int); ///@} ///@{ /** * Controls whether writer automatically writes all input time steps, or * just the timestep that is currently on the input. * Default is OFF. */ vtkSetMacro(WriteAllTimeSteps, int); vtkGetMacro(WriteAllTimeSteps, int); vtkBooleanMacro(WriteAllTimeSteps, int); ///@} ///@{ /** * Set of get the flag that specify if input mesh is static over time. * If so, the mesh topology and geometry heavy data will be written only once. * Default if FALSE. * Note: this mode requires that all data is dumped in the heavy data file. */ vtkSetMacro(MeshStaticOverTime, bool); vtkGetMacro(MeshStaticOverTime, bool); vtkBooleanMacro(MeshStaticOverTime, bool); ///@} ///@{ /** * Called in parallel runs to identify the portion this process is responsible for * TODO: respect this */ vtkSetMacro(Piece, int); vtkSetMacro(NumberOfPieces, int); ///@} // TODO: control choice of heavy data format (xml, hdf5, sql, raw) // TODO: These controls are available in vtkXdmfWriter, but are not used here. // GridsOnly // Append to Domain protected: vtkXdmfWriter(); ~vtkXdmfWriter() override; // Choose composite executive by default for time. vtkExecutive* CreateDefaultExecutive() override; // Can take any one data object int FillInputPortInformation(int port, vtkInformation* info) override; // Overridden to ... int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; // Overridden to ... int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; // Overridden to ... int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; // These do the work: recursively parse down input's structure all the way to arrays, // use XDMF lib to dump everything to file. virtual int CreateTopology(vtkDataSet* ds, xdmf2::XdmfGrid* grid, vtkIdType PDims[3], vtkIdType CDims[3], vtkIdType& PRank, vtkIdType& CRank, void* staticdata); virtual int CreateGeometry(vtkDataSet* ds, xdmf2::XdmfGrid* grid, void* staticdata); virtual int WriteDataSet(vtkDataObject* dobj, xdmf2::XdmfGrid* grid); virtual int WriteCompositeDataSet(vtkCompositeDataSet* dobj, xdmf2::XdmfGrid* grid); virtual int WriteAtomicDataSet(vtkDataObject* dobj, xdmf2::XdmfGrid* grid); virtual int WriteArrays(vtkFieldData* dsa, xdmf2::XdmfGrid* grid, int association, vtkIdType rank, vtkIdType* dims, const char* name); virtual void ConvertVToXArray(vtkDataArray* vda, xdmf2::XdmfArray* xda, vtkIdType rank, vtkIdType* dims, int AllocStrategy, const char* heavyprefix); virtual void SetupDataArrayXML(xdmf2::XdmfElement*, xdmf2::XdmfArray*) const; char* FileName; char* HeavyDataFileName; char* HeavyDataGroupName; std::string WorkingDirectory; std::string BaseFileName; int LightDataLimit; int WriteAllTimeSteps; int NumberOfTimeSteps; double CurrentTime; int CurrentTimeIndex; int CurrentBlockIndex; int UnlabelledDataArrayId; int Piece; int NumberOfPieces; bool MeshStaticOverTime; xdmf2::XdmfDOM* DOM; xdmf2::XdmfGrid* TopTemporalGrid; vtkXdmfWriterDomainMemoryHandler* DomainMemoryHandler; std::vector TopologyAtT0; std::vector GeometryAtT0; private: vtkXdmfWriter(const vtkXdmfWriter&) = delete; void operator=(const vtkXdmfWriter&) = delete; }; #endif /* vtkXdmfWriter_h */