#include "FileWriter.h" #include "SystemVector.h" #include "Parameters.h" #include "TecPlotWriter.h" #include "ValueWriter.h" #include "MacroWriter.h" #include "VtkWriter.h" #include "DataCollector.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 *vec) : name(name_), tecplotExt(".tec"), amdisMeshExt(".mesh"), amdisDataExt(".dat"), paraViewFileExt(".vtu"), periodicFileExt(".per"), writeTecPlotFormat(0), writeAMDiSFormat(0), writeParaViewFormat(0), writePeriodicFormat(0), appendIndex(0), indexLength(5), indexDecimals(3), tsModulo(1), mesh(mesh_) { readParameters(); feSpace = vec->getFESpace(); solutionVecs_.resize(1); solutionVecs_[0] = vec; } FileWriter::FileWriter(const ::std::string &name_, Mesh *mesh_, ::std::vector< DOFVector* > vecs) : name(name_), tecplotExt(".tec"), amdisMeshExt(".mesh"), amdisDataExt(".dat"), paraViewFileExt(".vtu"), periodicFileExt(".per"), writeTecPlotFormat(0), writeAMDiSFormat(0), writeParaViewFormat(0), writePeriodicFormat(0), appendIndex(0), indexLength(5), indexDecimals(3), tsModulo(1), mesh(mesh_) { FUNCNAME("FileWriter::FileWriter()"); readParameters(); 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; } 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 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); } void FileWriter::writeFiles(AdaptInfo *adaptInfo, bool force, int level, Flag flag, bool (*writeElem)(ElInfo*)) { FUNCNAME("FileWriter::writeFiles()"); if ((adaptInfo->getTimestepNumber() % tsModulo != 0) && !force) return; ::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]; sprintf(formatStr, "%%0%d.%df", indexLength, indexDecimals); char timeStr[20]; sprintf(timeStr, formatStr, adaptInfo ? adaptInfo->getTime() : 0.0); fn += timeStr; } ::std::vector< DataCollector* > dc(solutionVecs_.size()); if (writeElem) { for (int i = 0; i < static_cast(dc.size()); i++) { dc[i] = NEW DataCollector(feSpace, solutionVecs_[i], level, flag, writeElem); } } else { for (int i = 0; i < static_cast(dc.size()); i++) { dc[i] = NEW DataCollector(feSpace, solutionVecs_[i], traverseLevel, flag | traverseFlag, writeElement); } } 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(dc[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(dc[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(dc[0], (fn + periodicFileExt).c_str()); MSG("periodic file written to %s\n", (fn + periodicFileExt).c_str()); } if (writeParaViewFormat) { VtkWriter::writeFile(&dc, const_cast( (fn + paraViewFileExt).c_str())); MSG("ParaView file written to %s\n", (fn + paraViewFileExt).c_str()); } for (int i = 0; i < static_cast(dc.size()); i++) { DELETE dc[i]; } } }