Files
OpenFOAM-6/src/rigidBodyDynamics/restraints/linearSpring/linearSpring.C
Henry Weller c019071604 rigidBodyDynamics: Added support for restraints and a linear spring with damper
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.
2016-04-10 23:12:07 +01:00

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;
}
// ************************************************************************* //