diff --git a/src/fvMotionSolver/Make/files b/src/fvMotionSolver/Make/files index bd1bb87ede2b32056614a854307fa267f09ed13f..fc295442b64d4a1335f17a7193e962402228d2e1 100644 --- a/src/fvMotionSolver/Make/files +++ b/src/fvMotionSolver/Make/files @@ -34,5 +34,7 @@ pointPatchFields/derived/surfaceDisplacement/surfaceDisplacementPointPatchVector pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyDisplacementPointPatchVectorField.C pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.C pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionIO.C +pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionState.C +pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionStateIO.C LIB = $(FOAM_LIBBIN)/libfvMotionSolvers diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyDisplacementPointPatchVectorField.C b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyDisplacementPointPatchVectorField.C index ddfe3d94cbfc1712452b3e2ed3a8e391cd5f6ca1..324b10f574f597e6e0dca7d4d6e1558dcd3c87db 100644 --- a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyDisplacementPointPatchVectorField.C +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyDisplacementPointPatchVectorField.C @@ -130,7 +130,7 @@ void sixDofRigidBodyDisplacementPointPatchVectorField::updateCoeffs() dictionary forcesDict; forcesDict.add("patches", wordList(1, ptPatch.name())); - forcesDict.add("rhoInf", 0.0); + forcesDict.add("rhoInf", 1.0); forcesDict.add("CofR", motion_.centreOfMass()); forces f("forces", db(), forcesDict); @@ -148,22 +148,6 @@ void sixDofRigidBodyDisplacementPointPatchVectorField::updateCoeffs() gravity = g.value(); } - else - { - uniformDimensionedVectorField g - ( - IOobject - ( - "g", - db().time().constant(), - db(), - IOobject::READ_IF_PRESENT, - IOobject::NO_WRITE - ) - ); - - gravity = g.value(); - } motion_.updateForce ( @@ -172,15 +156,6 @@ void sixDofRigidBodyDisplacementPointPatchVectorField::updateCoeffs() t.deltaT().value() ); - // motion_.updateForce - // ( - // vector::zero, - // vector::zero, - // t.deltaT().value() - // ); - - Info<< motion_ << endl; - Field<vector>::operator=(motion_.generatePositions(p0_) - p0_); fixedValuePointPatchField<vector>::updateCoeffs(); diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.C b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.C index 02ad37e4416de104796d267548107c6188f0781b..5db7351535ef682e0ec495d19559a8978ec61b61 100644 --- a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.C +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.C @@ -30,54 +30,47 @@ License Foam::sixDofRigidBodyMotion::sixDofRigidBodyMotion() : - centreOfMass_(vector::zero), + motionState_(), refCentreOfMass_(vector::zero), momentOfInertia_(diagTensor::one*VSMALL), - mass_(VSMALL), - Q_(I), - v_(vector::zero), - a_(vector::zero), - pi_(vector::zero), - tau_(vector::zero) + mass_(VSMALL) {} Foam::sixDofRigidBodyMotion::sixDofRigidBodyMotion ( const point& centreOfMass, - const point& refCentreOfMass, - const diagTensor& momentOfInertia, - scalar mass, const tensor& Q, const vector& v, const vector& a, const vector& pi, - const vector& tau + const vector& tau, + scalar mass, + const point& refCentreOfMass, + const diagTensor& momentOfInertia ) : - centreOfMass_(centreOfMass), + motionState_ + ( + centreOfMass, + Q, + v, + a, + pi, + tau + ), refCentreOfMass_(refCentreOfMass), momentOfInertia_(momentOfInertia), - mass_(mass), - Q_(Q), - v_(v), - a_(a), - pi_(pi), - tau_(tau) + mass_(mass) {} Foam::sixDofRigidBodyMotion::sixDofRigidBodyMotion(const dictionary& dict) : - centreOfMass_(dict.lookup("centreOfMass")), - refCentreOfMass_(dict.lookupOrDefault("refCentreOfMass", centreOfMass_)), + motionState_(dict), + refCentreOfMass_(dict.lookupOrDefault("refCentreOfMass", centreOfMass())), momentOfInertia_(dict.lookup("momentOfInertia")), - mass_(readScalar(dict.lookup("mass"))), - Q_(dict.lookupOrDefault("Q", tensor(I))), - v_(dict.lookupOrDefault("v", vector::zero)), - a_(dict.lookupOrDefault("a", vector::zero)), - pi_(dict.lookupOrDefault("pi", vector::zero)), - tau_(dict.lookupOrDefault("tau", vector::zero)) + mass_(readScalar(dict.lookup("mass"))) {} @@ -86,15 +79,10 @@ Foam::sixDofRigidBodyMotion::sixDofRigidBodyMotion const sixDofRigidBodyMotion& sDofRBM ) : - centreOfMass_(sDofRBM.centreOfMass()), + motionState_(sDofRBM.motionState()), refCentreOfMass_(sDofRBM.refCentreOfMass()), momentOfInertia_(sDofRBM.momentOfInertia()), - mass_(sDofRBM.mass()), - Q_(sDofRBM.Q()), - v_(sDofRBM.v()), - a_(sDofRBM.a()), - pi_(sDofRBM.pi()), - tau_(sDofRBM.tau()) + mass_(sDofRBM.mass()) {} @@ -114,36 +102,42 @@ void Foam::sixDofRigidBodyMotion::updatePosition // First leapfrog velocity adjust and motion part, required before // force calculation - v_ += 0.5*deltaT*a_; + if (Pstream::master()) + { + v() += 0.5*deltaT*a(); + + pi() += 0.5*deltaT*tau(); + + // Leapfrog move part + centreOfMass() += deltaT*v(); - pi_ += 0.5*deltaT*tau_; + // Leapfrog orientation adjustment - // Leapfrog move part - centreOfMass_ += deltaT*v_; + tensor R; - // Leapfrog orientation adjustment + R = rotationTensorX(0.5*deltaT*pi().x()/momentOfInertia_.xx()); + pi() = pi() & R; + Q() = Q() & R; - tensor R; + R = rotationTensorY(0.5*deltaT*pi().y()/momentOfInertia_.yy()); + pi() = pi() & R; + Q() = Q() & R; - R = rotationTensorX(0.5*deltaT*pi_.x()/momentOfInertia_.xx()); - pi_ = pi_ & R; - Q_ = Q_ & R; + R = rotationTensorZ(deltaT*pi().z()/momentOfInertia_.zz()); + pi() = pi() & R; + Q() = Q() & R; - R = rotationTensorY(0.5*deltaT*pi_.y()/momentOfInertia_.yy()); - pi_ = pi_ & R; - Q_ = Q_ & R; + R = rotationTensorY(0.5*deltaT*pi().y()/momentOfInertia_.yy()); + pi() = pi() & R; + Q() = Q() & R; - R = rotationTensorZ(deltaT*pi_.z()/momentOfInertia_.zz()); - pi_ = pi_ & R; - Q_ = Q_ & R; + R = rotationTensorX(0.5*deltaT*pi().x()/momentOfInertia_.xx()); + pi() = pi() & R; + Q() = Q() & R; - R = rotationTensorY(0.5*deltaT*pi_.y()/momentOfInertia_.yy()); - pi_ = pi_ & R; - Q_ = Q_ & R; + } - R = rotationTensorX(0.5*deltaT*pi_.x()/momentOfInertia_.xx()); - pi_ = pi_ & R; - Q_ = Q_ & R; + Pstream::scatter(motionState_); } @@ -157,14 +151,18 @@ void Foam::sixDofRigidBodyMotion::updateForce // Second leapfrog velocity adjust part, required after motion and // force calculation part - a_ = fGlobal/mass_; + if (Pstream::master()) + { + a() = fGlobal/mass_; - tau_ = (Q_.T() & tauGlobal); + tau() = (Q().T() & tauGlobal); - v_ += 0.5*deltaT*a_; + v() += 0.5*deltaT*a(); - pi_ += 0.5*deltaT*tau_; + pi() += 0.5*deltaT*tau(); + } + Pstream::scatter(motionState_); } @@ -178,30 +176,34 @@ void Foam::sixDofRigidBodyMotion::updateForce // Second leapfrog velocity adjust part, required after motion and // force calculation part - a_ = vector::zero; + if (Pstream::master()) + { + a() = vector::zero; - tau_ = vector::zero; + tau() = vector::zero; - forAll(positions, i) - { - const vector& f = forces[i]; + forAll(positions, i) + { + const vector& f = forces[i]; - a_ += f/mass_; + a() += f/mass_; - tau_ += (positions[i] ^ (Q_.T() & f)); - } + tau() += (positions[i] ^ (Q().T() & f)); + } - v_ += 0.5*deltaT*a_; + v() += 0.5*deltaT*a(); - pi_ += 0.5*deltaT*tau_; + pi() += 0.5*deltaT*tau(); + } + Pstream::scatter(motionState_); } Foam::tmp<Foam::pointField> Foam::sixDofRigidBodyMotion::generatePositions(const pointField& pts) const { - return (centreOfMass_ + (Q_ & (pts - refCentreOfMass_))); + return (centreOfMass() + (Q() & (pts - refCentreOfMass_))); } diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.H b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.H index 2bdb7fbf0562d46a7b9c2c501b7c2c16b1b342d0..3db9d58f6d74e32e5a8bdbf74d5fa96b5ff84708 100644 --- a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.H +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotion.H @@ -53,8 +53,7 @@ SourceFiles #ifndef sixDofRigidBodyMotion_H #define sixDofRigidBodyMotion_H -#include "vector.H" -#include "diagTensor.H" +#include "sixDofRigidBodyMotionState.H" #include "pointField.H" #include "mathConstants.H" @@ -81,8 +80,8 @@ class sixDofRigidBodyMotion { // Private data - //- Current position of the centre of mass of the body - point centreOfMass_; + // state data object + sixDofRigidBodyMotionState motionState_; //- Centre of mass of reference state point refCentreOfMass_; @@ -93,23 +92,6 @@ class sixDofRigidBodyMotion //- Mass of the body scalar mass_; - //- Orientation, stored as the rotation tensor to transform - // from the body to the global reference frame, i.e.: - // globalVector = Q_ & bodyLocalVector - // bodyLocalVector = Q_.T() & globalVector - tensor Q_; - - // Linear velocity of body - vector v_; - - // Total linear acceleration of body - vector a_; - - //- Angular momentum of body, in body local reference frame - vector pi_; - - //- Total torque on body, in body local reference frame - vector tau_; // Private Member Functions @@ -137,14 +119,14 @@ public: sixDofRigidBodyMotion ( const point& centreOfMass, - const point& refCentreOfMass, - const diagTensor& momentOfInertia, - scalar mass, const tensor& Q, const vector& v, const vector& a, - const vector& pi, - const vector& tau + const vector& pi, + const vector& tau, + scalar mass, + const point& refCentreOfMass, + const diagTensor& momentOfInertia ); //- Construct from dictionary @@ -183,6 +165,9 @@ public: // Access + //- Return access to the motion state + inline const sixDofRigidBodyMotionState& motionState() const; + //- Return access to the centre of mass inline const point& centreOfMass() const; diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionI.H b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionI.H index 09b1fa64db8b5375445ed8e8216086ba2ca2b9b0..2ce3160b016dc9fc23bb9e7a6609e99dff143e82 100644 --- a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionI.H +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionI.H @@ -64,9 +64,16 @@ Foam::sixDofRigidBodyMotion::rotationTensorZ(scalar phi) const } +inline const Foam::sixDofRigidBodyMotionState& +Foam::sixDofRigidBodyMotion::motionState() const +{ + return motionState_; +} + + inline const Foam::point& Foam::sixDofRigidBodyMotion::centreOfMass() const { - return centreOfMass_; + return motionState_.centreOfMass(); } @@ -91,37 +98,37 @@ inline Foam::scalar Foam::sixDofRigidBodyMotion::mass() const inline const Foam::tensor& Foam::sixDofRigidBodyMotion::Q() const { - return Q_; + return motionState_.Q(); } inline const Foam::vector& Foam::sixDofRigidBodyMotion::v() const { - return v_; + return motionState_.v(); } inline const Foam::vector& Foam::sixDofRigidBodyMotion::a() const { - return a_; + return motionState_.a(); } inline const Foam::vector& Foam::sixDofRigidBodyMotion::pi() const { - return pi_; + return motionState_.pi(); } inline const Foam::vector& Foam::sixDofRigidBodyMotion::tau() const { - return tau_; + return motionState_.tau(); } inline Foam::point& Foam::sixDofRigidBodyMotion::centreOfMass() { - return centreOfMass_; + return motionState_.centreOfMass(); } @@ -145,31 +152,31 @@ inline Foam::scalar& Foam::sixDofRigidBodyMotion::mass() inline Foam::tensor& Foam::sixDofRigidBodyMotion::Q() { - return Q_; + return motionState_.Q(); } inline Foam::vector& Foam::sixDofRigidBodyMotion::v() { - return v_; + return motionState_.v(); } inline Foam::vector& Foam::sixDofRigidBodyMotion::a() { - return a_; + return motionState_.a(); } inline Foam::vector& Foam::sixDofRigidBodyMotion::pi() { - return pi_; + return motionState_.pi(); } inline Foam::vector& Foam::sixDofRigidBodyMotion::tau() { - return tau_; + return motionState_.tau(); } diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionIO.C b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionIO.C index b6dcf42891dd016dfe5d565a3ab45e74118c019e..fe4902a94d116eb3f1dc7c60f306c9c059d23c96 100644 --- a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionIO.C +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionIO.C @@ -31,24 +31,14 @@ License void Foam::sixDofRigidBodyMotion::write(Ostream& os) const { - os.writeKeyword("centreOfMass") - << centreOfMass_ << token::END_STATEMENT << nl; + motionState_.write(os); + os.writeKeyword("refCentreOfMass") << refCentreOfMass_ << token::END_STATEMENT << nl; os.writeKeyword("momentOfInertia") << momentOfInertia_ << token::END_STATEMENT << nl; os.writeKeyword("mass") << mass_ << token::END_STATEMENT << nl; - os.writeKeyword("Q") - << Q_ << token::END_STATEMENT << nl; - os.writeKeyword("v") - << v_ << token::END_STATEMENT << nl; - os.writeKeyword("a") - << a_ << token::END_STATEMENT << nl; - os.writeKeyword("pi") - << pi_ << token::END_STATEMENT << nl; - os.writeKeyword("tau") - << tau_ << token::END_STATEMENT << nl; } @@ -56,15 +46,10 @@ void Foam::sixDofRigidBodyMotion::write(Ostream& os) const Foam::Istream& Foam::operator>>(Istream& is, sixDofRigidBodyMotion& sDofRBM) { - is >> sDofRBM.centreOfMass_ + is >> sDofRBM.motionState_ >> sDofRBM.refCentreOfMass_ >> sDofRBM.momentOfInertia_ - >> sDofRBM.mass_ - >> sDofRBM.Q_ - >> sDofRBM.v_ - >> sDofRBM.a_ - >> sDofRBM.pi_ - >> sDofRBM.tau_; + >> sDofRBM.mass_; // Check state of Istream is.check @@ -83,15 +68,10 @@ Foam::Ostream& Foam::operator<< const sixDofRigidBodyMotion& sDofRBM ) { - os << token::SPACE << sDofRBM.centreOfMass() + os << sDofRBM.motionState() << token::SPACE << sDofRBM.refCentreOfMass() << token::SPACE << sDofRBM.momentOfInertia() - << token::SPACE << sDofRBM.mass() - << token::SPACE << sDofRBM.Q() - << token::SPACE << sDofRBM.v() - << token::SPACE << sDofRBM.a() - << token::SPACE << sDofRBM.pi() - << token::SPACE << sDofRBM.tau(); + << token::SPACE << sDofRBM.mass() ; // Check state of Ostream os.check diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionState.C b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionState.C new file mode 100644 index 0000000000000000000000000000000000000000..5d54079099357d63b5edbdc62abd9a6b70834bf8 --- /dev/null +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionState.C @@ -0,0 +1,95 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "sixDofRigidBodyMotionState.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::sixDofRigidBodyMotionState::sixDofRigidBodyMotionState() +: + centreOfMass_(vector::zero), + Q_(I), + v_(vector::zero), + a_(vector::zero), + pi_(vector::zero), + tau_(vector::zero) +{} + + +Foam::sixDofRigidBodyMotionState::sixDofRigidBodyMotionState +( + const point& centreOfMass, + const tensor& Q, + const vector& v, + const vector& a, + const vector& pi, + const vector& tau +) +: + centreOfMass_(centreOfMass), + Q_(Q), + v_(v), + a_(a), + pi_(pi), + tau_(tau) +{} + + +Foam::sixDofRigidBodyMotionState::sixDofRigidBodyMotionState +( + const dictionary& dict +) +: + centreOfMass_(dict.lookup("centreOfMass")), + Q_(dict.lookupOrDefault("Q", tensor(I))), + v_(dict.lookupOrDefault("v", vector::zero)), + a_(dict.lookupOrDefault("a", vector::zero)), + pi_(dict.lookupOrDefault("pi", vector::zero)), + tau_(dict.lookupOrDefault("tau", vector::zero)) +{} + + +Foam::sixDofRigidBodyMotionState::sixDofRigidBodyMotionState +( + const sixDofRigidBodyMotionState& sDofRBMS +) +: + centreOfMass_(sDofRBMS.centreOfMass()), + Q_(sDofRBMS.Q()), + v_(sDofRBMS.v()), + a_(sDofRBMS.a()), + pi_(sDofRBMS.pi()), + tau_(sDofRBMS.tau()) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::sixDofRigidBodyMotionState::~sixDofRigidBodyMotionState() +{} + + +// ************************************************************************* // diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionState.H b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionState.H new file mode 100644 index 0000000000000000000000000000000000000000..f7942e31bd99fb4304d49610cfe93c14780a2a68 --- /dev/null +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionState.H @@ -0,0 +1,194 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::sixDofRigidBodyMotionState + +Description + Holds the motion state of sixDof object. Wrapped up together + to allow rapid scatter to other processors. The processors must all + maintain exactly the same state data to avoid any drift or inconsistency. + +SourceFiles + sixDofRigidBodyMotionStateI.H + sixDofRigidBodyMotionState.C + sixDofRigidBodyMotionStateIO.C + +\*---------------------------------------------------------------------------*/ + +#ifndef sixDofRigidBodyMotionState_H +#define sixDofRigidBodyMotionState_H + +#include "vector.H" +#include "point.H" +#include "diagTensor.H" +#include "tensor.H" +#include "dictionary.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes +class Istream; +class Ostream; + +// Forward declaration of friend functions and operators +class sixDofRigidBodyMotionState; +Istream& operator>>(Istream&, sixDofRigidBodyMotionState&); +Ostream& operator<<(Ostream&, const sixDofRigidBodyMotionState&); + + +/*---------------------------------------------------------------------------*\ + Class sixDofRigidBodyMotionState Declaration +\*---------------------------------------------------------------------------*/ + +class sixDofRigidBodyMotionState +{ + // Private data + + //- Current position of the centre of mass of the body + point centreOfMass_; + + //- Orientation, stored as the rotation tensor to transform + // from the body to the global reference frame, i.e.: + // globalVector = Q_ & bodyLocalVector + // bodyLocalVector = Q_.T() & globalVector + tensor Q_; + + // Linear velocity of body + vector v_; + + // Total linear acceleration of body + vector a_; + + //- Angular momentum of body, in body local reference frame + vector pi_; + + //- Total torque on body, in body local reference frame + vector tau_; + + +public: + + // Constructors + + //- Construct null + sixDofRigidBodyMotionState(); + + //- Construct from components + sixDofRigidBodyMotionState + ( + const point& centreOfMass, + const tensor& Q, + const vector& v, + const vector& a, + const vector& pi, + const vector& tau + ); + + //- Construct from dictionary + sixDofRigidBodyMotionState(const dictionary& dict); + + //- Construct as copy + sixDofRigidBodyMotionState(const sixDofRigidBodyMotionState&); + + + //- Destructor + ~sixDofRigidBodyMotionState(); + + + // Member Functions + + // Access + + //- Return access to the centre of mass + inline const point& centreOfMass() const; + + //- Return access to the orientation + inline const tensor& Q() const; + + //- Return access to velocity + inline const vector& v() const; + + //- Return access to acceleration + inline const vector& a() const; + + //- Return access to angular momentum + inline const vector& pi() const; + + //- Return access to torque + inline const vector& tau() const; + + + // Edit + + //- Return non-const access to the centre of mass + inline point& centreOfMass(); + + //- Return non-const access to the orientation + inline tensor& Q(); + + //- Return non-const access to vector + inline vector& v(); + + //- Return non-const access to acceleration + inline vector& a(); + + //- Return non-const access to angular momentum + inline vector& pi(); + + //- Return non-const access to torque + inline vector& tau(); + + + //- Write + void write(Ostream&) const; + + + // Friend Functions + + // Friend Operators + + // IOstream Operators + + friend Istream& operator>>(Istream&, sixDofRigidBodyMotionState&); + friend Ostream& operator<<(Ostream&, const sixDofRigidBodyMotionState&); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "sixDofRigidBodyMotionStateI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionStateI.H b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionStateI.H new file mode 100644 index 0000000000000000000000000000000000000000..dff9412fba8a767f896a2ace23cc062d3923bd1e --- /dev/null +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionStateI.H @@ -0,0 +1,102 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +inline const Foam::point& Foam::sixDofRigidBodyMotionState::centreOfMass() const +{ + return centreOfMass_; +} + + +inline const Foam::tensor& Foam::sixDofRigidBodyMotionState::Q() const +{ + return Q_; +} + + +inline const Foam::vector& Foam::sixDofRigidBodyMotionState::v() const +{ + return v_; +} + + +inline const Foam::vector& Foam::sixDofRigidBodyMotionState::a() const +{ + return a_; +} + + +inline const Foam::vector& Foam::sixDofRigidBodyMotionState::pi() const +{ + return pi_; +} + + +inline const Foam::vector& Foam::sixDofRigidBodyMotionState::tau() const +{ + return tau_; +} + + +inline Foam::point& Foam::sixDofRigidBodyMotionState::centreOfMass() +{ + return centreOfMass_; +} + + +inline Foam::tensor& Foam::sixDofRigidBodyMotionState::Q() +{ + return Q_; +} + + +inline Foam::vector& Foam::sixDofRigidBodyMotionState::v() +{ + return v_; +} + + +inline Foam::vector& Foam::sixDofRigidBodyMotionState::a() +{ + return a_; +} + + +inline Foam::vector& Foam::sixDofRigidBodyMotionState::pi() +{ + return pi_; +} + + +inline Foam::vector& Foam::sixDofRigidBodyMotionState::tau() +{ + return tau_; +} + + +// ************************************************************************* // diff --git a/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionStateIO.C b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionStateIO.C new file mode 100644 index 0000000000000000000000000000000000000000..3934e57cf24af5c82adc621a34b9131a102b0dcc --- /dev/null +++ b/src/fvMotionSolver/pointPatchFields/derived/sixDofRigidBodyDisplacement/sixDofRigidBodyMotion/sixDofRigidBodyMotionStateIO.C @@ -0,0 +1,98 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "sixDofRigidBodyMotionState.H" +#include "IOstreams.H" + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::sixDofRigidBodyMotionState::write(Ostream& os) const +{ + os.writeKeyword("centreOfMass") + << centreOfMass_ << token::END_STATEMENT << nl; + os.writeKeyword("Q") + << Q_ << token::END_STATEMENT << nl; + os.writeKeyword("v") + << v_ << token::END_STATEMENT << nl; + os.writeKeyword("a") + << a_ << token::END_STATEMENT << nl; + os.writeKeyword("pi") + << pi_ << token::END_STATEMENT << nl; + os.writeKeyword("tau") + << tau_ << token::END_STATEMENT << nl; +} + + +// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // + +Foam::Istream& Foam::operator>> +( + Istream& is, sixDofRigidBodyMotionState& sDofRBMS +) +{ + is >> sDofRBMS.centreOfMass_ + >> sDofRBMS.Q_ + >> sDofRBMS.v_ + >> sDofRBMS.a_ + >> sDofRBMS.pi_ + >> sDofRBMS.tau_; + + // Check state of Istream + is.check + ( + "Foam::Istream& Foam::operator>>" + "(Foam::Istream&, Foam::sixDofRigidBodyMotionState&)" + ); + + return is; +} + + +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const sixDofRigidBodyMotionState& sDofRBMS +) +{ + os << token::SPACE << sDofRBMS.centreOfMass() + << token::SPACE << sDofRBMS.Q() + << token::SPACE << sDofRBMS.v() + << token::SPACE << sDofRBMS.a() + << token::SPACE << sDofRBMS.pi() + << token::SPACE << sDofRBMS.tau(); + + // Check state of Ostream + os.check + ( + "Foam::Ostream& Foam::operator<<(Foam::Ostream&, " + "const Foam::sixDofRigidBodyMotionState&)" + ); + + return os; +} + + +// ************************************************************************* //