Skip to content
Snippets Groups Projects
VtkVectorWriter.cc 5.33 KiB
Newer Older
//
// 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;
  }
  
}