diff --git a/dune/tectonic/globallaursennonlinearity.hh b/dune/tectonic/globallaursennonlinearity.hh index 6397cdbc6e48fa9ea1124e4a64f3f2acd7320d21..97e6808cb53d344616967cb40ee99ee93a817c46 100644 --- a/dune/tectonic/globallaursennonlinearity.hh +++ b/dune/tectonic/globallaursennonlinearity.hh @@ -17,7 +17,8 @@ template <int dim, class OuterFunctionType> class GlobalLaursenNonlinearity : public GlobalNonlinearity<dim> { public: GlobalLaursenNonlinearity( - std::vector<double> const &mu, std::vector<double> const &normalStress, + shared_ptr<std::vector<double> const> mu, + shared_ptr<std::vector<double> const> normalStress, std::vector<FieldVector<double, 1>> const &nodalIntegrals) : mu(mu), normalStress(normalStress), nodalIntegrals(nodalIntegrals) {} @@ -37,8 +38,8 @@ class GlobalLaursenNonlinearity : public GlobalNonlinearity<dim> { */ virtual shared_ptr<LocalNonlinearity<dim> const> restriction(int i) const { double coefficient = nodalIntegrals[i][0]; - coefficient *= normalStress[i]; - coefficient *= 1 + mu[i]; + coefficient *= (*normalStress)[i]; + coefficient *= 1 + (*mu)[i]; shared_ptr<NiceFunction const> const func( new OuterFunctionType(coefficient)); @@ -49,8 +50,8 @@ class GlobalLaursenNonlinearity : public GlobalNonlinearity<dim> { private: // TODO: If we're clever, we only store one vector with the precomputed // results - std::vector<double> mu; - std::vector<double> normalStress; + shared_ptr<std::vector<double> const> mu; + shared_ptr<std::vector<double> const> normalStress; std::vector<FieldVector<double, 1>> nodalIntegrals; }; } diff --git a/dune/tectonic/globalruinanonlinearity.hh b/dune/tectonic/globalruinanonlinearity.hh index 30ea691aea763dd0d1a39976aa94043b09eb3393..253ecde109752fb7173765f024a5295b0e8973ea 100644 --- a/dune/tectonic/globalruinanonlinearity.hh +++ b/dune/tectonic/globalruinanonlinearity.hh @@ -17,8 +17,10 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<dim> { public: GlobalRuinaNonlinearity( std::vector<FieldVector<double, 1>> const &nodalIntegrals, - std::vector<double> const &a, std::vector<double> const &mu, - std::vector<double> const &eta, std::vector<double> const &normalStress) + 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) : nodalIntegrals(nodalIntegrals), a(a), mu(mu), @@ -34,8 +36,9 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<dim> { if (nodalIntegrals[i][0] == 0) return trivialNonlinearity; - shared_ptr<NiceFunction const> const func(new RuinaFunction( - nodalIntegrals[i][0], a[i], mu[i], eta[i], normalStress[i])); + shared_ptr<NiceFunction const> const func( + new RuinaFunction(nodalIntegrals[i][0], (*a)[i], (*mu)[i], (*eta)[i], + (*normalStress)[i])); return shared_ptr<LocalNonlinearity<dim>>(new LocalNonlinearity<dim>(func)); } @@ -43,10 +46,10 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<dim> { shared_ptr<LocalNonlinearity<dim> const> const trivialNonlinearity; std::vector<FieldVector<double, 1>> nodalIntegrals; - std::vector<double> a; - std::vector<double> mu; - std::vector<double> eta; - std::vector<double> normalStress; + 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; }; } #endif diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index 9920be72f4fa3655887a4d3e9d60e6ccad70c8ae..2c3592c175f727a51b5904367b2c5a39c0133898 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -140,26 +140,27 @@ void assemble_nonlinearity( Dune::shared_ptr<Dune::GlobalNonlinearity<dim> const> &myGlobalNonlinearity, std::vector<Dune::FieldVector<double, 1>> &nodalIntegrals) { // {{{ Assemble terms for the nonlinearity - std::vector<double> mu; - mu.resize(size); - std::fill(mu.begin(), mu.end(), parset.get<double>("boundary.friction.mu")); - - std::vector<double> normalStress; - normalStress.resize(size); - std::fill(normalStress.begin(), normalStress.end(), + 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 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")); std::string const friction_model = parset.get<std::string>("boundary.friction.model"); if (friction_model == std::string("Ruina")) { - std::vector<double> a; - a.resize(size); - std::fill(a.begin(), a.end(), + 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")); - std::vector<double> eta; - eta.resize(size); - std::fill(eta.begin(), eta.end(), + 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>(