Newer
Older
#include "FileWriter.h"
#include "SystemVector.h"
#include "Parameters.h"
#include "TecPlotWriter.h"
#include "ValueWriter.h"
#include "MacroWriter.h"
#include "VtkWriter.h"
#include "PngWriter.h"
#include "FiniteElemSpace.h"
#include "AdaptInfo.h"
#include "Flag.h"
#include "ElInfo.h"
#include "Mesh.h"
#if HAVE_PARALLEL_DOMAIN_AMDIS
#include "mpi.h"
#endif
FileWriter::FileWriter(std::string str, Mesh *m, DOFVector<double> *vec)

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

Thomas Witkowski
committed
FileWriter::FileWriter(std::string name_,
Mesh *mesh_,
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

Thomas Witkowski
committed
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(), "");

Thomas Witkowski
committed
}
// 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++)

Thomas Witkowski
committed
}
void FileWriter::initialize()
{
tecplotExt = ".tec";
amdisMeshExt = ".mesh";
amdisDataExt = ".dat";
paraViewFileExt = ".vtu";
periodicFileExt = ".per";
writeTecPlotFormat = 0;
writeAMDiSFormat = 0;
writeParaViewFormat = 0;

Thomas Witkowski
committed
writePeriodicFormat = 0;
writePngFormat = 0;

Thomas Witkowski
committed
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 + "->PNG format", "%d", &writePngFormat);
GET_PARAMETER(0, name + "->PNG type", "%d", &pngType);
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],
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++)
dataCollectors[i] = new DataCollector(feSpace, solutionVecs_[i],
traverseLevel,
flag | traverseFlag,
writeElement);
#if HAVE_PARALLEL_DOMAIN_AMDIS
char f[10];
sprintf(f, "-p%d-", MPI::COMM_WORLD.Get_rank());
fn += f;
#endif
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(fn + paraViewFileExt);
MSG("ParaView file written to %s\n", (fn + paraViewFileExt).c_str());
}
VtkWriter vtkWriter(&dataCollectors);
vtkWriter.updateAnimationFile(fn + paraViewFileExt,
¶ViewAnimationFrames_,
if (writePngFormat) {
PngWriter pngWriter(dataCollectors[0]);
pngWriter.writeFile(fn + ".png", pngType);
MSG("PNG image file written to %s\n", (fn + ".png").c_str());
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++) {