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

Thomas Witkowski
committed
FUNCNAME("FileWriter::FileWriter()");
initialize();
feSpace = vec->getFESpace();
solutionVecs_.resize(1);
solutionVecs_[0] = vec;
}

Thomas Witkowski
committed
FileWriter::FileWriter(const std::string &name_,
std::vector< DOFVector<double>* > vecs)
: name(name_),
mesh(mesh_)
{
FUNCNAME("FileWriter::FileWriter()");

Thomas Witkowski
committed
initialize();
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
committed
FileWriter::FileWriter(const std::string &name_,

Thomas Witkowski
committed
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
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;

Thomas Witkowski
committed
writePeriodicFormat = 0;
appendIndex = 0;
indexLength = 5;
indexDecimals = 3;
tsModulo = 1;
nTmpSolutions_ = 0;

Thomas Witkowski
committed
}
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);
GET_PARAMETER(0, name + "->ParaView animation", "%d", &writeParaViewAnimation);
GET_PARAMETER(0, name + "->ParaView ext", ¶ViewFileExt);
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);
std::string compressionStr = "";
GET_PARAMETER(0, name + "->compression", &compressionStr);
if ((compressionStr == "gzip") || (compressionStr == "gz")) {
compression = GZIP;
} else if ((compressionStr == "bzip2") || (compressionStr == "bz2")) {
compression = BZIP2;
}
}
void FileWriter::writeFiles(AdaptInfo *adaptInfo,
bool force,
int level,
Flag flag,
bool (*writeElem)(ElInfo*))
{
FUNCNAME("FileWriter::writeFiles()");
if ((adaptInfo->getTimestepNumber() % tsModulo != 0) && !force)
return;
// Containers, which store the data to be written;
std::vector< DataCollector* > dataCollectors(solutionVecs_.size());
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++) {
dataCollectors[i] = NEW DataCollector(feSpace, solutionVecs_[i],
level, flag, writeElem);
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++) {
dataCollectors[i] = NEW DataCollector(feSpace, solutionVecs_[i],
traverseLevel, flag | traverseFlag, writeElement);
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];
sprintf(formatStr, "%%0%d.%df", indexLength, indexDecimals);
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");
MacroWriter::writeMacro(dataCollectors[0],
adaptInfo ? adaptInfo->getTime() : 0.0);
MSG("macro file written to %s\n", (fn + amdisMeshExt).c_str());
ValueWriter::writeValues(dataCollectors[0],
(fn + amdisDataExt).c_str(),
adaptInfo ? adaptInfo->getTime() : 0.0);
MSG("value file written to %s\n", (fn + amdisDataExt).c_str());
}
if (writePeriodicFormat) {
MacroWriter::writePeriodicFile(dataCollectors[0],
(fn + periodicFileExt).c_str());
MSG("periodic file written to %s\n", (fn + periodicFileExt).c_str());
}
if (writeParaViewFormat) {
VtkWriter vtkWriter(&dataCollectors);
vtkWriter.setCompression(compression);
vtkWriter.writeFile(const_cast<char*>((fn + paraViewFileExt).c_str()));
MSG("ParaView file written to %s\n", (fn + paraViewFileExt).c_str());
}
VtkWriter vtkWriter(&dataCollectors);
vtkWriter.updateAnimationFile(fn + paraViewFileExt,
¶ViewAnimationFrames_,
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++) {
DELETE dataCollectors[i];