diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index d78ffe8abfdcab1c65ddca69a9e1028faa42ae2a..05f1e3fb607ead1c5d190e384f185c9221846c1c 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -47,12 +47,14 @@ #include <dune/istl/bvector.hh> #include <dune/fufem/assemblers/functionalassembler.hh> +#include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh> #include <dune/fufem/assemblers/localassemblers/massassembler.hh> #include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh> #include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh> #include <dune/fufem/assemblers/operatorassembler.hh> #include <dune/fufem/dunepython.hh> #include <dune/fufem/functions/basisgridfunction.hh> +#include <dune/fufem/functions/constantfunction.hh> #include <dune/fufem/functionspacebases/p0basis.hh> #include <dune/fufem/functionspacebases/p1nodalbasis.hh> #include <dune/fufem/sharedpointermap.hh> @@ -167,6 +169,7 @@ int main(int argc, char *argv[]) { P1Basis const p1Basis(leafView); MatrixType massMatrix; + VectorType gravityFunctional; { timer.reset(); @@ -199,6 +202,16 @@ int main(int argc, char *argv[]) { if (parset.get<bool>("enable_timer")) std::cout << "Assembled mass matrix in " << timer.elapsed() << "s" << std::endl; + + // Compute gravitational body force + SmallVector weightedGravitationalDirection(0); + weightedGravitationalDirection[1] = -density * gravity; + ConstantFunction<SmallVector, SmallVector> const gravityFunction( + weightedGravitationalDirection); + L2FunctionalAssembler<GridType, SmallVector> gravityFunctionalAssembler( + gravityFunction); + FunctionalAssembler<P1Basis>(p1Basis) + .assemble(gravityFunctionalAssembler, gravityFunctional, true); } // Assemble elastic force on the body @@ -296,6 +309,7 @@ int main(int argc, char *argv[]) { VectorType ell(finestSize); assemble_neumann<GridType, GridView, SmallVector, P1Basis>( leafView, p1Basis, neumannNodes, ell, neumannFunction, time); + ell += gravityFunctional; MatrixType problem_A; VectorType problem_rhs(finestSize);