188 lines
4.5 KiB
C
188 lines
4.5 KiB
C
|
/*---------------------------------------------------------------------------*\
|
||
|
========= |
|
||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||
|
\\ / O peration |
|
||
|
\\ / A nd | Copyright held by original author
|
||
|
\\/ M anipulation |
|
||
|
-------------------------------------------------------------------------------
|
||
|
License
|
||
|
This file is part of OpenFOAM.
|
||
|
|
||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||
|
under the terms of the GNU General Public License as published by the
|
||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||
|
option) any later version.
|
||
|
|
||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||
|
for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
|
||
|
\*---------------------------------------------------------------------------*/
|
||
|
|
||
|
#include "Polynomial.H"
|
||
|
|
||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||
|
|
||
|
template<int PolySize>
|
||
|
Foam::Polynomial<PolySize>::Polynomial()
|
||
|
:
|
||
|
VectorSpace<Polynomial<PolySize>, scalar, PolySize>(),
|
||
|
logActive_(false),
|
||
|
logCoeff_(0.0)
|
||
|
{}
|
||
|
|
||
|
|
||
|
template<int PolySize>
|
||
|
Foam::Polynomial<PolySize>::Polynomial(const word& name, Istream& is)
|
||
|
:
|
||
|
VectorSpace<Polynomial<PolySize>, scalar, PolySize>(),
|
||
|
logActive_(false),
|
||
|
logCoeff_(0.0)
|
||
|
{
|
||
|
word isName(is);
|
||
|
|
||
|
if (isName != name)
|
||
|
{
|
||
|
FatalErrorIn
|
||
|
(
|
||
|
"Polynomial<PolySize>::Polynomial(const word&, Istream&)"
|
||
|
) << "Expected polynomial name " << name << " but read " << isName
|
||
|
<< nl << exit(FatalError);
|
||
|
}
|
||
|
|
||
|
VectorSpace<Polynomial<PolySize>, scalar, PolySize>::
|
||
|
operator=(VectorSpace<Polynomial<PolySize>, scalar, PolySize>(is));
|
||
|
|
||
|
if (this->size() == 0)
|
||
|
{
|
||
|
FatalErrorIn
|
||
|
(
|
||
|
"Polynomial<PolySize>::Polynomial(const word&, Istream&)"
|
||
|
) << "Polynomial coefficients for entry " << isName
|
||
|
<< " are invalid (empty)" << nl << exit(FatalError);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
template<int PolySize>
|
||
|
Foam::Polynomial<PolySize>::Polynomial
|
||
|
(
|
||
|
const Polynomial<PolySize>& poly
|
||
|
)
|
||
|
:
|
||
|
VectorSpace<Polynomial<PolySize>, scalar, PolySize>(poly),
|
||
|
logActive_(poly.logActive_),
|
||
|
logCoeff_(poly.logCoeff_)
|
||
|
{}
|
||
|
|
||
|
|
||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||
|
|
||
|
template<int PolySize>
|
||
|
bool& Foam::Polynomial<PolySize>::logActive()
|
||
|
{
|
||
|
return logActive_;
|
||
|
}
|
||
|
|
||
|
|
||
|
template<int PolySize>
|
||
|
Foam::scalar& Foam::Polynomial<PolySize>::logCoeff()
|
||
|
{
|
||
|
return logCoeff_;
|
||
|
}
|
||
|
|
||
|
|
||
|
template<int PolySize>
|
||
|
Foam::scalar Foam::Polynomial<PolySize>::evaluate(const scalar x) const
|
||
|
{
|
||
|
scalar y = this->v_[0];
|
||
|
|
||
|
for (label i=1; i<PolySize; i++)
|
||
|
{
|
||
|
y += this->v_[i]*pow(x, i);
|
||
|
}
|
||
|
|
||
|
if (logActive_)
|
||
|
{
|
||
|
y += logCoeff_*log(x);
|
||
|
}
|
||
|
|
||
|
return y;
|
||
|
}
|
||
|
|
||
|
|
||
|
template<int PolySize>
|
||
|
Foam::scalar Foam::Polynomial<PolySize>::integrateLimits
|
||
|
(
|
||
|
const scalar x1,
|
||
|
const scalar x2
|
||
|
) const
|
||
|
{
|
||
|
if (logActive_)
|
||
|
{
|
||
|
FatalErrorIn
|
||
|
(
|
||
|
"scalar Polynomial<PolySize>::integrateLimits"
|
||
|
"("
|
||
|
"const scalar, "
|
||
|
"const scalar"
|
||
|
") const"
|
||
|
) << "Cannot integrate polynomial with logarithmic coefficients"
|
||
|
<< nl << abort(FatalError);
|
||
|
}
|
||
|
|
||
|
intPolyType poly = this->integrate();
|
||
|
|
||
|
return poly.evaluate(x2) - poly.evaluate(x1);
|
||
|
}
|
||
|
|
||
|
|
||
|
template<int PolySize>
|
||
|
typename Foam::Polynomial<PolySize>::intPolyType
|
||
|
Foam::Polynomial<PolySize>::integrate(const scalar intConstant)
|
||
|
{
|
||
|
intPolyType newCoeffs;
|
||
|
|
||
|
newCoeffs[0] = intConstant;
|
||
|
forAll(*this, i)
|
||
|
{
|
||
|
newCoeffs[i + 1] = this->v_[i]/(i + 1);
|
||
|
}
|
||
|
|
||
|
return newCoeffs;
|
||
|
}
|
||
|
|
||
|
|
||
|
template<int PolySize>
|
||
|
typename Foam::Polynomial<PolySize>::polyType
|
||
|
Foam::Polynomial<PolySize>::integrateMinus1(const scalar intConstant)
|
||
|
{
|
||
|
polyType newCoeffs;
|
||
|
|
||
|
if (this->v_[0] > VSMALL)
|
||
|
{
|
||
|
newCoeffs.logActive() = true;
|
||
|
newCoeffs.logCoeff() = this->v_[0];
|
||
|
}
|
||
|
|
||
|
newCoeffs[0] = intConstant;
|
||
|
|
||
|
if (PolySize > 0)
|
||
|
{
|
||
|
for (label i=1; i<PolySize; i++)
|
||
|
{
|
||
|
newCoeffs[i] = this->v_[i]/i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return newCoeffs;
|
||
|
}
|
||
|
|
||
|
|
||
|
// ************************************************************************* //
|