diff --git a/src/matrices.hh b/src/matrices.hh new file mode 100644 index 0000000000000000000000000000000000000000..fc51d472d5b2a359d37ebccef9b45ecb6411e137 --- /dev/null +++ b/src/matrices.hh @@ -0,0 +1,9 @@ +#ifndef SRC_MATRICES_HH +#define SRC_MATRICES_HH + +template <class Matrix> struct Matrices { + Matrix elasticity; + Matrix damping; + Matrix mass; +}; +#endif diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc index 6c75bb1711730dc35cc82eacba0428b01bffd201..da973e581b769509697e3b9e6f3584a089522ae7 100644 --- a/src/sand-wedge.cc +++ b/src/sand-wedge.cc @@ -59,6 +59,7 @@ #include "enums.hh" #include "friction_writer.hh" #include "gridselector.hh" +#include "matrices.hh" #include "sand-wedge-data/mybody.hh" #include "sand-wedge-data/mygeometry.hh" #include "sand-wedge-data/myglobalfrictiondata.hh" @@ -188,12 +189,13 @@ int main(int argc, char *argv[]) { MyBody<dims> const body(parset); - Matrix A, C, M; + Matrices<Matrix> matrices; myAssembler.assembleElasticity(body.getYoungModulus(), - body.getPoissonRatio(), A); + body.getPoissonRatio(), matrices.elasticity); myAssembler.assembleViscosity(body.getShearViscosityField(), - body.getBulkViscosityField(), C); - myAssembler.assembleMass(body.getDensityField(), M); + body.getBulkViscosityField(), + matrices.damping); + myAssembler.assembleMass(body.getDensityField(), matrices.mass); ScalarMatrix frictionalBoundaryMass; myAssembler.assembleFrictionalBoundaryMass(frictionalBoundary, @@ -252,7 +254,7 @@ int main(int argc, char *argv[]) { // automatically attained in the case [v = 0 = a]. Assuming // dPhi(v = 0) = 0, we thus only have to solve Au = ell0 Vector u_initial(leafVertexCount); - solveLinearProblem(dirichletNodes, A, ell0, u_initial, + solveLinearProblem(dirichletNodes, matrices.elasticity, ell0, u_initial, parset.sub("u0.solver")); ScalarVector normalStress(leafVertexCount); @@ -271,8 +273,9 @@ int main(int argc, char *argv[]) { // constraints), again assuming dPhi(v = 0) = 0 Vector a_initial(leafVertexCount); Vector accelerationRHS = ell0; - Arithmetic::subtractProduct(accelerationRHS, A, u_initial); - solveLinearProblem(noNodes, M, accelerationRHS, a_initial, + Arithmetic::subtractProduct(accelerationRHS, matrices.elasticity, + u_initial); + solveLinearProblem(noNodes, matrices.mass, accelerationRHS, a_initial, parset.sub("a0.solver")); // }}} @@ -356,7 +359,7 @@ int main(int argc, char *argv[]) { parset.get<double>("boundary.friction.L"), parset.get<double>("boundary.friction.V0")), initTimeStepper(parset.get<Config::scheme>("timeSteps.scheme"), - velocityDirichletFunction, dirichletNodes, M, A, C, + velocityDirichletFunction, dirichletNodes, matrices, u_initial, v_initial, a_initial)); auto const refinementTolerance = diff --git a/src/timestepping.hh b/src/timestepping.hh index 524e76997c2ad92582e5c7dd370d751b5673079b..5547007512a3b1c7d14a9c810d5dd608f2cb10fc 100644 --- a/src/timestepping.hh +++ b/src/timestepping.hh @@ -6,6 +6,7 @@ #include <dune/common/bitsetvector.hh> #include "enums.hh" +#include "matrices.hh" template <class Vector, class Matrix, class Function, size_t dim> class TimeSteppingScheme { @@ -31,19 +32,18 @@ std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dimension>> initTimeStepper(Config::scheme scheme, Function const &velocityDirichletFunction, Dune::BitSetVector<dimension> const &velocityDirichletNodes, - Matrix const &massMatrix, Matrix const &stiffnessMatrix, - Matrix const &dampingMatrix, Vector const &u_initial, + Matrices<Matrix> const &matrices, Vector const &u_initial, Vector const &v_initial, Vector const &a_initial) { switch (scheme) { case Config::Newmark: return std::make_shared<Newmark<Vector, Matrix, Function, dimension>>( - stiffnessMatrix, massMatrix, dampingMatrix, u_initial, v_initial, - a_initial, velocityDirichletNodes, velocityDirichletFunction); + matrices, u_initial, v_initial, a_initial, velocityDirichletNodes, + velocityDirichletFunction); case Config::BackwardEuler: return std::make_shared< BackwardEuler<Vector, Matrix, Function, dimension>>( - stiffnessMatrix, massMatrix, dampingMatrix, u_initial, v_initial, - velocityDirichletNodes, velocityDirichletFunction); + matrices, u_initial, v_initial, velocityDirichletNodes, + velocityDirichletFunction); default: assert(false); } diff --git a/src/timestepping/backward_euler.cc b/src/timestepping/backward_euler.cc index 73ecfbd39faf530178a329f9c4557e05efa82e2d..f3e5158848ad2ad17e1578ad550f61c5b22b75fb 100644 --- a/src/timestepping/backward_euler.cc +++ b/src/timestepping/backward_euler.cc @@ -2,13 +2,10 @@ template <class Vector, class Matrix, class Function, size_t dim> BackwardEuler<Vector, Matrix, Function, dim>::BackwardEuler( - Matrix const &_A, Matrix const &_M, Matrix const &_C, - Vector const &_u_initial, Vector const &_v_initial, - Dune::BitSetVector<dim> const &_dirichletNodes, + Matrices<Matrix> const &_matrices, Vector const &_u_initial, + Vector const &_v_initial, Dune::BitSetVector<dim> const &_dirichletNodes, Function const &_dirichletFunction) - : A(_A), - M(_M), - C(_C), + : matrices(_matrices), u(_u_initial), v(_v_initial), dirichletNodes(_dirichletNodes), @@ -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) { - Dune::MatrixIndexSet indices(A.N(), A.M()); - indices.import(A); - indices.import(M); - indices.import(C); + Dune::MatrixIndexSet indices(matrices.elasticity.N(), + matrices.elasticity.M()); + indices.import(matrices.elasticity); + indices.import(matrices.mass); + indices.import(matrices.damping); indices.exportIdx(AM); } AM = 0.0; - Arithmetic::addProduct(AM, 1.0 / tau, M); - Arithmetic::addProduct(AM, 1.0, C); - Arithmetic::addProduct(AM, tau, A); + Arithmetic::addProduct(AM, 1.0 / tau, matrices.mass); + Arithmetic::addProduct(AM, 1.0, matrices.damping); + Arithmetic::addProduct(AM, tau, matrices.elasticity); // set up RHS { rhs = ell; - Arithmetic::addProduct(rhs, 1.0 / tau, M, v_o); - Arithmetic::subtractProduct(rhs, A, u_o); + Arithmetic::addProduct(rhs, 1.0 / tau, matrices.mass, v_o); + Arithmetic::subtractProduct(rhs, matrices.elasticity, u_o); } iterate = v_o; diff --git a/src/timestepping/backward_euler.hh b/src/timestepping/backward_euler.hh index 1e17547616bbda18d56e07ee4b3eda7ef1e7ba8a..db1a8402d279469663b48108cd571aadfd284eea 100644 --- a/src/timestepping/backward_euler.hh +++ b/src/timestepping/backward_euler.hh @@ -4,8 +4,8 @@ template <class Vector, class Matrix, class Function, size_t dim> class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> { public: - BackwardEuler(Matrix const &_A, Matrix const &_M, Matrix const &_C, - Vector const &_u_initial, Vector const &_v_initial, + BackwardEuler(Matrices<Matrix> const &_matrices, Vector const &_u_initial, + Vector const &_v_initial, Dune::BitSetVector<dim> const &_dirichletNodes, Function const &_dirichletFunction); @@ -21,9 +21,7 @@ class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> { const; private: - Matrix const &A; - Matrix const &M; - Matrix const &C; + Matrices<Matrix> const &matrices; Vector u; Vector v; Dune::BitSetVector<dim> const &dirichletNodes; diff --git a/src/timestepping/newmark.cc b/src/timestepping/newmark.cc index 867f808b90b3baa128b390d69992c15a58adde10..ee81b31005e4e66c9bfb568adfc8e7e4bc6d8f00 100644 --- a/src/timestepping/newmark.cc +++ b/src/timestepping/newmark.cc @@ -2,13 +2,11 @@ template <class Vector, class Matrix, class Function, size_t dim> Newmark<Vector, Matrix, Function, dim>::Newmark( - Matrix const &_A, Matrix const &_M, Matrix const &_C, - Vector const &_u_initial, Vector const &_v_initial, - Vector const &_a_initial, Dune::BitSetVector<dim> const &_dirichletNodes, + Matrices<Matrix> const &_matrices, Vector const &_u_initial, + Vector const &_v_initial, Vector const &_a_initial, + Dune::BitSetVector<dim> const &_dirichletNodes, Function const &_dirichletFunction) - : A(_A), - M(_M), - C(_C), + : matrices(_matrices), u(_u_initial), v(_v_initial), a(_a_initial), @@ -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) { - Dune::MatrixIndexSet indices(A.N(), A.M()); - indices.import(A); - indices.import(M); - indices.import(C); + Dune::MatrixIndexSet indices(matrices.elasticity.N(), + matrices.elasticity.M()); + indices.import(matrices.elasticity); + indices.import(matrices.mass); + indices.import(matrices.damping); indices.exportIdx(AM); } AM = 0.0; - Arithmetic::addProduct(AM, 2.0 / tau, M); - Arithmetic::addProduct(AM, 1.0, C); - Arithmetic::addProduct(AM, tau / 2.0, A); + Arithmetic::addProduct(AM, 2.0 / tau, matrices.mass); + Arithmetic::addProduct(AM, 1.0, matrices.damping); + Arithmetic::addProduct(AM, tau / 2.0, matrices.elasticity); // set up RHS { rhs = ell; - Arithmetic::addProduct(rhs, 2.0 / tau, M, v_o); - Arithmetic::addProduct(rhs, M, a_o); - Arithmetic::subtractProduct(rhs, tau / 2.0, A, v_o); - Arithmetic::subtractProduct(rhs, A, u_o); + Arithmetic::addProduct(rhs, 2.0 / tau, matrices.mass, v_o); + Arithmetic::addProduct(rhs, matrices.mass, a_o); + Arithmetic::subtractProduct(rhs, tau / 2.0, matrices.elasticity, v_o); + Arithmetic::subtractProduct(rhs, matrices.elasticity, u_o); } iterate = v_o; diff --git a/src/timestepping/newmark.hh b/src/timestepping/newmark.hh index 2ed4a1b4ffadc7416648196496f9f175fe8d244c..72ae85433a0f7bdbd4539317ece85e6e8d87fb73 100644 --- a/src/timestepping/newmark.hh +++ b/src/timestepping/newmark.hh @@ -4,9 +4,8 @@ template <class Vector, class Matrix, class Function, size_t dim> class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> { public: - Newmark(Matrix const &_A, Matrix const &_M, Matrix const &_C, - Vector const &_u_initial, Vector const &_v_initial, - Vector const &_a_initial, + Newmark(Matrices<Matrix> const &_matrices, Vector const &_u_initial, + Vector const &_v_initial, Vector const &_a_initial, Dune::BitSetVector<dim> const &_dirichletNodes, Function const &_dirichletFunction); @@ -22,9 +21,7 @@ class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> { const; private: - Matrix const &A; - Matrix const &M; - Matrix const &C; + Matrices<Matrix> const &matrices; Vector u; Vector v; Vector a;