Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer, es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Ein Anmelden über dieses erzeugt ein neues Konto. Das alte Konto ist über den Reiter "Standard" erreichbar. Die Administratoren

Dear Gitlab user, it is now possible to log in to our service using the ZIH login/LDAP. Logging in via this will create a new account. The old account can be accessed via the "Standard" tab. The administrators

Commit 5e1ecd7e authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

FileWriter.hh added

parent 3056a9f6
//
// Software License for AMDiS
//
// Copyright (c) 2010 Dresden University of Technology
// All rights reserved.
// Authors: Simon Vey, Thomas Witkowski et al.
//
// This file is part of AMDiS
//
// See also license.opensource.txt in the distribution.
/** \file FileWriter.hh */
#ifndef AMDIS_FILEWRITER_HH
#define AMDIS_FILEWRITER_HH
#include "boost/lexical_cast.hpp"
#include "FileWriter.h"
#include "Initfile.h"
#include "ValueWriter.h"
#include "MacroWriter.h"
#include "VtkWriter.h"
#include "VtkVectorWriter.h"
#include "VtkVectorWriter.hh"
#include "PngWriter.h"
#include "PovrayWriter.h"
#include "DofWriter.h"
#include "ArhWriter.h"
#include "FiniteElemSpace.h"
#include "AdaptInfo.h"
#include "Flag.h"
#include "ElInfo.h"
#include "Mesh.h"
#include "SystemVector.h"
#include "DataCollector.hh"
#if HAVE_PARALLEL_DOMAIN_AMDIS
#include <mpi.h>
#endif
namespace AMDiS {
using boost::lexical_cast;
template<typename T>
FileWriterTemplated<T>::FileWriterTemplated(std::string str, Mesh *m, DOFVector<T> *vec)
: name(str),
mesh(m)
{
FUNCNAME("FileWriterTemplated<T>::FileWriter()");
initialize();
feSpace = vec->getFeSpace();
solutionVecs.resize(1);
solutionVecs[0] = vec;
}
template<typename T>
FileWriterTemplated<T>::FileWriterTemplated(std::string name_,
Mesh *mesh_,
std::vector<DOFVector<T>*> vecs)
: name(name_),
mesh(mesh_)
{
FUNCNAME("FileWriterTemplated<T>::FileWriterTemplated()");
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;
}
template<typename T>
FileWriterTemplated<T>::FileWriterTemplated(std::string name_,
Mesh *mesh_,
SystemVector *vecs)
: name(name_),
mesh(mesh_)
{
ERROR("SystemVector contains DOFVectors of type double, so the FileWriterTemplated<not double> can not be used!\n");
}
template<typename T>
FileWriterTemplated<T>::~FileWriterTemplated()
{
// 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];
}
template<typename T>
void FileWriterTemplated<T>::initialize()
{
amdisMeshExt = ".mesh";
amdisDataExt = ".dat";
paraviewFileExt = ".vtu";
paraviewParallelFileExt = ".pvtu";
periodicFileExt = ".per";
writeAMDiSFormat = 0;
writeParaViewFormat = 0;
writeParaViewVectorFormat = 0;
writeAs3dVector = false;
writeParaViewAnimation = 0;
writePeriodicFormat = 0;
writePngFormat = 0;
writePovrayFormat = 0;
writeDofFormat = 0;
writeArhFormat = 0;
pngType = 0;
appendIndex = 0;
indexLength = 5;
indexDecimals = 3;
tsModulo = 1;
nTmpSolutions = 0;
paraviewAnimationFrames.resize(0),
compression = NONE;
readParameters();
}
template<typename T>
void FileWriterTemplated<T>::readParameters()
{
FUNCNAME("FileWriterTemplated<T>::readParamters()");
Parameters::get(name + "->filename", filename);
Parameters::get(name + "->AMDiS format", writeAMDiSFormat);
Parameters::get(name + "->AMDiS mesh ext", amdisMeshExt);
Parameters::get(name + "->AMDiS data ext", amdisDataExt);
Parameters::get(name + "->ParaView format", writeParaViewFormat);
Parameters::get(name + "->ParaView vector format", writeParaViewVectorFormat);
Parameters::get(name + "->write vector as 3d vector", writeAs3dVector);
Parameters::get(name + "->ParaView animation", writeParaViewAnimation);
Parameters::get(name + "->ParaView ext", paraviewFileExt);
Parameters::get(name + "->Periodic format", writePeriodicFormat);
Parameters::get(name + "->Periodic ext", periodicFileExt);
Parameters::get(name + "->PNG format", writePngFormat);
Parameters::get(name + "->PNG type", pngType);
Parameters::get(name + "->append index", appendIndex);
Parameters::get(name + "->index length", indexLength);
Parameters::get(name + "->index decimals", indexDecimals);
Parameters::get(name + "->write every i-th timestep", tsModulo);
Parameters::get(name + "->Povray format", writePovrayFormat);
Parameters::get(name + "->Povray template", povrayTemplate);
Parameters::get(name + "->Povray camera location", povrayCameraLocation);
Parameters::get(name + "->Povray camera look_at", povrayCameraLookAt);
Parameters::get(name + "->DOF format", writeDofFormat);
Parameters::get(name + "->ARH format", writeArhFormat);
std::string compressionStr = "";
Parameters::get(name + "->compression", compressionStr);
if (compressionStr == "gzip" || compressionStr == "gz") {
compression = GZIP;
} else if (compressionStr == "bzip2" || compressionStr == "bz2") {
compression = BZIP2;
}
}
template<typename T>
void FileWriterTemplated<T>::writeFiles(AdaptInfo *adaptInfo,
bool force,
int level,
Flag flag,
bool (*writeElem)(ElInfo*))
{
FUNCNAME("FileWriterTemplated<T>::writeFiles()");
if ((adaptInfo->getTimestepNumber() % tsModulo != 0) && !force)
return;
// Containers, which store the data to be written;
std::vector<DataCollector<T>*> dataCollectors(solutionVecs.size());
if (writeElem) {
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++)
dataCollectors[i] = new DataCollector<T>(feSpace, solutionVecs[i],
level, flag, writeElem);
} else {
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++)
dataCollectors[i] = new DataCollector<T>(feSpace, solutionVecs[i],
traverseLevel,
flag | traverseFlag,
writeElement);
}
std::string fn = filename;
#if HAVE_PARALLEL_DOMAIN_AMDIS
std::string paraFilename = fn;
fn += "-p" + lexical_cast<std::string>(MPI::COMM_WORLD.Get_rank()) + "-";
std::string postfix = "";
#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 HAVE_PARALLEL_DOMAIN_AMDIS
paraFilename += timeStr;
postfix += timeStr + paraviewFileExt;
#endif
} else {
#if HAVE_PARALLEL_DOMAIN_AMDIS
postfix += paraviewFileExt;
#endif
}
if (writeParaViewVectorFormat) {
VtkVectorWriter::Impl<T> vtkVectorWriter(&dataCollectors, writeAs3dVector);
vtkVectorWriter.setCompression(compression);
vtkVectorWriter.writeFile(fn + paraviewFileExt);
#if HAVE_PARALLEL_DOMAIN_AMDIS
if (MPI::COMM_WORLD.Get_rank() == 0)
vtkVectorWriter.writeParallelFile(paraFilename + paraviewParallelFileExt,
MPI::COMM_WORLD.Get_size(),
filename, postfix);
#endif
MSG("ParaView file written to %s\n", (fn + paraviewFileExt).c_str());
}
if (writeParaViewAnimation) {
#if HAVE_PARALLEL_DOMAIN_AMDIS
if (MPI::COMM_WORLD.Get_rank() == 0) {
VtkWriter::updateAnimationFile(adaptInfo,
paraFilename + paraviewParallelFileExt,
&paraviewAnimationFrames,
filename + ".pvd");
}
#else
VtkWriter::updateAnimationFile(adaptInfo,
fn + paraviewFileExt,
&paraviewAnimationFrames,
filename + ".pvd");
#endif
}
for (int i = 0; i < static_cast<int>(dataCollectors.size()); i++)
delete dataCollectors[i];
}
}
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment