Merge commit 'origin/master' into splitCyclic

Conflicts:
	applications/utilities/parallelProcessing/decomposePar/decomposePar.C
	applications/utilities/parallelProcessing/decomposePar/domainDecomposition.C
	applications/utilities/parallelProcessing/decomposePar/domainDecomposition.H
	applications/utilities/parallelProcessing/decomposePar/domainDecompositionMesh.C
	src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C
	src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointPatchField.C
	src/OpenFOAM/meshes/pointMesh/pointPatches/derived/coupled/coupledFacePointPatch.H
	src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C
	src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C
	src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H
	src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C
This commit is contained in:
mattijs
2010-03-09 21:28:53 +00:00
1005 changed files with 34625 additions and 13475 deletions

View File

@ -57,7 +57,7 @@ void Foam::fieldValue::movePoints(const Field<point>&)
void Foam::fieldValue::makeFile()
{
// Create the forces file if not already created
// Create the output file if not already created
if (outputFilePtr_.empty())
{
if (debug)

View File

@ -4,10 +4,33 @@ forces/forcesFunctionObject.C
forceCoeffs/forceCoeffs.C
forceCoeffs/forceCoeffsFunctionObject.C
sDoFRBM = pointPatchFields/derived/sixDoFRigidBodyMotion
$(sDoFRBM)/sixDoFRigidBodyMotion.C
$(sDoFRBM)/sixDoFRigidBodyMotionIO.C
$(sDoFRBM)/sixDoFRigidBodyMotionState.C
$(sDoFRBM)/sixDoFRigidBodyMotionStateIO.C
sDoFRBMR = $(sDoFRBM)/sixDoFRigidBodyMotionRestraint
$(sDoFRBMR)/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C
$(sDoFRBMR)/sixDoFRigidBodyMotionRestraint/newSixDoFRigidBodyMotionRestraint.C
$(sDoFRBMR)/linearAxialAngularSpring/linearAxialAngularSpring.C
$(sDoFRBMR)/linearSpring/linearSpring.C
$(sDoFRBMR)/sphericalAngularSpring/sphericalAngularSpring.C
$(sDoFRBMR)/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C
sDoFRBMC = $(sDoFRBM)/sixDoFRigidBodyMotionConstraint
$(sDoFRBMC)/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C
$(sDoFRBMC)/sixDoFRigidBodyMotionConstraint/newSixDoFRigidBodyMotionConstraint.C
$(sDoFRBMC)/fixedAxis/fixedAxis.C
$(sDoFRBMC)/fixedLine/fixedLine.C
$(sDoFRBMC)/fixedOrientation/fixedOrientation.C
$(sDoFRBMC)/fixedPlane/fixedPlane.C
$(sDoFRBMC)/fixedPoint/fixedPoint.C
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
pointPatchFields/derived/uncoupledSixDoFRigidBodyDisplacement/uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField.C
LIB = $(FOAM_LIBBIN)/libforces

View File

@ -49,7 +49,7 @@ sixDoFRigidBodyDisplacementPointPatchVectorField
:
fixedValuePointPatchField<vector>(p, iF),
motion_(),
p0_(p.localPoints()),
initialPoints_(p.localPoints()),
rhoInf_(1.0)
{}
@ -71,13 +71,13 @@ sixDoFRigidBodyDisplacementPointPatchVectorField
updateCoeffs();
}
if (dict.found("p0"))
if (dict.found("initialPoints"))
{
p0_ = vectorField("p0", dict , p.size());
initialPoints_ = vectorField("initialPoints", dict , p.size());
}
else
{
p0_ = p.localPoints();
initialPoints_ = p.localPoints();
}
}
@ -93,7 +93,7 @@ sixDoFRigidBodyDisplacementPointPatchVectorField
:
fixedValuePointPatchField<vector>(ptf, p, iF, mapper),
motion_(ptf.motion_),
p0_(ptf.p0_, mapper),
initialPoints_(ptf.initialPoints_, mapper),
rhoInf_(ptf.rhoInf_)
{}
@ -107,13 +107,39 @@ sixDoFRigidBodyDisplacementPointPatchVectorField
:
fixedValuePointPatchField<vector>(ptf, iF),
motion_(ptf.motion_),
p0_(ptf.p0_),
initialPoints_(ptf.initialPoints_),
rhoInf_(ptf.rhoInf_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void sixDoFRigidBodyDisplacementPointPatchVectorField::autoMap
(
const pointPatchFieldMapper& m
)
{
fixedValuePointPatchField<vector>::autoMap(m);
initialPoints_.autoMap(m);
}
void sixDoFRigidBodyDisplacementPointPatchVectorField::rmap
(
const pointPatchField<vector>& ptf,
const labelList& addr
)
{
const sixDoFRigidBodyDisplacementPointPatchVectorField& sDoFptf =
refCast<const sixDoFRigidBodyDisplacementPointPatchVectorField>(ptf);
fixedValuePointPatchField<vector>::rmap(sDoFptf, addr);
initialPoints_.rmap(sDoFptf.initialPoints_, addr);
}
void sixDoFRigidBodyDisplacementPointPatchVectorField::updateCoeffs()
{
if (this->updated())
@ -160,7 +186,10 @@ void sixDoFRigidBodyDisplacementPointPatchVectorField::updateCoeffs()
t.deltaTValue()
);
Field<vector>::operator=(motion_.generatePositions(p0_) - p0_);
Field<vector>::operator=
(
motion_.currentPosition(initialPoints_) - initialPoints_
);
fixedValuePointPatchField<vector>::updateCoeffs();
}
@ -172,7 +201,7 @@ void sixDoFRigidBodyDisplacementPointPatchVectorField::write(Ostream& os) const
motion_.write(os);
os.writeKeyword("rhoInf")
<< rhoInf_ << token::END_STATEMENT << nl;
p0_.writeEntry("p0", os);
initialPoints_.writeEntry("initialPoints", os);
writeEntry("value", os);
}

View File

@ -57,8 +57,8 @@ class sixDoFRigidBodyDisplacementPointPatchVectorField
//- Six dof motion object
sixDoFRigidBodyMotion motion_;
//- Reference positions of points on the patch
pointField p0_;
//- Initial positions of points on the patch
pointField initialPoints_;
//- Reference density required by the forces object for
// incompressible calculations
@ -135,6 +135,22 @@ public:
// Member functions
// Mapping functions
//- Map (and resize as needed) from self given a mapping object
virtual void autoMap
(
const pointPatchFieldMapper&
);
//- Reverse map the given pointPatchField onto this pointPatchField
virtual void rmap
(
const pointPatchField<vector>&,
const labelList&
);
// Evaluation functions
//- Update the coefficients associated with the patch field

View File

@ -1,210 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion()
:
motionState_(),
refCentreOfMass_(vector::zero),
momentOfInertia_(diagTensor::one*VSMALL),
mass_(VSMALL)
{}
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
(
const point& centreOfMass,
const tensor& Q,
const vector& v,
const vector& a,
const vector& pi,
const vector& tau,
scalar mass,
const point& refCentreOfMass,
const diagTensor& momentOfInertia
)
:
motionState_
(
centreOfMass,
Q,
v,
a,
pi,
tau
),
refCentreOfMass_(refCentreOfMass),
momentOfInertia_(momentOfInertia),
mass_(mass)
{}
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion(const dictionary& dict)
:
motionState_(dict),
refCentreOfMass_(dict.lookupOrDefault("refCentreOfMass", centreOfMass())),
momentOfInertia_(dict.lookup("momentOfInertia")),
mass_(readScalar(dict.lookup("mass")))
{}
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
(
const sixDoFRigidBodyMotion& sDoFRBM
)
:
motionState_(sDoFRBM.motionState()),
refCentreOfMass_(sDoFRBM.refCentreOfMass()),
momentOfInertia_(sDoFRBM.momentOfInertia()),
mass_(sDoFRBM.mass())
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotion::~sixDoFRigidBodyMotion()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::sixDoFRigidBodyMotion::updatePosition
(
scalar deltaT
)
{
// First leapfrog velocity adjust and motion part, required before
// force calculation
if (Pstream::master())
{
v() += 0.5*deltaT*a();
pi() += 0.5*deltaT*tau();
// Leapfrog move part
centreOfMass() += deltaT*v();
// Leapfrog orientation adjustment
tensor 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 = 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 = rotationTensorX(0.5*deltaT*pi().x()/momentOfInertia_.xx());
pi() = pi() & R;
Q() = Q() & R;
}
Pstream::scatter(motionState_);
}
void Foam::sixDoFRigidBodyMotion::updateForce
(
const vector& fGlobal,
const vector& tauGlobal,
scalar deltaT
)
{
// Second leapfrog velocity adjust part, required after motion and
// force calculation part
if (Pstream::master())
{
a() = fGlobal/mass_;
tau() = (Q().T() & tauGlobal);
v() += 0.5*deltaT*a();
pi() += 0.5*deltaT*tau();
}
Pstream::scatter(motionState_);
}
void Foam::sixDoFRigidBodyMotion::updateForce
(
const pointField& positions,
const vectorField& forces,
scalar deltaT
)
{
// Second leapfrog velocity adjust part, required after motion and
// force calculation part
if (Pstream::master())
{
a() = vector::zero;
tau() = vector::zero;
forAll(positions, i)
{
const vector& f = forces[i];
a() += f/mass_;
tau() += (positions[i] ^ (Q().T() & f));
}
v() += 0.5*deltaT*a();
pi() += 0.5*deltaT*tau();
}
Pstream::scatter(motionState_);
}
Foam::tmp<Foam::pointField>
Foam::sixDoFRigidBodyMotion::generatePositions(const pointField& pts) const
{
return (centreOfMass() + (Q() & (pts - refCentreOfMass_)));
}
// ************************************************************************* //

View File

