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-2024 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 
56 namespace Foam
57 {
58  template<>
60  {"auto", "specified"};
61 
62  template<>
64  {"fixed", "surfaceNormal", "local"};
65 }
66 
69 
72 
73 
74 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
75 
76 void Foam::fv::rotorDisk::readCoeffs()
77 {
78  UName_ = coeffs().lookupOrDefault<word>("U", "U");
79 
80  omega_ = Foam::omega(coeffs()).value();
81 
82  coeffs().lookup("nBlades") >> nBlades_;
83 
84  inletFlow_ = inletFlowTypeNames_.read(coeffs().lookup("inletFlowType"));
85 
86  coeffs().lookup("tipEffect") >> tipEffect_;
87 
88  const dictionary& flapCoeffs(coeffs().subDict("flapCoeffs"));
89  flap_.beta0 = flapCoeffs.lookup<scalar>("beta0", unitDegrees);
90  flap_.beta1c = flapCoeffs.lookup<scalar>("beta1c", unitDegrees);
91  flap_.beta2s = flapCoeffs.lookup<scalar>("beta2s", unitDegrees);
92 
93  // Create co-ordinate system
94  createCoordinateSystem();
95 
96  // Read co-odinate system dependent properties
97  checkData();
98 
99  constructGeometry();
100 
101  trim_->read(coeffs());
102 
103  if (debug)
104  {
105  writeField("thetag", trim_->thetag()());
106  writeField("faceArea", area_);
107  }
108 }
109 
110 
111 void Foam::fv::rotorDisk::checkData()
112 {
113  // Set inflow type
114  switch (set_.selectionType())
115  {
119  {
120  // Set the profile ID for each blade section
121  profiles_.connectBlades
122  (
123  blade_.profileName(),
124  blade_.profileIndex()
125  );
126  switch (inletFlow_)
127  {
129  {
130  coeffs().lookup("inletVelocity") >> inletVelocity_;
131  break;
132  }
133  case inletFlowType::surfaceNormal:
134  {
135  scalar UIn
136  (
137  coeffs().lookup<scalar>("inletNormalVelocity")
138  );
139  inletVelocity_ = -coordSys_.R().e3()*UIn;
140  break;
141  }
142  case inletFlowType::local:
143  {
144  break;
145  }
146  default:
147  {
149  << "Unknown inlet velocity type" << abort(FatalError);
150  }
151  }
152  break;
153  }
154  default:
155  {
157  << "Source cannot be used with '"
158  << fvCellSet::selectionTypeNames[set_.selectionType()]
159  << "' mode. Please use one of: " << nl
166  << exit(FatalError);
167  }
168  }
169 }
170 
171 
172 void Foam::fv::rotorDisk::setFaceArea(vector& axis, const bool correct)
173 {
174  area_ = 0.0;
175 
176  static const scalar tol = 0.8;
177 
178  const label nInternalFaces = mesh().nInternalFaces();
179  const polyBoundaryMesh& pbm = mesh().boundaryMesh();
180  const vectorField& Sf = mesh().Sf();
181  const scalarField& magSf = mesh().magSf();
182 
183  vector n = Zero;
184 
185  // Calculate cell addressing for selected cells
186  labelList cellAddr(mesh().nCells(), -1);
187  UIndirectList<label>(cellAddr, set_.cells()) =
188  identityMap(set_.nCells());
189  labelList nbrFaceCellAddr(mesh().nFaces() - nInternalFaces, -1);
190  forAll(pbm, patchi)
191  {
192  const polyPatch& pp = pbm[patchi];
193 
194  if (pp.coupled())
195  {
196  forAll(pp, i)
197  {
198  label facei = pp.start() + i;
199  label nbrFacei = facei - nInternalFaces;
200  label own = mesh().faceOwner()[facei];
201  nbrFaceCellAddr[nbrFacei] = cellAddr[own];
202  }
203  }
204  }
205 
206  // Correct for parallel running
207  syncTools::swapBoundaryFaceList(mesh(), nbrFaceCellAddr);
208 
209  // Add internal field contributions
210  for (label facei = 0; facei < nInternalFaces; facei++)
211  {
212  const label own = cellAddr[mesh().faceOwner()[facei]];
213  const label nbr = cellAddr[mesh().faceNeighbour()[facei]];
214 
215  if ((own != -1) && (nbr == -1))
216  {
217  vector nf = Sf[facei]/magSf[facei];
218 
219  if ((nf & axis) > tol)
220  {
221  area_[own] += magSf[facei];
222  n += Sf[facei];
223  }
224  }
225  else if ((own == -1) && (nbr != -1))
226  {
227  vector nf = Sf[facei]/magSf[facei];
228 
229  if ((-nf & axis) > tol)
230  {
231  area_[nbr] += magSf[facei];
232  n -= Sf[facei];
233  }
234  }
235  }
236 
237 
238  // Add boundary contributions
239  forAll(pbm, patchi)
240  {
241  const polyPatch& pp = pbm[patchi];
242  const vectorField& Sfp = mesh().Sf().boundaryField()[patchi];
243  const scalarField& magSfp = mesh().magSf().boundaryField()[patchi];
244 
245  if (pp.coupled())
246  {
247  forAll(pp, j)
248  {
249  const label facei = pp.start() + j;
250  const label own = cellAddr[mesh().faceOwner()[facei]];
251  const label nbr = nbrFaceCellAddr[facei - nInternalFaces];
252  const vector nf = Sfp[j]/magSfp[j];
253 
254  if ((own != -1) && (nbr == -1) && ((nf & axis) > tol))
255  {
256  area_[own] += magSfp[j];
257  n += Sfp[j];
258  }
259  }
260  }
261  else
262  {
263  forAll(pp, j)
264  {
265  const label facei = pp.start() + j;
266  const label own = cellAddr[mesh().faceOwner()[facei]];
267  const vector nf = Sfp[j]/magSfp[j];
268 
269  if ((own != -1) && ((nf & axis) > tol))
270  {
271  area_[own] += magSfp[j];
272  n += Sfp[j];
273  }
274  }
275  }
276  }
277 
278  if (correct)
279  {
280  reduce(n, sumOp<vector>());
281  axis = n/mag(n);
282  }
283 
284  if (debug)
285  {
286  volScalarField area
287  (
288  IOobject
289  (
290  name() + ":area",
291  mesh().time().name(),
292  mesh(),
295  ),
296  mesh(),
298  );
299  UIndirectList<scalar>(area.primitiveField(), set_.cells()) = area_;
300 
301  Info<< type() << ": " << name() << " writing field " << area.name()
302  << endl;
303 
304  area.write();
305  }
306 }
307 
308 
309 void Foam::fv::rotorDisk::createCoordinateSystem()
310 {
311  // Construct the local rotor co-prdinate system
312  vector origin(Zero);
313  vector axis(Zero);
314  vector refDir(Zero);
315 
316  geometryModeType gm =
317  geometryModeTypeNames_.read(coeffs().lookup("geometryMode"));
318 
319  switch (gm)
320  {
321  case geometryModeType::automatic:
322  {
323  // Determine rotation origin (cell volume weighted)
324  scalar sumV = 0.0;
325  const scalarField& V = mesh().V();
326  const vectorField& C = mesh().C();
327 
328  const labelUList cells = set_.cells();
329 
330  forAll(cells, i)
331  {
332  const label celli = cells[i];
333  sumV += V[celli];
334  origin += V[celli]*C[celli];
335  }
336  reduce(origin, sumOp<vector>());
337  reduce(sumV, sumOp<scalar>());
338  origin /= sumV;
339 
340  // Determine first radial vector
341  vector dx1(Zero);
342  scalar magR = -great;
343  forAll(cells, i)
344  {
345  const label celli = cells[i];
346  vector test = C[celli] - origin;
347  if (mag(test) > magR)
348  {
349  dx1 = test;
350  magR = mag(test);
351  }
352  }
353  reduce(dx1, maxMagSqrOp<vector>());
354  magR = mag(dx1);
355 
356  // Determine second radial vector and cross to determine axis
357  forAll(cells, i)
358  {
359  const label celli = cells[i];
360  vector dx2 = C[celli] - origin;
361  if (mag(dx2) > 0.5*magR)
362  {
363  axis = dx1 ^ dx2;
364  if (mag(axis) > small)
365  {
366  break;
367  }
368  }
369  }
370  reduce(axis, maxMagSqrOp<vector>());
371  axis /= mag(axis);
372 
373  // Correct the axis direction using a point above the rotor
374  {
375  vector pointAbove(coeffs().lookup("pointAbove"));
376  vector dir = pointAbove - origin;
377  dir /= mag(dir);
378  if ((dir & axis) < 0)
379  {
380  axis *= -1.0;
381  }
382  }
383 
384  coeffs().lookup("refDirection") >> refDir;
385 
386  cylindrical_.reset
387  (
388  new cylindrical(axis, origin, UIndirectList<vector>(C, cells)())
389  );
390 
391  // Set the face areas and apply correction to calculated axis
392  // e.g. if cellZone is more than a single layer in thickness
393  setFaceArea(axis, true);
394 
395  break;
396  }
397  case geometryModeType::specified:
398  {
399  coeffs().lookup("origin") >> origin;
400  coeffs().lookup("axis") >> axis;
401  coeffs().lookup("refDirection") >> refDir;
402 
403  cylindrical_.reset
404  (
405  new cylindrical
406  (
407  axis,
408  origin,
409  UIndirectList<vector>(mesh().C(), set_.cells())()
410  )
411  );
412 
413  setFaceArea(axis, false);
414 
415  break;
416  }
417  }
418 
419  coordSys_ =
420  coordinateSystems::cylindrical("rotorCoordSys", origin, axis, refDir);
421 
422  const scalar sumArea = gSum(area_);
423  const scalar diameter = Foam::sqrt(4.0*sumArea/mathematical::pi);
424  Info<< " Rotor geometry:" << nl
425  << " - disk diameter = " << diameter << nl
426  << " - disk area = " << sumArea << nl
427  << " - origin = " << coordSys_.origin() << nl
428  << " - r-axis = " << coordSys_.R().e1() << nl
429  << " - psi-axis = " << coordSys_.R().e2() << nl
430  << " - z-axis = " << coordSys_.R().e3() << endl;
431 }
432 
433 
434 void Foam::fv::rotorDisk::constructGeometry()
435 {
436  const vectorField& C = mesh().C();
437 
438  const labelUList cells = set_.cells();
439 
440  forAll(cells, i)
441  {
442  if (area_[i] > rootVSmall)
443  {
444  const label celli = cells[i];
445 
446  // Position in (planar) rotor co-ordinate system
447  x_[i] = coordSys_.localPosition(C[celli]);
448 
449  // Cache max radius
450  rMax_ = max(rMax_, x_[i].x());
451 
452  // Swept angle relative to rDir axis [radians] in range 0 -> 2*pi
453  scalar psi = x_[i].y();
454 
455  // Blade flap angle [radians]
456  scalar beta =
457  flap_.beta0 - flap_.beta1c*cos(psi) - flap_.beta2s*sin(psi);
458 
459  // Determine rotation tensor to convert from planar system into the
460  // rotor cone system
461  scalar c = cos(beta);
462  scalar s = sin(beta);
463  R_[i] = tensor(c, 0, -s, 0, 1, 0, s, 0, c);
464  invR_[i] = R_[i].T();
465  }
466  }
467 }
468 
469 
470 Foam::tmp<Foam::vectorField> Foam::fv::rotorDisk::inflowVelocity
471 (
472  const volVectorField& U
473 ) const
474 {
475  switch (inletFlow_)
476  {
478  case inletFlowType::surfaceNormal:
479  {
480  return tmp<vectorField>
481  (
482  new vectorField(mesh().nCells(), inletVelocity_)
483  );
484 
485  break;
486  }
487  case inletFlowType::local:
488  {
489  return U.primitiveField();
490 
491  break;
492  }
493  default:
494  {
496  << "Unknown inlet flow specification" << abort(FatalError);
497  }
498  }
499 
500  return tmp<vectorField>(new vectorField(mesh().nCells(), Zero));
501 }
502 
503 
504 // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
505 
507 (
508  const word& name,
509  const word& modelType,
510  const fvMesh& mesh,
511  const dictionary& dict
512 )
513 :
514  fvModel(name, modelType, mesh, dict),
515  set_(mesh, coeffs()),
516  UName_(word::null),
517  omega_(0),
518  nBlades_(0),
519  inletFlow_(inletFlowType::local),
520  inletVelocity_(Zero),
521  tipEffect_(1),
522  flap_(),
523  x_(set_.nCells(), Zero),
524  R_(set_.nCells(), I),
525  invR_(set_.nCells(), I),
526  area_(set_.nCells(), Zero),
527  coordSys_("rotorCoordSys", vector::zero, axesRotation(sphericalTensor::I)),
528  cylindrical_(),
529  rMax_(0),
530  trim_(trimModel::New(*this, coeffs())),
531  blade_(coeffs().subDict("blade")),
532  profiles_(coeffs().subDict("profiles")),
533  rhoRef_(1)
534 {
535  readCoeffs();
536 }
537 
538 
539 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
540 
542 {}
543 
544 
545 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
546 
548 {
549  return wordList(1, UName_);
550 }
551 
552 
554 (
555  const volVectorField& U,
556  fvMatrix<vector>& eqn
557 ) const
558 {
560  (
561  IOobject
562  (
563  name() + ":rotorForce",
564  mesh().time().name(),
565  mesh()
566  ),
567  mesh(),
569  (
570  "zero",
571  eqn.dimensions()/dimVolume,
572  Zero
573  )
574  );
575 
576  // Read the reference density for incompressible flow
577  coeffs().lookup("rhoRef") >> rhoRef_;
578 
579  const vectorField Uin(inflowVelocity(U));
580  trim_->correct(Uin, force);
581  calculate(geometricOneField(), Uin, trim_->thetag(), force);
582 
583  // Add source to rhs of eqn
584  eqn -= force;
585 
586  if (mesh().time().writeTime())
587  {
588  force.write();
589  }
590 }
591 
592 
594 (
595  const volScalarField& rho,
596  const volVectorField& U,
597  fvMatrix<vector>& eqn
598 ) const
599 {
601  (
602  IOobject
603  (
604  name() + ":rotorForce",
605  mesh().time().name(),
606  mesh()
607  ),
608  mesh(),
610  (
611  "zero",
612  eqn.dimensions()/dimVolume,
613  Zero
614  )
615  );
616 
617  const vectorField Uin(inflowVelocity(U));
618  trim_->correct(rho, Uin, force);
619  calculate(rho, Uin, trim_->thetag(), force);
620 
621  // Add source to rhs of eqn
622  eqn -= force;
623 
624  if (mesh().time().writeTime())
625  {
626  force.write();
627  }
628 }
629 
630 
632 {
633  set_.movePoints();
634  return true;
635 }
636 
637 
639 {
640  set_.topoChange(map);
641 }
642 
643 
645 {
646  set_.mapMesh(map);
647 }
648 
649 
651 {
652  set_.distribute(map);
653 }
654 
655 
657 {
658  if (fvModel::read(dict))
659  {
660  set_.read(coeffs());
661  readCoeffs();
662  return true;
663  }
664  else
665  {
666  return false;
667  }
668 }
669 
670 
671 // ************************************************************************* //
static const Foam::dimensionedScalar C("C", Foam::dimTemperature, 234.5)
label n
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
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.
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:54
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 keyword definitions, which are a keyword followed by any number of values (e....
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:99
Finite volume model abstract base class.
Definition: fvModel.H:59
virtual bool read(const dictionary &dict)
Read source dictionary.
Definition: fvModel.C:199
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:631
virtual void addSup(const volVectorField &U, fvMatrix< vector > &eqn) const
Source term to momentum equation.
Definition: rotorDisk.C:554
virtual wordList addSupFields() const
Return the list of fields for which the fvModel adds source term.
Definition: rotorDisk.C:547
rotorDisk(const word &name, const word &modelType, const fvMesh &mesh, const dictionary &dict)
Construct from components.
Definition: rotorDisk.C:507
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:638
virtual void distribute(const polyDistributionMap &)
Redistribute or update using the given distribution map.
Definition: rotorDisk.C:650
virtual bool read(const dictionary &dict)
Read source dictionary.
Definition: rotorDisk.C:656
virtual void mapMesh(const polyMeshMap &)
Update from another mesh using the given map.
Definition: rotorDisk.C:644
virtual ~rotorDisk()
Destructor.
Definition: rotorDisk.C:541
A class representing the concept of a GeometricField of 1 used to avoid unnecessary manipulations for...
static const NamedEnum< selectionTypes, 4 > selectionTypeNames
Word list of selection type names.
Definition: polyCellSet.H:97
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
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
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
#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(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.name(), 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 SuType &Su)
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, PatchField, GeoMesh > &distance)
Calculate distance data from patches.
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:65
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:257
word name(const bool)
Return a word representation of a bool.
Definition: boolIO.C:39
errorManip< error > abort(error &err)
Definition: errorManip.H:131
dimensionedScalar sin(const dimensionedScalar &ds)
IOstream & fixed(IOstream &io)
Definition: IOstream.H:573
messageStream Info
static const Identity< scalar > I
Definition: Identity.H:93
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)
dimensionedScalar sqrt(const dimensionedScalar &ds)
const dimensionSet dimVolume
VolField< scalar > volScalarField
Definition: volFieldsFwd.H:64
dimensioned< scalar > mag(const dimensioned< Type > &)
defineTypeNameAndDebug(combustionModel, 0)
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
Field< vector > vectorField
Specialisation of Field<T> for vector.
error FatalError
const dimensionSet dimArea
labelList identityMap(const label len)
Create identity map (map[i] == i) of given length.
Definition: ListOps.C:104
UList< label > labelUList
Definition: UList.H:65
static const char nl
Definition: Ostream.H:266
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