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-2026 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.typeDict("flap"));
87  flap_.beta0 = flapCoeffs.lookup<scalar>("beta0", units::degrees);
88  flap_.beta1c = flapCoeffs.lookup<scalar>("beta1c", units::degrees);
89  flap_.beta2s = flapCoeffs.lookup<scalar>("beta2s", units::degrees);
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().poly().boundary();
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  {
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<< indent
282  << type() << ": " << name() << " writing field " << area.name()
283  << endl;
284 
285  area.write();
286  }
287 }
288 
289 
290 void Foam::fv::rotorDisk::createCoordinateSystem(const dictionary& dict)
291 {
292  // Construct the local rotor co-prdinate system
293  vector origin(Zero);
294  vector axis(Zero);
295  vector refDir(Zero);
296 
297  geometryModeType gm =
298  geometryModeTypeNames_.read(dict.lookup("geometryMode"));
299 
300  switch (gm)
301  {
302  case geometryModeType::automatic:
303  {
304  // Determine rotation origin (cell volume weighted)
305  scalar sumV = 0.0;
306  const scalarField& V = mesh().V();
307  const vectorField& C = mesh().C();
308 
309  const labelList& cells = zone_.zone();
310 
311  forAll(cells, i)
312  {
313  const label celli = cells[i];
314  sumV += V[celli];
315  origin += V[celli]*C[celli];
316  }
317  reduce(origin, sumOp<vector>());
318  reduce(sumV, sumOp<scalar>());
319  origin /= sumV;
320 
321  // Determine first radial vector
322  vector dx1(Zero);
323  scalar magR = -great;
324  forAll(cells, i)
325  {
326  const label celli = cells[i];
327  vector test = C[celli] - origin;
328  if (mag(test) > magR)
329  {
330  dx1 = test;
331  magR = mag(test);
332  }
333  }
334  reduce(dx1, maxMagSqrOp<vector>());
335  magR = mag(dx1);
336 
337  // Determine second radial vector and cross to determine axis
338  forAll(cells, i)
339  {
340  const label celli = cells[i];
341  vector dx2 = C[celli] - origin;
342  if (mag(dx2) > 0.5*magR)
343  {
344  axis = dx1 ^ dx2;
345  if (mag(axis) > small)
346  {
347  break;
348  }
349  }
350  }
351  reduce(axis, maxMagSqrOp<vector>());
352  axis /= mag(axis);
353 
354  // Correct the axis direction using a point above the rotor
355  {
356  vector pointAbove(dict.lookup("pointAbove"));
357  vector dir = pointAbove - origin;
358  dir /= mag(dir);
359  if ((dir & axis) < 0)
360  {
361  axis *= -1.0;
362  }
363  }
364 
365  dict.lookup("refDirection") >> refDir;
366 
367  cylindrical_.reset
368  (
369  new cylindrical(axis, origin, UIndirectList<vector>(C, cells)())
370  );
371 
372  // Set the face areas and apply correction to calculated axis
373  // e.g. if cellZone is more than a single layer in thickness
374  setFaceArea(axis, true);
375 
376  break;
377  }
378  case geometryModeType::specified:
379  {
380  dict.lookup("origin") >> origin;
381  dict.lookup("axis") >> axis;
382  dict.lookup("refDirection") >> refDir;
383 
384  cylindrical_.reset
385  (
386  new cylindrical
387  (
388  axis,
389  origin,
390  UIndirectList<vector>(mesh().C(), zone_.zone())()
391  )
392  );
393 
394  setFaceArea(axis, false);
395 
396  break;
397  }
398  }
399 
400  coordSys_ =
401  coordinateSystems::cylindrical("rotorCoordSys", origin, axis, refDir);
402 
403  const scalar sumArea = gSum(area_);
404  const scalar diameter = Foam::sqrt(4.0*sumArea/mathematical::pi);
405  Info<< indent << "Rotor geometry:" << nl
406  << indent << " - disk diameter = " << diameter << nl
407  << indent << " - disk area = " << sumArea << nl
408  << indent << " - origin = " << coordSys_.origin() << nl
409  << indent << " - r-axis = " << coordSys_.R().e1() << nl
410  << indent << " - psi-axis = " << coordSys_.R().e2() << nl
411  << indent << " - z-axis = " << coordSys_.R().e3() << endl;
412 }
413 
414 
415 void Foam::fv::rotorDisk::constructGeometry()
416 {
417  const vectorField& C = mesh().C();
418 
419  const labelList& cells = zone_.zone();
420 
421  forAll(cells, i)
422  {
423  if (area_[i] > rootVSmall)
424  {
425  const label celli = cells[i];
426 
427  // Position in (planar) rotor co-ordinate system
428  x_[i] = coordSys_.localPosition(C[celli]);
429 
430  // Cache max radius
431  rMax_ = max(rMax_, x_[i].x());
432 
433  // Swept angle relative to rDir axis [radians] in range 0 -> 2*pi
434  scalar psi = x_[i].y();
435 
436  // Blade flap angle [radians]
437  scalar beta =
438  flap_.beta0 - flap_.beta1c*cos(psi) - flap_.beta2s*sin(psi);
439 
440  // Determine rotation tensor to convert from planar system into the
441  // rotor cone system
442  scalar c = cos(beta);
443  scalar s = sin(beta);
444  R_[i] = tensor(c, 0, -s, 0, 1, 0, s, 0, c);
445  invR_[i] = R_[i].T();
446  }
447  }
448 }
449 
450 
451 Foam::tmp<Foam::vectorField> Foam::fv::rotorDisk::inflowVelocity
452 (
453  const volVectorField& U
454 ) const
455 {
456  switch (inletFlow_)
457  {
459  case inletFlowType::surfaceNormal:
460  {
461  return tmp<vectorField>
462  (
463  new vectorField(mesh().nCells(), inletVelocity_)
464  );
465 
466  break;
467  }
468  case inletFlowType::local:
469  {
470  return U.primitiveField();
471 
472  break;
473  }
474  default:
475  {
477  << "Unknown inlet flow specification" << abort(FatalError);
478  }
479  }
480 
481  return tmp<vectorField>(new vectorField(mesh().nCells(), Zero));
482 }
483 
484 
485 // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
486 
488 (
489  const word& name,
490  const word& modelType,
491  const fvMesh& mesh,
492  const dictionary& dict
493 )
494 :
495  fvModel(name, modelType, mesh, dict),
496  zone_(mesh, dict),
497  UName_(word::null),
498  omega_(0),
499  nBlades_(0),
500  inletFlow_(inletFlowType::local),
501  inletVelocity_(Zero),
502  tipEffect_(1),
503  flap_(),
504  x_(zone_.nCells(), Zero),
505  R_(zone_.nCells(), I),
506  invR_(zone_.nCells(), I),
507  area_(zone_.nCells(), Zero),
508  coordSys_("rotorCoordSys", vector::zero, axesRotation(sphericalTensor::I)),
509  cylindrical_(),
510  rMax_(0),
511  trim_(trimModel::New(*this, dict)),
512  blade_(dict.subDict("blade")),
513  profiles_(dict.subDict("profiles")),
514  rhoRef_(-1)
515 {
516  readCoeffs(coeffs(dict));
517 }
518 
519 
520 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
521 
523 {}
524 
525 
526 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
527 
529 {
530  return wordList(1, UName_);
531 }
532 
533 
535 (
536  const volVectorField& U,
537  fvMatrix<vector>& eqn
538 ) const
539 {
541  (
542  IOobject
543  (
544  name() + ":rotorForce",
545  mesh().time().name(),
546  mesh()
547  ),
548  mesh(),
550  (
551  "zero",
552  eqn.dimensions()/dimVolume,
553  Zero
554  )
555  );
556 
557  if (rhoRef_ < 0)
558  {
559  FatalError
560  << "rhoRef not set, required for incompressible flow"
561  << exit(FatalError);
562  }
563 
564  const vectorField Uin(inflowVelocity(U));
565  trim_->correct(Uin, force);
566  calculate(geometricOneField(), Uin, trim_->thetag(), force);
567 
568  // Add source to rhs of eqn
569  eqn -= force;
570 
571  if (mesh().time().writeTime())
572  {
573  force.write();
574  }
575 }
576 
577 
579 (
580  const volScalarField& rho,
581  const volVectorField& U,
582  fvMatrix<vector>& eqn
583 ) const
584 {
586  (
587  IOobject
588  (
589  name() + ":rotorForce",
590  mesh().time().name(),
591  mesh()
592  ),
593  mesh(),
595  (
596  "zero",
597  eqn.dimensions()/dimVolume,
598  Zero
599  )
600  );
601 
602  const vectorField Uin(inflowVelocity(U));
603  trim_->correct(rho, Uin, force);
604  calculate(rho, Uin, trim_->thetag(), force);
605 
606  // Add source to rhs of eqn
607  eqn -= force;
608 
609  if (mesh().time().writeTime())
610  {
611  force.write();
612  }
613 }
614 
615 
617 {
618  zone_.movePoints();
619  return true;
620 }
621 
622 
624 {
625  zone_.topoChange(map);
626 }
627 
628 
630 {
631  zone_.mapMesh(map);
632 }
633 
634 
636 {
637  zone_.distribute(map);
638 }
639 
640 
642 {
643  if (fvModel::read(dict))
644  {
645  zone_.read(coeffs(dict));
646  readCoeffs(coeffs(dict));
647  return true;
648  }
649  else
650  {
651  return false;
652  }
653 }
654 
655 
656 // ************************************************************************* //
label n
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:449
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
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
Ostream & write(Ostream &os) const
Write.
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:98
const volVectorField & C() const
Return cell centres.
const DimensionedField< scalar, fvMesh > & V() const
Return cell volumes.
const surfaceVectorField & Sf() const
Return cell face area vectors.
const surfaceScalarField & magSf() const
Return cell face area magnitudes.
const polyMesh & poly() const
Return reference to polyMesh.
Definition: fvMesh.H:456
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:196
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:616
virtual void addSup(const volVectorField &U, fvMatrix< vector > &eqn) const
Source term to momentum equation.
Definition: rotorDisk.C:535
virtual wordList addSupFields() const
Return the list of fields for which the fvModel adds source term.
Definition: rotorDisk.C:528
rotorDisk(const word &name, const word &modelType, const fvMesh &mesh, const dictionary &dict)
Construct from components.
Definition: rotorDisk.C:488
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:623
virtual void distribute(const polyDistributionMap &)
Redistribute or update using the given distribution map.
Definition: rotorDisk.C:635
virtual bool read(const dictionary &dict)
Read source dictionary.
Definition: rotorDisk.C:641
virtual void mapMesh(const polyMeshMap &)
Update from another mesh using the given map.
Definition: rotorDisk.C:629
virtual ~rotorDisk()
Destructor.
Definition: rotorDisk.C:522
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
const polyBoundaryMesh & boundary() const
Return boundary mesh.
Definition: polyMesh.H:393
virtual const labelList & faceOwner() const
Return face owner.
Definition: polyMesh.C:1321
virtual const labelList & faceNeighbour() const
Return face neighbour.
Definition: polyMesh.C:1327
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
label nInternalFaces() const
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:63
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
rho
Definition: pEqn.H:1
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.
const dimensionSet force
const dimensionSet area
const dimensionSet time
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)
const unitSet degrees
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
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:288
errorManip< error > abort(error &err)
Definition: errorManip.H:131
dimensionedScalar sin(const dimensionedScalar &ds)
IOstream & fixed(IOstream &io)
Definition: IOstream.H:597
messageStream Info
const dimensionSet & dimVolume
Definition: dimensions.C:150
static const Identity< scalar > I
Definition: Identity.H:93
Type gSum(const UList< Type > &f, const label comm)
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)
VolField< scalar > volScalarField
Definition: volFieldsFwd.H:62
Field< vector > vectorField
Specialisation of Field<T> for vector.
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
tmp< DimensionedField< scalar, GeoMesh, Field > > mag(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
error FatalError
labelList identityMap(const label len)
Create identity map (map[i] == i) of given length.
Definition: ListOps.C:104
const dimensionSet & dimArea
Definition: dimensions.C:149
void sqrt(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
defineTypeNameAndDebug(atmosphericBoundaryLayer, 0)
Ostream & indent(Ostream &os)
Indent stream.
Definition: Ostream.H:243
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:297
dimensionedScalar cos(const dimensionedScalar &ds)
dimensioned< Type > max(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
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