diff --git a/src/assemblers.cc b/src/assemblers.cc index 280b24f4f6ee854a4ce4073b1c75d5fe6cc8fe96..6b66fa445f9f83aa1cb0b44f058b0a6c153e7887 100644 --- a/src/assemblers.cc +++ b/src/assemblers.cc @@ -5,6 +5,7 @@ #include <dune/istl/scaledidmatrix.hh> #include <dune/fufem/boundarypatch.hh> +#include <dune/fufem/functions/basisgridfunction.hh> #include <dune/fufem/functions/constantfunction.hh> #include <dune/fufem/assemblers/localassemblers/boundarymassassembler.hh> #include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh> @@ -12,6 +13,7 @@ #include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh> #include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh> #include <dune/fufem/assemblers/localassemblers/viscosityassembler.hh> +#include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh> #include <dune/tectonic/globalruinanonlinearity.hh> @@ -19,8 +21,10 @@ template <class GridView, int dimension> MyAssembler<GridView, dimension>::MyAssembler(GridView const &_gridView) - : vertexBasis(_gridView), + : cellBasis(_gridView), + vertexBasis(_gridView), gridView(_gridView), + cellAssembler(cellBasis, cellBasis), vertexAssembler(vertexBasis, vertexBasis) {} template <class GridView, int dimension> @@ -111,4 +115,16 @@ auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity( frictionalNodes, weights, fd); } +template <class GridView, int dimension> +void MyAssembler<GridView, dimension>::assembleVonMisesStress( + double youngModulus, double poissonRatio, Vector const &u, + ScalarVector &stress) { + auto const gridDisplacement = + std::make_shared<BasisGridFunction<VertexBasis, Vector> const>( + vertexBasis, u); + VonMisesStressAssembler<Grid, LocalCellBasis> localStressAssembler( + youngModulus, poissonRatio, gridDisplacement); + cellAssembler.assembleFunctional(localStressAssembler, stress); +} + #include "assemblers_tmpl.cc" diff --git a/src/assemblers.hh b/src/assemblers.hh index 36f1d357359ad1ae04ff75a83122ec27c3ed758f..aa5ad3e395172362ab3fcb002aff57da03e4c5bb 100644 --- a/src/assemblers.hh +++ b/src/assemblers.hh @@ -7,6 +7,10 @@ #include <dune/istl/bvector.hh> #include <dune/fufem/assemblers/assembler.hh> +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wsign-compare" +#include <dune/fufem/functionspacebases/p0basis.hh> +#pragma clang diagnostic pop #include <dune/fufem/functionspacebases/p1nodalbasis.hh> #include <dune/tectonic/globalnonlinearity.hh> @@ -19,15 +23,21 @@ template <class GridView, int dimension> class MyAssembler { using ScalarVector = Dune::BlockVector<Dune::FieldVector<double, 1>>; using Vector = Dune::BlockVector<Dune::FieldVector<double, dimension>>; + using CellBasis = P0Basis<GridView, double>; using VertexBasis = P1NodalBasis<GridView, double>; + + CellBasis cellBasis; VertexBasis vertexBasis; private: using Grid = typename GridView::Grid; using LocalVector = typename Vector::block_type; + + using LocalCellBasis = typename CellBasis::LocalFiniteElement; using LocalVertexBasis = typename VertexBasis::LocalFiniteElement; GridView const &gridView; + Assembler<CellBasis, CellBasis> cellAssembler; Assembler<VertexBasis, VertexBasis> vertexAssembler; public: @@ -56,6 +66,9 @@ template <class GridView, int dimension> class MyAssembler { assembleFrictionNonlinearity( BoundaryPatch<GridView> const &frictionalBoundary, FrictionData const &fd); + + void assembleVonMisesStress(double youngModulus, double poissonRatio, + Vector const &u, ScalarVector &stress); }; #endif diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index 657e4a4b5d6415ee90303f7e52a8a7c639a8e116..1c31f16fe75a4180e9e980675848930b3a8de71f 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -49,17 +49,10 @@ #include <dune/istl/bcrsmatrix.hh> #include <dune/istl/bvector.hh> -#include <dune/fufem/assemblers/assembler.hh> -#include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh> #include <dune/fufem/boundarypatch.hh> #include <dune/fufem/dunepython.hh> #include <dune/fufem/functions/basisgridfunction.hh> -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wsign-compare" -#include <dune/fufem/functionspacebases/p0basis.hh> -#pragma clang diagnostic pop - #include <dune/fufem/functionspacebases/p1nodalbasis.hh> #include <dune/fufem/sharedpointermap.hh> #include <dune/solvers/norms/energynorm.hh> @@ -145,11 +138,6 @@ int main(int argc, char *argv[]) { GridView const leafView = grid->leafView(); // }}} - // Set up bases - using P0Basis = P0Basis<GridView, double>; - P0Basis const p0Basis(leafView); - Assembler<P0Basis, P0Basis> const p0Assembler(p0Basis, p0Basis); - // Set up the boundary Dune::BitSetVector<dims> velocityDirichletNodes(fineVertexCount, false); Dune::BitSetVector<dims> const &displacementDirichletNodes = @@ -470,16 +458,11 @@ int main(int argc, char *argv[]) { relaxationWriter << std::endl; if (parset.get<bool>("io.writeVTK")) { - auto const gridDisplacement = std::make_shared< - BasisGridFunction<typename MyAssembler::VertexBasis, Vector> const>( - myAssembler.vertexBasis, u); ScalarVector vonMisesStress; - VonMisesStressAssembler<Grid, P0Basis::LocalFiniteElement> - localStressAssembler(youngModulus, poissonRatio, gridDisplacement); - p0Assembler.assembleFunctional(localStressAssembler, vonMisesStress); - - writeVtk(myAssembler.vertexBasis, u, alpha, p0Basis, vonMisesStress, - (boost::format("obs%d") % run).str()); + myAssembler.assembleVonMisesStress(youngModulus, poissonRatio, u, + vonMisesStress); + writeVtk(myAssembler.vertexBasis, u, alpha, myAssembler.cellBasis, + vonMisesStress, (boost::format("obs%d") % run).str()); } } iterationWriter.close();