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 1126bd1501SBarry Smith #if !defined(PETSCMATH_H) 1226bd1501SBarry Smith #define PETSCMATH_H 130a5f7794SBarry Smith #include <math.h> 14df4397b0SStefano Zampini #include <petscsystypes.h> 15df4397b0SStefano Zampini 165117d392SLisandro Dalcin /* 175117d392SLisandro Dalcin 185117d392SLisandro Dalcin Defines operations that are different for complex and real numbers. 195117d392SLisandro Dalcin All PETSc objects in one program are built around the object 205117d392SLisandro Dalcin PetscScalar which is either always a real or a complex. 215117d392SLisandro Dalcin 225117d392SLisandro Dalcin */ 235117d392SLisandro Dalcin 245117d392SLisandro Dalcin /* 255117d392SLisandro Dalcin Real number definitions 265117d392SLisandro Dalcin */ 275117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 285117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 295117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtf(a) 305117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypotf(a,b) 315117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2f(a,b) 325117d392SLisandro Dalcin #define PetscPowReal(a,b) powf(a,b) 335117d392SLisandro Dalcin #define PetscExpReal(a) expf(a) 345117d392SLisandro Dalcin #define PetscLogReal(a) logf(a) 355117d392SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 365117d392SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 375117d392SLisandro Dalcin #define PetscSinReal(a) sinf(a) 385117d392SLisandro Dalcin #define PetscCosReal(a) cosf(a) 395117d392SLisandro Dalcin #define PetscTanReal(a) tanf(a) 405117d392SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 415117d392SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 425117d392SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 435117d392SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 445117d392SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 455117d392SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 465117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhf(a) 475117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshf(a) 485117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhf(a) 49*d6685f55SMatthew G. Knepley #define PetscErfReal(a) erff(a) 505117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 515117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 525117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmodf(a,b) 539c3ee494SJed Brown #define PetscCopysignReal(a,b) copysignf(a,b) 545117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 551f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 561f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 571f17fa70SToby Isaac #else 581f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 591f17fa70SToby Isaac #endif 605117d392SLisandro Dalcin 615117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 625117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrt(a) 635117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrt(a) 645117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypot(a,b) 655117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2(a,b) 665117d392SLisandro Dalcin #define PetscPowReal(a,b) pow(a,b) 675117d392SLisandro Dalcin #define PetscExpReal(a) exp(a) 685117d392SLisandro Dalcin #define PetscLogReal(a) log(a) 695117d392SLisandro Dalcin #define PetscLog10Real(a) log10(a) 705117d392SLisandro Dalcin #define PetscLog2Real(a) log2(a) 715117d392SLisandro Dalcin #define PetscSinReal(a) sin(a) 725117d392SLisandro Dalcin #define PetscCosReal(a) cos(a) 735117d392SLisandro Dalcin #define PetscTanReal(a) tan(a) 745117d392SLisandro Dalcin #define PetscAsinReal(a) asin(a) 755117d392SLisandro Dalcin #define PetscAcosReal(a) acos(a) 765117d392SLisandro Dalcin #define PetscAtanReal(a) atan(a) 775117d392SLisandro Dalcin #define PetscSinhReal(a) sinh(a) 785117d392SLisandro Dalcin #define PetscCoshReal(a) cosh(a) 795117d392SLisandro Dalcin #define PetscTanhReal(a) tanh(a) 805117d392SLisandro Dalcin #define PetscAsinhReal(a) asinh(a) 815117d392SLisandro Dalcin #define PetscAcoshReal(a) acosh(a) 825117d392SLisandro Dalcin #define PetscAtanhReal(a) atanh(a) 83*d6685f55SMatthew G. Knepley #define PetscErfReal(a) erf(a) 845117d392SLisandro Dalcin #define PetscCeilReal(a) ceil(a) 855117d392SLisandro Dalcin #define PetscFloorReal(a) floor(a) 865117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmod(a,b) 879c3ee494SJed Brown #define PetscCopysignReal(a,b) copysign(a,b) 885117d392SLisandro Dalcin #define PetscTGamma(a) tgamma(a) 891f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 901f17fa70SToby Isaac #define PetscLGamma(a) gamma(a) 911f17fa70SToby Isaac #else 921f17fa70SToby Isaac #define PetscLGamma(a) lgamma(a) 931f17fa70SToby Isaac #endif 945117d392SLisandro Dalcin 955117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 965117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtq(a) 975117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtq(a) 985117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypotq(a,b) 995117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2q(a,b) 1005117d392SLisandro Dalcin #define PetscPowReal(a,b) powq(a,b) 1015117d392SLisandro Dalcin #define PetscExpReal(a) expq(a) 1025117d392SLisandro Dalcin #define PetscLogReal(a) logq(a) 1035117d392SLisandro Dalcin #define PetscLog10Real(a) log10q(a) 1045117d392SLisandro Dalcin #define PetscLog2Real(a) log2q(a) 1055117d392SLisandro Dalcin #define PetscSinReal(a) sinq(a) 1065117d392SLisandro Dalcin #define PetscCosReal(a) cosq(a) 1075117d392SLisandro Dalcin #define PetscTanReal(a) tanq(a) 1085117d392SLisandro Dalcin #define PetscAsinReal(a) asinq(a) 1095117d392SLisandro Dalcin #define PetscAcosReal(a) acosq(a) 1105117d392SLisandro Dalcin #define PetscAtanReal(a) atanq(a) 1115117d392SLisandro Dalcin #define PetscSinhReal(a) sinhq(a) 1125117d392SLisandro Dalcin #define PetscCoshReal(a) coshq(a) 1135117d392SLisandro Dalcin #define PetscTanhReal(a) tanhq(a) 1145117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhq(a) 1155117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshq(a) 1165117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhq(a) 117*d6685f55SMatthew G. Knepley #define PetscErfReal(a) erfq(a) 1185117d392SLisandro Dalcin #define PetscCeilReal(a) ceilq(a) 1195117d392SLisandro Dalcin #define PetscFloorReal(a) floorq(a) 1205117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmodq(a,b) 1219c3ee494SJed Brown #define PetscCopysignReal(a,b) copysignq(a,b) 1225117d392SLisandro Dalcin #define PetscTGamma(a) tgammaq(a) 1231f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 1241f17fa70SToby Isaac #define PetscLGamma(a) gammaq(a) 1251f17fa70SToby Isaac #else 1261f17fa70SToby Isaac #define PetscLGamma(a) lgammaq(a) 1271f17fa70SToby Isaac #endif 1285117d392SLisandro Dalcin 1295117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 1305117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 1315117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtf(a) 1325117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypotf(a,b) 1335117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2f(a,b) 1345117d392SLisandro Dalcin #define PetscPowReal(a,b) powf(a,b) 1355117d392SLisandro Dalcin #define PetscExpReal(a) expf(a) 1365117d392SLisandro Dalcin #define PetscLogReal(a) logf(a) 1375117d392SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 1385117d392SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 1395117d392SLisandro Dalcin #define PetscSinReal(a) sinf(a) 1405117d392SLisandro Dalcin #define PetscCosReal(a) cosf(a) 1415117d392SLisandro Dalcin #define PetscTanReal(a) tanf(a) 1425117d392SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 1435117d392SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 1445117d392SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 1455117d392SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 1465117d392SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 1475117d392SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 1485117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhf(a) 1495117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshf(a) 1505117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhf(a) 151*d6685f55SMatthew G. Knepley #define PetscErfReal(a) erff(a) 1525117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 1535117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 1545117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmodf(a,b) 1559c3ee494SJed Brown #define PetscCopySignReal(a,b) copysignf(a,b) 1565117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 1571f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 1581f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 1591f17fa70SToby Isaac #else 1601f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 1611f17fa70SToby Isaac #endif 1625117d392SLisandro Dalcin 1635117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 1645117d392SLisandro Dalcin 1659fbee547SJacob Faibussowitsch static inline PetscReal PetscSignReal(PetscReal a) 1665117d392SLisandro Dalcin { 1675117d392SLisandro Dalcin return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0)); 1685117d392SLisandro Dalcin } 1695117d392SLisandro Dalcin 1705117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2) 1715117d392SLisandro Dalcin #undef PetscLog2Real 1729fbee547SJacob Faibussowitsch static inline PetscReal PetscLog2Real(PetscReal a) 1735117d392SLisandro Dalcin { 1745117d392SLisandro Dalcin return PetscLogReal(a)/PetscLogReal((PetscReal)2); 1755117d392SLisandro Dalcin } 1765117d392SLisandro Dalcin #endif 1775117d392SLisandro Dalcin 1785117d392SLisandro Dalcin #if defined(PETSC_USE_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 186df4397b0SStefano Zampini MPIU_REAL - MPI datatype corresponding to PetscReal 187df4397b0SStefano Zampini 188df4397b0SStefano Zampini Notes: 189df4397b0SStefano Zampini 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 193df4397b0SStefano Zampini .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 */ 3899fbee547SJacob Faibussowitsch static inline PetscComplex PetscCMPLX(PetscReal x, PetscReal y) 3908a351411SToby Isaac { 391450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128) 3928a351411SToby Isaac return PetscComplex(x,y); 3938a351411SToby Isaac #elif defined(_Imaginary_I) 3948a351411SToby Isaac return x + y * _Imaginary_I; 3958a351411SToby Isaac #else 396616d7c5eSToby Isaac { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5), 397616d7c5eSToby Isaac 398616d7c5eSToby Isaac "For each floating type there is a corresponding real type, which is always a real floating 399616d7c5eSToby Isaac type. For real floating types, it is the same type. For complex types, it is the type given 400616d7c5eSToby Isaac by deleting the keyword _Complex from the type name." 401616d7c5eSToby Isaac 402616d7c5eSToby Isaac So type punning should be portable. */ 403616d7c5eSToby Isaac union { PetscComplex z; PetscReal f[2]; } uz; 404616d7c5eSToby Isaac 405616d7c5eSToby Isaac uz.f[0] = x; 406616d7c5eSToby Isaac uz.f[1] = y; 407616d7c5eSToby Isaac return uz.z; 408616d7c5eSToby Isaac } 40950f81f78SJed Brown #endif 4108a351411SToby Isaac } 4118a351411SToby Isaac 412de272c7aSSatish 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)\"") 413de272c7aSSatish 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)\"") 414de272c7aSSatish Balay 4155117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 4165117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 PetscAttrMPITypeTag(__complex128); 4175117d392SLisandro Dalcin #endif /* PETSC_USE_REAL___FLOAT128 */ 4185117d392SLisandro Dalcin 4195117d392SLisandro Dalcin /*MC 4205117d392SLisandro Dalcin MPIU_COMPLEX - MPI datatype corresponding to PetscComplex 4215117d392SLisandro Dalcin 4225117d392SLisandro Dalcin Notes: 4235117d392SLisandro Dalcin In MPI calls that require an MPI datatype that matches a PetscComplex or array of PetscComplex values, pass this value. 4245117d392SLisandro Dalcin 4255117d392SLisandro Dalcin Level: beginner 4265117d392SLisandro Dalcin 4275117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i 4285117d392SLisandro Dalcin M*/ 4295117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 430de272c7aSSatish Balay # define MPIU_COMPLEX MPI_C_COMPLEX 4315117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 432de272c7aSSatish Balay # define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX 4335117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 4345117d392SLisandro Dalcin # define MPIU_COMPLEX MPIU___COMPLEX128 4355117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 436de272c7aSSatish Balay # define MPIU_COMPLEX MPI_C_COMPLEX 4375117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 4385117d392SLisandro Dalcin 4395117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */ 4405117d392SLisandro Dalcin 4415117d392SLisandro Dalcin /* 4425117d392SLisandro Dalcin Scalar number definitions 4435117d392SLisandro Dalcin */ 4447a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX) 4455117d392SLisandro Dalcin /*MC 4465117d392SLisandro Dalcin MPIU_SCALAR - MPI datatype corresponding to PetscScalar 4475117d392SLisandro Dalcin 4485117d392SLisandro Dalcin Notes: 4495117d392SLisandro Dalcin In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalar values, pass this value. 4505117d392SLisandro Dalcin 4515117d392SLisandro Dalcin Level: beginner 4525117d392SLisandro Dalcin 4535117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_COMPLEX, MPIU_INT 4545117d392SLisandro Dalcin M*/ 4555117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX 4565117d392SLisandro Dalcin 4575117d392SLisandro Dalcin /*MC 4585117d392SLisandro Dalcin PetscRealPart - Returns the real part of a PetscScalar 4595117d392SLisandro Dalcin 4605117d392SLisandro Dalcin Synopsis: 4615117d392SLisandro Dalcin #include <petscmath.h> 4625117d392SLisandro Dalcin PetscReal PetscRealPart(PetscScalar v) 4635117d392SLisandro Dalcin 4645117d392SLisandro Dalcin Not Collective 4655117d392SLisandro Dalcin 4665117d392SLisandro Dalcin Input Parameter: 4675117d392SLisandro Dalcin . v - value to find the real part of 4685117d392SLisandro Dalcin 4695117d392SLisandro Dalcin Level: beginner 4705117d392SLisandro Dalcin 4715117d392SLisandro Dalcin .seealso: PetscScalar, PetscImaginaryPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 4725117d392SLisandro Dalcin 4735117d392SLisandro Dalcin M*/ 4745117d392SLisandro Dalcin #define PetscRealPart(a) PetscRealPartComplex(a) 4755117d392SLisandro Dalcin 4765117d392SLisandro Dalcin /*MC 4775117d392SLisandro Dalcin PetscImaginaryPart - Returns the imaginary part of a PetscScalar 4785117d392SLisandro Dalcin 4795117d392SLisandro Dalcin Synopsis: 4805117d392SLisandro Dalcin #include <petscmath.h> 4815117d392SLisandro Dalcin PetscReal PetscImaginaryPart(PetscScalar v) 4825117d392SLisandro Dalcin 4835117d392SLisandro Dalcin Not Collective 4845117d392SLisandro Dalcin 4855117d392SLisandro Dalcin Input Parameter: 4865117d392SLisandro Dalcin . v - value to find the imaginary part of 4875117d392SLisandro Dalcin 4885117d392SLisandro Dalcin Level: beginner 4895117d392SLisandro Dalcin 4905117d392SLisandro Dalcin Notes: 4915117d392SLisandro Dalcin If PETSc was configured for real numbers then this always returns the value 0 4925117d392SLisandro Dalcin 4935117d392SLisandro Dalcin .seealso: PetscScalar, PetscRealPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 4945117d392SLisandro Dalcin 4955117d392SLisandro Dalcin M*/ 4965117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a) 4975117d392SLisandro Dalcin 4985117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsComplex(a) 4995117d392SLisandro Dalcin #define PetscArgScalar(a) PetscArgComplex(a) 5005117d392SLisandro Dalcin #define PetscConj(a) PetscConjComplex(a) 5015117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtComplex(a) 5025117d392SLisandro Dalcin #define PetscPowScalar(a,b) PetscPowComplex(a,b) 5035117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpComplex(a) 5045117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogComplex(a) 5055117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinComplex(a) 5065117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosComplex(a) 5075117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanComplex(a) 5085117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinComplex(a) 5095117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosComplex(a) 5105117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanComplex(a) 5115117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhComplex(a) 5125117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshComplex(a) 5135117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhComplex(a) 5145117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhComplex(a) 5155117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshComplex(a) 5165117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhComplex(a) 5175117d392SLisandro Dalcin 5185117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */ 5195117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_REAL 5205117d392SLisandro Dalcin #define PetscRealPart(a) (a) 5215117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0) 5225117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsReal(a) 5235117d392SLisandro Dalcin #define PetscArgScalar(a) (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0) 5245117d392SLisandro Dalcin #define PetscConj(a) (a) 5255117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtReal(a) 5265117d392SLisandro Dalcin #define PetscPowScalar(a,b) PetscPowReal(a,b) 5275117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpReal(a) 5285117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogReal(a) 5295117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinReal(a) 5305117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosReal(a) 5315117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanReal(a) 5325117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinReal(a) 5335117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosReal(a) 5345117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanReal(a) 5355117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhReal(a) 5365117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshReal(a) 5375117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhReal(a) 5385117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhReal(a) 5395117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshReal(a) 5405117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhReal(a) 5415117d392SLisandro Dalcin 5425117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */ 5435117d392SLisandro Dalcin 5445117d392SLisandro Dalcin /* 5455117d392SLisandro Dalcin Certain objects may be created using either single or double precision. 5465117d392SLisandro Dalcin This is currently not used. 5475117d392SLisandro Dalcin */ 5485117d392SLisandro Dalcin typedef enum { PETSC_SCALAR_DOUBLE, PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE, PETSC_SCALAR_HALF } PetscScalarPrecision; 5495117d392SLisandro Dalcin 5505117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/ 5515117d392SLisandro Dalcin 5525117d392SLisandro Dalcin /*MC 5535117d392SLisandro Dalcin PetscAbs - Returns the absolute value of a number 5545117d392SLisandro Dalcin 5555117d392SLisandro Dalcin Synopsis: 5565117d392SLisandro Dalcin #include <petscmath.h> 5575117d392SLisandro Dalcin type PetscAbs(type v) 5585117d392SLisandro Dalcin 5595117d392SLisandro Dalcin Not Collective 5605117d392SLisandro Dalcin 5615117d392SLisandro Dalcin Input Parameter: 5625117d392SLisandro Dalcin . v - the number 5635117d392SLisandro Dalcin 5645117d392SLisandro Dalcin Notes: 5655117d392SLisandro Dalcin type can be integer or real floating point value 5665117d392SLisandro Dalcin 5675117d392SLisandro Dalcin Level: beginner 5685117d392SLisandro Dalcin 5695117d392SLisandro Dalcin .seealso: PetscAbsInt(), PetscAbsReal(), PetscAbsScalar() 5705117d392SLisandro Dalcin 5715117d392SLisandro Dalcin M*/ 5725117d392SLisandro Dalcin #define PetscAbs(a) (((a) >= 0) ? (a) : (-(a))) 5735117d392SLisandro Dalcin 5745117d392SLisandro Dalcin /*MC 5755117d392SLisandro Dalcin PetscSign - Returns the sign of a number as an integer 5765117d392SLisandro Dalcin 5775117d392SLisandro Dalcin Synopsis: 5785117d392SLisandro Dalcin #include <petscmath.h> 5795117d392SLisandro Dalcin int PetscSign(type v) 5805117d392SLisandro Dalcin 5815117d392SLisandro Dalcin Not Collective 5825117d392SLisandro Dalcin 5835117d392SLisandro Dalcin Input Parameter: 5845117d392SLisandro Dalcin . v - the number 5855117d392SLisandro Dalcin 5865117d392SLisandro Dalcin Notes: 5875117d392SLisandro Dalcin type can be integer or real floating point value 5885117d392SLisandro Dalcin 5895117d392SLisandro Dalcin Level: beginner 5905117d392SLisandro Dalcin 5915117d392SLisandro Dalcin M*/ 5925117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1) 593e489efc1SBarry Smith 594b6a5bde7SBarry Smith /*MC 595b6a5bde7SBarry Smith PetscMin - Returns minimum of two numbers 596b6a5bde7SBarry Smith 597eca87e8dSBarry Smith Synopsis: 598aaa7dc30SBarry Smith #include <petscmath.h> 599eca87e8dSBarry Smith type PetscMin(type v1,type v2) 600eca87e8dSBarry Smith 601eca87e8dSBarry Smith Not Collective 602eca87e8dSBarry Smith 603d8d19677SJose E. Roman Input Parameters: 604b6a5bde7SBarry Smith + v1 - first value to find minimum of 605b6a5bde7SBarry Smith - v2 - second value to find minimum of 606b6a5bde7SBarry Smith 60795452b02SPatrick Sanan Notes: 60895452b02SPatrick Sanan type can be integer or floating point value 609b6a5bde7SBarry Smith 610b6a5bde7SBarry Smith Level: beginner 611b6a5bde7SBarry Smith 6121175f9beSHong Zhang .seealso: PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 613b6a5bde7SBarry Smith 614b6a5bde7SBarry Smith M*/ 615e489efc1SBarry Smith #define PetscMin(a,b) (((a)<(b)) ? (a) : (b)) 616b6a5bde7SBarry Smith 617b6a5bde7SBarry Smith /*MC 618b6a5bde7SBarry Smith PetscMax - Returns maxium of two numbers 619b6a5bde7SBarry Smith 620eca87e8dSBarry Smith Synopsis: 621aaa7dc30SBarry Smith #include <petscmath.h> 622eca87e8dSBarry Smith type max PetscMax(type v1,type v2) 623eca87e8dSBarry Smith 624eca87e8dSBarry Smith Not Collective 625eca87e8dSBarry Smith 626d8d19677SJose E. Roman Input Parameters: 627b6a5bde7SBarry Smith + v1 - first value to find maximum of 628b6a5bde7SBarry Smith - v2 - second value to find maximum of 629b6a5bde7SBarry Smith 63095452b02SPatrick Sanan Notes: 63195452b02SPatrick Sanan type can be integer or floating point value 632b6a5bde7SBarry Smith 633b6a5bde7SBarry Smith Level: beginner 634b6a5bde7SBarry Smith 635d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 636b6a5bde7SBarry Smith 637b6a5bde7SBarry Smith M*/ 638e489efc1SBarry Smith #define PetscMax(a,b) (((a)<(b)) ? (b) : (a)) 639b6a5bde7SBarry Smith 640b6a5bde7SBarry Smith /*MC 641d9a4bb16SJed Brown PetscClipInterval - Returns a number clipped to be within an interval 642d9a4bb16SJed Brown 643d9a4bb16SJed Brown Synopsis: 644aaa7dc30SBarry Smith #include <petscmath.h> 645d9a4bb16SJed Brown type clip PetscClipInterval(type x,type a,type b) 646d9a4bb16SJed Brown 647d9a4bb16SJed Brown Not Collective 648d9a4bb16SJed Brown 649d8d19677SJose E. Roman Input Parameters: 6500d398bfeSStefano Zampini + x - value to use if within interval [a,b] 651d9a4bb16SJed Brown . a - lower end of interval 652d9a4bb16SJed Brown - b - upper end of interval 653d9a4bb16SJed Brown 65495452b02SPatrick Sanan Notes: 65595452b02SPatrick Sanan type can be integer or floating point value 656d9a4bb16SJed Brown 657d9a4bb16SJed Brown Level: beginner 658d9a4bb16SJed Brown 659d9a4bb16SJed Brown .seealso: PetscMin(), PetscMax(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 660d9a4bb16SJed Brown 661d9a4bb16SJed Brown M*/ 662d9a4bb16SJed Brown #define PetscClipInterval(x,a,b) (PetscMax((a),PetscMin((x),(b)))) 663d9a4bb16SJed Brown 664d9a4bb16SJed Brown /*MC 665b6a5bde7SBarry Smith PetscAbsInt - Returns the absolute value of an integer 666b6a5bde7SBarry Smith 667b6a5bde7SBarry Smith Synopsis: 668aaa7dc30SBarry Smith #include <petscmath.h> 669b6a5bde7SBarry Smith int abs PetscAbsInt(int v1) 670b6a5bde7SBarry Smith 671eca87e8dSBarry Smith Not Collective 672eca87e8dSBarry Smith 673eca87e8dSBarry Smith Input Parameter: 674eca87e8dSBarry Smith . v1 - the integer 675b6a5bde7SBarry Smith 676b6a5bde7SBarry Smith Level: beginner 677b6a5bde7SBarry Smith 678b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr() 679b6a5bde7SBarry Smith 680b6a5bde7SBarry Smith M*/ 6819fa7d148SSatish Balay #define PetscAbsInt(a) (((a)<0) ? (-(a)) : (a)) 682b6a5bde7SBarry Smith 683b6a5bde7SBarry Smith /*MC 684b6a5bde7SBarry Smith PetscAbsReal - Returns the absolute value of an real number 685b6a5bde7SBarry Smith 686eca87e8dSBarry Smith Synopsis: 687aaa7dc30SBarry Smith #include <petscmath.h> 688eca87e8dSBarry Smith Real abs PetscAbsReal(PetscReal v1) 689eca87e8dSBarry Smith 690eca87e8dSBarry Smith Not Collective 691eca87e8dSBarry Smith 692b6a5bde7SBarry Smith Input Parameter: 693b6a5bde7SBarry Smith . v1 - the double 694b6a5bde7SBarry Smith 695b6a5bde7SBarry Smith Level: beginner 696b6a5bde7SBarry Smith 697b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr() 698b6a5bde7SBarry Smith 699b6a5bde7SBarry Smith M*/ 7001118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 7011118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 7021118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 7031118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a) 7041118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 7051118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a) 7061118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7071118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 7081118d4bcSLisandro Dalcin #endif 709b6a5bde7SBarry Smith 710b6a5bde7SBarry Smith /*MC 711b6a5bde7SBarry Smith PetscSqr - Returns the square of a number 712b6a5bde7SBarry Smith 713b6a5bde7SBarry Smith Synopsis: 714aaa7dc30SBarry Smith #include <petscmath.h> 715b6a5bde7SBarry Smith type sqr PetscSqr(type v1) 716b6a5bde7SBarry Smith 717eca87e8dSBarry Smith Not Collective 718eca87e8dSBarry Smith 719eca87e8dSBarry Smith Input Parameter: 720eca87e8dSBarry Smith . v1 - the value 721eca87e8dSBarry Smith 72295452b02SPatrick Sanan Notes: 72395452b02SPatrick Sanan type can be integer or floating point value 724b6a5bde7SBarry Smith 725b6a5bde7SBarry Smith Level: beginner 726b6a5bde7SBarry Smith 727b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal() 728b6a5bde7SBarry Smith 729b6a5bde7SBarry Smith M*/ 7304ebda54eSMatthew Knepley #define PetscSqr(a) ((a)*(a)) 731e489efc1SBarry Smith 732314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 733ee223c85SLisandro Dalcin 734ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 735ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F 7365117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 7375117d392SLisandro Dalcin #define PetscRealConstant(constant) constant 738ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 739ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q 7405117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7415117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F 742ee223c85SLisandro Dalcin #endif 743ee223c85SLisandro Dalcin 744314da920SBarry Smith /* 745d34fcf5fSBarry Smith Basic constants 746314da920SBarry Smith */ 7472fab75feSLisandro Dalcin #define PETSC_PI PetscRealConstant(3.1415926535897932384626433832795029) 7482fab75feSLisandro Dalcin #define PETSC_PHI PetscRealConstant(1.6180339887498948482045868343656381) 7497b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981) 750d34fcf5fSBarry Smith 751ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 75271fd2e92SBarry Smith #define PETSC_MAX_INT 2147483647 753ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 754ab824b78SBarry Smith #else 755ab824b78SBarry Smith #define PETSC_MAX_INT 9223372036854775807L 756ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 757ab824b78SBarry Smith #endif 758569ea7c4SPierre Jolivet #define PETSC_MAX_UINT16 65535 759e489efc1SBarry Smith 760ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 761ab824b78SBarry Smith # define PETSC_MAX_REAL 3.40282346638528860e+38F 7629fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 76382a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 1.19209290e-07F 76482a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F 765ee223c85SLisandro Dalcin # define PETSC_SMALL 1.e-5F 766ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 767ab824b78SBarry Smith # define PETSC_MAX_REAL 1.7976931348623157e+308 7689fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 76982a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 2.2204460492503131e-16 77082a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08 771cf6e855fSSatish Balay # define PETSC_SMALL 1.e-10 772ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 773ea345e14SBarry Smith # define PETSC_MAX_REAL FLT128_MAX 7749fa7d148SSatish Balay # define PETSC_MIN_REAL (-FLT128_MAX) 775d34fcf5fSBarry Smith # define PETSC_MACHINE_EPSILON FLT128_EPSILON 776ee223c85SLisandro Dalcin # define PETSC_SQRT_MACHINE_EPSILON 1.38777878078144567552953958511352539e-17Q 777ee223c85SLisandro Dalcin # define PETSC_SMALL 1.e-20Q 7785117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7795117d392SLisandro Dalcin # define PETSC_MAX_REAL 65504.0F 7809fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 7815117d392SLisandro Dalcin # define PETSC_MACHINE_EPSILON .0009765625F 7825117d392SLisandro Dalcin # define PETSC_SQRT_MACHINE_EPSILON .03125F 7835117d392SLisandro Dalcin # define PETSC_SMALL 5.e-3F 7849cf09972SJed Brown #endif 7853e523bebSBarry Smith 78625d0f998SSatish Balay #define PETSC_INFINITY (PETSC_MAX_REAL/4) 7879fa7d148SSatish Balay #define PETSC_NINFINITY (-PETSC_INFINITY) 788e270355aSBarry Smith 7899f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsInfReal(PetscReal); 7903948c36eSLisandro Dalcin PETSC_EXTERN PetscBool PetscIsNanReal(PetscReal); 7918b49ba18SBarry Smith PETSC_EXTERN PetscBool PetscIsNormalReal(PetscReal); 7929fbee547SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanReal(PetscReal v) {return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;} 7939fbee547SJacob Faibussowitsch static inline PetscBool PetscIsInfScalar(PetscScalar v) {return PetscIsInfReal(PetscAbsScalar(v));} 7949fbee547SJacob Faibussowitsch static inline PetscBool PetscIsNanScalar(PetscScalar v) {return PetscIsNanReal(PetscAbsScalar(v));} 7959fbee547SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanScalar(PetscScalar v) {return PetscIsInfOrNanReal(PetscAbsScalar(v));} 7969fbee547SJacob Faibussowitsch static inline PetscBool PetscIsNormalScalar(PetscScalar v) {return PetscIsNormalReal(PetscAbsScalar(v));} 7979a25a3ccSBarry Smith 798b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal,PetscReal,PetscReal,PetscReal); 799ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal,PetscReal); 800ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar,PetscScalar); 801ce4818fdSLisandro Dalcin 80298725619SBarry Smith /* 80398725619SBarry Smith These macros are currently hardwired to match the regular data types, so there is no support for a different 80498725619SBarry Smith MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again. 80598725619SBarry Smith */ 80698725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR 80798725619SBarry Smith typedef PetscScalar MatScalar; 80898725619SBarry Smith typedef PetscReal MatReal; 80998725619SBarry Smith 8108ad47952SJed Brown struct petsc_mpiu_2scalar {PetscScalar a,b;}; 8118ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2scalar); 812df4397b0SStefano Zampini 813092991acSStefano Zampini /* 814092991acSStefano Zampini MPI Datatypes for composite reductions: 815092991acSStefano Zampini MPIU_REAL_INT -> struct { PetscReal; PetscInt; } 816092991acSStefano Zampini MPIU_SCALAR_INT -> struct { PetscScalar; PetscInt; } 817092991acSStefano Zampini */ 818092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_REAL_INT; 819092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT; 820092991acSStefano Zampini 821a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES) 8228ad47952SJed Brown struct petsc_mpiu_2int {PetscInt a,b;}; 8238ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2int); 8248ad47952SJed Brown #else 8258ad47952SJed Brown #define MPIU_2INT MPI_2INT 8268ad47952SJed Brown #endif 827b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPI_4INT; 828b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPIU_4INT; 829e9fa29b7SSatish Balay 8309fbee547SJacob Faibussowitsch static inline PetscInt PetscPowInt(PetscInt base,PetscInt power) 831b2fb0278SBarry Smith { 832fa711258SJed Brown PetscInt result = 1; 833fa711258SJed Brown while (power) { 834fa711258SJed Brown if (power & 1) result *= base; 835fa711258SJed Brown power >>= 1; 836fa711258SJed Brown base *= base; 837fa711258SJed Brown } 838fa711258SJed Brown return result; 839fa711258SJed Brown } 840b2fb0278SBarry Smith 8419fbee547SJacob Faibussowitsch static inline PetscInt64 PetscPowInt64(PetscInt base,PetscInt power) 842ad70a4c3SStefano Zampini { 843ad70a4c3SStefano Zampini PetscInt64 result = 1; 844ad70a4c3SStefano Zampini while (power) { 845ad70a4c3SStefano Zampini if (power & 1) result *= base; 846ad70a4c3SStefano Zampini power >>= 1; 847ad70a4c3SStefano Zampini base *= base; 848ad70a4c3SStefano Zampini } 849ad70a4c3SStefano Zampini return result; 850ad70a4c3SStefano Zampini } 851ad70a4c3SStefano Zampini 8529fbee547SJacob Faibussowitsch static inline PetscReal PetscPowRealInt(PetscReal base,PetscInt power) 853b2fb0278SBarry Smith { 854fa711258SJed Brown PetscReal result = 1; 855d98d5da7SBarry Smith if (power < 0) { 856d98d5da7SBarry Smith power = -power; 85710d40e53SLisandro Dalcin base = ((PetscReal)1)/base; 858d98d5da7SBarry Smith } 859fa711258SJed Brown while (power) { 860fa711258SJed Brown if (power & 1) result *= base; 861fa711258SJed Brown power >>= 1; 862fa711258SJed Brown base *= base; 863fa711258SJed Brown } 864fa711258SJed Brown return result; 865fa711258SJed Brown } 866fa711258SJed Brown 8679fbee547SJacob Faibussowitsch static inline PetscScalar PetscPowScalarInt(PetscScalar base,PetscInt power) 868b2fb0278SBarry Smith { 8695117d392SLisandro Dalcin PetscScalar result = (PetscReal)1; 8708b49ba18SBarry Smith if (power < 0) { 8718b49ba18SBarry Smith power = -power; 87210d40e53SLisandro Dalcin base = ((PetscReal)1)/base; 8738b49ba18SBarry Smith } 8748b49ba18SBarry Smith while (power) { 8758b49ba18SBarry Smith if (power & 1) result *= base; 8768b49ba18SBarry Smith power >>= 1; 8778b49ba18SBarry Smith base *= base; 8788b49ba18SBarry Smith } 8798b49ba18SBarry Smith return result; 8808b49ba18SBarry Smith } 8818b49ba18SBarry Smith 8829fbee547SJacob Faibussowitsch static inline PetscScalar PetscPowScalarReal(PetscScalar base,PetscReal power) 883b2fb0278SBarry Smith { 884b2fb0278SBarry Smith PetscScalar cpower = power; 885b2fb0278SBarry Smith return PetscPowScalar(base,cpower); 886b2fb0278SBarry Smith } 88778a59e97SMatthew G. Knepley 888c803a25aSBarry Smith /*MC 88966baab88SBarry Smith PetscApproximateLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers 890c803a25aSBarry Smith 891c803a25aSBarry Smith Synopsis: 892c803a25aSBarry Smith #include <petscmath.h> 89366baab88SBarry Smith bool PetscApproximateLTE(PetscReal x,constant float) 894c803a25aSBarry Smith 895c803a25aSBarry Smith Not Collective 896c803a25aSBarry Smith 897c803a25aSBarry Smith Input Parameters: 898c803a25aSBarry Smith + x - the variable 899c803a25aSBarry Smith - b - the constant float it is checking if x is less than or equal to 900c803a25aSBarry Smith 901c803a25aSBarry Smith Notes: 902c803a25aSBarry Smith The fudge factor is the value PETSC_SMALL 903c803a25aSBarry Smith 904c803a25aSBarry Smith The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2 905c803a25aSBarry Smith 906c803a25aSBarry Smith This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact 907c803a25aSBarry Smith floating point results. 908c803a25aSBarry Smith 909c803a25aSBarry Smith Level: advanced 910c803a25aSBarry Smith 91166baab88SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscApproximateGTE() 912c803a25aSBarry Smith 913c803a25aSBarry Smith M*/ 91466baab88SBarry Smith #define PetscApproximateLTE(x,b) ((x) <= (PetscRealConstant(b)+PETSC_SMALL)) 915c803a25aSBarry Smith 916c803a25aSBarry Smith /*MC 91766baab88SBarry Smith PetscApproximateGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers 918c803a25aSBarry Smith 919c803a25aSBarry Smith Synopsis: 920c803a25aSBarry Smith #include <petscmath.h> 92166baab88SBarry Smith bool PetscApproximateGTE(PetscReal x,constant float) 922c803a25aSBarry Smith 923c803a25aSBarry Smith Not Collective 924c803a25aSBarry Smith 925c803a25aSBarry Smith Input Parameters: 926c803a25aSBarry Smith + x - the variable 927c803a25aSBarry Smith - b - the constant float it is checking if x is greater than or equal to 928c803a25aSBarry Smith 929c803a25aSBarry Smith Notes: 930c803a25aSBarry Smith The fudge factor is the value PETSC_SMALL 931c803a25aSBarry Smith 932c803a25aSBarry Smith The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2 933c803a25aSBarry Smith 934c803a25aSBarry Smith This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact 935c803a25aSBarry Smith floating point results. 936c803a25aSBarry Smith 937c803a25aSBarry Smith Level: advanced 938c803a25aSBarry Smith 93966baab88SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscApproximateLTE() 940c803a25aSBarry Smith 941c803a25aSBarry Smith M*/ 94266baab88SBarry Smith #define PetscApproximateGTE(x,b) ((x) >= (PetscRealConstant(b)-PETSC_SMALL)) 943c803a25aSBarry Smith 944faa75363SBarry Smith /*MC 945faa75363SBarry Smith PetscCeilInt - Returns the ceiling of the quotation of two positive integers 946faa75363SBarry Smith 947faa75363SBarry Smith Synopsis: 948faa75363SBarry Smith #include <petscmath.h> 949faa75363SBarry Smith PetscInt PetscCeilInt(PetscInt x,PetscInt y) 950faa75363SBarry Smith 951faa75363SBarry Smith Not Collective 952faa75363SBarry Smith 953faa75363SBarry Smith Input Parameters: 954faa75363SBarry Smith + x - the numerator 955faa75363SBarry Smith - y - the denominator 956faa75363SBarry Smith 957faa75363SBarry Smith Level: advanced 958faa75363SBarry Smith 95966baab88SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscApproximateLTE() 960faa75363SBarry Smith 961faa75363SBarry Smith M*/ 962faa75363SBarry Smith #define PetscCeilInt(x,y) ((((PetscInt)(x))/((PetscInt)(y))) + ((((PetscInt)(x)) % ((PetscInt)(y))) ? 1 : 0)) 963faa75363SBarry Smith 964faa75363SBarry Smith #define PetscCeilInt64(x,y) ((((PetscInt64)(x))/((PetscInt64)(y))) + ((((PetscInt64)(x)) % ((PetscInt64)(y))) ? 1 : 0)) 965faa75363SBarry Smith 966bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt,const PetscReal[],const PetscReal[],PetscReal*,PetscReal*); 967e489efc1SBarry Smith #endif 968