diff --git a/dune/tectonic/problem-data/bc.hh b/dune/tectonic/problem-data/bc.hh index 075f5749956a0fcf42c1b014a19875a6538c9e86..76a233ecf0fb25dd0149c7d8cdcb49682a5abb4c 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) {}