Container to encapsulate various operations for cubic equation of the forms with real coefficients: More...
Public Types | |
enum | components { A, B, C, D } |
Component labeling enumeration. More... | |
Public Types inherited from VectorSpace< cubicEqn, scalar, 4 > | |
typedef VectorSpace< cubicEqn, scalar, Ncmpts > | vsType |
VectorSpace type. More... | |
typedef scalar | cmptType |
Component type. More... | |
typedef scalar | magType |
Magnitude type. More... | |
typedef scalar * | iterator |
Random access iterator for traversing VectorSpace. More... | |
typedef const scalar * | const_iterator |
Random access iterator for traversing VectorSpace. More... | |
Public Member Functions | |
cubicEqn ()=default | |
Default construct. More... | |
cubicEqn (const Foam::zero) | |
Construct initialized to zero. More... | |
cubicEqn (const scalar a, const scalar b, const scalar c, const scalar d) | |
Construct from components. More... | |
scalar | a () const noexcept |
scalar | b () const noexcept |
scalar | c () const noexcept |
scalar | d () const noexcept |
scalar & | a () noexcept |
scalar & | b () noexcept |
scalar & | c () noexcept |
scalar & | d () noexcept |
scalar | value (const scalar x) const |
Evaluate the cubic equation at x. More... | |
scalar | derivative (const scalar x) const |
Evaluate the derivative of the cubic equation at x. More... | |
scalar | error (const scalar x) const |
Estimate the error of evaluation of the cubic equation at x. More... | |
Roots< 3 > | roots () const |
Return the roots of the cubic equation with no particular order. More... | |
Public Member Functions inherited from VectorSpace< cubicEqn, scalar, 4 > | |
VectorSpace ()=default | |
Default construct. More... | |
VectorSpace (const Foam::zero) | |
Construct initialized to zero. More... | |
VectorSpace (const VectorSpace< cubicEqn, scalar, Ncmpts > &vs) | |
Copy construct. More... | |
VectorSpace (const VectorSpace< Form2, Cmpt2, Ncmpts > &) | |
Copy construct of a VectorSpace with the same size. More... | |
VectorSpace (Istream &is) | |
Construct from Istream. More... | |
const scalar & | component (const direction) const |
scalar & | component (const direction) |
void | component (scalar &, const direction) const |
void | replace (const direction, const scalar &) |
const scalar * | cdata () const noexcept |
Return const pointer to the first data element. More... | |
scalar * | data () noexcept |
Return pointer to the first data element. More... | |
const ConstBlock< SubVector, BStart > | block () const |
const Foam::VectorSpace< cubicEqn, scalar, Ncmpts >::template ConstBlock< SubVector, BStart > | block () const |
const scalar & | operator[] (const direction) const |
scalar & | operator[] (const direction) |
void | operator= (const VectorSpace< cubicEqn, scalar, Ncmpts > &) |
void | operator= (const Foam::zero) |
void | operator+= (const VectorSpace< cubicEqn, scalar, Ncmpts > &) |
void | operator-= (const VectorSpace< cubicEqn, scalar, Ncmpts > &) |
void | operator*= (const scalar) |
void | operator/= (const scalar) |
iterator | begin () noexcept |
Return an iterator to begin of VectorSpace. More... | |
const_iterator | begin () const noexcept |
Return const_iterator to begin of VectorSpace. More... | |
iterator | end () noexcept |
Return an iterator to end of VectorSpace. More... | |
const_iterator | end () const noexcept |
Return const_iterator to end of VectorSpace. More... | |
const_iterator | cbegin () const noexcept |
Return const_iterator to begin of VectorSpace. More... | |
const_iterator | cend () const noexcept |
Return const_iterator to end of VectorSpace. More... | |
Additional Inherited Members | |
Static Public Member Functions inherited from VectorSpace< cubicEqn, scalar, 4 > | |
static constexpr direction | size () noexcept |
The number of elements in the VectorSpace = Ncmpts. More... | |
static cubicEqn | uniform (const scalar &s) |
Return a VectorSpace with all elements = s. More... | |
Public Attributes inherited from VectorSpace< cubicEqn, scalar, 4 > | |
scalar | v_ [Ncmpts] |
The components of this vector space. More... | |
Static Public Attributes inherited from VectorSpace< cubicEqn, scalar, 4 > | |
static constexpr direction | dim |
Dimensionality of space. More... | |
static constexpr direction | nComponents |
Number of components in this vector space. More... | |
static constexpr direction | mRows |
static constexpr direction | nCols |
static const char *const | typeName |
static const char *const | componentNames [] |
static const cubicEqn | zero |
static const cubicEqn | one |
static const cubicEqn | max |
static const cubicEqn | min |
static const cubicEqn | rootMax |
static const cubicEqn | rootMin |
Container to encapsulate various operations for cubic equation of the forms with real coefficients:
The following two substitutions into the above forms are used:
This reduces the problem to a quadratic in w^3
:
where Q
and P
are given in the code.
The properties of the cubic can be related to the properties of this quadratic in w^3
.
If the quadratic eqn has two identical real roots at zero, three identical real roots exist in the cubic eqn.
If the quadratic eqn has two identical real roots at non-zero, two identical and one distinct real roots exist in the cubic eqn.
If the quadratic eqn has two complex roots (a complex conjugate pair), three distinct real roots exist in the cubic eqn.
If the quadratic eqn has two distinct real roots, one real root and two complex roots (a complex conjugate pair) exist in the cubic eqn.
The quadratic eqn is solved for the most numerically accurate value of w^3
. See the quadraticEqn.H for details on how to pick a value. This single value of w^3
can yield up to three cube roots for w
, which relate to the three solutions for x
.
Only a single root, or pair of conjugate roots, is directly evaluated; the one, or ones with the lowest relative numerical error. Root identities are then used to recover the remaining roots, possibly utilising a quadratic and/or linear solution. This seems to be a good way of maintaining the accuracy of roots at very different magnitudes.
Reference:
Kahan's algo. to compute 'p' using fused multiply-adds (tag:JML): Jeannerod, C. P., Louvet, N., & Muller, J. M. (2013). Further analysis of Kahan's algorithm for the accurate computation of 2× 2 determinants. Mathematics of Computation, 82(284), 2245-2264. DOI:10.1090/S0025-5718-2013-02679-8
Definition at line 108 of file cubicEqn.H.
enum components |
|
default |
Default construct.
|
inline |
Construct initialized to zero.
Definition at line 23 of file cubicEqnI.H.
|
inline |
Construct from components.
Definition at line 30 of file cubicEqnI.H.
References A, B, Foam::constant::physicoChemical::b, Foam::constant::universal::c, C, and D.
|
inlinenoexcept |
Definition at line 148 of file cubicEqn.H.
References cubicEqn::A, and VectorSpace< cubicEqn, scalar, 4 >::v_.
Referenced by cubicEqn::roots().
|
inlinenoexcept |
Definition at line 149 of file cubicEqn.H.
References cubicEqn::B, and VectorSpace< cubicEqn, scalar, 4 >::v_.
Referenced by cubicEqn::roots().
|
inlinenoexcept |
Definition at line 150 of file cubicEqn.H.
References cubicEqn::C, and VectorSpace< cubicEqn, scalar, 4 >::v_.
Referenced by cubicEqn::roots().
|
inlinenoexcept |
Definition at line 151 of file cubicEqn.H.
References cubicEqn::D, and VectorSpace< cubicEqn, scalar, 4 >::v_.
Referenced by cubicEqn::roots().
|
inlinenoexcept |
Definition at line 153 of file cubicEqn.H.
References cubicEqn::A, and VectorSpace< cubicEqn, scalar, 4 >::v_.
|
inlinenoexcept |
Definition at line 154 of file cubicEqn.H.
References cubicEqn::B, and VectorSpace< cubicEqn, scalar, 4 >::v_.
|
inlinenoexcept |
Definition at line 155 of file cubicEqn.H.
References cubicEqn::C, and VectorSpace< cubicEqn, scalar, 4 >::v_.
|
inlinenoexcept |
Definition at line 156 of file cubicEqn.H.
References cubicEqn::D, and VectorSpace< cubicEqn, scalar, 4 >::v_.
|
inline |
Evaluate the cubic equation at x.
Definition at line 46 of file cubicEqnI.H.
References Foam::constant::physicoChemical::b, Foam::constant::universal::c, and x.
Referenced by particle< Type >::trackToMovingTri().
|
inline |
Evaluate the derivative of the cubic equation at x.
Definition at line 52 of file cubicEqnI.H.
References Foam::constant::physicoChemical::b, Foam::constant::universal::c, and x.
|
inline |
Estimate the error of evaluation of the cubic equation at x.
Definition at line 58 of file cubicEqnI.H.
References Foam::constant::physicoChemical::b, Foam::constant::universal::c, Foam::mag(), Foam::magSqr(), and x.
Foam::Roots< 3 > roots | ( | ) | const |
Return the roots of the cubic equation with no particular order.
if discriminant > 0: return three distinct real roots if discriminant < 0: return one real root and one complex root (one member of the complex conjugate pair) if discriminant = 0: return two identical roots, and one distinct real root if identical zero Hessian: return three identical real roots where the discriminant = - 4p^3 - 27q^2.
Definition at line 28 of file cubicEqn.C.
References cubicEqn::a(), Foam::atan2(), cubicEqn::b(), cubicEqn::c(), Foam::cbrt(), Foam::roots::complex, Foam::cos(), cubicEqn::d(), Foam::endl(), Foam::hypot(), Foam::Info, Foam::mag(), Foam::roots::nan, Foam::nl, p, Foam::roots::real, linearEqn::roots(), quadraticEqn::roots(), Foam::sign(), Foam::sin(), Foam::sqrt(), Foam::tab, Roots< N >::type(), and x.
Copyright © 2011-2018 OpenFOAM | OPENFOAM® is a registered trademark of OpenCFD Ltd.