Skip to content
Snippets Groups Projects
FileWriter.cc 5.16 KiB
Newer Older
#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<double> *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<double>* > 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<int>(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", &paraViewFileExt);
    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<int>(dc.size()); i++) {
	dc[i] = NEW DataCollector(feSpace, solutionVecs_[i], 
				  level, flag, writeElem);
      }
    } else {
      for (int i = 0; i < static_cast<int>(dc.size()); i++) {
	dc[i] = NEW DataCollector(feSpace, solutionVecs_[i], 
				  traverseLevel, flag | traverseFlag, writeElement);
      }
    }


    if (writeTecPlotFormat) {
      TecPlotWriter<DOFVector<double> >::writeValues(solutionVecs_[0], 
						     const_cast<char*>((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<char*>( (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<char*>( (fn + paraViewFileExt).c_str()));
      MSG("ParaView file written to %s\n", (fn + paraViewFileExt).c_str());
    }

    for (int i = 0; i < static_cast<int>(dc.size()); i++) {
      DELETE dc[i];
    }
  }
}