From 377d3df20c913eb1e05be2491600713dee97c648 Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Thu, 28 Jun 2012 16:08:53 +0100 Subject: [PATCH] ENH: rotor momentum source - trim model - enable target forces as well as force coeffs --- .../trimModel/targetCoeff/targetCoeffTrim.C | 56 +++++++++++++------ .../trimModel/targetCoeff/targetCoeffTrim.H | 9 ++- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.C b/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.C index abb5be0ae0e..4ed3f771201 100644 --- a/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.C +++ b/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.C @@ -70,21 +70,29 @@ Foam::vector Foam::targetCoeffTrim::calcCoeffs { label cellI = cells[i]; - // create normalisation coefficient - scalar radius = x[i].x(); - scalar coeff2 = coeff1*pow4(radius); - if (compressible) - { - coeff2 *= trho()[cellI]; - } - vector fc = force[cellI]; vector mc = fc^(C[cellI] - origin); - // add to coefficient vector - cf[0] += (fc & yawAxis)/(coeff2 + ROOTVSMALL); - cf[1] += (mc & pitchAxis)/(coeff2*radius + ROOTVSMALL); - cf[2] += (mc & rollAxis)/(coeff2*radius + ROOTVSMALL); + if (useCoeffs_) + { + scalar radius = x[i].x(); + scalar coeff2 = coeff1*pow4(radius); + if (compressible) + { + coeff2 *= trho()[cellI]; + } + + // add to coefficient vector + cf[0] += (fc & yawAxis)/(coeff2 + ROOTVSMALL); + cf[1] += (mc & pitchAxis)/(coeff2*radius + ROOTVSMALL); + cf[2] += (mc & rollAxis)/(coeff2*radius + ROOTVSMALL); + } + else + { + cf[0] += fc & yawAxis; + cf[1] += mc & pitchAxis; + cf[2] += mc & rollAxis; + } } reduce(cf, sumOp<vector>()); @@ -103,6 +111,7 @@ Foam::targetCoeffTrim::targetCoeffTrim : trimModel(rotor, dict, typeName), calcFrequency_(-1), + useCoeffs_(true), target_(vector::zero), theta_(vector::zero), nIter_(50), @@ -128,9 +137,16 @@ void Foam::targetCoeffTrim::read(const dictionary& dict) trimModel::read(dict); const dictionary& targetDict(coeffs_.subDict("target")); - target_[0] = readScalar(targetDict.lookup("thrustCoeff")); - target_[1] = readScalar(targetDict.lookup("pitchCoeff")); - target_[2] = readScalar(targetDict.lookup("rollCoeff")); + useCoeffs_ = targetDict.lookupOrDefault<bool>("useCoeffs", true); + word ext = ""; + if (useCoeffs_) + { + ext = "Coeff"; + } + + target_[0] = readScalar(targetDict.lookup("thrust" + ext)); + target_[1] = readScalar(targetDict.lookup("pitch" + ext)); + target_[2] = readScalar(targetDict.lookup("roll" + ext)); const dictionary& pitchAngleDict(coeffs_.subDict("pitchAngles")); theta_[0] = degToRad(readScalar(pitchAngleDict.lookup("theta0Ini"))); @@ -173,8 +189,14 @@ void Foam::targetCoeffTrim::correct(const vectorField& U, vectorField& force) { if (rotor_.mesh().time().timeIndex() % calcFrequency_ == 0) { + word calcType = "forces"; + if (useCoeffs_) + { + calcType = "coefficients"; + } + Info<< type() << ":" << nl - << " solving for target trim coefficients" << nl; + << " solving for target trim " << calcType << nl; const scalar rhoRef = rotor_.rhoRef(); @@ -237,7 +259,7 @@ void Foam::targetCoeffTrim::correct(const vectorField& U, vectorField& force) << "), iterations = " << iter << endl; } - Info<< " current and target coefficients:" << nl + Info<< " current and target " << calcType << nl << " thrust = " << old[0]*rhoRef << ", " << target_[0] << nl << " pitch = " << old[1]*rhoRef << ", " << target_[1] << nl << " roll = " << old[2]*rhoRef << ", " << target_[2] << nl diff --git a/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.H b/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.H index e387a4c1630..24d5732e99f 100644 --- a/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.H +++ b/src/fieldSources/basicSource/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.H @@ -25,7 +25,7 @@ Class Foam::targetCoeffTrim Description - Target trim coefficients + Target trim forces/coefficients Solves: @@ -43,8 +43,8 @@ Description Newton-Raphson iterative method. The solver tolerance can be user-input, using the 'tol' entry. - - The coefficients are determined using: + If coefficients are requested (useCoeffs = true), the force and moments + are normalised using: force c = --------------------------------- @@ -97,6 +97,9 @@ protected: //- Number of iterations between calls to 'correct' label calcFrequency_; + //- Flag to indicate whether to solve coeffs (true) or forces (false) + bool useCoeffs_; + //- Target coefficient vector (thrust force, roll moment, pitch moment) vector target_; -- GitLab