Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / thermophysicalModels / pdfs / RosinRammler / RosinRammler.C
bloba602e023c6e460538387e2cad07c3beeb23af027
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 \*---------------------------------------------------------------------------*/
26 #include "RosinRammler.H"
27 #include "addToRunTimeSelectionTable.H"
29 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
31 namespace Foam
33     defineTypeNameAndDebug(RosinRammler, 0);
35     addToRunTimeSelectionTable(pdf, RosinRammler, dictionary);
38 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
40 Foam::RosinRammler::RosinRammler(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     d_(pdfDict_.lookup("d")),
47     n_(pdfDict_.lookup("n")),
48     ls_(d_),
49     range_(maxValue_-minValue_)
51     if (minValue_<0)
52     {
53         FatalErrorIn
54         (
55             "RosinRammler::RosinRammler(const dictionary& dict)"
56         ) << " minValue = " << minValue_ << ", it must be >0." << abort(FatalError);
57     }
59     if (maxValue_<minValue_)
60     {
61         FatalErrorIn
62         (
63             "RosinRammler::RosinRammler(const dictionary& dict)"
64         ) << " maxValue is smaller than minValue." << abort(FatalError);
65     }
67     // find max value so that it can be normalized to 1.0
68     scalar sMax = 0;
69     label n = d_.size();
70     for (label i=0; i<n; i++)
71     {
72         scalar s = exp(-1.0);
73         for (label j=0; j<n; j++)
74         {
75             if (i!=j)
76             {
77                 scalar xx = pow(d_[j]/d_[i], n_[j]);
78                 scalar y = xx*exp(-xx);
79                 s += y;
80             }
81         }
83         sMax = max(sMax, s);
84     }
86     for (label i=0; i<n; i++)
87     {
88         ls_[i] /= sMax;
89     }
93 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
95 Foam::RosinRammler::~RosinRammler()
99 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
101 Foam::scalar Foam::RosinRammler::sample() const
103     scalar y = 0;
104     scalar x = 0;
105     label n = d_.size();
106     bool success = false;
108     while (!success)
109     {
110         x = minValue_ + range_*rndGen_.scalar01();
111         y = rndGen_.scalar01();
112         scalar p = 0.0;
114         for (label i=0; i<n; i++)
115         {
116             scalar xx = pow(x/d_[i], n_[i]);
117             p += ls_[i]*xx*exp(-xx);
118         }
120         if (y<p)
121         {
122             success = true;
123         }
124     }
126     return x;
130 Foam::scalar Foam::RosinRammler::minValue() const
132     return minValue_;
136 Foam::scalar Foam::RosinRammler::maxValue() const
138     return maxValue_;
142 // ************************************************************************* //