BaiGosman.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) 2026 Keysight Technologies
9 -------------------------------------------------------------------------------
10 License
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 "BaiGosman.H"
29 #include "LocalInteraction.H"
30 #include "fvMesh.H"
31 #include "mathematicalConstants.H"
32 #include "meshTools.H"
33 #include "Random.H"
34 #include "SLGThermo.H"
35 #include "volFields.H"
36 
37 // * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * * //
38 
39 template<class CloudType>
41 (
42  LocalInteraction<CloudType>& localInteraction
43 )
44 :
45  localInteraction_(localInteraction),
46  rndGen_(localInteraction.owner().rndGen()),
47  thermoPtr_(nullptr)
48 {}
49 
50 
51 template<class CloudType>
53 (
54  const BaiGosman<CloudType>& bg,
55  LocalInteraction<CloudType>& localInteraction
56 )
57 :
58  localInteraction_(localInteraction),
59  rndGen_(localInteraction.owner().rndGen()),
60  thermoPtr_(bg.thermoPtr_)
61 {}
62 
63 
64 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
65 
66 template<class CloudType>
68 (
69  std::true_type
70 )
71 {
72  thermoPtr_ =
73  localInteraction_.owner().db().template cfindObject<SLGThermo>
74  (
75  SLGThermo::typeName
76  );
77 
78  if (!thermoPtr_)
79  {
81  << "Local patch interaction type "
83  << " requires " << SLGThermo::typeName
84  << " to be registered for cloud "
85  << localInteraction_.owner().name()
86  << nl << exit(FatalError);
87  }
88 
89  if (!thermoPtr_->hasLiquids() || thermoPtr_->liquids().size() == 0)
90  {
92  << "Local patch interaction type "
94  << " requires at least one liquid component in "
95  << SLGThermo::typeName << nl << exit(FatalError);
96  }
97 }
98 
99 
100 template<class CloudType>
102 (
103  std::false_type
104 )
105 {
107  << "Local patch interaction type "
109  << " requires a thermo parcel type exposing T() and rho(). "
110  << "Use a thermo/reacting cloud or replace the patch entry with a "
111  << "standard localInteraction type."
112  << nl << exit(FatalError);
113 }
114 
115 
116 template<class CloudType>
117 const Foam::SLGThermo&
119 {
120  if (!thermoPtr_)
121  {
123  << "Local patch interaction type "
125  << " was used before " << SLGThermo::typeName
126  << " was initialised" << nl << exit(FatalError);
127  }
128 
129  return *thermoPtr_;
130 }
131 
132 
133 template<class CloudType>
135 (
136  const vector& v
137 ) const
138 {
139  vector tangent(Zero);
140  scalar magTangent = 0;
141 
142  // Try a bounded number of random samples first.
143  for (label iter = 0; iter < 100 && magTangent < SMALL; ++iter)
144  {
145  const vector vTest(rndGen_.sample01<vector>());
146  tangent = vTest - (vTest & v)*v;
147  magTangent = mag(tangent);
148  }
149 
150  // Deterministic fallback: project away the axis least aligned with v.
151  if (magTangent < SMALL)
152  {
153  const vector absV(mag(v.x()), mag(v.y()), mag(v.z()));
154  vector axis(1, 0, 0);
155  if (absV.y() <= absV.x() && absV.y() <= absV.z())
156  {
157  axis = vector(0, 1, 0);
158  }
159  else if (absV.z() <= absV.x() && absV.z() <= absV.y())
160  {
161  axis = vector(0, 0, 1);
162  }
163 
164  tangent = axis - (axis & v)*v;
165  magTangent = mag(tangent);
166 
167  if (magTangent < SMALL)
168  {
169  // v is degenerate (zero or NaN); return any unit vector.
170  return vector(1, 0, 0);
171  }
172  }
173 
174  return tangent/magTangent;
175 }
176 
177 
178 template<class CloudType>
180 (
181  const vector& tanVec1,
182  const vector& tanVec2,
183  const vector& nf
184 ) const
185 {
186  const scalar phiSi =
187  constant::mathematical::twoPi*rndGen_.sample01<scalar>();
188 
189  const scalar thetaMin = 5.0;
190  const scalar thetaMax = 50.0;
191  const scalar thetaSi =
192  (thetaMin + (thetaMax - thetaMin)*rndGen_.sample01<scalar>())
194 
195  const scalar alpha = sin(thetaSi);
196  const scalar dcorr = cos(thetaSi);
197  const vector normal(alpha*(tanVec1*cos(phiSi) + tanVec2*sin(phiSi)));
198  vector dirVec(dcorr*nf);
199  dirVec += normal;
200 
201  return dirVec/mag(dirVec);
202 }
203 
204 
205 template<class CloudType>
207 (
208  typename CloudType::parcelType& p,
209  const polyPatch& pp,
210  const label patchi,
211  const label idx,
212  const scalar mass,
213  bool& keepParticle,
214  const bool retainParticle,
215  const bool incrementStickCount
216 )
217 {
218  keepParticle = retainParticle;
219  p.active(false);
220  p.U() = Zero;
221 
222  const label facei = pp.whichFace(p.face());
223 
224  localInteraction_.addStickCounters
225  (
226  patchi,
227  idx,
228  mass,
229  pp,
230  facei,
231  incrementStickCount
232  );
233 }
234 
235 
236 template<class CloudType>
238 (
239  const scalar e,
240  const vector& Un,
241  vector& U
242 ) const
243 {
244  if (mag(Un) > 0)
245  {
246  U -= (1.0 + e)*Un;
247  }
248 }
249 
250 
251 template<class CloudType>
253 (
254  typename CloudType::parcelType& p,
255  const polyPatch& pp,
256  const label facei,
257  const label patchi,
258  const label idx,
259  const scalar mRatio,
260  const scalar We,
261  const scalar Wec,
262  const scalar sigma,
263  const patchInteractionData& coeffs,
264  bool& keepParticle
265 )
266 {
267  const fvMesh& mesh = localInteraction_.owner().mesh();
268  const vector& Up =
269  localInteraction_.owner().U().boundaryField()[pp.index()][facei];
270  const vector& nf = pp.faceNormals()[facei];
271 
272  const vector tanVec1(tangentVector(nf));
273  const vector tanVec2(nf^tanVec1);
274 
275  const scalar np = p.nParticle();
276  const scalar m = p.mass()*np;
277  const scalar d = p.d();
278  const vector Urel(p.U() - Up);
279  const vector Un(nf*(Urel & nf));
280  const vector Ut(Urel - Un);
281  const vector& posC = mesh.C()[p.cell()];
282  const vector& posCf = mesh.Cf().boundaryField()[pp.index()][facei];
283 
284  const scalar mRatioLimited = min(max(mRatio, scalar(0)), scalar(1));
285 
286  if (mRatioLimited <= VSMALL || Wec <= VSMALL || We <= Wec)
287  {
288  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
289  return;
290  }
291 
292  const scalar mSplash = m*mRatioLimited;
293  const scalar Ns = 5.0*(We/Wec - 1.0);
294 
295  if (Ns <= VSMALL)
296  {
297  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
298  return;
299  }
300 
301  const scalar dBarSplash =
302  (1/cbrt(6.0))*cbrt(mRatioLimited/Ns)*d + ROOTVSMALL;
303 
304  scalar dMax = coeffs.dMaxSplash();
305  if (dMax <= 0)
306  {
307  dMax = 0.9*cbrt(max(mRatioLimited, scalar(ROOTVSMALL)))*d;
308  }
309 
310  scalar dMin = coeffs.dMinSplash();
311  if (dMin <= 0)
312  {
313  dMin = 0.1*dMax;
314  }
315 
316  if (dMin <= ROOTVSMALL || dMax <= dMin)
317  {
318  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
319  return;
320  }
321 
322  const scalar K = exp(-dMin/dBarSplash) - exp(-dMax/dBarSplash);
323  if (K <= ROOTVSMALL)
324  {
325  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
326  return;
327  }
328 
329  scalar ESigmaSec = 0;
330 
331  const label parcelsPerSplash = coeffs.parcelsPerSplash();
332  scalarList dNew(parcelsPerSplash);
333  scalarList npNew(parcelsPerSplash);
334 
335  forAll(dNew, i)
336  {
337  const scalar y = rndGen_.sample01<scalar>();
338  dNew[i] = -dBarSplash*log(exp(-dMin/dBarSplash) - y*K);
339  npNew[i] = mRatioLimited*np*pow3(d)/pow3(dNew[i])/parcelsPerSplash;
340  ESigmaSec += npNew[i]*sigma*p.areaS(dNew[i]);
341  }
342 
343  const scalar EKIn = 0.5*m*magSqr(Un);
344  const scalar ESigmaIn = np*sigma*p.areaS(d);
345  const scalar Ed =
346  max
347  (
348  0.8*EKIn,
350  );
351  const scalar EKs = EKIn + ESigmaIn - ESigmaSec - Ed;
352 
353  if (EKs <= 0)
354  {
355  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
356  return;
357  }
358 
359  const scalar logD = log(d);
360  const scalar coeff2 = log(dNew[0]) - logD + ROOTVSMALL;
361  scalar coeff1 = 0;
362 
363  for (int i = 1; i < parcelsPerSplash; ++i)
364  {
365  coeff1 += sqr(log(dNew[i]) - logD);
366  }
367 
368  const scalar magUns0 =
369  sqrt
370  (
371  max
372  (
373  0.0,
374  2.0*parcelsPerSplash*EKs/mSplash/(1.0 + coeff1/sqr(coeff2))
375  )
376  );
377 
378  label nSplashParcels = 0;
379 
380  forAll(dNew, i)
381  {
382  if (dNew[i] <= ROOTVSMALL || npNew[i] <= ROOTVSMALL)
383  {
384  continue;
385  }
386 
387  const vector dirVec = splashDirection(tanVec1, tanVec2, -nf);
388 
389  auto* pPtr = new typename CloudType::parcelType(p);
390 
391  pPtr->origId() = pPtr->getNewParticleID();
392  pPtr->origProc() = Pstream::myProcNo();
393 
394  if (coeffs.splashParcelType() >= 0)
395  {
396  pPtr->typeId() = coeffs.splashParcelType();
397  }
398 
399  pPtr->nParticle() = npNew[i];
400  pPtr->d() = dNew[i];
401 
402  pPtr->U() =
403  dirVec
404  *(
405  mag(coeffs.Cf()*Ut)
406  + magUns0*(log(dNew[i]) - logD)/coeff2
407  );
408  pPtr->U() += Up;
409 
411 
412  // Perturb new parcels towards the owner cell centre.
413  pPtr->track(0.5*rndGen_.sample01<scalar>()*(posC - posCf), 0);
414 
415  // Hand over ownership to the cloud immediately. Mirrors the
416  // canonical KinematicSurfaceFilm::splashInteraction pattern and
417  // avoids the lifetime/iterator hazards of a deferred buffer.
418  localInteraction_.owner().addParticle(pPtr);
419 
420  nSplashParcels++;
421  }
422 
423  if (!nSplashParcels)
424  {
425  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
426  return;
427  }
428 
429  localInteraction_.addSplashCounters(patchi, idx, mSplash);
430 
431  const scalar mDash = m - mSplash;
432  if (mDash > VSMALL)
433  {
434  localInteraction_.addStickCounters
435  (
436  patchi,
437  idx,
438  mDash,
439  pp,
440  facei,
441  false
442  );
443  }
444 
445  keepParticle = false;
446  p.active(false);
447  p.U() = Zero;
448 }
449 
450 
451 template<class CloudType>
453 (
454  const scalar sigma,
455  const scalar mu,
456  const polyPatch& pp,
457  const label facei,
458  typename CloudType::parcelType& p,
459  const vector& nf,
460  const patchInteractionData& coeffs,
461  const label patchi,
462  const label idx,
463  bool& keepParticle
464 )
465 {
466  const vector& Up =
467  localInteraction_.owner().U().boundaryField()[pp.index()][facei];
468 
469  const scalar m = p.mass()*p.nParticle();
470  const scalar rho = p.rho();
471  const scalar d = p.d();
472  const vector Urel(p.U() - Up);
473  const vector Un(nf*(Urel & nf));
474 
475  const scalar La = rho*sigma*d/sqr(max(mu, scalar(VSMALL)));
476  const scalar We = rho*magSqr(Un)*d/max(sigma, scalar(VSMALL));
477  const scalar Wec = coeffs.Adry()*pow(max(La, scalar(VSMALL)), -0.183);
478 
479  if (We < Wec)
480  {
481  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
482  }
483  else
484  {
485  const scalar mRatio = 0.2 + 0.6*rndGen_.sample01<scalar>();
486  splashInteraction
487  (
488  p,
489  pp,
490  facei,
491  patchi,
492  idx,
493  mRatio,
494  We,
495  Wec,
496  sigma,
497  coeffs,
498  keepParticle
499  );
500  }
501 }
502 
503 
504 template<class CloudType>
506 (
507  const scalar sigma,
508  const scalar mu,
509  const polyPatch& pp,
510  const label facei,
511  typename CloudType::parcelType& p,
512  const vector& nf,
513  const patchInteractionData& coeffs,
514  const label patchi,
515  const label idx,
516  bool& keepParticle
517 )
518 {
519  const vector& Up =
520  localInteraction_.owner().U().boundaryField()[pp.index()][facei];
521 
522  const scalar m = p.mass()*p.nParticle();
523  const scalar rho = p.rho();
524  const scalar d = p.d();
525  vector& U = p.U();
526  const vector Urel(U - Up);
527  const vector Un(nf*(Urel & nf));
528  const vector Ut(Urel - Un);
529 
530  const scalar La = rho*sigma*d/sqr(max(mu, scalar(VSMALL)));
531  const scalar We = rho*magSqr(Un)*d/max(sigma, scalar(VSMALL));
532  const scalar Wec = coeffs.Awet()*pow(max(La, scalar(VSMALL)), -0.183);
533 
534  if (We < 2)
535  {
536  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
537  return;
538  }
539 
540  if (We >= 2 && We < 20)
541  {
542  const scalar UMag = max(mag(Urel), scalar(ROOTVSMALL));
543  const scalar theta =
545  const scalar epsilon =
546  0.993 - theta*(1.76 - theta*(1.56 - theta*0.49));
547 
548  U = -epsilon*(Un) + (5.0/7.0)*Ut + Up;
549  keepParticle = true;
550  p.active(true);
551  localInteraction_.addReboundCounters(patchi, idx, m);
552  return;
553  }
554 
555  if (We >= 20 && We < Wec)
556  {
557  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
558  return;
559  }
560 
561  const scalar mRatio = 0.2 + 0.8*rndGen_.sample01<scalar>();
562  splashInteraction
563  (
564  p,
565  pp,
566  facei,
567  patchi,
568  idx,
569  mRatio,
570  We,
571  Wec,
572  sigma,
573  coeffs,
574  keepParticle
575  );
576 }
577 
578 
579 template<class CloudType>
581 (
582  typename CloudType::parcelType& p,
583  const polyPatch& pp,
584  const label patchi,
585  const label idx,
586  bool& keepParticle,
587  std::true_type
588 )
589 {
590  const patchInteractionData& coeffs = localInteraction_.patchData_[patchi];
591 
592  vector nw;
593  vector Up;
594  localInteraction_.owner().patchData(p, pp, nw, Up);
595 
596  const label meshFacei = p.face();
597  const label facei = pp.whichFace(meshFacei);
598  if (facei < 0)
599  {
600  return false;
601  }
602 
603  if (mag(nw) <= ROOTVSMALL)
604  {
605  static bool warnedNormal = false;
606  if (!warnedNormal)
607  {
609  << "Invalid (zero-magnitude) patch normal for patch "
610  << pp.name() << "; parcel absorbed. Further occurrences "
611  << "will be silently absorbed." << nl;
612  warnedNormal = true;
613  }
614 
615  absorbInteraction
616  (
617  p, pp, patchi, idx, p.mass()*p.nParticle(), keepParticle
618  );
619  return true;
620  }
621 
622  const label celli = p.cell();
623  const SLGThermo& slgThermo = thermo();
624  const scalar pc = slgThermo.thermo().p()[celli];
625  const scalar Tc = slgThermo.thermo().T()[celli];
626  const scalar Td = p.T();
627 
628  const auto& liquid = slgThermo.liquids().properties()[0];
629  const scalar sigma = liquid.sigma(pc, Td);
630  const scalar rho = liquid.rho(pc, Td);
631  const scalar mu = liquid.mu(pc, Td);
632  const scalar d = p.d();
633 
634  if (sigma <= VSMALL || rho <= VSMALL || mu <= VSMALL || d <= VSMALL)
635  {
636  static bool warnedProps = false;
637  if (!warnedProps)
638  {
640  << "Non-positive BaiGosman liquid properties for patch "
641  << pp.name() << " at (pc=" << pc << ", Td=" << Td << "): "
642  << "sigma=" << sigma << ", rho=" << rho << ", mu=" << mu
643  << ", d=" << d << "; parcel absorbed. Check thermo "
644  << "and injection settings. Further occurrences will be "
645  << "silently absorbed." << nl;
646  warnedProps = true;
647  }
648 
649  absorbInteraction
650  (
651  p, pp, patchi, idx, p.mass()*p.nParticle(), keepParticle
652  );
653  return true;
654  }
655 
656  const scalar m = p.mass()*p.nParticle();
657  vector& U = p.U();
658  const vector Urel(U - Up);
659  const vector Un(nw*(Urel & nw));
660 
661  const scalar We = rho*magSqr(Un)*d/sigma;
662  const scalar Oh = mu/sqrt(rho*sigma*d);
663  const scalar K =
664  pow(max(Oh, scalar(VSMALL)), -0.4)*sqrt(max(We, scalar(0)));
665 
666  if (Td > coeffs.Tmelt())
667  {
668  if (We < coeffs.Wec())
669  {
670  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
671  }
672  else if (We > coeffs.Wec() && K > 57.7)
673  {
674  if (coeffs.dry())
675  {
676  drySplashInteraction
677  (
678  sigma,
679  mu,
680  pp,
681  facei,
682  p,
683  nw,
684  coeffs,
685  patchi,
686  idx,
687  keepParticle
688  );
689  }
690  else
691  {
692  wetSplashInteraction
693  (
694  sigma,
695  mu,
696  pp,
697  facei,
698  p,
699  nw,
700  coeffs,
701  patchi,
702  idx,
703  keepParticle
704  );
705  }
706  }
707  else
708  {
709  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
710  }
711  }
712  else
713  {
714  const scalar denom = max(coeffs.Tmelt() - Tc, scalar(ROOTVSMALL));
715  const scalar Tstar = min(max((Td - Tc)/denom, scalar(0)), scalar(1));
716  const scalar sigmay = 14e6*pow(max(1.0 - Tstar, scalar(0)), 0.7);
717 
718  const scalar eArg =
719  1.0
720  - rho*sqr(mag(Un))
721  /(6.0*max(sigmay, scalar(VSMALL))*max(Td, scalar(VSMALL)));
722  const scalar e = max(0.0, sqrt(max(eArg, scalar(0))));
723 
724  if (e < 0.05)
725  {
726  absorbInteraction(p, pp, patchi, idx, m, keepParticle);
727  }
728  else
729  {
730  keepParticle = true;
731  p.active(true);
732  bounceInteraction(e, Un, U);
733  localInteraction_.addReboundCounters(patchi, idx, m);
734  }
735  }
736 
737  return true;
738 }
739 
740 
741 template<class CloudType>
743 (
744  typename CloudType::parcelType&,
745  const polyPatch& pp,
746  const label,
747  const label,
748  bool&,
749  std::false_type
750 )
751 {
753  << "Patch " << pp.name() << " uses local patch interaction type "
755  << ", but cloud " << localInteraction_.owner().name()
756  << " does not use thermo parcels exposing T() and rho()."
757  << nl << exit(FatalError);
758 
759  return false;
760 }
761 
762 
763 // ************************************************************************* //
List< scalar > scalarList
List of scalar.
Definition: scalarList.H:32
dimensionedScalar acos(const dimensionedScalar &ds)
dimensionedScalar log(const dimensionedScalar &ds)
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:125
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
error FatalError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL ERROR&#39; header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:652
const surfaceVectorField & Cf() const
Return face centres as surfaceVectorField.
SLGThermo slgThermo(mesh, thermo)
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:40
dimensionedSymmTensor sqr(const dimensionedVector &dv)
const Vector< label > & solutionD() const
Return the vector of solved-for directions in mesh.
Definition: polyMesh.C:867
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
Random rndGen
Definition: createFields.H:23
dimensionedScalar sqrt(const dimensionedScalar &ds)
static int myProcNo(label communicator=worldComm)
Rank of this process in the communicator (starting from masterNo()). Negative if the process is not a...
Definition: UPstream.H:1799
virtual const volScalarField & T() const
Temperature [K].
Definition: basicThermo.C:619
CGAL::Exact_predicates_exact_constructions_kernel K
dimensionedScalar sigma("sigma", dimMass/sqr(dimTime), transportProperties)
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:400
virtual volScalarField & p()
Pressure [Pa].
Definition: basicThermo.C:607
const Field< point_type > & faceNormals() const
Return face unit normals for patch.
psiReactionThermo & thermo
Definition: createFields.H:28
Internal BaiGosman thermo parcel-patch interaction used by Foam::LocalInteraction.
Definition: BaiGosman.H:80
scalar y
const dimensionedScalar e
Elementary charge.
Definition: createFields.H:11
dynamicFvMesh & mesh
dimensionedScalar cos(const dimensionedScalar &ds)
dimensionedScalar exp(const dimensionedScalar &ds)
constexpr scalar twoPi(2 *M_PI)
dimensionedScalar cbrt(const dimensionedScalar &ds)
const liquidMixtureProperties & liquids() const
Return reference to the global (additional) liquids.
Definition: SLGThermo.C:117
constexpr scalar pi(M_PI)
Thermo package for (S)olids (L)iquids and (G)ases Takes reference to thermo package, and provides:
Definition: SLGThermo.H:60
Vector< scalar > vector
Definition: vector.H:57
constexpr scalar piByTwo(0.5 *M_PI)
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:26
Urel
Definition: pEqn.H:56
ParcelType parcelType
Type of parcel the cloud was instantiated for.
Definition: DSMCCloud.H:290
dimensionedScalar sin(const dimensionedScalar &ds)
tmp< GeometricField< Type, PatchField, GeoMesh > > T() const
Return transpose (only if it is a tensor field)
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
const labelUList & owner() const
Internal face owner. Note bypassing virtual mechanism so.
Definition: fvMesh.H:572
const dimensionedScalar mu
Atomic mass unit.
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
dimensionedScalar pow3(const dimensionedScalar &ds)
U
Definition: pEqn.H:72
#define WarningInFunction
Report a warning using Foam::Warning.
scalar epsilon
void constrainDirection(const polyMesh &mesh, const Vector< label > &dirs, vector &d)
Set the constrained components of directions/velocity to zero.
Definition: meshTools.C:680
const volVectorField & C() const
Return cell centres as volVectorField.
volScalarField & p
const PtrList< liquidProperties > & properties() const
Return the liquid properties.
const dimensionedScalar alpha
Fine-structure constant: default SI units: [].
const Boundary & boundaryField() const noexcept
Return const-reference to the boundary field.
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
static const word beiGosmanTypeName
BaiGosman type keyword used in patch entries.
const fluidThermo & thermo() const
Return reference to the thermo database.
Definition: SLGThermo.C:98
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:127