Loading...
Searching...
No Matches
laserDTRM.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2017-2025 OpenCFD Ltd.
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26\*---------------------------------------------------------------------------*/
27
28#include "laserDTRM.H"
29#include "fvmLaplacian.H"
30#include "fvmSup.H"
32#include "scatterModel.H"
33#include "constants.H"
34#include "unitConversion.H"
35#include "interpolationCell.H"
37#include "Random.H"
38#include "OBJstream.H"
40
41using namespace Foam::constant;
42
43// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
44
45namespace Foam
46{
47 namespace radiation
48 {
51 }
52
54 (
56 "DTRMCloud",
57 0
58 );
59
60} // End namespace Foam
61
62
64Foam::radiation::laserDTRM::powerDistNames_
65{
66 { powerDistributionMode::pdGaussian, "Gaussian" },
67 { powerDistributionMode::pdManual, "manual" },
68 { powerDistributionMode::pdUniform, "uniform" },
69 { powerDistributionMode::pdGaussianPeak, "GaussianPeak" },
70};
71
72
73// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
74
75Foam::scalar Foam::radiation::laserDTRM::calculateIp(scalar r, scalar theta)
76{
77 const scalar t = mesh_.time().value();
78 const scalar power = laserPower_->value(t);
79 switch (mode_)
80 {
81 case pdGaussianPeak:
82 {
83 return I0_*exp(-2.0*sqr(r)/sqr(sigma_));
84 break;
85 }
86 case pdGaussian:
87 {
88 scalar I0 = power/(mathematical::twoPi*sqr(sigma_));
89
90 return I0*exp(-sqr(r)/2.0/sqr(sigma_));
91 break;
92 }
93 case pdManual:
94 {
95 return power*powerDistribution_()(theta, r);
96 break;
97 }
98 case pdUniform:
99 {
100 return power/(mathematical::pi*sqr(focalLaserRadius_));
101 break;
102 }
103 default:
104 {
106 << "Unhandled type " << powerDistNames_[mode_]
107 << abort(FatalError);
108 break;
109 }
110 }
111
112 return 0;
113}
114
115
116Foam::tmp<Foam::volVectorField> Foam::radiation::laserDTRM::nHatfv
117(
118 const volScalarField& alpha1,
120) const
121{
122 const dimensionedScalar deltaN
123 (
124 "deltaN",
125 1e-7/cbrt(average(mesh_.V()))
126 );
127
128 const volVectorField gradAlphaf
129 (
132 );
133
134 // Face unit interface normal
135 return gradAlphaf/(mag(gradAlphaf)+ deltaN);
136}
137
138
139void Foam::radiation::laserDTRM::initialiseReflection()
140{
141 if (found("reflectionModel"))
142 {
143 dictTable modelDicts(lookup("reflectionModel"));
144
145 forAllConstIters(modelDicts, iter)
146 {
147 const phasePairKey& key = iter.key();
148
149 reflections_.insert
150 (
151 key,
153 (
154 iter.val(),
155 mesh_
156 )
157 );
158 }
159
160 reflectionSwitch_ = returnReduceOr(reflections_.size());
161 }
162}
163
164
165void Foam::radiation::laserDTRM::initialise()
166{
167 // Initialise the DTRM particles
168 DTRMCloud_.clear();
169
170 const scalar t = mesh_.time().value();
171 const vector lPosition = focalLaserPosition_->value(t);
172 const vector lDir = normalised(laserDirection_->value(t));
173
175 << "Laser position : " << lPosition << nl
176 << "Laser direction : " << lDir << endl;
177
178 // Find a vector on the area plane. Normal to laser direction
179 vector rArea = Zero;
180 scalar magr = 0.0;
181
182 {
183 Random rnd(1234);
184
185 while (magr < VSMALL)
186 {
187 vector v = rnd.sample01<vector>();
188 rArea = v - (v & lDir)*lDir;
189 magr = mag(rArea);
190 }
191 }
192 rArea.normalise();
193
194 scalar dr = focalLaserRadius_/ndr_;
195 scalar dTheta = mathematical::twoPi/ndTheta_;
196
197 nParticles_ = ndr_*ndTheta_;
198
199 switch (mode_)
200 {
201 case pdGaussianPeak:
202 {
203 I0_ = get<scalar>("I0");
204 sigma_ = get<scalar>("sigma");
205 break;
206 }
207 case pdGaussian:
208 {
209 sigma_ = get<scalar>("sigma");
210 break;
211 }
212 case pdManual:
213 {
214 powerDistribution_.reset
215 (
216 new interpolation2DTable<scalar>(*this)
217 );
218
219 break;
220 }
221 case pdUniform:
222 {
223 break;
224 }
225 }
226
227 // Count the number of missed positions
228 label nMissed = 0;
229
230 // Target position
231 point p1 = vector::zero;
232
233 // Seed DTRM particles
234 // TODO: currently only applicable to 3-D cases
235 point p0 = lPosition;
236 scalar power(0.0);
237 scalar area(0.0);
238 p1 = p0;
239 if (mesh_.nGeometricD() == 3)
240 {
241 for (label ri = 0; ri < ndr_; ri++)
242 {
243 scalar r1 = SMALL + dr*ri;
244
245 scalar r2 = r1 + dr;
246
247 scalar rP = ((r1 + r2)/2);
248
249 // local radius on disk
250 vector localR = ((r1 + r2)/2)*rArea;
251
252 // local final radius on disk
253 vector finalR = rP*rArea;
254
255 scalar theta0 = 0.0;//dTheta/2.0;
256 for (label thetai = 0; thetai < ndTheta_; thetai++)
257 {
258 scalar theta1 = theta0 + SMALL + dTheta*thetai;
259
260 scalar theta2 = theta1 + dTheta;
261
262 scalar thetaP = (theta1 + theta2)/2.0;
263
264 quaternion Q(lDir, thetaP);
265
266 // Initial position on disk
267 vector initialPos = (Q.R() & localR);
268
269 // Final position on disk
270 vector finalPos = (Q.R() & finalR);
271
272 // Initial position
273 p0 = lPosition + initialPos;
274
275 // calculate target point using new deviation rl
276 p1 = lPosition + finalPos + (0.5*maxTrackLength_*lDir);
277
278 scalar Ip = calculateIp(rP, thetaP);
279
280 scalar dAi = (sqr(r2) - sqr(r1))*(theta2 - theta1)/2.0;
281
282 power += Ip*dAi;
283 area += dAi;
284
285 label cellI = mesh_.findCell(p0);
286
287 if (cellI != -1)
288 {
289 // Create a new particle
290 DTRMParticle* pPtr =
291 new DTRMParticle(mesh_, p0, p1, Ip, cellI, dAi, -1);
292
293 // Add to cloud
294 DTRMCloud_.addParticle(pPtr);
295 }
296
297 if (nMissed < 10 && returnReduceAnd(cellI < 0))
298 {
299 ++nMissed;
301 << "Cannot find owner cell for focalPoint at "
302 << p0 << endl;
303 }
304 }
305 }
306 }
307 else
308 {
310 << "Current functionality limited to 3-D cases"
311 << exit(FatalError);
312 }
313
314 if (nMissed)
315 {
316 Info<< "Seeding missed " << nMissed << " locations" << endl;
317 }
318
320 << "Total Power in the laser : " << power << nl
321 << "Total Area in the laser : " << area << nl
322 << endl;
323}
324
325
326// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
327
328Foam::radiation::laserDTRM::laserDTRM(const volScalarField& T)
329:
331 mode_(powerDistNames_.get("mode", *this)),
332 DTRMCloud_(mesh_, Foam::zero{}, "DTRMCloud"), // Empty cloud
333 nParticles_(0),
334 ndTheta_(get<label>("nTheta")),
335 ndr_(get<label>("nr")),
336 maxTrackLength_(mesh_.bounds().mag()),
337
338 focalLaserPosition_
339 (
340 Function1<point>::New("focalLaserPosition", *this, &mesh_)
341 ),
342
343 laserDirection_
344 (
345 Function1<vector>::New("laserDirection", *this, &mesh_)
346 ),
347
348 focalLaserRadius_(get<scalar>("focalLaserRadius")),
349 qualityBeamLaser_
350 (
351 getOrDefault<scalar>("qualityBeamLaser", 0)
352 ),
353
354 sigma_(0),
355 I0_(0),
356 laserPower_(Function1<scalar>::New("laserPower", *this, &mesh_)),
357 powerDistribution_(),
358
359 reflectionSwitch_(false),
360
361 alphaCut_(getOrDefault<scalar>("alphaCut", 0.5)),
362
363 a_
364 (
365 IOobject
366 (
367 "a",
368 mesh_.time().timeName(),
369 mesh_,
370 IOobject::NO_READ,
371 IOobject::NO_WRITE
372 ),
373 mesh_,
375 ),
376 e_
377 (
378 IOobject
379 (
380 "e",
381 mesh_.time().timeName(),
382 mesh_,
383 IOobject::NO_READ,
384 IOobject::NO_WRITE
385 ),
386 mesh_,
388 ),
389 E_
390 (
391 IOobject
392 (
393 "E",
394 mesh_.time().timeName(),
395 mesh_,
396 IOobject::NO_READ,
397 IOobject::NO_WRITE
398 ),
399 mesh_,
401 ),
402 Q_
403 (
404 IOobject
405 (
406 "Q",
407 mesh_.time().timeName(),
408 mesh_,
409 IOobject::NO_READ,
410 IOobject::AUTO_WRITE,
411 IOobject::REGISTER
412 ),
413 mesh_,
415 )
416{
417 initialiseReflection();
418
419 initialise();
420}
421
422
423Foam::radiation::laserDTRM::laserDTRM
424(
425 const dictionary& dict,
426 const volScalarField& T
427)
428:
430 mode_(powerDistNames_.get("mode", *this)),
431 DTRMCloud_(mesh_, Foam::zero{}, "DTRMCloud"), // Empty cloud
432 nParticles_(0),
433 ndTheta_(get<label>("nTheta")),
434 ndr_(get<label>("nr")),
435 maxTrackLength_(mesh_.bounds().mag()),
436
437 focalLaserPosition_
438 (
439 Function1<point>::New("focalLaserPosition", *this, &mesh_)
440 ),
441 laserDirection_
442 (
443 Function1<vector>::New("laserDirection", *this, &mesh_)
444 ),
445
446 focalLaserRadius_(get<scalar>("focalLaserRadius")),
447 qualityBeamLaser_
448 (
449 getOrDefault<scalar>("qualityBeamLaser", 0)
450 ),
451
452 sigma_(0),
453 I0_(0),
454 laserPower_(Function1<scalar>::New("laserPower", *this, &mesh_)),
455 powerDistribution_(),
456
457 reflectionSwitch_(false),
458
459 alphaCut_(getOrDefault<scalar>("alphaCut", 0.5)),
460
461 a_
462 (
464 (
465 "a",
466 mesh_.time().timeName(),
467 mesh_,
468 IOobject::NO_READ,
469 IOobject::NO_WRITE
470 ),
471 mesh_,
473 ),
474 e_
475 (
477 (
478 "e",
479 mesh_.time().timeName(),
480 mesh_,
481 IOobject::NO_READ,
482 IOobject::NO_WRITE
483 ),
484 mesh_,
486 ),
487 E_
488 (
490 (
491 "E",
492 mesh_.time().timeName(),
493 mesh_,
494 IOobject::NO_READ,
495 IOobject::NO_WRITE
496 ),
497 mesh_,
499 ),
500 Q_
501 (
503 (
504 "Q",
505 mesh_.time().timeName(),
506 mesh_,
507 IOobject::NO_READ,
508 IOobject::AUTO_WRITE,
509 IOobject::REGISTER
510 ),
511 mesh_,
513 )
514{
515 initialiseReflection();
516 initialise();
517}
518
519
520// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
521
523{
525 {
526 return true;
527 }
528
529 return false;
530}
531
532Foam::label Foam::radiation::laserDTRM::nBands() const
533{
534 return 1;
535}
536
537
539{
540 auto treflectingCells = volScalarField::New
541 (
542 "reflectingCellsVol",
544 mesh_,
545 dimensionedScalar("zero", dimless, -1)
546 );
547 auto& reflectingCellsVol = treflectingCells.ref();
548
549 auto tnHat = volVectorField::New
550 (
551 "nHat",
553 mesh_,
555 );
556 auto& nHat = tnHat.ref();
557
558
559 // Reset the field
560 Q_ == Zero;
561
562 a_ = absorptionEmission_->a();
563 e_ = absorptionEmission_->e();
564 E_ = absorptionEmission_->E();
565
566 const interpolationCell<scalar> aInterp(a_);
567 const interpolationCell<scalar> eInterp(e_);
568 const interpolationCell<scalar> EInterp(E_);
569 const interpolationCell<scalar> TInterp(T_);
570
571 labelField reflectingCells(mesh_.nCells(), -1);
572
573 UPtrList<reflectionModel> reflectionUPtr;
574
575 if (reflectionSwitch_)
576 {
577 reflectionUPtr.resize(reflections_.size());
578
579 label reflectionModelId(0);
580 forAllIters(reflections_, iter1)
581 {
582 reflectionModel& model = iter1()();
583
584 reflectionUPtr.set(reflectionModelId, &model);
585
586 const volScalarField& alphaFrom =
587 mesh_.lookupObject<volScalarField>
588 (
589 IOobject::groupName("alpha", iter1.key().first())
590 );
591
592 const volScalarField& alphaTo =
593 mesh_.lookupObject<volScalarField>
594 (
595 IOobject::groupName("alpha", iter1.key().second())
596 );
597
598 const volVectorField nHatPhase(nHatfv(alphaFrom, alphaTo));
599
600 const volScalarField gradAlphaf
601 (
602 fvc::grad(alphaFrom)
603 & fvc::grad(alphaTo)
604 );
605
606 const volScalarField nearInterface(pos(alphaTo - alphaCut_));
607
608 const volScalarField mask(nearInterface*gradAlphaf);
609
610 forAll(alphaFrom, cellI)
611 {
612 if
613 (
614 nearInterface[cellI]
615 && mag(nHatPhase[cellI]) > 0.99
616 && mask[cellI] < 0
617 )
618 {
619 reflectingCells[cellI] = reflectionModelId;
620 reflectingCellsVol[cellI] = reflectionModelId;
621 if (mag(nHat[cellI]) == 0.0)
622 {
623 nHat[cellI] += nHatPhase[cellI];
624 }
625 }
626 }
627 reflectionModelId++;
628 }
629 }
630
631 interpolationCellPoint<vector> nHatInterp(nHat);
632
633 DTRMParticle::trackingData td
634 (
635 DTRMCloud_,
636 aInterp,
637 eInterp,
638 EInterp,
639 TInterp,
640 nHatInterp,
641 reflectingCells,
642 reflectionUPtr,
643 Q_
644 );
645
646 Info<< "Move particles..."
647 << returnReduce(DTRMCloud_.size(), sumOp<label>()) << endl;
648
649 DTRMCloud_.move(DTRMCloud_, td, mesh_.time().deltaTValue());
650
651 // Normalize by cell volume
652 Q_.primitiveFieldRef() /= mesh_.V();
653
654 if (debug)
655 {
656 Info<< "Final number of particles..."
657 << returnReduce(DTRMCloud_.size(), sumOp<label>()) << endl;
658
659 pointField lines(2*DTRMCloud_.size());
660 {
661 label i = 0;
662 for (const DTRMParticle& p : DTRMCloud_)
663 {
664 lines[i] = p.position();
665 lines[i+1] = p.p0();
666 i += 2;
667 }
668 }
669
671
672 if (UPstream::master())
673 {
674 OBJstream os(type() + "-particlePath.obj");
675
676 for (label pointi = 0; pointi < lines.size(); pointi += 2)
677 {
678 os.writeLine(lines[pointi], lines[pointi+1]);
679 }
680 }
681
682 scalar totalQ = gWeightedSum(mesh_.V(), Q_.primitiveField());
683 Info << "Total energy absorbed [W]: " << totalQ << endl;
684
685 if (mesh_.time().writeTime())
686 {
687 reflectingCellsVol.write();
688 nHat.write();
689 }
690 }
691
692 // Clear and initialise the cloud
693 // NOTE: Possible to reset original particles, but this requires
694 // data transfer for the cloud in differet processors.
695 initialise();
696}
697
698
699Foam::tmp<Foam::volScalarField> Foam::radiation::laserDTRM::Rp() const
700{
702 (
703 IOobject
704 (
705 "zero",
706 mesh_.time().timeName(),
707 mesh_,
711 ),
712 mesh_,
714 );
715}
716
717
718Foam::tmp<Foam::DimensionedField<Foam::scalar, Foam::volMesh>>
720{
721 return Q_.internalField();
722}
723
724
725// ************************************************************************* //
bool found
Macros for easy insertion into run-time selection tables.
const volScalarField & alpha1
const volScalarField & alpha2
Base cloud calls templated on particle type.
Definition Cloud.H:64
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
Definition Enum.H:57
Top level data entry class for use in dictionaries. Provides a mechanism to specify a variable as a c...
Definition Function1.H:92
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())
@ NO_REGISTER
Do not request registration (bool: false).
@ NO_READ
Nothing to be read.
@ NO_WRITE
Ignore writing from objectRegistry::writeObject().
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition IOobject.H:191
static word groupName(StringType base, const word &group)
Create dot-delimited name.group string.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
Definition UPstream.H:1714
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie,...
Definition UPtrList.H:366
void resize(const label newLen)
Change the size of the list. Any new entries are nullptr.
Definition UPtrListI.H:251
static const Form zero
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition dictionary.H:133
static void gatherInplaceOp(List< Type > &fld, const int tag=UPstream::msgType(), UPstream::commsTypes commsType=UPstream::commsTypes::nonBlocking, const label comm=UPstream::worldComm)
Inplace collect data in processor order on master (in serial: a no-op).
Discrete Tray Radiation Method for collimated radiation flux. At the moment the particles are injecte...
Definition laserDTRM.H:77
virtual label nBands() const
Number of bands for this radiation model.
virtual tmp< DimensionedField< scalar, volMesh > > Ru() const
Source term component (constant).
virtual tmp< volScalarField > Rp() const
Source term component (for power of T^4).
bool read()
Read radiation properties dictionary.
void calculate()
Solve radiation equation(s).
Lookup type of boundary radiation properties.
Definition lookup.H:60
Top level model for radiation modelling.
const fvMesh & mesh_
Reference to the mesh database.
virtual bool read()=0
Read radiationProperties dictionary.
Base class for radiation scattering.
static autoPtr< reflectionModel > New(const dictionary &dict, const fvMesh &mesh)
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
Definition tmp.H:215
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
A class representing the concept of 0 (zero) that can be used to avoid manipulating objects known to ...
Definition zero.H:58
#define defineTemplateTypeNameAndDebugWithName(Type, Name, DebugSwitch)
Define the typeName and debug information, lookup as Name.
Definition className.H:149
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition className.H:142
volScalarField & p
const volScalarField & T
const volScalarField & p0
Definition EEqn.H:36
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition error.H:600
OBJstream os(runTime.globalPath()/outputName)
Calculate the matrix for the laplacian of the field.
Calculate the finiteVolume matrix for implicit and explicit sources.
wallPoints::trackData td(isBlockedFace, regionToBlockSize)
word timeName
Definition getTimeIndex.H:3
#define DebugInfo
Report an information message using Foam::Info.
#define WarningInFunction
Report a warning using Foam::Warning.
List< ReturnType > get(const UPtrList< T > &list, const AccessOp &aop)
List of values generated by applying the access operation to each list item.
Namespace for bounding specifications. At the moment, mostly for tables.
Different types of constants.
const wordList area
Standard area field types (scalar, vector, tensor, etc).
tmp< GeometricField< typename outerProduct< vector, Type >::type, fvPatchField, volMesh > > grad(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
Definition fvcGrad.C:47
constexpr auto key(const Type &t) noexcept
Helper function to return the enum value.
Namespace for radiation modelling.
Namespace for OpenFOAM.
dimensionedScalar pos(const dimensionedScalar &ds)
bool returnReduceOr(const bool value, const int communicator=UPstream::worldComm)
Perform logical (or) MPI Allreduce on a copy. Uses UPstream::reduceOr.
const dimensionSet dimPower
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.
dimensionedScalar exp(const dimensionedScalar &ds)
GeometricField< vector, fvPatchField, volMesh > volVectorField
const dimensionSet dimless
Dimensionless.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
quaternion normalised(const quaternion &q)
Return the normalised (unit) quaternion of the given quaternion.
const dimensionSet dimLength(0, 1, 0, 0, 0, 0, 0)
dimensionedScalar pow3(const dimensionedScalar &ds)
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
GeometricField< scalar, fvPatchField, volMesh > volScalarField
messageStream Info
Information stream (stdout output on master, null elsewhere).
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
Definition POSIX.C:801
Type gWeightedSum(const UList< scalar > &weights, const UList< Type > &fld, const label comm)
The global weighted sum (integral) of a field, using the mag() of the weights.
T returnReduce(const T &value, BinaryOp bop, const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm)
Perform reduction on a copy, using specified binary operation.
const word GlobalIOList< Tuple2< scalar, vector > >::typeName("scalarVectorTable")
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition Ostream.H:519
const dimensionSet dimTemperature(0, 0, 0, 1, 0, 0, 0)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
bool returnReduceAnd(const bool value, const int communicator=UPstream::worldComm)
Perform logical (and) MPI Allreduce on a copy. Uses UPstream::reduceAnd.
dimensionedScalar pow4(const dimensionedScalar &ds)
errorManip< error > abort(error &err)
Definition errorManip.H:139
Field< label > labelField
Specialisation of Field<T> for label.
Definition labelField.H:48
vector point
Point is a vector.
Definition point.H:37
static constexpr const zero Zero
Global zero (0).
Definition zero.H:127
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
dimensionedScalar cbrt(const dimensionedScalar &ds)
const dimensionSet dimVolume(pow3(dimLength))
vectorField pointField
pointField is a vectorField.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
Vector< scalar > vector
Definition vector.H:57
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition errorManip.H:125
dimensioned< Type > average(const DimensionedField< Type, GeoMesh > &f1, const label comm)
dimensioned< vector > dimensionedVector
Dimensioned vector obtained from generic dimensioned type.
const dimensionSet dimMass(1, 0, 0, 0, 0, 0, 0)
constexpr char nl
The newline '\n' character (0x0a).
Definition Ostream.H:50
#define addToRadiationRunTimeSelectionTables(model)
dictionary dict
volScalarField & e
#define forAll(list, i)
Loop across all elements in list.
Definition stdFoam.H:299
#define forAllIters(container, iter)
Iterate across all elements in the container object.
Definition stdFoam.H:214
#define forAllConstIters(container, iter)
Iterate across all elements of the container object with const access.
Definition stdFoam.H:235
Unit conversion functions.