From 642c7456d82ec25d721d74345b867250b2c7a52a Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Thu, 9 Jan 2014 18:13:24 +0100 Subject: [PATCH] [Cleanup] Move body info to a separate class --- dune/tectonic/body.hh | 22 ++++++++++++++++++++++ src/mybody.hh | 42 ++++++++++++++++++++++++++++++++++++++++++ src/one-body-sample.cc | 28 +++++++++++++--------------- 3 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 dune/tectonic/body.hh create mode 100644 src/mybody.hh diff --git a/dune/tectonic/body.hh b/dune/tectonic/body.hh new file mode 100644 index 00000000..cadcbc52 --- /dev/null +++ b/dune/tectonic/body.hh @@ -0,0 +1,22 @@ +#ifndef BODY_HH +#define BODY_HH + +template <int dimension> struct Body { + using ScalarFunction = Dune::VirtualFunction< + Dune::FieldVector<double, dimension>, Dune::FieldVector<double, 1>>; + using VectorField = + Dune::VirtualFunction<Dune::FieldVector<double, dimension>, + Dune::FieldVector<double, dimension>>; + + double virtual getPoissonRatio() const = 0; + + double virtual getYoungModulus() const = 0; + + double virtual getShearViscosity() const = 0; + double virtual getBulkViscosity() const = 0; + + double virtual getDensity() const = 0; + double virtual getGravity() const = 0; +}; + +#endif diff --git a/src/mybody.hh b/src/mybody.hh new file mode 100644 index 00000000..47d3d26c --- /dev/null +++ b/src/mybody.hh @@ -0,0 +1,42 @@ +#ifndef MY_BODY_HH +#define MY_BODY_HH + +#include <dune/common/fvector.hh> + +#include <dune/tectonic/body.hh> + +#include "mygeometry.hh" + +template <int dimension> class MyBody : public Body<dimension> { + using typename Body<dimension>::ScalarFunction; + using typename Body<dimension>::VectorField; + +public: + MyBody(Dune::ParameterTree const &parset, MyGeometry const &mygeometry) + : poissonRatio_(parset.get<double>("body.poissonRatio")), + youngModulus_(parset.get<double>("body.youngModulus")), + shearViscosity_(parset.get<double>("body.shearViscosity")), + bulkViscosity_(parset.get<double>("body.bulkViscosity")), + density_(parset.get<double>("body.density")), + gravity_(parset.get<double>("gravity")) {} + + double getPoissonRatio() const override { return poissonRatio_; } + + double getYoungModulus() const override { return youngModulus_; } + + double getShearViscosity() const override { return shearViscosity_; } + double getBulkViscosity() const override { return bulkViscosity_; } + + double getDensity() const override { return density_; } + double getGravity() const override { return gravity_; } + +private: + double const poissonRatio_; + double const youngModulus_; + double const shearViscosity_; + double const bulkViscosity_; + double const density_; + double const gravity_; +}; + +#endif diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index 2f21840c..dada2ec5 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -72,6 +72,7 @@ #include "enum_verbosity.cc" #include "enums.hh" #include "friction_writer.hh" +#include "mybody.hh" #include "mygeometry.hh" #include "mygrid.hh" #include "solverfactory.hh" @@ -97,13 +98,6 @@ int main(int argc, char *argv[]) { MyGeometry const myGeometry; - auto const youngModulus = parset.get<double>("body.youngModulus"); - auto const poissonRatio = parset.get<double>("body.poissonRatio"); - auto const shearViscosity = parset.get<double>("body.shearViscosity"); - auto const bulkViscosity = parset.get<double>("body.bulkViscosity"); - auto const density = parset.get<double>("body.density"); - auto const gravity = parset.get<double>("gravity"); - // {{{ Set up grid using Grid = Dune::ALUGrid<dims, dims, Dune::simplex, Dune::nonconforming>; auto grid = constructGrid<Grid>(myGeometry); // FIXME @@ -162,10 +156,14 @@ int main(int argc, char *argv[]) { MyAssembler myAssembler(leafView); + MyBody<dims> const body(parset, myGeometry); + Matrix A, C, M; - myAssembler.assembleElasticity(youngModulus, poissonRatio, A); - myAssembler.assembleViscosity(shearViscosity, bulkViscosity, C); - myAssembler.assembleMass(density, M); + myAssembler.assembleElasticity(body.getYoungModulus(), + body.getPoissonRatio(), A); + myAssembler.assembleViscosity(body.getShearViscosity(), + body.getBulkViscosity(), C); + myAssembler.assembleMass(body.getDensity(), M); EnergyNorm<Matrix, Vector> const ANorm(A), MNorm(M); // Q: Does it make sense to weigh them in this manner? SumNorm<Vector> const AMNorm(1.0, ANorm, 1.0, MNorm); @@ -178,8 +176,8 @@ int main(int argc, char *argv[]) { // Assemble forces Vector gravityFunctional; - myAssembler.assembleBodyForce(gravity, density, myGeometry.zenith, - gravityFunctional); + myAssembler.assembleBodyForce(body.getGravity(), body.getDensity(), + myGeometry.zenith, gravityFunctional); // Problem formulation: right-hand side auto const computeExternalForces = [&](double _relativeTime, Vector &_ell) { @@ -204,7 +202,7 @@ int main(int argc, char *argv[]) { // volume * gravity * density / area = normal stress // V * g * rho / A = sigma_n // m^d * N/kg * kg/m^d / m^(d-1) = N/m^(d-1) - normalStress = -volume * gravity * density / area; + normalStress = -volume * body.getGravity() * body.getDensity() / area; } FrictionData const frictionData(parset.sub("boundary.friction"), normalStress); @@ -438,8 +436,8 @@ int main(int argc, char *argv[]) { if (parset.get<bool>("io.writeVTK")) { ScalarVector stress; - myAssembler.assembleVonMisesStress(youngModulus, poissonRatio, u, - stress); + myAssembler.assembleVonMisesStress(body.getYoungModulus(), + body.getPoissonRatio(), u, stress); vtkWriter.write(u, v, alpha, stress); } } -- GitLab