forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vtkXMLHyperTreeGridWriter.h
196 lines (161 loc) · 6.78 KB
/
vtkXMLHyperTreeGridWriter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*=========================================================================
Program: Visualization Toolkit
Module: vtkXMLHyperTreeGridWriter.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 vtkXMLHyperTreeGridWriter
* @brief Write VTK XML HyperTreeGrid files.
*
* vtkXMLHyperTreeGridWriter writes the VTK XML HyperTreeGrid file
* format. The standard extension for this writer's file format is "htg".
*
* Note for developers:
* The VTK XML HyperTreeGrid file format is versioned.
* Any evolution of the format must lead to:
* - a move to a higher major version number, X+1.0, if the evolution is
* incompatible with the previous versions either at the level of the
* description of the information or the semantic understanding made by
* the reader;
* - a move to a higher minor version number, X.y+1, if its consists of
* adding information without calling into question the general
* interpretation.
*
* Version 0.0 (P. Fasel and D. DeMarle)
* ...
* Version 1.0 (J-B Lekien CEA, DAM, DIF, F-91297 Arpajon, France)
* - writing by HyperTree description and fields;
* - saving the minimal tree (a hidden refined node becomes a hidden leaf node);
* - saving the tree by level of refinement (course in width);
* - the last null values in the binary description of the tree or mask (if
* defined) may not / are not explicitly described. The size of the table
* given elsewhere is authentic;
* - all fields are copied to be saved in the implicit order, so even
* if an explicit global index map exists, it disappears;
* - writing in this version requires more memory and CPU;
* - reading of a part is accelerated (non iterative construction of the tree)
* and consumes potentially less memory (suppression of the global index
* map explicit);
* - expanded possibility at the reader level, today these options allow to
* accelerate the obtaining of a result which will be less precise and to
* allow the loading of a part of a mesh which would not hold in memory:
* - loading by limiting the maximum level to load;
* - loading by selecting (differentes description possibilities are
* offered) the HTs to take into account.
*
* The default version of the VTK XML HyperTreeGrid file format is the latest
* version, now version 1.0.
*
* For developpers:
* To ensure the durability of this storage format over time, at least, the drive
* must continue to support playback of previous format.
*/
#ifndef vtkXMLHyperTreeGridWriter_h
#define vtkXMLHyperTreeGridWriter_h
#include "vtkIOXMLModule.h" // For export macro
#include "vtkSmartPointer.h" // For internal attributes
#include "vtkXMLWriter.h"
#include <vector> // std::vector
class OffsetsManagerGroup;
class OffsetsManagerArray;
class vtkBitArray;
class vtkIdList;
class vtkHyperTree;
class vtkHyperTreeGrid;
class vtkHyperTreeGridNonOrientedCursor;
class vtkTypeInt64Array;
class vtkTypeUInt32Array;
class VTKIOXML_EXPORT vtkXMLHyperTreeGridWriter : public vtkXMLWriter
{
public:
vtkTypeMacro(vtkXMLHyperTreeGridWriter, vtkXMLWriter);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkXMLHyperTreeGridWriter* New();
/**
* Get/Set the writer's input.
*/
vtkHyperTreeGrid* GetInput();
/**
* Get the default file extension for files written by this writer.
*/
const char* GetDefaultFileExtension() override;
/**
* Methods to define the file's major and minor version numbers.
* Major version incremented since v0.1 hypertreegrid data readers
* cannot read the files written by this new reader.
* A version is defined by defect, so there is no need to call
* this function.
* The default choice is usually the best choice.
*/
vtkSetMacro(DataSetMajorVersion, int);
vtkSetMacro(DataSetMinorVersion, int);
protected:
vtkXMLHyperTreeGridWriter();
~vtkXMLHyperTreeGridWriter() override;
const char* GetDataSetName() override;
/**
* Methods to define the file's major and minor version numbers.
* Major version incremented since v0.1 hypertreegrid data readers
* cannot read the files written by this new reader.
* Actually, the default version is 1.0
*/
int GetDataSetMajorVersion() override { return DataSetMajorVersion; }
int GetDataSetMinorVersion() override { return DataSetMinorVersion; }
// Specify that we require HyperTreeGrid input
int FillInputPortInformation(int port, vtkInformation* info) override;
// The most important method, make the XML file for my input.
int WriteData() override;
// <HyperTreeGrid ...
int StartPrimaryElement(vtkIndent);
// ... dim, size, origin>
void WritePrimaryElementAttributes(ostream&, vtkIndent) override;
// Grid coordinates and mask
int WriteGrid(vtkIndent);
// Tree Descriptor and CellData
int WriteTrees_0(vtkIndent);
int WriteTrees_1(vtkIndent);
int WriteTrees_2(vtkIndent);
// </HyperTreeGrid>
int FinishPrimaryElement(vtkIndent);
// Descriptors for individual hypertrees
std::vector<vtkSmartPointer<vtkBitArray>> Descriptors;
// Descriptors for individual hypertrees
std::vector<vtkSmartPointer<vtkTypeInt64Array>> NbVerticesByLevels;
// Masks for individual hypertrees
std::vector<vtkSmartPointer<vtkBitArray>> Masks;
// Ids (index selection) for individual hypertrees
std::vector<vtkSmartPointer<vtkIdList>> Ids;
// Helper to simplify writing appended array data
void WriteAppendedArrayDataHelper(vtkAbstractArray* array, OffsetsManager& offsets);
void WriteCellDataAppendedArrayDataHelper(vtkAbstractArray* array, vtkIdType numberOfVertices,
OffsetsManager& offsets, vtkHyperTree* tree);
struct HyperTreeGridMetaDataForVersion2
{
void Initialize();
vtkSmartPointer<vtkBitArray> Descriptors;
vtkSmartPointer<vtkTypeInt64Array> TreeIds;
vtkSmartPointer<vtkTypeInt64Array> NumberOfVerticesPerDepth;
vtkSmartPointer<vtkIdList> BreadthFirstIdMap;
vtkSmartPointer<vtkTypeUInt32Array> DepthPerTree;
} MetaDataForVersion2;
OffsetsManagerGroup* CoordsOMG;
OffsetsManagerGroup* DescriptorOMG;
OffsetsManagerGroup* NbVerticesByLevelOMG;
OffsetsManagerGroup* MaskOMG;
OffsetsManagerGroup* CellDataOMG;
OffsetsManagerGroup* TreeIdsOMG;
OffsetsManagerGroup* DepthPerTreeOMG;
int NumberOfTrees;
// Default choice
int DataSetMajorVersion;
int DataSetMinorVersion;
private:
vtkXMLHyperTreeGridWriter(const vtkXMLHyperTreeGridWriter&) = delete;
void operator=(const vtkXMLHyperTreeGridWriter&) = delete;
};
#endif