// // 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 <stdio.h> #include <string> #include <fstream> #include <sstream> #include <cmath> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/convenience.hpp> #include <boost/lexical_cast.hpp> #ifdef HAVE_PARALLEL_DOMAIN_AMDIS #include <mpi.h> #endif #include "VtkVectorWriter.h" #include "VtkVectorWriter.hh" #include "DataCollector.h" #include "DataCollector.hh" #include "DOFVector.h" #include "SurfaceRegion_ED.h" #include "ElementRegion_ED.h" namespace AMDiS { int VtkVectorWriter::updateAnimationFile(std::string valueFilename, std::vector< std::string > *paraViewAnimationFrames, std::string animationFilename) { FUNCNAME("VtkVectorWriter::Impl<S>::updateAnimationFile()"); size_t found = valueFilename.find_last_of("/\\"); paraViewAnimationFrames->push_back(valueFilename.substr(found + 1)); boost::iostreams::filtering_ostream file; { std::ofstream swapfile(animationFilename.c_str(), std::ios::out | std::ios::trunc); TEST_EXIT(swapfile.is_open()) ("Cannot open file %s for writing!\n", animationFilename.c_str()); swapfile.close(); } file.push(boost::iostreams::file_descriptor_sink(animationFilename, std::ios::trunc)); file << "<?xml version=\"1.0\"?>\n"; file << "<VTKFile type=\"Collection\" version=\"0.1\" >" << "\n"; file << "<Collection>\n"; int counter = 0; std::vector< std::string >::iterator it; for (it = paraViewAnimationFrames->begin(); it < paraViewAnimationFrames->end(); ++it, counter++) { file << "<DataSet timestep=\"" << counter << "\" part=\"0\" file=\"" << (*it) << "\"/>\n"; } file << "</Collection>\n"; file << "</VTKFile>\n"; return 0; } void VtkVectorWriter::writeFile(std::vector<DOFVector<double>* > &values, std::string filename, bool writeParallel, bool writeAs3dVector) { DOFVector<std::vector<double> > *newValues = new DOFVector<std::vector<double> >(values[0]->getFeSpace(), values[0]->getName()); std::vector<DOFIterator<double>* > iterators; for (size_t i = 0; i < values.size(); i++) iterators.push_back(new DOFIterator<double>(values[i],USED_DOFS)); for (size_t i = 0; i < iterators.size(); i++) iterators[i]->reset(); DOFIterator<std::vector<double> > resultIter(newValues, USED_DOFS); for(resultIter.reset(); !resultIter.end(); resultIter++) { std::vector<double> val(0); for (size_t i = 0; i < static_cast<size_t>(iterators.size()); i++) val.push_back(*(*(iterators[i]))); *resultIter = val; for (size_t i = 0; i < static_cast<size_t>(iterators.size()); i++) (*(iterators[i]))++; } writeFile(newValues, filename, writeParallel, writeAs3dVector); for (size_t i = 0; i < iterators.size(); i++) delete iterators[i]; delete newValues; } void VtkVectorWriter::writeFile(WorldVector<DOFVector<double>* > &values, std::string filename, bool writeParallel, bool writeAs3dVector) { DOFVector<WorldVector<double> > *newValues = new DOFVector<WorldVector<double> >(values[0]->getFeSpace(), values[0]->getName()); WorldVector<DOFIterator<double>* > iterators; for (size_t i = 0; i < static_cast<size_t>(values.getSize()); i++) iterators[i] = new DOFIterator<double>(values[i],USED_DOFS); for (size_t i = 0; i < static_cast<size_t>(iterators.getSize()); i++) iterators[i]->reset(); DOFIterator<WorldVector<double> > resultIter(newValues, USED_DOFS); for(resultIter.reset(); !resultIter.end(); resultIter++) { for (size_t i = 0; i < static_cast<size_t>(iterators.getSize()); i++) (*resultIter)[i] = *(*(iterators[i])); for (size_t i = 0; i < static_cast<size_t>(iterators.size()); i++) (*(iterators[i]))++; } writeFile(newValues, filename, writeParallel, writeAs3dVector); for (size_t i = 0; i < static_cast<size_t>(iterators.getSize()); i++) delete iterators[i]; delete newValues; } void VtkVectorWriter::writeFile(SystemVector *values, std::string filename, bool writeParallel, bool writeAs3dVector) { DOFVector<std::vector<double> > *newValues = new DOFVector<std::vector<double> >(values->getDOFVector(0)->getFeSpace(), values->getName()); std::vector<DOFIterator<double>* > iterators; for (size_t i = 0; i < static_cast<size_t>(values->getSize()); i++) iterators.push_back(new DOFIterator<double>(values->getDOFVector(i),USED_DOFS)); for (size_t i = 0; i < iterators.size(); i++) iterators[i]->reset(); DOFIterator<std::vector<double> > resultIter(newValues, USED_DOFS); for(resultIter.reset(); !resultIter.end(); resultIter++) { std::vector<double> val(0); for (size_t i = 0; i < static_cast<size_t>(iterators.size()); i++) val.push_back(*(*(iterators[i]))); *resultIter = val; for (size_t i = 0; i < static_cast<size_t>(iterators.size()); i++) (*(iterators[i]))++; } writeFile(newValues, filename, writeParallel, writeAs3dVector); for (size_t i = 0; i < iterators.size(); i++) delete iterators[i]; delete newValues; } }