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];
246 mesh_.time().timeName(),
254 UIndirectList<scalar>(
area.primitiveField(), cells_) = area_;
256 Info<<
type() <<
": " << name_ <<
" writing field " <<
area.name()
271 geometryModeType gm =
272 geometryModeTypeNames_.get(
"geometryMode", coeffs_);
284 const label celli = cells_[i];
286 origin += V[celli]*
C[celli];
294 scalar magR = -GREAT;
297 const label celli = cells_[i];
298 vector test =
C[celli] - origin;
299 if (
mag(test) > magR)
311 const label celli = cells_[i];
312 vector dx2 =
C[celli] - origin;
313 if (
mag(dx2) > 0.5*magR)
316 if (
mag(axis) > SMALL)
328 vector dir = pointAbove - origin;
330 if ((dir & axis) < 0)
336 coeffs_.readEntry(
"refDirection", refDir);
340 setFaceArea(axis,
true);
346 coeffs_.readEntry(
"origin", origin);
347 coeffs_.readEntry(
"axis", axis);
348 coeffs_.readEntry(
"refDirection", refDir);
350 setFaceArea(axis,
false);
357 <<
"Unknown geometryMode " << geometryModeTypeNames_[gm]
358 <<
". Available geometry modes include " 359 << geometryModeTypeNames_
364 coordSys_ = coordSystem::cylindrical(origin, axis, refDir);
366 const scalar sumArea =
gSum(area_);
368 Info<<
" Rotor gometry:" <<
nl 369 <<
" - disk diameter = " << diameter <<
nl 370 <<
" - disk area = " << sumArea <<
nl 371 <<
" - origin = " << coordSys_.origin() <<
nl 372 <<
" - r-axis = " << coordSys_.e1() <<
nl 373 <<
" - psi-axis = " << coordSys_.e2() <<
nl 374 <<
" - z-axis = " << coordSys_.e3() <<
endl;
387 if (area_[i] > ROOTVSMALL)
390 x_[i] = coordSys_.localPosition(cc[i]);
393 rMax_ =
max(rMax_, x_[i].
x());
396 scalar
psi = x_[i].y();
400 flap_.beta0 - flap_.beta1c*
cos(
psi) - flap_.beta2s*
sin(
psi);
420 case ifSurfaceNormal:
428 return U.primitiveField();
448 const word& modelType,
459 inletVelocity_(
Zero),
462 x_(cells_.size(),
Zero),
463 Rcone_(cells_.size(),
I),
464 area_(cells_.size(),
Zero),
468 blade_(coeffs_.subDict(
"blade")),
469 profiles_(coeffs_.subDict(
"profiles"))
487 name_ +
":rotorForce",
488 mesh_.time().timeName(),
496 coeffs_.readEntry(
"rhoRef", rhoRef_);
499 trim_->correct(Uin, force);
505 if (mesh_.time().writeTime())
523 name_ +
":rotorForce",
524 mesh_.time().timeName(),
532 trim_->correct(
rho, Uin, force);
533 calculate(
rho, Uin, trim_->thetag(), force);
538 if (mesh_.time().writeTime())
549 coeffs_.readEntry(
"fields", fieldNames_);
553 omega_ =
rpmToRads(coeffs_.get<scalar>(
"rpm"));
555 coeffs_.readEntry(
"nBlades", nBlades_);
557 inletFlowTypeNames_.readEntry(
"inletFlowType", coeffs_, inletFlow_);
559 coeffs_.readEntry(
"tipEffect", tipEffect_);
561 const dictionary& flapCoeffs(coeffs_.subDict(
"flapCoeffs"));
562 flap_.beta0 =
degToRad(flapCoeffs.get<scalar>(
"beta0"));
563 flap_.beta1c =
degToRad(flapCoeffs.get<scalar>(
"beta1c"));
564 flap_.beta2s =
degToRad(flapCoeffs.get<scalar>(
"beta2s"));
568 createCoordinateSystem();
575 trim_->read(coeffs_);
579 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.
Ignore writing from objectRegistry::writeObject()
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.
GeometricField< scalar, fvPatchField, volMesh > volScalarField
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))
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 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)
const wordList area
Standard area field types (scalar, vector, tensor, etc)
label checkData(const fvMesh &mesh, const instantList &timeDirs, wordList &objectNames)
Check if fields are good to use (available at all times)
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)
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/v2306/OpenFOAM-v2306/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)
addToRunTimeSelectionTable(decompositionMethod, kahipDecomp, dictionary)
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.
void reduce(const List< UPstream::commsStruct > &comms, T &value, const BinaryOp &bop, const int tag, const label comm)
Reduce inplace (cf. MPI Allreduce) using specified communication schedule.
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.
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.
Defines the attributes of an object for which implicit objectRegistry management is supported...
void createCoordinateSystem()
Create the coordinate system.
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())
static constexpr const zero Zero
Global zero (0)