Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "fixedAxis.H"
00027 #include <OpenFOAM/addToRunTimeSelectionTable.H>
00028 #include <forces/sixDoFRigidBodyMotion.H>
00029
00030
00031
00032 namespace Foam
00033 {
00034 namespace sixDoFRigidBodyMotionConstraints
00035 {
00036 defineTypeNameAndDebug(fixedAxis, 0);
00037 addToRunTimeSelectionTable
00038 (
00039 sixDoFRigidBodyMotionConstraint,
00040 fixedAxis,
00041 dictionary
00042 );
00043 };
00044 };
00045
00046
00047
00048
00049 Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::fixedAxis
00050 (
00051 const dictionary& sDoFRBMCDict
00052 )
00053 :
00054 sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
00055 fixedAxis_()
00056 {
00057 read(sDoFRBMCDict);
00058 }
00059
00060
00061
00062
00063 Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::~fixedAxis()
00064 {}
00065
00066
00067
00068
00069 bool Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::constrain
00070 (
00071 const sixDoFRigidBodyMotion& motion,
00072 const vector& existingConstraintForce,
00073 const vector& existingConstraintMoment,
00074 scalar deltaT,
00075 vector& constraintPosition,
00076 vector& constraintForceIncrement,
00077 vector& constraintMomentIncrement
00078 ) const
00079 {
00080 constraintMomentIncrement = vector::zero;
00081
00082 vector predictedDir = motion.predictedOrientation
00083 (
00084 fixedAxis_,
00085 existingConstraintMoment,
00086 deltaT
00087 );
00088
00089 scalar theta = acos(min(predictedDir & fixedAxis_, 1.0));
00090
00091 vector rotationAxis = fixedAxis_ ^ predictedDir;
00092
00093 scalar magRotationAxis = mag(rotationAxis);
00094
00095 if (magRotationAxis > VSMALL)
00096 {
00097 rotationAxis /= magRotationAxis;
00098
00099 const tensor& Q = motion.orientation();
00100
00101
00102 rotationAxis = Q.T() & rotationAxis;
00103
00104 constraintMomentIncrement =
00105 -relaxationFactor_
00106 *(motion.momentOfInertia() & rotationAxis)
00107 *theta/sqr(deltaT);
00108
00109
00110 constraintMomentIncrement = Q & constraintMomentIncrement;
00111
00112
00113 constraintMomentIncrement -=
00114 (constraintMomentIncrement & fixedAxis_)*fixedAxis_;
00115 }
00116
00117 constraintPosition = motion.centreOfMass();
00118
00119 constraintForceIncrement = vector::zero;
00120
00121 bool converged(mag(theta) < tolerance_);
00122
00123 if (sixDoFRigidBodyMotionConstraint::debug)
00124 {
00125 Info<< " angle " << theta
00126 << " force " << constraintForceIncrement
00127 << " moment " << constraintMomentIncrement;
00128
00129 if (converged)
00130 {
00131 Info<< " converged";
00132 }
00133 else
00134 {
00135 Info<< " not converged";
00136 }
00137
00138 Info<< endl;
00139 }
00140
00141 return converged;
00142 }
00143
00144
00145 bool Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::read
00146 (
00147 const dictionary& sDoFRBMCDict
00148 )
00149 {
00150 sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
00151
00152 sDoFRBMCCoeffs_.lookup("axis") >> fixedAxis_;
00153
00154 scalar magFixedAxis(mag(fixedAxis_));
00155
00156 if (magFixedAxis > VSMALL)
00157 {
00158 fixedAxis_ /= magFixedAxis;
00159 }
00160 else
00161 {
00162 FatalErrorIn
00163 (
00164 "Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::read"
00165 "("
00166 "const dictionary& sDoFRBMCDict"
00167 ")"
00168 )
00169 << "axis has zero length"
00170 << abort(FatalError);
00171 }
00172
00173 return true;
00174 }
00175
00176
00177 void Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::write
00178 (
00179 Ostream& os
00180 ) const
00181 {
00182 os.writeKeyword("axis")
00183 << fixedAxis_ << token::END_STATEMENT << nl;
00184 }
00185
00186