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> 14df4397b0SStefano Zampini #include <petscsystypes.h> 15df4397b0SStefano Zampini 16df4397b0SStefano Zampini /*MC 17df4397b0SStefano Zampini MPIU_REAL - MPI datatype corresponding to PetscReal 18df4397b0SStefano Zampini 19df4397b0SStefano Zampini Notes: 20df4397b0SStefano Zampini In MPI calls that require an MPI datatype that matches a PetscReal or array of PetscReal values, pass this value. 21df4397b0SStefano Zampini 22df4397b0SStefano Zampini Level: beginner 23df4397b0SStefano Zampini 24df4397b0SStefano Zampini .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT 25df4397b0SStefano Zampini M*/ 260a5f7794SBarry Smith 27314da920SBarry Smith /* 28f4ccad53SBarry Smith 29f4ccad53SBarry Smith Defines operations that are different for complex and real numbers; 30a5057860SBarry Smith note that one cannot mix the use of complex and real in the same 31f4ccad53SBarry Smith PETSc program. All PETSc objects in one program are built around the object 3298725619SBarry Smith PetscScalar which is either always a real or a complex. 33f4ccad53SBarry Smith 34e489efc1SBarry Smith */ 35b36a9721SBarry Smith 36c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE) 37c1d390e3SJed Brown #define MPIU_REAL MPI_FLOAT 38a97cf724SLisandro Dalcin #define PetscRoundReal(a) roundf(a) 39a97cf724SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 40a97cf724SLisandro Dalcin #define PetscExpReal(a) expf(a) 41a97cf724SLisandro Dalcin #define PetscLogReal(a) logf(a) 42a97cf724SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 4378a59e97SMatthew G. Knepley #ifdef PETSC_HAVE_LOG2 44a97cf724SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 4578a59e97SMatthew G. Knepley #endif 46a97cf724SLisandro Dalcin #define PetscSinReal(a) sinf(a) 47a97cf724SLisandro Dalcin #define PetscCosReal(a) cosf(a) 48a97cf724SLisandro Dalcin #define PetscTanReal(a) tanf(a) 49a97cf724SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 50a97cf724SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 51a97cf724SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 52a97cf724SLisandro Dalcin #define PetscAtan2Real(a,b) atan2f(a,b) 53a97cf724SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 54a97cf724SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 55a97cf724SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 56a97cf724SLisandro Dalcin #define PetscPowReal(a,b) powf(a,b) 57a97cf724SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 58a97cf724SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 59a97cf724SLisandro Dalcin #define PetscFmodReal(a,b) fmodf(a,b) 6043f0d3baSJed Brown #define PetscTGamma(a) tgammaf(a) 61c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE) 62c1d390e3SJed Brown #define MPIU_REAL MPI_DOUBLE 63814a3092SSatish Balay #define PetscRoundReal(a) round(a) 648f1a2a5eSBarry Smith #define PetscSqrtReal(a) sqrt(a) 659a07f4dfSJed Brown #define PetscExpReal(a) exp(a) 669a07f4dfSJed Brown #define PetscLogReal(a) log(a) 6777b4d14cSPeter Brune #define PetscLog10Real(a) log10(a) 6878a59e97SMatthew G. Knepley #ifdef PETSC_HAVE_LOG2 6978a59e97SMatthew G. Knepley #define PetscLog2Real(a) log2(a) 7078a59e97SMatthew G. Knepley #endif 719a07f4dfSJed Brown #define PetscSinReal(a) sin(a) 729a07f4dfSJed Brown #define PetscCosReal(a) cos(a) 73a4bea5a6SPeter Brune #define PetscTanReal(a) tan(a) 74255453a1SBarry Smith #define PetscAsinReal(a) asin(a) 75255453a1SBarry Smith #define PetscAcosReal(a) acos(a) 76a4bea5a6SPeter Brune #define PetscAtanReal(a) atan(a) 771d5abddaSDmitry Karpeev #define PetscAtan2Real(a,b) atan2(a,b) 788d1b9be0SJed Brown #define PetscSinhReal(a) sinh(a) 798d1b9be0SJed Brown #define PetscCoshReal(a) cosh(a) 808d1b9be0SJed Brown #define PetscTanhReal(a) tanh(a) 81369cc0aeSBarry Smith #define PetscPowReal(a,b) pow(a,b) 8277b4d14cSPeter Brune #define PetscCeilReal(a) ceil(a) 8377b4d14cSPeter Brune #define PetscFloorReal(a) floor(a) 84a4bea5a6SPeter Brune #define PetscFmodReal(a,b) fmod(a,b) 850646a658SBarry Smith #define PetscTGamma(a) tgamma(a) 86c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128) 87574fde7bSSatish Balay #if defined(__cplusplus) 88574fde7bSSatish Balay extern "C" { 89574fde7bSSatish Balay #endif 90574fde7bSSatish Balay #include <quadmath.h> 91574fde7bSSatish Balay #if defined(__cplusplus) 92574fde7bSSatish Balay } 93574fde7bSSatish Balay #endif 948ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PetscAttrMPITypeTag(__float128); 95c1d390e3SJed Brown #define MPIU_REAL MPIU___FLOAT128 96814a3092SSatish Balay #define PetscRoundReal(a) roundq(a) 978f1a2a5eSBarry Smith #define PetscSqrtReal(a) sqrtq(a) 989a07f4dfSJed Brown #define PetscExpReal(a) expq(a) 999a07f4dfSJed Brown #define PetscLogReal(a) logq(a) 10077b4d14cSPeter Brune #define PetscLog10Real(a) log10q(a) 10178a59e97SMatthew G. Knepley #ifdef PETSC_HAVE_LOG2 10278a59e97SMatthew G. Knepley #define PetscLog2Real(a) log2q(a) 10378a59e97SMatthew G. Knepley #endif 1049a07f4dfSJed Brown #define PetscSinReal(a) sinq(a) 1059a07f4dfSJed Brown #define PetscCosReal(a) cosq(a) 106a4bea5a6SPeter Brune #define PetscTanReal(a) tanq(a) 107255453a1SBarry Smith #define PetscAsinReal(a) asinq(a) 108255453a1SBarry Smith #define PetscAcosReal(a) acosq(a) 109a4bea5a6SPeter Brune #define PetscAtanReal(a) atanq(a) 1101d5abddaSDmitry Karpeev #define PetscAtan2Real(a,b) atan2q(a,b) 1118d1b9be0SJed Brown #define PetscSinhReal(a) sinhq(a) 1128d1b9be0SJed Brown #define PetscCoshReal(a) coshq(a) 1138d1b9be0SJed Brown #define PetscTanhReal(a) tanhq(a) 114369cc0aeSBarry Smith #define PetscPowReal(a,b) powq(a,b) 11577b4d14cSPeter Brune #define PetscCeilReal(a) ceilq(a) 11677b4d14cSPeter Brune #define PetscFloorReal(a) floorq(a) 117a4bea5a6SPeter Brune #define PetscFmodReal(a,b) fmodq(a,b) 1180646a658SBarry Smith #define PetscTGamma(a) tgammaq(a) 119570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 120570b7f6dSBarry Smith PETSC_EXTERN MPI_Datatype MPIU___FP16 PetscAttrMPITypeTag(__fp16); 121570b7f6dSBarry Smith #define MPIU_REAL MPIU___FP16 1225a0908ecSJose E. Roman #define PetscRoundReal(a) roundf(a) 123570b7f6dSBarry Smith #define PetscSqrtReal(a) sqrtf(a) 124570b7f6dSBarry Smith #define PetscExpReal(a) expf(a) 125570b7f6dSBarry Smith #define PetscLogReal(a) logf(a) 126570b7f6dSBarry Smith #define PetscLog10Real(a) log10f(a) 127570b7f6dSBarry Smith #ifdef PETSC_HAVE_LOG2 128570b7f6dSBarry Smith #define PetscLog2Real(a) log2f(a) 129570b7f6dSBarry Smith #endif 130570b7f6dSBarry Smith #define PetscSinReal(a) sinf(a) 131570b7f6dSBarry Smith #define PetscCosReal(a) cosf(a) 132570b7f6dSBarry Smith #define PetscTanReal(a) tanf(a) 133570b7f6dSBarry Smith #define PetscAsinReal(a) asinf(a) 134570b7f6dSBarry Smith #define PetscAcosReal(a) acosf(a) 135570b7f6dSBarry Smith #define PetscAtanReal(a) atanf(a) 136570b7f6dSBarry Smith #define PetscAtan2Real(a,b) atan2f(a,b) 137570b7f6dSBarry Smith #define PetscSinhReal(a) sinhf(a) 138570b7f6dSBarry Smith #define PetscCoshReal(a) coshf(a) 139570b7f6dSBarry Smith #define PetscTanhReal(a) tanhf(a) 140570b7f6dSBarry Smith #define PetscPowReal(a,b) powf(a,b) 141570b7f6dSBarry Smith #define PetscCeilReal(a) ceilf(a) 142570b7f6dSBarry Smith #define PetscFloorReal(a) floorf(a) 143570b7f6dSBarry Smith #define PetscFmodReal(a,b) fmodf(a,b) 144570b7f6dSBarry Smith #define PetscTGamma(a) tgammaf(a) 145c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */ 14659cb5930SBarry Smith 147df4397b0SStefano Zampini /*MC 148df4397b0SStefano Zampini MPIU_COMPLEX - MPI datatype corresponding to PetscComplex 149df4397b0SStefano Zampini 150df4397b0SStefano Zampini Notes: 151df4397b0SStefano Zampini In MPI calls that require an MPI datatype that matches a PetscComplex or array of PetscComplex values, pass this value. 152df4397b0SStefano Zampini 153df4397b0SStefano Zampini Level: beginner 154df4397b0SStefano Zampini 155df4397b0SStefano Zampini .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i 156df4397b0SStefano Zampini M*/ 157df4397b0SStefano Zampini 1581093a601SBarry Smith /* 1591093a601SBarry Smith Complex number definitions 1601093a601SBarry Smith */ 1612f217381SBarry Smith #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) && !defined(PETSC_USE_REAL___FLOAT128) 162df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX) 1631093a601SBarry Smith /* C++ support of complex number */ 164b7940d39SSatish Balay 16550f81f78SJed Brown #define PetscRealPartComplex(a) (a).real() 16650f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag() 167df4397b0SStefano Zampini #define PetscAbsComplex(a) petsccomplexlib::abs(a) 168df4397b0SStefano Zampini #define PetscConjComplex(a) petsccomplexlib::conj(a) 169df4397b0SStefano Zampini #define PetscSqrtComplex(a) petsccomplexlib::sqrt(a) 170df4397b0SStefano Zampini #define PetscPowComplex(a,b) petsccomplexlib::pow(a,b) 171df4397b0SStefano Zampini #define PetscExpComplex(a) petsccomplexlib::exp(a) 172df4397b0SStefano Zampini #define PetscLogComplex(a) petsccomplexlib::log(a) 173df4397b0SStefano Zampini #define PetscSinComplex(a) petsccomplexlib::sin(a) 174df4397b0SStefano Zampini #define PetscCosComplex(a) petsccomplexlib::cos(a) 175df4397b0SStefano Zampini #define PetscAsinComplex(a) petsccomplexlib::asin(a) 176df4397b0SStefano Zampini #define PetscAcosComplex(a) petsccomplexlib::acos(a) 177027d9794SBarry Smith #if defined(PETSC_HAVE_TANCOMPLEX) 178df4397b0SStefano Zampini #define PetscTanComplex(a) petsccomplexlib::tan(a) 179027d9794SBarry Smith #else 180027d9794SBarry Smith #define PetscTanComplex(a) PetscSinComplex(a)/PetscCosComplex(a) 181027d9794SBarry Smith #endif 182df4397b0SStefano Zampini #define PetscSinhComplex(a) petsccomplexlib::sinh(a) 183df4397b0SStefano Zampini #define PetscCoshComplex(a) petsccomplexlib::cosh(a) 184027d9794SBarry Smith #if defined(PETSC_HAVE_TANHCOMPLEX) 185df4397b0SStefano Zampini #define PetscTanhComplex(a) petsccomplexlib::tanh(a) 186027d9794SBarry Smith #else 187027d9794SBarry Smith #define PetscTanhComplex(a) PetscSinhComplex(a)/PetscCoshComplex(a) 188027d9794SBarry Smith #endif 189debe9ee2SPaul Mullowney 190debe9ee2SPaul Mullowney #if defined(PETSC_USE_REAL_SINGLE) 1913be776deSLisandro Dalcin #if defined(PETSC_USE_CXX_COMPLEX_FLOAT_WORKAROUND) 1923be776deSLisandro Dalcin static inline PetscComplex operator+(const PetscComplex& lhs, const double& rhs) { return lhs + float(rhs); } 1933be776deSLisandro Dalcin static inline PetscComplex operator+(const double& lhs, const PetscComplex& rhs) { return float(lhs) + rhs; } 1943be776deSLisandro Dalcin static inline PetscComplex operator-(const PetscComplex& lhs, const double& rhs) { return lhs - float(rhs); } 1953be776deSLisandro Dalcin static inline PetscComplex operator-(const double& lhs, const PetscComplex& rhs) { return float(lhs) - rhs; } 1963be776deSLisandro Dalcin static inline PetscComplex operator*(const PetscComplex& lhs, const double& rhs) { return lhs * float(rhs); } 1973be776deSLisandro Dalcin static inline PetscComplex operator*(const double& lhs, const PetscComplex& rhs) { return float(lhs) * rhs; } 1983be776deSLisandro Dalcin static inline PetscComplex operator/(const PetscComplex& lhs, const double& rhs) { return lhs / float(rhs); } 1993be776deSLisandro Dalcin static inline PetscComplex operator/(const double& lhs, const PetscComplex& rhs) { return float(lhs) / rhs; } 2003be776deSLisandro Dalcin static inline bool operator==(const PetscComplex& lhs, const double& rhs) { return lhs.imag() == float(0) && lhs.real() == float(rhs); } 2013be776deSLisandro Dalcin static inline bool operator==(const double& lhs, const PetscComplex& rhs) { return rhs.imag() == float(0) && rhs.real() == float(lhs); } 2023be776deSLisandro Dalcin static inline bool operator!=(const PetscComplex& lhs, const double& rhs) { return lhs.imag() != float(0) || lhs.real() != float(rhs); } 2033be776deSLisandro Dalcin static inline bool operator!=(const double& lhs, const PetscComplex& rhs) { return rhs.imag() != float(0) || rhs.real() != float(lhs); } 2043be776deSLisandro Dalcin #endif /* PETSC_USE_CXX_COMPLEX_FLOAT_WORKAROUND */ 205debe9ee2SPaul Mullowney #elif defined(PETSC_USE_REAL_DOUBLE) 2061a9c6b96SLisandro Dalcin #if defined(PETSC_USE_CXX_COMPLEX_FLOAT_WORKAROUND) 2071a9c6b96SLisandro Dalcin static inline PetscComplex operator+(const PetscComplex& lhs, const PetscInt& rhs) { return lhs + double(rhs); } 2081a9c6b96SLisandro Dalcin static inline PetscComplex operator+(const PetscInt& lhs, const PetscComplex& rhs) { return double(lhs) + rhs; } 2091a9c6b96SLisandro Dalcin static inline PetscComplex operator-(const PetscComplex& lhs, const PetscInt& rhs) { return lhs - double(rhs); } 2101a9c6b96SLisandro Dalcin static inline PetscComplex operator-(const PetscInt& lhs, const PetscComplex& rhs) { return double(lhs) - rhs; } 2111a9c6b96SLisandro Dalcin static inline PetscComplex operator*(const PetscComplex& lhs, const PetscInt& rhs) { return lhs * double(rhs); } 2121a9c6b96SLisandro Dalcin static inline PetscComplex operator*(const PetscInt& lhs, const PetscComplex& rhs) { return double(lhs) * rhs; } 2131a9c6b96SLisandro Dalcin static inline PetscComplex operator/(const PetscComplex& lhs, const PetscInt& rhs) { return lhs / double(rhs); } 2141a9c6b96SLisandro Dalcin static inline PetscComplex operator/(const PetscInt& lhs, const PetscComplex& rhs) { return double(lhs) / rhs; } 2151a9c6b96SLisandro Dalcin static inline bool operator==(const PetscComplex& lhs, const PetscInt& rhs) { return lhs.imag() == double(0) && lhs.real() == double(rhs); } 2161a9c6b96SLisandro Dalcin static inline bool operator==(const PetscInt& lhs, const PetscComplex& rhs) { return rhs.imag() == double(0) && rhs.real() == double(lhs); } 2171a9c6b96SLisandro Dalcin static inline bool operator!=(const PetscComplex& lhs, const PetscInt& rhs) { return lhs.imag() != double(0) || lhs.real() != double(rhs); } 2181a9c6b96SLisandro Dalcin static inline bool operator!=(const PetscInt& lhs, const PetscComplex& rhs) { return rhs.imag() != double(0) || rhs.real() != double(lhs); } 2191a9c6b96SLisandro Dalcin #endif /* PETSC_USE_CXX_COMPLEX_FLOAT_WORKAROUND */ 2208c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128) 22122b3908eSBarry Smith PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128; 222df4397b0SStefano Zampini #endif 223df4397b0SStefano Zampini #endif /* PETSC_HAVE_COMPLEX */ 224debe9ee2SPaul Mullowney 225546cf897SSatish Balay #elif defined(PETSC_HAVE_C99_COMPLEX) && !defined(PETSC_USE_REAL___FP16) 226df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX) 227519e2a1fSPaul Mullowney 228570b7f6dSBarry Smith #if defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL___FP16) 22950f81f78SJed Brown #define PetscRealPartComplex(a) crealf(a) 23050f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a) 23150f81f78SJed Brown #define PetscAbsComplex(a) cabsf(a) 23250f81f78SJed Brown #define PetscConjComplex(a) conjf(a) 23350f81f78SJed Brown #define PetscSqrtComplex(a) csqrtf(a) 23450f81f78SJed Brown #define PetscPowComplex(a,b) cpowf(a,b) 23550f81f78SJed Brown #define PetscExpComplex(a) cexpf(a) 23650f81f78SJed Brown #define PetscLogComplex(a) clogf(a) 23750f81f78SJed Brown #define PetscSinComplex(a) csinf(a) 23850f81f78SJed Brown #define PetscCosComplex(a) ccosf(a) 239255453a1SBarry Smith #define PetscAsinComplex(a) casinf(a) 240255453a1SBarry Smith #define PetscAcosComplex(a) cacosf(a) 241a4bea5a6SPeter Brune #define PetscTanComplex(a) ctanf(a) 242a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhf(a) 243a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshf(a) 244a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhf(a) 2451093a601SBarry Smith 246ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 24750f81f78SJed Brown #define PetscRealPartComplex(a) creal(a) 24850f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a) 24950f81f78SJed Brown #define PetscAbsComplex(a) cabs(a) 25050f81f78SJed Brown #define PetscConjComplex(a) conj(a) 25150f81f78SJed Brown #define PetscSqrtComplex(a) csqrt(a) 25250f81f78SJed Brown #define PetscPowComplex(a,b) cpow(a,b) 25350f81f78SJed Brown #define PetscExpComplex(a) cexp(a) 25450f81f78SJed Brown #define PetscLogComplex(a) clog(a) 25550f81f78SJed Brown #define PetscSinComplex(a) csin(a) 25650f81f78SJed Brown #define PetscCosComplex(a) ccos(a) 257255453a1SBarry Smith #define PetscAsinComplex(a) casin(a) 258255453a1SBarry Smith #define PetscAcosComplex(a) cacos(a) 259a4bea5a6SPeter Brune #define PetscTanComplex(a) ctan(a) 260a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinh(a) 261a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccosh(a) 262a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanh(a) 2631093a601SBarry Smith 2648c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128) 2658ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 PetscAttrMPITypeTag(__complex128); 2668c764dc5SJose Roman 26750f81f78SJed Brown #define PetscRealPartComplex(a) crealq(a) 26850f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a) 26950f81f78SJed Brown #define PetscAbsComplex(a) cabsq(a) 27050f81f78SJed Brown #define PetscConjComplex(a) conjq(a) 27150f81f78SJed Brown #define PetscSqrtComplex(a) csqrtq(a) 27250f81f78SJed Brown #define PetscPowComplex(a,b) cpowq(a,b) 27350f81f78SJed Brown #define PetscExpComplex(a) cexpq(a) 27450f81f78SJed Brown #define PetscLogComplex(a) clogq(a) 27550f81f78SJed Brown #define PetscSinComplex(a) csinq(a) 27650f81f78SJed Brown #define PetscCosComplex(a) ccosq(a) 277255453a1SBarry Smith #define PetscAsinComplex(a) casinq(a) 278255453a1SBarry Smith #define PetscAcosComplex(a) cacosq(a) 279a4bea5a6SPeter Brune #define PetscTanComplex(a) ctanq(a) 280a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhq(a) 281a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshq(a) 282a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhq(a) 283a4bea5a6SPeter Brune 284ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */ 285df4397b0SStefano Zampini #endif /* PETSC_HAVE_COMPLEX */ 2862f217381SBarry Smith #endif /* (__cplusplus && PETSC_HAVE_CXX_COMPLEX) else-if (!__cplusplus && PETSC_HAVE_C99_COMPLEX) */ 287e489efc1SBarry Smith 2888dc6f2c2SJed Brown #if defined(PETSC_HAVE_COMPLEX) 28970da9c3bSJed Brown #if defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 290500d8756SSatish Balay #define MPIU_C_DOUBLE_COMPLEX MPI_C_DOUBLE_COMPLEX 291500d8756SSatish Balay #define MPIU_C_COMPLEX MPI_C_COMPLEX 29270da9c3bSJed Brown #else 293252ecd31SSatish Balay # if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) && !defined(PETSC_USE_REAL___FLOAT128) 294df4397b0SStefano Zampini typedef petsccomplexlib::complex<double> petsc_mpiu_c_double_complex; 295df4397b0SStefano Zampini typedef petsccomplexlib::complex<float> petsc_mpiu_c_complex; 2962f217381SBarry Smith # elif !defined(__cplusplus) && defined(PETSC_HAVE_C99_COMPLEX) 2978ad47952SJed Brown typedef double _Complex petsc_mpiu_c_double_complex; 2988ad47952SJed Brown typedef float _Complex petsc_mpiu_c_complex; 2998ad47952SJed Brown # else 3008ad47952SJed Brown typedef struct {double real,imag;} petsc_mpiu_c_double_complex; 3018ad47952SJed Brown typedef struct {float real,imag;} petsc_mpiu_c_complex; 3028ad47952SJed Brown # endif 3038ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_C_DOUBLE_COMPLEX PetscAttrMPITypeTagLayoutCompatible(petsc_mpiu_c_double_complex); 3048ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_C_COMPLEX PetscAttrMPITypeTagLayoutCompatible(petsc_mpiu_c_complex); 3051b65fc54SMatthew G Knepley #endif /* PETSC_HAVE_MPI_C_DOUBLE_COMPLEX */ 3068dc6f2c2SJed Brown #endif /* PETSC_HAVE_COMPLEX */ 3072c876bd9SBarry Smith 3087c2de775SJed Brown #if defined(PETSC_HAVE_COMPLEX) 309570b7f6dSBarry Smith # if defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL___FP16) 3107c2de775SJed Brown # define MPIU_COMPLEX MPIU_C_COMPLEX 3117c2de775SJed Brown # elif defined(PETSC_USE_REAL_DOUBLE) 3127c2de775SJed Brown # define MPIU_COMPLEX MPIU_C_DOUBLE_COMPLEX 3137c2de775SJed Brown # elif defined(PETSC_USE_REAL___FLOAT128) 3147c2de775SJed Brown # define MPIU_COMPLEX MPIU___COMPLEX128 3157c2de775SJed Brown # endif /* PETSC_USE_REAL_* */ 3167c2de775SJed Brown #endif 3177c2de775SJed Brown 318df4397b0SStefano Zampini /*MC 319df4397b0SStefano Zampini MPIU_SCALAR - MPI datatype corresponding to PetscScalar 320df4397b0SStefano Zampini 321df4397b0SStefano Zampini Notes: 322df4397b0SStefano Zampini In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalar values, pass this value. 323df4397b0SStefano Zampini 324df4397b0SStefano Zampini Level: beginner 325df4397b0SStefano Zampini 326df4397b0SStefano Zampini .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_COMPLEX, MPIU_INT 327df4397b0SStefano Zampini M*/ 328df4397b0SStefano Zampini 329d4161b4aSBarry Smith #if (defined(PETSC_USE_COMPLEX) && !defined(PETSC_SKIP_COMPLEX)) 33059479656SBarry Smith 33159479656SBarry Smith /*MC 33259479656SBarry Smith PetscRealPart - Returns the real part of a PetscScalar 33359479656SBarry Smith 33459479656SBarry Smith Synopsis: 33559479656SBarry Smith #include <petscmath.h> 33659479656SBarry Smith PetscScalar PetscRealPart(PetscScalar v) 33759479656SBarry Smith 33859479656SBarry Smith Not Collective 33959479656SBarry Smith 34059479656SBarry Smith Input Parameter: 34159479656SBarry Smith . v - value to find the real part of 34259479656SBarry Smith 34359479656SBarry Smith Level: beginner 34459479656SBarry Smith 34559479656SBarry Smith .seealso: PetscScalar, PetscImaginaryPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 34659479656SBarry Smith 34759479656SBarry Smith M*/ 34850f81f78SJed Brown #define PetscRealPart(a) PetscRealPartComplex(a) 34959479656SBarry Smith 35059479656SBarry Smith /*MC 35159479656SBarry Smith PetscImaginaryPart - Returns the imaginary part of a PetscScalar 35259479656SBarry Smith 35359479656SBarry Smith Synopsis: 35459479656SBarry Smith #include <petscmath.h> 35559479656SBarry Smith PetscScalar PetscImaginaryPart(PetscScalar v) 35659479656SBarry Smith 35759479656SBarry Smith Not Collective 35859479656SBarry Smith 35959479656SBarry Smith Input Parameter: 36059479656SBarry Smith . v - value to find the imaginary part of 36159479656SBarry Smith 36259479656SBarry Smith Level: beginner 36359479656SBarry Smith 36459479656SBarry Smith Notes: 36559479656SBarry Smith If PETSc was configured for real numbers then this always returns the value 0 36659479656SBarry Smith 36759479656SBarry Smith .seealso: PetscScalar, PetscRealPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 36859479656SBarry Smith 36959479656SBarry Smith M*/ 37050f81f78SJed Brown #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a) 37159479656SBarry Smith 37250f81f78SJed Brown #define PetscAbsScalar(a) PetscAbsComplex(a) 37350f81f78SJed Brown #define PetscConj(a) PetscConjComplex(a) 37450f81f78SJed Brown #define PetscSqrtScalar(a) PetscSqrtComplex(a) 37550f81f78SJed Brown #define PetscPowScalar(a,b) PetscPowComplex(a,b) 37650f81f78SJed Brown #define PetscExpScalar(a) PetscExpComplex(a) 37750f81f78SJed Brown #define PetscLogScalar(a) PetscLogComplex(a) 37850f81f78SJed Brown #define PetscSinScalar(a) PetscSinComplex(a) 37950f81f78SJed Brown #define PetscCosScalar(a) PetscCosComplex(a) 380255453a1SBarry Smith #define PetscAsinScalar(a) PetscAsinComplex(a) 381255453a1SBarry Smith #define PetscAcosScalar(a) PetscAcosComplex(a) 382a4bea5a6SPeter Brune #define PetscTanScalar(a) PetscTanComplex(a) 383a4bea5a6SPeter Brune #define PetscSinhScalar(a) PetscSinhComplex(a) 384a4bea5a6SPeter Brune #define PetscCoshScalar(a) PetscCoshComplex(a) 385a4bea5a6SPeter Brune #define PetscTanhScalar(a) PetscTanhComplex(a) 3867c2de775SJed Brown #define MPIU_SCALAR MPIU_COMPLEX 38775567043SBarry Smith 3881093a601SBarry Smith /* 3891093a601SBarry Smith real number definitions 3901093a601SBarry Smith */ 3911b65fc54SMatthew G Knepley #else /* PETSC_USE_COMPLEX */ 3927c2de775SJed Brown #define MPIU_SCALAR MPIU_REAL 3937c2de775SJed Brown 394329f5518SBarry Smith #define PetscRealPart(a) (a) 395c1d390e3SJed Brown #define PetscImaginaryPart(a) ((PetscReal)0.) 396c1d390e3SJed Brown PETSC_STATIC_INLINE PetscReal PetscAbsScalar(PetscScalar a) {return a < 0.0 ? -a : a;} 397e489efc1SBarry Smith #define PetscConj(a) (a) 398570b7f6dSBarry Smith #if !defined(PETSC_USE_REAL___FLOAT128) && !defined(PETSC_USE_REAL___FP16) 39918a7d68fSSatish Balay #define PetscSqrtScalar(a) sqrt(a) 400184914b5SBarry Smith #define PetscPowScalar(a,b) pow(a,b) 401184914b5SBarry Smith #define PetscExpScalar(a) exp(a) 40206c1185fSBarry Smith #define PetscLogScalar(a) log(a) 403184914b5SBarry Smith #define PetscSinScalar(a) sin(a) 404184914b5SBarry Smith #define PetscCosScalar(a) cos(a) 405255453a1SBarry Smith #define PetscAsinScalar(a) asin(a) 406255453a1SBarry Smith #define PetscAcosScalar(a) acos(a) 407a4bea5a6SPeter Brune #define PetscTanScalar(a) tan(a) 408a4bea5a6SPeter Brune #define PetscSinhScalar(a) sinh(a) 409a4bea5a6SPeter Brune #define PetscCoshScalar(a) cosh(a) 410a4bea5a6SPeter Brune #define PetscTanhScalar(a) tanh(a) 411570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 412570b7f6dSBarry Smith #define PetscSqrtScalar(a) sqrtf(a) 413570b7f6dSBarry Smith #define PetscPowScalar(a,b) powf(a,b) 414570b7f6dSBarry Smith #define PetscExpScalar(a) expf(a) 415570b7f6dSBarry Smith #define PetscLogScalar(a) logf(a) 416570b7f6dSBarry Smith #define PetscSinScalar(a) sinf(a) 417570b7f6dSBarry Smith #define PetscCosScalar(a) cosf(a) 418570b7f6dSBarry Smith #define PetscAsinScalar(a) asinf(a) 419570b7f6dSBarry Smith #define PetscAcosScalar(a) acosf(a) 420570b7f6dSBarry Smith #define PetscTanScalar(a) tanf(a) 421570b7f6dSBarry Smith #define PetscSinhScalar(a) sinhf(a) 422570b7f6dSBarry Smith #define PetscCoshScalar(a) coshf(a) 423570b7f6dSBarry Smith #define PetscTanhScalar(a) tanhf(a) 424ce63c4c1SBarry Smith #else /* PETSC_USE_REAL___FLOAT128 */ 4250d0cc1b5SBarry Smith #define PetscSqrtScalar(a) sqrtq(a) 4260d0cc1b5SBarry Smith #define PetscPowScalar(a,b) powq(a,b) 4270d0cc1b5SBarry Smith #define PetscExpScalar(a) expq(a) 4280d0cc1b5SBarry Smith #define PetscLogScalar(a) logq(a) 4290d0cc1b5SBarry Smith #define PetscSinScalar(a) sinq(a) 4300d0cc1b5SBarry Smith #define PetscCosScalar(a) cosq(a) 431255453a1SBarry Smith #define PetscAsinScalar(a) asinq(a) 432255453a1SBarry Smith #define PetscAcosScalar(a) acosq(a) 433a4bea5a6SPeter Brune #define PetscTanScalar(a) tanq(a) 434a4bea5a6SPeter Brune #define PetscSinhScalar(a) sinhq(a) 435a4bea5a6SPeter Brune #define PetscCoshScalar(a) coshq(a) 436a4bea5a6SPeter Brune #define PetscTanhScalar(a) tanhq(a) 437ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL___FLOAT128 */ 438b0a32e0cSBarry Smith 4391b65fc54SMatthew G Knepley #endif /* PETSC_USE_COMPLEX */ 440e489efc1SBarry Smith 441da9b6338SBarry Smith #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1) 44236850ab7SBarry Smith #define PetscSignReal(a) (((a) >= 0.0) ? ((a) == 0.0 ? 0.0 : 1.0) : -1.0) 4439fa7d148SSatish Balay #define PetscAbs(a) (((a) >= 0) ? (a) : (-(a))) 4443f1db9ecSBarry Smith 445314da920SBarry Smith /* --------------------------------------------------------------------------*/ 446314da920SBarry Smith 447e489efc1SBarry Smith /* 448f22f69f0SBarry Smith Certain objects may be created using either single or double precision. 449f22f69f0SBarry Smith This is currently not used. 450e489efc1SBarry Smith */ 451570b7f6dSBarry Smith typedef enum { PETSC_SCALAR_DOUBLE,PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE, PETSC_SCALAR_HALF } PetscScalarPrecision; 452e489efc1SBarry Smith 45350f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 454e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */ 45550f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i; 4568a351411SToby Isaac 4578a351411SToby Isaac /* Try to do the right thing for complex number construction: see 4588a351411SToby Isaac 4598a351411SToby Isaac http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm 4608a351411SToby Isaac 4618a351411SToby Isaac for details 4628a351411SToby Isaac */ 46319e222d7SToby Isaac PETSC_STATIC_INLINE PetscComplex PetscCMPLX(PetscReal x, PetscReal y) 4648a351411SToby Isaac { 4650e1bea35STristan Konolige #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) && !defined(PETSC_USE_REAL___FLOAT128) 4668a351411SToby Isaac return PetscComplex(x,y); 4678a351411SToby Isaac #elif defined(_Imaginary_I) 4688a351411SToby Isaac return x + y * _Imaginary_I; 4698a351411SToby Isaac #else 470616d7c5eSToby Isaac { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5), 471616d7c5eSToby Isaac 472616d7c5eSToby Isaac "For each floating type there is a corresponding real type, which is always a real floating 473616d7c5eSToby Isaac type. For real floating types, it is the same type. For complex types, it is the type given 474616d7c5eSToby Isaac by deleting the keyword _Complex from the type name." 475616d7c5eSToby Isaac 476616d7c5eSToby Isaac So type punning should be portable. */ 477616d7c5eSToby Isaac union { PetscComplex z; PetscReal f[2]; } uz; 478616d7c5eSToby Isaac 479616d7c5eSToby Isaac uz.f[0] = x; 480616d7c5eSToby Isaac uz.f[1] = y; 481616d7c5eSToby Isaac return uz.z; 482616d7c5eSToby Isaac } 48350f81f78SJed Brown #endif 4848a351411SToby Isaac } 4858a351411SToby Isaac #endif 4868a351411SToby Isaac 487e489efc1SBarry Smith 488b6a5bde7SBarry Smith /*MC 489b6a5bde7SBarry Smith PetscMin - Returns minimum of two numbers 490b6a5bde7SBarry Smith 491eca87e8dSBarry Smith Synopsis: 492aaa7dc30SBarry Smith #include <petscmath.h> 493eca87e8dSBarry Smith type PetscMin(type v1,type v2) 494eca87e8dSBarry Smith 495eca87e8dSBarry Smith Not Collective 496eca87e8dSBarry Smith 497b6a5bde7SBarry Smith Input Parameter: 498b6a5bde7SBarry Smith + v1 - first value to find minimum of 499b6a5bde7SBarry Smith - v2 - second value to find minimum of 500b6a5bde7SBarry Smith 50195452b02SPatrick Sanan Notes: 50295452b02SPatrick Sanan type can be integer or floating point value 503b6a5bde7SBarry Smith 504b6a5bde7SBarry Smith Level: beginner 505b6a5bde7SBarry Smith 5061175f9beSHong Zhang .seealso: PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 507b6a5bde7SBarry Smith 508b6a5bde7SBarry Smith M*/ 509e489efc1SBarry Smith #define PetscMin(a,b) (((a)<(b)) ? (a) : (b)) 510b6a5bde7SBarry Smith 511b6a5bde7SBarry Smith /*MC 512b6a5bde7SBarry Smith PetscMax - Returns maxium of two numbers 513b6a5bde7SBarry Smith 514eca87e8dSBarry Smith Synopsis: 515aaa7dc30SBarry Smith #include <petscmath.h> 516eca87e8dSBarry Smith type max PetscMax(type v1,type v2) 517eca87e8dSBarry Smith 518eca87e8dSBarry Smith Not Collective 519eca87e8dSBarry Smith 520b6a5bde7SBarry Smith Input Parameter: 521b6a5bde7SBarry Smith + v1 - first value to find maximum of 522b6a5bde7SBarry Smith - v2 - second value to find maximum of 523b6a5bde7SBarry Smith 52495452b02SPatrick Sanan Notes: 52595452b02SPatrick Sanan type can be integer or floating point value 526b6a5bde7SBarry Smith 527b6a5bde7SBarry Smith Level: beginner 528b6a5bde7SBarry Smith 529d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 530b6a5bde7SBarry Smith 531b6a5bde7SBarry Smith M*/ 532e489efc1SBarry Smith #define PetscMax(a,b) (((a)<(b)) ? (b) : (a)) 533b6a5bde7SBarry Smith 534b6a5bde7SBarry Smith /*MC 535d9a4bb16SJed Brown PetscClipInterval - Returns a number clipped to be within an interval 536d9a4bb16SJed Brown 537d9a4bb16SJed Brown Synopsis: 538aaa7dc30SBarry Smith #include <petscmath.h> 539d9a4bb16SJed Brown type clip PetscClipInterval(type x,type a,type b) 540d9a4bb16SJed Brown 541d9a4bb16SJed Brown Not Collective 542d9a4bb16SJed Brown 543d9a4bb16SJed Brown Input Parameter: 544d9a4bb16SJed Brown + x - value to use if within interval (a,b) 545d9a4bb16SJed Brown . a - lower end of interval 546d9a4bb16SJed Brown - b - upper end of interval 547d9a4bb16SJed Brown 54895452b02SPatrick Sanan Notes: 54995452b02SPatrick Sanan type can be integer or floating point value 550d9a4bb16SJed Brown 551d9a4bb16SJed Brown Level: beginner 552d9a4bb16SJed Brown 553d9a4bb16SJed Brown .seealso: PetscMin(), PetscMax(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 554d9a4bb16SJed Brown 555d9a4bb16SJed Brown M*/ 556d9a4bb16SJed Brown #define PetscClipInterval(x,a,b) (PetscMax((a),PetscMin((x),(b)))) 557d9a4bb16SJed Brown 558d9a4bb16SJed Brown /*MC 559b6a5bde7SBarry Smith PetscAbsInt - Returns the absolute value of an integer 560b6a5bde7SBarry Smith 561b6a5bde7SBarry Smith Synopsis: 562aaa7dc30SBarry Smith #include <petscmath.h> 563b6a5bde7SBarry Smith int abs PetscAbsInt(int v1) 564b6a5bde7SBarry Smith 565eca87e8dSBarry Smith Not Collective 566eca87e8dSBarry Smith 567eca87e8dSBarry Smith Input Parameter: 568eca87e8dSBarry Smith . v1 - the integer 569b6a5bde7SBarry Smith 570b6a5bde7SBarry Smith Level: beginner 571b6a5bde7SBarry Smith 572b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr() 573b6a5bde7SBarry Smith 574b6a5bde7SBarry Smith M*/ 5759fa7d148SSatish Balay #define PetscAbsInt(a) (((a)<0) ? (-(a)) : (a)) 576b6a5bde7SBarry Smith 577b6a5bde7SBarry Smith /*MC 578b6a5bde7SBarry Smith PetscAbsReal - Returns the absolute value of an real number 579b6a5bde7SBarry Smith 580eca87e8dSBarry Smith Synopsis: 581aaa7dc30SBarry Smith #include <petscmath.h> 582eca87e8dSBarry Smith Real abs PetscAbsReal(PetscReal v1) 583eca87e8dSBarry Smith 584eca87e8dSBarry Smith Not Collective 585eca87e8dSBarry Smith 586b6a5bde7SBarry Smith Input Parameter: 587b6a5bde7SBarry Smith . v1 - the double 588b6a5bde7SBarry Smith 589b6a5bde7SBarry Smith 590b6a5bde7SBarry Smith Level: beginner 591b6a5bde7SBarry Smith 592b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr() 593b6a5bde7SBarry Smith 594b6a5bde7SBarry Smith M*/ 5951118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 5961118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 5971118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 5981118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a) 5991118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 6001118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a) 6011118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 6021118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 6031118d4bcSLisandro Dalcin #endif 604b6a5bde7SBarry Smith 605b6a5bde7SBarry Smith /*MC 606b6a5bde7SBarry Smith PetscSqr - Returns the square of a number 607b6a5bde7SBarry Smith 608b6a5bde7SBarry Smith Synopsis: 609aaa7dc30SBarry Smith #include <petscmath.h> 610b6a5bde7SBarry Smith type sqr PetscSqr(type v1) 611b6a5bde7SBarry Smith 612eca87e8dSBarry Smith Not Collective 613eca87e8dSBarry Smith 614eca87e8dSBarry Smith Input Parameter: 615eca87e8dSBarry Smith . v1 - the value 616eca87e8dSBarry Smith 61795452b02SPatrick Sanan Notes: 61895452b02SPatrick Sanan type can be integer or floating point value 619b6a5bde7SBarry Smith 620b6a5bde7SBarry Smith Level: beginner 621b6a5bde7SBarry Smith 622b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal() 623b6a5bde7SBarry Smith 624b6a5bde7SBarry Smith M*/ 6254ebda54eSMatthew Knepley #define PetscSqr(a) ((a)*(a)) 626e489efc1SBarry Smith 627314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 628ee223c85SLisandro Dalcin 629ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 630ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F 631ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 632ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q 633ee223c85SLisandro Dalcin #else 634ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant 635ee223c85SLisandro Dalcin #endif 636ee223c85SLisandro Dalcin 637314da920SBarry Smith /* 638d34fcf5fSBarry Smith Basic constants 639314da920SBarry Smith */ 6402fab75feSLisandro Dalcin #define PETSC_PI PetscRealConstant(3.1415926535897932384626433832795029) 6412fab75feSLisandro Dalcin #define PETSC_PHI PetscRealConstant(1.6180339887498948482045868343656381) 642*7b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981) 643d34fcf5fSBarry Smith 644ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 64571fd2e92SBarry Smith #define PETSC_MAX_INT 2147483647 646ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 647ab824b78SBarry Smith #else 648ab824b78SBarry Smith #define PETSC_MAX_INT 9223372036854775807L 649ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 650ab824b78SBarry Smith #endif 651e489efc1SBarry Smith 652ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 653ab824b78SBarry Smith # define PETSC_MAX_REAL 3.40282346638528860e+38F 6549fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 65582a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 1.19209290e-07F 65682a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F 657ee223c85SLisandro Dalcin # define PETSC_SMALL 1.e-5F 658ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 659ab824b78SBarry Smith # define PETSC_MAX_REAL 1.7976931348623157e+308 6609fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 66182a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 2.2204460492503131e-16 66282a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08 663cf6e855fSSatish Balay # define PETSC_SMALL 1.e-10 664ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 665ea345e14SBarry Smith # define PETSC_MAX_REAL FLT128_MAX 6669fa7d148SSatish Balay # define PETSC_MIN_REAL (-FLT128_MAX) 667d34fcf5fSBarry Smith # define PETSC_MACHINE_EPSILON FLT128_EPSILON 668ee223c85SLisandro Dalcin # define PETSC_SQRT_MACHINE_EPSILON 1.38777878078144567552953958511352539e-17Q 669ee223c85SLisandro Dalcin # define PETSC_SMALL 1.e-20Q 670570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) /* maybe should use single precision values for these? */ 671570b7f6dSBarry Smith # define PETSC_MAX_REAL 65504. 6729fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 673570b7f6dSBarry Smith # define PETSC_MACHINE_EPSILON .00097656 674570b7f6dSBarry Smith # define PETSC_SQRT_MACHINE_EPSILON .0312 675570b7f6dSBarry Smith # define PETSC_SMALL 5.e-3 6769cf09972SJed Brown #endif 6773e523bebSBarry Smith 67825d0f998SSatish Balay #define PETSC_INFINITY (PETSC_MAX_REAL/4) 6799fa7d148SSatish Balay #define PETSC_NINFINITY (-PETSC_INFINITY) 680e270355aSBarry Smith 6819f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsInfReal(PetscReal); 6823948c36eSLisandro Dalcin PETSC_EXTERN PetscBool PetscIsNanReal(PetscReal); 6838b49ba18SBarry Smith PETSC_EXTERN PetscBool PetscIsNormalReal(PetscReal); 6849f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanReal(PetscReal v) {return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;} 6859f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfScalar(PetscScalar v) {return PetscIsInfReal(PetscAbsScalar(v));} 6863948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNanScalar(PetscScalar v) {return PetscIsNanReal(PetscAbsScalar(v));} 6879f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanScalar(PetscScalar v) {return PetscIsInfOrNanReal(PetscAbsScalar(v));} 6883948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNormalScalar(PetscScalar v) {return PetscIsNormalReal(PetscAbsScalar(v));} 6899a25a3ccSBarry Smith 690b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal,PetscReal,PetscReal,PetscReal); 691ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal,PetscReal); 692ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar,PetscScalar); 693ce4818fdSLisandro Dalcin 69498725619SBarry Smith /* 69598725619SBarry Smith These macros are currently hardwired to match the regular data types, so there is no support for a different 69698725619SBarry Smith MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again. 69798725619SBarry Smith */ 69898725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR 69998725619SBarry Smith typedef PetscScalar MatScalar; 70098725619SBarry Smith typedef PetscReal MatReal; 70198725619SBarry Smith 7028ad47952SJed Brown struct petsc_mpiu_2scalar {PetscScalar a,b;}; 7038ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2scalar); 704df4397b0SStefano Zampini 705a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES) 7068ad47952SJed Brown struct petsc_mpiu_2int {PetscInt a,b;}; 7078ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2int); 7088ad47952SJed Brown #else 7098ad47952SJed Brown #define MPIU_2INT MPI_2INT 7108ad47952SJed Brown #endif 711e9fa29b7SSatish Balay 712b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscInt PetscPowInt(PetscInt base,PetscInt power) 713b2fb0278SBarry Smith { 714fa711258SJed Brown PetscInt result = 1; 715fa711258SJed Brown while (power) { 716fa711258SJed Brown if (power & 1) result *= base; 717fa711258SJed Brown power >>= 1; 718fa711258SJed Brown base *= base; 719fa711258SJed Brown } 720fa711258SJed Brown return result; 721fa711258SJed Brown } 722b2fb0278SBarry Smith 723b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscReal PetscPowRealInt(PetscReal base,PetscInt power) 724b2fb0278SBarry Smith { 725fa711258SJed Brown PetscReal result = 1; 726d98d5da7SBarry Smith if (power < 0) { 727d98d5da7SBarry Smith power = -power; 72810d40e53SLisandro Dalcin base = ((PetscReal)1)/base; 729d98d5da7SBarry Smith } 730fa711258SJed Brown while (power) { 731fa711258SJed Brown if (power & 1) result *= base; 732fa711258SJed Brown power >>= 1; 733fa711258SJed Brown base *= base; 734fa711258SJed Brown } 735fa711258SJed Brown return result; 736fa711258SJed Brown } 737fa711258SJed Brown 738b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarInt(PetscScalar base,PetscInt power) 739b2fb0278SBarry Smith { 7408b49ba18SBarry Smith PetscScalar result = 1; 7418b49ba18SBarry Smith if (power < 0) { 7428b49ba18SBarry Smith power = -power; 74310d40e53SLisandro Dalcin base = ((PetscReal)1)/base; 7448b49ba18SBarry Smith } 7458b49ba18SBarry Smith while (power) { 7468b49ba18SBarry Smith if (power & 1) result *= base; 7478b49ba18SBarry Smith power >>= 1; 7488b49ba18SBarry Smith base *= base; 7498b49ba18SBarry Smith } 7508b49ba18SBarry Smith return result; 7518b49ba18SBarry Smith } 7528b49ba18SBarry Smith 753b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarReal(PetscScalar base,PetscReal power) 754b2fb0278SBarry Smith { 755b2fb0278SBarry Smith PetscScalar cpower = power; 756b2fb0278SBarry Smith return PetscPowScalar(base,cpower); 757b2fb0278SBarry Smith } 75878a59e97SMatthew G. Knepley 75978a59e97SMatthew G. Knepley #ifndef PETSC_HAVE_LOG2 76078a59e97SMatthew G. Knepley PETSC_STATIC_INLINE PetscReal PetscLog2Real(PetscReal n) 76178a59e97SMatthew G. Knepley { 76291954be4SBarry Smith return PetscLogReal(n)/PetscLogReal(2.0); 76378a59e97SMatthew G. Knepley } 76478a59e97SMatthew G. Knepley #endif 765e489efc1SBarry Smith #endif 766