diff --git a/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.C b/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.C index f31324ebf6..732bb2fa3d 100644 --- a/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.C +++ b/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation + Copyright (C) 2022 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -53,7 +54,29 @@ Foam::solidBodyMotionFunctions::oscillatingLinearMotion::oscillatingLinearMotion const Time& runTime ) : - solidBodyMotionFunction(SBMFCoeffs, runTime) + solidBodyMotionFunction(SBMFCoeffs, runTime), + omegaPtr_(Function1::New("omega", SBMFCoeffs_, &runTime)), + phaseShiftPtr_ + ( + Function1::NewIfPresent + ( + "phaseShift", + SBMFCoeffs_, + word::null, + &runTime + ) + ), + amplitudePtr_(Function1::New("amplitude", SBMFCoeffs_, &runTime)), + verticalShiftPtr_ + ( + Function1::NewIfPresent + ( + "verticalShift", + SBMFCoeffs_, + word::null, + &runTime + ) + ) { read(SBMFCoeffs); } @@ -64,9 +87,27 @@ Foam::solidBodyMotionFunctions::oscillatingLinearMotion::oscillatingLinearMotion Foam::septernion Foam::solidBodyMotionFunctions::oscillatingLinearMotion::transformation() const { - scalar t = time_.value(); + const scalar t = time_.value(); - const vector displacement = amplitude_*sin(omega_*t); + const vector amplitude(amplitudePtr_->value(t)); + const scalar omega = omegaPtr_->value(t); + + scalar phaseShift = 0; + if (phaseShiftPtr_) + { + phaseShift = phaseShiftPtr_->value(t); + } + + vector verticalShift(Zero); + if (verticalShiftPtr_) + { + verticalShift = verticalShiftPtr_->value(t); + } + + const vector displacement + ( + amplitude*sin(omega*(t + phaseShift)) + verticalShift + ); quaternion R(1); septernion TR(septernion(-displacement)*R); @@ -82,10 +123,42 @@ bool Foam::solidBodyMotionFunctions::oscillatingLinearMotion::read const dictionary& SBMFCoeffs ) { - solidBodyMotionFunction::read(SBMFCoeffs); + if (!solidBodyMotionFunction::read(SBMFCoeffs)) + { + return false; + } - SBMFCoeffs_.readEntry("amplitude", amplitude_); - SBMFCoeffs_.readEntry("omega", omega_); + omegaPtr_.reset + ( + Function1::New("omega", SBMFCoeffs_, &time_) + ); + + phaseShiftPtr_.reset + ( + Function1::NewIfPresent + ( + "phaseShift", + SBMFCoeffs_, + word::null, + &time_ + ) + ); + + amplitudePtr_.reset + ( + Function1::New("amplitude", SBMFCoeffs_, &time_) + ); + + verticalShiftPtr_.reset + ( + Function1::NewIfPresent + ( + "verticalShift", + SBMFCoeffs_, + word::null, + &time_ + ) + ); return true; } diff --git a/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.H b/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.H index 3f6da0ae46..a9e1d803b4 100644 --- a/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.H +++ b/src/dynamicMesh/motionSolvers/displacement/solidBody/solidBodyMotionFunctions/oscillatingLinearMotion/oscillatingLinearMotion.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2022 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -30,17 +30,64 @@ Class Description SolidBodyMotionFvMesh 6DoF motion function. Oscillating displacement. + The governing equation for the displacement is given by: + \f[ + y = A*\sin(B*(t + C)) + D + \f] + + where: + \vartable + y | Displacement [m] (vector) + A | Amplitude [m] (vector) + B | Radial velocity [rad/s] (scalar) + C | Phase-shift to left [s] (scalar) + D | Vertical shift [m] (vector) + \endvartable + +Usage + Minimal example by using \c constant/fvOptions: + \verbatim + oscillation + { + // Mandatory entries + solidBodyMotionFunction oscillatingLinearMotion; + + oscillatingLinearMotionCoeffs + { + // Mandatory entries + amplitude >; + omega >; + + // Optional entries + phaseShift >; + verticalShift >; + } + } + + where the entries mean: + \table + Property | Description | Type | Reqd | Deflt + solidBodyMotionFunction | Type name: oscillatingLinearMotion | word | yes | - + amplitude | Amplitude | Function1\ | yes | - + omega | Radial velocity | Function1\ | yes | - + phaseShift | Phase-shift to left | Function1\ | no | - + verticalShift | Vertical shift | Function1\ | no | - + \endtable + SourceFiles oscillatingLinearMotion.C \*---------------------------------------------------------------------------*/ -#ifndef oscillatingLinearMotion_H -#define oscillatingLinearMotion_H +#ifndef Foam_solidBodyMotionFunctions_oscillatingLinearMotion_H +#define Foam_solidBodyMotionFunctions_oscillatingLinearMotion_H #include "solidBodyMotionFunction.H" #include "primitiveFields.H" #include "point.H" +#include "Function1.H" +#include "autoPtr.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -50,7 +97,7 @@ namespace solidBodyMotionFunctions { /*---------------------------------------------------------------------------*\ - Class oscillatingLinearMotion Declaration + Class oscillatingLinearMotion Declaration \*---------------------------------------------------------------------------*/ class oscillatingLinearMotion @@ -59,11 +106,17 @@ class oscillatingLinearMotion { // Private Data - //- Amplitude - vector amplitude_; - //- Radial velocity - scalar omega_; + autoPtr> omegaPtr_; + + //- Phase shift + autoPtr> phaseShiftPtr_; + + //- Amplitude + autoPtr> amplitudePtr_; + + //- Vertical shift + autoPtr> verticalShiftPtr_; // Private Member Functions diff --git a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allclean b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allclean index 64e0b6245f..af4fccde2e 100755 --- a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allclean +++ b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allclean @@ -7,5 +7,6 @@ cleanCase0 rm -rf constant/triSurface rm -rf constant/extendedFeatureEdgeMesh +rm -rf oldProcessors #------------------------------------------------------------------------------ diff --git a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun index 07f4092bb6..78d5debbe7 100755 --- a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun +++ b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun @@ -3,19 +3,7 @@ cd "${0%/*}" || exit # Run from this directory . ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions #------------------------------------------------------------------------------ -mkdir -p constant/triSurface - -cp -f \ - "$FOAM_TUTORIALS"/resources/geometry/sloshingCylinder.obj.gz \ - constant/triSurface/ - -restore0Dir - -runApplication blockMesh - -runApplication snappyHexMesh -overwrite - -runApplication setFields +./Allrun.pre runApplication $(getApplication) diff --git a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun-parallel b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun-parallel new file mode 100755 index 0000000000..2011aa8f23 --- /dev/null +++ b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun-parallel @@ -0,0 +1,29 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +./Allrun.pre + +runApplication decomposePar + +runParallel $(getApplication) + +runApplication reconstructPar + + +latestTime=$(foamListTimes -latestTime) + +mv -f "$latestTime" "$latestTime".bak + +mkdir oldProcessors + +mv -f processor* oldProcessors + +runParallel -s "decompose" redistributePar -decompose -latestTime + +runParallel -s "restart" $(getApplication) + +runParallel -s "reconstruct" redistributePar -reconstruct -latestTime + +#------------------------------------------------------------------------------ diff --git a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun.pre b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun.pre new file mode 100755 index 0000000000..c3e49e2493 --- /dev/null +++ b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/Allrun.pre @@ -0,0 +1,20 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +mkdir -p constant/triSurface + +cp -f \ + "$FOAM_TUTORIALS"/resources/geometry/sloshingCylinder.obj.gz \ + constant/triSurface/ + +restore0Dir + +runApplication blockMesh + +runApplication snappyHexMesh -overwrite + +runApplication setFields + +#------------------------------------------------------------------------------ diff --git a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/constant/dynamicMeshDict b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/constant/dynamicMeshDict index c15a52a3ec..09eeef0912 100644 --- a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/constant/dynamicMeshDict +++ b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/constant/dynamicMeshDict @@ -27,6 +27,9 @@ oscillation { amplitude (0.1 0 0); omega 18.8945578; + + phaseShift 0.01; + verticalShift (0.05 0 0); } } diff --git a/tutorials/multiphase/interFoam/laminar/sloshingCylinder/system/decomposeParDict b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/system/decomposeParDict new file mode 100644 index 0000000000..854ff4834f --- /dev/null +++ b/tutorials/multiphase/interFoam/laminar/sloshingCylinder/system/decomposeParDict @@ -0,0 +1,27 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2206 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 4; + +method hierarchical; + +coeffs +{ + n ( 2 2 1 ); +} + + +// ************************************************************************* // \ No newline at end of file