#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" #include "OpenMP.h" namespace AMDiS { FileWriter::FileWriter(const std::string &name_, Mesh *mesh_, DOFVector *vec) : name(name_), mesh(mesh_) { FUNCNAME("FileWriter::FileWriter()"); initialize(); feSpace = vec->getFESpace(); solutionVecs_.resize(1); solutionVecs_[0] = vec; } FileWriter::FileWriter(const std::string &name_, Mesh *mesh_, std::vector< DOFVector* > vecs) : name(name_), mesh(mesh_) { FUNCNAME("FileWriter::FileWriter()"); initialize(); for (int i = 0; i < static_cast(vecs.size()); i++) { TEST_EXIT(vecs[0]->getFESpace() == vecs[i]->getFESpace()) ("All FESpace have to be equal!\n"); } feSpace = vecs[0]->getFESpace(); solutionVecs_ = vecs; } FileWriter::FileWriter(const std::string &name_, Mesh *mesh_, DOFVector< WorldVector > *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(vec->getFESpace(), ""); } // Copy the components of the WorldVectors to different DOFVectors // of double values. DOFVector< WorldVector >::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; writeParaViewAnimation = 0; writePeriodicFormat = 0; writePngFormat = 0; pngType = 0; appendIndex = 0; indexLength = 5; indexDecimals = 3; tsModulo = 1; nTmpSolutions_ = 0; paraViewAnimationFrames_.resize(0), compression = NONE; readParameters(); } 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()); if (writeElem) { for (int i = 0; i < static_cast(dataCollectors.size()); i++) { dataCollectors[i] = new DataCollector(feSpace, solutionVecs_[i], level, flag, writeElem); } } else { for (int i = 0; i < static_cast(dataCollectors.size()); i++) { dataCollectors[i] = new DataCollector(feSpace, solutionVecs_[i], traverseLevel, flag | traverseFlag, writeElement); } } 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]; sprintf(formatStr, "%%0%d.%df", indexLength, indexDecimals); sprintf(timeStr, formatStr, adaptInfo ? adaptInfo->getTime() : 0.0); fn += timeStr; } if (writeTecPlotFormat) { TecPlotWriter >::writeValues(solutionVecs_[0], const_cast((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], const_cast((fn + amdisMeshExt).c_str()), 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()); } if (writeParaViewAnimation) { VtkWriter vtkWriter(&dataCollectors); vtkWriter.updateAnimationFile(fn + paraViewFileExt, ¶ViewAnimationFrames_, filename + ".pvd"); } 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(dataCollectors.size()); i++) { delete dataCollectors[i]; } } }