35 void 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),
93 updateConstraints_(false),
106 motionState_(stateDict),
116 "initialCentreOfMass",
120 initialCentreOfRotation_(initialCentreOfMass_),
125 "initialOrientation",
129 mass_(
dict.
get<scalar>(
"mass")),
131 aRelax_(
dict.getOrDefault<scalar>(
"accelerationRelaxation", 1)),
132 aDamp_(
dict.getOrDefault<scalar>(
"accelerationDamping", 1)),
133 report_(
dict.getOrDefault(
"report", false)),
134 updateConstraints_(
dict.getOrDefault(
"updateConstraints", false)),
144 vector R(initialCentreOfMass_ - initialCentreOfRotation_);
152 if (!stateDict.
found(
"centreOfRotation"))
159 motionState0_ = motionState_;
168 time_(sDoFRBM.time_),
169 motionState_(sDoFRBM.motionState_),
170 motionState0_(sDoFRBM.motionState0_),
171 restraints_(sDoFRBM.restraints_),
172 constraints_(sDoFRBM.constraints_),
173 tConstraints_(sDoFRBM.tConstraints_),
174 rConstraints_(sDoFRBM.rConstraints_),
175 initialCentreOfMass_(sDoFRBM.initialCentreOfMass_),
176 initialCentreOfRotation_(sDoFRBM.initialCentreOfRotation_),
177 initialQ_(sDoFRBM.initialQ_),
178 mass_(sDoFRBM.mass_),
179 momentOfInertia_(sDoFRBM.momentOfInertia_),
180 aRelax_(sDoFRBM.aRelax_),
181 aDamp_(sDoFRBM.aDamp_),
182 report_(sDoFRBM.report_),
183 updateConstraints_(sDoFRBM.updateConstraints_),
184 solver_(sDoFRBM.solver_.clone())
207 restraints_.setSize(restraintDict.size());
209 for (
const entry& dEntry : restraintDict)
225 restraints_.setSize(i);
232 const dictionary&
dict 241 constraints_.setSize(constraintDict.size());
246 for (
const entry& dEntry : constraintDict)
261 constraints_[i].setCentreOfRotation(initialCentreOfRotation_);
262 constraints_[i].constrainTranslation(pct);
263 constraints_[i].constrainRotation(pcr);
269 constraints_.setSize(i);
271 tConstraints_ = pct.constraintTransformation();
272 rConstraints_ = pcr.constraintTransformation();
274 Info<<
"Translational constraint tensor " << tConstraints_ <<
nl 275 <<
"Rotational constraint tensor " << rConstraints_ <<
endl;
280 void Foam::sixDoFRigidBodyMotion::updateAcceleration
286 static bool first =
true;
290 vector tauPrevIter = tau();
294 tau() = (Q().T() & tauGlobal);
300 a() = aRelax_*a() + (1 - aRelax_)*aPrevIter;
301 tau() = aRelax_*tau() + (1 - aRelax_)*tauPrevIter;
310 void Foam::sixDoFRigidBodyMotion::updateConstraints()
312 if (!updateConstraints_)
322 constraints_[i].setCentreOfRotation(initialCentreOfRotation_);
323 constraints_[i].constrainTranslation(pct);
324 constraints_[i].constrainRotation(pcr);
327 tConstraints_ = pct.constraintTransformation();
328 rConstraints_ = pcr.constraintTransformation();
330 Info<<
"Translational constraint tensor " << tConstraints_ <<
nl 331 <<
"Rotational constraint tensor " << rConstraints_ <<
endl;
346 solver_->solve(firstIter, fGlobal, tauGlobal, deltaT, deltaT0);
360 Info<<
"6-DoF rigid body motion" <<
nl 361 <<
" Centre of rotation: " << centreOfRotation() <<
nl 362 <<
" Centre of mass: " << centreOfMass() <<
nl 363 <<
" Orientation: " << orientation() <<
nl 364 <<
" Linear velocity: " << v() <<
nl 365 <<
" Angular velocity: " << omega()
378 + (Q() & initialQ_.T() & (initialPoints - initialCentreOfRotation_))
392 centreOfRotation() - initialCentreOfRotation(),
397 auto&
points = tpoints.ref();
402 if (scale[pointi] > SMALL)
405 if (scale[pointi] > 1 - SMALL)
415 initialCentreOfRotation()
418 initialPoints[pointi]
419 - initialCentreOfRotation()
Six degree of freedom motion for a rigid body.
List< ReturnType > get(const UPtrList< T > &list, const AccessOp &aop)
List of values generated by applying the access operation to each list item.
~sixDoFRigidBodyMotion()
Destructor.
void addConstraints(const dictionary &dict)
Add restraints to the motion, public to allow external.
DiagTensor< scalar > diagTensor
DiagTensor of scalars, i.e. DiagTensor<scalar>.
A list of keyword definitions, which are a keyword followed by a number of values (eg...
const point & centreOfRotation() const
Return the current centre of rotation.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
constexpr char nl
The newline '\n' character (0x0a)
Ostream & endl(Ostream &os)
Add newline and flush stream.
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
point transform(const point &initialPoints) const
Transform the given initial state point by the current motion.
Septernion class used to perform translations and rotations in 3D space.
const dictionary & subDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a sub-dictionary.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
static void broadcast(Type &value, const label comm=UPstream::worldComm)
Broadcast content (contiguous or non-contiguous) to all communicator ranks. Does nothing in non-paral...
bool found(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry (const access) with the given keyword.
#define forAll(list, i)
Loop across all elements in list.
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
const point & centreOfRotation() const
Return access to the centre of mass.
static const Identity< scalar > I
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
Quaternion class used to perform rotations in 3D space.
static const septernion I
void status() const
Report the status of the motion.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
vector invTransformPoint(const vector &v) const
Inverse Transform the given coordinate point.
static autoPtr< sixDoFRigidBodyMotionRestraint > New(const word &name, const dictionary &sDoFRBMRDict)
Select constructed from the sDoFRBMRDict dictionary and Time.
vector point
Point is a vector.
#define R(A, B, C, D, E, F, K, M)
quaternion slerp(const quaternion &qa, const quaternion &qb, const scalar t)
Spherical linear interpolation of quaternions.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
messageStream Info
Information stream (stdout output on master, null elsewhere)
static autoPtr< sixDoFRigidBodyMotionConstraint > New(const word &name, const dictionary &sDoFRBMCDict, const sixDoFRigidBodyMotion &motion)
Select constructed from the sDoFRBMCDict dictionary and Time.
entry * set(entry *entryPtr)
Assign a new entry, overwriting any existing entry.
sixDoFRigidBodyMotion(const Time &)
Construct null.
A class for managing temporary objects.
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.
Tensor of scalars, i.e. Tensor<scalar>.
void update(bool firstIter, const vector &fGlobal, const vector &tauGlobal, scalar deltaT, scalar deltaT0)
Symplectic integration of velocities, orientation and position.
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
void addRestraints(const dictionary &dict)
Add restraints to the motion, public to allow external.
A keyword and a list of tokens is an 'entry'.
static constexpr const zero Zero
Global zero (0)