45 { motionTypes::piston,
"piston" },
46 { motionTypes::flap,
"flap" },
47 { motionTypes::solitary,
"solitary" }
60 <<
"Gravity vector is not set. Please update "
61 << gf.uniformDimensionedVectorField::path()
78 for (label i=1; i<=100; ++i)
92 return max(0,
min(t/rampTime_, 1));
105 const scalar yMin = bb.
min().
y();
106 const scalar yMax = bb.
max().
y();
107 zSpan_ = bb.
max().
z() - bb.
min().
z();
109 zMinGb_ = bb.
min().
z();
113 xPaddle_.setSize(nPaddle_, 0);
114 yPaddle_.setSize(nPaddle_, 0);
116 const scalar paddleDy = (yMax - yMin)/scalar(nPaddle_);
118 for (label paddlei = 0; paddlei < nPaddle_; ++paddlei)
120 xPaddle_[paddlei] = xMid;
121 yPaddle_[paddlei] = paddlei*paddleDy + yMin + 0.5*paddleDy;
125 x_ = this->patch().localPoints().component(0);
126 y_ = this->patch().localPoints().component(1);
127 z_ = this->patch().localPoints().component(2);
130 pointToPaddle_.setSize(this->patch().size(), -1);
132 forAll(pointToPaddle_, ppi)
134 pointToPaddle_[ppi] = floor((y_[ppi] - yMin)/(paddleDy+0.01*paddleDy));
170 motionType_(motionTypeNames.get(
"motionType",
dict)),
173 initialDepth_(
dict.get<scalar>(
"initialDepth")),
174 wavePeriod_(
dict.get<scalar>(
"wavePeriod")),
175 waveHeight_(
dict.get<scalar>(
"waveHeight")),
176 wavePhase_(
dict.get<scalar>(
"wavePhase")),
177 waveAngle_(
dict.getOrDefault<scalar>(
"waveAngle", 0)),
180 dict.getOrDefault<scalar>
186 rampTime_(
dict.get<scalar>(
"rampTime")),
187 secondOrder_(
dict.getOrDefault<
bool>(
"secondOrder", false)),
188 nPaddle_(
dict.getOrDefault<label>(
"nPaddle", 1))
194 <<
"Patch normal direction vector is not set. 'n' = " <<
n_
203 <<
"Patch normal and gravity directions must not be aligned. "
204 <<
"'n' = " <<
n_ <<
" 'g' = " <<
g()
231 motionType_(ptf.motionType_),
234 initialDepth_(ptf.initialDepth_),
235 wavePeriod_(ptf.wavePeriod_),
236 waveHeight_(ptf.waveHeight_),
237 wavePhase_(ptf.wavePhase_),
238 waveAngle_(ptf.waveAngle_),
239 startTime_(ptf.startTime_),
240 rampTime_(ptf.rampTime_),
241 secondOrder_(ptf.secondOrder_),
242 nPaddle_(ptf.nPaddle_)
253 motionType_(ptf.motionType_),
256 initialDepth_(ptf.initialDepth_),
257 wavePeriod_(ptf.wavePeriod_),
258 waveHeight_(ptf.waveHeight_),
259 wavePhase_(ptf.wavePhase_),
260 waveAngle_(ptf.waveAngle_),
261 startTime_(ptf.startTime_),
262 rampTime_(ptf.rampTime_),
263 secondOrder_(ptf.secondOrder_),
264 nPaddle_(ptf.nPaddle_)
280 if (initialDepth_ != 0 )
282 forAll(waterDepthRef_, paddlei)
284 waterDepthRef_[paddlei] = initialDepth_;
290 <<
"initialDepth is not set. Please update "
295 Info<<
" WaterDepth at the wavepaddles = " << waterDepthRef_ <<
endl;
299 const scalar t = db().time().value() - startTime_;
309 waveLength_[padddlei] =
310 waveLength(waterDepthRef_[padddlei], wavePeriod_);
313 waveKx[padddlei] = waveK[padddlei]*
cos(waveAngle_);
314 waveKy[padddlei] = waveK[padddlei]*
sin(waveAngle_);
320 case motionTypes::flap:
323 scalarField motionX(patch().localPoints().size(), -1);
327 const label paddlei = pointToPaddle_[pointi];
329 const scalar phaseTot =
330 waveKx[paddlei]*xPaddle_[paddlei]
331 + waveKy[paddlei]*yPaddle_[paddlei];
333 const scalar depthRef = waterDepthRef_[paddlei];
334 const scalar kh = waveK[paddlei]*depthRef;
341 const scalar boardStroke = waveHeight_/m1;
343 motionX[pointi] = 0.5*boardStroke*
sin(phaseTot - sigma*t);
348 sqr(waveHeight_)/(16*depthRef)
350 *
sin(phaseTot - 2*sigma*t);
354 motionX[pointi] *= 1.0 + (pz - zMinGb_ - depthRef)/depthRef;
362 case motionTypes::piston:
365 scalarField motionX(patch().localPoints().size(), -1);
369 const label paddlei = pointToPaddle_[pointi];
371 const scalar phaseTot =
372 waveKx[paddlei]*xPaddle_[paddlei]
373 + waveKy[paddlei]*yPaddle_[paddlei];
375 const scalar depthRef = waterDepthRef_[paddlei];
376 const scalar kh = waveK[paddlei]*depthRef;
377 const scalar m1 = 2*(
cosh(2*kh) - 1.0)/(
sinh(2*kh) + 2*kh);
378 const scalar boardStroke = waveHeight_/m1;
380 motionX[pointi] = 0.5*boardStroke*
sin(phaseTot - sigma*t);
387 *
sin(phaseTot - 2*sigma*t);
395 case motionTypes::solitary:
398 scalarField motionX(patch().localPoints().size(), -1);
399 const scalar magG =
mag(
g());
403 const label paddlei = pointToPaddle_[pointi];
404 const scalar depthRef = waterDepthRef_[paddlei];
406 const scalar kappa =
sqrt(0.75*waveHeight_/
pow3(depthRef));
407 const scalar celerity =
sqrt(magG*(depthRef + waveHeight_));
408 const scalar stroke =
sqrt(16*waveHeight_*depthRef/3.0);
409 const scalar hr = waveHeight_/depthRef;
410 wavePeriod_ = 2.0/(kappa*celerity)*(3.8 + hr);
411 const scalar tSolitary = -0.5*wavePeriod_ + t;
417 const scalar
error = 0.001;
422 - (theta1 - kappa*celerity*tSolitary + hr*
tanh(theta1))
423 /(1.0 + hr*(1.0/
cosh(theta1))*(1.0/
cosh(theta1)));
425 er =
mag(theta1 - theta2);
430 waveHeight_/(kappa*depthRef)*
tanh(theta1) + 0.5*stroke;
440 <<
"Unhandled enumeration " << motionTypeNames[motionType_]
452 os.
writeEntry(
"motionType", motionTypeNames[motionType_]);
463 writeEntry(
"value",
os);
Macros for easy insertion into run-time selection tables.
const uniformDimensionedVectorField & g
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
void operator=(const Field< Type > &)
Copy assignment.
tmp< Field< cmptType > > component(const direction) const
Return a component field of the field.
void setSize(const label n)
Alias for resize()
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Ostream & writeEntry(const keyType &key, const T &value)
Write a keyword/value entry.
static autoPtr< Time > New()
Construct (dummy) Time - no functionObjects or libraries.
const Cmpt & z() const
Access to the vector z component.
const Cmpt & y() const
Access to the vector y component.
const Cmpt & x() const
Access to the vector x component.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
A bounding box defined in terms of min/max extrema points.
const point & min() const
Minimum describing the bounding box.
const point & max() const
Maximum describing the bounding box.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
bool found(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Search for an entry (const access) with the given keyword.
const Type & value() const
Return const reference to value.
Class to handle errors and exceptions in a simple, consistent stream-based manner.
A FixedValue boundary condition for pointField.
virtual bool write()
Write the output fields.
Gravitational acceleration vector Although termed a MeshObject it is registered on Time only and thus...
Foam::pointPatchFieldMapper.
const objectRegistry & db() const
Return local objectRegistry.
Basic pointPatch represents a set of points from the mesh.
Point motion boundary condition to generate waves based on either piston or flap motions.
virtual void initialiseGeometry()
Initialise.
static const Enum< motionTypes > motionTypeNames
Names for motion types.
scalarField waterDepthRef_
Calculated water depth at the patch.
vector gHat_
Vertical direction.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
virtual scalar timeCoeff(const scalar t) const
Return the time scaling coefficient.
virtual scalar waveLength(const scalar h, const scalar T)
Dispersion equation.
vector n_
Patch normal direction.
scalar waveAngle_
Wave angle.
label nPaddle_
Number of wave paddles.
const vector & g()
Return the gravitational acceleration.
const volScalarField & Cp
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
OBJstream os(runTime.globalPath()/outputName)
constexpr scalar pi(M_PI)
constexpr scalar twoPi(2 *M_PI)
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
dimensionedScalar pow3(const dimensionedScalar &ds)
dimensionedScalar cosh(const dimensionedScalar &ds)
dimensionedScalar sin(const dimensionedScalar &ds)
dimensionedScalar tanh(const dimensionedScalar &ds)
messageStream Info
Information stream (stdout output on master, null elsewhere)
dimensionedScalar sinh(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
dimensionedScalar sqrt(const dimensionedScalar &ds)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
void reduce(const List< UPstream::commsStruct > &comms, T &value, const BinaryOp &bop, const int tag, const label comm)
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
errorManip< error > abort(error &err)
static constexpr const zero Zero
Global zero (0)
errorManipArg< error, int > exit(error &err, const int errNo=1)
dimensionedScalar cos(const dimensionedScalar &ds)
#define makePointPatchTypeField(PatchTypeField, typePatchTypeField)
#define forAll(list, i)
Loop across all elements in list.
const vector L(dict.get< vector >("L"))