diff --git a/dune/tectonic/time-stepping/state.cc b/dune/tectonic/time-stepping/state.cc index 4184f3d765a8b014225ad146af0ca30683a7026e..44c745e4580ddb01b0d59a18878731ea53aed588 100644 --- a/dune/tectonic/time-stepping/state.cc +++ b/dune/tectonic/time-stepping/state.cc @@ -16,7 +16,12 @@ auto initStateUpdater( assert(contactCouplings.size() == couplings.size()); - auto stateUpdater = std::make_shared<StateUpdater<ScalarVector, Vector>>(); + std::vector<size_t> leafVertexCounts(alpha_initial.size(), 0); + for (size_t i=0; i<leafVertexCounts.size(); i++) { + leafVertexCounts[i] = alpha_initial[i].size(); + } + + auto stateUpdater = std::make_shared<StateUpdater<ScalarVector, Vector>>(leafVertexCounts); switch (model) { case Config::AgeingLaw: diff --git a/dune/tectonic/time-stepping/state/ageinglawstateupdater.cc b/dune/tectonic/time-stepping/state/ageinglawstateupdater.cc index 3d1feef2ffa7a44091b1ca7ec6fef3a6b93102f2..9766b1600eb18c96f326228586c6c3726fa467bf 100644 --- a/dune/tectonic/time-stepping/state/ageinglawstateupdater.cc +++ b/dune/tectonic/time-stepping/state/ageinglawstateupdater.cc @@ -57,7 +57,7 @@ void AgeingLawStateUpdater<ScalarVector, Vector>::solve(const Vector& velocity_f for (size_t i=0; i<alpha_.size(); ++i) { auto tangentVelocity = velocity_field[localToGlobal_[i]]; - tangentVelocity[0] = 0; + tangentVelocity[0] = 0.0; double const V = tangentVelocity.two_norm(); double const mtoL = -tau_ / L_; diff --git a/dune/tectonic/time-stepping/state/sliplawstateupdater.cc b/dune/tectonic/time-stepping/state/sliplawstateupdater.cc index a024744c7572ca4fa7486d622702e7cfb6e88a63..6aeba1042c5035cea5b7f33b821813053c33a9ff 100644 --- a/dune/tectonic/time-stepping/state/sliplawstateupdater.cc +++ b/dune/tectonic/time-stepping/state/sliplawstateupdater.cc @@ -43,7 +43,7 @@ void SlipLawStateUpdater<ScalarVector, Vector>::solve( for (size_t i=0; i<alpha_.size(); ++i) { auto tangentVelocity = velocity_field[localToGlobal_[i]]; - tangentVelocity[0] = 0; + tangentVelocity[0] = 0.0; double const V = tangentVelocity.two_norm(); double const mtVoL = -tau_ * V / L_; diff --git a/dune/tectonic/time-stepping/state/stateupdater.hh b/dune/tectonic/time-stepping/state/stateupdater.hh index 016e08c03042b887d9887ab5c97af53796ced090..5e347b78bfcd84181edcd7c1aaaf4d028bd11758 100644 --- a/dune/tectonic/time-stepping/state/stateupdater.hh +++ b/dune/tectonic/time-stepping/state/stateupdater.hh @@ -34,6 +34,9 @@ template <class ScalarVectorTEMPLATE, class Vector> class StateUpdater { using ScalarVector = ScalarVectorTEMPLATE; using LocalStateUpdater = LocalStateUpdater<ScalarVector, Vector>; + StateUpdater(const std::vector<size_t>& leafVertexCounts) : + leafVertexCounts_(leafVertexCounts) {} + void addLocalUpdater(std::shared_ptr<LocalStateUpdater> localStateUpdater) { localStateUpdaters_.emplace_back(localStateUpdater); } @@ -58,6 +61,11 @@ template <class ScalarVectorTEMPLATE, class Vector> class StateUpdater { } void extractAlpha(std::vector<ScalarVector>& alpha) { + alpha.resize(leafVertexCounts_.size()); + for (size_t i=0; i<alpha.size(); i++) { + alpha[i].resize(leafVertexCounts_[i], 0.0); + } + for (size_t i=0; i<localStateUpdaters_.size(); i++) { auto& localStateUpdater = localStateUpdaters_[i]; localStateUpdater->extractAlpha(alpha[localStateUpdater->bodyIndex()]); @@ -65,7 +73,7 @@ template <class ScalarVectorTEMPLATE, class Vector> class StateUpdater { } std::shared_ptr<StateUpdater<ScalarVector, Vector>> virtual clone() const { - auto updater = std::make_shared<StateUpdater<ScalarVector, Vector>>(); + auto updater = std::make_shared<StateUpdater<ScalarVector, Vector>>(leafVertexCounts_); for (size_t i=0; i<localStateUpdaters_.size(); i++) { auto localUpdater = localStateUpdaters_[i]->clone(); @@ -75,6 +83,7 @@ template <class ScalarVectorTEMPLATE, class Vector> class StateUpdater { } private: + std::vector<size_t> leafVertexCounts_; std::vector<std::shared_ptr<LocalStateUpdater>> localStateUpdaters_; }; #endif