diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index f86324d949e82998523b9182e48c0829164652c3..f329c688d175c47a18680ce70b6412a11425f6d3 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -22,12 +22,16 @@ #include <dune/grid/common/mcmgmapper.hh> #include <dune/fufem/assemblers/boundaryfunctionalassembler.hh> +#include <dune/fufem/assemblers/functionalassembler.hh> #include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh> #include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh> +#include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh> #include <dune/fufem/assemblers/operatorassembler.hh> #include <dune/fufem/boundarypatch.hh> +#include <dune/fufem/functions/basisgridfunction.hh> #include <dune/fufem/functions/constantfunction.hh> #include <dune/fufem/functionspacebases/p1nodalbasis.hh> +#include <dune/fufem/functionspacebases/p0basis.hh> #include <dune/grid/io/file/vtk/vtkwriter.hh> #include <dune/tnnmg/iterationsteps/genericnonlineargs.hh> @@ -158,8 +162,10 @@ int main() { GridView const leafView = grid.leafView(); // }}} - // Set up nodal basis + // Set up bases + typedef P0Basis<GridType::LeafGridView, double> P0Basis; typedef P1NodalBasis<GridType::LeafGridView, double> P1Basis; + P0Basis const p0Basis(leafView); P1Basis const p1Basis(leafView); // Assemble elastic force on the body @@ -231,13 +237,27 @@ int main() { solver.solve(); } + typedef Dune::BlockVector<Dune::FieldVector<double, 1>> CellVectorType; + + CellVectorType vonMisesStress(grid.size(grid.maxLevel(), dim - 1)); + auto *displacement = + new BasisGridFunction<P1Basis, VectorType>(p1Basis, u1); + VonMisesStressAssembler<GridType> localStressAssembler(E, nu, + displacement); + FunctionalAssembler<P0Basis>(p0Basis) + .assemble(localStressAssembler, vonMisesStress, true); + { Dune::VTKWriter<GridType::LeafGridView> writer(leafView); std::string filename((boost::format("obs%d") % run).str()); - Dune::shared_ptr<Dune::VTKBasisGridFunction<P1Basis, VectorType>> ptr( - new Dune::VTKBasisGridFunction<P1Basis, VectorType>( - p1Basis, u1, "displacement")); - writer.addVertexData(ptr); + Dune::shared_ptr<Dune::VTKBasisGridFunction<P1Basis, VectorType>> + displacement_ptr(new Dune::VTKBasisGridFunction<P1Basis, VectorType>( + p1Basis, u1, "displacement")); + Dune::shared_ptr<Dune::VTKBasisGridFunction<P0Basis, CellVectorType>> + vonmises_ptr(new Dune::VTKBasisGridFunction<P0Basis, CellVectorType>( + p0Basis, vonMisesStress, "stress")); + writer.addVertexData(displacement_ptr); + writer.addCellData(vonmises_ptr); writer.write(filename.c_str()); }