From e693c6fa32eea6ab38229db4c2368552e3ce1bea Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Sat, 31 May 2014 02:00:55 +0200 Subject: [PATCH] [Cleanup] Allow for variable viscosity --- dune/tectonic/body.hh | 4 ++-- src/assemblers.cc | 20 ++++++++++++++------ src/assemblers.hh | 8 ++++++-- src/mybody.hh | 16 ++++++++++------ src/one-body-sample.cc | 4 ++-- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/dune/tectonic/body.hh b/dune/tectonic/body.hh index 3365eac4..cee4dbf1 100644 --- a/dune/tectonic/body.hh +++ b/dune/tectonic/body.hh @@ -12,8 +12,8 @@ template <int dimension> struct Body { double virtual getYoungModulus() const = 0; - double virtual getShearViscosity() const = 0; - double virtual getBulkViscosity() const = 0; + ScalarFunction virtual const &getShearViscosityField() const = 0; + ScalarFunction virtual const &getBulkViscosityField() const = 0; ScalarFunction virtual const &getDensityField() const = 0; VectorField virtual const &getGravityField() const = 0; diff --git a/src/assemblers.cc b/src/assemblers.cc index d78bb999..6b2a7471 100644 --- a/src/assemblers.cc +++ b/src/assemblers.cc @@ -8,13 +8,14 @@ #include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh> #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/variablecoefficientviscosityassembler.hh> #include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh> #include <dune/fufem/assemblers/localassemblers/weightedmassassembler.hh> #include <dune/fufem/boundarypatch.hh> #include <dune/fufem/computestress.hh> #include <dune/fufem/functions/basisgridfunction.hh> #include <dune/fufem/functions/constantfunction.hh> +#include <dune/fufem/quadraturerules/quadraturerulecache.hh> #include "assemblers.hh" @@ -61,11 +62,18 @@ void MyAssembler<GridView, dimension>::assembleElasticity(double E, double nu, } template <class GridView, int dimension> -void MyAssembler<GridView, dimension>::assembleViscosity(double shearViscosity, - double bulkViscosity, - Matrix &C) { - ViscosityAssembler<Grid, LocalVertexBasis, LocalVertexBasis> const - localViscosity(shearViscosity, bulkViscosity); +void MyAssembler<GridView, dimension>::assembleViscosity( + Dune::VirtualFunction<LocalVector, LocalScalarVector> const &shearViscosity, + Dune::VirtualFunction<LocalVector, LocalScalarVector> const &bulkViscosity, + Matrix &C) { + // NOTE: We treat the weights as constant functions + QuadratureRuleKey shearViscosityKey(dimension, 0); + QuadratureRuleKey bulkViscosityKey(dimension, 0); + VariableCoefficientViscosityAssembler< + Grid, LocalVertexBasis, LocalVertexBasis, + Dune::VirtualFunction<LocalVector, LocalScalarVector>> const + localViscosity(gridView.grid(), shearViscosity, bulkViscosity, + shearViscosityKey, bulkViscosityKey); vertexAssembler.assembleOperator(localViscosity, C); } diff --git a/src/assemblers.hh b/src/assemblers.hh index c90235cc..1705b7a5 100644 --- a/src/assemblers.hh +++ b/src/assemblers.hh @@ -55,8 +55,12 @@ template <class GridView, int dimension> class MyAssembler { void assembleElasticity(double E, double nu, Matrix &A); - void assembleViscosity(double shearViscosity, double bulkViscosity, - Matrix &C); + void assembleViscosity( + Dune::VirtualFunction<LocalVector, LocalScalarVector> const & + shearViscosity, + Dune::VirtualFunction<LocalVector, LocalScalarVector> const & + bulkViscosity, + Matrix &C); void assembleBodyForce( Dune::VirtualFunction<LocalVector, LocalVector> const &gravityField, diff --git a/src/mybody.hh b/src/mybody.hh index 3b33c93f..185b53d3 100644 --- a/src/mybody.hh +++ b/src/mybody.hh @@ -20,8 +20,8 @@ template <int dimension> class MyBody : public Body<dimension> { 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")), + shearViscosityField_(parset.get<double>("body.shearViscosity")), + bulkViscosityField_(parset.get<double>("body.bulkViscosity")), densityField_(parset.get<double>("body.density")), gravityField_(densityField_, mygeometry.zenith, parset.get<double>("gravity")) {} @@ -30,8 +30,12 @@ template <int dimension> class MyBody : public Body<dimension> { double getYoungModulus() const override { return youngModulus_; } - double getShearViscosity() const override { return shearViscosity_; } - double getBulkViscosity() const override { return bulkViscosity_; } + ScalarFunction const &getShearViscosityField() const override { + return shearViscosityField_; + } + ScalarFunction const &getBulkViscosityField() const override { + return bulkViscosityField_; + } ScalarFunction const &getDensityField() const override { return densityField_; @@ -41,8 +45,8 @@ template <int dimension> class MyBody : public Body<dimension> { private: double const poissonRatio_; double const youngModulus_; - double const shearViscosity_; - double const bulkViscosity_; + MyConstantFunction const shearViscosityField_; + MyConstantFunction const bulkViscosityField_; MyConstantFunction const densityField_; Gravity<dimension> const gravityField_; }; diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index 8d193432..ea51fa26 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -163,8 +163,8 @@ int main(int argc, char *argv[]) { Matrix A, C, M; myAssembler.assembleElasticity(body.getYoungModulus(), body.getPoissonRatio(), A); - myAssembler.assembleViscosity(body.getShearViscosity(), - body.getBulkViscosity(), C); + myAssembler.assembleViscosity(body.getShearViscosityField(), + body.getBulkViscosityField(), C); myAssembler.assembleMass(body.getDensityField(), M); EnergyNorm<Matrix, Vector> const ANorm(A), MNorm(M); // Q: Does it make sense to weigh them in this manner? -- GitLab