Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "general.H"
00027 #include <OpenFOAM/addToRunTimeSelectionTable.H>
00028
00029
00030
00031 namespace Foam
00032 {
00033 namespace pdfs
00034 {
00035 defineTypeNameAndDebug(general, 0);
00036 addToRunTimeSelectionTable(pdf, general, dictionary);
00037 }
00038 }
00039
00040
00041
00042 Foam::pdfs::general::general(const dictionary& dict, Random& rndGen)
00043 :
00044 pdf(typeName, dict, rndGen),
00045 xy_(pdfDict_.lookup("distribution")),
00046 nEntries_(xy_.size()),
00047 minValue_(xy_[0][0]),
00048 maxValue_(xy_[nEntries_-1][0]),
00049 integral_(nEntries_)
00050 {
00051 check();
00052
00053
00054
00055 integral_[0] = 0.0;
00056 for (label i=1; i<nEntries_; i++)
00057 {
00058
00059 scalar k = (xy_[i][1] - xy_[i-1][1])/(xy_[i][0] - xy_[i-1][0]);
00060 scalar d = xy_[i-1][1] - k*xy_[i-1][0];
00061 scalar y1 = xy_[i][0]*(0.5*k*xy_[i][0] + d);
00062 scalar y0 = xy_[i-1][0]*(0.5*k*xy_[i-1][0] + d);
00063 scalar area = y1 - y0;
00064
00065 integral_[i] = area + integral_[i-1];
00066 }
00067
00068 for (label i=0; i<nEntries_; i++)
00069 {
00070 xy_[i][1] /= integral_[nEntries_-1];
00071 integral_[i] /= integral_[nEntries_-1];
00072 }
00073
00074 }
00075
00076
00077
00078
00079 Foam::pdfs::general::~general()
00080 {}
00081
00082
00083
00084
00085 Foam::scalar Foam::pdfs::general::sample() const
00086 {
00087 scalar y = rndGen_.scalar01();
00088
00089
00090 label n=1;
00091 while (integral_[n] <= y)
00092 {
00093 n++;
00094 }
00095
00096 scalar k = (xy_[n][1] - xy_[n-1][1])/(xy_[n][0] - xy_[n-1][0]);
00097 scalar d = xy_[n-1][1] - k*xy_[n-1][0];
00098
00099 scalar alpha = y + xy_[n-1][0]*(0.5*k*xy_[n-1][0] + d) - integral_[n-1];
00100 scalar x = 0.0;
00101
00102
00103 if (mag(k) > SMALL)
00104 {
00105 scalar p = 2.0*d/k;
00106 scalar q = -2.0*alpha/k;
00107 scalar sqrtEr = sqrt(0.25*p*p - q);
00108
00109 scalar x1 = -0.5*p + sqrtEr;
00110 scalar x2 = -0.5*p - sqrtEr;
00111 if ((x1 >= xy_[n-1][0]) && (x1 <= xy_[n][0]))
00112 {
00113 x = x1;
00114 }
00115 else
00116 {
00117 x = x2;
00118 }
00119 }
00120 else
00121 {
00122 x = alpha/d;
00123 }
00124
00125 return x;
00126 }
00127
00128
00129 Foam::scalar Foam::pdfs::general::minValue() const
00130 {
00131 return minValue_;
00132 }
00133
00134
00135 Foam::scalar Foam::pdfs::general::maxValue() const
00136 {
00137 return maxValue_;
00138 }
00139
00140
00141