diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index 1c31f16fe75a4180e9e980675848930b3a8de71f..4b56ab139f35aa23555ec3c9ddfcc39165025aeb 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -320,6 +320,10 @@ int main(int argc, char *argv[]) { FrictionWriter<Dune::BitSetVector<1>> writer(frictionData, frictionalNodes); writer.writeInfo(alpha_initial, u_initial, v_initial); + MyVTKWriter<typename MyAssembler::VertexBasis, + typename MyAssembler::CellBasis> + vtkWriter(myAssembler.cellBasis, myAssembler.vertexBasis, "obs"); + // Set up TNNMG solver using NonlinearFactory = SolverFactory<dims, MyBlockProblem<ConvexProblem< @@ -458,11 +462,10 @@ int main(int argc, char *argv[]) { relaxationWriter << std::endl; if (parset.get<bool>("io.writeVTK")) { - ScalarVector vonMisesStress; + ScalarVector stress; myAssembler.assembleVonMisesStress(youngModulus, poissonRatio, u, - vonMisesStress); - writeVtk(myAssembler.vertexBasis, u, alpha, myAssembler.cellBasis, - vonMisesStress, (boost::format("obs%d") % run).str()); + stress); + vtkWriter.write(u, v, alpha, stress); } } iterationWriter.close(); diff --git a/src/vtk.cc b/src/vtk.cc index 7383dfc092124fdc825238e031af06b8dfab4e12..f1a1e6dfaf227ca55d614c6238a4e86e576d52ee 100644 --- a/src/vtk.cc +++ b/src/vtk.cc @@ -8,28 +8,45 @@ #include "vtk.hh" -template <class VertexBasis, class CellBasis, class Vector, class ScalarVector> -void writeVtk(VertexBasis const &vertexBasis, Vector const &displacement, - ScalarVector const &logState, CellBasis const &cellBasis, - ScalarVector const &stress, std::string const &filename) { +template <class VertexBasis, class CellBasis> +MyVTKWriter<VertexBasis, CellBasis>::MyVTKWriter( + CellBasis const &_cellBasis, VertexBasis const &_vertexBasis, + std::string _prefix) + : cellBasis(_cellBasis), + vertexBasis(_vertexBasis), + prefix(_prefix), + counter(0) {} + +template <class VertexBasis, class CellBasis> +template <class Vector, class ScalarVector> +void MyVTKWriter<VertexBasis, CellBasis>::write(Vector const &u, + Vector const &v, + ScalarVector const &alpha, + ScalarVector const &stress) { Dune::VTKWriter<typename VertexBasis::GridView> writer( vertexBasis.getGridView()); auto const displacementPointer = std::make_shared<VTKBasisGridFunction<VertexBasis, Vector> const>( - vertexBasis, displacement, "displacement"); + vertexBasis, u, "displacement"); writer.addVertexData(displacementPointer); + auto const velocityPointer = + std::make_shared<VTKBasisGridFunction<VertexBasis, Vector> const>( + vertexBasis, v, "velocity"); + writer.addVertexData(velocityPointer); + auto const logStatePointer = std::make_shared<VTKBasisGridFunction<VertexBasis, ScalarVector> const>( - vertexBasis, logState, "logState"); + vertexBasis, alpha, "logState"); writer.addVertexData(logStatePointer); - auto const vonmisesPointer = + auto const stressPointer = std::make_shared<VTKBasisGridFunction<CellBasis, ScalarVector> const>( cellBasis, stress, "stress"); - writer.addCellData(vonmisesPointer); + writer.addCellData(stressPointer); + std::string const filename = prefix + std::to_string(counter++); writer.write(filename.c_str()); } diff --git a/src/vtk.hh b/src/vtk.hh index 5b06cd0aa691acfc6d60488228307f667e393e32..e1e19c05e4cd7bc27825b3a65f1c51379043ade8 100644 --- a/src/vtk.hh +++ b/src/vtk.hh @@ -1,9 +1,20 @@ #ifndef VTK_HH #define VTK_HH -template <class VertexBasis, class CellBasis, class Vector, class ScalarVector> -void writeVtk(VertexBasis const &vertexBasis, Vector const &displacement, - ScalarVector const &logState, CellBasis const &cellBasis, - ScalarVector const &stress, std::string const &filename); +template <class VertexBasis, class CellBasis> class MyVTKWriter { + CellBasis const &cellBasis; + VertexBasis const &vertexBasis; + std::string const prefix; + + size_t counter; + +public: + MyVTKWriter(CellBasis const &cellBasis, VertexBasis const &vertexBasis, + std::string prefix); + + template <class Vector, class ScalarVector> + void write(Vector const &u, Vector const &v, ScalarVector const &alpha, + ScalarVector const &stress); +}; #endif diff --git a/src/vtk_tmpl.cc b/src/vtk_tmpl.cc index bad777b6f2b6bf1027defaaddac8ce5b3ce14bef..027d42f977807e2259f689f9164814802bceed6a 100644 --- a/src/vtk_tmpl.cc +++ b/src/vtk_tmpl.cc @@ -8,10 +8,11 @@ #include <dune/fufem/functionspacebases/p0basis.hh> #include <dune/fufem/functionspacebases/p1nodalbasis.hh> -using P1Basis = P1NodalBasis<GridView, double>; using MyP0Basis = P0Basis<GridView, double>; +using P1Basis = P1NodalBasis<GridView, double>; + +template class MyVTKWriter<P1Basis, MyP0Basis>; -template void writeVtk<P1Basis, MyP0Basis, Vector, ScalarVector>( - P1Basis const &vertexBasis, Vector const &displacement, - ScalarVector const &logState, MyP0Basis const &cellBasis, - ScalarVector const &stress, std::string const &filename); +template void MyVTKWriter<P1Basis, MyP0Basis>::write<Vector, ScalarVector>( + Vector const &u, Vector const &v, ScalarVector const &alpha, + ScalarVector const &stress);