diff --git a/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.C b/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.C index f0f2b59cc7543587a73c85174c0fffa70d9349d0..1430ad67fd1ff03ff5878f4e51d6c6c300266182 100644 --- a/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.C +++ b/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 OpenFOAM Foundation - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -50,7 +50,7 @@ Foam::RBD::rigidBodyMotion::rigidBodyMotion(const Time& time) rigidBodyModel(time), motionState_(*this), motionState0_(*this), - aRelax_(1.0), + aRelax_(nullptr), aDamp_(1.0), report_(false), solver_(nullptr) @@ -66,7 +66,16 @@ Foam::RBD::rigidBodyMotion::rigidBodyMotion motionState_(*this, dict), motionState0_(motionState_), X00_(X0_.size()), - aRelax_(dict.getOrDefault<scalar>("accelerationRelaxation", 1)), + aRelax_ + ( + Function1<scalar>::NewIfPresent + ( + "accelerationRelaxation", + dict, + word::null, + &time + ) + ), aDamp_(dict.getOrDefault<scalar>("accelerationDamping", 1)), report_(dict.getOrDefault<Switch>("report", false)), solver_(rigidBodySolver::New(*this, dict.subDict("solver"))) @@ -91,7 +100,16 @@ Foam::RBD::rigidBodyMotion::rigidBodyMotion motionState_(*this, stateDict), motionState0_(motionState_), X00_(X0_.size()), - aRelax_(dict.getOrDefault<scalar>("accelerationRelaxation", 1)), + aRelax_ + ( + Function1<scalar>::NewIfPresent + ( + "accelerationRelaxation", + dict, + word::null, + &time + ) + ), aDamp_(dict.getOrDefault<scalar>("accelerationDamping", 1)), report_(dict.getOrDefault<Switch>("report", false)), solver_(rigidBodySolver::New(*this, dict.subDict("solver"))) @@ -139,7 +157,14 @@ void Foam::RBD::rigidBodyMotion::forwardDynamics { scalarField qDdotPrev = state.qDdot(); rigidBodyModel::forwardDynamics(state, tau, fx); - state.qDdot() = aDamp_*(aRelax_*state.qDdot() + (1 - aRelax_)*qDdotPrev); + + scalar aRelax = 1; + if (aRelax_) + { + aRelax = aRelax_->value(motionState_.t()); + } + + state.qDdot() = aDamp_*(aRelax*state.qDdot() + (1 - aRelax)*qDdotPrev); } diff --git a/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.H b/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.H index 284d5b12b909ca5cc7e72d4749acea0a55526851..3b97d3bb358da24a2dcbade40482965f309f8033 100644 --- a/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.H +++ b/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotion.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 OpenFOAM Foundation + Copyright (C) 2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -52,6 +53,7 @@ SourceFiles #include "rigidBodyModelState.H" #include "pointField.H" #include "Switch.H" +#include "Function1.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -89,7 +91,7 @@ class rigidBodyMotion List<spatialTransform> X00_; //- Acceleration relaxation coefficient - scalar aRelax_; + autoPtr<Function1<scalar>> aRelax_; //- Acceleration damping coefficient (for steady-state simulations) scalar aDamp_; diff --git a/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotionIO.C b/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotionIO.C index 95da0ad66fada9e12e1f458d3036cb06ee2d048a..ac8ef96103e7cdb2aec9d93df2754514400d0cd6 100644 --- a/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotionIO.C +++ b/src/rigidBodyDynamics/rigidBodyMotion/rigidBodyMotionIO.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016 OpenFOAM Foundation - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -33,13 +33,23 @@ License bool Foam::RBD::rigidBodyMotion::read(const dictionary& dict) { - rigidBodyModel::read(dict); + if (rigidBodyModel::read(dict)) + { + aRelax_ = + Function1<scalar>::NewIfPresent + ( + "accelerationRelaxation", + dict, + word::null, + &time() + ); + aDamp_ = dict.getOrDefault<scalar>("accelerationDamping", 1); + report_ = dict.getOrDefault<Switch>("report", false); - aRelax_ = dict.getOrDefault<scalar>("accelerationRelaxation", 1); - aDamp_ = dict.getOrDefault<scalar>("accelerationDamping", 1); - report_ = dict.getOrDefault<Switch>("report", false); + return true; + } - return true; + return false; } @@ -47,7 +57,10 @@ void Foam::RBD::rigidBodyMotion::write(Ostream& os) const { rigidBodyModel::write(os); - os.writeEntry("accelerationRelaxation", aRelax_); + if (aRelax_) + { + aRelax_->writeData(os); + } os.writeEntry("accelerationDamping", aDamp_); os.writeEntry("report", report_); } diff --git a/tutorials/multiphase/interFoam/RAS/floatingObject/constant/dynamicMeshDict b/tutorials/multiphase/interFoam/RAS/floatingObject/constant/dynamicMeshDict index 43863cdbca76693475c9dfdde856eca4946debac..5b643003b90c68fdb4908e5025be3d429dadd303 100644 --- a/tutorials/multiphase/interFoam/RAS/floatingObject/constant/dynamicMeshDict +++ b/tutorials/multiphase/interFoam/RAS/floatingObject/constant/dynamicMeshDict @@ -29,7 +29,13 @@ rigidBodyMotionCoeffs type Newmark; } - accelerationRelaxation 0.7; + accelerationRelaxation table + ( + // time relaxation-factor + (0 0) + (3.99999 0) + (4 0.7) + ); bodies {