52 #define M_PI 3.1415926535897932384626433832795029L
55 #define M_LN2 0.6931471805599453094172321214581766L
59inline int min(
int i,
int j)
60{
return ( i <= j ? i : j ); }
63inline long min(
long i,
long j)
64{
return ( i <= j ? i : j ); }
67inline unsigned long min(
unsigned long i,
unsigned long j)
69 return (i <= j ? i : j);
74inline std::size_t
min(std::size_t i, std::size_t j)
75{
return ( i <= j ? i : j ); }
80inline double min(
double i,
double j)
81{
return ( i <= j ? i : j ); }
84inline int max(
int i,
int j)
85{
return ( i >= j ? i : j ); }
88inline double clamp(
int a,
int lower,
int upper)
89{
return ( a <= lower ? lower : ( a >= upper ? upper : a ) ); }
92inline long max(
long i,
long j)
93{
return ( i >= j ? i : j ); }
96inline double max(
double i,
double j)
97{
return ( i >= j ? i : j ); }
100inline double clamp(
double a,
double lower,
double upper)
101{
return ( a <= lower ? lower : ( a >= upper ? upper : a ) ); }
104inline double sgn(
double i)
105{
return ( i < 0. ? -1. : 1. ); }
113inline bool isnan(
double x) {
return _isnan(x) != 0; }
116inline bool isnan(
double x) {
return std :: isnan(x); }
122inline double cbrt(
double x) {
return sgn(x) * pow(fabs(x), 1.0 / 3.0); }
125inline double sqr(
double x) {
return x * x; }
128inline double macbra(
double x) {
return ( x >= 0 ? x : 0 ); }
130inline double negbra(
double x) {
return ( x <= 0 ? x : 0 ); }
144void cubic(
double a,
double b,
double c,
double d,
double *r1,
double *r2,
double *r3,
int *num);
162void cubic3r(
double a,
double b,
double c,
double d,
double *r1,
double *r2,
double *r3,
int *num);
167int iperm(
int val,
int rank);
170#define MATHFEM_C 0.38196601
171#define MATHFEM_R ( 1 - MATHFEM_C )
172#define MATHFEM_BRENT_MAXITER 100
176 double ( T :: *
pmf )(double);
189 double operator() (
double x)
const {
return ( *
func )( x ); }
208template<
class T >
double gss(
double ax,
double bx,
double cx,
const T &f,
209 double tol,
double &xmin)
211 [[maybe_unused]]
int ii = 0;
212 double f1, f2, x0, x1, x2, x3;
218 if ( fabs(cx - bx) > fabs(bx - ax) ) {
230 while ( fabs(x3 - x0) > tol * ( fabs(x1) + fabs(x2) ) ) {
262template<
class T >
double brent(
double ax,
double bx,
double cx,
const T &f,
263 double tol,
double &xmin)
266 double x_left = ax, x_right = cx;
267 double x, x_midpoint, v, w, u, tol1, tol2, p, q, r, e_tmp, d = 0.0, fx, fv, fw, fu;
274 x_midpoint = 0.5 * ( x_left + x_right );
277 tol1 = tol * fabs(x) + 1.0e-10;
279 if ( fabs(x - x_midpoint) <= ( tol2 - 0.5 * ( x_right - x_left ) ) ) {
285 if ( fabs(e) > tol1 ) {
287 r = ( x - w ) * ( fx - fv );
288 q = ( x - v ) * ( fx - fw );
289 p = ( x - v ) * q - ( x - w ) * r;
301 if ( fabs(p) < fabs(0.5 * q * e_tmp) && p < q * ( x - x_left ) && p < q * ( x_right - x ) ) {
304 if ( ( u - x_left ) < tol2 || ( x_right - u ) < tol2 ) {
305 d = ( x < x_midpoint ) ? tol1 : -tol1;
308 e = ( x < x_midpoint ) ? x_right - x : -( x - x_left );
312 e = ( x < x_midpoint ) ? x_right - x : -( x - x_left );
316 if ( fabs(d) >= tol1 ) {
319 u = x + ( ( d > 0 ) ? tol1 : -tol1 );
344 if ( fu <= fw || w == x ) {
349 }
else if ( fu <= fv || v == x || v == w ) {
368void ls2fit(
const FloatArray &x,
const FloatArray &y, FloatArray &a);
c_fun(double(*p)(double))
double(T ::* pmf)(double)
mem_fun(T *o, double(T ::*p)(double))
double operator()(double x) const
#define OOFEM_LOG_WARNING(...)
#define MATHFEM_BRENT_MAXITER
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double cbrt(double x)
Returns the cubic root of x.
double macbra(double x)
Returns the positive part of given float.
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
void cubic3r(double a, double b, double c, double d, double *r1, double *r2, double *r3, int *num)
double signum(double i)
Returns the signum of given value (i = 0 returns 0, i < 0 returns -1, i > 0 returns 1).
double gss(double ax, double bx, double cx, const T &f, double tol, double &xmin)
double negbra(double x)
Returns the negative part of given float.
void cubic(double a, double b, double c, double d, double *r1, double *r2, double *r3, int *num)
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1).
int iperm(int val, int rank)
void ls2fit(const FloatArray &x, const FloatArray &y, FloatArray &a)
double brent(double ax, double bx, double cx, const T &f, double tol, double &xmin)
double clamp(int a, int lower, int upper)
Returns the clamped value of a between upper and lower.