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-------------------------------------------------------------------------------
11License
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// ************************************************************************* //
static Foam::barycentric barycentric01Impl(Foam::scalar s, Foam::scalar t, Foam::scalar u)
Definition: barycentric.C:35
Random number generator.
Definition: Random.H:60
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))
barycentric barycentric01(Random &rndGen)
Generate a random barycentric coordinate within the unit tetrahedron.
Definition: barycentric.C:73
Barycentric< scalar > barycentric
A scalar version of the templated Barycentric.
Definition: barycentric.H:51
Random rndGen
Definition: createFields.H:23