From 3a964fc90f2fa153c3ca7395e949ab57f3fcb5a1 Mon Sep 17 00:00:00 2001
From: podlesny <podlesny@zedat.fu-berlin.de>
Date: Sun, 28 Feb 2021 21:04:25 +0100
Subject: [PATCH] new velocity bc for velocity step test

---
 dune/tectonic/problem-data/bc.hh | 34 ++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/dune/tectonic/problem-data/bc.hh b/dune/tectonic/problem-data/bc.hh
index 075f5749..76a233ec 100644
--- a/dune/tectonic/problem-data/bc.hh
+++ b/dune/tectonic/problem-data/bc.hh
@@ -1,6 +1,8 @@
 #ifndef SRC_ONE_BODY_PROBLEM_DATA_BC_HH
 #define SRC_ONE_BODY_PROBLEM_DATA_BC_HH
 
+#include <cassert>
+
 #include <dune/common/function.hh>
 
 class VelocityDirichletCondition
@@ -35,6 +37,38 @@ class VelocityDirichletCondition
   const double threshold_;
 };
 
+class VelocityStepDirichletCondition
+    : public Dune::VirtualFunction<double, double> {
+
+public:
+  VelocityStepDirichletCondition(const double initialVelocity = 5e-5, const double finalVelocity = 1e-4, const double loadingThreshold = 0.1, const double stepTime = 0.5) :
+      initialVelocity_(initialVelocity),
+      finalVelocity_(finalVelocity),
+      loadingThreshold_(loadingThreshold),
+      stepTime_(stepTime)
+  {
+      assert(loadingThreshold_ < stepTime_);
+  }
+
+  void evaluate(double const &relativeTime, double &y) const {
+    // Assumed to vanish at time zero
+
+    y = finalVelocity_;
+
+    if (relativeTime <= loadingThreshold_) {
+        y = initialVelocity_ * (1.0 - std::cos(relativeTime * M_PI / loadingThreshold_)) / 2.0;
+    } else if (relativeTime < stepTime_) {
+        y = initialVelocity_;
+    }
+  }
+
+private:
+  const double initialVelocity_;
+  const double finalVelocity_;
+  const double loadingThreshold_;
+  const double stepTime_;
+};
+
 class NeumannCondition : public Dune::VirtualFunction<double, double> {
   public:
     NeumannCondition(double c = 0.0) : c_(c) {}
-- 
GitLab