barycentric.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 OpenFOAM Foundation
9  Copyright (C) 2020 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
29 #include "barycentric.H"
30 #include "Random.H"
31 
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33 
35 (
36  Foam::scalar s,
37  Foam::scalar t,
38  Foam::scalar u
39 )
40 {
41  // Transform the random point in the unit cube to a random point in the
42  // unit tet by means of a series of reflections. See
43  // <http://vcg.isti.cnr.it/jgt/tetra.htm> for details.
44 
45  if (s + t > 1)
46  {
47  s = 1 - s;
48  t = 1 - t;
49  }
50 
51  if (s + t + u > 1)
52  {
53  Foam::scalar temp = u;
54 
55  if (t + u > 1)
56  {
57  u = 1 - s - t;
58  t = 1 - temp;
59  }
60  else
61  {
62  u = s + t + u - 1;
63  s = 1 - t - temp;
64  }
65  }
66 
67  return Foam::barycentric(1 - s - t - u, s, t, u);
68 }
69 
70 
71 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
72 
74 {
75  const scalar s(rndGen.sample01<scalar>());
76  const scalar t(rndGen.sample01<scalar>());
77  const scalar u(rndGen.sample01<scalar>());
78 
79  return barycentric01Impl(s, t, u);
80 }
81 
82 
83 // ************************************************************************* //
Foam::Random
Random number generator.
Definition: Random.H:59
s
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
Definition: gmvOutputSpray.H:25
Foam::barycentric01
barycentric barycentric01(Random &rndGen)
Generate a random barycentric coordinate within the unit tetrahedron.
Definition: barycentric.C:73
Foam::Barycentric
Templated 3D Barycentric derived from VectorSpace. Has 4 components, one of which is redundant.
Definition: Barycentric.H:54
Random.H
barycentric.H
rndGen
Random rndGen
Definition: createFields.H:23
Foam::barycentric
Barycentric< scalar > barycentric
A scalar version of the templated Barycentric.
Definition: barycentric.H:47
barycentric01Impl
static Foam::barycentric barycentric01Impl(Foam::scalar s, Foam::scalar t, Foam::scalar u)
Definition: barycentric.C:35