1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    vtkXdmfWriter.h
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
16 /**
17  * @class   vtkXdmfWriter
18  * @brief   write eXtensible Data Model and Format files
19  *
20  * vtkXdmfWriter converts vtkDataObjects to XDMF format. This is intended to
21  * replace vtkXdmfWriter, which is not up to date with the capabilities of the
22  * newer XDMF2 library. This writer understands VTK's composite data types and
23  * produces full trees in the output XDMF files.
24 */
25 
26 #ifndef vtkXdmfWriter_h
27 #define vtkXdmfWriter_h
28 
29 #include "vtkIOXdmf2Module.h" // For export macro
30 
31 #include "vtkDataObjectAlgorithm.h"
32 
33 #include <string> // Needed for private members
34 #include <vector> //
35 
36 class vtkExecutive;
37 
38 class vtkCompositeDataSet;
39 class vtkDataArray;
40 class vtkDataSet;
41 class vtkDataObject;
42 class vtkFieldData;
43 class vtkInformation;
44 class vtkInformationVector;
45 class vtkXdmfWriterDomainMemoryHandler;
46 
47 namespace xdmf2
48 {
49 class XdmfArray;
50 class XdmfDOM;
51 class XdmfElement;
52 class XdmfGrid;
53 class XdmfGeometry;
54 class XdmfTopology;
55 }
56 
57 class VTKIOXDMF2_EXPORT vtkXdmfWriter : public vtkDataObjectAlgorithm
58 {
59 public:
60   static vtkXdmfWriter *New();
61   vtkTypeMacro(vtkXdmfWriter,vtkDataObjectAlgorithm);
62   void PrintSelf(ostream& os, vtkIndent indent) override;
63 
64   /**
65    * Set the input data set.
66    */
67   virtual void SetInputData(vtkDataObject* dobj);
68 
69   //@{
70   /**
71    * Set or get the file name of the xdmf file.
72    */
73   vtkSetStringMacro(FileName);
74   vtkGetStringMacro(FileName);
75   //@}
76 
77   //@{
78   /**
79    * Set or get the file name of the hdf5 file.
80    * Note that if the File name is not specified, then the group name is ignore
81    */
82   vtkSetStringMacro(HeavyDataFileName);
83   vtkGetStringMacro(HeavyDataFileName);
84   //@}
85 
86   //@{
87   /**
88    * Set or get the group name into which data will be written
89    * it may contain nested groups as in "/Proc0/Block0"
90    */
91   vtkSetStringMacro(HeavyDataGroupName);
92   vtkGetStringMacro(HeavyDataGroupName);
93   //@}
94 
95   /**
96    * Write data to output. Method executes subclasses WriteData() method, as
97    * well as StartMethod() and EndMethod() methods.
98    * Returns 1 on success and 0 on failure.
99    */
100   virtual int Write();
101 
102   //@{
103   /**
104    * Topology Geometry and Attribute arrays smaller than this are written in line into the XML.
105    * Default is 100.
106    * Node: LightDataLimit is forced to 1 when MeshStaticOverTime is TRUE.
107    */
108   vtkSetMacro(LightDataLimit, int);
109   vtkGetMacro(LightDataLimit, int);
110   //@}
111 
112   //@{
113   /**
114    * Controls whether writer automatically writes all input time steps, or
115    * just the timestep that is currently on the input.
116    * Default is OFF.
117    */
118   vtkSetMacro(WriteAllTimeSteps, int);
119   vtkGetMacro(WriteAllTimeSteps, int);
120   vtkBooleanMacro(WriteAllTimeSteps, int);
121   //@}
122 
123   //@{
124   /**
125    * Set of get the flag that specify if input mesh is static over time.
126    * If so, the mesh topology and geometry heavy data will be written only once.
127    * Default if FALSE.
128    * Note: this mode requires that all data is dumped in the heavy data file.
129    */
130   vtkSetMacro(MeshStaticOverTime, bool);
131   vtkGetMacro(MeshStaticOverTime, bool);
132   vtkBooleanMacro(MeshStaticOverTime, bool);
133   //@}
134 
135     //@{
136     /**
137      * Called in parallel runs to identify the portion this process is responsible for
138      * TODO: respect this
139      */
140   vtkSetMacro(Piece, int);
141   vtkSetMacro(NumberOfPieces, int);
142     //@}
143 
144   //TODO: control choice of heavy data format (xml, hdf5, sql, raw)
145 
146   //TODO: These controls are available in vtkXdmfWriter, but are not used here.
147   //GridsOnly
148   //Append to Domain
149 
150 protected:
151   vtkXdmfWriter();
152   ~vtkXdmfWriter() override;
153 
154   //Choose composite executive by default for time.
155   vtkExecutive* CreateDefaultExecutive() override;
156 
157   //Can take any one data object
158   int FillInputPortInformation(int port, vtkInformation *info) override;
159 
160   //Overridden to ...
161   int RequestInformation(vtkInformation*,
162                          vtkInformationVector**,
163                          vtkInformationVector*) override;
164   //Overridden to ...
165   int RequestUpdateExtent(vtkInformation*,
166                           vtkInformationVector**,
167                           vtkInformationVector*) override;
168   //Overridden to ...
169   int RequestData(vtkInformation*,
170                   vtkInformationVector**,
171                   vtkInformationVector*) override;
172 
173   //These do the work: recursively parse down input's structure all the way to arrays,
174   //use XDMF lib to dump everything to file.
175 
176   virtual int CreateTopology(vtkDataSet *ds, xdmf2::XdmfGrid *grid, vtkIdType PDims[3], vtkIdType CDims[3], vtkIdType &PRank, vtkIdType &CRank, void *staticdata);
177   virtual int CreateGeometry(vtkDataSet *ds, xdmf2::XdmfGrid *grid, void *staticdata);
178 
179   virtual int WriteDataSet(vtkDataObject *dobj, xdmf2::XdmfGrid *grid);
180   virtual int WriteCompositeDataSet(vtkCompositeDataSet *dobj, xdmf2::XdmfGrid *grid);
181   virtual int WriteAtomicDataSet(vtkDataObject *dobj, xdmf2::XdmfGrid *grid);
182   virtual int WriteArrays(vtkFieldData* dsa, xdmf2::XdmfGrid *grid, int association,
183                            vtkIdType rank, vtkIdType *dims, const char *name);
184   virtual void ConvertVToXArray(vtkDataArray *vda, xdmf2::XdmfArray *xda,
185                                 vtkIdType rank, vtkIdType *dims,
186                                 int AllocStrategy, const char *heavyprefix);
187 
188   virtual void SetupDataArrayXML(xdmf2::XdmfElement*, xdmf2::XdmfArray*) const;
189 
190   char *FileName;
191   char *HeavyDataFileName;
192   char *HeavyDataGroupName;
193   std::string WorkingDirectory;
194   std::string BaseFileName;
195 
196   int LightDataLimit;
197 
198   int WriteAllTimeSteps;
199   int NumberOfTimeSteps;
200   double CurrentTime;
201   int CurrentTimeIndex;
202   int CurrentBlockIndex;
203   int UnlabelledDataArrayId;
204 
205   int Piece;
206   int NumberOfPieces;
207 
208   bool MeshStaticOverTime;
209 
210   xdmf2::XdmfDOM *DOM;
211   xdmf2::XdmfGrid *TopTemporalGrid;
212 
213   vtkXdmfWriterDomainMemoryHandler *DomainMemoryHandler;
214 
215   std::vector<xdmf2::XdmfTopology*> TopologyAtT0;
216   std::vector<xdmf2::XdmfGeometry*> GeometryAtT0;
217 
218 private:
219   vtkXdmfWriter(const vtkXdmfWriter&) = delete;
220   void operator=(const vtkXdmfWriter&) = delete;
221 };
222 
223 #endif /* vtkXdmfWriter_h */
224