1e489efc1SBarry Smith /* 2314da920SBarry Smith 3314da920SBarry Smith PETSc mathematics include file. Defines certain basic mathematical 4a5057860SBarry Smith constants and functions for working with single, double, and quad precision 5a5057860SBarry Smith floating point numbers as well as complex single and double. 6314da920SBarry Smith 7d382aafbSBarry Smith This file is included by petscsys.h and should not be used directly. 8e7029fe1SSatish Balay 9e489efc1SBarry Smith */ 10e489efc1SBarry Smith 11488ecbafSBarry Smith #if !defined(__PETSCMATH_H) 12488ecbafSBarry Smith #define __PETSCMATH_H 130a5f7794SBarry Smith #include <math.h> 140a5f7794SBarry Smith 15014dd563SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR; 16014dd563SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT; 17c90a1750SBarry Smith 18314da920SBarry Smith /* 19f4ccad53SBarry Smith 20f4ccad53SBarry Smith Defines operations that are different for complex and real numbers; 21a5057860SBarry Smith note that one cannot mix the use of complex and real in the same 22f4ccad53SBarry Smith PETSc program. All PETSc objects in one program are built around the object 2398725619SBarry Smith PetscScalar which is either always a real or a complex. 24f4ccad53SBarry Smith 25e489efc1SBarry Smith */ 26b36a9721SBarry Smith 2759cb5930SBarry Smith #define PetscExpPassiveScalar(a) PetscExpScalar() 28c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE) 29c1d390e3SJed Brown #define MPIU_REAL MPI_FLOAT 30c1d390e3SJed Brown typedef float PetscReal; 318f1a2a5eSBarry Smith #define PetscSqrtReal(a) sqrt(a) 32c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE) 33c1d390e3SJed Brown #define MPIU_REAL MPI_DOUBLE 34c1d390e3SJed Brown typedef double PetscReal; 358f1a2a5eSBarry Smith #define PetscSqrtReal(a) sqrt(a) 36c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128) 37574fde7bSSatish Balay #if defined(__cplusplus) 38574fde7bSSatish Balay extern "C" { 39574fde7bSSatish Balay #endif 40574fde7bSSatish Balay #include <quadmath.h> 41574fde7bSSatish Balay #if defined(__cplusplus) 42574fde7bSSatish Balay } 43574fde7bSSatish Balay #endif 44c1d390e3SJed Brown #define MPIU_REAL MPIU___FLOAT128 45c1d390e3SJed Brown typedef __float128 PetscReal; 468f1a2a5eSBarry Smith #define PetscSqrtReal(a) sqrtq(a) 47c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */ 4859cb5930SBarry Smith 491093a601SBarry Smith /* 501093a601SBarry Smith Complex number definitions 511093a601SBarry Smith */ 52*50f81f78SJed Brown #if defined(PETSC_CLANGUAGE_CXX) && defined(PETSC_HAVE_CXX_COMPLEX) 53*50f81f78SJed Brown #define PETSC_HAVE_COMPLEX 1 541093a601SBarry Smith /* C++ support of complex number */ 55debe9ee2SPaul Mullowney #if defined(PETSC_HAVE_CUSP) 56debe9ee2SPaul Mullowney #define complexlib cusp 579ae82921SPaul Mullowney #include <cusp/complex.h> 58debe9ee2SPaul Mullowney #else 59debe9ee2SPaul Mullowney #define complexlib std 60debe9ee2SPaul Mullowney #include <complex> 619ae82921SPaul Mullowney #endif 62b7940d39SSatish Balay 63*50f81f78SJed Brown #define PetscRealPartComplex(a) (a).real() 64*50f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag() 65*50f81f78SJed Brown #define PetscAbsComplex(a) complexlib::abs(a) 66*50f81f78SJed Brown #define PetscConjComplex(a) complexlib::conj(a) 67*50f81f78SJed Brown #define PetscSqrtComplex(a) complexlib::sqrt(a) 68*50f81f78SJed Brown #define PetscPowComplex(a,b) complexlib::pow(a,b) 69*50f81f78SJed Brown #define PetscExpComplex(a) complexlib::exp(a) 70*50f81f78SJed Brown #define PetscLogComplex(a) complexlib::log(a) 71*50f81f78SJed Brown #define PetscSinComplex(a) complexlib::sin(a) 72*50f81f78SJed Brown #define PetscCosComplex(a) complexlib::cos(a) 73debe9ee2SPaul Mullowney 74debe9ee2SPaul Mullowney #if defined(PETSC_USE_REAL_SINGLE) 75*50f81f78SJed Brown typedef complexlib::complex<float> PetscComplex; 76debe9ee2SPaul Mullowney #elif defined(PETSC_USE_REAL_DOUBLE) 77*50f81f78SJed Brown typedef complexlib::complex<double> PetscComplex; 788c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128) 79*50f81f78SJed Brown typedef complexlib::complex<__float128> PetscComplex; /* Notstandard and not expected to work, use __complex128 */ 80debe9ee2SPaul Mullowney #endif /* PETSC_USE_REAL_ */ 81debe9ee2SPaul Mullowney 82*50f81f78SJed Brown #elif defined(PETSC_CLANGUAGE_C) && defined(PETSC_HAVE_C99_COMPLEX) 83*50f81f78SJed Brown #define PETSC_HAVE_COMPLEX 1 84b7940d39SSatish Balay 85*50f81f78SJed Brown /* Use C99 _Complex for the type. Do not include complex.h by default to define "complex" because of symbol conflicts in Hypre. */ 86*50f81f78SJed Brown /* Compilation units that can safely use complex should define PETSC_DESIRE_COMPLEX before including any headers */ 87*50f81f78SJed Brown #if defined(PETSC_USE_COMPLEX) || defined(PETSC_DESIRE_COMPLEX) 88519e2a1fSPaul Mullowney #include <complex.h> 89*50f81f78SJed Brown #endif 90519e2a1fSPaul Mullowney 91ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 92*50f81f78SJed Brown typedef float _Complex PetscComplex; 9385b47369SMatthew Knepley 94*50f81f78SJed Brown #define PetscRealPartComplex(a) crealf(a) 95*50f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a) 96*50f81f78SJed Brown #define PetscAbsComplex(a) cabsf(a) 97*50f81f78SJed Brown #define PetscConjComplex(a) conjf(a) 98*50f81f78SJed Brown #define PetscSqrtComplex(a) csqrtf(a) 99*50f81f78SJed Brown #define PetscPowComplex(a,b) cpowf(a,b) 100*50f81f78SJed Brown #define PetscExpComplex(a) cexpf(a) 101*50f81f78SJed Brown #define PetscLogComplex(a) clogf(a) 102*50f81f78SJed Brown #define PetscSinComplex(a) csinf(a) 103*50f81f78SJed Brown #define PetscCosComplex(a) ccosf(a) 1041093a601SBarry Smith 105ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 106*50f81f78SJed Brown typedef double _Complex PetscComplex; 1071093a601SBarry Smith 108*50f81f78SJed Brown #define PetscRealPartComplex(a) creal(a) 109*50f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a) 110*50f81f78SJed Brown #define PetscAbsComplex(a) cabs(a) 111*50f81f78SJed Brown #define PetscConjComplex(a) conj(a) 112*50f81f78SJed Brown #define PetscSqrtComplex(a) csqrt(a) 113*50f81f78SJed Brown #define PetscPowComplex(a,b) cpow(a,b) 114*50f81f78SJed Brown #define PetscExpComplex(a) cexp(a) 115*50f81f78SJed Brown #define PetscLogComplex(a) clog(a) 116*50f81f78SJed Brown #define PetscSinComplex(a) csin(a) 117*50f81f78SJed Brown #define PetscCosComplex(a) ccos(a) 1181093a601SBarry Smith 1198c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128) 120*50f81f78SJed Brown typedef __complex128 PetscComplex; 1218c764dc5SJose Roman PETSC_EXTERN MPI_Datatype MPIU___FLOAT128; 1228c764dc5SJose Roman PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128; 1238c764dc5SJose Roman #define MPIU_SCALAR MPIU___COMPLEX128 1248c764dc5SJose Roman 125*50f81f78SJed Brown #define PetscRealPartComplex(a) crealq(a) 126*50f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a) 127*50f81f78SJed Brown #define PetscAbsComplex(a) cabsq(a) 128*50f81f78SJed Brown #define PetscConjComplex(a) conjq(a) 129*50f81f78SJed Brown #define PetscSqrtComplex(a) csqrtq(a) 130*50f81f78SJed Brown #define PetscPowComplex(a,b) cpowq(a,b) 131*50f81f78SJed Brown #define PetscExpComplex(a) cexpq(a) 132*50f81f78SJed Brown #define PetscLogComplex(a) clogq(a) 133*50f81f78SJed Brown #define PetscSinComplex(a) csinq(a) 134*50f81f78SJed Brown #define PetscCosComplex(a) ccosq(a) 135*50f81f78SJed Brown a 136ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */ 137*50f81f78SJed Brown #elif defined(PETSC_USE_COMPLEX) 138*50f81f78SJed Brown #error "PETSc was configured --with-scalar-type=complex, but a language-appropriate complex library is not available" 1391b65fc54SMatthew G Knepley #endif /* PETSC_CLANGUAGE_CXX */ 140e489efc1SBarry Smith 14170da9c3bSJed Brown #if defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 142500d8756SSatish Balay #define MPIU_C_DOUBLE_COMPLEX MPI_C_DOUBLE_COMPLEX 143500d8756SSatish Balay #define MPIU_C_COMPLEX MPI_C_COMPLEX 14470da9c3bSJed Brown #else 145014dd563SJed Brown PETSC_EXTERN MPI_Datatype MPIU_C_DOUBLE_COMPLEX; 146014dd563SJed Brown PETSC_EXTERN MPI_Datatype MPIU_C_COMPLEX; 1471b65fc54SMatthew G Knepley #endif /* PETSC_HAVE_MPI_C_DOUBLE_COMPLEX */ 1482c876bd9SBarry Smith 149*50f81f78SJed Brown #if defined(PETSC_USE_COMPLEX) 150*50f81f78SJed Brown typedef PetscComplex PetscScalar; 151*50f81f78SJed Brown #define PetscRealPart(a) PetscRealPartComplex(a) 152*50f81f78SJed Brown #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a) 153*50f81f78SJed Brown #define PetscAbsScalar(a) PetscAbsComplex(a) 154*50f81f78SJed Brown #define PetscConj(a) PetscConjComplex(a) 155*50f81f78SJed Brown #define PetscSqrtScalar(a) PetscSqrtComplex(a) 156*50f81f78SJed Brown #define PetscPowScalar(a,b) PetscPowComplex(a,b) 157*50f81f78SJed Brown #define PetscExpScalar(a) PetscExpComplex(a) 158*50f81f78SJed Brown #define PetscLogScalar(a) PetscLogComplex(a) 159*50f81f78SJed Brown #define PetscSinScalar(a) PetscSinComplex(a) 160*50f81f78SJed Brown #define PetscCosScalar(a) PetscCosComplex(a) 161*50f81f78SJed Brown 162ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 163500d8756SSatish Balay #define MPIU_SCALAR MPIU_C_COMPLEX 164ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 165500d8756SSatish Balay #define MPIU_SCALAR MPIU_C_DOUBLE_COMPLEX 166ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */ 16775567043SBarry Smith 1681093a601SBarry Smith /* 1691093a601SBarry Smith real number definitions 1701093a601SBarry Smith */ 1711b65fc54SMatthew G Knepley #else /* PETSC_USE_COMPLEX */ 172ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 17387828ca2SBarry Smith #define MPIU_SCALAR MPI_FLOAT 1741093a601SBarry Smith typedef float PetscScalar; 175ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 1761093a601SBarry Smith #define MPIU_SCALAR MPI_DOUBLE 1771093a601SBarry Smith typedef double PetscScalar; 178ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 179014dd563SJed Brown PETSC_EXTERN MPI_Datatype MPIU___FLOAT128; 180c90a1750SBarry Smith #define MPIU_SCALAR MPIU___FLOAT128 1810d0cc1b5SBarry Smith typedef __float128 PetscScalar; 182ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */ 183329f5518SBarry Smith #define PetscRealPart(a) (a) 184c1d390e3SJed Brown #define PetscImaginaryPart(a) ((PetscReal)0.) 185c1d390e3SJed Brown PETSC_STATIC_INLINE PetscReal PetscAbsScalar(PetscScalar a) {return a < 0.0 ? -a : a;} 186e489efc1SBarry Smith #define PetscConj(a) (a) 187ce63c4c1SBarry Smith #if !defined(PETSC_USE_REAL___FLOAT128) 18818a7d68fSSatish Balay #define PetscSqrtScalar(a) sqrt(a) 189184914b5SBarry Smith #define PetscPowScalar(a,b) pow(a,b) 190184914b5SBarry Smith #define PetscExpScalar(a) exp(a) 19106c1185fSBarry Smith #define PetscLogScalar(a) log(a) 192184914b5SBarry Smith #define PetscSinScalar(a) sin(a) 193184914b5SBarry Smith #define PetscCosScalar(a) cos(a) 194ce63c4c1SBarry Smith #else /* PETSC_USE_REAL___FLOAT128 */ 1950d0cc1b5SBarry Smith #define PetscSqrtScalar(a) sqrtq(a) 1960d0cc1b5SBarry Smith #define PetscPowScalar(a,b) powq(a,b) 1970d0cc1b5SBarry Smith #define PetscExpScalar(a) expq(a) 1980d0cc1b5SBarry Smith #define PetscLogScalar(a) logq(a) 1990d0cc1b5SBarry Smith #define PetscSinScalar(a) sinq(a) 2000d0cc1b5SBarry Smith #define PetscCosScalar(a) cosq(a) 201ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL___FLOAT128 */ 202b0a32e0cSBarry Smith 2031b65fc54SMatthew G Knepley #endif /* PETSC_USE_COMPLEX */ 204e489efc1SBarry Smith 205da9b6338SBarry Smith #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1) 20626aa1773SMatthew Knepley #define PetscAbs(a) (((a) >= 0) ? (a) : -(a)) 2073f1db9ecSBarry Smith 208314da920SBarry Smith /* --------------------------------------------------------------------------*/ 209314da920SBarry Smith 210e489efc1SBarry Smith /* 211f22f69f0SBarry Smith Certain objects may be created using either single or double precision. 212f22f69f0SBarry Smith This is currently not used. 213e489efc1SBarry Smith */ 214557d4da8SBarry Smith typedef enum { PETSC_SCALAR_DOUBLE,PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE } PetscScalarPrecision; 215e489efc1SBarry Smith 216*50f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 217e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */ 218*50f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i; 219*50f81f78SJed Brown #endif 220e489efc1SBarry Smith 221b6a5bde7SBarry Smith /*MC 222b6a5bde7SBarry Smith PetscMin - Returns minimum of two numbers 223b6a5bde7SBarry Smith 224eca87e8dSBarry Smith Synopsis: 225eca87e8dSBarry Smith type PetscMin(type v1,type v2) 226eca87e8dSBarry Smith 227eca87e8dSBarry Smith Not Collective 228eca87e8dSBarry Smith 229b6a5bde7SBarry Smith Input Parameter: 230b6a5bde7SBarry Smith + v1 - first value to find minimum of 231b6a5bde7SBarry Smith - v2 - second value to find minimum of 232b6a5bde7SBarry Smith 233b6a5bde7SBarry Smith 234b6a5bde7SBarry Smith Notes: type can be integer or floating point value 235b6a5bde7SBarry Smith 236b6a5bde7SBarry Smith Level: beginner 237b6a5bde7SBarry Smith 238b6a5bde7SBarry Smith 239d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 240b6a5bde7SBarry Smith 241b6a5bde7SBarry Smith M*/ 242e489efc1SBarry Smith #define PetscMin(a,b) (((a)<(b)) ? (a) : (b)) 243b6a5bde7SBarry Smith 244b6a5bde7SBarry Smith /*MC 245b6a5bde7SBarry Smith PetscMax - Returns maxium of two numbers 246b6a5bde7SBarry Smith 247eca87e8dSBarry Smith Synopsis: 248eca87e8dSBarry Smith type max PetscMax(type v1,type v2) 249eca87e8dSBarry Smith 250eca87e8dSBarry Smith Not Collective 251eca87e8dSBarry Smith 252b6a5bde7SBarry Smith Input Parameter: 253b6a5bde7SBarry Smith + v1 - first value to find maximum of 254b6a5bde7SBarry Smith - v2 - second value to find maximum of 255b6a5bde7SBarry Smith 256b6a5bde7SBarry Smith Notes: type can be integer or floating point value 257b6a5bde7SBarry Smith 258b6a5bde7SBarry Smith Level: beginner 259b6a5bde7SBarry Smith 260d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 261b6a5bde7SBarry Smith 262b6a5bde7SBarry Smith M*/ 263e489efc1SBarry Smith #define PetscMax(a,b) (((a)<(b)) ? (b) : (a)) 264b6a5bde7SBarry Smith 265b6a5bde7SBarry Smith /*MC 266d9a4bb16SJed Brown PetscClipInterval - Returns a number clipped to be within an interval 267d9a4bb16SJed Brown 268d9a4bb16SJed Brown Synopsis: 269d9a4bb16SJed Brown type clip PetscClipInterval(type x,type a,type b) 270d9a4bb16SJed Brown 271d9a4bb16SJed Brown Not Collective 272d9a4bb16SJed Brown 273d9a4bb16SJed Brown Input Parameter: 274d9a4bb16SJed Brown + x - value to use if within interval (a,b) 275d9a4bb16SJed Brown . a - lower end of interval 276d9a4bb16SJed Brown - b - upper end of interval 277d9a4bb16SJed Brown 278d9a4bb16SJed Brown Notes: type can be integer or floating point value 279d9a4bb16SJed Brown 280d9a4bb16SJed Brown Level: beginner 281d9a4bb16SJed Brown 282d9a4bb16SJed Brown .seealso: PetscMin(), PetscMax(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 283d9a4bb16SJed Brown 284d9a4bb16SJed Brown M*/ 285d9a4bb16SJed Brown #define PetscClipInterval(x,a,b) (PetscMax((a),PetscMin((x),(b)))) 286d9a4bb16SJed Brown 287d9a4bb16SJed Brown /*MC 288b6a5bde7SBarry Smith PetscAbsInt - Returns the absolute value of an integer 289b6a5bde7SBarry Smith 290b6a5bde7SBarry Smith Synopsis: 291b6a5bde7SBarry Smith int abs PetscAbsInt(int v1) 292b6a5bde7SBarry Smith 293eca87e8dSBarry Smith Not Collective 294eca87e8dSBarry Smith 295eca87e8dSBarry Smith Input Parameter: 296eca87e8dSBarry Smith . v1 - the integer 297b6a5bde7SBarry Smith 298b6a5bde7SBarry Smith Level: beginner 299b6a5bde7SBarry Smith 300b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr() 301b6a5bde7SBarry Smith 302b6a5bde7SBarry Smith M*/ 303e489efc1SBarry Smith #define PetscAbsInt(a) (((a)<0) ? -(a) : (a)) 304b6a5bde7SBarry Smith 305b6a5bde7SBarry Smith /*MC 306b6a5bde7SBarry Smith PetscAbsReal - Returns the absolute value of an real number 307b6a5bde7SBarry Smith 308eca87e8dSBarry Smith Synopsis: 309eca87e8dSBarry Smith Real abs PetscAbsReal(PetscReal v1) 310eca87e8dSBarry Smith 311eca87e8dSBarry Smith Not Collective 312eca87e8dSBarry Smith 313b6a5bde7SBarry Smith Input Parameter: 314b6a5bde7SBarry Smith . v1 - the double 315b6a5bde7SBarry Smith 316b6a5bde7SBarry Smith 317b6a5bde7SBarry Smith Level: beginner 318b6a5bde7SBarry Smith 319b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr() 320b6a5bde7SBarry Smith 321b6a5bde7SBarry Smith M*/ 322f6275e2eSBarry Smith #define PetscAbsReal(a) (((a)<0) ? -(a) : (a)) 323b6a5bde7SBarry Smith 324b6a5bde7SBarry Smith /*MC 325b6a5bde7SBarry Smith PetscSqr - Returns the square of a number 326b6a5bde7SBarry Smith 327b6a5bde7SBarry Smith Synopsis: 328b6a5bde7SBarry Smith type sqr PetscSqr(type v1) 329b6a5bde7SBarry Smith 330eca87e8dSBarry Smith Not Collective 331eca87e8dSBarry Smith 332eca87e8dSBarry Smith Input Parameter: 333eca87e8dSBarry Smith . v1 - the value 334eca87e8dSBarry Smith 335b6a5bde7SBarry Smith Notes: type can be integer or floating point value 336b6a5bde7SBarry Smith 337b6a5bde7SBarry Smith Level: beginner 338b6a5bde7SBarry Smith 339b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal() 340b6a5bde7SBarry Smith 341b6a5bde7SBarry Smith M*/ 3424ebda54eSMatthew Knepley #define PetscSqr(a) ((a)*(a)) 343e489efc1SBarry Smith 344314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 345314da920SBarry Smith /* 346d34fcf5fSBarry Smith Basic constants 347314da920SBarry Smith */ 348ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 349d34fcf5fSBarry Smith #define PETSC_PI M_PIq 350d34fcf5fSBarry Smith #elif defined(M_PI) 351d34fcf5fSBarry Smith #define PETSC_PI M_PI 352d34fcf5fSBarry Smith #else 353faa6e9b0SMatthew G Knepley #define PETSC_PI 3.14159265358979323846264338327950288419716939937510582 354d34fcf5fSBarry Smith #endif 355d34fcf5fSBarry Smith 356ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 35771fd2e92SBarry Smith #define PETSC_MAX_INT 2147483647 358ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 359ab824b78SBarry Smith #else 360ab824b78SBarry Smith #define PETSC_MAX_INT 9223372036854775807L 361ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 362ab824b78SBarry Smith #endif 363e489efc1SBarry Smith 364ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 365ab824b78SBarry Smith # define PETSC_MAX_REAL 3.40282346638528860e+38F 366ea345e14SBarry Smith # define PETSC_MIN_REAL -PETSC_MAX_REAL 36782a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 1.19209290e-07F 36882a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F 369cf6e855fSSatish Balay # define PETSC_SMALL 1.e-5 370ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 371ab824b78SBarry Smith # define PETSC_MAX_REAL 1.7976931348623157e+308 372ea345e14SBarry Smith # define PETSC_MIN_REAL -PETSC_MAX_REAL 37382a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 2.2204460492503131e-16 37482a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08 375cf6e855fSSatish Balay # define PETSC_SMALL 1.e-10 376ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 377ea345e14SBarry Smith # define PETSC_MAX_REAL FLT128_MAX 378ce63c4c1SBarry Smith # define PETSC_MIN_REAL -FLT128_MAX 379d34fcf5fSBarry Smith # define PETSC_MACHINE_EPSILON FLT128_EPSILON 380d34fcf5fSBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 1.38777878078e-17 381d34fcf5fSBarry Smith # define PETSC_SMALL 1.e-20 38282adfdadSBarry Smith #endif 38382adfdadSBarry Smith 3849cf09972SJed Brown #if defined PETSC_HAVE_ADIC 3859cf09972SJed Brown /* Use MPI_Allreduce when ADIC is not available. */ 386014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGlobalMax(MPI_Comm, const PetscReal*,PetscReal*); 387014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGlobalMin(MPI_Comm, const PetscReal*,PetscReal*); 388014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGlobalSum(MPI_Comm, const PetscScalar*,PetscScalar*); 3899cf09972SJed Brown #endif 3903e523bebSBarry Smith 391014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIsInfOrNanScalar(PetscScalar); 392014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIsInfOrNanReal(PetscReal); 3939a25a3ccSBarry Smith 394314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 39587828ca2SBarry Smith #define PassiveReal PetscReal 396ea709b57SSatish Balay #define PassiveScalar PetscScalar 397d3ecb3a7SBarry Smith 39898725619SBarry Smith /* 39998725619SBarry Smith These macros are currently hardwired to match the regular data types, so there is no support for a different 40098725619SBarry Smith MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again. 40198725619SBarry Smith */ 40298725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR 40398725619SBarry Smith typedef PetscScalar MatScalar; 40498725619SBarry Smith typedef PetscReal MatReal; 40598725619SBarry Smith 406e9fa29b7SSatish Balay 407e489efc1SBarry Smith #endif 408