Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion ( const dictionary& dict, const dictionary& stateDict ) : motionState_(stateDict), motionState0_(), restraints_(), constraints_(), tConstraints_(tensor::I), rConstraints_(tensor::I), initialCentreOfMass_ ( dict.lookupOrDefault ( "initialCentreOfMass", vector(dict.lookup("centreOfMass")) ) ), initialCentreOfRotation_(initialCentreOfMass_), initialQ_ ( dict.lookupOrDefault ( "initialOrientation", dict.lookupOrDefault("orientation", tensor::I) ) ), mass_(readScalar(dict.lookup("mass"))), momentOfInertia_(dict.lookup("momentOfInertia")), aRelax_(dict.lookupOrDefault<scalar>("accelerationRelaxation", 1.0)), aDamp_(dict.lookupOrDefault<scalar>("accelerationDamping", 1.0)), report_(dict.lookupOrDefault<Switch>("report", false)), solver_(sixDoFSolver::New(dict.subDict("solver"), *this)) { addRestraints(dict); // Set constraints and initial centre of rotation // if different to the centre of mass addConstraints(dict); // If the centres of mass and rotation are different ... vector R(initialCentreOfMass_ - initialCentreOfRotation_); if (magSqr(R) > VSMALL) { // ... correct the moment of inertia tensor using parallel axes theorem momentOfInertia_ += mass_*diag(I*magSqr(R) - sqr(R)); // ... and if the centre of rotation is not specified for motion state // update it if (!stateDict.found("centreOfRotation")) { motionState_.centreOfRotation() = initialCentreOfRotation_; } } // Save the old-time motion state motionState0_ = motionState_; }
Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion(const dictionary& dict) : motionState_(dict), restraints_(), restraintNames_(), constraints_(), constraintNames_(), maxConstraintIterations_(0), initialCentreOfMass_ ( dict.lookupOrDefault("initialCentreOfMass", centreOfMass()) ), initialQ_ ( dict.lookupOrDefault("initialOrientation", Q()) ), momentOfInertia_(dict.lookup("momentOfInertia")), mass_(readScalar(dict.lookup("mass"))), cDamp_(dict.lookupOrDefault<scalar>("accelerationDampingCoeff", 0.0)), aLim_(dict.lookupOrDefault<scalar>("accelerationLimit", VGREAT)), report_(dict.lookupOrDefault<Switch>("report", false)) { addRestraints(dict); addConstraints(dict); }