Skip to content
Snippets Groups Projects
Commit 1d080d61 authored by Elias Pipping's avatar Elias Pipping
Browse files

[Cleanup] Introduce Matrices class

parent 90c97994
No related branches found
No related tags found
No related merge requests found
#ifndef SRC_MATRICES_HH
#define SRC_MATRICES_HH
template <class Matrix> struct Matrices {
Matrix elasticity;
Matrix damping;
Matrix mass;
};
#endif
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#include "enums.hh" #include "enums.hh"
#include "friction_writer.hh" #include "friction_writer.hh"
#include "gridselector.hh" #include "gridselector.hh"
#include "matrices.hh"
#include "sand-wedge-data/mybody.hh" #include "sand-wedge-data/mybody.hh"
#include "sand-wedge-data/mygeometry.hh" #include "sand-wedge-data/mygeometry.hh"
#include "sand-wedge-data/myglobalfrictiondata.hh" #include "sand-wedge-data/myglobalfrictiondata.hh"
...@@ -188,12 +189,13 @@ int main(int argc, char *argv[]) { ...@@ -188,12 +189,13 @@ int main(int argc, char *argv[]) {
MyBody<dims> const body(parset); MyBody<dims> const body(parset);
Matrix A, C, M; Matrices<Matrix> matrices;
myAssembler.assembleElasticity(body.getYoungModulus(), myAssembler.assembleElasticity(body.getYoungModulus(),
body.getPoissonRatio(), A); body.getPoissonRatio(), matrices.elasticity);
myAssembler.assembleViscosity(body.getShearViscosityField(), myAssembler.assembleViscosity(body.getShearViscosityField(),
body.getBulkViscosityField(), C); body.getBulkViscosityField(),
myAssembler.assembleMass(body.getDensityField(), M); matrices.damping);
myAssembler.assembleMass(body.getDensityField(), matrices.mass);
ScalarMatrix frictionalBoundaryMass; ScalarMatrix frictionalBoundaryMass;
myAssembler.assembleFrictionalBoundaryMass(frictionalBoundary, myAssembler.assembleFrictionalBoundaryMass(frictionalBoundary,
...@@ -252,7 +254,7 @@ int main(int argc, char *argv[]) { ...@@ -252,7 +254,7 @@ int main(int argc, char *argv[]) {
// automatically attained in the case [v = 0 = a]. Assuming // automatically attained in the case [v = 0 = a]. Assuming
// dPhi(v = 0) = 0, we thus only have to solve Au = ell0 // dPhi(v = 0) = 0, we thus only have to solve Au = ell0
Vector u_initial(leafVertexCount); Vector u_initial(leafVertexCount);
solveLinearProblem(dirichletNodes, A, ell0, u_initial, solveLinearProblem(dirichletNodes, matrices.elasticity, ell0, u_initial,
parset.sub("u0.solver")); parset.sub("u0.solver"));
ScalarVector normalStress(leafVertexCount); ScalarVector normalStress(leafVertexCount);
...@@ -271,8 +273,9 @@ int main(int argc, char *argv[]) { ...@@ -271,8 +273,9 @@ int main(int argc, char *argv[]) {
// constraints), again assuming dPhi(v = 0) = 0 // constraints), again assuming dPhi(v = 0) = 0
Vector a_initial(leafVertexCount); Vector a_initial(leafVertexCount);
Vector accelerationRHS = ell0; Vector accelerationRHS = ell0;
Arithmetic::subtractProduct(accelerationRHS, A, u_initial); Arithmetic::subtractProduct(accelerationRHS, matrices.elasticity,
solveLinearProblem(noNodes, M, accelerationRHS, a_initial, u_initial);
solveLinearProblem(noNodes, matrices.mass, accelerationRHS, a_initial,
parset.sub("a0.solver")); parset.sub("a0.solver"));
// }}} // }}}
...@@ -356,7 +359,7 @@ int main(int argc, char *argv[]) { ...@@ -356,7 +359,7 @@ int main(int argc, char *argv[]) {
parset.get<double>("boundary.friction.L"), parset.get<double>("boundary.friction.L"),
parset.get<double>("boundary.friction.V0")), parset.get<double>("boundary.friction.V0")),
initTimeStepper(parset.get<Config::scheme>("timeSteps.scheme"), initTimeStepper(parset.get<Config::scheme>("timeSteps.scheme"),
velocityDirichletFunction, dirichletNodes, M, A, C, velocityDirichletFunction, dirichletNodes, matrices,
u_initial, v_initial, a_initial)); u_initial, v_initial, a_initial));
auto const refinementTolerance = auto const refinementTolerance =
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <dune/common/bitsetvector.hh> #include <dune/common/bitsetvector.hh>
#include "enums.hh" #include "enums.hh"
#include "matrices.hh"
template <class Vector, class Matrix, class Function, size_t dim> template <class Vector, class Matrix, class Function, size_t dim>
class TimeSteppingScheme { class TimeSteppingScheme {
...@@ -31,19 +32,18 @@ std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dimension>> ...@@ -31,19 +32,18 @@ std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dimension>>
initTimeStepper(Config::scheme scheme, initTimeStepper(Config::scheme scheme,
Function const &velocityDirichletFunction, Function const &velocityDirichletFunction,
Dune::BitSetVector<dimension> const &velocityDirichletNodes, Dune::BitSetVector<dimension> const &velocityDirichletNodes,
Matrix const &massMatrix, Matrix const &stiffnessMatrix, Matrices<Matrix> const &matrices, Vector const &u_initial,
Matrix const &dampingMatrix, Vector const &u_initial,
Vector const &v_initial, Vector const &a_initial) { Vector const &v_initial, Vector const &a_initial) {
switch (scheme) { switch (scheme) {
case Config::Newmark: case Config::Newmark:
return std::make_shared<Newmark<Vector, Matrix, Function, dimension>>( return std::make_shared<Newmark<Vector, Matrix, Function, dimension>>(
stiffnessMatrix, massMatrix, dampingMatrix, u_initial, v_initial, matrices, u_initial, v_initial, a_initial, velocityDirichletNodes,
a_initial, velocityDirichletNodes, velocityDirichletFunction); velocityDirichletFunction);
case Config::BackwardEuler: case Config::BackwardEuler:
return std::make_shared< return std::make_shared<
BackwardEuler<Vector, Matrix, Function, dimension>>( BackwardEuler<Vector, Matrix, Function, dimension>>(
stiffnessMatrix, massMatrix, dampingMatrix, u_initial, v_initial, matrices, u_initial, v_initial, velocityDirichletNodes,
velocityDirichletNodes, velocityDirichletFunction); velocityDirichletFunction);
default: default:
assert(false); assert(false);
} }
......
...@@ -2,13 +2,10 @@ ...@@ -2,13 +2,10 @@
template <class Vector, class Matrix, class Function, size_t dim> template <class Vector, class Matrix, class Function, size_t dim>
BackwardEuler<Vector, Matrix, Function, dim>::BackwardEuler( BackwardEuler<Vector, Matrix, Function, dim>::BackwardEuler(
Matrix const &_A, Matrix const &_M, Matrix const &_C, Matrices<Matrix> const &_matrices, Vector const &_u_initial,
Vector const &_u_initial, Vector const &_v_initial, Vector const &_v_initial, Dune::BitSetVector<dim> const &_dirichletNodes,
Dune::BitSetVector<dim> const &_dirichletNodes,
Function const &_dirichletFunction) Function const &_dirichletFunction)
: A(_A), : matrices(_matrices),
M(_M),
C(_C),
u(_u_initial), u(_u_initial),
v(_v_initial), v(_v_initial),
dirichletNodes(_dirichletNodes), dirichletNodes(_dirichletNodes),
...@@ -51,22 +48,23 @@ void BackwardEuler<Vector, Matrix, Function, dim>::setup( ...@@ -51,22 +48,23 @@ void BackwardEuler<Vector, Matrix, Function, dim>::setup(
// set up LHS (for fixed tau, we'd only really have to do this once) // set up LHS (for fixed tau, we'd only really have to do this once)
{ {
Dune::MatrixIndexSet indices(A.N(), A.M()); Dune::MatrixIndexSet indices(matrices.elasticity.N(),
indices.import(A); matrices.elasticity.M());
indices.import(M); indices.import(matrices.elasticity);
indices.import(C); indices.import(matrices.mass);
indices.import(matrices.damping);
indices.exportIdx(AM); indices.exportIdx(AM);
} }
AM = 0.0; AM = 0.0;
Arithmetic::addProduct(AM, 1.0 / tau, M); Arithmetic::addProduct(AM, 1.0 / tau, matrices.mass);
Arithmetic::addProduct(AM, 1.0, C); Arithmetic::addProduct(AM, 1.0, matrices.damping);
Arithmetic::addProduct(AM, tau, A); Arithmetic::addProduct(AM, tau, matrices.elasticity);
// set up RHS // set up RHS
{ {
rhs = ell; rhs = ell;
Arithmetic::addProduct(rhs, 1.0 / tau, M, v_o); Arithmetic::addProduct(rhs, 1.0 / tau, matrices.mass, v_o);
Arithmetic::subtractProduct(rhs, A, u_o); Arithmetic::subtractProduct(rhs, matrices.elasticity, u_o);
} }
iterate = v_o; iterate = v_o;
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
template <class Vector, class Matrix, class Function, size_t dim> template <class Vector, class Matrix, class Function, size_t dim>
class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> { class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> {
public: public:
BackwardEuler(Matrix const &_A, Matrix const &_M, Matrix const &_C, BackwardEuler(Matrices<Matrix> const &_matrices, Vector const &_u_initial,
Vector const &_u_initial, Vector const &_v_initial, Vector const &_v_initial,
Dune::BitSetVector<dim> const &_dirichletNodes, Dune::BitSetVector<dim> const &_dirichletNodes,
Function const &_dirichletFunction); Function const &_dirichletFunction);
...@@ -21,9 +21,7 @@ class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> { ...@@ -21,9 +21,7 @@ class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> {
const; const;
private: private:
Matrix const &A; Matrices<Matrix> const &matrices;
Matrix const &M;
Matrix const &C;
Vector u; Vector u;
Vector v; Vector v;
Dune::BitSetVector<dim> const &dirichletNodes; Dune::BitSetVector<dim> const &dirichletNodes;
......
...@@ -2,13 +2,11 @@ ...@@ -2,13 +2,11 @@
template <class Vector, class Matrix, class Function, size_t dim> template <class Vector, class Matrix, class Function, size_t dim>
Newmark<Vector, Matrix, Function, dim>::Newmark( Newmark<Vector, Matrix, Function, dim>::Newmark(
Matrix const &_A, Matrix const &_M, Matrix const &_C, Matrices<Matrix> const &_matrices, Vector const &_u_initial,
Vector const &_u_initial, Vector const &_v_initial, Vector const &_v_initial, Vector const &_a_initial,
Vector const &_a_initial, Dune::BitSetVector<dim> const &_dirichletNodes, Dune::BitSetVector<dim> const &_dirichletNodes,
Function const &_dirichletFunction) Function const &_dirichletFunction)
: A(_A), : matrices(_matrices),
M(_M),
C(_C),
u(_u_initial), u(_u_initial),
v(_v_initial), v(_v_initial),
a(_a_initial), a(_a_initial),
...@@ -56,24 +54,25 @@ void Newmark<Vector, Matrix, Function, dim>::setup(Vector const &ell, ...@@ -56,24 +54,25 @@ void Newmark<Vector, Matrix, Function, dim>::setup(Vector const &ell,
// set up LHS (for fixed tau, we'd only really have to do this once) // set up LHS (for fixed tau, we'd only really have to do this once)
{ {
Dune::MatrixIndexSet indices(A.N(), A.M()); Dune::MatrixIndexSet indices(matrices.elasticity.N(),
indices.import(A); matrices.elasticity.M());
indices.import(M); indices.import(matrices.elasticity);
indices.import(C); indices.import(matrices.mass);
indices.import(matrices.damping);
indices.exportIdx(AM); indices.exportIdx(AM);
} }
AM = 0.0; AM = 0.0;
Arithmetic::addProduct(AM, 2.0 / tau, M); Arithmetic::addProduct(AM, 2.0 / tau, matrices.mass);
Arithmetic::addProduct(AM, 1.0, C); Arithmetic::addProduct(AM, 1.0, matrices.damping);
Arithmetic::addProduct(AM, tau / 2.0, A); Arithmetic::addProduct(AM, tau / 2.0, matrices.elasticity);
// set up RHS // set up RHS
{ {
rhs = ell; rhs = ell;
Arithmetic::addProduct(rhs, 2.0 / tau, M, v_o); Arithmetic::addProduct(rhs, 2.0 / tau, matrices.mass, v_o);
Arithmetic::addProduct(rhs, M, a_o); Arithmetic::addProduct(rhs, matrices.mass, a_o);
Arithmetic::subtractProduct(rhs, tau / 2.0, A, v_o); Arithmetic::subtractProduct(rhs, tau / 2.0, matrices.elasticity, v_o);
Arithmetic::subtractProduct(rhs, A, u_o); Arithmetic::subtractProduct(rhs, matrices.elasticity, u_o);
} }
iterate = v_o; iterate = v_o;
......
...@@ -4,9 +4,8 @@ ...@@ -4,9 +4,8 @@
template <class Vector, class Matrix, class Function, size_t dim> template <class Vector, class Matrix, class Function, size_t dim>
class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> { class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> {
public: public:
Newmark(Matrix const &_A, Matrix const &_M, Matrix const &_C, Newmark(Matrices<Matrix> const &_matrices, Vector const &_u_initial,
Vector const &_u_initial, Vector const &_v_initial, Vector const &_v_initial, Vector const &_a_initial,
Vector const &_a_initial,
Dune::BitSetVector<dim> const &_dirichletNodes, Dune::BitSetVector<dim> const &_dirichletNodes,
Function const &_dirichletFunction); Function const &_dirichletFunction);
...@@ -22,9 +21,7 @@ class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> { ...@@ -22,9 +21,7 @@ class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> {
const; const;
private: private:
Matrix const &A; Matrices<Matrix> const &matrices;
Matrix const &M;
Matrix const &C;
Vector u; Vector u;
Vector v; Vector v;
Vector a; Vector a;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment