From 17de75b073e1067f1dc9c10d527ad8a9aaa09948 Mon Sep 17 00:00:00 2001
From: Andrew Heather <>
Date: Fri, 14 Jun 2019 13:04:54 +0100
Subject: [PATCH] ENH: waveMaker boundary condition - provide time offset for
 patch motion

- also enables smooth restart for solitary waves
---
 .../waveMaker/waveMakerPointPatchVectorField.C | 18 ++++++++++++++----
 .../waveMaker/waveMakerPointPatchVectorField.H |  4 ++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.C b/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.C
index 4e2754221a7..f18f1e5353a 100644
--- a/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.C
+++ b/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.C
@@ -105,6 +105,7 @@ Foam::waveMakerPointPatchVectorField::waveMakerPointPatchVectorField
     waveHeight_(0),
     wavePhase_(0),
     waveLength_(0),
+    startTime_(0),
     rampTime_(1),
     secondOrder_(false)
 {}
@@ -126,6 +127,14 @@ Foam::waveMakerPointPatchVectorField::waveMakerPointPatchVectorField
     waveHeight_(dict.get<scalar>("waveHeight")),
     wavePhase_(dict.get<scalar>("wavePhase")),
     waveLength_(this->waveLength(initialDepth_, wavePeriod_)),
+    startTime_
+    (
+        dict.lookupOrDefault<scalar>
+        (
+            "startTime",
+            db().time().startTime().value()
+        )
+    ),
     rampTime_(dict.get<scalar>("rampTime")),
     secondOrder_(dict.lookupOrDefault<bool>("secondOrder", false))
 {
@@ -165,6 +174,7 @@ Foam::waveMakerPointPatchVectorField::waveMakerPointPatchVectorField
     waveHeight_(ptf.waveHeight_),
     wavePhase_(ptf.wavePhase_),
     waveLength_(ptf.waveLength_),
+    startTime_(ptf.startTime_),
     rampTime_(ptf.rampTime_),
     secondOrder_(ptf.secondOrder_)
 {}
@@ -185,6 +195,7 @@ Foam::waveMakerPointPatchVectorField::waveMakerPointPatchVectorField
     waveHeight_(ptf.waveHeight_),
     wavePhase_(ptf.wavePhase_),
     waveLength_(ptf.waveLength_),
+    startTime_(ptf.startTime_),
     rampTime_(ptf.rampTime_),
     secondOrder_(ptf.secondOrder_)
 {}
@@ -199,7 +210,7 @@ void Foam::waveMakerPointPatchVectorField::updateCoeffs()
         return;
     }
 
-    const scalar t = db().time().value();
+    const scalar t = db().time().value() - startTime_;
 
     const scalar waveK = constant::mathematical::twoPi/waveLength_;
     const scalar sigma = constant::mathematical::twoPi/wavePeriod_;
@@ -259,9 +270,7 @@ void Foam::waveMakerPointPatchVectorField::updateCoeffs()
             const scalar stroke = sqrt(16.0*waveHeight_*initialDepth_/3.0);
             const scalar hr = waveHeight_/initialDepth_;
             wavePeriod_ = (2.0/(kappa*waveCelerity))*(3.8 + hr);
-
-            const scalar tSolitary =
-                -0.5*wavePeriod_ + t - db().time().startTime().value();
+            const scalar tSolitary = -0.5*wavePeriod_ + t;
 
             // Newton-Rapshon
             scalar theta1 = 0;
@@ -308,6 +317,7 @@ void Foam::waveMakerPointPatchVectorField::write(Ostream& os) const
     os.writeEntry("wavePeriod", wavePeriod_);
     os.writeEntry("waveHeight", waveHeight_);
     os.writeEntry("wavePhase", wavePhase_);
+    os.writeEntry("startTime", startTime_);
     os.writeEntry("rampTime", rampTime_);
     os.writeEntry("secondOrder", secondOrder_);
     writeEntry("value", os);
diff --git a/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.H b/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.H
index ee2d82593e0..e6f0e1f0a40 100644
--- a/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.H
+++ b/src/waveModels/derivedPointPatchFields/waveMaker/waveMakerPointPatchVectorField.H
@@ -63,6 +63,7 @@ Usage
         wavePeriod   | wave period                  | yes      |
         waveHeight   | Wave height                  | yes      |
         wavePhase    | wave phase                   | yes      |
+        startTime    | Start time                   | no       | case start time
         rampTime     | Time to reach maximum motion | yes      |
         secondOrder  | Second order calculation     | no       | no
     \endtable
@@ -137,6 +138,9 @@ class waveMakerPointPatchVectorField
         //- Wave length
         scalar waveLength_;
 
+        //- Start time
+        scalar startTime_;
+
         //- Ramp time
         scalar rampTime_;
 
-- 
GitLab