mirror of
https://github.com/OpenFOAM/OpenFOAM-6.git
synced 2025-12-08 06:57:46 +00:00
applications/test/rigidBodyDynamics/spring: Test of the linear spring with damper restraint
Damped simple harmonic motion of a weight on a spring is simulated and
the results compared with analytical solution
Test-spring
gnuplot spring.gnuplot
evince spring.eps
This development is sponsored by Carnegie Wave Energy Ltd.
153 lines
3.9 KiB
C
153 lines
3.9 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "linearSpring.H"
|
|
#include "rigidBodyModel.H"
|
|
#include "addToRunTimeSelectionTable.H"
|
|
|
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
namespace RBD
|
|
{
|
|
namespace restraints
|
|
{
|
|
defineTypeNameAndDebug(linearSpring, 0);
|
|
|
|
addToRunTimeSelectionTable
|
|
(
|
|
restraint,
|
|
linearSpring,
|
|
dictionary
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
|
|
Foam::RBD::restraints::linearSpring::linearSpring
|
|
(
|
|
const word& name,
|
|
const dictionary& dict,
|
|
const rigidBodyModel& model
|
|
)
|
|
:
|
|
restraint(name, dict, model),
|
|
anchor_(),
|
|
refAttachmentPt_(),
|
|
stiffness_(),
|
|
damping_(),
|
|
restLength_()
|
|
{
|
|
read(dict);
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
|
|
Foam::RBD::restraints::linearSpring::~linearSpring()
|
|
{}
|
|
|
|
|
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
|
|
Foam::spatialVector Foam::RBD::restraints::linearSpring::restrain() const
|
|
{
|
|
spatialVector attachmentPt
|
|
(
|
|
model_.X0(bodyIndex_).inv() && spatialVector(Zero, refAttachmentPt_)
|
|
);
|
|
|
|
// Current axis of the spring
|
|
vector r = attachmentPt.l() - anchor_;
|
|
scalar magR = mag(r);
|
|
r /= (magR + VSMALL);
|
|
|
|
// Velocity of the end of the spring
|
|
vector v = model_.v(bodyIndex_, refAttachmentPt_).l();
|
|
|
|
// Force and moment including optional damping
|
|
vector force = (-stiffness_*(magR - restLength_) - damping_*(r & v))*r;
|
|
vector moment = (attachmentPt.l() - model_.X0(bodyIndex_).r()) ^ force;
|
|
|
|
if (model_.debug)
|
|
{
|
|
Info<< " attachmentPt - anchor " << r*magR
|
|
<< " spring length " << magR
|
|
<< " force " << force
|
|
<< " moment " << moment
|
|
<< endl;
|
|
}
|
|
|
|
return spatialVector(moment, force);
|
|
}
|
|
|
|
|
|
bool Foam::RBD::restraints::linearSpring::read
|
|
(
|
|
const dictionary& dict
|
|
)
|
|
{
|
|
restraint::read(dict);
|
|
|
|
coeffs_.lookup("anchor") >> anchor_;
|
|
coeffs_.lookup("refAttachmentPt") >> refAttachmentPt_;
|
|
coeffs_.lookup("stiffness") >> stiffness_;
|
|
coeffs_.lookup("damping") >> damping_;
|
|
coeffs_.lookup("restLength") >> restLength_;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void Foam::RBD::restraints::linearSpring::write
|
|
(
|
|
Ostream& os
|
|
) const
|
|
{
|
|
restraint::write(os);
|
|
|
|
os.writeKeyword("anchor")
|
|
<< anchor_ << token::END_STATEMENT << nl;
|
|
|
|
os.writeKeyword("refAttachmentPt")
|
|
<< refAttachmentPt_ << token::END_STATEMENT << nl;
|
|
|
|
os.writeKeyword("stiffness")
|
|
<< stiffness_ << token::END_STATEMENT << nl;
|
|
|
|
os.writeKeyword("damping")
|
|
<< damping_ << token::END_STATEMENT << nl;
|
|
|
|
os.writeKeyword("restLength")
|
|
<< restLength_ << token::END_STATEMENT << nl;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|