initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / thermophysicalModels / pdfs / normal / normal.C
blobf8633c270b914ff8fa36fc17b1a3c22cd7de1225
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM 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 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "normal.H"
28 #include "addToRunTimeSelectionTable.H"
30 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 namespace Foam
34     defineTypeNameAndDebug(normal, 0);
35     addToRunTimeSelectionTable(pdf, normal, dictionary);
38 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
40 Foam::normal::normal(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     expectation_(pdfDict_.lookup("expectation")),
47     variance_(pdfDict_.lookup("variance")),
48     strength_(pdfDict_.lookup("strength")),
49     range_(maxValue_-minValue_)
51     scalar sMax = 0;
52     label n = strength_.size();
53     for (label i=0; i<n; i++)
54     {
55         scalar x = expectation_[i];
56         scalar s = strength_[i];
57         for (label j=0; j<n; j++)
58         {
59             if (i!=j)
60             {
61                 scalar x2 = (x-expectation_[j])/variance_[j];
62                 scalar y = exp(-0.5*x2*x2);
63                 s += strength_[j]*y;
64             }
65         }
67         sMax = max(sMax, s);
68     }
70     for (label i=0; i<n; i++)
71     {
72         strength_[i] /= sMax;
73     }
77 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
79 Foam::normal::~normal()
83 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
85 Foam::scalar Foam::normal::sample() const
87     scalar y = 0;
88     scalar x = 0;
89     label n = expectation_.size();
90     bool success = false;
92     while (!success)
93     {
94         x = minValue_ + range_*rndGen_.scalar01();
95         y = rndGen_.scalar01();
96         scalar p = 0.0;
98         for (label i=0; i<n; i++)
99         {
100             scalar nu = expectation_[i];
101             scalar sigma = variance_[i];
102             scalar s = strength_[i];
103             scalar v = (x-nu)/sigma;
104             p += s*exp(-0.5*v*v);
105         }
107         if (y<p)
108         {
109             success = true;
110         }
111     }
113     return x;
117 Foam::scalar Foam::normal::minValue() const
119     return minValue_;
123 Foam::scalar Foam::normal::maxValue() const
125     return maxValue_;
129 // ************************************************************************* //