FileWriter.cc 7.37 KB
Newer Older
1
2
3
4
5
6
7
#include "FileWriter.h"
#include "SystemVector.h"
#include "Parameters.h"
#include "TecPlotWriter.h"
#include "ValueWriter.h"
#include "MacroWriter.h"
#include "VtkWriter.h"
8
#include "PngWriter.h"
9
10
11
12
13
#include "FiniteElemSpace.h"
#include "AdaptInfo.h"
#include "Flag.h"
#include "ElInfo.h"
#include "Mesh.h"
14
#include "OpenMP.h"
15
16
17

namespace AMDiS {

18
  FileWriter::FileWriter(const std::string &name_, 
19
20
21
22
23
			 Mesh *mesh_,
			 DOFVector<double> *vec)
    : name(name_),
      mesh(mesh_)
  {
24
25
26
    FUNCNAME("FileWriter::FileWriter()");

    initialize();
27
28
29
30
31
32
33

    feSpace = vec->getFESpace();

    solutionVecs_.resize(1);
    solutionVecs_[0] = vec;
  }

34

35
  FileWriter::FileWriter(const std::string &name_, 
36
			 Mesh *mesh_,
37
			 std::vector< DOFVector<double>* > vecs)
38
39
40
41
42
    : name(name_),
      mesh(mesh_)
  {
    FUNCNAME("FileWriter::FileWriter()");

43
    initialize();
44
45
46
47
48
49
50
51
52
53

    for (int i = 0; i < static_cast<int>(vecs.size()); i++) {
      TEST_EXIT(vecs[0]->getFESpace() == vecs[i]->getFESpace())
	("All FESpace have to be equal!\n");
    }

    feSpace = vecs[0]->getFESpace();
    solutionVecs_ = vecs;
  }

54

55
  FileWriter::FileWriter(const std::string &name_, 
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
			 Mesh *mesh_,
			 DOFVector< WorldVector<double> > *vec)
    : name(name_),
      mesh(mesh_)
  {
    FUNCNAME("FileWriter::FileWriter()");

    initialize();
    
    // Create the temporal DOFVectors for all components of WorldVector.
    nTmpSolutions_ = (*vec)[0].getSize();
    solutionVecs_.resize(nTmpSolutions_);
    for (int i = 0; i < nTmpSolutions_; i++) {
      solutionVecs_[i] = NEW DOFVector<double>(vec->getFESpace(), "");
    } 

    // Copy the components of the WorldVectors to different DOFVectors
    // of double values.
    DOFVector< WorldVector<double> >::Iterator it(vec, USED_DOFS);
    int counter = 0;
    for (it.reset(); !it.end(); ++it, counter++) {
      for (int i = 0; i < nTmpSolutions_; i++) {
	(*solutionVecs_[i])[counter] = (*it)[i];
      }
    }

    feSpace = vec->getFESpace();
  }


  FileWriter::~FileWriter()
  {
    // Do not forget to delete temporal solution vector, if there have been
    // some created in the constructor.
    if (nTmpSolutions_ > 0) {
      for (int i = 0; i < nTmpSolutions_; i++) {
        DELETE solutionVecs_[i]; 
      }
    }
  }
  

  void FileWriter::initialize()
  {
    tecplotExt = ".tec";
    amdisMeshExt = ".mesh";
    amdisDataExt = ".dat";
    paraViewFileExt = ".vtu";
    periodicFileExt = ".per";
    writeTecPlotFormat = 0;
    writeAMDiSFormat = 0;
    writeParaViewFormat = 0;
108
    writeParaViewAnimation = 0;
109
    writePeriodicFormat = 0;
110
    writePngFormat = 0;
111
112
113
114
115
    appendIndex = 0;
    indexLength = 5;
    indexDecimals = 3;
    tsModulo = 1;
    nTmpSolutions_ = 0;
Thomas Witkowski's avatar
Thomas Witkowski committed
116
    paraViewAnimationFrames_.resize(0),
117
    compression = NONE;
118
119

    readParameters();
120
121
  }

122
123
124
125
126
127
128
129
130
131
132
  void FileWriter::readParameters()
  {
    FUNCNAME("FileWriter::readParamters()");

    GET_PARAMETER(0, name + "->filename", &filename);
    GET_PARAMETER(0, name + "->TecPlot format", "%d", &writeTecPlotFormat);
    GET_PARAMETER(0, name + "->TecPlot ext", &tecplotExt);
    GET_PARAMETER(0, name + "->AMDiS format", "%d", &writeAMDiSFormat);
    GET_PARAMETER(0, name + "->AMDiS mesh ext", &amdisMeshExt);
    GET_PARAMETER(0, name + "->AMDiS data ext", &amdisDataExt);
    GET_PARAMETER(0, name + "->ParaView format", "%d", &writeParaViewFormat);
133
134
    GET_PARAMETER(0, name + "->ParaView animation", "%d", &writeParaViewAnimation);
    GET_PARAMETER(0, name + "->ParaView ext", &paraViewFileExt);    
135
136
    GET_PARAMETER(0, name + "->Periodic format", "%d", &writePeriodicFormat);
    GET_PARAMETER(0, name + "->Periodic ext", &periodicFileExt);
137
    GET_PARAMETER(0, name + "->PNG format", "%d", &writePngFormat);
138
139
140
141
    GET_PARAMETER(0, name + "->append index", "%d", &appendIndex);
    GET_PARAMETER(0, name + "->index length", "%d", &indexLength);
    GET_PARAMETER(0, name + "->index decimals", "%d", &indexDecimals);
    GET_PARAMETER(0, name + "->write every i-th timestep", "%d", &tsModulo);
142

143
144
145
146
147
148
149
    std::string compressionStr = "";
    GET_PARAMETER(0, name + "->compression", &compressionStr);
    if ((compressionStr == "gzip") || (compressionStr == "gz")) {
      compression = GZIP;
    } else if ((compressionStr == "bzip2") || (compressionStr == "bz2")) {
      compression = BZIP2;
    }
150
151
152
153
154
155
156
157
158
  }

