// // 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. #include "boost/lexical_cast.hpp" #include "FileWriter.h" #include "FileWriter.hh" #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 "DataCollector.hh" #if HAVE_PARALLEL_DOMAIN_AMDIS #include #endif namespace AMDiS { using boost::lexical_cast; template<> FileWriterTemplated::FileWriterTemplated(std::string name_, Mesh *mesh_, SystemVector *vecs) : name(name_), mesh(mesh_) { FUNCNAME("FileWriterTemplated::FileWriterTemplated()"); initialize(); for (int i = 0; i < static_cast(vecs->getSize()); i++) TEST_EXIT(vecs->getDOFVector(0)->getFeSpace() == vecs->getDOFVector(i)->getFeSpace()) ("All FeSpace have to be equal!\n"); feSpace = vecs->getDOFVector(0)->getFeSpace(); solutionVecs.resize(vecs->getSize()); for (int i = 0; i < static_cast(vecs->getSize()); i++) solutionVecs[i] = vecs->getDOFVector(i); } template<> void FileWriterTemplated::writeFiles(AdaptInfo *adaptInfo, bool force, int level, Flag flag, bool (*writeElem)(ElInfo*)) { FUNCNAME("FileWriterTemplated::writeFiles()"); if ((adaptInfo->getTimestepNumber() % tsModulo != 0) && !force) return; // Containers, which store the data to be written; std::vector*> 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 HAVE_PARALLEL_DOMAIN_AMDIS std::string paraFilename = fn; fn += "-p" + lexical_cast(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 (writeAMDiSFormat) { 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); #if HAVE_PARALLEL_DOMAIN_AMDIS if (MPI::COMM_WORLD.Get_rank() == 0) vtkWriter.writeParallelFile(paraFilename + paraviewParallelFileExt, MPI::COMM_WORLD.Get_size(), filename, postfix); #endif MSG("ParaView file written to %s\n", (fn + paraviewFileExt).c_str()); } if (writeParaViewVectorFormat) { VtkVectorWriter::writeFile(solutionVecs, fn + paraviewFileExt, true, writeAs3dVector); // VtkVectorWriter::Impl vtkVectorWriter(&dataCollectors, writeAs3dVector); // vtkVectorWriter.setCompression(compression); // vtkVectorWriter.setWriteAs3dVector(writeAs3dVector); // vtkVectorWriter.writeFile(fn + paraviewFileExt); 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, ¶viewAnimationFrames, filename + ".pvd"); } #else VtkWriter::updateAnimationFile(adaptInfo, fn + paraviewFileExt, ¶viewAnimationFrames, filename + ".pvd"); #endif } if (writeDofFormat) { DofWriter dofWriter(feSpace); dofWriter.writeFile(fn + ".dof", solutionVecs); } if (writeArhFormat) ArhWriter::write(fn + ".arh", feSpace->getMesh(), solutionVecs); #ifdef HAVE_PNG if (writePngFormat) { PngWriter pngWriter(dataCollectors[0]); pngWriter.writeFile(fn + ".png", pngType); MSG("PNG image file written to %s\n", (fn + ".png").c_str()); } #endif if (writePovrayFormat) { PovrayWriter povrayWriter(this, dataCollectors[0]); povrayWriter.writeFile(fn + ".pov"); MSG("Povray script written to %s\n", (fn + ".pov").c_str()); } for (int i = 0; i < static_cast(dataCollectors.size()); i++) delete dataCollectors[i]; } }