From 6de7438e234813c78ad632441b2d688eb67f6f1f Mon Sep 17 00:00:00 2001
From: podlesny <podlesny@zedat.fu-berlin.de>
Date: Fri, 26 Feb 2021 15:21:37 +0100
Subject: [PATCH] return alpha in correct dimensions, previously alpha[i] for
 bodies without friction patch was empty

---
 dune/tectonic/time-stepping/state.cc                  |  7 ++++++-
 .../time-stepping/state/ageinglawstateupdater.cc      |  2 +-
 .../time-stepping/state/sliplawstateupdater.cc        |  2 +-
 dune/tectonic/time-stepping/state/stateupdater.hh     | 11 ++++++++++-
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/dune/tectonic/time-stepping/state.cc b/dune/tectonic/time-stepping/state.cc
index 4184f3d7..44c745e4 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 3d1feef2..9766b160 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 a024744c..6aeba104 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 016e08c0..5e347b78 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
-- 
GitLab