diff --git a/src/postProcessing/functionObjects/forces/forceCoeffs/forceCoeffs.C b/src/postProcessing/functionObjects/forces/forceCoeffs/forceCoeffs.C index 46d6225c04aa56b63460130e10aa91cb5b590f2d..7f094c2e3fd06268a72301b5876ad6fde15920c7 100644 --- a/src/postProcessing/functionObjects/forces/forceCoeffs/forceCoeffs.C +++ b/src/postProcessing/functionObjects/forces/forceCoeffs/forceCoeffs.C @@ -156,80 +156,82 @@ void Foam::forceCoeffs::timeSet() void Foam::forceCoeffs::write() { - if (active_) + forces::calcForcesMoment(); + + if (!active_) { - forces::calcForcesMoment(); + return; + } - if (Pstream::master()) - { - functionObjectFile::write(); + if (Pstream::master()) + { + functionObjectFile::write(); - scalar pDyn = 0.5*rhoRef_*magUInf_*magUInf_; + scalar pDyn = 0.5*rhoRef_*magUInf_*magUInf_; - Field<vector> totForce(force_[0] + force_[1] + force_[2]); - Field<vector> totMoment(moment_[0] + moment_[1] + moment_[2]); + Field<vector> totForce(force_[0] + force_[1] + force_[2]); + Field<vector> totMoment(moment_[0] + moment_[1] + moment_[2]); - List<Field<scalar> > coeffs(3); - coeffs[0].setSize(nBin_); - coeffs[1].setSize(nBin_); - coeffs[2].setSize(nBin_); + List<Field<scalar> > coeffs(3); + coeffs[0].setSize(nBin_); + coeffs[1].setSize(nBin_); + coeffs[2].setSize(nBin_); - // lift, drag and moment - coeffs[0] = (totForce & liftDir_)/(Aref_*pDyn); - coeffs[1] = (totForce & dragDir_)/(Aref_*pDyn); - coeffs[2] = (totMoment & pitchAxis_)/(Aref_*lRef_*pDyn); + // lift, drag and moment + coeffs[0] = (totForce & liftDir_)/(Aref_*pDyn); + coeffs[1] = (totForce & dragDir_)/(Aref_*pDyn); + coeffs[2] = (totMoment & pitchAxis_)/(Aref_*lRef_*pDyn); - scalar Cl = sum(coeffs[0]); - scalar Cd = sum(coeffs[1]); - scalar Cm = sum(coeffs[2]); + scalar Cl = sum(coeffs[0]); + scalar Cd = sum(coeffs[1]); + scalar Cm = sum(coeffs[2]); - scalar Clf = Cl/2.0 + Cm; - scalar Clr = Cl/2.0 - Cm; + scalar Clf = Cl/2.0 + Cm; + scalar Clr = Cl/2.0 - Cm; - file(0) - << obr_.time().value() << tab - << Cm << tab << Cd << tab << Cl << tab << Clf << tab << Clr - << endl; + file(0) + << obr_.time().value() << tab + << Cm << tab << Cd << tab << Cl << tab << Clf << tab << Clr + << endl; - if (log_) - { - Info<< type() << " output:" << nl - << " Cm = " << Cm << nl - << " Cd = " << Cd << nl - << " Cl = " << Cl << nl - << " Cl(f) = " << Clf << nl - << " Cl(r) = " << Clr << endl; - } + if (log_) + { + Info<< type() << " output:" << nl + << " Cm = " << Cm << nl + << " Cd = " << Cd << nl + << " Cl = " << Cl << nl + << " Cl(f) = " << Clf << nl + << " Cl(r) = " << Clr << endl; + } - if (nBin_ > 1) + if (nBin_ > 1) + { + if (binCumulative_) { - if (binCumulative_) + for (label i = 1; i < coeffs[0].size(); i++) { - for (label i = 1; i < coeffs[0].size(); i++) - { - coeffs[0][i] += coeffs[0][i-1]; - coeffs[1][i] += coeffs[1][i-1]; - coeffs[2][i] += coeffs[2][i-1]; - } + coeffs[0][i] += coeffs[0][i-1]; + coeffs[1][i] += coeffs[1][i-1]; + coeffs[2][i] += coeffs[2][i-1]; } - - file(1)<< obr_.time().value(); - - forAll(coeffs[0], i) - { - file(1) - << tab << coeffs[2][i] - << tab << coeffs[1][i] - << tab << coeffs[0][i]; - } - - file(1) << endl; } - if (log_) + file(1)<< obr_.time().value(); + + forAll(coeffs[0], i) { - Info<< endl; + file(1) + << tab << coeffs[2][i] + << tab << coeffs[1][i] + << tab << coeffs[0][i]; } + + file(1) << endl; + } + + if (log_) + { + Info<< endl; } } } diff --git a/src/postProcessing/functionObjects/forces/forces/forces.C b/src/postProcessing/functionObjects/forces/forces/forces.C index 012ab5d49711043aba8a4048c52be671509594a6..38ab09ada640f9eee81f01ba1443b4180f626fef 100644 --- a/src/postProcessing/functionObjects/forces/forces/forces.C +++ b/src/postProcessing/functionObjects/forces/forces/forces.C @@ -130,6 +130,55 @@ void Foam::forces::writeFileHeader(const label i) } +void Foam::forces::initialise() +{ + if (initialised_ || !active_) + { + return; + } + + if (directForceDensity_) + { + if (!obr_.foundObject<volVectorField>(fDName_)) + { + active_ = false; + WarningIn("void Foam::forces::initialise()") + << "Could not find " << fDName_ << " in database." << nl + << " De-activating forces." + << endl; + } + } + else + { + if + ( + !obr_.foundObject<volVectorField>(UName_) + || !obr_.foundObject<volScalarField>(pName_) + || ( + rhoName_ != "rhoInf" + && !obr_.foundObject<volScalarField>(rhoName_) + ) + ) + { + active_ = false; + + WarningIn("void Foam::forces::initialise()") + << "Could not find " << UName_ << ", " << pName_; + + if (rhoName_ != "rhoInf") + { + Info<< " or " << rhoName_; + } + + Info<< " in database." << nl + << " De-activating forces." << endl; + } + } + + initialised_ = true; +} + + Foam::tmp<Foam::volSymmTensorField> Foam::forces::devRhoReff() const { typedef compressible::turbulenceModel cmpTurbModel; @@ -474,7 +523,8 @@ Foam::forces::forces binMin_(GREAT), binPoints_(), binFormat_("undefined"), - binCumulative_(true) + binCumulative_(true), + initialised_(false) { // Check if the available mesh is an fvMesh otherise deactivate if (!isA<fvMesh>(obr_)) @@ -534,7 +584,8 @@ Foam::forces::forces binMin_(GREAT), binPoints_(), binFormat_("undefined"), - binCumulative_(true) + binCumulative_(true), + initialised_(false) { forAll(force_, i) { @@ -556,6 +607,8 @@ void Foam::forces::read(const dictionary& dict) { if (active_) { + initialised_ = false; + log_ = dict.lookupOrDefault<Switch>("log", false); directForceDensity_ = dict.lookupOrDefault("directForceDensity", false); @@ -568,19 +621,6 @@ void Foam::forces::read(const dictionary& dict) { // Optional entry for fDName fDName_ = dict.lookupOrDefault<word>("fDName", "fD"); - - // Check whether fDName exists, if not deactivate forces - if - ( - !obr_.foundObject<volVectorField>(fDName_) - ) - { - active_ = false; - WarningIn("void forces::read(const dictionary&)") - << "Could not find " << fDName_ << " in database." << nl - << " De-activating forces." - << endl; - } } else { @@ -589,32 +629,6 @@ void Foam::forces::read(const dictionary& dict) UName_ = dict.lookupOrDefault<word>("UName", "U"); rhoName_ = dict.lookupOrDefault<word>("rhoName", "rho"); - // Check whether UName, pName and rhoName exists, - // if not deactivate forces - if - ( - !obr_.foundObject<volVectorField>(UName_) - || !obr_.foundObject<volScalarField>(pName_) - || ( - rhoName_ != "rhoInf" - && !obr_.foundObject<volScalarField>(rhoName_) - ) - ) - { - active_ = false; - - WarningIn("void forces::read(const dictionary&)") - << "Could not find " << UName_ << ", " << pName_; - - if (rhoName_ != "rhoInf") - { - Info<< " or " << rhoName_; - } - - Info<< " in database." << nl - << " De-activating forces." << endl; - } - // Reference density needed for incompressible calculations rhoRef_ = readScalar(dict.lookup("rhoInf")); @@ -745,13 +759,13 @@ void Foam::forces::timeSet() void Foam::forces::write() { + calcForcesMoment(); + if (!active_) { return; } - calcForcesMoment(); - if (Pstream::master()) { functionObjectFile::write(); @@ -770,6 +784,13 @@ void Foam::forces::write() void Foam::forces::calcForcesMoment() { + initialise(); + + if (!active_) + { + return; + } + force_[0] = vector::zero; force_[1] = vector::zero; force_[2] = vector::zero; diff --git a/src/postProcessing/functionObjects/forces/forces/forces.H b/src/postProcessing/functionObjects/forces/forces/forces.H index 079c6e483db36f3e1e2a39985f47a9f36024461e..ce2bcf4fe76a3a77b875ac255850d4f3c4ae9870 100644 --- a/src/postProcessing/functionObjects/forces/forces/forces.H +++ b/src/postProcessing/functionObjects/forces/forces/forces.H @@ -32,7 +32,8 @@ Description pressure and skin-friction forces over a given list of patches. Member function forces::write() calculates the forces/moments and - writes the forces/moments into the file \<timeDir\>/forces.dat + writes the forces/moments into the file \<timeDir\>/forces.dat and bin + data (if selected) to the file \<timeDir\>/forces_bin.dat Example of function object specification: \verbatim @@ -45,7 +46,6 @@ Description patches (walls); nBin 20; binDir (1 0 0); - binFormat gnuplot; } \endverbatim @@ -57,7 +57,6 @@ Description patches | patches included in the forces calculation | yes | nBin | number of data bins | no | binDir | direction along which bins are defined | no | - binFormat | output format for bin data | no | pName | pressure field name | no | p UName | velocity field name | no | U rhoName | density field name (see below) | no | rho @@ -216,6 +215,10 @@ protected: bool binCumulative_; + //- Initialised flag + bool initialised_; + + // Protected Member Functions //- Create file names for forces and bins @@ -224,6 +227,9 @@ protected: //- Output file header information virtual void writeFileHeader(const label i); + //- Initialise the fields + void initialise(); + //- Return the effective viscous stress (laminar + turbulent). tmp<volSymmTensorField> devRhoReff() const;