From 54cf9ff6a772d9adbeee15fbcec3cc12bf4f8193 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Wed, 7 Dec 2011 22:34:20 +0100 Subject: [PATCH] Use make_shared; use blockvectors --- dune/tectonic/globallaursennonlinearity.hh | 18 +++--- dune/tectonic/globalruinanonlinearity.hh | 24 ++++---- src/one-body-sample.cc | 64 ++++++++++------------ 3 files changed, 49 insertions(+), 57 deletions(-) diff --git a/dune/tectonic/globallaursennonlinearity.hh b/dune/tectonic/globallaursennonlinearity.hh index b478fe7c..559edcb6 100644 --- a/dune/tectonic/globallaursennonlinearity.hh +++ b/dune/tectonic/globallaursennonlinearity.hh @@ -19,9 +19,9 @@ template <int dim, class OuterFunctionType> class GlobalLaursenNonlinearity : public GlobalNonlinearity<dim> { public: GlobalLaursenNonlinearity( - shared_ptr<std::vector<double> const> mu, - shared_ptr<std::vector<double> const> normalStress, - shared_ptr<std::vector<FieldVector<double, 1>> const> nodalIntegrals) + shared_ptr<BlockVector<FieldVector<double, 1>> const> mu, + shared_ptr<BlockVector<FieldVector<double, 1>> const> normalStress, + shared_ptr<BlockVector<FieldVector<double, 1>> const> nodalIntegrals) : mu(mu), normalStress(normalStress), nodalIntegrals(nodalIntegrals) {} /* @@ -43,18 +43,16 @@ class GlobalLaursenNonlinearity : public GlobalNonlinearity<dim> { coefficient *= (*normalStress)[i]; coefficient *= 1 + (*mu)[i]; - shared_ptr<NiceFunction const> const func( - new OuterFunctionType(coefficient)); - return shared_ptr<LocalNonlinearity<dim> const>( - new LocalNonlinearity<dim>(func)); + return make_shared<LocalNonlinearity<dim> const>( + make_shared<OuterFunctionType const>(coefficient)); } private: // TODO: If we're clever, we only store one vector with the precomputed // results - shared_ptr<std::vector<double> const> mu; - shared_ptr<std::vector<double> const> normalStress; - shared_ptr<std::vector<FieldVector<double, 1>> const> nodalIntegrals; + shared_ptr<BlockVector<FieldVector<double, 1>> const> mu; + shared_ptr<BlockVector<FieldVector<double, 1>> const> normalStress; + shared_ptr<BlockVector<FieldVector<double, 1>> const> nodalIntegrals; }; } #endif diff --git a/dune/tectonic/globalruinanonlinearity.hh b/dune/tectonic/globalruinanonlinearity.hh index 16161918..e7ca98f7 100644 --- a/dune/tectonic/globalruinanonlinearity.hh +++ b/dune/tectonic/globalruinanonlinearity.hh @@ -19,11 +19,11 @@ template <int dim> class GlobalRuinaNonlinearity : public GlobalNonlinearity<dim> { public: GlobalRuinaNonlinearity( - shared_ptr<std::vector<FieldVector<double, 1>> const> nodalIntegrals, - shared_ptr<std::vector<double> const> a, - shared_ptr<std::vector<double> const> mu, - shared_ptr<std::vector<double> const> eta, - shared_ptr<std::vector<double> const> normalStress) + shared_ptr<BlockVector<FieldVector<double, 1>> const> nodalIntegrals, + shared_ptr<BlockVector<FieldVector<double, 1>> const> a, + shared_ptr<BlockVector<FieldVector<double, 1>> const> mu, + shared_ptr<BlockVector<FieldVector<double, 1>> const> eta, + shared_ptr<BlockVector<FieldVector<double, 1>> const> normalStress) : nodalIntegrals(nodalIntegrals), a(a), mu(mu), @@ -40,19 +40,19 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<dim> { return trivialNonlinearity; shared_ptr<NiceFunction const> const func( - new RuinaFunction((*nodalIntegrals)[i][0], (*a)[i], (*mu)[i], (*eta)[i], - (*normalStress)[i])); + new RuinaFunction((*nodalIntegrals)[i][0], (*a)[i][0], (*mu)[i][0], + (*eta)[i][0], (*normalStress)[i][0])); return shared_ptr<LocalNonlinearity<dim>>(new LocalNonlinearity<dim>(func)); } private: shared_ptr<LocalNonlinearity<dim> const> const trivialNonlinearity; - shared_ptr<std::vector<FieldVector<double, 1>> const> nodalIntegrals; - shared_ptr<std::vector<double> const> a; - shared_ptr<std::vector<double> const> mu; - shared_ptr<std::vector<double> const> eta; - shared_ptr<std::vector<double> const> normalStress; + shared_ptr<BlockVector<FieldVector<double, 1>> const> nodalIntegrals; + shared_ptr<BlockVector<FieldVector<double, 1>> const> a; + shared_ptr<BlockVector<FieldVector<double, 1>> const> mu; + shared_ptr<BlockVector<FieldVector<double, 1>> const> eta; + shared_ptr<BlockVector<FieldVector<double, 1>> const> normalStress; }; } #endif diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index 4a35e6d4..e58210d0 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -121,7 +121,7 @@ template <class GridType, class GridView, class LocalVectorType, class FEBasis> void assemble_frictional( GridView const &gridView, FEBasis const &feBasis, Dune::BitSetVector<1> const &frictionalNodes, - std::vector<Dune::FieldVector<double, 1>> &nodalIntegrals) { + Dune::BlockVector<Dune::FieldVector<double, 1>> &nodalIntegrals) { BoundaryPatch<GridView> frictionalBoundary(gridView, frictionalNodes); ConstantFunction<LocalVectorType, Dune::FieldVector<double, 1>> constantOneFunction(1); @@ -138,42 +138,36 @@ void assemble_frictional( void assemble_nonlinearity( int size, Dune::ParameterTree const &parset, Dune::shared_ptr<Dune::GlobalNonlinearity<dim> const> &myGlobalNonlinearity, - Dune::shared_ptr<std::vector<Dune::FieldVector<double, 1>>> + Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>> nodalIntegrals) { // {{{ Assemble terms for the nonlinearity - auto mu = Dune::shared_ptr<std::vector<double>>(new std::vector<double>()); - mu->resize(size); - std::fill(mu->begin(), mu->end(), parset.get<double>("boundary.friction.mu")); + auto mu = + Dune::make_shared<Dune::BlockVector<Dune::FieldVector<double, 1>>>(size); + *mu = parset.get<double>("boundary.friction.mu"); auto normalStress = - Dune::shared_ptr<std::vector<double>>(new std::vector<double>()); - normalStress->resize(size); - std::fill(normalStress->begin(), normalStress->end(), - parset.get<double>("boundary.friction.normalstress")); + Dune::make_shared<Dune::BlockVector<Dune::FieldVector<double, 1>>>(size); + *normalStress = parset.get<double>("boundary.friction.normalstress"); std::string const friction_model = parset.get<std::string>("boundary.friction.model"); if (friction_model == std::string("Ruina")) { - auto a = Dune::shared_ptr<std::vector<double>>(new std::vector<double>()); - a->resize(size); - std::fill(a->begin(), a->end(), - parset.get<double>("boundary.friction.ruina.a")); - - auto eta = Dune::shared_ptr<std::vector<double>>(new std::vector<double>()); - eta->resize(size); - std::fill(eta->begin(), eta->end(), - parset.get<double>("boundary.friction.eta")); - - auto const tmp = new Dune::GlobalRuinaNonlinearity<dim>( - nodalIntegrals, a, mu, eta, normalStress); + auto a = Dune::make_shared<Dune::BlockVector<Dune::FieldVector<double, 1>>>( + size); + *a = parset.get<double>("boundary.friction.ruina.a"); + + auto eta = + Dune::make_shared<Dune::BlockVector<Dune::FieldVector<double, 1>>>( + size); + *eta = parset.get<double>("boundary.friction.eta"); + myGlobalNonlinearity = - Dune::shared_ptr<Dune::GlobalNonlinearity<dim> const>(tmp); + Dune::make_shared<Dune::GlobalRuinaNonlinearity<dim> const>( + nodalIntegrals, a, mu, eta, normalStress); } else if (friction_model == std::string("Laursen")) { - auto const tmp = - new Dune::GlobalLaursenNonlinearity<dim, Dune::LinearFunction>( - mu, normalStress, nodalIntegrals); - myGlobalNonlinearity = - Dune::shared_ptr<Dune::GlobalNonlinearity<dim> const>(tmp); + myGlobalNonlinearity = Dune::make_shared< + Dune::GlobalLaursenNonlinearity<dim, Dune::LinearFunction> const>( + mu, normalStress, nodalIntegrals); } else { assert(false); } @@ -263,8 +257,7 @@ int main(int argc, char *argv[]) { VectorType b3; auto nodalIntegrals = - Dune::shared_ptr<std::vector<Dune::FieldVector<double, 1>>>( - new std::vector<Dune::FieldVector<double, 1>>); + Dune::make_shared<Dune::BlockVector<Dune::FieldVector<double, 1>>>(); assemble_frictional<GridType, GridView, SmallVector, P1Basis>( leafView, p1Basis, frictionalNodes, *nodalIntegrals); @@ -310,12 +303,13 @@ int main(int argc, char *argv[]) { Dune::VTKWriter<GridView> writer(leafView); std::string filename((boost::format("obs%d") % run).str()); - Dune::shared_ptr<VTKBasisGridFunction<P1Basis, VectorType>> - displacement_ptr(new VTKBasisGridFunction<P1Basis, VectorType>( - p1Basis, u1, "displacement")); - Dune::shared_ptr<VTKBasisGridFunction<P0Basis, CellVectorType>> - vonmises_ptr(new VTKBasisGridFunction<P0Basis, CellVectorType>( - p0Basis, vonMisesStress, "stress")); + + auto displacement_ptr = + Dune::make_shared<VTKBasisGridFunction<P1Basis, VectorType>>( + p1Basis, u1, "displacement"); + auto vonmises_ptr = + Dune::make_shared<VTKBasisGridFunction<P0Basis, CellVectorType>>( + p0Basis, vonMisesStress, "stress"); writer.addVertexData(displacement_ptr); writer.addCellData(vonmises_ptr); writer.write(filename.c_str()); -- GitLab