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

namespace AMDiS {

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

    initialize();
25
26
27
28
29

    feSpace = vec->getFESpace();

    solutionVecs_.resize(1);
    solutionVecs_[0] = vec;
Thomas Witkowski's avatar
Thomas Witkowski committed
30
31

    dataCollectors_.resize(1);
32
33
  }

34

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

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

    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;
Thomas Witkowski's avatar
Thomas Witkowski committed
52
53

    dataCollectors_.resize(vecs.size());
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

  FileWriter::FileWriter(const ::std::string &name_, 
			 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();
Thomas Witkowski's avatar
Thomas Witkowski committed
85
86

    dataCollectors_.resize(nTmpSolutions_);
87
88
89
90
91
92
93
94
95
96
97
98
  }


  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]; 
      }
    }
Thomas Witkowski's avatar
Thomas Witkowski committed
99
100
101
102
103
104

    for (int i = 0; i < static_cast<int>(dataCollectors_.size()); i++) {
      if (dataCollectors_[i]) {
	DELETE dataCollectors_[i];
      }
    }
105
106
107
108
109
110
111
112
113
114
115
116
117
  }
  

  void FileWriter::initialize()
  {
    tecplotExt = ".tec";
    amdisMeshExt = ".mesh";
    amdisDataExt = ".dat";
    paraViewFileExt = ".vtu";
    periodicFileExt = ".per";
    writeTecPlotFormat = 0;
    writeAMDiSFormat = 0;
    writeParaViewFormat = 0;
118
    writeParaViewAnimation = 0;
119
120
121
122
123
124
    writePeriodicFormat = 0;
    appendIndex = 0;
    indexLength = 5;
    indexDecimals = 3;
    tsModulo = 1;
    nTmpSolutions_ = 0;
Thomas Witkowski's avatar
Thomas Witkowski committed
125
126
127
    delayWriting_ = 0;
    writingIsDelayed_ = false;
    delayedFilename_ = "";
128
129
130
    paraViewAnimationFrames_.resize(0);

    readParameters();
131
132
  }

133
134
135
136
137
138
139
140
141
142
143
  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);
144
145
    GET_PARAMETER(0, name + "->ParaView animation", "%d", &writeParaViewAnimation);
    GET_PARAMETER(0, name + "->ParaView ext", &paraViewFileExt);    
146
147
148
149
150
151
    GET_PARAMETER(0, name + "->Periodic format", "%d", &writePeriodicFormat);
    GET_PARAMETER(0, name + "->Periodic ext", &periodicFileExt);
    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);
Thomas Witkowski's avatar
Thomas Witkowski committed
152
    GET_PARAMETER(0, name + "->delay", "%d", &delayWriting_);
153
154
155
156
157
158
159
160
161
  }

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

Thomas Witkowski's avatar
Thomas Witkowski committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
    if (writingIsDelayed_) {
      ERROR_EXIT("This should not happen!\n");
    }

    if (writeElem) {
      for (int i = 0; i < static_cast<int>(dataCollectors_.size()); i++) {
	dataCollectors_[i] = NEW DataCollector(feSpace, solutionVecs_[i], 
				  level, flag, writeElem);
      }
    } else {
      for (int i = 0; i < static_cast<int>(dataCollectors_.size()); i++) {
	dataCollectors_[i] = NEW DataCollector(feSpace, solutionVecs_[i], 
				  traverseLevel, flag | traverseFlag, writeElement);
      }
    }

182
183
184
185
186
187
188
189
190
191
    ::std::string fn = filename;

    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
192
      sprintf(formatStr, "%%0%d.%df", indexLength, indexDecimals);
193
194
195
196
197
198
      sprintf(timeStr, formatStr, adaptInfo ? adaptInfo->getTime() : 0.0);

      fn += timeStr;
    }


Thomas Witkowski's avatar
Thomas Witkowski committed
199
200
201
    if (delayWriting_) {
      if (writeTecPlotFormat || writeAMDiSFormat || writePeriodicFormat) {
	ERROR_EXIT("Delay writing only supported for ParaView file format!\n");
202
      }
Thomas Witkowski's avatar
Thomas Witkowski committed
203
204
205

      for (int i = 0; i < static_cast<int>(dataCollectors_.size()); i++) {
	dataCollectors_[i]->fillAllData();
206
207
      }

Thomas Witkowski's avatar
Thomas Witkowski committed
208
209
210
211
212
      writingIsDelayed_ = true;
      delayedFilename_ = fn;
      return;
    }
 
213
214
215
216
217
218
219
220
221
222
    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");

Thomas Witkowski's avatar
Thomas Witkowski committed
223
224
      MacroWriter::writeMacro(dataCollectors_[0], 
			     const_cast<char*>((fn +  amdisMeshExt).c_str()), 
225
226
227
228
			     adaptInfo ? adaptInfo->getTime() : 0.0);
      MSG("macro file written to %s\n", (fn + amdisMeshExt).c_str());


Thomas Witkowski's avatar
Thomas Witkowski committed
229
      ValueWriter::writeValues(dataCollectors_[0],
230
231
232
233
234
235
			       (fn + amdisDataExt).c_str(),
			       adaptInfo ? adaptInfo->getTime() : 0.0);
      MSG("value file written to %s\n", (fn + amdisDataExt).c_str());   
    }

    if (writePeriodicFormat) {
Thomas Witkowski's avatar
Thomas Witkowski committed
236
      MacroWriter::writePeriodicFile(dataCollectors_[0], 
237
238
239
240
241
				     (fn + periodicFileExt).c_str());
      MSG("periodic file written to %s\n", (fn + periodicFileExt).c_str());
    }
    
    if (writeParaViewFormat) {
Thomas Witkowski's avatar
Thomas Witkowski committed
242
243
244
      VtkWriter vtkWriter(&dataCollectors_);     
      vtkWriter.writeFile(const_cast<char*>((fn + paraViewFileExt).c_str()));

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

248
    if (writeParaViewAnimation) {
Thomas Witkowski's avatar
Thomas Witkowski committed
249
      VtkWriter vtkWriter(&dataCollectors_);
250
251
      vtkWriter.updateAnimationFile(fn + paraViewFileExt, 
				    &paraViewAnimationFrames_, 
Thomas Witkowski's avatar
Thomas Witkowski committed
252
				    const_cast<char*>((filename + ".pvd").c_str()));
253
    }
254
    
255

Thomas Witkowski's avatar
Thomas Witkowski committed
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
    for (int i = 0; i < static_cast<int>(dataCollectors_.size()); i++) {
      DELETE dataCollectors_[i];
    }
  }

  void FileWriter::writeDelayedFiles()
  {
    if (!writingIsDelayed_) {
      return;
    }

    if (writeParaViewFormat) {
      VtkWriter vtkWriter(&dataCollectors_);     
      vtkWriter.writeFile(const_cast<char*>((delayedFilename_ + paraViewFileExt).c_str()));
    }

    if (writeParaViewAnimation) {
      VtkWriter vtkWriter(&dataCollectors_);
      vtkWriter.updateAnimationFile(delayedFilename_ + paraViewFileExt, 
				    &paraViewAnimationFrames_, 
				    const_cast<char*>((filename + ".pvd").c_str()));
277
    }
Thomas Witkowski's avatar
Thomas Witkowski committed
278
279
280
281
282
283
284

    for (int i = 0; i < static_cast<int>(dataCollectors_.size()); i++) {
      DELETE dataCollectors_[i];
    }

    writingIsDelayed_ = false;
    delayedFilename_ = "";
285
286
  }
}