Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / thermophysicalModels / pdfs / exponential / exponential.C
blob7e32d235226fa83754de16b92b61f4f42df16e0b
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
27 #include "exponential.H"
28 #include "addToRunTimeSelectionTable.H"
30 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 namespace Foam
34     defineTypeNameAndDebug(exponential, 0);
35     addToRunTimeSelectionTable(pdf, exponential, dictionary);
38 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
40 Foam::exponential::exponential(const dictionary& dict, Random& rndGen)
42     pdf(dict, rndGen),
43     pdfDict_(dict.subDict(typeName + "PDF")),
44     minValue_(readScalar(pdfDict_.lookup("minValue"))),
45     maxValue_(readScalar(pdfDict_.lookup("maxValue"))),
46     lambda_(pdfDict_.lookup("lambda")),
47     ls_(lambda_),
48     range_(maxValue_-minValue_)
50     if (minValue_<0)
51     {
52         FatalErrorIn
53         (
54             "exponential::exponential(const dictionary& dict)"
55         ) << " minValue = " << minValue_ << ", it must be >0." << abort(FatalError);
56     }
58     scalar sMax = 0;
59     label n = lambda_.size();
60     for (label i=0; i<n; i++)
61     {
62         scalar s = lambda_[i]*exp(-lambda_[i]*minValue_);
63         for (label j=0; j<n; j++)
64         {
65             if (i!=j)
66             {
67                 scalar y = lambda_[j]*exp(-lambda_[j]*minValue_);
68                 s += y;
69             }
70         }
72         sMax = max(sMax, s);
73     }
75     for(label i=0; i<n; i++)
76     {
77         ls_[i] /= sMax;
78     }
82 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
84 Foam::exponential::~exponential()
88 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
90 Foam::scalar Foam::exponential::sample() const
92     scalar y = 0;
93     scalar x = 0;
94     label n = lambda_.size();
95     bool success = false;
97     while (!success)
98     {
99         x = minValue_ + range_*rndGen_.scalar01();
100         y = rndGen_.scalar01();
101         scalar p = 0.0;
103         for(label i=0; i<n; i++)
104         {
105             p += ls_[i]*exp(-lambda_[i]*x);
106         }
108         if (y<p)
109         {
110             success = true;
111         }
112     }
114     return x;
118 Foam::scalar Foam::exponential::minValue() const
120     return minValue_;
124 Foam::scalar Foam::exponential::maxValue() const
126     return maxValue_;
130 // ************************************************************************* //