Go to the documentation of this file.
64 omegaSet_(model_.time(),
"omega")
87 vector oldDir = refQ_ & refDir;
88 vector newDir = model_.X0(bodyID_).E() & refDir;
90 if (
mag(oldDir & axis_) > 0.95 ||
mag(newDir & axis_) > 0.95)
94 oldDir = refQ_ & refDir;
95 newDir = model_.X0(bodyID_).E() & refDir;
99 oldDir -= (axis_ & oldDir)*axis_;
100 oldDir /= (
mag(oldDir) + VSMALL);
102 newDir -= (axis_ & newDir)*axis_;
103 newDir /= (
mag(newDir) + VSMALL);
105 scalar theta =
mag(
acos(
min(oldDir & newDir, 1.0)));
108 vector a = (oldDir ^ newDir);
111 a = (a & axis_)*axis_;
113 scalar magA =
mag(a);
125 vector omega = model_.v(model_.master(bodyID_)).w();
126 scalar Inertia =
mag(model_.I(model_.master(bodyID_)).Ic());
130 const scalar
relax = 0.5;
137 * (omegaSet_.value(model_.time().value()) - omega)
138 / model_.time().deltaTValue()
147 <<
" omega " << omega <<
endl
148 <<
" wanted " << omegaSet_.value(model_.time().value()) <<
endl
149 <<
" moment " << moment <<
endl
150 <<
" oldDir " << oldDir <<
endl
151 <<
" newDir " << newDir <<
endl
152 <<
" refDir " << refDir
168 refQ_ = coeffs_.getOrDefault<
tensor>(
"referenceOrientation",
I);
173 <<
"referenceOrientation " << refQ_ <<
" is not a rotation tensor. "
174 <<
"mag(referenceOrientation) - sqrt(3) = "
179 coeffs_.readEntry(
"axis", axis_);
181 const scalar magAxis(
mag(axis_));
183 if (magAxis > VSMALL)
190 <<
"axis has zero length"
195 omegaSet_.reset(coeffs_);
210 omegaSet_.writeData(os);
addToRunTimeSelectionTable(restraint, externalForce, dictionary)
defineTypeNameAndDebug(externalForce, 0)
Holds the motion state of rigid-body model.
A class for handling words, derived from Foam::string.
static constexpr const zero Zero
Global zero (0)
Ostream & endl(Ostream &os)
Add newline and flush stream.
dimensionedScalar sign(const dimensionedScalar &ds)
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
virtual ~prescribedRotation()
Destructor.
messageStream Info
Information stream (uses stdout - output is on the master only)
word name(const complex &c)
Return string representation of complex.
virtual bool read(const dictionary &dict)
Update properties from given dictionary.
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,...
Macros for easy insertion into run-time selection tables.
errorManip< error > abort(error &err)
Vector< scalar > vector
A scalar version of the templated Vector.
virtual void write(Ostream &) const
Write.
errorManipArg< error, int > exit(error &err, const int errNo=1)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
virtual bool read(const dictionary &dict)
Update properties from given dictionary.
prescribedRotation(const word &name, const dictionary &dict, const rigidBodyModel &model)
Construct from components.
dimensionedScalar sqrt(const dimensionedScalar &ds)
virtual void restrain(scalarField &tau, Field< spatialVector > &fx, const rigidBodyModelState &state) const
Accumulate the retraint internal joint forces into the tau field and.
dimensionedScalar acos(const dimensionedScalar &ds)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
virtual void write(Ostream &) const =0
Write.
Base class for defining restraints for rigid-body dynamics.
Ostream & writeEntry(const keyType &key, const T &value)
Write a keyword/value entry.
SpatialVector< scalar > spatialVector
SpatialVector of scalars.
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
tensor rotationTensor(const vector &n1, const vector &n2)
Rotational transformation tensor from vector n1 to n2.
static const Identity< scalar > I