  void FileWriter::writeFiles(AdaptInfo *adaptInfo,
			      bool force,
			      int level,
			      Flag flag,
			      bool (*writeElem)(ElInfo*))
  {
    FUNCNAME("FileWriter::writeFiles()");
Thomas Witkowski's avatar
Thomas Witkowski committed
159
    
160
161
162
    if ((adaptInfo->getTimestepNumber() % tsModulo != 0) && !force) 
      return;

163
164
165
    // Containers, which store the data to be written;
    std::vector< DataCollector* > dataCollectors(solutionVecs_.size());

Thomas Witkowski's avatar
Thomas Witkowski committed
166
    if (writeElem) {
167
168
169
      for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++) {
	dataCollectors[i] = NEW DataCollector(feSpace, solutionVecs_[i], 
					      level, flag, writeElem);
Thomas Witkowski's avatar
Thomas Witkowski committed
170
171
      }
    } else {
172
173
      for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++) {
	dataCollectors[i] = NEW DataCollector(feSpace, solutionVecs_[i], 
174
175
176
					      traverseLevel, 
					      flag | traverseFlag, 
					      writeElement);
Thomas Witkowski's avatar
Thomas Witkowski committed
177
178
179
      }
    }

180
    std::string fn = filename;
181
182
183
184
185
186
187
188
189

    if (appendIndex) {
      TEST_EXIT(indexLength <= 99)("index lenght > 99\n");
      TEST_EXIT(indexDecimals <= 97)("index decimals > 97\n");
      TEST_EXIT(indexDecimals < indexLength)("index length <= index decimals\n");
    
      char formatStr[9];
      char timeStr[20];

Thomas Witkowski's avatar
Thomas Witkowski committed
190
      sprintf(formatStr, "%%0%d.%df", indexLength, indexDecimals);
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
      sprintf(timeStr, formatStr, adaptInfo ? adaptInfo->getTime() : 0.0);

      fn += timeStr;
    }

    if (writeTecPlotFormat) {
      TecPlotWriter<DOFVector<double> >::writeValues(solutionVecs_[0], 
						     const_cast<char*>((fn + tecplotExt).c_str()), 
						     solutionVecs_[0]->getName().c_str());
      MSG("TecPlot file written to %s\n", (fn + tecplotExt).c_str());
    }

    if (writeAMDiSFormat) {
      TEST_EXIT(mesh)("no mesh\n");

206
      MacroWriter::writeMacro(dataCollectors[0], 
Thomas Witkowski's avatar
Thomas Witkowski committed
207
			     const_cast<char*>((fn +  amdisMeshExt).c_str()), 
208
209
210
211
			     adaptInfo ? adaptInfo->getTime() : 0.0);
      MSG("macro file written to %s\n", (fn + amdisMeshExt).c_str());


212
      ValueWriter::writeValues(dataCollectors[0],
213
214
215
216
217
218
			       (fn + amdisDataExt).c_str(),
			       adaptInfo ? adaptInfo->getTime() : 0.0);
      MSG("value file written to %s\n", (fn + amdisDataExt).c_str());   
    }

    if (writePeriodicFormat) {
219
      MacroWriter::writePeriodicFile(dataCollectors[0], 
220
221
222
223
224
				     (fn + periodicFileExt).c_str());
      MSG("periodic file written to %s\n", (fn + periodicFileExt).c_str());
    }
    
    if (writeParaViewFormat) {
225
      VtkWriter vtkWriter(&dataCollectors);     
226
      vtkWriter.setCompression(compression);
227
      vtkWriter.writeFile(fn + paraViewFileExt);      
Thomas Witkowski's avatar
Thomas Witkowski committed
228

229
230
231
      MSG("ParaView file written to %s\n", (fn + paraViewFileExt).c_str());
    }

232
    if (writeParaViewAnimation) {
233
      VtkWriter vtkWriter(&dataCollectors);
234
235
      vtkWriter.updateAnimationFile(fn + paraViewFileExt, 
				    &paraViewAnimationFrames_, 
Thomas Witkowski's avatar
Thomas Witkowski committed
236
				    const_cast<char*>((filename + ".pvd").c_str()));
237
    }
238
239
240
241
242
243
244

    if (writePngFormat) {
      PngWriter pngWriter(dataCollectors[0]);
      pngWriter.writeFile(const_cast<char*>((fn + paraViewFileExt).c_str()));

      MSG("PNG image file written to %s\n", (fn + paraViewFileExt).c_str());
    }
245
    
246

247
248
    for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++) {
      DELETE dataCollectors[i];
Thomas Witkowski's avatar
Thomas Witkowski committed
249
250
251
    }
  }

252
}