Go to the documentation of this file.
49 void Foam::RBD::rigidBodyModel::initializeRootBody()
55 XT_.append(spatialTransform());
64 void Foam::RBD::rigidBodyModel::resizeState()
66 Xlambda_.append(spatialTransform());
67 X0_.append(spatialTransform());
85 void Foam::RBD::rigidBodyModel::addRestraints
87 const dictionary&
dict
90 if (
dict.found(
"restraints"))
92 const dictionary& restraintDict =
dict.subDict(
"restraints");
96 restraints_.setSize(restraintDict.size());
98 for (
const entry& dEntry : restraintDict)
115 restraints_.setSize(i);
124 const label parentID,
131 const rigidBody& body = bodyPtr();
132 bodies_.append(bodyPtr);
133 const label bodyID = nBodies()-1;
134 bodyIDs_.insert(body.name(), bodyID);
138 if (merged(parentID))
140 const subBody& sBody = mergedBody(parentID);
141 lambda_.append(sBody.masterID());
142 XT_.append(XT & sBody.masterXT());
146 lambda_.append(parentID);
151 const joint& prevJoint = joints_[joints_.size() - 1];
152 joints_.append(jointPtr);
153 joint& curJoint = joints_[joints_.size() - 1];
154 curJoint.index() = joints_.size() - 1;
155 curJoint.qIndex() = prevJoint.qIndex() + prevJoint.nDoF();
158 nDoF_ += curJoint.nDoF();
159 unitQuaternions_ = unitQuaternions_ || curJoint.unitQuaternion();
174 initializeRootBody();
187 initializeRootBody();
191 for (
const entry& dEntry : bodiesDict)
196 if (bodyDict.
found(
"mergeWith"))
232 const label parentID,
238 if (isA<joints::composite>(jointPtr()))
266 const label parentID,
272 label parent = parentID;
273 joints::composite& cJoint = cJointPtr();
277 for (label j=0; j<cJoint.size()-1; j++)
292 cJoint.size() == 1 ? XT : spatialTransform(),
293 autoPtr<joint>(cJointPtr.
ptr()),
299 cJoint.setLastJoint();
305 void Foam::RBD::rigidBodyModel::makeComposite(
const label bodyID)
307 if (!isA<compositeBody>(bodies_[bodyID]))
310 autoPtr<rigidBody> bodyPtr = bodies_.
release(bodyID);
324 const label parentID,
334 if (merged(parentID))
336 const subBody& sBody = mergedBody(parentID);
338 makeComposite(sBody.masterID());
345 bodies_[sBody.masterID()].name(),
347 XT & sBody.masterXT()
353 makeComposite(parentID);
360 bodies_[parentID].
name(),
367 const subBody& sBody = sBodyPtr();
368 mergedBodies_.append(sBodyPtr);
371 bodies_[sBody.masterID()].merge(sBody);
373 const label sBodyID = mergedBodyID(mergedBodies_.size() - 1);
374 bodyIDs_.insert(sBody.name(), sBodyID);
387 const subBody& mBody = mergedBody(bodyId);
397 os.beginBlock(
"bodies");
400 for (label i=1; i<nBodies(); i++)
404 if (!isType<jointBody>(bodies_[i]))
406 os.beginBlock(bodies_[i].
name());
408 bodies_[i].write(
os);
410 os.writeEntry(
"parent", bodies_[lambda_[i]].
name());
411 os.writeEntry(
"transform", XT_[i]);
414 << joints_[i] <<
endl;
423 os.beginBlock(mergedBodies_[i].
name());
425 mergedBodies_[i].body().write(
os);
427 os.writeEntry(
"transform", mergedBodies_[i].masterXT());
428 os.writeEntry(
"mergeWith", mergedBodies_[i].masterName());
436 if (!restraints_.empty())
438 os.beginBlock(
"restraints");
444 os.beginBlock(restraints_[ri].
name());
446 restraints_[ri].write(
os);
A keyword and a list of tokens is an 'entry'.
virtual ~rigidBodyModel()
static autoPtr< joint > New(joint *jointPtr)
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
A class for handling words, derived from Foam::string.
spatialTransform X0(const label bodyId) const
static constexpr const zero Zero
bool found(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Prismatic joint for translation along the specified arbitrary axis.
bool read(const char *buf, int32_t &val)
auto key(const Type &t) -> typename std::enable_if< std::is_enum< Type >::value, typename std::underlying_type< Type >::type >::type
bool insert(const Key &key, const T &obj)
PtrList< rigidBody > bodies_
Ostream & endl(Ostream &os)
T get(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
rigidBodyModel(const Time &time)
Ostream & operator<<(Ostream &, const rigidBody &)
A class for handling keywords in dictionaries.
DynamicList< label > lambda_
This specialized rigidBody holds the original body after it has been merged into a master.
DynamicList< T, SizeMin > & append(const T &val)
const dictionary & subDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
static const SpatialTensor I
defineTypeNameAndDebug(cuboid, 0)
Basic rigid-body model representing a system of rigid-bodies connected by 1-6 DoF joints.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
OBJstream os(runTime.globalPath()/outputName)
virtual bool write(const token &tok)=0
label bodyID(const word &name) const
Ostream & indent(Ostream &os)
void reset(autoPtr< T > &&other) noexcept
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
const word & name() const
virtual label join_(const label parentID, const spatialTransform &XT, autoPtr< joint > jointPtr, autoPtr< rigidBody > bodyPtr)
virtual label join(const label parentID, const spatialTransform &XT, autoPtr< joint > jointPtr, autoPtr< rigidBody > bodyPtr)
bool read(const dictionary &dict)
virtual void write(Ostream &) const
DynamicList< spatialTransform > XT_
word name(const expressions::valueTypeCode typeCode)
Abstract base-class for all rigid-body joints.
const spatialTransform & masterXT() const
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
static autoPtr< restraint > New(const word &name, const dictionary &dict, const rigidBodyModel &model)
virtual bool unitQuaternion() const
HashTable< label > bodyIDs_
const word & name() const
static autoPtr< rigidBody > New(const word &name, const scalar &m, const vector &c, const symmTensor &Ic)
label merge(const label parentID, const spatialTransform &X, autoPtr< rigidBody > bodyPtr)