@ -0,0 +1,499 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 PARTICLUAR 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 "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::sixDoFRigidBodyMotion::applyRestraints()
{
if (restraints_.empty())
{
return;
}
if (Pstream::master())
{
forAll(restraints_, rI)
{
if (report_)
{
Info<< "Restraint " << restraintNames_[rI];
}
// restraint position
point rP = vector::zero;
// restraint force
vector rF = vector::zero;
// restraint moment
vector rM = vector::zero;
restraints_[rI].restrain(*this, rP, rF, rM);
a() += rF/mass_;
// Moments are returned in global axes, transforming to
// body local to add to torque.
tau() += Q().T() & (rM + ((rP - centreOfMass()) ^ rF));
}
}
}
void Foam::sixDoFRigidBodyMotion::applyConstraints(scalar deltaT)
{
if (constraints_.empty())
{
return;
}
if (Pstream::master())
{
label iteration = 0;
bool allConverged = true;
// constraint force accumulator
vector cFA = vector::zero;
// constraint moment accumulator
vector cMA = vector::zero;
do
{
allConverged = true;
forAll(constraints_, cI)
{
if (report_)
{
Info<< "Constraint " << constraintNames_[cI];
}
// constraint position
point cP = vector::zero;
// constraint force
vector cF = vector::zero;
// constraint moment
vector cM = vector::zero;
bool constraintConverged = constraints_[cI].constrain
(
*this,
cFA,
cMA,
deltaT,
cP,
cF,
cM
);
allConverged = allConverged && constraintConverged;
// Accumulate constraint force
cFA += cF;
// Accumulate constraint moment
cMA += cM + ((cP - centreOfMass()) ^ cF);
}
} while(++iteration < maxConstraintIterations_ && !allConverged);
if (iteration >= maxConstraintIterations_)
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotion::applyConstraints"
"(scalar deltaT)"
)
<< nl << "Maximum number of sixDoFRigidBodyMotion constraint "
<< "iterations ("
<< maxConstraintIterations_
<< ") exceeded." << nl
<< exit(FatalError);
}
Info<< "sixDoFRigidBodyMotion constraints converged in "
<< iteration << " iterations" << endl;
if (report_)
{
Info<< "Constraint force: " << cFA << nl
<< "Constraint moment: " << cMA
<< endl;
}
// Add the constraint forces and moments to the motion state variables
a() += cFA/mass_;
// The moment of constraint forces has already been added
// during accumulation. Moments are returned in global axes,
// transforming to body local
tau() += Q().T() & cMA;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion()
:
motionState_(),
restraints_(),
restraintNames_(),
constraints_(),
constraintNames_(),
maxConstraintIterations_(0),
initialCentreOfMass_(vector::zero),
initialQ_(I),
momentOfInertia_(diagTensor::one*VSMALL),
mass_(VSMALL),
report_(false)
{}
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
(
const point& centreOfMass,
const tensor& Q,
const vector& v,
const vector& a,
const vector& pi,
const vector& tau,
scalar mass,
const point& initialCentreOfMass,
const tensor& initialQ,
const diagTensor& momentOfInertia,
bool report
)
:
motionState_
(
centreOfMass,
Q,
v,
a,
pi,
tau
),
restraints_(),
restraintNames_(),
constraints_(),
constraintNames_(),
maxConstraintIterations_(0),
initialCentreOfMass_(initialCentreOfMass),
initialQ_(initialQ),
momentOfInertia_(momentOfInertia),
mass_(mass),
report_(report)
{}
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion(const dictionary& dict)
:
motionState_(dict),
restraints_(),
restraintNames_(),
constraints_(),
constraintNames_(),
maxConstraintIterations_(0),
initialCentreOfMass_
(
dict.lookupOrDefault("initialCentreOfMass", centreOfMass())
),
initialQ_
(
dict.lookupOrDefault("initialOrientation", Q())
),
momentOfInertia_(dict.lookup("momentOfInertia")),
mass_(readScalar(dict.lookup("mass"))),
report_(dict.lookupOrDefault<Switch>("report", false))
{
addRestraints(dict);
addConstraints(dict);
}
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
(
const sixDoFRigidBodyMotion& sDoFRBM
)
:
motionState_(sDoFRBM.motionState()),
restraints_(sDoFRBM.restraints()),
restraintNames_(sDoFRBM.restraintNames()),
constraints_(sDoFRBM.constraints()),
constraintNames_(sDoFRBM.constraintNames()),
maxConstraintIterations_(sDoFRBM.maxConstraintIterations()),
initialCentreOfMass_(sDoFRBM.initialCentreOfMass()),
initialQ_(sDoFRBM.initialQ()),
momentOfInertia_(sDoFRBM.momentOfInertia()),
mass_(sDoFRBM.mass()),
report_(sDoFRBM.report())
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotion::~sixDoFRigidBodyMotion()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::sixDoFRigidBodyMotion::addRestraints
(
const dictionary& dict
)
{
if (dict.found("restraints"))
{
const dictionary& restraintDict = dict.subDict("restraints");
label i = 0;
restraints_.setSize(restraintDict.size());
restraintNames_.setSize(restraintDict.size());
forAllConstIter(IDLList<entry>, restraintDict, iter)
{
if (iter().isDict())
{
// Info<< "Adding restraint: " << iter().keyword() << endl;
restraints_.set
(
i,
sixDoFRigidBodyMotionRestraint::New(iter().dict())
);
restraintNames_[i] = iter().keyword();
i++;
}
}
restraints_.setSize(i);
restraintNames_.setSize(i);
}
}
void Foam::sixDoFRigidBodyMotion::addConstraints
(
const dictionary& dict
)
{
if (dict.found("constraints"))
{
const dictionary& constraintDict = dict.subDict("constraints");
label i = 0;
constraints_.setSize(constraintDict.size());
constraintNames_.setSize(constraintDict.size());
forAllConstIter(IDLList<entry>, constraintDict, iter)
{
if (iter().isDict())
{
// Info<< "Adding constraint: " << iter().keyword() << endl;
constraints_.set
(
i,
sixDoFRigidBodyMotionConstraint::New(iter().dict())
);
constraintNames_[i] = iter().keyword();
i++;
}
}
constraints_.setSize(i);
constraintNames_.setSize(i);
if (!constraints_.empty())
{
maxConstraintIterations_ = readLabel
(
constraintDict.lookup("maxIterations")
);
}
}
}
void Foam::sixDoFRigidBodyMotion::updatePosition
(
scalar deltaT
)
{
// First leapfrog velocity adjust and motion part, required before
// force calculation
if (Pstream::master())
{
v() += 0.5*deltaT*a();
pi() += 0.5*deltaT*tau();
// Leapfrog move part
centreOfMass() += deltaT*v();
// Leapfrog orientation adjustment
rotate(Q(), pi(), deltaT);
}
Pstream::scatter(motionState_);
}
void Foam::sixDoFRigidBodyMotion::updateForce
(
const vector& fGlobal,
const vector& tauGlobal,
scalar deltaT
)
{
// Second leapfrog velocity adjust part, required after motion and
// force calculation
if (Pstream::master())
{
a() = fGlobal/mass_;
tau() = (Q().T() & tauGlobal);
applyRestraints();
applyConstraints(deltaT);
v() += 0.5*deltaT*a();
pi() += 0.5*deltaT*tau();
if(report_)
{
status();
}
}
Pstream::scatter(motionState_);
}
void Foam::sixDoFRigidBodyMotion::updateForce
(
const pointField& positions,
const vectorField& forces,
scalar deltaT
)
{
vector a = vector::zero;
vector tau = vector::zero;
if (Pstream::master())
{
forAll(positions, i)
{
const vector& f = forces[i];
a += f/mass_;
tau += Q().T() & ((positions[i] - centreOfMass()) ^ f);
}
}
updateForce(a, tau, deltaT);
}
Foam::point Foam::sixDoFRigidBodyMotion::predictedPosition
(
const point& pInitial,
const vector& deltaForce,
const vector& deltaMoment,
scalar deltaT
) const
{
vector vTemp = v() + deltaT*(a() + deltaForce/mass_);
vector piTemp = pi() + deltaT*(tau() + (Q().T() & deltaMoment));
point centreOfMassTemp = centreOfMass() + deltaT*vTemp;
tensor QTemp = Q();
rotate(QTemp, piTemp, deltaT);
return
(
centreOfMassTemp
+ (QTemp & initialQ_.T() & (pInitial - initialCentreOfMass_))
);
}
Foam::vector Foam::sixDoFRigidBodyMotion::predictedOrientation
(
const vector& vInitial,
const vector& deltaMoment,
scalar deltaT
) const
{
vector piTemp = pi() + deltaT*(tau() + (Q().T() & deltaMoment));
tensor QTemp = Q();
rotate(QTemp, piTemp, deltaT);
return (QTemp & initialQ_.T() & vInitial);
}
void Foam::sixDoFRigidBodyMotion::status() const
{
Info<< "Centre of mass: " << centreOfMass() << nl
<< "Linear velocity: " << v() << nl
<< "Angular velocity: " << omega()
<< endl;
}
// ************************************************************************* //

View File

