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 */ 1026bd1501SBarry Smith #if !defined(PETSCMATH_H) 1126bd1501SBarry Smith #define PETSCMATH_H 12ac09b921SBarry Smith 130a5f7794SBarry Smith #include <math.h> 14df4397b0SStefano Zampini #include <petscsystypes.h> 15df4397b0SStefano Zampini 16ac09b921SBarry Smith /* SUBMANSEC = Sys */ 17ac09b921SBarry Smith 185117d392SLisandro Dalcin /* 195117d392SLisandro Dalcin 205117d392SLisandro Dalcin Defines operations that are different for complex and real numbers. 215117d392SLisandro Dalcin All PETSc objects in one program are built around the object 225117d392SLisandro Dalcin PetscScalar which is either always a real or a complex. 235117d392SLisandro Dalcin 245117d392SLisandro Dalcin */ 255117d392SLisandro Dalcin 265117d392SLisandro Dalcin /* 275117d392SLisandro Dalcin Real number definitions 285117d392SLisandro Dalcin */ 295117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 305117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 315117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtf(a) 325117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypotf(a, b) 335117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2f(a, b) 345117d392SLisandro Dalcin #define PetscPowReal(a, b) powf(a, b) 355117d392SLisandro Dalcin #define PetscExpReal(a) expf(a) 365117d392SLisandro Dalcin #define PetscLogReal(a) logf(a) 375117d392SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 385117d392SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 395117d392SLisandro Dalcin #define PetscSinReal(a) sinf(a) 405117d392SLisandro Dalcin #define PetscCosReal(a) cosf(a) 415117d392SLisandro Dalcin #define PetscTanReal(a) tanf(a) 425117d392SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 435117d392SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 445117d392SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 455117d392SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 465117d392SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 475117d392SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 485117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhf(a) 495117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshf(a) 505117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhf(a) 51d6685f55SMatthew G. Knepley #define PetscErfReal(a) erff(a) 525117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 535117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 545117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmodf(a, b) 559c3ee494SJed Brown #define PetscCopysignReal(a, b) copysignf(a, b) 565117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 571f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 581f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 591f17fa70SToby Isaac #else 601f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 611f17fa70SToby Isaac #endif 625117d392SLisandro Dalcin 635117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 645117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrt(a) 655117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrt(a) 665117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypot(a, b) 675117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2(a, b) 685117d392SLisandro Dalcin #define PetscPowReal(a, b) pow(a, b) 695117d392SLisandro Dalcin #define PetscExpReal(a) exp(a) 705117d392SLisandro Dalcin #define PetscLogReal(a) log(a) 715117d392SLisandro Dalcin #define PetscLog10Real(a) log10(a) 725117d392SLisandro Dalcin #define PetscLog2Real(a) log2(a) 735117d392SLisandro Dalcin #define PetscSinReal(a) sin(a) 745117d392SLisandro Dalcin #define PetscCosReal(a) cos(a) 755117d392SLisandro Dalcin #define PetscTanReal(a) tan(a) 765117d392SLisandro Dalcin #define PetscAsinReal(a) asin(a) 775117d392SLisandro Dalcin #define PetscAcosReal(a) acos(a) 785117d392SLisandro Dalcin #define PetscAtanReal(a) atan(a) 795117d392SLisandro Dalcin #define PetscSinhReal(a) sinh(a) 805117d392SLisandro Dalcin #define PetscCoshReal(a) cosh(a) 815117d392SLisandro Dalcin #define PetscTanhReal(a) tanh(a) 825117d392SLisandro Dalcin #define PetscAsinhReal(a) asinh(a) 835117d392SLisandro Dalcin #define PetscAcoshReal(a) acosh(a) 845117d392SLisandro Dalcin #define PetscAtanhReal(a) atanh(a) 85d6685f55SMatthew G. Knepley #define PetscErfReal(a) erf(a) 865117d392SLisandro Dalcin #define PetscCeilReal(a) ceil(a) 875117d392SLisandro Dalcin #define PetscFloorReal(a) floor(a) 885117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmod(a, b) 899c3ee494SJed Brown #define PetscCopysignReal(a, b) copysign(a, b) 905117d392SLisandro Dalcin #define PetscTGamma(a) tgamma(a) 911f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 921f17fa70SToby Isaac #define PetscLGamma(a) gamma(a) 931f17fa70SToby Isaac #else 941f17fa70SToby Isaac #define PetscLGamma(a) lgamma(a) 951f17fa70SToby Isaac #endif 965117d392SLisandro Dalcin 975117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 985117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtq(a) 995117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtq(a) 1005117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypotq(a, b) 1015117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2q(a, b) 1025117d392SLisandro Dalcin #define PetscPowReal(a, b) powq(a, b) 1035117d392SLisandro Dalcin #define PetscExpReal(a) expq(a) 1045117d392SLisandro Dalcin #define PetscLogReal(a) logq(a) 1055117d392SLisandro Dalcin #define PetscLog10Real(a) log10q(a) 1065117d392SLisandro Dalcin #define PetscLog2Real(a) log2q(a) 1075117d392SLisandro Dalcin #define PetscSinReal(a) sinq(a) 1085117d392SLisandro Dalcin #define PetscCosReal(a) cosq(a) 1095117d392SLisandro Dalcin #define PetscTanReal(a) tanq(a) 1105117d392SLisandro Dalcin #define PetscAsinReal(a) asinq(a) 1115117d392SLisandro Dalcin #define PetscAcosReal(a) acosq(a) 1125117d392SLisandro Dalcin #define PetscAtanReal(a) atanq(a) 1135117d392SLisandro Dalcin #define PetscSinhReal(a) sinhq(a) 1145117d392SLisandro Dalcin #define PetscCoshReal(a) coshq(a) 1155117d392SLisandro Dalcin #define PetscTanhReal(a) tanhq(a) 1165117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhq(a) 1175117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshq(a) 1185117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhq(a) 119d6685f55SMatthew G. Knepley #define PetscErfReal(a) erfq(a) 1205117d392SLisandro Dalcin #define PetscCeilReal(a) ceilq(a) 1215117d392SLisandro Dalcin #define PetscFloorReal(a) floorq(a) 1225117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmodq(a, b) 1239c3ee494SJed Brown #define PetscCopysignReal(a, b) copysignq(a, b) 1245117d392SLisandro Dalcin #define PetscTGamma(a) tgammaq(a) 1251f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 1261f17fa70SToby Isaac #define PetscLGamma(a) gammaq(a) 1271f17fa70SToby Isaac #else 1281f17fa70SToby Isaac #define PetscLGamma(a) lgammaq(a) 1291f17fa70SToby Isaac #endif 1305117d392SLisandro Dalcin 1315117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 1325117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 1335117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtf(a) 1345117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypotf(a, b) 1355117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2f(a, b) 1365117d392SLisandro Dalcin #define PetscPowReal(a, b) powf(a, b) 1375117d392SLisandro Dalcin #define PetscExpReal(a) expf(a) 1385117d392SLisandro Dalcin #define PetscLogReal(a) logf(a) 1395117d392SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 1405117d392SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 1415117d392SLisandro Dalcin #define PetscSinReal(a) sinf(a) 1425117d392SLisandro Dalcin #define PetscCosReal(a) cosf(a) 1435117d392SLisandro Dalcin #define PetscTanReal(a) tanf(a) 1445117d392SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 1455117d392SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 1465117d392SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 1475117d392SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 1485117d392SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 1495117d392SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 1505117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhf(a) 1515117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshf(a) 1525117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhf(a) 153d6685f55SMatthew G. Knepley #define PetscErfReal(a) erff(a) 1545117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 1555117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 1565117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmodf(a, b) 1579c3ee494SJed Brown #define PetscCopySignReal(a, b) copysignf(a, b) 1585117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 1591f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 1601f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 1611f17fa70SToby Isaac #else 1621f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 1631f17fa70SToby Isaac #endif 1645117d392SLisandro Dalcin 1655117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 1665117d392SLisandro Dalcin 167*9371c9d4SSatish Balay static inline PetscReal PetscSignReal(PetscReal a) { 1685117d392SLisandro Dalcin return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0)); 1695117d392SLisandro Dalcin } 1705117d392SLisandro Dalcin 1715117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2) 1725117d392SLisandro Dalcin #undef PetscLog2Real 173*9371c9d4SSatish Balay static inline PetscReal PetscLog2Real(PetscReal a) { 1745117d392SLisandro Dalcin return PetscLogReal(a) / PetscLogReal((PetscReal)2); 1755117d392SLisandro Dalcin } 1765117d392SLisandro Dalcin #endif 1775117d392SLisandro Dalcin 178613bf2b2SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128) 1795117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PetscAttrMPITypeTag(__float128); 1805117d392SLisandro Dalcin #endif 1815117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FP16) 1825117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FP16 PetscAttrMPITypeTag(__fp16); 1835117d392SLisandro Dalcin #endif 1845117d392SLisandro Dalcin 185df4397b0SStefano Zampini /*MC 18687497f52SBarry Smith MPIU_REAL - Portable MPI datatype corresponding to `PetscReal` independent of what precision `PetscReal` is in 187df4397b0SStefano Zampini 188df4397b0SStefano Zampini Notes: 18987497f52SBarry Smith In MPI calls that require an MPI datatype that matches a `PetscReal` or array of `PetscReal` values, pass this value. 190df4397b0SStefano Zampini 191df4397b0SStefano Zampini Level: beginner 192df4397b0SStefano Zampini 193db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT` 194df4397b0SStefano Zampini M*/ 195c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE) 196c1d390e3SJed Brown #define MPIU_REAL MPI_FLOAT 197c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE) 198c1d390e3SJed Brown #define MPIU_REAL MPI_DOUBLE 199c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128) 200c1d390e3SJed Brown #define MPIU_REAL MPIU___FLOAT128 201570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 202570b7f6dSBarry Smith #define MPIU_REAL MPIU___FP16 203c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */ 20459cb5930SBarry Smith 2051093a601SBarry Smith /* 2061093a601SBarry Smith Complex number definitions 2071093a601SBarry Smith */ 208df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX) 209450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128) 2101093a601SBarry Smith /* C++ support of complex number */ 211b7940d39SSatish Balay 21250f81f78SJed Brown #define PetscRealPartComplex(a) (a).real() 21350f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag() 214df4397b0SStefano Zampini #define PetscAbsComplex(a) petsccomplexlib::abs(a) 2155117d392SLisandro Dalcin #define PetscArgComplex(a) petsccomplexlib::arg(a) 216df4397b0SStefano Zampini #define PetscConjComplex(a) petsccomplexlib::conj(a) 217df4397b0SStefano Zampini #define PetscSqrtComplex(a) petsccomplexlib::sqrt(a) 218df4397b0SStefano Zampini #define PetscPowComplex(a, b) petsccomplexlib::pow(a, b) 219df4397b0SStefano Zampini #define PetscExpComplex(a) petsccomplexlib::exp(a) 220df4397b0SStefano Zampini #define PetscLogComplex(a) petsccomplexlib::log(a) 221df4397b0SStefano Zampini #define PetscSinComplex(a) petsccomplexlib::sin(a) 222df4397b0SStefano Zampini #define PetscCosComplex(a) petsccomplexlib::cos(a) 2235117d392SLisandro Dalcin #define PetscTanComplex(a) petsccomplexlib::tan(a) 224df4397b0SStefano Zampini #define PetscAsinComplex(a) petsccomplexlib::asin(a) 225df4397b0SStefano Zampini #define PetscAcosComplex(a) petsccomplexlib::acos(a) 2265117d392SLisandro Dalcin #define PetscAtanComplex(a) petsccomplexlib::atan(a) 227df4397b0SStefano Zampini #define PetscSinhComplex(a) petsccomplexlib::sinh(a) 228df4397b0SStefano Zampini #define PetscCoshComplex(a) petsccomplexlib::cosh(a) 229df4397b0SStefano Zampini #define PetscTanhComplex(a) petsccomplexlib::tanh(a) 2305117d392SLisandro Dalcin #define PetscAsinhComplex(a) petsccomplexlib::asinh(a) 2315117d392SLisandro Dalcin #define PetscAcoshComplex(a) petsccomplexlib::acosh(a) 2325117d392SLisandro Dalcin #define PetscAtanhComplex(a) petsccomplexlib::atanh(a) 2335117d392SLisandro Dalcin 2345117d392SLisandro Dalcin /* TODO: Add configure tests 2355117d392SLisandro Dalcin 2365117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX) 2375117d392SLisandro Dalcin #undef PetscTanComplex 2389fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanComplex(PetscComplex z) 2395117d392SLisandro Dalcin { 2405117d392SLisandro Dalcin return PetscSinComplex(z)/PetscCosComplex(z); 2415117d392SLisandro Dalcin } 242027d9794SBarry Smith #endif 243debe9ee2SPaul Mullowney 2445117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX) 2455117d392SLisandro Dalcin #undef PetscTanhComplex 2469fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanhComplex(PetscComplex z) 2475117d392SLisandro Dalcin { 2485117d392SLisandro Dalcin return PetscSinhComplex(z)/PetscCoshComplex(z); 2495117d392SLisandro Dalcin } 2505117d392SLisandro Dalcin #endif 2515117d392SLisandro Dalcin 2525117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX) 2535117d392SLisandro Dalcin #undef PetscAsinComplex 2549fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinComplex(PetscComplex z) 2555117d392SLisandro Dalcin { 2565117d392SLisandro Dalcin const PetscComplex j(0,1); 2575117d392SLisandro Dalcin return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z)); 2585117d392SLisandro Dalcin } 2595117d392SLisandro Dalcin #endif 2605117d392SLisandro Dalcin 2615117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX) 2625117d392SLisandro Dalcin #undef PetscAcosComplex 2639fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcosComplex(PetscComplex z) 2645117d392SLisandro Dalcin { 2655117d392SLisandro Dalcin const PetscComplex j(0,1); 2665117d392SLisandro Dalcin return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z)); 2675117d392SLisandro Dalcin } 2685117d392SLisandro Dalcin #endif 2695117d392SLisandro Dalcin 2705117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX) 2715117d392SLisandro Dalcin #undef PetscAtanComplex 2729fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanComplex(PetscComplex z) 2735117d392SLisandro Dalcin { 2745117d392SLisandro Dalcin const PetscComplex j(0,1); 2755117d392SLisandro Dalcin return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z)); 2765117d392SLisandro Dalcin } 2775117d392SLisandro Dalcin #endif 2785117d392SLisandro Dalcin 2795117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX) 2805117d392SLisandro Dalcin #undef PetscAsinhComplex 2819fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinhComplex(PetscComplex z) 2825117d392SLisandro Dalcin { 2835117d392SLisandro Dalcin return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f)); 2845117d392SLisandro Dalcin } 2855117d392SLisandro Dalcin #endif 2865117d392SLisandro Dalcin 2875117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX) 2885117d392SLisandro Dalcin #undef PetscAcoshComplex 2899fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcoshComplex(PetscComplex z) 2905117d392SLisandro Dalcin { 2915117d392SLisandro Dalcin return PetscLogComplex(z+PetscSqrtComplex(z*z-1.0f)); 2925117d392SLisandro Dalcin } 2935117d392SLisandro Dalcin #endif 2945117d392SLisandro Dalcin 2955117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATANH_COMPLEX) 2965117d392SLisandro Dalcin #undef PetscAtanhComplex 2979fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanhComplex(PetscComplex z) 2985117d392SLisandro Dalcin { 2995117d392SLisandro Dalcin return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z)); 3005117d392SLisandro Dalcin } 3015117d392SLisandro Dalcin #endif 3025117d392SLisandro Dalcin 3035117d392SLisandro Dalcin */ 3045117d392SLisandro Dalcin 3057a19d461SSatish Balay #else /* C99 support of complex number */ 306519e2a1fSPaul Mullowney 3077a19d461SSatish Balay #if defined(PETSC_USE_REAL_SINGLE) 30850f81f78SJed Brown #define PetscRealPartComplex(a) crealf(a) 30950f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a) 31050f81f78SJed Brown #define PetscAbsComplex(a) cabsf(a) 3115117d392SLisandro Dalcin #define PetscArgComplex(a) cargf(a) 31250f81f78SJed Brown #define PetscConjComplex(a) conjf(a) 31350f81f78SJed Brown #define PetscSqrtComplex(a) csqrtf(a) 31450f81f78SJed Brown #define PetscPowComplex(a, b) cpowf(a, b) 31550f81f78SJed Brown #define PetscExpComplex(a) cexpf(a) 31650f81f78SJed Brown #define PetscLogComplex(a) clogf(a) 31750f81f78SJed Brown #define PetscSinComplex(a) csinf(a) 31850f81f78SJed Brown #define PetscCosComplex(a) ccosf(a) 3195117d392SLisandro Dalcin #define PetscTanComplex(a) ctanf(a) 320255453a1SBarry Smith #define PetscAsinComplex(a) casinf(a) 321255453a1SBarry Smith #define PetscAcosComplex(a) cacosf(a) 3225117d392SLisandro Dalcin #define PetscAtanComplex(a) catanf(a) 323a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhf(a) 324a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshf(a) 325a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhf(a) 3265117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinhf(a) 3275117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacoshf(a) 3285117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanhf(a) 3291093a601SBarry Smith 330ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 33150f81f78SJed Brown #define PetscRealPartComplex(a) creal(a) 33250f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a) 33350f81f78SJed Brown #define PetscAbsComplex(a) cabs(a) 3345117d392SLisandro Dalcin #define PetscArgComplex(a) carg(a) 33550f81f78SJed Brown #define PetscConjComplex(a) conj(a) 33650f81f78SJed Brown #define PetscSqrtComplex(a) csqrt(a) 33750f81f78SJed Brown #define PetscPowComplex(a, b) cpow(a, b) 33850f81f78SJed Brown #define PetscExpComplex(a) cexp(a) 33950f81f78SJed Brown #define PetscLogComplex(a) clog(a) 34050f81f78SJed Brown #define PetscSinComplex(a) csin(a) 34150f81f78SJed Brown #define PetscCosComplex(a) ccos(a) 3425117d392SLisandro Dalcin #define PetscTanComplex(a) ctan(a) 343255453a1SBarry Smith #define PetscAsinComplex(a) casin(a) 344255453a1SBarry Smith #define PetscAcosComplex(a) cacos(a) 3455117d392SLisandro Dalcin #define PetscAtanComplex(a) catan(a) 346a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinh(a) 347a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccosh(a) 348a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanh(a) 3495117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinh(a) 3505117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacosh(a) 3515117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanh(a) 3521093a601SBarry Smith 3538c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128) 35450f81f78SJed Brown #define PetscRealPartComplex(a) crealq(a) 35550f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a) 35650f81f78SJed Brown #define PetscAbsComplex(a) cabsq(a) 3575117d392SLisandro Dalcin #define PetscArgComplex(a) cargq(a) 35850f81f78SJed Brown #define PetscConjComplex(a) conjq(a) 35950f81f78SJed Brown #define PetscSqrtComplex(a) csqrtq(a) 36050f81f78SJed Brown #define PetscPowComplex(a, b) cpowq(a, b) 36150f81f78SJed Brown #define PetscExpComplex(a) cexpq(a) 36250f81f78SJed Brown #define PetscLogComplex(a) clogq(a) 36350f81f78SJed Brown #define PetscSinComplex(a) csinq(a) 36450f81f78SJed Brown #define PetscCosComplex(a) ccosq(a) 3655117d392SLisandro Dalcin #define PetscTanComplex(a) ctanq(a) 366255453a1SBarry Smith #define PetscAsinComplex(a) casinq(a) 367255453a1SBarry Smith #define PetscAcosComplex(a) cacosq(a) 3685117d392SLisandro Dalcin #define PetscAtanComplex(a) catanq(a) 369a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhq(a) 370a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshq(a) 371a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhq(a) 3725117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinhq(a) 3735117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacoshq(a) 3745117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanhq(a) 375a4bea5a6SPeter Brune 376ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */ 3777a19d461SSatish Balay #endif /* (__cplusplus) */ 378e489efc1SBarry Smith 3791093a601SBarry Smith /* 3805117d392SLisandro Dalcin PETSC_i is the imaginary number, i 3811093a601SBarry Smith */ 38250f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i; 3838a351411SToby Isaac 3845117d392SLisandro Dalcin /* 3855117d392SLisandro Dalcin Try to do the right thing for complex number construction: see 3868a351411SToby Isaac http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm 3878a351411SToby Isaac for details 3888a351411SToby Isaac */ 389*9371c9d4SSatish Balay static inline PetscComplex PetscCMPLX(PetscReal x, PetscReal y) { 390450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128) 3918a351411SToby Isaac return PetscComplex(x, y); 3928a351411SToby Isaac #elif defined(_Imaginary_I) 3938a351411SToby Isaac return x + y * _Imaginary_I; 3948a351411SToby Isaac #else 395616d7c5eSToby Isaac { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5), 396616d7c5eSToby Isaac 397616d7c5eSToby Isaac "For each floating type there is a corresponding real type, which is always a real floating 398616d7c5eSToby Isaac type. For real floating types, it is the same type. For complex types, it is the type given 399616d7c5eSToby Isaac by deleting the keyword _Complex from the type name." 400616d7c5eSToby Isaac 401616d7c5eSToby Isaac So type punning should be portable. */ 402*9371c9d4SSatish Balay union 403*9371c9d4SSatish Balay { 404*9371c9d4SSatish Balay PetscComplex z; 405*9371c9d4SSatish Balay PetscReal f[2]; 406*9371c9d4SSatish Balay } uz; 407616d7c5eSToby Isaac 408616d7c5eSToby Isaac uz.f[0] = x; 409616d7c5eSToby Isaac uz.f[1] = y; 410616d7c5eSToby Isaac return uz.z; 411616d7c5eSToby Isaac } 41250f81f78SJed Brown #endif 4138a351411SToby Isaac } 4148a351411SToby Isaac 415de272c7aSSatish Balay #define MPIU_C_COMPLEX MPI_C_COMPLEX PETSC_DEPRECATED_MACRO("GCC warning \"MPIU_C_COMPLEX macro is deprecated use MPI_C_COMPLEX (since version 3.15)\"") 416de272c7aSSatish Balay #define MPIU_C_DOUBLE_COMPLEX MPI_C_DOUBLE_COMPLEX PETSC_DEPRECATED_MACRO("GCC warning \"MPIU_C_DOUBLE_COMPLEX macro is deprecated use MPI_C_DOUBLE_COMPLEX (since version 3.15)\"") 417de272c7aSSatish Balay 418613bf2b2SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128) 4195117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 PetscAttrMPITypeTag(__complex128); 420613bf2b2SPierre Jolivet #endif /* PETSC_HAVE_REAL___FLOAT128 */ 4215117d392SLisandro Dalcin 4225117d392SLisandro Dalcin /*MC 42387497f52SBarry Smith MPIU_COMPLEX - Portable MPI datatype corresponding to `PetscComplex` independent of the precision of `PetscComplex` 4245117d392SLisandro Dalcin 4255117d392SLisandro Dalcin Notes: 42687497f52SBarry Smith In MPI calls that require an MPI datatype that matches a `PetscComplex` or array of `PetscComplex` values, pass this value. 4275117d392SLisandro Dalcin 4285117d392SLisandro Dalcin Level: beginner 4295117d392SLisandro Dalcin 430db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`, `PETSC_i` 4315117d392SLisandro Dalcin M*/ 4325117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 433de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_COMPLEX 4345117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 435de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX 4365117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 4375117d392SLisandro Dalcin #define MPIU_COMPLEX MPIU___COMPLEX128 4385117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 439de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_COMPLEX 4405117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 4415117d392SLisandro Dalcin 4425117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */ 4435117d392SLisandro Dalcin 4445117d392SLisandro Dalcin /* 4455117d392SLisandro Dalcin Scalar number definitions 4465117d392SLisandro Dalcin */ 4477a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX) 4485117d392SLisandro Dalcin /*MC 44987497f52SBarry Smith MPIU_SCALAR - Portable MPI datatype corresponding to `PetscScalar` independent of the precision of `PetscScalar` 4505117d392SLisandro Dalcin 4515117d392SLisandro Dalcin Notes: 45287497f52SBarry Smith In MPI calls that require an MPI datatype that matches a `PetscScalar` or array of `PetscScalar` values, pass this value. 4535117d392SLisandro Dalcin 4545117d392SLisandro Dalcin Level: beginner 4555117d392SLisandro Dalcin 456db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_COMPLEX`, `MPIU_INT` 4575117d392SLisandro Dalcin M*/ 4585117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX 4595117d392SLisandro Dalcin 4605117d392SLisandro Dalcin /*MC 46187497f52SBarry Smith PetscRealPart - Returns the real part of a `PetscScalar` 4625117d392SLisandro Dalcin 4635117d392SLisandro Dalcin Synopsis: 4645117d392SLisandro Dalcin #include <petscmath.h> 4655117d392SLisandro Dalcin PetscReal PetscRealPart(PetscScalar v) 4665117d392SLisandro Dalcin 4675117d392SLisandro Dalcin Not Collective 4685117d392SLisandro Dalcin 4695117d392SLisandro Dalcin Input Parameter: 4705117d392SLisandro Dalcin . v - value to find the real part of 4715117d392SLisandro Dalcin 4725117d392SLisandro Dalcin Level: beginner 4735117d392SLisandro Dalcin 474db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscImaginaryPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 4755117d392SLisandro Dalcin 4765117d392SLisandro Dalcin M*/ 4775117d392SLisandro Dalcin #define PetscRealPart(a) PetscRealPartComplex(a) 4785117d392SLisandro Dalcin 4795117d392SLisandro Dalcin /*MC 48087497f52SBarry Smith PetscImaginaryPart - Returns the imaginary part of a `PetscScalar` 4815117d392SLisandro Dalcin 4825117d392SLisandro Dalcin Synopsis: 4835117d392SLisandro Dalcin #include <petscmath.h> 4845117d392SLisandro Dalcin PetscReal PetscImaginaryPart(PetscScalar v) 4855117d392SLisandro Dalcin 4865117d392SLisandro Dalcin Not Collective 4875117d392SLisandro Dalcin 4885117d392SLisandro Dalcin Input Parameter: 4895117d392SLisandro Dalcin . v - value to find the imaginary part of 4905117d392SLisandro Dalcin 4915117d392SLisandro Dalcin Level: beginner 4925117d392SLisandro Dalcin 4935117d392SLisandro Dalcin Notes: 4945117d392SLisandro Dalcin If PETSc was configured for real numbers then this always returns the value 0 4955117d392SLisandro Dalcin 496db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscRealPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 4975117d392SLisandro Dalcin 4985117d392SLisandro Dalcin M*/ 4995117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a) 5005117d392SLisandro Dalcin 5015117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsComplex(a) 5025117d392SLisandro Dalcin #define PetscArgScalar(a) PetscArgComplex(a) 5035117d392SLisandro Dalcin #define PetscConj(a) PetscConjComplex(a) 5045117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtComplex(a) 5055117d392SLisandro Dalcin #define PetscPowScalar(a, b) PetscPowComplex(a, b) 5065117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpComplex(a) 5075117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogComplex(a) 5085117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinComplex(a) 5095117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosComplex(a) 5105117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanComplex(a) 5115117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinComplex(a) 5125117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosComplex(a) 5135117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanComplex(a) 5145117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhComplex(a) 5155117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshComplex(a) 5165117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhComplex(a) 5175117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhComplex(a) 5185117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshComplex(a) 5195117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhComplex(a) 5205117d392SLisandro Dalcin 5215117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */ 5225117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_REAL 5235117d392SLisandro Dalcin #define PetscRealPart(a) (a) 5245117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0) 5255117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsReal(a) 5265117d392SLisandro Dalcin #define PetscArgScalar(a) (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0) 5275117d392SLisandro Dalcin #define PetscConj(a) (a) 5285117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtReal(a) 5295117d392SLisandro Dalcin #define PetscPowScalar(a, b) PetscPowReal(a, b) 5305117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpReal(a) 5315117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogReal(a) 5325117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinReal(a) 5335117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosReal(a) 5345117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanReal(a) 5355117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinReal(a) 5365117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosReal(a) 5375117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanReal(a) 5385117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhReal(a) 5395117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshReal(a) 5405117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhReal(a) 5415117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhReal(a) 5425117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshReal(a) 5435117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhReal(a) 5445117d392SLisandro Dalcin 5455117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */ 5465117d392SLisandro Dalcin 5475117d392SLisandro Dalcin /* 5485117d392SLisandro Dalcin Certain objects may be created using either single or double precision. 5495117d392SLisandro Dalcin This is currently not used. 5505117d392SLisandro Dalcin */ 551*9371c9d4SSatish Balay typedef enum { 552*9371c9d4SSatish Balay PETSC_SCALAR_DOUBLE, 553*9371c9d4SSatish Balay PETSC_SCALAR_SINGLE, 554*9371c9d4SSatish Balay PETSC_SCALAR_LONG_DOUBLE, 555*9371c9d4SSatish Balay PETSC_SCALAR_HALF 556*9371c9d4SSatish Balay } PetscScalarPrecision; 5575117d392SLisandro Dalcin 5585117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/ 5595117d392SLisandro Dalcin 5605117d392SLisandro Dalcin /*MC 5615117d392SLisandro Dalcin PetscAbs - Returns the absolute value of a number 5625117d392SLisandro Dalcin 5635117d392SLisandro Dalcin Synopsis: 5645117d392SLisandro Dalcin #include <petscmath.h> 5655117d392SLisandro Dalcin type PetscAbs(type v) 5665117d392SLisandro Dalcin 5675117d392SLisandro Dalcin Not Collective 5685117d392SLisandro Dalcin 5695117d392SLisandro Dalcin Input Parameter: 5705117d392SLisandro Dalcin . v - the number 5715117d392SLisandro Dalcin 57287497f52SBarry Smith Note: 57387497f52SBarry Smith The type can be integer or real floating point value, but cannot be complex 5745117d392SLisandro Dalcin 5755117d392SLisandro Dalcin Level: beginner 5765117d392SLisandro Dalcin 577db781477SPatrick Sanan .seealso: `PetscAbsInt()`, `PetscAbsReal()`, `PetscAbsScalar()` 5785117d392SLisandro Dalcin 5795117d392SLisandro Dalcin M*/ 5805117d392SLisandro Dalcin #define PetscAbs(a) (((a) >= 0) ? (a) : (-(a))) 5815117d392SLisandro Dalcin 5825117d392SLisandro Dalcin /*MC 5835117d392SLisandro Dalcin PetscSign - Returns the sign of a number as an integer 5845117d392SLisandro Dalcin 5855117d392SLisandro Dalcin Synopsis: 5865117d392SLisandro Dalcin #include <petscmath.h> 5875117d392SLisandro Dalcin int PetscSign(type v) 5885117d392SLisandro Dalcin 5895117d392SLisandro Dalcin Not Collective 5905117d392SLisandro Dalcin 5915117d392SLisandro Dalcin Input Parameter: 5925117d392SLisandro Dalcin . v - the number 5935117d392SLisandro Dalcin 59487497f52SBarry Smith Note: 59587497f52SBarry Smith The type can be integer or real floating point value 5965117d392SLisandro Dalcin 5975117d392SLisandro Dalcin Level: beginner 5985117d392SLisandro Dalcin 5995117d392SLisandro Dalcin M*/ 6005117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1) 601e489efc1SBarry Smith 602b6a5bde7SBarry Smith /*MC 603b6a5bde7SBarry Smith PetscMin - Returns minimum of two numbers 604b6a5bde7SBarry Smith 605eca87e8dSBarry Smith Synopsis: 606aaa7dc30SBarry Smith #include <petscmath.h> 607eca87e8dSBarry Smith type PetscMin(type v1,type v2) 608eca87e8dSBarry Smith 609eca87e8dSBarry Smith Not Collective 610eca87e8dSBarry Smith 611d8d19677SJose E. Roman Input Parameters: 612b6a5bde7SBarry Smith + v1 - first value to find minimum of 613b6a5bde7SBarry Smith - v2 - second value to find minimum of 614b6a5bde7SBarry Smith 61587497f52SBarry Smith Note: 61687497f52SBarry Smith The type can be integer or floating point value 617b6a5bde7SBarry Smith 618b6a5bde7SBarry Smith Level: beginner 619b6a5bde7SBarry Smith 620db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 621b6a5bde7SBarry Smith 622b6a5bde7SBarry Smith M*/ 623e489efc1SBarry Smith #define PetscMin(a, b) (((a) < (b)) ? (a) : (b)) 624b6a5bde7SBarry Smith 625b6a5bde7SBarry Smith /*MC 626b6a5bde7SBarry Smith PetscMax - Returns maxium of two numbers 627b6a5bde7SBarry Smith 628eca87e8dSBarry Smith Synopsis: 629aaa7dc30SBarry Smith #include <petscmath.h> 630eca87e8dSBarry Smith type max PetscMax(type v1,type v2) 631eca87e8dSBarry Smith 632eca87e8dSBarry Smith Not Collective 633eca87e8dSBarry Smith 634d8d19677SJose E. Roman Input Parameters: 635b6a5bde7SBarry Smith + v1 - first value to find maximum of 636b6a5bde7SBarry Smith - v2 - second value to find maximum of 637b6a5bde7SBarry Smith 63887497f52SBarry Smith Note: 63987497f52SBarry Smith The type can be integer or floating point value 640b6a5bde7SBarry Smith 641b6a5bde7SBarry Smith Level: beginner 642b6a5bde7SBarry Smith 643db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 644b6a5bde7SBarry Smith 645b6a5bde7SBarry Smith M*/ 646e489efc1SBarry Smith #define PetscMax(a, b) (((a) < (b)) ? (b) : (a)) 647b6a5bde7SBarry Smith 648b6a5bde7SBarry Smith /*MC 649d9a4bb16SJed Brown PetscClipInterval - Returns a number clipped to be within an interval 650d9a4bb16SJed Brown 651d9a4bb16SJed Brown Synopsis: 652aaa7dc30SBarry Smith #include <petscmath.h> 653d9a4bb16SJed Brown type clip PetscClipInterval(type x,type a,type b) 654d9a4bb16SJed Brown 655d9a4bb16SJed Brown Not Collective 656d9a4bb16SJed Brown 657d8d19677SJose E. Roman Input Parameters: 6580d398bfeSStefano Zampini + x - value to use if within interval [a,b] 659d9a4bb16SJed Brown . a - lower end of interval 660d9a4bb16SJed Brown - b - upper end of interval 661d9a4bb16SJed Brown 66287497f52SBarry Smith Note: 66387497f52SBarry Smith The type can be integer or floating point value 664d9a4bb16SJed Brown 665d9a4bb16SJed Brown Level: beginner 666d9a4bb16SJed Brown 667db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscMax()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 668d9a4bb16SJed Brown 669d9a4bb16SJed Brown M*/ 670d9a4bb16SJed Brown #define PetscClipInterval(x, a, b) (PetscMax((a), PetscMin((x), (b)))) 671d9a4bb16SJed Brown 672d9a4bb16SJed Brown /*MC 673b6a5bde7SBarry Smith PetscAbsInt - Returns the absolute value of an integer 674b6a5bde7SBarry Smith 675b6a5bde7SBarry Smith Synopsis: 676aaa7dc30SBarry Smith #include <petscmath.h> 677b6a5bde7SBarry Smith int abs PetscAbsInt(int v1) 678b6a5bde7SBarry Smith 679eca87e8dSBarry Smith Input Parameter: 680eca87e8dSBarry Smith . v1 - the integer 681b6a5bde7SBarry Smith 682b6a5bde7SBarry Smith Level: beginner 683b6a5bde7SBarry Smith 684db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsReal()`, `PetscSqr()` 685b6a5bde7SBarry Smith 686b6a5bde7SBarry Smith M*/ 6879fa7d148SSatish Balay #define PetscAbsInt(a) (((a) < 0) ? (-(a)) : (a)) 688b6a5bde7SBarry Smith 689b6a5bde7SBarry Smith /*MC 690b6a5bde7SBarry Smith PetscAbsReal - Returns the absolute value of an real number 691b6a5bde7SBarry Smith 692eca87e8dSBarry Smith Synopsis: 693aaa7dc30SBarry Smith #include <petscmath.h> 694eca87e8dSBarry Smith Real abs PetscAbsReal(PetscReal v1) 695eca87e8dSBarry Smith 696b6a5bde7SBarry Smith Input Parameter: 697b6a5bde7SBarry Smith . v1 - the double 698b6a5bde7SBarry Smith 699b6a5bde7SBarry Smith Level: beginner 700b6a5bde7SBarry Smith 701db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscSqr()` 702b6a5bde7SBarry Smith 703b6a5bde7SBarry Smith M*/ 7041118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 7051118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 7061118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 7071118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a) 7081118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 7091118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a) 7101118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7111118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 7121118d4bcSLisandro Dalcin #endif 713b6a5bde7SBarry Smith 714b6a5bde7SBarry Smith /*MC 715b6a5bde7SBarry Smith PetscSqr - Returns the square of a number 716b6a5bde7SBarry Smith 717b6a5bde7SBarry Smith Synopsis: 718aaa7dc30SBarry Smith #include <petscmath.h> 719b6a5bde7SBarry Smith type sqr PetscSqr(type v1) 720b6a5bde7SBarry Smith 721eca87e8dSBarry Smith Not Collective 722eca87e8dSBarry Smith 723eca87e8dSBarry Smith Input Parameter: 724eca87e8dSBarry Smith . v1 - the value 725eca87e8dSBarry Smith 72687497f52SBarry Smith Note: 72787497f52SBarry Smith The type can be integer or floating point value 728b6a5bde7SBarry Smith 729b6a5bde7SBarry Smith Level: beginner 730b6a5bde7SBarry Smith 731db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()` 732b6a5bde7SBarry Smith 733b6a5bde7SBarry Smith M*/ 7344ebda54eSMatthew Knepley #define PetscSqr(a) ((a) * (a)) 735e489efc1SBarry Smith 736314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 737ee223c85SLisandro Dalcin 738ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 739ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F 7405117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 7415117d392SLisandro Dalcin #define PetscRealConstant(constant) constant 742ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 743ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q 7445117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7455117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F 746ee223c85SLisandro Dalcin #endif 747ee223c85SLisandro Dalcin 748314da920SBarry Smith /* 749d34fcf5fSBarry Smith Basic constants 750314da920SBarry Smith */ 7512fab75feSLisandro Dalcin #define PETSC_PI PetscRealConstant(3.1415926535897932384626433832795029) 7522fab75feSLisandro Dalcin #define PETSC_PHI PetscRealConstant(1.6180339887498948482045868343656381) 7537b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981) 754d34fcf5fSBarry Smith 755ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 75671fd2e92SBarry Smith #define PETSC_MAX_INT 2147483647 757ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 758ab824b78SBarry Smith #else 759ab824b78SBarry Smith #define PETSC_MAX_INT 9223372036854775807L 760ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 761ab824b78SBarry Smith #endif 762569ea7c4SPierre Jolivet #define PETSC_MAX_UINT16 65535 763e489efc1SBarry Smith 764ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 765ab824b78SBarry Smith #define PETSC_MAX_REAL 3.40282346638528860e+38F 7669fa7d148SSatish Balay #define PETSC_MIN_REAL (-PETSC_MAX_REAL) 76782a7e548SBarry Smith #define PETSC_MACHINE_EPSILON 1.19209290e-07F 76882a7e548SBarry Smith #define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F 769ee223c85SLisandro Dalcin #define PETSC_SMALL 1.e-5F 770ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 771ab824b78SBarry Smith #define PETSC_MAX_REAL 1.7976931348623157e+308 7729fa7d148SSatish Balay #define PETSC_MIN_REAL (-PETSC_MAX_REAL) 77382a7e548SBarry Smith #define PETSC_MACHINE_EPSILON 2.2204460492503131e-16 77482a7e548SBarry Smith #define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08 775cf6e855fSSatish Balay #define PETSC_SMALL 1.e-10 776ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 777ea345e14SBarry Smith #define PETSC_MAX_REAL FLT128_MAX 7789fa7d148SSatish Balay #define PETSC_MIN_REAL (-FLT128_MAX) 779d34fcf5fSBarry Smith #define PETSC_MACHINE_EPSILON FLT128_EPSILON 780ee223c85SLisandro Dalcin #define PETSC_SQRT_MACHINE_EPSILON 1.38777878078144567552953958511352539e-17Q 781ee223c85SLisandro Dalcin #define PETSC_SMALL 1.e-20Q 7825117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7835117d392SLisandro Dalcin #define PETSC_MAX_REAL 65504.0F 7849fa7d148SSatish Balay #define PETSC_MIN_REAL (-PETSC_MAX_REAL) 7855117d392SLisandro Dalcin #define PETSC_MACHINE_EPSILON .0009765625F 7865117d392SLisandro Dalcin #define PETSC_SQRT_MACHINE_EPSILON .03125F 7875117d392SLisandro Dalcin #define PETSC_SMALL 5.e-3F 7889cf09972SJed Brown #endif 7893e523bebSBarry Smith 79025d0f998SSatish Balay #define PETSC_INFINITY (PETSC_MAX_REAL / 4) 7919fa7d148SSatish Balay #define PETSC_NINFINITY (-PETSC_INFINITY) 792e270355aSBarry Smith 7939f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsInfReal(PetscReal); 7943948c36eSLisandro Dalcin PETSC_EXTERN PetscBool PetscIsNanReal(PetscReal); 7958b49ba18SBarry Smith PETSC_EXTERN PetscBool PetscIsNormalReal(PetscReal); 796*9371c9d4SSatish Balay static inline PetscBool PetscIsInfOrNanReal(PetscReal v) { 797*9371c9d4SSatish Balay return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE; 798*9371c9d4SSatish Balay } 799*9371c9d4SSatish Balay static inline PetscBool PetscIsInfScalar(PetscScalar v) { 800*9371c9d4SSatish Balay return PetscIsInfReal(PetscAbsScalar(v)); 801*9371c9d4SSatish Balay } 802*9371c9d4SSatish Balay static inline PetscBool PetscIsNanScalar(PetscScalar v) { 803*9371c9d4SSatish Balay return PetscIsNanReal(PetscAbsScalar(v)); 804*9371c9d4SSatish Balay } 805*9371c9d4SSatish Balay static inline PetscBool PetscIsInfOrNanScalar(PetscScalar v) { 806*9371c9d4SSatish Balay return PetscIsInfOrNanReal(PetscAbsScalar(v)); 807*9371c9d4SSatish Balay } 808*9371c9d4SSatish Balay static inline PetscBool PetscIsNormalScalar(PetscScalar v) { 809*9371c9d4SSatish Balay return PetscIsNormalReal(PetscAbsScalar(v)); 810*9371c9d4SSatish Balay } 8119a25a3ccSBarry Smith 812b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal, PetscReal, PetscReal, PetscReal); 813ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal, PetscReal); 814ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar, PetscScalar); 815ce4818fdSLisandro Dalcin 81698725619SBarry Smith /* 81798725619SBarry Smith These macros are currently hardwired to match the regular data types, so there is no support for a different 81898725619SBarry Smith MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again. 81998725619SBarry Smith */ 82098725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR 82198725619SBarry Smith typedef PetscScalar MatScalar; 82298725619SBarry Smith typedef PetscReal MatReal; 82398725619SBarry Smith 824*9371c9d4SSatish Balay struct petsc_mpiu_2scalar { 825*9371c9d4SSatish Balay PetscScalar a, b; 826*9371c9d4SSatish Balay }; 8278ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2scalar); 828df4397b0SStefano Zampini 829092991acSStefano Zampini /* 830092991acSStefano Zampini MPI Datatypes for composite reductions: 831092991acSStefano Zampini MPIU_REAL_INT -> struct { PetscReal; PetscInt; } 832092991acSStefano Zampini MPIU_SCALAR_INT -> struct { PetscScalar; PetscInt; } 833092991acSStefano Zampini */ 834092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_REAL_INT; 835092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT; 836092991acSStefano Zampini 837a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES) 838*9371c9d4SSatish Balay struct petsc_mpiu_2int { 839*9371c9d4SSatish Balay PetscInt a, b; 840*9371c9d4SSatish Balay }; 8418ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2int); 8428ad47952SJed Brown #else 8438ad47952SJed Brown #define MPIU_2INT MPI_2INT 8448ad47952SJed Brown #endif 845b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPI_4INT; 846b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPIU_4INT; 847e9fa29b7SSatish Balay 848*9371c9d4SSatish Balay static inline PetscInt PetscPowInt(PetscInt base, PetscInt power) { 849fa711258SJed Brown PetscInt result = 1; 850fa711258SJed Brown while (power) { 851fa711258SJed Brown if (power & 1) result *= base; 852fa711258SJed Brown power >>= 1; 853fa711258SJed Brown base *= base; 854fa711258SJed Brown } 855fa711258SJed Brown return result; 856fa711258SJed Brown } 857b2fb0278SBarry Smith 858*9371c9d4SSatish Balay static inline PetscInt64 PetscPowInt64(PetscInt base, PetscInt power) { 859ad70a4c3SStefano Zampini PetscInt64 result = 1; 860ad70a4c3SStefano Zampini while (power) { 861ad70a4c3SStefano Zampini if (power & 1) result *= base; 862ad70a4c3SStefano Zampini power >>= 1; 863ad70a4c3SStefano Zampini base *= base; 864ad70a4c3SStefano Zampini } 865ad70a4c3SStefano Zampini return result; 866ad70a4c3SStefano Zampini } 867ad70a4c3SStefano Zampini 868*9371c9d4SSatish Balay static inline PetscReal PetscPowRealInt(PetscReal base, PetscInt power) { 869fa711258SJed Brown PetscReal result = 1; 870d98d5da7SBarry Smith if (power < 0) { 871d98d5da7SBarry Smith power = -power; 87210d40e53SLisandro Dalcin base = ((PetscReal)1) / base; 873d98d5da7SBarry Smith } 874fa711258SJed Brown while (power) { 875fa711258SJed Brown if (power & 1) result *= base; 876fa711258SJed Brown power >>= 1; 877fa711258SJed Brown base *= base; 878fa711258SJed Brown } 879fa711258SJed Brown return result; 880fa711258SJed Brown } 881fa711258SJed Brown 882*9371c9d4SSatish Balay static inline PetscScalar PetscPowScalarInt(PetscScalar base, PetscInt power) { 8835117d392SLisandro Dalcin PetscScalar result = (PetscReal)1; 8848b49ba18SBarry Smith if (power < 0) { 8858b49ba18SBarry Smith power = -power; 88610d40e53SLisandro Dalcin base = ((PetscReal)1) / base; 8878b49ba18SBarry Smith } 8888b49ba18SBarry Smith while (power) { 8898b49ba18SBarry Smith if (power & 1) result *= base; 8908b49ba18SBarry Smith power >>= 1; 8918b49ba18SBarry Smith base *= base; 8928b49ba18SBarry Smith } 8938b49ba18SBarry Smith return result; 8948b49ba18SBarry Smith } 8958b49ba18SBarry Smith 896*9371c9d4SSatish Balay static inline PetscScalar PetscPowScalarReal(PetscScalar base, PetscReal power) { 897b2fb0278SBarry Smith PetscScalar cpower = power; 898b2fb0278SBarry Smith return PetscPowScalar(base, cpower); 899b2fb0278SBarry Smith } 90078a59e97SMatthew G. Knepley 901c803a25aSBarry Smith /*MC 90266baab88SBarry Smith PetscApproximateLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers 903c803a25aSBarry Smith 904c803a25aSBarry Smith Synopsis: 905c803a25aSBarry Smith #include <petscmath.h> 90666baab88SBarry Smith bool PetscApproximateLTE(PetscReal x,constant float) 907c803a25aSBarry Smith 908c803a25aSBarry Smith Not Collective 909c803a25aSBarry Smith 910c803a25aSBarry Smith Input Parameters: 911c803a25aSBarry Smith + x - the variable 912c803a25aSBarry Smith - b - the constant float it is checking if x is less than or equal to 913c803a25aSBarry Smith 914c803a25aSBarry Smith Notes: 91587497f52SBarry Smith The fudge factor is the value `PETSC_SMALL` 916c803a25aSBarry Smith 917c803a25aSBarry Smith The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2 918c803a25aSBarry Smith 919c803a25aSBarry Smith This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact 920c803a25aSBarry Smith floating point results. 921c803a25aSBarry Smith 922c803a25aSBarry Smith Level: advanced 923c803a25aSBarry Smith 924db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateGTE()` 925c803a25aSBarry Smith 926c803a25aSBarry Smith M*/ 92766baab88SBarry Smith #define PetscApproximateLTE(x, b) ((x) <= (PetscRealConstant(b) + PETSC_SMALL)) 928c803a25aSBarry Smith 929c803a25aSBarry Smith /*MC 93066baab88SBarry Smith PetscApproximateGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers 931c803a25aSBarry Smith 932c803a25aSBarry Smith Synopsis: 933c803a25aSBarry Smith #include <petscmath.h> 93466baab88SBarry Smith bool PetscApproximateGTE(PetscReal x,constant float) 935c803a25aSBarry Smith 936c803a25aSBarry Smith Not Collective 937c803a25aSBarry Smith 938c803a25aSBarry Smith Input Parameters: 939c803a25aSBarry Smith + x - the variable 940c803a25aSBarry Smith - b - the constant float it is checking if x is greater than or equal to 941c803a25aSBarry Smith 942c803a25aSBarry Smith Notes: 94387497f52SBarry Smith The fudge factor is the value `PETSC_SMALL` 944c803a25aSBarry Smith 945c803a25aSBarry Smith The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2 946c803a25aSBarry Smith 947c803a25aSBarry Smith This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact 948c803a25aSBarry Smith floating point results. 949c803a25aSBarry Smith 950c803a25aSBarry Smith Level: advanced 951c803a25aSBarry Smith 952db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()` 953c803a25aSBarry Smith 954c803a25aSBarry Smith M*/ 95566baab88SBarry Smith #define PetscApproximateGTE(x, b) ((x) >= (PetscRealConstant(b) - PETSC_SMALL)) 956c803a25aSBarry Smith 957faa75363SBarry Smith /*MC 958faa75363SBarry Smith PetscCeilInt - Returns the ceiling of the quotation of two positive integers 959faa75363SBarry Smith 960faa75363SBarry Smith Synopsis: 961faa75363SBarry Smith #include <petscmath.h> 962faa75363SBarry Smith PetscInt PetscCeilInt(PetscInt x,PetscInt y) 963faa75363SBarry Smith 964faa75363SBarry Smith Not Collective 965faa75363SBarry Smith 966faa75363SBarry Smith Input Parameters: 967faa75363SBarry Smith + x - the numerator 968faa75363SBarry Smith - y - the denominator 969faa75363SBarry Smith 970faa75363SBarry Smith Level: advanced 971faa75363SBarry Smith 972db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()` 973faa75363SBarry Smith 974faa75363SBarry Smith M*/ 975faa75363SBarry Smith #define PetscCeilInt(x, y) ((((PetscInt)(x)) / ((PetscInt)(y))) + ((((PetscInt)(x)) % ((PetscInt)(y))) ? 1 : 0)) 976faa75363SBarry Smith 977faa75363SBarry Smith #define PetscCeilInt64(x, y) ((((PetscInt64)(x)) / ((PetscInt64)(y))) + ((((PetscInt64)(x)) % ((PetscInt64)(y))) ? 1 : 0)) 978faa75363SBarry Smith 979bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt, const PetscReal[], const PetscReal[], PetscReal *, PetscReal *); 980e489efc1SBarry Smith #endif 981