ENH: rigidBodyMotion: new Function1-type accelerationRelaxation

TUT: floatingObject: add Function1-type accelerationRelaxation example
This commit is contained in:
Kutalmis Bercin
2021-12-13 13:27:01 +00:00
committed by Andrew Heather
parent 18dd013e22
commit 4c2728a45c
4 changed files with 60 additions and 14 deletions

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2016-2017 OpenFOAM Foundation Copyright (C) 2016-2017 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd. Copyright (C) 2020-2021 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -50,7 +50,7 @@ Foam::RBD::rigidBodyMotion::rigidBodyMotion(const Time& time)
rigidBodyModel(time), rigidBodyModel(time),
motionState_(*this), motionState_(*this),
motionState0_(*this), motionState0_(*this),
aRelax_(1.0), aRelax_(nullptr),
aDamp_(1.0), aDamp_(1.0),
report_(false), report_(false),
solver_(nullptr) solver_(nullptr)
@ -66,7 +66,16 @@ Foam::RBD::rigidBodyMotion::rigidBodyMotion
motionState_(*this, dict), motionState_(*this, dict),
motionState0_(motionState_), motionState0_(motionState_),
X00_(X0_.size()), X00_(X0_.size()),
aRelax_(dict.getOrDefault<scalar>("accelerationRelaxation", 1)), aRelax_
(
Function1<scalar>::NewIfPresent
(
"accelerationRelaxation",
dict,
word::null,
&time
)
),
aDamp_(dict.getOrDefault<scalar>("accelerationDamping", 1)), aDamp_(dict.getOrDefault<scalar>("accelerationDamping", 1)),
report_(dict.getOrDefault<Switch>("report", false)), report_(dict.getOrDefault<Switch>("report", false)),
solver_(rigidBodySolver::New(*this, dict.subDict("solver"))) solver_(rigidBodySolver::New(*this, dict.subDict("solver")))
@ -91,7 +100,16 @@ Foam::RBD::rigidBodyMotion::rigidBodyMotion
motionState_(*this, stateDict), motionState_(*this, stateDict),
motionState0_(motionState_), motionState0_(motionState_),
X00_(X0_.size()), X00_(X0_.size()),
aRelax_(dict.getOrDefault<scalar>("accelerationRelaxation", 1)), aRelax_
(
Function1<scalar>::NewIfPresent
(
"accelerationRelaxation",
dict,
word::null,
&time
)
),
aDamp_(dict.getOrDefault<scalar>("accelerationDamping", 1)), aDamp_(dict.getOrDefault<scalar>("accelerationDamping", 1)),
report_(dict.getOrDefault<Switch>("report", false)), report_(dict.getOrDefault<Switch>("report", false)),
solver_(rigidBodySolver::New(*this, dict.subDict("solver"))) solver_(rigidBodySolver::New(*this, dict.subDict("solver")))
@ -139,7 +157,14 @@ void Foam::RBD::rigidBodyMotion::forwardDynamics
{ {
scalarField qDdotPrev = state.qDdot(); scalarField qDdotPrev = state.qDdot();
rigidBodyModel::forwardDynamics(state, tau, fx); 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);
} }

View File

@ -6,6 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2016-2017 OpenFOAM Foundation Copyright (C) 2016-2017 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -52,6 +53,7 @@ SourceFiles
#include "rigidBodyModelState.H" #include "rigidBodyModelState.H"
#include "pointField.H" #include "pointField.H"
#include "Switch.H" #include "Switch.H"
#include "Function1.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -89,7 +91,7 @@ class rigidBodyMotion
List<spatialTransform> X00_; List<spatialTransform> X00_;
//- Acceleration relaxation coefficient //- Acceleration relaxation coefficient
scalar aRelax_; autoPtr<Function1<scalar>> aRelax_;
//- Acceleration damping coefficient (for steady-state simulations) //- Acceleration damping coefficient (for steady-state simulations)
scalar aDamp_; scalar aDamp_;

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2016 OpenFOAM Foundation Copyright (C) 2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd. Copyright (C) 2020-2021 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -33,21 +33,34 @@ License
bool Foam::RBD::rigidBodyMotion::read(const dictionary& dict) bool Foam::RBD::rigidBodyMotion::read(const dictionary& dict)
{ {
rigidBodyModel::read(dict); if (rigidBodyModel::read(dict))
{
aRelax_ = dict.getOrDefault<scalar>("accelerationRelaxation", 1); aRelax_ =
Function1<scalar>::NewIfPresent
(
"accelerationRelaxation",
dict,
word::null,
&time()
);
aDamp_ = dict.getOrDefault<scalar>("accelerationDamping", 1); aDamp_ = dict.getOrDefault<scalar>("accelerationDamping", 1);
report_ = dict.getOrDefault<Switch>("report", false); report_ = dict.getOrDefault<Switch>("report", false);
return true; return true;
} }
return false;
}
void Foam::RBD::rigidBodyMotion::write(Ostream& os) const void Foam::RBD::rigidBodyMotion::write(Ostream& os) const
{ {
rigidBodyModel::write(os); rigidBodyModel::write(os);
os.writeEntry("accelerationRelaxation", aRelax_); if (aRelax_)
{
aRelax_->writeData(os);
}
os.writeEntry("accelerationDamping", aDamp_); os.writeEntry("accelerationDamping", aDamp_);
os.writeEntry("report", report_); os.writeEntry("report", report_);
} }

View File

@ -29,7 +29,13 @@ rigidBodyMotionCoeffs
type Newmark; type Newmark;
} }
accelerationRelaxation 0.7; accelerationRelaxation table
(
// time relaxation-factor
(0 0)
(3.99999 0)
(4 0.7)
);
bodies bodies
{ {