@ -26,10 +26,10 @@ Class
Foam::sixDoFRigidBodyMotion
Description
Six degree of freedom motion for a rigid body. Angular momentum stored in
body fixed reference frame. Reference orientation of the body must align
with the cartesian axes such that the Inertia tensor is in principle
component form.
Six degree of freedom motion for a rigid body. Angular momentum
stored in body fixed reference frame. Reference orientation of
the body (where Q = I) must align with the cartesian axes such
that the Inertia tensor is in principle component form.
Symplectic motion as per:
@ -43,6 +43,9 @@ Description
url = {http://link.aip.org/link/?JCP/107/5840/1},
doi = {10.1063/1.474310}
Can add restraints (i.e. a spring) and constraints (i.e. motion
may only be on a plane).
SourceFiles
sixDoFRigidBodyMotionI.H
sixDoFRigidBodyMotion.C
@ -55,6 +58,9 @@ SourceFiles
#include "sixDoFRigidBodyMotionState.H"
#include "pointField.H"
#include "sixDoFRigidBodyMotionRestraint.H"
#include "sixDoFRigidBodyMotionConstraint.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -79,18 +85,41 @@ class sixDoFRigidBodyMotion
{
// Private data
// state data object
//- Motion state data object
sixDoFRigidBodyMotionState motionState_;
//- Centre of mass of reference state
point refCentreOfMass_;
//- Restraints on the motion
PtrList<sixDoFRigidBodyMotionRestraint> restraints_;
//- Names of the restraints
wordList restraintNames_;
//- Constaints on the motion
PtrList<sixDoFRigidBodyMotionConstraint> constraints_;
//- Names of the constraints
wordList constraintNames_;
//- Maximum number of iterations allowed to attempt to obey
// constraints
label maxConstraintIterations_;
//- Centre of mass of initial state
point initialCentreOfMass_;
//- Orientation of initial state
tensor initialQ_;
//- Moment of inertia of the body in reference configuration
// (Q = I)
diagTensor momentOfInertia_;
//- Mass of the body
scalar mass_;
//- Switch to turn reporting of motion data on and off
Switch report_;
// Private Member Functions
@ -106,78 +135,46 @@ class sixDoFRigidBodyMotion
// frame z-axis by the given angle
inline tensor rotationTensorZ(scalar deltaT) const;
//- Apply rotation tensors to Q for the given torque (pi) and deltaT
inline void rotate(tensor& Q, vector& pi, scalar deltaT) const;
public:
//- Apply the restraints to the object
void applyRestraints();
// Constructors
//- Apply the constraints to the object
void applyConstraints(scalar deltaT);
//- Construct null
sixDoFRigidBodyMotion();
//- Construct from components
sixDoFRigidBodyMotion
(
const point& centreOfMass,
const tensor& Q,
const vector& v,
const vector& a,
const vector& pi,
const vector& tau,
scalar mass,
const point& refCentreOfMass,
const diagTensor& momentOfInertia
);
//- Construct from dictionary
sixDoFRigidBodyMotion(const dictionary& dict);
//- Construct as copy
sixDoFRigidBodyMotion(const sixDoFRigidBodyMotion&);
//- Destructor
~sixDoFRigidBodyMotion();
// Member Functions
void updatePosition
(
scalar deltaT
);
void updateForce
(
const vector& fGlobal,
const vector& tauGlobal,
scalar deltaT
);
void updateForce
(
const pointField& positions,
const vectorField& forces,
scalar deltaT
);
tmp<pointField> generatePositions(const pointField& pts) const;
// Access functions retained as private because of the risk of
// confusion over what is a body local frame vector and what is global
// Access
//- Return access to the motion state
inline const sixDoFRigidBodyMotionState& motionState() const;
//- Return access to the centre of mass
inline const point& centreOfMass() const;
//- Return access to the restraints
inline const PtrList<sixDoFRigidBodyMotionRestraint>&
restraints() const;
//- Return access to the centre of mass
inline const point& refCentreOfMass() const;
//- Return access to the restraintNames
inline const wordList& restraintNames() const;
//- Return access to the inertia tensor
inline const diagTensor& momentOfInertia() const;
//- Return access to the constraints
inline const PtrList<sixDoFRigidBodyMotionConstraint>&
constraints() const;
//- Return access to the mass
inline scalar mass() const;
//- Return access to the constraintNames
inline const wordList& constraintNames() const;
//- Return access to the maximum allowed number of
// constraint iterations
inline label maxConstraintIterations() const;
//- Return access to the initial centre of mass
inline const point& initialCentreOfMass() const;
//- Return access to the initial orientation
inline const tensor& initialQ() const;
//- Return access to the orientation
inline const tensor& Q() const;
@ -197,17 +194,11 @@ public:
// Edit
//- Return non-const access to the centre of mass
inline point& centreOfMass();
//- Return access to the centre of mass
inline point& initialCentreOfMass();
//- Return access to the centre of mass
inline point& refCentreOfMass();
//- Return non-const access to the inertia tensor
inline diagTensor& momentOfInertia();
//- Return non-const access to the mass
inline scalar& mass();
inline tensor& initialQ();
//- Return non-const access to the orientation
inline tensor& Q();
@ -225,6 +216,154 @@ public:
inline vector& tau();
public:
// Constructors
//- Construct null
sixDoFRigidBodyMotion();
//- Construct from components
sixDoFRigidBodyMotion
(
const point& centreOfMass,
const tensor& Q,
const vector& v,
const vector& a,
const vector& pi,
const vector& tau,
scalar mass,
const point& initialCentreOfMass,
const tensor& initialQ,
const diagTensor& momentOfInertia,
bool report = false
);
//- Construct from dictionary
sixDoFRigidBodyMotion(const dictionary& dict);
//- Construct as copy
sixDoFRigidBodyMotion(const sixDoFRigidBodyMotion&);
//- Destructor
~sixDoFRigidBodyMotion();
// Member Functions
//- Add restraints to the motion, public to allow external
// addition of restraints after construction
void addRestraints(const dictionary& dict);
//- Add restraints to the motion, public to allow external
// addition of restraints after construction
void addConstraints(const dictionary& dict);
//- First leapfrog velocity adjust and motion part, required
// before force calculation
void updatePosition
(
scalar deltaT
);
//- Second leapfrog velocity adjust part, required after motion and
// force calculation
void updateForce
(
const vector& fGlobal,
const vector& tauGlobal,
scalar deltaT
);
//- Global forces supplied at locations, calculating net force
// and moment
void updateForce
(
const pointField& positions,
const vectorField& forces,
scalar deltaT
);
//- Transform the given initial state pointField by the current
// motion state
inline tmp<pointField> currentPosition
(
const pointField& pInitial
) const;
//- Transform the given initial state point by the current motion
// state
inline point currentPosition(const point& pInitial) const;
//- Transform the given initial state direction by the current
// motion state
inline vector currentOrientation(const vector& vInitial) const;
//- Access the orientation tensor, Q.
// globalVector = Q & bodyLocalVector
// bodyLocalVector = Q.T() & globalVector
inline const tensor& orientation() const;
//- Predict the position of the supplied initial state point
// after deltaT given the current motion state and the
// additional supplied force and moment
point predictedPosition
(
const point& pInitial,
const vector& deltaForce,
const vector& deltaMoment,
scalar deltaT
) const;
//- Predict the orientation of the supplied initial state
// vector after deltaT given the current motion state and the
// additional supplied moment
vector predictedOrientation
(
const vector& vInitial,
const vector& deltaMoment,
scalar deltaT
) const;
//- Return the angular velocity in the global frame
inline vector omega() const;
//- Return the velocity of a position given by the current
// motion state
inline point currentVelocity(const point& pt) const;
//- Report the status of the motion
void status() const;
// Access
//- Return const access to the centre of mass
inline const point& centreOfMass() const;
//- Return access to the inertia tensor
inline const diagTensor& momentOfInertia() const;
//- Return const access to the mass
inline scalar mass() const;
//- Return the report Switch
inline bool report() const;
// Edit
//- Return non-const access to the centre of mass
inline point& centreOfMass();
//- Return non-const access to the inertia tensor
inline diagTensor& momentOfInertia();
//- Return non-const access to the mass
inline scalar& mass();
//- Write
void write(Ostream&) const;

View File

@ -0,0 +1,187 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "fixedAxis.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
defineTypeNameAndDebug(fixedAxis, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionConstraint,
fixedAxis,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::fixedAxis
(
const dictionary& sDoFRBMCDict
)
:
sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
fixedAxis_()
{
read(sDoFRBMCDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::~fixedAxis()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
bool Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const
{
constraintMomentIncrement = vector::zero;
vector predictedDir = motion.predictedOrientation
(
fixedAxis_,
existingConstraintMoment,
deltaT
);
scalar theta = acos(min(predictedDir & fixedAxis_, 1.0));
vector rotationAxis = fixedAxis_ ^ predictedDir;
scalar magRotationAxis = mag(rotationAxis);
if (magRotationAxis > VSMALL)
{
rotationAxis /= magRotationAxis;
const tensor& Q = motion.orientation();
// Transform rotationAxis to body local system
rotationAxis = Q.T() & rotationAxis;
constraintMomentIncrement =
-relaxationFactor_
*(motion.momentOfInertia() & rotationAxis)
*theta/sqr(deltaT);
// Transform moment increment to global system
constraintMomentIncrement = Q & constraintMomentIncrement;
// Remove any moment that is around the fixedAxis_
constraintMomentIncrement -=
(constraintMomentIncrement & fixedAxis_)*fixedAxis_;
}
constraintPosition = motion.centreOfMass();
constraintForceIncrement = vector::zero;
bool converged(mag(theta) < tolerance_);
if (motion.report())
{
Info<< " angle " << theta
<< " force " << constraintForceIncrement
<< " moment " << constraintMomentIncrement;
if (converged)
{
Info<< " converged";
}
else
{
Info<< " not converged";
}
Info<< endl;
}
return converged;
}
bool Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::read
(
const dictionary& sDoFRBMCDict
)
{
sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
sDoFRBMCCoeffs_.lookup("axis") >> fixedAxis_;
scalar magFixedAxis(mag(fixedAxis_));
if (magFixedAxis > VSMALL)
{
fixedAxis_ /= magFixedAxis;
}
else
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::read"
"("
"const dictionary& sDoFRBMCDict"
")"
)
<< "axis has zero length"
<< abort(FatalError);
}
return true;
}
void Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::write
(
Ostream& os
) const
{
os.writeKeyword("axis")
<< fixedAxis_ << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,129 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionConstraints::fixedAxis
Description
sixDoFRigidBodyMotionConstraint. Axis of body fixed global
space.
SourceFiles
fixedAxis.C
\*---------------------------------------------------------------------------*/
#ifndef fixedAxis_H
#define fixedAxis_H
#include "sixDoFRigidBodyMotionConstraint.H"
#include "point.H"
#include "tensor.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
/*---------------------------------------------------------------------------*\
Class fixedAxis Declaration
\*---------------------------------------------------------------------------*/
class fixedAxis
:
public sixDoFRigidBodyMotionConstraint
{
// Private data
//- Reference axis in global space
vector fixedAxis_;
public:
//- Runtime type information
TypeName("fixedAxis");
// Constructors
//- Construct from components
fixedAxis
(
const dictionary& sDoFRBMCDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionConstraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionConstraint>
(
new fixedAxis(*this)
);
}
// Destructor
virtual ~fixedAxis();
// Member Functions
//- Calculate the constraint position, force and moment.
// Global reference frame vectors. Returns boolean stating
// whether the constraint been converged to tolerance.
virtual bool constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMCCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,178 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "fixedLine.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
defineTypeNameAndDebug(fixedLine, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionConstraint,
fixedLine,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedLine::fixedLine
(
const dictionary& sDoFRBMCDict
)
:
sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
refPt_(),
dir_()
{
read(sDoFRBMCDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedLine::~fixedLine()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
bool Foam::sixDoFRigidBodyMotionConstraints::fixedLine::constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const
{
point predictedPosition = motion.predictedPosition
(
refPt_,
existingConstraintForce,
existingConstraintMoment,
deltaT
);
constraintPosition = motion.currentPosition(refPt_);
// Info<< "current position " << constraintPosition << nl
// << "next predictedPosition " << predictedPosition
// << endl;
// Vector from reference point to predicted point
vector rC = predictedPosition - refPt_;
vector error = rC - ((rC) & dir_)*dir_;
// Info<< "error " << error << endl;
constraintForceIncrement =
-relaxationFactor_*error*motion.mass()/sqr(deltaT);
constraintMomentIncrement = vector::zero;
bool converged(mag(error) < tolerance_);
if (motion.report())
{
Info<< " error " << error
<< " force " << constraintForceIncrement
<< " moment " << constraintMomentIncrement;
if (converged)
{
Info<< " converged";
}
else
{
Info<< " not converged";
}
Info<< endl;
}
return converged;
}
bool Foam::sixDoFRigidBodyMotionConstraints::fixedLine::read
(
const dictionary& sDoFRBMCDict
)
{
sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
sDoFRBMCCoeffs_.lookup("refPoint") >> refPt_;
sDoFRBMCCoeffs_.lookup("direction") >> dir_;
scalar magDir(mag(dir_));
if (magDir > VSMALL)
{
dir_ /= magDir;
}
else
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionConstraints::fixedLine::read"
"("
"const dictionary& sDoFRBMCDict"
")"
)
<< "line direction has zero length"
<< abort(FatalError);
}
return true;
}
void Foam::sixDoFRigidBodyMotionConstraints::fixedLine::write
(
Ostream& os
) const
{
os.writeKeyword("refPoint")
<< refPt_ << token::END_STATEMENT << nl;
os.writeKeyword("direction")
<< dir_ << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,130 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionConstraints::fixedLine
Description
sixDoFRigidBodyMotionConstraint. Reference point may only move
along a line.
SourceFiles
fixedLine.C
\*---------------------------------------------------------------------------*/
#ifndef fixedLine_H
#define fixedLine_H
#include "sixDoFRigidBodyMotionConstraint.H"
#include "point.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
/*---------------------------------------------------------------------------*\
Class fixedLine Declaration
\*---------------------------------------------------------------------------*/
class fixedLine
:
public sixDoFRigidBodyMotionConstraint
{
// Private data
//- Reference point for the constraining line
point refPt_;
//- Direction of the constraining line
vector dir_;
public:
//- Runtime type information
TypeName("fixedLine");
// Constructors
//- Construct from components
fixedLine
(
const dictionary& sDoFRBMCDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionConstraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionConstraint>
(
new fixedLine(*this)
);
}
// Destructor
virtual ~fixedLine();
// Member Functions
//- Calculate the constraint position, force and moment.
// Global reference frame vectors. Returns boolean stating
// whether the constraint been converged to tolerance.
virtual bool constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMCCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,186 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "fixedOrientation.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
defineTypeNameAndDebug(fixedOrientation, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionConstraint,
fixedOrientation,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::fixedOrientation
(
const dictionary& sDoFRBMCDict
)
:
sixDoFRigidBodyMotionConstraint(sDoFRBMCDict)
{
read(sDoFRBMCDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::~fixedOrientation()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
bool Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const
{
constraintMomentIncrement = vector::zero;
scalar maxTheta = -SMALL;
for (direction cmpt=0; cmpt<vector::nComponents; cmpt++)
{
vector axis = vector::zero;
axis[cmpt] = 1;
vector refDir = vector::zero;
refDir[(cmpt + 1) % 3] = 1;
vector predictedDir = motion.predictedOrientation
(
refDir,
existingConstraintMoment,
deltaT
);
// Removing any axis component from predictedDir
predictedDir -= (axis & predictedDir)*axis;
scalar theta = GREAT;
scalar magPredictedDir = mag(predictedDir);
if (magPredictedDir > VSMALL)
{
predictedDir /= magPredictedDir;
theta = acos(min(predictedDir & refDir, 1.0));
// Recalculating axis to give correct sign to angle
axis = (refDir ^ predictedDir);
scalar magAxis = mag(axis);
if (magAxis > VSMALL)
{
axis /= magAxis;
}
else
{
axis = vector::zero;
}
}
if (theta > maxTheta)
{
maxTheta = theta;
}
constraintMomentIncrement +=
-relaxationFactor_
*theta*axis
*motion.momentOfInertia()[cmpt]/sqr(deltaT);
}
constraintPosition = motion.centreOfMass();
constraintForceIncrement = vector::zero;
bool converged(mag(maxTheta) < tolerance_);
if (motion.report())
{
Info<< " max angle " << maxTheta
<< " force " << constraintForceIncrement
<< " moment " << constraintMomentIncrement;
if (converged)
{
Info<< " converged";
}
else
{
Info<< " not converged";
}
Info<< endl;
}
return converged;
}
bool Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::read
(
const dictionary& sDoFRBMCDict
)
{
sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
return true;
}
void Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::write
(
Ostream& os
) const
{
}
// ************************************************************************* //

View File

@ -0,0 +1,124 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionConstraints::fixedOrientation
Description
sixDoFRigidBodyMotionConstraint. Orientation of body fixed global
space. Only valid where the predicted deviation from alignment is
< 90 degrees.
SourceFiles
fixedOrientation.C
\*---------------------------------------------------------------------------*/
#ifndef fixedOrientation_H
#define fixedOrientation_H
#include "sixDoFRigidBodyMotionConstraint.H"
#include "point.H"
#include "tensor.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
/*---------------------------------------------------------------------------*\
Class fixedOrientation Declaration
\*---------------------------------------------------------------------------*/
class fixedOrientation
:
public sixDoFRigidBodyMotionConstraint
{
public:
//- Runtime type information
TypeName("fixedOrientation");
// Constructors
//- Construct from components
fixedOrientation
(
const dictionary& sDoFRBMCDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionConstraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionConstraint>
(
new fixedOrientation(*this)
);
}
// Destructor
virtual ~fixedOrientation();
// Member Functions
//- Calculate the constraint position, force and moment.
// Global reference frame vectors. Returns boolean stating
// whether the constraint been converged to tolerance.
virtual bool constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMCCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,161 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "fixedPlane.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
defineTypeNameAndDebug(fixedPlane, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionConstraint,
fixedPlane,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::fixedPlane
(
const dictionary& sDoFRBMCDict
)
:
sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
fixedPlane_(vector::one)
{
read(sDoFRBMCDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::~fixedPlane()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
bool Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const
{
const point& refPt = fixedPlane_.refPoint();
const vector& n = fixedPlane_.normal();
point predictedPosition = motion.predictedPosition
(
refPt,
existingConstraintForce,
existingConstraintMoment,
deltaT
);
constraintPosition = motion.currentPosition(refPt);
// Info<< "current position " << constraintPosition << nl
// << "next predictedPosition " << predictedPosition
// << endl;
vector error = ((predictedPosition - refPt) & n)*n;
// Info<< "error " << error << endl;
constraintForceIncrement =
-relaxationFactor_*error*motion.mass()/sqr(deltaT);
constraintMomentIncrement = vector::zero;
bool converged(mag(error) < tolerance_);
if (motion.report())
{
Info<< " error " << error
<< " force " << constraintForceIncrement
<< " moment " << constraintMomentIncrement;
if (converged)
{
Info<< " converged";
}
else
{
Info<< " not converged";
}
Info<< endl;
}
return converged;
}
bool Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::read
(
const dictionary& sDoFRBMCDict
)
{
sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
point refPt = sDoFRBMCCoeffs_.lookup("refPoint");
vector normal = sDoFRBMCCoeffs_.lookup("normal");
fixedPlane_ = plane(refPt, normal);
return true;
}
void Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::write
(
Ostream& os
) const
{
os.writeKeyword("refPoint")
<< fixedPlane_.refPoint() << token::END_STATEMENT << nl;
os.writeKeyword("normal")
<< fixedPlane_.normal() << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,128 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionConstraints::fixedPlane
Description
sixDoFRigidBodyMotionConstraint. Reference point may only move
along a plane.
SourceFiles
fixedPlane.C
\*---------------------------------------------------------------------------*/
#ifndef fixedPlane_H
#define fixedPlane_H
#include "sixDoFRigidBodyMotionConstraint.H"
#include "plane.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
/*---------------------------------------------------------------------------*\
Class fixedPlane Declaration
\*---------------------------------------------------------------------------*/
class fixedPlane
:
public sixDoFRigidBodyMotionConstraint
{
// Private data
//- Plane which the transformed reference point is constrained
// to move along
plane fixedPlane_;
public:
//- Runtime type information
TypeName("fixedPlane");
// Constructors
//- Construct from components
fixedPlane
(
const dictionary& sDoFRBMCDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionConstraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionConstraint>
(
new fixedPlane(*this)
);
}
// Destructor
virtual ~fixedPlane();
// Member Functions
//- Calculate the constraint position, force and moment.
// Global reference frame vectors. Returns boolean stating
// whether the constraint been converged to tolerance.
virtual bool constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMCCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,163 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "fixedPoint.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
defineTypeNameAndDebug(fixedPoint, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionConstraint,
fixedPoint,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::fixedPoint
(
const dictionary& sDoFRBMCDict
)
:
sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
fixedPoint_()
{
read(sDoFRBMCDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::~fixedPoint()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
bool Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const
{
point predictedPosition = motion.predictedPosition
(
fixedPoint_,
existingConstraintForce,
existingConstraintMoment,
deltaT
);
constraintPosition = motion.currentPosition(fixedPoint_);
// Info<< "current position " << constraintPosition << nl
// << "next predictedPosition " << predictedPosition
// << endl;
vector error = predictedPosition - fixedPoint_;
// Info<< "error " << error << endl;
// Correction force derived from Lagrange multiplier:
// G = -lambda*grad(sigma)
// where
// sigma = mag(error) = 0
// so
// grad(sigma) = error/mag(error)
// Solving for lambda using the SHAKE methodology gives
// lambda = mass*mag(error)/sqr(deltaT)
// This is only strictly applicable (i.e. will converge in one
// iteration) to constraints at the centre of mass. Everything
// else will need to iterate, and may need under-relaxed to be
// stable.
constraintForceIncrement =
-relaxationFactor_*error*motion.mass()/sqr(deltaT);
constraintMomentIncrement = vector::zero;
bool converged(mag(error) < tolerance_);
if (motion.report())
{
Info<< " error " << error
<< " force " << constraintForceIncrement
<< " moment " << constraintMomentIncrement;
if (converged)
{
Info<< " converged";
}
else
{
Info<< " not converged";
}
Info<< endl;
}
return converged;
}
bool Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::read
(
const dictionary& sDoFRBMCDict
)
{
sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
sDoFRBMCCoeffs_.lookup("fixedPoint") >> fixedPoint_;
return true;
}
void Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::write
(
Ostream& os
) const
{
os.writeKeyword("fixedPoint")
<< fixedPoint_ << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,129 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionConstraints::fixedPoint
Description
sixDoFRigidBodyMotionConstraint. Point fixed in space.
SourceFiles
fixedPoint.C
\*---------------------------------------------------------------------------*/
#ifndef fixedPoint_H
#define fixedPoint_H
#include "sixDoFRigidBodyMotionConstraint.H"
#include "point.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionConstraints
{
/*---------------------------------------------------------------------------*\
Class fixedPoint Declaration
\*---------------------------------------------------------------------------*/
class fixedPoint
:
public sixDoFRigidBodyMotionConstraint
{
// Private data
//- Point which is rigidly attached to the body and constrains
// it so that this point remains fixed. This serves as the
// reference point for displacements as well as the target
// position.
point fixedPoint_;
public:
//- Runtime type information
TypeName("fixedPoint");
// Constructors
//- Construct from components
fixedPoint
(
const dictionary& sDoFRBMCDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionConstraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionConstraint>
(
new fixedPoint(*this)
);
}
// Destructor
virtual ~fixedPoint();
// Member Functions
//- Calculate the constraint position, force and moment.
// Global reference frame vectors. Returns boolean stating
// whether the constraint been converged to tolerance.
virtual bool constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMCCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,65 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "sixDoFRigidBodyMotionConstraint.H"
// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
Foam::autoPtr<Foam::sixDoFRigidBodyMotionConstraint>
Foam::sixDoFRigidBodyMotionConstraint::New(const dictionary& sDoFRBMCDict)
{
word sixDoFRigidBodyMotionConstraintTypeName =
sDoFRBMCDict.lookup("sixDoFRigidBodyMotionConstraint");
// Info<< "Selecting sixDoFRigidBodyMotionConstraint function "
// << sixDoFRigidBodyMotionConstraintTypeName << endl;
dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find
(
sixDoFRigidBodyMotionConstraintTypeName
);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalErrorIn
(
"sixDoFRigidBodyMotionConstraint::New"
"("
"const dictionary& sDoFRBMCDict"
")"
) << "Unknown sixDoFRigidBodyMotionConstraint type "
<< sixDoFRigidBodyMotionConstraintTypeName << endl << endl
<< "Valid sixDoFRigidBodyMotionConstraints are : " << endl
<< dictionaryConstructorTablePtr_->sortedToc()
<< exit(FatalError);
}
return autoPtr<sixDoFRigidBodyMotionConstraint>(cstrIter()(sDoFRBMCDict));
}
// ************************************************************************* //

View File

@ -0,0 +1,94 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "sixDoFRigidBodyMotionConstraint.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(Foam::sixDoFRigidBodyMotionConstraint, 0);
defineRunTimeSelectionTable(Foam::sixDoFRigidBodyMotionConstraint, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraint::sixDoFRigidBodyMotionConstraint
(
const dictionary& sDoFRBMCDict
)
:
sDoFRBMCCoeffs_
(
sDoFRBMCDict.subDict
(
word(sDoFRBMCDict.lookup("sixDoFRigidBodyMotionConstraint"))
+ "Coeffs"
)
),
tolerance_(readScalar(sDoFRBMCDict.lookup("tolerance"))),
relaxationFactor_
(
sDoFRBMCDict.lookupOrDefault<scalar>("relaxationFactor", 1)
)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionConstraint::~sixDoFRigidBodyMotionConstraint()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
bool Foam::sixDoFRigidBodyMotionConstraint::read
(
const dictionary& sDoFRBMCDict
)
{
tolerance_ = (readScalar(sDoFRBMCDict.lookup("tolerance")));
relaxationFactor_ = sDoFRBMCDict.lookupOrDefault<scalar>
(
"relaxationFactor",
1
);
sDoFRBMCCoeffs_ = sDoFRBMCDict.subDict(type() + "Coeffs");
return true;
}
void Foam::sixDoFRigidBodyMotionConstraint::write(Ostream& os) const
{
os.writeKeyword("tolerance")
<< tolerance_ << token::END_STATEMENT << nl;
os.writeKeyword("relaxationFactor")
<< relaxationFactor_ << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,180 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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
Namespace
Foam::sixDoFRigidBodyMotionConstraints
Description
Namespace for six DoF motion constraints
Class
Foam::sixDoFRigidBodyMotionConstraint
Description
Base class for defining constraints for sixDoF motions
SourceFiles
sixDoFRigidBodyMotionConstraint.C
newDynamicFvMesh.C
\*---------------------------------------------------------------------------*/
#ifndef sixDoFRigidBodyMotionConstraint_H
#define sixDoFRigidBodyMotionConstraint_H
#include "Time.H"
#include "dictionary.H"
#include "autoPtr.H"
#include "vector.H"
#include "runTimeSelectionTables.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
class sixDoFRigidBodyMotion;
/*---------------------------------------------------------------------------*\
Class sixDoFRigidBodyMotionConstraint Declaration
\*---------------------------------------------------------------------------*/
class sixDoFRigidBodyMotionConstraint
{
protected:
// Protected data
//- Constraint model specific coefficient dictionary
dictionary sDoFRBMCCoeffs_;
//- Solution tolerance. Meaning depends on model, usually an
// absolute distance or angle.
scalar tolerance_;
//- Relaxation factor for solution, default to one
scalar relaxationFactor_;
public:
//- Runtime type information
TypeName("sixDoFRigidBodyMotionConstraint");
// Declare run-time constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
sixDoFRigidBodyMotionConstraint,
dictionary,
(const dictionary& sDoFRBMCDict),
(sDoFRBMCDict)
);
// Constructors
//- Construct from the sDoFRBMCDict dictionary and Time
sixDoFRigidBodyMotionConstraint
(
const dictionary& sDoFRBMCDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionConstraint> clone() const = 0;
// Selectors
//- Select constructed from the sDoFRBMCDict dictionary and Time
static autoPtr<sixDoFRigidBodyMotionConstraint> New
(
const dictionary& sDoFRBMCDict
);
// Destructor
virtual ~sixDoFRigidBodyMotionConstraint();
// Member Functions
//- Calculate the constraint position, force and moment.
// Global reference frame vectors. Returns boolean stating
// whether the constraint been converged to tolerance.
virtual bool constrain
(
const sixDoFRigidBodyMotion& motion,
const vector& existingConstraintForce,
const vector& existingConstraintMoment,
scalar deltaT,
vector& constraintPosition,
vector& constraintForceIncrement,
vector& constraintMomentIncrement
) const = 0;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMCDict);
// Access
// Return access to sDoFRBMCCoeffs
inline const dictionary& coeffDict() const
{
return sDoFRBMCCoeffs_;
}
//- Return access to the tolerance
inline scalar tolerance() const
{
return tolerance_;
}
//- Return access to the relaxationFactor
inline scalar relaxationFactor() const
{
return relaxationFactor_;
}
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -24,8 +24,6 @@ License
\*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
inline Foam::tensor
@ -64,6 +62,37 @@ Foam::sixDoFRigidBodyMotion::rotationTensorZ(scalar phi) const
}
inline void Foam::sixDoFRigidBodyMotion::rotate
(
tensor& Q,
vector& pi,
scalar deltaT
) const
{
tensor 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 = 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 = rotationTensorX(0.5*deltaT*pi.x()/momentOfInertia_.xx());
pi = pi & R;
Q = Q & R;
}
inline const Foam::sixDoFRigidBodyMotionState&
Foam::sixDoFRigidBodyMotion::motionState() const
{
@ -71,28 +100,50 @@ Foam::sixDoFRigidBodyMotion::motionState() const
}
inline const Foam::point& Foam::sixDoFRigidBodyMotion::centreOfMass() const
inline const Foam::PtrList<Foam::sixDoFRigidBodyMotionRestraint>&
Foam::sixDoFRigidBodyMotion::restraints() const
{
return motionState_.centreOfMass();
return restraints_;
}
inline const Foam::point& Foam::sixDoFRigidBodyMotion::refCentreOfMass() const
inline const Foam::wordList& Foam::sixDoFRigidBodyMotion::restraintNames() const
{
return refCentreOfMass_;
return restraintNames_;
}
inline const Foam::diagTensor&
Foam::sixDoFRigidBodyMotion::momentOfInertia() const
inline const Foam::PtrList<Foam::sixDoFRigidBodyMotionConstraint>&
Foam::sixDoFRigidBodyMotion::constraints() const
{
return momentOfInertia_;
return constraints_;
}
inline Foam::scalar Foam::sixDoFRigidBodyMotion::mass() const
inline const Foam::wordList&
Foam::sixDoFRigidBodyMotion::constraintNames() const
{
return mass_;
return constraintNames_;
}
inline Foam::label Foam::sixDoFRigidBodyMotion::maxConstraintIterations() const
{
return maxConstraintIterations_;
}
inline const Foam::point&
Foam::sixDoFRigidBodyMotion::initialCentreOfMass() const
{
return initialCentreOfMass_;
}
inline const Foam::tensor&
Foam::sixDoFRigidBodyMotion::initialQ() const
{
return initialQ_;
}
@ -126,27 +177,15 @@ inline const Foam::vector& Foam::sixDoFRigidBodyMotion::tau() const
}
inline Foam::point& Foam::sixDoFRigidBodyMotion::centreOfMass()
inline Foam::point& Foam::sixDoFRigidBodyMotion::initialCentreOfMass()
{
return motionState_.centreOfMass();
return initialCentreOfMass_;
}
inline Foam::point& Foam::sixDoFRigidBodyMotion::refCentreOfMass()
inline Foam::tensor& Foam::sixDoFRigidBodyMotion::initialQ()
{
return refCentreOfMass_;
}
inline Foam::diagTensor& Foam::sixDoFRigidBodyMotion::momentOfInertia()
{
return momentOfInertia_;
}
inline Foam::scalar& Foam::sixDoFRigidBodyMotion::mass()
{
return mass_;
return initialQ_;
}
@ -180,4 +219,103 @@ inline Foam::vector& Foam::sixDoFRigidBodyMotion::tau()
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
inline Foam::tmp<Foam::pointField>
Foam::sixDoFRigidBodyMotion::currentPosition(const pointField& pInitial) const
{
return
(
centreOfMass()
+ (Q() & initialQ_.T() & (pInitial - initialCentreOfMass_)))
;
}
inline Foam::point Foam::sixDoFRigidBodyMotion::currentPosition
(
const point& pInitial
) const
{
return
(
centreOfMass()
+ (Q() & initialQ_.T() & (pInitial - initialCentreOfMass_))
);
}
inline Foam::vector Foam::sixDoFRigidBodyMotion::currentOrientation
(
const vector& vInitial
) const
{
return (Q() & initialQ_.T() & vInitial);
}
inline const Foam::tensor&
Foam::sixDoFRigidBodyMotion::orientation() const
{
return Q();
}
inline Foam::vector Foam::sixDoFRigidBodyMotion::omega() const
{
return Q() & (inv(momentOfInertia_) & pi());
}
inline Foam::point Foam::sixDoFRigidBodyMotion::currentVelocity
(
const point& pt
) const
{
return (omega() ^ (pt - centreOfMass())) + v();
}
inline const Foam::point& Foam::sixDoFRigidBodyMotion::centreOfMass() const
{
return motionState_.centreOfMass();
}
inline const Foam::diagTensor&
Foam::sixDoFRigidBodyMotion::momentOfInertia() const
{
return momentOfInertia_;
}
inline Foam::scalar Foam::sixDoFRigidBodyMotion::mass() const
{
return mass_;
}
inline bool Foam::sixDoFRigidBodyMotion::report() const
{
return report_;
}
inline Foam::point& Foam::sixDoFRigidBodyMotion::centreOfMass()
{
return motionState_.centreOfMass();
}
inline Foam::diagTensor& Foam::sixDoFRigidBodyMotion::momentOfInertia()
{
return momentOfInertia_;
}
inline Foam::scalar& Foam::sixDoFRigidBodyMotion::mass()
{
return mass_;
}
// ************************************************************************* //

View File

@ -33,12 +33,79 @@ void Foam::sixDoFRigidBodyMotion::write(Ostream& os) const
{
motionState_.write(os);
os.writeKeyword("refCentreOfMass")
<< refCentreOfMass_ << token::END_STATEMENT << nl;
os.writeKeyword("initialCentreOfMass")
<< initialCentreOfMass_ << token::END_STATEMENT << nl;
os.writeKeyword("initialOrientation")
<< initialQ_ << token::END_STATEMENT << nl;
os.writeKeyword("momentOfInertia")
<< momentOfInertia_ << token::END_STATEMENT << nl;
os.writeKeyword("mass")
<< mass_ << token::END_STATEMENT << nl;
os.writeKeyword("report")
<< report_ << token::END_STATEMENT << nl;
if (!restraints_.empty())
{
os << indent << "restraints" << nl
<< indent << token::BEGIN_BLOCK << incrIndent << nl;
forAll(restraints_, rI)
{
word restraintType = restraints_[rI].type();
os << indent << restraintNames_[rI] << nl
<< indent << token::BEGIN_BLOCK << incrIndent << endl;
os.writeKeyword("sixDoFRigidBodyMotionRestraint")
<< restraintType << token::END_STATEMENT << nl;
os.writeKeyword(word(restraintType + "Coeffs")) << nl;
os << indent << token::BEGIN_BLOCK << nl << incrIndent;
restraints_[rI].write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
os << decrIndent << indent << token::END_BLOCK << endl;
}
os << decrIndent << indent << token::END_BLOCK << nl;
}
if (!constraints_.empty())
{
os << indent << "constraints" << nl
<< indent << token::BEGIN_BLOCK << incrIndent << nl;
os.writeKeyword("maxIterations")
<< maxConstraintIterations_ << token::END_STATEMENT << nl;
forAll(constraints_, rI)
{
word constraintType = constraints_[rI].type();
os << indent << constraintNames_[rI] << nl
<< indent << token::BEGIN_BLOCK << incrIndent << endl;
os.writeKeyword("sixDoFRigidBodyMotionConstraint")
<< constraintType << token::END_STATEMENT << nl;
constraints_[rI].sixDoFRigidBodyMotionConstraint::write(os);
os.writeKeyword(word(constraintType + "Coeffs")) << nl;
os << indent << token::BEGIN_BLOCK << nl << incrIndent;
constraints_[rI].write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
os << decrIndent << indent << token::END_BLOCK << endl;
}
os << decrIndent << indent << token::END_BLOCK << nl;
}
}
@ -47,7 +114,8 @@ void Foam::sixDoFRigidBodyMotion::write(Ostream& os) const
Foam::Istream& Foam::operator>>(Istream& is, sixDoFRigidBodyMotion& sDoFRBM)
{
is >> sDoFRBM.motionState_
>> sDoFRBM.refCentreOfMass_
>> sDoFRBM.initialCentreOfMass_
>> sDoFRBM.initialQ_
>> sDoFRBM.momentOfInertia_
>> sDoFRBM.mass_;
@ -69,9 +137,10 @@ Foam::Ostream& Foam::operator<<
)
{
os << sDoFRBM.motionState()
<< token::SPACE << sDoFRBM.refCentreOfMass()
<< token::SPACE << sDoFRBM.initialCentreOfMass()
<< token::SPACE << sDoFRBM.initialQ()
<< token::SPACE << sDoFRBM.momentOfInertia()
<< token::SPACE << sDoFRBM.mass() ;
<< token::SPACE << sDoFRBM.mass();
// Check state of Ostream
os.check

View File

@ -0,0 +1,220 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "linearAxialAngularSpring.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
#include "transform.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
defineTypeNameAndDebug(linearAxialAngularSpring, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionRestraint,
linearAxialAngularSpring,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::
linearAxialAngularSpring
(
const dictionary& sDoFRBMRDict
)
:
sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
refQ_(),
axis_(),
stiffness_(),
damping_()
{
read(sDoFRBMRDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::
~linearAxialAngularSpring()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void
Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const
{
vector refDir = rotationTensor(vector(1, 0 ,0), axis_) & vector(0, 1, 0);
vector oldDir = refQ_ & refDir;
vector newDir = motion.orientation() & refDir;
if (mag(oldDir & axis_) > 0.95 || mag(newDir & axis_) > 0.95)
{
// Directions getting close to the axis, change reference
refDir = rotationTensor(vector(1, 0 ,0), axis_) & vector(0, 0, 1);
vector oldDir = refQ_ & refDir;
vector newDir = motion.orientation() & refDir;
}
// Removing any axis component from oldDir and newDir and normalising
oldDir -= (axis_ & oldDir)*axis_;
oldDir /= mag(oldDir);
newDir -= (axis_ & newDir)*axis_;
newDir /= mag(newDir);
scalar theta = mag(acos(min(oldDir & newDir, 1.0)));
// Temporary axis with sign information.
vector a = (oldDir ^ newDir);
// Remove any component that is not along axis that may creep in
a = (a & axis_)*axis_;
scalar magA = mag(a);
if (magA > VSMALL)
{
a /= magA;
}
else
{
a = vector::zero;
}
// Damping of along axis angular velocity only
restraintMoment = -stiffness_*theta*a - damping_*(motion.omega() & a)*a;
restraintForce = vector::zero;
// Not needed to be altered as restraintForce is zero, but set to
// centreOfMass to be sure of no spurious moment
restraintPosition = motion.centreOfMass();
if (motion.report())
{
Info<< " angle " << theta
<< " force " << restraintForce
<< " moment " << restraintMoment
<< endl;
}
}
bool Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::read
(
const dictionary& sDoFRBMRDict
)
{
sixDoFRigidBodyMotionRestraint::read(sDoFRBMRDict);
refQ_ = sDoFRBMRCoeffs_.lookupOrDefault<tensor>("referenceOrientation", I);
if (mag(mag(refQ_) - sqrt(3.0)) > 1e-9)
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::"
"read"
"("
"const dictionary& sDoFRBMRDict"
")"
)
<< "referenceOrientation " << refQ_ << " is not a rotation tensor. "
<< "mag(referenceOrientation) - sqrt(3) = "
<< mag(refQ_) - sqrt(3.0) << nl
<< exit(FatalError);
}
axis_ = sDoFRBMRCoeffs_.lookup("axis");
scalar magAxis(mag(axis_));
if (magAxis > VSMALL)
{
axis_ /= magAxis;
}
else
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::"
"read"
"("
"const dictionary& sDoFRBMCDict"
")"
)
<< "axis has zero length"
<< abort(FatalError);
}
sDoFRBMRCoeffs_.lookup("stiffness") >> stiffness_;
sDoFRBMRCoeffs_.lookup("damping") >> damping_;
return true;
}
void Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::write
(
Ostream& os
) const
{
os.writeKeyword("referenceOrientation")
<< refQ_ << token::END_STATEMENT << nl;
os.writeKeyword("axis")
<< axis_ << token::END_STATEMENT << nl;
os.writeKeyword("stiffness")
<< stiffness_ << token::END_STATEMENT << nl;
os.writeKeyword("damping")
<< damping_ << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,132 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring
Description
sixDoFRigidBodyMotionRestraints model. Linear axial angular spring.
SourceFiles
linearAxialAngularSpring.C
\*---------------------------------------------------------------------------*/
#ifndef linearAxialAngularSpring_H
#define linearAxialAngularSpring_H
#include "sixDoFRigidBodyMotionRestraint.H"
#include "point.H"
#include "tensor.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
/*---------------------------------------------------------------------------*\
Class linearAxialAngularSpring Declaration
\*---------------------------------------------------------------------------*/
class linearAxialAngularSpring
:
public sixDoFRigidBodyMotionRestraint
{
// Private data
//- Reference orientation where there is no moment
tensor refQ_;
//- Global unit axis around which the motion is sprung
vector axis_;
//- Spring stiffness coefficient (Nm/rad)
scalar stiffness_;
//- Damping coefficient (Nms/rad)
scalar damping_;
public:
//- Runtime type information
TypeName("linearAxialAngularSpring");
// Constructors
//- Construct from components
linearAxialAngularSpring
(
const dictionary& sDoFRBMRDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionRestraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionRestraint>
(
new linearAxialAngularSpring(*this)
);
}
// Destructor
virtual ~linearAxialAngularSpring();
// Member Functions
//- Calculate the restraint position, force and moment.
// Global reference frame vectors.
virtual void restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMRCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,149 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "linearSpring.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
defineTypeNameAndDebug(linearSpring, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionRestraint,
linearSpring,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::linearSpring::linearSpring
(
const dictionary& sDoFRBMRDict
)
:
sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
anchor_(),
refAttachmentPt_(),
stiffness_(),
damping_(),
restLength_()
{
read(sDoFRBMRDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::linearSpring::~linearSpring()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::sixDoFRigidBodyMotionRestraints::linearSpring::restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const
{
restraintPosition = motion.currentPosition(refAttachmentPt_);
vector r = restraintPosition - anchor_;
scalar magR = mag(r);
// r is now the r unit vector
r /= magR;
vector v = motion.currentVelocity(restraintPosition);
restraintForce = -stiffness_*(magR - restLength_)*r - damping_*(r & v)*r;
restraintMoment = vector::zero;
if (motion.report())
{
Info<< " spring length " << magR
<< " force " << restraintForce
<< " moment " << restraintMoment
<< endl;
}
}
bool Foam::sixDoFRigidBodyMotionRestraints::linearSpring::read
(
const dictionary& sDoFRBMRDict
)
{
sixDoFRigidBodyMotionRestraint::read(sDoFRBMRDict);
sDoFRBMRCoeffs_.lookup("anchor") >> anchor_;
sDoFRBMRCoeffs_.lookup("refAttachmentPt") >> refAttachmentPt_;
sDoFRBMRCoeffs_.lookup("stiffness") >> stiffness_;
sDoFRBMRCoeffs_.lookup("damping") >> damping_;
sDoFRBMRCoeffs_.lookup("restLength") >> restLength_;
return true;
}
void Foam::sixDoFRigidBodyMotionRestraints::linearSpring::write
(
Ostream& os
) const
{
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;
}
// ************************************************************************* //

View File

@ -0,0 +1,135 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionRestraints::linearSpring
Description
sixDoFRigidBodyMotionRestraints model. Linear spring.
SourceFiles
linearSpring.C
\*---------------------------------------------------------------------------*/
#ifndef linearSpring_H
#define linearSpring_H
#include "sixDoFRigidBodyMotionRestraint.H"
#include "point.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
/*---------------------------------------------------------------------------*\
Class linearSpring Declaration
\*---------------------------------------------------------------------------*/
class linearSpring
:
public sixDoFRigidBodyMotionRestraint
{
// Private data
//- Anchor point, where the spring is attached to an immovable
// object
point anchor_;
//- Reference point of attachment to the solid body
point refAttachmentPt_;
//- Spring stiffness coefficient (N/m)
scalar stiffness_;
//- Damping coefficient (Ns/m)
scalar damping_;
//- Rest length - length of spring when no forces are applied to it
scalar restLength_;
public:
//- Runtime type information
TypeName("linearSpring");
// Constructors
//- Construct from components
linearSpring
(
const dictionary& sDoFRBMRDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionRestraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionRestraint>
(
new linearSpring(*this)
);
}
// Destructor
virtual ~linearSpring();
// Member Functions
//- Calculate the restraint position, force and moment.
// Global reference frame vectors.
virtual void restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMRCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,65 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "sixDoFRigidBodyMotionRestraint.H"
// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
Foam::autoPtr<Foam::sixDoFRigidBodyMotionRestraint>
Foam::sixDoFRigidBodyMotionRestraint::New(const dictionary& sDoFRBMRDict)
{
word sixDoFRigidBodyMotionRestraintTypeName =
sDoFRBMRDict.lookup("sixDoFRigidBodyMotionRestraint");
// Info<< "Selecting sixDoFRigidBodyMotionRestraint function "
// << sixDoFRigidBodyMotionRestraintTypeName << endl;
dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find
(
sixDoFRigidBodyMotionRestraintTypeName
);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalErrorIn
(
"sixDoFRigidBodyMotionRestraint::New"
"("
"const dictionary& sDoFRBMRDict"
")"
) << "Unknown sixDoFRigidBodyMotionRestraint type "
<< sixDoFRigidBodyMotionRestraintTypeName << endl << endl
<< "Valid sixDoFRigidBodyMotionRestraints are : " << endl
<< dictionaryConstructorTablePtr_->sortedToc()
<< exit(FatalError);
}
return autoPtr<sixDoFRigidBodyMotionRestraint>(cstrIter()(sDoFRBMRDict));
}
// ************************************************************************* //

View File

@ -0,0 +1,72 @@
/*---------------------------------------------------------------------------* \
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "sixDoFRigidBodyMotionRestraint.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(Foam::sixDoFRigidBodyMotionRestraint, 0);
defineRunTimeSelectionTable(Foam::sixDoFRigidBodyMotionRestraint, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraint::sixDoFRigidBodyMotionRestraint
(
const dictionary& sDoFRBMRDict
)
:
sDoFRBMRCoeffs_
(
sDoFRBMRDict.subDict
(
word(sDoFRBMRDict.lookup("sixDoFRigidBodyMotionRestraint"))
+ "Coeffs"
)
)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraint::~sixDoFRigidBodyMotionRestraint()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
bool Foam::sixDoFRigidBodyMotionRestraint::read
(
const dictionary& sDoFRBMRDict
)
{
sDoFRBMRCoeffs_ = sDoFRBMRDict.subDict(type() + "Coeffs");
return true;
}
// ************************************************************************* //

View File

@ -0,0 +1,157 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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
Namespace
Foam::sixDoFRigidBodyMotionRestraints
Description
Namespace for six DoF motion restraints
Class
Foam::sixDoFRigidBodyMotionRestraint
Description
Base class for defining restraints for sixDoF motions
SourceFiles
sixDoFRigidBodyMotionRestraint.C
newDynamicFvMesh.C
\*---------------------------------------------------------------------------*/
#ifndef sixDoFRigidBodyMotionRestraint_H
#define sixDoFRigidBodyMotionRestraint_H
#include "Time.H"
#include "dictionary.H"
#include "autoPtr.H"
#include "vector.H"
#include "runTimeSelectionTables.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
class sixDoFRigidBodyMotion;
/*---------------------------------------------------------------------------*\
Class sixDoFRigidBodyMotionRestraint Declaration
\*---------------------------------------------------------------------------*/
class sixDoFRigidBodyMotionRestraint
{
protected:
// Protected data
//- Restraint model specific coefficient dictionary
dictionary sDoFRBMRCoeffs_;
public:
//- Runtime type information
TypeName("sixDoFRigidBodyMotionRestraint");
// Declare run-time constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
sixDoFRigidBodyMotionRestraint,
dictionary,
(const dictionary& sDoFRBMRDict),
(sDoFRBMRDict)
);
// Constructors
//- Construct from the sDoFRBMRDict dictionary and Time
sixDoFRigidBodyMotionRestraint
(
const dictionary& sDoFRBMRDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionRestraint> clone() const = 0;
// Selectors
//- Select constructed from the sDoFRBMRDict dictionary and Time
static autoPtr<sixDoFRigidBodyMotionRestraint> New
(
const dictionary& sDoFRBMRDict
);
// Destructor
virtual ~sixDoFRigidBodyMotionRestraint();
// Member Functions
//- Calculate the restraint position, force and moment.
// Global reference frame vectors.
virtual void restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const = 0;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMRDict);
// Access
// Return access to sDoFRBMRCoeffs
inline const dictionary& coeffDict() const
{
return sDoFRBMRCoeffs_;
}
//- Write
virtual void write(Ostream&) const = 0;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,170 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "sphericalAngularSpring.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
defineTypeNameAndDebug(sphericalAngularSpring, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionRestraint,
sphericalAngularSpring,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring::
sphericalAngularSpring
(
const dictionary& sDoFRBMRDict
)
:
sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
refQ_(),
stiffness_(),
damping_()
{
read(sDoFRBMRDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring::
~sphericalAngularSpring()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void
Foam::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring::restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const
{
restraintMoment = vector::zero;
for (direction cmpt=0; cmpt<vector::nComponents; cmpt++)
{
vector axis = vector::zero;
axis[cmpt] = 1;
vector refDir = vector::zero;
refDir[(cmpt + 1) % 3] = 1;
vector newDir = motion.orientation() & refDir;
axis = (refQ_ & axis);
refDir = (refQ_ & refDir);
newDir -= (axis & newDir)*axis;
restraintMoment += -stiffness_*(refDir ^ newDir);
}
restraintMoment += -damping_*motion.omega();
restraintForce = vector::zero;
// Not needed to be altered as restraintForce is zero, but set to
// centreOfMass to be sure of no spurious moment
restraintPosition = motion.centreOfMass();
if (motion.report())
{
Info<< " force " << restraintForce
<< " moment " << restraintMoment
<< endl;
}
}
bool Foam::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring::read
(
const dictionary& sDoFRBMRDict
)
{
sixDoFRigidBodyMotionRestraint::read(sDoFRBMRDict);
refQ_ = sDoFRBMRCoeffs_.lookupOrDefault<tensor>("referenceOrientation", I);
if (mag(mag(refQ_) - sqrt(3.0)) > 1e-9)
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring::"
"read"
"("
"const dictionary& sDoFRBMRDict"
")"
)
<< "referenceOrientation " << refQ_ << " is not a rotation tensor. "
<< "mag(referenceOrientation) - sqrt(3) = "
<< mag(refQ_) - sqrt(3.0) << nl
<< exit(FatalError);
}
sDoFRBMRCoeffs_.lookup("stiffness") >> stiffness_;
sDoFRBMRCoeffs_.lookup("damping") >> damping_;
return true;
}
void Foam::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring::write
(
Ostream& os
) const
{
os.writeKeyword("referenceOrientation")
<< refQ_ << token::END_STATEMENT << nl;
os.writeKeyword("stiffness") << stiffness_ << token::END_STATEMENT << nl;
os.writeKeyword("damping") << damping_ << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,129 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring
Description
sixDoFRigidBodyMotionRestraints model. Spherical angular spring.
SourceFiles
sphericalAngularSpring.C
\*---------------------------------------------------------------------------*/
#ifndef sphericalAngularSpring_H
#define sphericalAngularSpring_H
#include "sixDoFRigidBodyMotionRestraint.H"
#include "point.H"
#include "tensor.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
/*---------------------------------------------------------------------------*\
Class sphericalAngularSpring Declaration
\*---------------------------------------------------------------------------*/
class sphericalAngularSpring
:
public sixDoFRigidBodyMotionRestraint
{
// Private data
//- Reference orientation where there is no moment
tensor refQ_;
//- Spring stiffness coefficient (Nm/rad)
scalar stiffness_;
//- Damping coefficient (Nms/rad)
scalar damping_;
public:
//- Runtime type information
TypeName("sphericalAngularSpring");
// Constructors
//- Construct from components
sphericalAngularSpring
(
const dictionary& sDoFRBMRDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionRestraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionRestraint>
(
new sphericalAngularSpring(*this)
);
}
// Destructor
virtual ~sphericalAngularSpring();
// Member Functions
//- Calculate the restraint position, force and moment.
// Global reference frame vectors.
virtual void restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMRCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,255 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "tabulatedAxialAngularSpring.H"
#include "addToRunTimeSelectionTable.H"
#include "sixDoFRigidBodyMotion.H"
#include "transform.H"
#include "unitConversion.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
defineTypeNameAndDebug(tabulatedAxialAngularSpring, 0);
addToRunTimeSelectionTable
(
sixDoFRigidBodyMotionRestraint,
tabulatedAxialAngularSpring,
dictionary
);
};
};
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::tabulatedAxialAngularSpring::
tabulatedAxialAngularSpring
(
const dictionary& sDoFRBMRDict
)
:
sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
refQ_(),
axis_(),
moment_(),
convertToDegrees_(),
damping_()
{
read(sDoFRBMRDict);
}
// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
Foam::sixDoFRigidBodyMotionRestraints::tabulatedAxialAngularSpring::
~tabulatedAxialAngularSpring()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void
Foam::sixDoFRigidBodyMotionRestraints::tabulatedAxialAngularSpring::restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const
{
vector refDir = rotationTensor(vector(1, 0 ,0), axis_) & vector(0, 1, 0);
vector oldDir = refQ_ & refDir;
vector newDir = motion.orientation() & refDir;
if (mag(oldDir & axis_) > 0.95 || mag(newDir & axis_) > 0.95)
{
// Directions getting close to the axis, change reference
refDir = rotationTensor(vector(1, 0 ,0), axis_) & vector(0, 0, 1);
vector oldDir = refQ_ & refDir;
vector newDir = motion.orientation() & refDir;
}
// Removing any axis component from oldDir and newDir and normalising
oldDir -= (axis_ & oldDir)*axis_;
oldDir /= mag(oldDir);
newDir -= (axis_ & newDir)*axis_;
newDir /= mag(newDir);
scalar theta = mag(acos(min(oldDir & newDir, 1.0)));
// Determining the sign of theta by comparing the cross product of
// the direction vectors with the axis
theta *= sign((oldDir ^ newDir) & axis_);
scalar moment;
if (convertToDegrees_)
{
moment = moment_(radToDeg(theta));
}
else
{
moment = moment_(theta);
}
// Damping of along axis angular velocity only
restraintMoment = moment*axis_ - damping_*(motion.omega() & axis_)*axis_;
restraintForce = vector::zero;
// Not needed to be altered as restraintForce is zero, but set to
// centreOfMass to be sure of no spurious moment
restraintPosition = motion.centreOfMass();
if (motion.report())
{
Info<< " angle " << theta
<< " force " << restraintForce
<< " moment " << restraintMoment
<< endl;
}
}
bool Foam::sixDoFRigidBodyMotionRestraints::tabulatedAxialAngularSpring::read
(
const dictionary& sDoFRBMRDict
)
{
sixDoFRigidBodyMotionRestraint::read(sDoFRBMRDict);
refQ_ = sDoFRBMRCoeffs_.lookupOrDefault<tensor>("referenceOrientation", I);
if (mag(mag(refQ_) - sqrt(3.0)) > 1e-9)
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionRestraints::"
"tabulatedAxialAngularSpring::read"
"("
"const dictionary& sDoFRBMRDict"
")"
)
<< "referenceOrientation " << refQ_ << " is not a rotation tensor. "
<< "mag(referenceOrientation) - sqrt(3) = "
<< mag(refQ_) - sqrt(3.0) << nl
<< exit(FatalError);
}
axis_ = sDoFRBMRCoeffs_.lookup("axis");
scalar magAxis(mag(axis_));
if (magAxis > VSMALL)
{
axis_ /= magAxis;
}
else
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionRestraints::"
"tabulatedAxialAngularSpring::read"
"("
"const dictionary& sDoFRBMCDict"
")"
)
<< "axis has zero length"
<< abort(FatalError);
}
moment_ = interpolationTable<scalar>(sDoFRBMRCoeffs_);
word angleFormat = sDoFRBMRCoeffs_.lookup("angleFormat");
if (angleFormat == "degrees" || angleFormat == "degree")
{
convertToDegrees_ = true;
}
else if (angleFormat == "radians" || angleFormat == "radian")
{
convertToDegrees_ = false;
}
else
{
FatalErrorIn
(
"Foam::sixDoFRigidBodyMotionRestraints::"
"tabulatedAxialAngularSpring::read"
"("
"const dictionary& sDoFRBMCDict"
")"
)
<< "angleFormat must be degree, degrees, radian or radians"
<< abort(FatalError);
}
sDoFRBMRCoeffs_.lookup("damping") >> damping_;
return true;
}
void Foam::sixDoFRigidBodyMotionRestraints::tabulatedAxialAngularSpring::write
(
Ostream& os
) const
{
os.writeKeyword("referenceOrientation")
<< refQ_ << token::END_STATEMENT << nl;
os.writeKeyword("axis")
<< axis_ << token::END_STATEMENT << nl;
moment_.write(os);
os.writeKeyword("angleFormat");
if (convertToDegrees_)
{
os << "degrees" << token::END_STATEMENT << nl;
}
else
{
os << "radians" << token::END_STATEMENT << nl;
}
os.writeKeyword("damping")
<< damping_ << token::END_STATEMENT << nl;
}
// ************************************************************************* //

View File

@ -0,0 +1,139 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::sixDoFRigidBodyMotionRestraints::tabulatedAxialAngularSpring
Description
sixDoFRigidBodyMotionRestraints model. Axial angular spring with moment
values drawn from an interpolation table. Linear damping.
SourceFiles
tabulatedAxialAngularSpring.C
\*---------------------------------------------------------------------------*/
#ifndef tabulatedAxialAngularSpring_H
#define tabulatedAxialAngularSpring_H
#include "sixDoFRigidBodyMotionRestraint.H"
#include "point.H"
#include "tensor.H"
#include "interpolationTable.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace sixDoFRigidBodyMotionRestraints
{
/*---------------------------------------------------------------------------*\
Class tabulatedAxialAngularSpring Declaration
\*---------------------------------------------------------------------------*/
class tabulatedAxialAngularSpring
:
public sixDoFRigidBodyMotionRestraint
{
// Private data
//- Reference orientation where there is no moment
tensor refQ_;
//- Global unit axis around which the motion is sprung
vector axis_;
//- Spring moment interpolation table, depending on angleFormat
interpolationTable<scalar> moment_;
//- Boolean stating whether the angle around the axis needs to
// be converted to degrees before asking the
// interpolationTable for a moment value
bool convertToDegrees_;
//- Damping coefficient (Nms/rad)
scalar damping_;
public:
//- Runtime type information
TypeName("tabulatedAxialAngularSpring");
// Constructors
//- Construct from components
tabulatedAxialAngularSpring
(
const dictionary& sDoFRBMRDict
);
//- Construct and return a clone
virtual autoPtr<sixDoFRigidBodyMotionRestraint> clone() const
{
return autoPtr<sixDoFRigidBodyMotionRestraint>
(
new tabulatedAxialAngularSpring(*this)
);
}
// Destructor
virtual ~tabulatedAxialAngularSpring();
// Member Functions
//- Calculate the restraint position, force and moment.
// Global reference frame vectors.
virtual void restrain
(
const sixDoFRigidBodyMotion& motion,
vector& restraintPosition,
vector& restraintForce,
vector& restraintMoment
) const;
//- Update properties from given dictionary
virtual bool read(const dictionary& sDoFRBMRCoeff);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace solidBodyMotionFunctions
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -64,11 +64,11 @@ Foam::sixDoFRigidBodyMotionState::sixDoFRigidBodyMotionState
)
:
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))
Q_(dict.lookupOrDefault("orientation", tensor(I))),
v_(dict.lookupOrDefault("velocity", vector::zero)),
a_(dict.lookupOrDefault("acceleration", vector::zero)),
pi_(dict.lookupOrDefault("angularMomentum", vector::zero)),
tau_(dict.lookupOrDefault("torque", vector::zero))
{}

View File

@ -33,15 +33,15 @@ void Foam::sixDoFRigidBodyMotionState::write(Ostream& os) const
{
os.writeKeyword("centreOfMass")
<< centreOfMass_ << token::END_STATEMENT << nl;
os.writeKeyword("Q")
os.writeKeyword("orientation")
<< Q_ << token::END_STATEMENT << nl;
os.writeKeyword("v")
os.writeKeyword("velocity")
<< v_ << token::END_STATEMENT << nl;
os.writeKeyword("a")
os.writeKeyword("acceleration")
<< a_ << token::END_STATEMENT << nl;
os.writeKeyword("pi")
os.writeKeyword("angularMomentum")
<< pi_ << token::END_STATEMENT << nl;
os.writeKeyword("tau")
os.writeKeyword("torque")
<< tau_ << token::END_STATEMENT << nl;
}

View File

@ -0,0 +1,205 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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 "uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField.H"
#include "pointPatchFields.H"
#include "addToRunTimeSelectionTable.H"
#include "Time.H"
#include "fvMesh.H"
#include "volFields.H"
#include "uniformDimensionedFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const pointPatch& p,
const DimensionedField<vector, pointMesh>& iF
)
:
fixedValuePointPatchField<vector>(p, iF),
motion_(),
initialPoints_(p.localPoints()),
rhoInf_(1.0)
{}
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const pointPatch& p,
const DimensionedField<vector, pointMesh>& iF,
const dictionary& dict
)
:
fixedValuePointPatchField<vector>(p, iF, dict),
motion_(dict),
rhoInf_(readScalar(dict.lookup("rhoInf")))
{
if (!dict.found("value"))
{
updateCoeffs();
}
if (dict.found("initialPoints"))
{
initialPoints_ = vectorField("initialPoints", dict , p.size());
}
else
{
initialPoints_ = p.localPoints();
}
}
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField& ptf,
const pointPatch& p,
const DimensionedField<vector, pointMesh>& iF,
const pointPatchFieldMapper& mapper
)
:
fixedValuePointPatchField<vector>(ptf, p, iF, mapper),
motion_(ptf.motion_),
initialPoints_(ptf.initialPoints_, mapper),
rhoInf_(ptf.rhoInf_)
{}
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField& ptf,
const DimensionedField<vector, pointMesh>& iF
)
:
fixedValuePointPatchField<vector>(ptf, iF),
motion_(ptf.motion_),
initialPoints_(ptf.initialPoints_),
rhoInf_(ptf.rhoInf_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::autoMap
(
const pointPatchFieldMapper& m
)
{
fixedValuePointPatchField<vector>::autoMap(m);
initialPoints_.autoMap(m);
}
void uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::rmap
(
const pointPatchField<vector>& ptf,
const labelList& addr
)
{
const uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField& uSDoFptf =
refCast
<
const uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
>(ptf);
fixedValuePointPatchField<vector>::rmap(uSDoFptf, addr);
initialPoints_.rmap(uSDoFptf.initialPoints_, addr);
}
void uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::updateCoeffs()
{
if (this->updated())
{
return;
}
const polyMesh& mesh = this->dimensionedInternalField().mesh()();
const Time& t = mesh.time();
motion_.updatePosition(t.deltaTValue());
vector gravity = vector::zero;
if (db().foundObject<uniformDimensionedVectorField>("g"))
{
uniformDimensionedVectorField g =
db().lookupObject<uniformDimensionedVectorField>("g");
gravity = g.value();
}
// Do not modify the accelerations, except with gravity, where available
motion_.updateForce(gravity*motion_.mass(), vector::zero, t.deltaTValue());
Field<vector>::operator=
(
motion_.currentPosition(initialPoints_) - initialPoints_
);
fixedValuePointPatchField<vector>::updateCoeffs();
}
void uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField::write
(
Ostream& os
) const
{
pointPatchField<vector>::write(os);
motion_.write(os);
os.writeKeyword("rhoInf")
<< rhoInf_ << token::END_STATEMENT << nl;
initialPoints_.writeEntry("initialPoints", os);
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePointPatchTypeField
(
pointPatchVectorField,
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View File

@ -0,0 +1,174 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-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::uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
Description
Foam::uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
SourceFiles
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField.C
\*---------------------------------------------------------------------------*/
#ifndef uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField_H
#define uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField_H
#include "fixedValuePointPatchField.H"
#include "sixDoFRigidBodyMotion.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField Declaration
\*---------------------------------------------------------------------------*/
class uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
:
public fixedValuePointPatchField<vector>
{
// Private data
//- Six dof motion object
sixDoFRigidBodyMotion motion_;
//- Initial positions of points on the patch
pointField initialPoints_;
//- Reference density required by the forces object for
// incompressible calculations. Retained here to give
// dictionary compatibility with other sixDoF patches.
scalar rhoInf_;
public:
//- Runtime type information
TypeName("uncoupledSixDoFRigidBodyDisplacement");
// Constructors
//- Construct from patch and internal field
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const pointPatch&,
const DimensionedField<vector, pointMesh>&
);
//- Construct from patch, internal field and dictionary
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const pointPatch&,
const DimensionedField<vector, pointMesh>&,
const dictionary&
);
//- Construct by mapping given patchField<vector> onto a new patch
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField&,
const pointPatch&,
const DimensionedField<vector, pointMesh>&,
const pointPatchFieldMapper&
);
//- Construct and return a clone
virtual autoPtr<pointPatchField<vector> > clone() const
{
return autoPtr<pointPatchField<vector> >
(
new uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
*this
)
);
}
//- Construct as copy setting internal field reference
uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
const uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField&,
const DimensionedField<vector, pointMesh>&
);
//- Construct and return a clone setting internal field reference
virtual autoPtr<pointPatchField<vector> > clone
(
const DimensionedField<vector, pointMesh>& iF
) const
{
return autoPtr<pointPatchField<vector> >
(
new uncoupledSixDoFRigidBodyDisplacementPointPatchVectorField
(
*this,
iF
)
);
}
// Member functions
// Mapping functions
//- Map (and resize as needed) from self given a mapping object
virtual void autoMap
(
const pointPatchFieldMapper&
);
//- Reverse map the given pointPatchField onto this pointPatchField
virtual void rmap
(
const pointPatchField<vector>&,
const labelList&
);
// Evaluation functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //