/*---------------------------------------------------------------------------*\ ========= | \\ / 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 . \*---------------------------------------------------------------------------*/ #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; } // ************************************************************************* //