57 { geometryModeType::gmAuto,
"auto" },
58 { geometryModeType::gmSpecified,
"specified" },
68 { inletFlowType::ifFixed,
"fixed" },
69 { inletFlowType::ifSurfaceNormal,
"surfaceNormal" },
70 { inletFlowType::ifLocal,
"local" },
79 switch (selectionMode())
86 profiles_.connectBlades(blade_.profileName(), blade_.profileID());
91 coeffs_.readEntry(
"inletVelocity", inletVelocity_);
96 scalar UIn(coeffs_.get<scalar>(
"inletNormalVelocity"));
97 inletVelocity_ = -coordSys_.e3()*UIn;
116 <<
"Source cannot be used with '" 117 << selectionModeTypeNames_[selectionMode()]
118 <<
"' mode. Please use one of: " <<
nl 119 << selectionModeTypeNames_[smCellSet] <<
nl 120 << selectionModeTypeNames_[smCellZone] <<
nl 121 << selectionModeTypeNames_[smAll]
132 static const scalar tol = 0.8;
134 const label nInternalFaces = mesh_.nInternalFaces();
135 const polyBoundaryMesh&
pbm = mesh_.boundaryMesh();
144 labelList nbrFaceCellAddr(mesh_.nBoundaryFaces(), -1);
147 const polyPatch&
pp =
pbm[patchi];
153 label facei =
pp.start() + i;
154 label nbrFacei = facei - nInternalFaces;
155 label own = mesh_.faceOwner()[facei];
156 nbrFaceCellAddr[nbrFacei] = cellAddr[own];
165 for (label facei = 0; facei < nInternalFaces; facei++)
167 const label own = cellAddr[mesh_.faceOwner()[facei]];
168 const label nbr = cellAddr[mesh_.faceNeighbour()[facei]];
170 if ((own != -1) && (nbr == -1))
172 vector nf = Sf[facei]/magSf[facei];
174 if ((nf & axis) > tol)
176 area_[own] += magSf[facei];
180 else if ((own == -1) && (nbr != -1))
182 vector nf = Sf[facei]/magSf[facei];
184 if ((-nf & axis) > tol)
186 area_[nbr] += magSf[facei];
196 const polyPatch&
pp =
pbm[patchi];
197 const vectorField& Sfp = mesh_.Sf().boundaryField()[patchi];
198 const scalarField& magSfp = mesh_.magSf().boundaryField()[patchi];
204 const label facei =
pp.start() + j;
205 const label own = cellAddr[mesh_.faceOwner()[facei]];
206 const label nbr = nbrFaceCellAddr[facei - nInternalFaces];
207 const vector nf = Sfp[j]/magSfp[j];
209 if ((own != -1) && (nbr == -1) && ((nf & axis) > tol))
211 area_[own] += magSfp[j];
220 const label facei =
pp.start() + j;
221 const label own = cellAddr[mesh_.faceOwner()[facei]];
222 const vector nf = Sfp[j]/magSfp[j];
224 if ((own != -1) && ((nf & axis) > tol))
226 area_[own] += magSfp[j];
248 auto&
area = tarea.ref();
250 UIndirectList<scalar>(
area.primitiveFieldRef(), cells_) = area_;
267 geometryModeType gm =
268 geometryModeTypeNames_.get(
"geometryMode", coeffs_);
280 const label celli = cells_[i];
282 origin += V[celli]*
C[celli];
290 scalar magR = -GREAT;
293 const label celli = cells_[i];
294 vector test =
C[celli] - origin;
295 if (
mag(test) > magR)
307 const label celli = cells_[i];
308 vector dx2 =
C[celli] - origin;
309 if (
mag(dx2) > 0.5*magR)
312 if (
mag(axis) > SMALL)
324 vector dir = pointAbove - origin;
326 if ((dir & axis) < 0)
332 coeffs_.readEntry(
"refDirection", refDir);
336 setFaceArea(axis,
true);
342 coeffs_.readEntry(
"origin", origin);
343 coeffs_.readEntry(
"axis", axis);
344 coeffs_.readEntry(
"refDirection", refDir);
346 setFaceArea(axis,
false);
353 <<
"Unknown geometryMode " << geometryModeTypeNames_[gm]
354 <<
". Available geometry modes include " 355 << geometryModeTypeNames_
360 coordSys_ = coordSystem::cylindrical(origin, axis, refDir);
362 const scalar sumArea =
gSum(area_);
364 Info<<
" Rotor gometry:" <<
nl 365 <<
" - disk diameter = " << diameter <<
nl 366 <<
" - disk area = " << sumArea <<
nl 367 <<
" - origin = " << coordSys_.origin() <<
nl 368 <<
" - r-axis = " << coordSys_.e1() <<
nl 369 <<
" - psi-axis = " << coordSys_.e2() <<
nl 370 <<
" - z-axis = " << coordSys_.e3() <<
endl;
383 if (area_[i] > ROOTVSMALL)
386 x_[i] = coordSys_.localPosition(cc[i]);
389 rMax_ =
max(rMax_, x_[i].
x());
392 scalar
psi = x_[i].y();
396 flap_.beta0 - flap_.beta1c*
cos(
psi) - flap_.beta2s*
sin(
psi);
416 case ifSurfaceNormal:
424 return U.primitiveField();
444 const word& modelType,
455 inletVelocity_(
Zero),
458 x_(cells_.size(),
Zero),
459 Rcone_(cells_.size(),
I),
460 area_(cells_.size(),
Zero),
464 blade_(coeffs_.subDict(
"blade")),
465 profiles_(coeffs_.subDict(
"profiles"))
486 auto& force = tforce.ref();
489 coeffs_.readEntry(
"rhoRef", rhoRef_);
492 trim_->correct(Uin, force);
498 if (mesh_.time().writeTime())
519 auto& force = tforce.ref();
522 trim_->correct(
rho, Uin, force);
523 calculate(
rho, Uin, trim_->thetag(), force);
528 if (mesh_.time().writeTime())
539 coeffs_.readEntry(
"fields", fieldNames_);
543 omega_ =
rpmToRads(coeffs_.get<scalar>(
"rpm"));
545 coeffs_.readEntry(
"nBlades", nBlades_);
547 inletFlowTypeNames_.readEntry(
"inletFlowType", coeffs_, inletFlow_);
549 coeffs_.readEntry(
"tipEffect", tipEffect_);
551 const dictionary& flapCoeffs(coeffs_.subDict(
"flapCoeffs"));
552 flap_.beta0 =
degToRad(flapCoeffs.get<scalar>(
"beta0"));
553 flap_.beta1c =
degToRad(flapCoeffs.get<scalar>(
"beta1c"));
554 flap_.beta2s =
degToRad(flapCoeffs.get<scalar>(
"beta2s"));
558 createCoordinateSystem();
565 trim_->read(coeffs_);
569 writeField(
"thetag", trim_->thetag()(),
true);
Different types of constants.
const polyBoundaryMesh & pbm
Graphite solid properties.
errorManipArg< error, int > exit(error &err, const int errNo=1)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
constexpr scalar rpmToRads(const scalar rpm) noexcept
Conversion from revolutions/minute to radians/sec.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Unit conversion functions.
constexpr char nl
The newline '\n' character (0x0a)
virtual bool read(const dictionary &dict)
Read source dictionary.
Base class for trim models for handling blade characteristics and thrust-torque relations.
UIndirectList< label > labelUIndList
UIndirectList of labels.
dimensioned< vector > dimensionedVector
Dimensioned vector obtained from generic dimensioned type.
dimensionedScalar sqrt(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
virtual bool read(const dictionary &dict)
Read source dictionary.
bool writeField(ensightOutput::floatBufferType &scratch, ensightFile &os, const Field< Type > &fld, const ensightCells &part, bool parallel)
Write a field of cell values as an indirect list, using the cell ids from ensightCells.
GeometricField< vector, fvPatchField, volMesh > volVectorField
Macros for easy insertion into run-time selection tables.
rotorDiskSource(const word &name, const word &modelType, const dictionary &dict, const fvMesh &mesh)
Construct from components.
#define forAll(list, i)
Loop across all elements in list.
void constructGeometry()
Construct geometry.
geometryModeType
Options for the geometry type specification.
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
const dimensionSet dimVolume(pow3(dimLength))
static word scopedName(const std::string &scope, const word &name)
Create scope:name or scope_name string.
const GeometricField< Type, fvPatchField, volMesh > & psi(const label i=0) const
Return psi.
A class representing the concept of a GeometricField of 1 used to avoid unnecessary manipulations for...
Type gSum(const FieldField< Field, Type > &f)
dimensionedScalar cos(const dimensionedScalar &ds)
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
static const Identity< scalar > I
labelList identity(const label len, label start=0)
Return an identity map of the given length with (map[i] == i), works like std::iota() but returning a...
const wordList area
Standard area field types (scalar, vector, tensor, etc)
A class for handling words, derived from Foam::string.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
static const Enum< inletFlowType > inletFlowTypeNames_
Names for inletFlowType.
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
constexpr scalar pi(M_PI)
A special matrix type and solver, designed for finite volume solutions of scalar equations. Face addressing is used to make all matrix assembly and solution loops vectorise.
errorManip< error > abort(error &err)
static tmp< GeometricField< scalar, fvPatchField, volMesh > > New(const word &name, IOobjectOption::registerOption regOpt, const Mesh &mesh, const dimensionSet &dims, const word &patchFieldType=fvPatchField< scalar >::calculatedType())
Return tmp field (NO_READ, NO_WRITE) from name, mesh, dimensions and patch type. [Takes current timeN...
dimensionedScalar sin(const dimensionedScalar &ds)
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
virtual void addSup(fvMatrix< vector > &eqn, const label fieldi)
Add explicit contribution to momentum equation.
inletFlowType
Options for the inlet flow type specification.
int debug
Static debugging option.
Info<< "Predicted p max-min : "<< max(p).value()<< " "<< min(p).value()<< endl;rho==max(psi *p+alphal *rhol0+((alphav *psiv+alphal *psil) - psi) *pSat, rhoMin);# 1 "/home/chef2/andy/OpenFOAM/release/v2406/OpenFOAM-v2406/applications/solvers/multiphase/cavitatingFoam/alphavPsi.H" 1{ alphav=clamp((rho - rholSat)/(rhovSat - rholSat), zero_one{});alphal=1.0 - alphav;Info<< "max-min alphav: "<< max(alphav).value()<< " "<< min(alphav).value()<< endl;psiModel-> correct()
defineTypeNameAndDebug(combustionModel, 0)
void checkData()
Check data.
const dimensionSet & dimensions() const noexcept
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
static const Enum< geometryModeType > geometryModeTypeNames_
Names for geometryModeType.
Mesh data needed to do the Finite Volume discretisation.
A List with indirect addressing. Like IndirectList but does not store addressing. ...
const dimensionedScalar c
Speed of light in a vacuum.
void resetApplied()
Resize/reset applied flag list for all fieldNames_ entries.
A special matrix type and solver, designed for finite volume solutions of scalar equations.
messageStream Info
Information stream (stdout output on master, null elsewhere)
dimensionedScalar beta("beta", dimless/dimTemperature, laminarTransport)
Field< vector > vectorField
Specialisation of Field<T> for vector.
Intermediate abstract class for handling cell-set options for the derived fvOptions.
const volScalarField & psi
List< label > labelList
A List of labels.
void setFaceArea(vector &axis, const bool correct)
Set the face areas per cell, and optionally correct the rotor axis.
A class for managing temporary objects.
label checkData(const objectRegistry &obr, const instantList &timeDirs, wordList &objectNames, const fileName &local=fileName::null)
Check if fields are good to use (available at all times)
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
constexpr scalar degToRad(const scalar deg) noexcept
Conversion from degrees to radians.
void createCoordinateSystem()
Create the coordinate system.
Do not request registration (bool: false)
void reduce(T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce) using linear/tree communication schedule.
tmp< vectorField > inflowVelocity(const volVectorField &U) const
Return the inlet flow field.
const dimensionSet dimArea(sqr(dimLength))
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
addToRunTimeSelectionTable(functionObject, pointHistory, dictionary)
static constexpr const zero Zero
Global zero (0)