35void Foam::sixDoFRigidBodyMotion::applyRestraints()
37 if (restraints_.empty())
48 Info<<
"Restraint " << restraints_[rI].name() <<
": ";
61 restraints_[rI].restrain(*
this, rP, rF, rM);
85 initialCentreOfMass_(
Zero),
86 initialCentreOfRotation_(
Zero),
105 motionState_(stateDict),
115 "initialCentreOfMass",
119 initialCentreOfRotation_(initialCentreOfMass_),
124 "initialOrientation",
128 mass_(
dict.get<scalar>(
"mass")),
130 aRelax_(
dict.getOrDefault<scalar>(
"accelerationRelaxation", 1)),
131 aDamp_(
dict.getOrDefault<scalar>(
"accelerationDamping", 1)),
132 report_(
dict.getOrDefault(
"report", false)),
142 vector R(initialCentreOfMass_ - initialCentreOfRotation_);
150 if (!stateDict.
found(
"centreOfRotation"))
157 motionState0_ = motionState_;
166 time_(sDoFRBM.time_),
167 motionState_(sDoFRBM.motionState_),
168 motionState0_(sDoFRBM.motionState0_),
169 restraints_(sDoFRBM.restraints_),
170 constraints_(sDoFRBM.constraints_),
171 tConstraints_(sDoFRBM.tConstraints_),
172 rConstraints_(sDoFRBM.rConstraints_),
173 initialCentreOfMass_(sDoFRBM.initialCentreOfMass_),
174 initialCentreOfRotation_(sDoFRBM.initialCentreOfRotation_),
175 initialQ_(sDoFRBM.initialQ_),
176 mass_(sDoFRBM.mass_),
177 momentOfInertia_(sDoFRBM.momentOfInertia_),
178 aRelax_(sDoFRBM.aRelax_),
179 aDamp_(sDoFRBM.aDamp_),
180 report_(sDoFRBM.report_),
181 solver_(sDoFRBM.solver_.clone())
204 restraints_.setSize(restraintDict.size());
206 for (
const entry& dEntry : restraintDict)
222 restraints_.setSize(i);
238 constraints_.setSize(constraintDict.size());
243 for (
const entry& dEntry : constraintDict)
258 constraints_[i].setCentreOfRotation(initialCentreOfRotation_);
259 constraints_[i].constrainTranslation(pct);
260 constraints_[i].constrainRotation(pcr);
266 constraints_.setSize(i);
271 Info<<
"Translational constraint tensor " << tConstraints_ <<
nl
272 <<
"Rotational constraint tensor " << rConstraints_ <<
endl;
277void Foam::sixDoFRigidBodyMotion::updateAcceleration
283 static bool first =
true;
287 vector tauPrevIter = tau();
291 tau() = (Q().T() & tauGlobal);
297 a() = aRelax_*a() + (1 - aRelax_)*aPrevIter;
298 tau() = aRelax_*tau() + (1 - aRelax_)*tauPrevIter;
318 solver_->solve(firstIter, fGlobal, tauGlobal, deltaT, deltaT0);
332 Info<<
"6-DoF rigid body motion" <<
nl
333 <<
" Centre of rotation: " << centreOfRotation() <<
nl
334 <<
" Centre of mass: " << centreOfMass() <<
nl
335 <<
" Orientation: " << orientation() <<
nl
336 <<
" Linear velocity: " << v() <<
nl
337 <<
" Angular velocity: " << omega()
350 + (Q() & initialQ_.T() & (initialPoints - initialCentreOfRotation_))
364 centreOfRotation() - initialCentreOfRotation(),
374 if (scale[pointi] > SMALL)
377 if (scale[pointi] > 1 - SMALL)
387 initialCentreOfRotation()
390 initialPoints[pointi]
391 - initialCentreOfRotation()
#define R(A, B, C, D, E, F, K, M)
static void scatter(const List< commsStruct > &comms, T &value, const int tag, const label comm)
Broadcast data: Distribute without modification.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
static autoPtr< Time > New()
Construct (dummy) Time - no functionObjects or libraries.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
const dictionary & subDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a sub-dictionary.
bool found(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Search for an entry (const access) with the given keyword.
entry * set(entry *entryPtr)
Assign a new entry, overwriting any existing entry.
A keyword and a list of tokens is an 'entry'.
virtual bool update()
Update the mesh for both mesh motion and topology change.
A class representing the concept of 1 (one) that can be used to avoid manipulating objects known to b...
Accumulates point constraints through successive applications of the applyConstraint function.
tensor constraintTransformation() const
Return the accumulated constraint transformation tensor.
Quaternion class used to perform rotations in 3D space.
Septernion class used to perform translations and rotations in 3D space.
vector invTransformPoint(const vector &v) const
Inverse Transform the given coordinate point.
static const septernion I
const point & centreOfRotation() const
Return access to the centre of mass.
Six degree of freedom motion for a rigid body.
void status() const
Report the status of the motion.
void addConstraints(const dictionary &dict)
Add restraints to the motion, public to allow external.
~sixDoFRigidBodyMotion()
Destructor.
void addRestraints(const dictionary &dict)
Add restraints to the motion, public to allow external.
const point & centreOfRotation() const
Return the current centre of rotation.
splitCell * master() const
A class for managing temporary objects.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
dimensionSet transform(const dimensionSet &ds)
Return the argument; transformations do not change the dimensions.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
messageStream Info
Information stream (stdout output on master, null elsewhere)
vectorField pointField
pointField is a vectorField.
static const Identity< scalar > I
vector point
Point is a vector.
Ostream & endl(Ostream &os)
Add newline and flush stream.
static constexpr const zero Zero
Global zero (0)
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh > > &tdf1, const word &name, const dimensionSet &dimensions)
Global function forwards to reuseTmpDimensionedField::New.
quaternion slerp(const quaternion &qa, const quaternion &qb, const scalar t)
Spherical linear interpolation of quaternions.
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
constexpr char nl
The newline '\n' character (0x0a)
#define forAll(list, i)
Loop across all elements in list.