diff --git a/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.C b/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.C index ed771efa6f..8b248991d5 100644 --- a/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.C +++ b/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.C @@ -50,7 +50,9 @@ sixDoFRigidBodyDisplacementPointPatchVectorField motion_(), initialPoints_(p.localPoints()), rhoInf_(1.0), - rhoName_("rho") + rhoName_("rho"), + lookupGravity_(-1), + g_(vector::zero) {} @@ -65,13 +67,22 @@ sixDoFRigidBodyDisplacementPointPatchVectorField fixedValuePointPatchField(p, iF, dict), motion_(dict), rhoInf_(1.0), - rhoName_(dict.lookupOrDefault("rhoName", "rho")) + rhoName_(dict.lookupOrDefault("rhoName", "rho")), + lookupGravity_(-1), + g_(vector::zero) { if (rhoName_ == "rhoInf") { rhoInf_ = readScalar(dict.lookup("rhoInf")); } + if (dict.found("g")) + { + lookupGravity_ = -2; + + g_ = dict.lookup("g"); + } + if (!dict.found("value")) { updateCoeffs(); @@ -101,7 +112,9 @@ sixDoFRigidBodyDisplacementPointPatchVectorField motion_(ptf.motion_), initialPoints_(ptf.initialPoints_, mapper), rhoInf_(ptf.rhoInf_), - rhoName_(ptf.rhoName_) + rhoName_(ptf.rhoName_), + lookupGravity_(ptf.lookupGravity_), + g_(ptf.g_) {} @@ -116,7 +129,9 @@ sixDoFRigidBodyDisplacementPointPatchVectorField motion_(ptf.motion_), initialPoints_(ptf.initialPoints_), rhoInf_(ptf.rhoInf_), - rhoName_(ptf.rhoName_) + rhoName_(ptf.rhoName_), + lookupGravity_(ptf.lookupGravity_), + g_(ptf.g_) {} @@ -155,6 +170,33 @@ void sixDoFRigidBodyDisplacementPointPatchVectorField::updateCoeffs() return; } + if (lookupGravity_ < 0) + { + if (db().foundObject("g")) + { + if (lookupGravity_ == -2) + { + FatalErrorIn + ( + "void sixDoFRigidBodyDisplacementPointPatchVectorField" + "::updateCoeffs()" + ) + << "Specifying the value of g in this boundary condition " + << "when g is available from the database is considered " + << "a fatal error to avoid the possibility of inconsistency" + << exit(FatalError); + } + else + { + lookupGravity_ = 1; + } + } + else + { + lookupGravity_ = 0; + } + } + const polyMesh& mesh = this->dimensionedInternalField().mesh()(); const Time& t = mesh.time(); const pointPatch& ptPatch = this->patch(); @@ -178,19 +220,17 @@ void sixDoFRigidBodyDisplacementPointPatchVectorField::updateCoeffs() // Get the forces on the patch faces at the current positions - vector gravity = vector::zero; - - if (db().foundObject("g")) + if (lookupGravity_ == 1) { uniformDimensionedVectorField g = db().lookupObject("g"); - gravity = g.value(); + g_ = g.value(); } motion_.updateForce ( - fm.first().first() + fm.first().second() + gravity*motion_.mass(), + fm.first().first() + fm.first().second() + g_*motion_.mass(), fm.second().first() + fm.second().second(), t.deltaTValue() ); @@ -207,12 +247,20 @@ void sixDoFRigidBodyDisplacementPointPatchVectorField::updateCoeffs() void sixDoFRigidBodyDisplacementPointPatchVectorField::write(Ostream& os) const { pointPatchField::write(os); + + os.writeKeyword("rhoInf") << rhoInf_ << token::END_STATEMENT << nl; + + os.writeKeyword("rhoName") << rhoName_ << token::END_STATEMENT << nl; + + if (lookupGravity_ == 0 || lookupGravity_ == -2) + { + os.writeKeyword("g") << g_ << token::END_STATEMENT << nl; + } + motion_.write(os); - os.writeKeyword("rhoInf") - << rhoInf_ << token::END_STATEMENT << nl; - os.writeKeyword("rhoName") - << rhoName_ << token::END_STATEMENT << nl; + initialPoints_.writeEntry("initialPoints", os); + writeEntry("value", os); } diff --git a/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.H b/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.H index 9c512ab9d3..ca1a3715e4 100644 --- a/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.H +++ b/src/postProcessing/functionObjects/forces/pointPatchFields/derived/sixDoFRigidBodyDisplacement/sixDoFRigidBodyDisplacementPointPatchVectorField.H @@ -68,6 +68,22 @@ class sixDoFRigidBodyDisplacementPointPatchVectorField // as rhoInf word rhoName_; + //- State of gravity lookup: + // -1 = not determined yet, as the BC may be instantiated before g has + // been read into the db yet. Determination deferred until first + // call to updateCoeffs. A g keyword was not supplied to the + // dictionary. + // -2 = as for -1, but a gravity value was specified in the dictionary, + // specifying a value in the dictionary is considered a fatal + // error if g is available from the db. + // 0 = Use this boundary condition's own value of gravity, as not + // available from the db. + // 1 = Lookup gravity from db. + label lookupGravity_; + + //- Gravity vector to store when not available from the db + vector g_; + public: