viewFactor.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 "viewFactor.H"
27 #include "surfaceFields.H"
28 #include "constants.H"
30 #include "typeInfo.H"
32 
33 using namespace Foam::constant;
34 
35 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
36 
37 namespace Foam
38 {
39 namespace radiationModels
40 {
43 }
44 }
45 
46 
47 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
48 
49 void Foam::radiationModels::viewFactor::initialise()
50 {
51  const polyBoundaryMesh& coarsePatches = coarseMesh_.poly().boundary();
52  const volScalarField::Boundary& qrp = qr_.boundaryField();
53 
54  label count = 0;
55  forAll(qrp, patchi)
56  {
57  // const polyPatch& pp = mesh_.poly().boundary()[patchi];
58  const fvPatchScalarField& qrPatchi = qrp[patchi];
59 
60  if ((isA<fixedValueFvPatchScalarField>(qrPatchi)))
61  {
62  selectedPatches_[count] = qrPatchi.patch().index();
63  nLocalCoarseFaces_ += coarsePatches[patchi].size();
64  count++;
65  }
66  }
67 
68  selectedPatches_.resize(count--);
69 
70  if (debug)
71  {
72  Pout<< "radiationModels::viewFactor::initialise() "
73  << "Selected patches:" << selectedPatches_ << endl;
74  Pout<< "radiationModels::viewFactor::initialise() "
75  << "Number of coarse faces:" << nLocalCoarseFaces_ << endl;
76  }
77 
78  totalNCoarseFaces_ = nLocalCoarseFaces_;
79  reduce(totalNCoarseFaces_, sumOp<label>());
80 
81  if (debug && Pstream::master())
82  {
84  << "Total number of clusters : " << totalNCoarseFaces_ << endl;
85  }
86 
87  labelListIOList subMap
88  (
89  IOobject
90  (
91  "subMap",
92  mesh_.facesInstance(),
93  mesh_,
96  false
97  )
98  );
99 
100  labelListIOList constructMap
101  (
102  IOobject
103  (
104  "constructMap",
105  mesh_.facesInstance(),
106  mesh_,
109  false
110  )
111  );
112 
113  IOList<label> consMapDim
114  (
115  IOobject
116  (
117  "constructMapDim",
118  mesh_.facesInstance(),
119  mesh_,
122  false
123  )
124  );
125 
126  map_.reset
127  (
128  new distributionMap
129  (
130  consMapDim[0],
131  move(subMap),
132  move(constructMap)
133  )
134  );
135 
136  scalarListIOList FmyProc
137  (
138  IOobject
139  (
140  "F",
141  mesh_.facesInstance(),
142  mesh_,
145  false
146  )
147  );
148 
149  labelListIOList globalFaceFaces
150  (
151  IOobject
152  (
153  "globalFaceFaces",
154  mesh_.facesInstance(),
155  mesh_,
158  false
159  )
160  );
161 
162  List<labelListList> globalFaceFacesProc(Pstream::nProcs());
163  globalFaceFacesProc[Pstream::myProcNo()] = globalFaceFaces;
164  Pstream::gatherList(globalFaceFacesProc);
165 
167  F[Pstream::myProcNo()] = FmyProc;
169 
170  globalIndex globalNumbering(nLocalCoarseFaces_);
171 
172  if (Pstream::master())
173  {
174  Fmatrix_.reset
175  (
176  new scalarSquareMatrix(totalNCoarseFaces_, 0.0)
177  );
178 
179  if (debug)
180  {
182  << "Insert elements in the matrix..." << endl;
183  }
184 
185  for (label proci = 0; proci < Pstream::nProcs(); proci++)
186  {
187  insertMatrixElements
188  (
189  globalNumbering,
190  proci,
191  globalFaceFacesProc[proci],
192  F[proci],
193  Fmatrix_()
194  );
195  }
196 
197 
198  bool smoothing = readBool(coeffs_.lookup("smoothing"));
199  if (smoothing)
200  {
201  if (debug)
202  {
204  << "Smoothing the matrix..." << endl;
205  }
206 
207  for (label i=0; i<totalNCoarseFaces_; i++)
208  {
209  scalar sumF = 0.0;
210  for (label j=0; j<totalNCoarseFaces_; j++)
211  {
212  sumF += Fmatrix_()(i, j);
213  }
214 
215  const scalar delta = sumF - 1.0;
216  for (label j=0; j<totalNCoarseFaces_; j++)
217  {
218  Fmatrix_()(i, j) *= (1.0 - delta/(sumF + 0.001));
219  }
220  }
221  }
222 
223  constEmissivity_ = readBool(coeffs_.lookup("constantEmissivity"));
224  if (constEmissivity_)
225  {
226  CLU_.reset
227  (
228  new scalarSquareMatrix(totalNCoarseFaces_, 0.0)
229  );
230 
231  pivotIndices_.setSize(CLU_().m());
232  }
233  }
234 }
235 
236 
237 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
238 
240 :
242  finalAgglom_
243  (
244  IOobject
245  (
246  "finalAgglom",
247  mesh_.facesInstance(),
248  mesh_,
249  IOobject::MUST_READ,
250  IOobject::NO_WRITE,
251  false
252  )
253  ),
254  map_(),
255  coarseMesh_
256  (
257  IOobject
258  (
259  mesh_.name(),
260  mesh_.polyMesh::instance(),
261  mesh_.time(),
262  IOobject::NO_READ,
263  IOobject::NO_WRITE
264  ),
265  mesh_,
266  finalAgglom_
267  ),
268  qr_
269  (
270  IOobject
271  (
272  "qr",
273  mesh_.time().name(),
274  mesh_,
275  IOobject::MUST_READ,
276  IOobject::AUTO_WRITE
277  ),
278  mesh_,
279  dimensions::heatFlux
280  ),
281  Fmatrix_(),
282  CLU_(),
283  selectedPatches_(mesh_.boundary().size(), -1),
284  totalNCoarseFaces_(0),
285  nLocalCoarseFaces_(0),
286  constEmissivity_(false),
287  iterCounter_(0),
288  pivotIndices_(0)
289 {
290  initialise();
291 }
292 
293 
295 (
296  const dictionary& dict,
297  const volScalarField& T
298 )
299 :
301  finalAgglom_
302  (
303  IOobject
304  (
305  "finalAgglom",
306  mesh_.facesInstance(),
307  mesh_,
308  IOobject::MUST_READ,
309  IOobject::NO_WRITE,
310  false
311  )
312  ),
313  map_(),
314  coarseMesh_
315  (
316  IOobject
317  (
318  mesh_.name(),
319  mesh_.polyMesh::instance(),
320  mesh_.time(),
321  IOobject::NO_READ,
322  IOobject::NO_WRITE
323  ),
324  mesh_,
325  finalAgglom_
326  ),
327  qr_
328  (
329  IOobject
330  (
331  "qr",
332  mesh_.time().name(),
333  mesh_,
334  IOobject::MUST_READ,
335  IOobject::AUTO_WRITE
336  ),
337  mesh_,
338  dimensions::heatFlux
339  ),
340  Fmatrix_(),
341  CLU_(),
342  selectedPatches_(mesh_.boundary().size(), -1),
343  totalNCoarseFaces_(0),
344  nLocalCoarseFaces_(0),
345  constEmissivity_(false),
346  iterCounter_(0),
347  pivotIndices_(0)
348 {
349  initialise();
350 }
351 
352 
353 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
354 
356 {}
357 
358 
359 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
360 
362 {
363  if (radiationModel::read())
364  {
365  return true;
366  }
367  else
368  {
369  return false;
370  }
371 }
372 
373 
374 void Foam::radiationModels::viewFactor::insertMatrixElements
375 (
376  const globalIndex& globalNumbering,
377  const label proci,
378  const labelListList& globalFaceFaces,
379  const scalarListList& viewFactors,
380  scalarSquareMatrix& Fmatrix
381 )
382 {
383  forAll(viewFactors, facei)
384  {
385  const scalarList& vf = viewFactors[facei];
386  const labelList& globalFaces = globalFaceFaces[facei];
387 
388  label globalI = globalNumbering.toGlobal(proci, facei);
389  forAll(globalFaces, i)
390  {
391  Fmatrix[globalI][globalFaces[i]] = vf[i];
392  }
393  }
394 }
395 
396 
398 {
399  // Store previous iteration
400  qr_.storePrevIter();
401 
402  scalarField compactCoarseT4(map_->constructSize(), 0.0);
403  scalarField compactCoarseE(map_->constructSize(), 0.0);
404  scalarField compactCoarseHo(map_->constructSize(), 0.0);
405 
406  globalIndex globalNumbering(nLocalCoarseFaces_);
407 
408  // Fill local averaged(T), emissivity(E) and external heatFlux(Ho)
409  DynamicList<scalar> localCoarseT4ave(nLocalCoarseFaces_);
410  DynamicList<scalar> localCoarseEave(nLocalCoarseFaces_);
411  DynamicList<scalar> localCoarseHoave(nLocalCoarseFaces_);
412 
413  volScalarField::Boundary& qrBf = qr_.boundaryFieldRef();
414 
415  forAll(selectedPatches_, i)
416  {
417  label patchID = selectedPatches_[i];
418 
419  const scalarField& Tp = T_.boundaryField()[patchID];
420  const scalarField& sf = mesh_.magSf().boundaryField()[patchID];
421 
422  fvPatchScalarField& qrPatch = qrBf[patchID];
423 
425  refCast
426  <
428  >(qrPatch);
429 
430  const scalarList eb = qrp.emissivity();
431 
432  const scalarList& Hoi = qrp.qro();
433 
434  const polyPatch& pp = coarseMesh_.poly().boundary()[patchID];
435  const labelList& coarsePatchFace = coarseMesh_.patchFaceMap()[patchID];
436 
437  scalarList T4ave(pp.size(), 0.0);
438  scalarList Eave(pp.size(), 0.0);
439  scalarList Hoiave(pp.size(), 0.0);
440 
441  if (pp.size() > 0)
442  {
443  const labelList& agglom = finalAgglom_[patchID];
444  label nAgglom = max(agglom) + 1;
445 
446  labelListList coarseToFine(invertOneToMany(nAgglom, agglom));
447 
448  forAll(coarseToFine, coarseI)
449  {
450  const label coarseFaceID = coarsePatchFace[coarseI];
451  const labelList& fineFaces = coarseToFine[coarseFaceID];
452  UIndirectList<scalar> fineSf
453  (
454  sf,
455  fineFaces
456  );
457 
458  const scalar area = sum(fineSf());
459 
460  // Temperature, emissivity and external flux area weighting
461  forAll(fineFaces, j)
462  {
463  label facei = fineFaces[j];
464  T4ave[coarseI] += (pow4(Tp[facei])*sf[facei])/area;
465  Eave[coarseI] += (eb[facei]*sf[facei])/area;
466  Hoiave[coarseI] += (Hoi[facei]*sf[facei])/area;
467  }
468  }
469  }
470 
471  localCoarseT4ave.append(T4ave);
472  localCoarseEave.append(Eave);
473  localCoarseHoave.append(Hoiave);
474  }
475 
476  // Fill the local values to distribute
477  SubList<scalar>(compactCoarseT4, nLocalCoarseFaces_) = localCoarseT4ave;
478  SubList<scalar>(compactCoarseE, nLocalCoarseFaces_) = localCoarseEave;
479  SubList<scalar>(compactCoarseHo, nLocalCoarseFaces_) = localCoarseHoave;
480 
481  // Distribute data
482  map_->distribute(compactCoarseT4);
483  map_->distribute(compactCoarseE);
484  map_->distribute(compactCoarseHo);
485 
486  // Distribute local global ID
487  labelList compactGlobalIds(map_->constructSize(), 0.0);
488 
489  labelList localGlobalIds(nLocalCoarseFaces_);
490 
491  for(label k = 0; k < nLocalCoarseFaces_; k++)
492  {
493  localGlobalIds[k] = globalNumbering.toGlobal(Pstream::myProcNo(), k);
494  }
495 
497  (
498  compactGlobalIds,
499  nLocalCoarseFaces_
500  ) = localGlobalIds;
501 
502  map_->distribute(compactGlobalIds);
503 
504  // Create global size vectors
505  scalarField T4(totalNCoarseFaces_, 0.0);
506  scalarField E(totalNCoarseFaces_, 0.0);
507  scalarField qrExt(totalNCoarseFaces_, 0.0);
508 
509  // Fill lists from compact to global indexes.
510  forAll(compactCoarseT4, i)
511  {
512  T4[compactGlobalIds[i]] = compactCoarseT4[i];
513  E[compactGlobalIds[i]] = compactCoarseE[i];
514  qrExt[compactGlobalIds[i]] = compactCoarseHo[i];
515  }
516 
520 
524 
525  // Net radiation
526  scalarField q(totalNCoarseFaces_, 0.0);
527 
528  if (Pstream::master())
529  {
530  // Variable emissivity
531  if (!constEmissivity_)
532  {
533  scalarSquareMatrix C(totalNCoarseFaces_, 0.0);
534 
535  for (label i=0; i<totalNCoarseFaces_; i++)
536  {
537  for (label j=0; j<totalNCoarseFaces_; j++)
538  {
539  const scalar invEj = 1.0/E[j];
540  const scalar sigmaT4 = physicoChemical::sigma.value()*T4[j];
541 
542  if (i==j)
543  {
544  C(i, j) = invEj - (invEj - 1.0)*Fmatrix_()(i, j);
545  q[i] += (Fmatrix_()(i, j) - 1.0)*sigmaT4 - qrExt[j];
546  }
547  else
548  {
549  C(i, j) = (1.0 - invEj)*Fmatrix_()(i, j);
550  q[i] += Fmatrix_()(i, j)*sigmaT4;
551  }
552 
553  }
554  }
555 
556  Info<< nl << "Solving view factor equations..." << endl;
557 
558  // Negative coming into the fluid
559  LUsolve(C, q);
560  }
561  else // Constant emissivity
562  {
563  // Initial iter calculates CLU and caches it
564  if (iterCounter_ == 0)
565  {
566  for (label i=0; i<totalNCoarseFaces_; i++)
567  {
568  for (label j=0; j<totalNCoarseFaces_; j++)
569  {
570  const scalar invEj = 1.0/E[j];
571  if (i==j)
572  {
573  CLU_()(i, j) = invEj-(invEj-1.0)*Fmatrix_()(i, j);
574  }
575  else
576  {
577  CLU_()(i, j) = (1.0 - invEj)*Fmatrix_()(i, j);
578  }
579  }
580  }
581 
582  if (debug)
583  {
585  << "\nDecomposing C matrix..." << endl;
586  }
587 
588  LUDecompose(CLU_(), pivotIndices_);
589  }
590 
591  for (label i=0; i<totalNCoarseFaces_; i++)
592  {
593  for (label j=0; j<totalNCoarseFaces_; j++)
594  {
595  const scalar sigmaT4 =
597 
598  if (i==j)
599  {
600  q[i] += (Fmatrix_()(i, j) - 1.0)*sigmaT4 - qrExt[j];
601  }
602  else
603  {
604  q[i] += Fmatrix_()(i, j)*sigmaT4;
605  }
606  }
607  }
608 
609  if (debug)
610  {
612  << "\nLU Back substitute C matrix.." << endl;
613  }
614 
615  LUBacksubstitute(CLU_(), pivotIndices_, q);
616  iterCounter_ ++;
617  }
618  }
619 
620  // Scatter q and fill qr
623 
624  label globCoarseId = 0;
625  forAll(selectedPatches_, i)
626  {
627  const label patchID = selectedPatches_[i];
628  const polyPatch& pp = mesh_.poly().boundary()[patchID];
629  if (pp.size() > 0)
630  {
631  scalarField& qrp = qrBf[patchID];
632  const labelList& agglom = finalAgglom_[patchID];
633  label nAgglom = max(agglom)+1;
634 
635  labelListList coarseToFine(invertOneToMany(nAgglom, agglom));
636 
637  const labelList& coarsePatchFace =
638  coarseMesh_.patchFaceMap()[patchID];
639 
640  forAll(coarseToFine, coarseI)
641  {
642  label globalCoarse =
643  globalNumbering.toGlobal(Pstream::myProcNo(), globCoarseId);
644  const label coarseFaceID = coarsePatchFace[coarseI];
645  const labelList& fineFaces = coarseToFine[coarseFaceID];
646  forAll(fineFaces, k)
647  {
648  label facei = fineFaces[k];
649 
650  qrp[facei] = q[globalCoarse];
651  }
652  globCoarseId ++;
653  }
654  }
655  }
656 
657  if (debug)
658  {
659  forAll(qrBf, patchID)
660  {
661  const scalarField& qrp = qrBf[patchID];
662  const scalarField& magSf = mesh_.magSf().boundaryField()[patchID];
663  const scalar heatFlux = gSum(qrp*magSf);
664 
666  << "Total heat transfer rate at patch: "
667  << patchID << " "
668  << heatFlux << endl;
669  }
670  }
671 
672  // Relax qr if necessary
673  qr_.relax();
674 }
675 
676 
678 {
679  return volScalarField::New
680  (
681  "Rp",
682  mesh_,
684  (
686  0
687  )
688  );
689 }
690 
691 
694 {
696  (
697  "Ru",
698  mesh_,
700  );
701 }
702 
703 // ************************************************************************* //
label k
scalar delta
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:449
Macros for easy insertion into run-time selection tables.
Graphite solid properties.
Definition: C.H:51
static tmp< DimensionedField< Type, GeoMesh, PrimitiveField > > New(const word &name, const GeoMesh &mesh, const dimensionSet &, const PrimitiveField< Type > &)
Return a temporary field constructed from name, mesh,.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
Definition: DynamicListI.H:296
Generic GeometricBoundaryField class.
Generic GeometricField class.
static tmp< GeometricField< Type, GeoMesh, PrimitiveField > > New(const word &name, const Internal &, const PtrList< Patch > &, const HashPtrTable< Source > &=HashPtrTable< Source >())
Return a temporary field constructed from name,.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:99
static void listCombineGather(const List< commsStruct > &comms, List< T > &Value, const CombineOp &cop, const int tag, const label comm)
static void listCombineScatter(const List< commsStruct > &comms, List< T > &Value, const int tag, const label comm)
Scatter data. Reverse of combineGather.
static void gatherList(const List< commsStruct > &comms, List< T > &Values, const int tag, const label comm)
Gather data but keep individual values separate.
A List obtained as a section of another List.
Definition: SubList.H:56
label size() const
Return the number of elements in the UList.
Definition: UListI.H:311
static bool master(const label communicator=0)
Am I the master process.
Definition: UPstream.H:423
static label nProcs(const label communicator=0)
Number of processes in parallel run.
Definition: UPstream.H:411
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
Definition: UPstream.H:429
label size() const
Return the number of elements in the UPtrList.
Definition: UPtrListI.H:29
A list of keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
Definition: dictionary.H:162
const Type & value() const
Return const reference to value.
Abstract base class with a fat-interface to all derived classes covering all possible ways in which t...
Definition: fvPatchField.H:90
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
Definition: globalIndex.H:64
label toGlobal(const label i) const
From local to global.
Definition: globalIndexI.H:82
This boundary condition provides a grey-diffuse condition for radiative heat flux,...
Motion of the mesh specified as a list of pointMeshMovers.
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:78
A patch is a list of labels that address the faces in the global face list.
Definition: polyPatch.H:71
tmp< scalarField > emissivity() const
Calculate corresponding emissivity field.
Top level model for radiation modelling.
virtual bool read()=0
Read radiationProperties dictionary.
View factor radiation model. The system solved is: C q = b where: Cij = deltaij/Ej - (1/Ej - 1)Fij q ...
Definition: viewFactor.H:69
virtual ~viewFactor()
Destructor.
Definition: viewFactor.C:355
virtual tmp< volScalarField > Rp() const
Source term component (for power of T^4)
Definition: viewFactor.C:677
virtual tmp< volScalarField::Internal > Ru() const
Source term component (constant)
Definition: viewFactor.C:693
viewFactor(const volScalarField &T)
Construct from components.
Definition: viewFactor.C:239
bool read()
Read radiation properties dictionary.
Definition: viewFactor.C:361
void calculate()
Solve system of equation(s)
Definition: viewFactor.C:397
A class for managing temporary objects.
Definition: tmp.H:55
Template function which returns the un-mangled name of a given type. Useful for types which do not ha...
label patchi
volScalarField sf(fieldObject, mesh)
#define InfoInFunction
Report an information message using Foam::Info.
const dimensionedScalar sigma
Stefan-Boltzmann constant: default SI units: [W/m^2/K^4].
const dimensionedScalar F
Faraday constant: default SI units: [C/mol].
Collection of constants.
const dimensionSet area
const dimensionSet time
const dimensionSet heatFlux
static const coefficient C("C", dimTemperature, 234.5)
Namespace for OpenFOAM.
bool readBool(Istream &)
Definition: boolIO.C:63
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
To & refCast(From &r)
Reference type cast template function.
Definition: typeInfo.H:141
const dimensionSet & dimMass
Definition: dimensions.C:275
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:288
IOList< labelList > labelListIOList
Label container classes.
const dimensionSet & dimLength
Definition: dimensions.C:276
void LUBacksubstitute(const scalarSquareMatrix &luMmatrix, const labelList &pivotIndices, List< Type > &source)
LU back-substitution with given source, returning the solution.
void LUDecompose(scalarSquareMatrix &matrix, labelList &pivotIndices)
LU decompose the matrix with pivoting.
messageStream Info
void pow4(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
labelListList invertOneToMany(const label len, const labelUList &)
Invert one-to-many map. Unmapped elements will be size 0.
Definition: ListOps.C:67
Type gSum(const UList< Type > &f, const label comm)
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
const dimensionSet & dimTime
Definition: dimensions.C:277
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
void pow3(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
SquareMatrix< scalar > scalarSquareMatrix
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
prefixOSstream Pout(cout, "Pout")
Definition: IOstreams.H:53
IOList< scalarList > scalarListIOList
Scalar container classes.
label count(const ListType &l, typename ListType::const_reference x)
Count the number of occurrences of a value in a list.
void LUsolve(scalarSquareMatrix &matrix, List< Type > &source)
Solve the matrix using LU decomposition with pivoting.
defineTypeNameAndDebug(atmosphericBoundaryLayer, 0)
void T(GeometricField< Type, GeoMesh, PrimitiveField1 > &gf, const GeometricField< Type, GeoMesh, PrimitiveField2 > &gf1)
static const char nl
Definition: Ostream.H:297
const dimensionSet & dimTemperature
Definition: dimensions.C:278
dimensioned< Type > max(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
fvPatchField< scalar > fvPatchScalarField
#define addToRadiationRunTimeSelectionTables(model)
faceListList boundary(nPatches)
dictionary dict
Foam::surfaceFields.
Basic run-time type information using word as the type's name. Used to enhance the standard RTTI to c...