rotorDisk.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2025 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "rotorDisk.H"
27 #include "fvMatrices.H"
28 #include "geometricOneField.H"
29 #include "syncTools.H"
30 #include "axesRotation.H"
31 #include "omega.H"
33 
34 using namespace Foam::constant;
35 
36 // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
37 
38 namespace Foam
39 {
40 namespace fv
41 {
45  (
46  fvModel,
47  rotorDisk,
48  dictionary,
49  rotorDiskSource,
50  "rotorDiskSource"
51  );
52 }
53 }
54 
55 
58 {
59  "auto",
60  "specified"
61 };
62 
65 {
66  "fixed",
67  "surfaceNormal",
68  "local"
69 };
70 
71 
72 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
73 
74 void Foam::fv::rotorDisk::readCoeffs(const dictionary& dict)
75 {
76  UName_ = dict.lookupOrDefault<word>("U", "U");
77 
78  omega_ = Foam::omega(coeffs(dict)).value();
79 
80  dict.lookup("nBlades") >> nBlades_;
81 
82  inletFlow_ = inletFlowTypeNames_.read(dict.lookup("inletFlowType"));
83 
84  dict.lookup("tipEffect") >> tipEffect_;
85 
86  const dictionary& flapCoeffs(dict.subDict("flapCoeffs"));
87  flap_.beta0 = flapCoeffs.lookup<scalar>("beta0", unitDegrees);
88  flap_.beta1c = flapCoeffs.lookup<scalar>("beta1c", unitDegrees);
89  flap_.beta2s = flapCoeffs.lookup<scalar>("beta2s", unitDegrees);
90 
91  // Create co-ordinate system
92  createCoordinateSystem(dict);
93 
94  // Read co-odinate system dependent properties
95  checkData(dict);
96 
97  constructGeometry();
98 
99  trim_->read(coeffs(dict));
100 
101  if (debug)
102  {
103  writeField("thetag", trim_->thetag()());
104  writeField("faceArea", area_);
105  }
106 
107  // Optionally read the reference density for incompressible flow
108  if (dict.found("rhoRef"))
109  {
110  dict.lookup("rhoRef") >> rhoRef_;
111  }
112 }
113 
114 
115 void Foam::fv::rotorDisk::checkData(const dictionary& dict)
116 {
117  // Set the profile ID for each blade section
118  profiles_.connectBlades
119  (
120  blade_.profileName(),
121  blade_.profileIndex()
122  );
123  switch (inletFlow_)
124  {
126  {
127  dict.lookup("inletVelocity") >> inletVelocity_;
128  break;
129  }
130  case inletFlowType::surfaceNormal:
131  {
132  scalar UIn
133  (
134  dict.lookup<scalar>("inletNormalVelocity")
135  );
136  inletVelocity_ = -coordSys_.R().e3()*UIn;
137  break;
138  }
139  case inletFlowType::local:
140  {
141  break;
142  }
143  default:
144  {
146  << "Unknown inlet velocity type" << abort(FatalError);
147  }
148  }
149 }
150 
151 
152 void Foam::fv::rotorDisk::setFaceArea(vector& axis, const bool correct)
153 {
154  area_ = 0.0;
155 
156  static const scalar tol = 0.8;
157 
158  const label nInternalFaces = mesh().nInternalFaces();
159  const polyBoundaryMesh& pbm = mesh().boundaryMesh();
160  const vectorField& Sf = mesh().Sf();
161  const scalarField& magSf = mesh().magSf();
162 
163  vector n = Zero;
164 
165  // Calculate cell addressing for selected cells
166  labelList cellAddr(mesh().nCells(), -1);
167  UIndirectList<label>(cellAddr, zone_.zone()) =
168  identityMap(zone_.nCells());
169  labelList nbrFaceCellAddr(mesh().nFaces() - nInternalFaces, -1);
170  forAll(pbm, patchi)
171  {
172  const polyPatch& pp = pbm[patchi];
173 
174  if (pp.coupled())
175  {
176  forAll(pp, i)
177  {
178  label facei = pp.start() + i;
179  label nbrFacei = facei - nInternalFaces;
180  label own = mesh().faceOwner()[facei];
181  nbrFaceCellAddr[nbrFacei] = cellAddr[own];
182  }
183  }
184  }
185 
186  // Correct for parallel running
187  syncTools::swapBoundaryFaceList(mesh(), nbrFaceCellAddr);
188 
189  // Add internal field contributions
190  for (label facei = 0; facei < nInternalFaces; facei++)
191  {
192  const label own = cellAddr[mesh().faceOwner()[facei]];
193  const label nbr = cellAddr[mesh().faceNeighbour()[facei]];
194 
195  if ((own != -1) && (nbr == -1))
196  {
197  vector nf = Sf[facei]/magSf[facei];
198 
199  if ((nf & axis) > tol)
200  {
201  area_[own] += magSf[facei];
202  n += Sf[facei];
203  }
204  }
205  else if ((own == -1) && (nbr != -1))
206  {
207  vector nf = Sf[facei]/magSf[facei];
208 
209  if ((-nf & axis) > tol)
210  {
211  area_[nbr] += magSf[facei];
212  n -= Sf[facei];
213  }
214  }
215  }
216 
217 
218  // Add boundary contributions
219  forAll(pbm, patchi)
220  {
221  const polyPatch& pp = pbm[patchi];
222  const vectorField& Sfp = mesh().Sf().boundaryField()[patchi];
223  const scalarField& magSfp = mesh().magSf().boundaryField()[patchi];
224 
225  if (pp.coupled())
226  {
227  forAll(pp, j)
228  {
229  const label facei = pp.start() + j;
230  const label own = cellAddr[mesh().faceOwner()[facei]];
231  const label nbr = nbrFaceCellAddr[facei - nInternalFaces];
232  const vector nf = Sfp[j]/magSfp[j];
233 
234  if ((own != -1) && (nbr == -1) && ((nf & axis) > tol))
235  {
236  area_[own] += magSfp[j];
237  n += Sfp[j];
238  }
239  }
240  }
241  else
242  {
243  forAll(pp, j)
244  {
245  const label facei = pp.start() + j;
246  const label own = cellAddr[mesh().faceOwner()[facei]];
247  const vector nf = Sfp[j]/magSfp[j];
248 
249  if ((own != -1) && ((nf & axis) > tol))
250  {
251  area_[own] += magSfp[j];
252  n += Sfp[j];
253  }
254  }
255  }
256  }
257 
258  if (correct)
259  {
260  reduce(n, sumOp<vector>());
261  axis = n/mag(n);
262  }
263 
264  if (debug)
265  {
266  volScalarField area
267  (
268  IOobject
269  (
270  name() + ":area",
271  mesh().time().name(),
272  mesh(),
275  ),
276  mesh(),
278  );
279  UIndirectList<scalar>(area.primitiveField(), zone_.zone()) = area_;
280 
281  Info<< type() << ": " << name() << " writing field " << area.name()
282  << endl;
283 
284  area.write();
285  }
286 }
287 
288 
289 void Foam::fv::rotorDisk::createCoordinateSystem(const dictionary& dict)
290 {
291  // Construct the local rotor co-prdinate system
292  vector origin(Zero);
293  vector axis(Zero);
294  vector refDir(Zero);
295 
296  geometryModeType gm =
297  geometryModeTypeNames_.read(dict.lookup("geometryMode"));
298 
299  switch (gm)
300  {
301  case geometryModeType::automatic:
302  {
303  // Determine rotation origin (cell volume weighted)
304  scalar sumV = 0.0;
305  const scalarField& V = mesh().V();
306  const vectorField& C = mesh().C();
307 
308  const labelList& cells = zone_.zone();
309 
310  forAll(cells, i)
311  {
312  const label celli = cells[i];
313  sumV += V[celli];
314  origin += V[celli]*C[celli];
315  }
316  reduce(origin, sumOp<vector>());
317  reduce(sumV, sumOp<scalar>());
318  origin /= sumV;
319 
320  // Determine first radial vector
321  vector dx1(Zero);
322  scalar magR = -great;
323  forAll(cells, i)
324  {
325  const label celli = cells[i];
326  vector test = C[celli] - origin;
327  if (mag(test) > magR)
328  {
329  dx1 = test;
330  magR = mag(test);
331  }
332  }
333  reduce(dx1, maxMagSqrOp<vector>());
334  magR = mag(dx1);
335 
336  // Determine second radial vector and cross to determine axis
337  forAll(cells, i)
338  {
339  const label celli = cells[i];
340  vector dx2 = C[celli] - origin;
341  if (mag(dx2) > 0.5*magR)
342  {
343  axis = dx1 ^ dx2;
344  if (mag(axis) > small)
345  {
346  break;
347  }
348  }
349  }
350  reduce(axis, maxMagSqrOp<vector>());
351  axis /= mag(axis);
352 
353  // Correct the axis direction using a point above the rotor
354  {
355  vector pointAbove(dict.lookup("pointAbove"));
356  vector dir = pointAbove - origin;
357  dir /= mag(dir);
358  if ((dir & axis) < 0)
359  {
360  axis *= -1.0;
361  }
362  }
363 
364  dict.lookup("refDirection") >> refDir;
365 
366  cylindrical_.reset
367  (
368  new cylindrical(axis, origin, UIndirectList<vector>(C, cells)())
369  );
370 
371  // Set the face areas and apply correction to calculated axis
372  // e.g. if cellZone is more than a single layer in thickness
373  setFaceArea(axis, true);
374 
375  break;
376  }
377  case geometryModeType::specified:
378  {
379  dict.lookup("origin") >> origin;
380  dict.lookup("axis") >> axis;
381  dict.lookup("refDirection") >> refDir;
382 
383  cylindrical_.reset
384  (
385  new cylindrical
386  (
387  axis,
388  origin,
389  UIndirectList<vector>(mesh().C(), zone_.zone())()
390  )
391  );
392 
393  setFaceArea(axis, false);
394 
395  break;
396  }
397  }
398 
399  coordSys_ =
400  coordinateSystems::cylindrical("rotorCoordSys", origin, axis, refDir);
401 
402  const scalar sumArea = gSum(area_);
403  const scalar diameter = Foam::sqrt(4.0*sumArea/mathematical::pi);
404  Info<< " Rotor geometry:" << nl
405  << " - disk diameter = " << diameter << nl
406  << " - disk area = " << sumArea << nl
407  << " - origin = " << coordSys_.origin() << nl
408  << " - r-axis = " << coordSys_.R().e1() << nl
409  << " - psi-axis = " << coordSys_.R().e2() << nl
410  << " - z-axis = " << coordSys_.R().e3() << endl;
411 }
412 
413 
414 void Foam::fv::rotorDisk::constructGeometry()
415 {
416  const vectorField& C = mesh().C();
417 
418  const labelList& cells = zone_.zone();
419 
420  forAll(cells, i)
421  {
422  if (area_[i] > rootVSmall)
423  {
424  const label celli = cells[i];
425 
426  // Position in (planar) rotor co-ordinate system
427  x_[i] = coordSys_.localPosition(C[celli]);
428 
429  // Cache max radius
430  rMax_ = max(rMax_, x_[i].x());
431 
432  // Swept angle relative to rDir axis [radians] in range 0 -> 2*pi
433  scalar psi = x_[i].y();
434 
435  // Blade flap angle [radians]
436  scalar beta =
437  flap_.beta0 - flap_.beta1c*cos(psi) - flap_.beta2s*sin(psi);
438 
439  // Determine rotation tensor to convert from planar system into the
440  // rotor cone system
441  scalar c = cos(beta);
442  scalar s = sin(beta);
443  R_[i] = tensor(c, 0, -s, 0, 1, 0, s, 0, c);
444  invR_[i] = R_[i].T();
445  }
446  }
447 }
448 
449 
450 Foam::tmp<Foam::vectorField> Foam::fv::rotorDisk::inflowVelocity
451 (
452  const volVectorField& U
453 ) const
454 {
455  switch (inletFlow_)
456  {
458  case inletFlowType::surfaceNormal:
459  {
460  return tmp<vectorField>
461  (
462  new vectorField(mesh().nCells(), inletVelocity_)
463  );
464 
465  break;
466  }
467  case inletFlowType::local:
468  {
469  return U.primitiveField();
470 
471  break;
472  }
473  default:
474  {
476  << "Unknown inlet flow specification" << abort(FatalError);
477  }
478  }
479 
480  return tmp<vectorField>(new vectorField(mesh().nCells(), Zero));
481 }
482 
483 
484 // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
485 
487 (
488  const word& name,
489  const word& modelType,
490  const fvMesh& mesh,
491  const dictionary& dict
492 )
493 :
494  fvModel(name, modelType, mesh, dict),
495  zone_(mesh, dict),
496  UName_(word::null),
497  omega_(0),
498  nBlades_(0),
499  inletFlow_(inletFlowType::local),
500  inletVelocity_(Zero),
501  tipEffect_(1),
502  flap_(),
503  x_(zone_.nCells(), Zero),
504  R_(zone_.nCells(), I),
505  invR_(zone_.nCells(), I),
506  area_(zone_.nCells(), Zero),
507  coordSys_("rotorCoordSys", vector::zero, axesRotation(sphericalTensor::I)),
508  cylindrical_(),
509  rMax_(0),
510  trim_(trimModel::New(*this, dict)),
511  blade_(dict.subDict("blade")),
512  profiles_(dict.subDict("profiles")),
513  rhoRef_(-1)
514 {
515  readCoeffs(coeffs(dict));
516 }
517 
518 
519 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
520 
522 {}
523 
524 
525 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
526 
528 {
529  return wordList(1, UName_);
530 }
531 
532 
534 (
535  const volVectorField& U,
536  fvMatrix<vector>& eqn
537 ) const
538 {
540  (
541  IOobject
542  (
543  name() + ":rotorForce",
544  mesh().time().name(),
545  mesh()
546  ),
547  mesh(),
549  (
550  "zero",
551  eqn.dimensions()/dimVolume,
552  Zero
553  )
554  );
555 
556  if (rhoRef_ < 0)
557  {
558  FatalError
559  << "rhoRef not set, required for incompressible flow"
560  << exit(FatalError);
561  }
562 
563  const vectorField Uin(inflowVelocity(U));
564  trim_->correct(Uin, force);
565  calculate(geometricOneField(), Uin, trim_->thetag(), force);
566 
567  // Add source to rhs of eqn
568  eqn -= force;
569 
570  if (mesh().time().writeTime())
571  {
572  force.write();
573  }
574 }
575 
576 
578 (
579  const volScalarField& rho,
580  const volVectorField& U,
581  fvMatrix<vector>& eqn
582 ) const
583 {
585  (
586  IOobject
587  (
588  name() + ":rotorForce",
589  mesh().time().name(),
590  mesh()
591  ),
592  mesh(),
594  (
595  "zero",
596  eqn.dimensions()/dimVolume,
597  Zero
598  )
599  );
600 
601  const vectorField Uin(inflowVelocity(U));
602  trim_->correct(rho, Uin, force);
603  calculate(rho, Uin, trim_->thetag(), force);
604 
605  // Add source to rhs of eqn
606  eqn -= force;
607 
608  if (mesh().time().writeTime())
609  {
610  force.write();
611  }
612 }
613 
614 
616 {
617  zone_.movePoints();
618  return true;
619 }
620 
621 
623 {
624  zone_.topoChange(map);
625 }
626 
627 
629 {
630  zone_.mapMesh(map);
631 }
632 
633 
635 {
636  zone_.distribute(map);
637 }
638 
639 
641 {
642  if (fvModel::read(dict))
643  {
644  zone_.read(coeffs(dict));
645  readCoeffs(coeffs(dict));
646  return true;
647  }
648  else
649  {
650  return false;
651  }
652 }
653 
654 
655 // ************************************************************************* //
label n
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:433
Macros for easy insertion into run-time selection tables.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Generic GeometricField class.
const Boundary & boundaryField() const
Return const-reference to the boundary field.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:99
Initialise the NamedEnum HashTable from the static list of names.
Definition: NamedEnum.H:55
virtual Ostream & write(const char)=0
Write character.
Templated 3D SphericalTensor derived from VectorSpace adding construction from 1 component,...
A coordinate rotation specified using global axis.
Definition: axesRotation.H:67
A list of keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
Definition: dictionary.H:162
A special matrix type and solver, designed for finite volume solutions of scalar equations....
Definition: fvMatrix.H:118
const dimensionSet & dimensions() const
Definition: fvMatrix.H:302
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:96
const volVectorField & C() const
Return cell centres.
const DimensionedField< scalar, volMesh > & V() const
Return cell volumes.
const surfaceVectorField & Sf() const
Return cell face area vectors.
const surfaceScalarField & magSf() const
Return cell face area magnitudes.
Finite volume model abstract base class.
Definition: fvModel.H:60
static const dictionary & coeffs(const word &modelType, const dictionary &)
Return the coefficients sub-dictionary for a given model type.
Definition: fvModelI.H:31
virtual bool read(const dictionary &dict)
Read source dictionary.
Definition: fvModel.C:200
Cell based momentum source which approximates the mean effects of rotor forces on a cylindrical regio...
Definition: rotorDisk.H:125
virtual bool movePoints()
Update for mesh motion.
Definition: rotorDisk.C:615
virtual void addSup(const volVectorField &U, fvMatrix< vector > &eqn) const
Source term to momentum equation.
Definition: rotorDisk.C:534
virtual wordList addSupFields() const
Return the list of fields for which the fvModel adds source term.
Definition: rotorDisk.C:527
rotorDisk(const word &name, const word &modelType, const fvMesh &mesh, const dictionary &dict)
Construct from components.
Definition: rotorDisk.C:487
static const NamedEnum< inletFlowType, 3 > inletFlowTypeNames_
Definition: rotorDisk.H:141
static const NamedEnum< geometryModeType, 2 > geometryModeTypeNames_
Definition: rotorDisk.H:133
virtual void topoChange(const polyTopoChangeMap &)
Update topology using the given map.
Definition: rotorDisk.C:622
virtual void distribute(const polyDistributionMap &)
Redistribute or update using the given distribution map.
Definition: rotorDisk.C:634
virtual bool read(const dictionary &dict)
Read source dictionary.
Definition: rotorDisk.C:640
virtual void mapMesh(const polyMeshMap &)
Update from another mesh using the given map.
Definition: rotorDisk.C:628
virtual ~rotorDisk()
Destructor.
Definition: rotorDisk.C:521
A class representing the concept of a GeometricField of 1 used to avoid unnecessary manipulations for...
Class containing mesh-to-mesh mapping information after a mesh distribution where we send parts of me...
Class containing mesh-to-mesh mapping information.
Definition: polyMeshMap.H:51
virtual const labelList & faceOwner() const
Return face owner.
Definition: polyMesh.C:1357
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
Definition: polyMesh.H:401
virtual const labelList & faceNeighbour() const
Return face neighbour.
Definition: polyMesh.C:1363
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
label nInternalFaces() const
virtual bool write(const bool write=true) const
Write using setting from DB.
static void swapBoundaryFaceList(const polyMesh &mesh, UList< T > &l)
Swap coupled boundary face values.
Definition: syncTools.H:436
A class for managing temporary objects.
Definition: tmp.H:55
Trim model base class.
Definition: trimModel.H:54
A class for handling words, derived from string.
Definition: word.H:62
A class representing the concept of 0 used to avoid unnecessary manipulations for objects that are kn...
Definition: zero.H:50
Foam::fvMesh mesh(Foam::IOobject(regionName, runTime.name(), runTime, Foam::IOobject::MUST_READ), false)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:334
const scalar omega
A special matrix type and solver, designed for finite volume solutions of scalar equations.
label patchi
const cellShapeList & cells
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.name(), lagrangian::cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
const volScalarField & psi
U
Definition: pEqn.H:72
void correct(const RdeltaTType &rDeltaT, const RhoType &rho, volScalarField &psi, const surfaceScalarField &phiCorr, const SpType &Sp)
const dimensionedScalar c
Speed of light in a vacuum.
Collection of constants.
label calculate(const fvMesh &mesh, const labelHashSet &patchIDs, const scalar minFaceFraction, GeometricField< scalar, GeoMesh > &distance)
Calculate distance data from patches.
static const coefficient C("C", dimTemperature, 234.5)
Namespace for OpenFOAM.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
static const zero Zero
Definition: zero.H:97
List< word > wordList
A List of words.
Definition: fileName.H:54
Type gSum(const FieldField< Field, Type > &f)
VolField< vector > volVectorField
Definition: volFieldsFwd.H:63
List< label > labelList
A List of labels.
Definition: labelList.H:56
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
addToRunTimeSelectionTable(polyPatch, mergedCyclicPolyPatch, word)
Tensor< scalar > tensor
Tensor of scalars.
Definition: tensor.H:51
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:258
errorManip< error > abort(error &err)
Definition: errorManip.H:131
dimensionedScalar sin(const dimensionedScalar &ds)
IOstream & fixed(IOstream &io)
Definition: IOstream.H:588
messageStream Info
static const Identity< scalar > I
Definition: Identity.H:93
void mag(LagrangianPatchField< scalar > &f, const LagrangianPatchField< Type > &f1)
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
addBackwardCompatibleToRunTimeSelectionTable(fvPatchScalarField, coupledTemperatureFvPatchScalarField, patchMapper, turbulentTemperatureCoupledBaffleMixed, "compressible::turbulentTemperatureCoupledBaffleMixed")
Vector< scalar > vector
A scalar version of the templated Vector.
Definition: vector.H:49
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
const dimensionSet dimVolume
VolField< scalar > volScalarField
Definition: volFieldsFwd.H:62
defineTypeNameAndDebug(combustionModel, 0)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
Field< vector > vectorField
Specialisation of Field<T> for vector.
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
error FatalError
const dimensionSet dimArea
labelList identityMap(const label len)
Create identity map (map[i] == i) of given length.
Definition: ListOps.C:104
void sqrt(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
tmp< DimensionedField< TypeR, GeoMesh, Field > > New(const tmp< DimensionedField< TypeR, GeoMesh, Field >> &tdf1, const word &name, const dimensionSet &dimensions)
static const char nl
Definition: Ostream.H:267
dimensionedScalar cos(const dimensionedScalar &ds)
const unitConversion unitDegrees
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
fileType type(const fileName &, const bool checkVariants=true, const bool followLink=true)
Return the file type: directory or file.
Definition: POSIX.C:488
labelList fv(nPoints)
dictionary dict