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) 495117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 505117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 515117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmodf(a,b) 525117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 53*1f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 54*1f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 55*1f17fa70SToby Isaac #else 56*1f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 57*1f17fa70SToby Isaac #endif 585117d392SLisandro Dalcin 595117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 605117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrt(a) 615117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrt(a) 625117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypot(a,b) 635117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2(a,b) 645117d392SLisandro Dalcin #define PetscPowReal(a,b) pow(a,b) 655117d392SLisandro Dalcin #define PetscExpReal(a) exp(a) 665117d392SLisandro Dalcin #define PetscLogReal(a) log(a) 675117d392SLisandro Dalcin #define PetscLog10Real(a) log10(a) 685117d392SLisandro Dalcin #define PetscLog2Real(a) log2(a) 695117d392SLisandro Dalcin #define PetscSinReal(a) sin(a) 705117d392SLisandro Dalcin #define PetscCosReal(a) cos(a) 715117d392SLisandro Dalcin #define PetscTanReal(a) tan(a) 725117d392SLisandro Dalcin #define PetscAsinReal(a) asin(a) 735117d392SLisandro Dalcin #define PetscAcosReal(a) acos(a) 745117d392SLisandro Dalcin #define PetscAtanReal(a) atan(a) 755117d392SLisandro Dalcin #define PetscSinhReal(a) sinh(a) 765117d392SLisandro Dalcin #define PetscCoshReal(a) cosh(a) 775117d392SLisandro Dalcin #define PetscTanhReal(a) tanh(a) 785117d392SLisandro Dalcin #define PetscAsinhReal(a) asinh(a) 795117d392SLisandro Dalcin #define PetscAcoshReal(a) acosh(a) 805117d392SLisandro Dalcin #define PetscAtanhReal(a) atanh(a) 815117d392SLisandro Dalcin #define PetscCeilReal(a) ceil(a) 825117d392SLisandro Dalcin #define PetscFloorReal(a) floor(a) 835117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmod(a,b) 845117d392SLisandro Dalcin #define PetscTGamma(a) tgamma(a) 85*1f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 86*1f17fa70SToby Isaac #define PetscLGamma(a) gamma(a) 87*1f17fa70SToby Isaac #else 88*1f17fa70SToby Isaac #define PetscLGamma(a) lgamma(a) 89*1f17fa70SToby Isaac #endif 905117d392SLisandro Dalcin 915117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 925117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtq(a) 935117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtq(a) 945117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypotq(a,b) 955117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2q(a,b) 965117d392SLisandro Dalcin #define PetscPowReal(a,b) powq(a,b) 975117d392SLisandro Dalcin #define PetscExpReal(a) expq(a) 985117d392SLisandro Dalcin #define PetscLogReal(a) logq(a) 995117d392SLisandro Dalcin #define PetscLog10Real(a) log10q(a) 1005117d392SLisandro Dalcin #define PetscLog2Real(a) log2q(a) 1015117d392SLisandro Dalcin #define PetscSinReal(a) sinq(a) 1025117d392SLisandro Dalcin #define PetscCosReal(a) cosq(a) 1035117d392SLisandro Dalcin #define PetscTanReal(a) tanq(a) 1045117d392SLisandro Dalcin #define PetscAsinReal(a) asinq(a) 1055117d392SLisandro Dalcin #define PetscAcosReal(a) acosq(a) 1065117d392SLisandro Dalcin #define PetscAtanReal(a) atanq(a) 1075117d392SLisandro Dalcin #define PetscSinhReal(a) sinhq(a) 1085117d392SLisandro Dalcin #define PetscCoshReal(a) coshq(a) 1095117d392SLisandro Dalcin #define PetscTanhReal(a) tanhq(a) 1105117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhq(a) 1115117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshq(a) 1125117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhq(a) 1135117d392SLisandro Dalcin #define PetscCeilReal(a) ceilq(a) 1145117d392SLisandro Dalcin #define PetscFloorReal(a) floorq(a) 1155117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmodq(a,b) 1165117d392SLisandro Dalcin #define PetscTGamma(a) tgammaq(a) 117*1f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 118*1f17fa70SToby Isaac #define PetscLGamma(a) gammaq(a) 119*1f17fa70SToby Isaac #else 120*1f17fa70SToby Isaac #define PetscLGamma(a) lgammaq(a) 121*1f17fa70SToby Isaac #endif 1225117d392SLisandro Dalcin 1235117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 1245117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 1255117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtf(a) 1265117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypotf(a,b) 1275117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2f(a,b) 1285117d392SLisandro Dalcin #define PetscPowReal(a,b) powf(a,b) 1295117d392SLisandro Dalcin #define PetscExpReal(a) expf(a) 1305117d392SLisandro Dalcin #define PetscLogReal(a) logf(a) 1315117d392SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 1325117d392SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 1335117d392SLisandro Dalcin #define PetscSinReal(a) sinf(a) 1345117d392SLisandro Dalcin #define PetscCosReal(a) cosf(a) 1355117d392SLisandro Dalcin #define PetscTanReal(a) tanf(a) 1365117d392SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 1375117d392SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 1385117d392SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 1395117d392SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 1405117d392SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 1415117d392SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 1425117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhf(a) 1435117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshf(a) 1445117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhf(a) 1455117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 1465117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 1475117d392SLisandro Dalcin #define PetscFmodReal(a,b) fmodf(a,b) 1485117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 149*1f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 150*1f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 151*1f17fa70SToby Isaac #else 152*1f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 153*1f17fa70SToby Isaac #endif 1545117d392SLisandro Dalcin 1555117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 1565117d392SLisandro Dalcin 1575117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscReal PetscSignReal(PetscReal a) 1585117d392SLisandro Dalcin { 1595117d392SLisandro Dalcin return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0)); 1605117d392SLisandro Dalcin } 1615117d392SLisandro Dalcin 1625117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2) 1635117d392SLisandro Dalcin #undef PetscLog2Real 1645117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscReal PetscLog2Real(PetscReal a) 1655117d392SLisandro Dalcin { 1665117d392SLisandro Dalcin return PetscLogReal(a)/PetscLogReal((PetscReal)2); 1675117d392SLisandro Dalcin } 1685117d392SLisandro Dalcin #endif 1695117d392SLisandro Dalcin 1705117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 1715117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PetscAttrMPITypeTag(__float128); 1725117d392SLisandro Dalcin #endif 1735117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FP16) 1745117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FP16 PetscAttrMPITypeTag(__fp16); 1755117d392SLisandro Dalcin #endif 1765117d392SLisandro Dalcin 177df4397b0SStefano Zampini /*MC 178df4397b0SStefano Zampini MPIU_REAL - MPI datatype corresponding to PetscReal 179df4397b0SStefano Zampini 180df4397b0SStefano Zampini Notes: 181df4397b0SStefano Zampini In MPI calls that require an MPI datatype that matches a PetscReal or array of PetscReal values, pass this value. 182df4397b0SStefano Zampini 183df4397b0SStefano Zampini Level: beginner 184df4397b0SStefano Zampini 185df4397b0SStefano Zampini .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT 186df4397b0SStefano Zampini M*/ 187c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE) 188c1d390e3SJed Brown # define MPIU_REAL MPI_FLOAT 189c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE) 190c1d390e3SJed Brown # define MPIU_REAL MPI_DOUBLE 191c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128) 192c1d390e3SJed Brown # define MPIU_REAL MPIU___FLOAT128 193570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 194570b7f6dSBarry Smith # define MPIU_REAL MPIU___FP16 195c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */ 19659cb5930SBarry Smith 1971093a601SBarry Smith /* 1981093a601SBarry Smith Complex number definitions 1991093a601SBarry Smith */ 200df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX) 2015117d392SLisandro Dalcin #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) && !defined(PETSC_USE_REAL___FLOAT128) 2021093a601SBarry Smith /* C++ support of complex number */ 203b7940d39SSatish Balay 20450f81f78SJed Brown #define PetscRealPartComplex(a) (a).real() 20550f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag() 206df4397b0SStefano Zampini #define PetscAbsComplex(a) petsccomplexlib::abs(a) 2075117d392SLisandro Dalcin #define PetscArgComplex(a) petsccomplexlib::arg(a) 208df4397b0SStefano Zampini #define PetscConjComplex(a) petsccomplexlib::conj(a) 209df4397b0SStefano Zampini #define PetscSqrtComplex(a) petsccomplexlib::sqrt(a) 210df4397b0SStefano Zampini #define PetscPowComplex(a,b) petsccomplexlib::pow(a,b) 211df4397b0SStefano Zampini #define PetscExpComplex(a) petsccomplexlib::exp(a) 212df4397b0SStefano Zampini #define PetscLogComplex(a) petsccomplexlib::log(a) 213df4397b0SStefano Zampini #define PetscSinComplex(a) petsccomplexlib::sin(a) 214df4397b0SStefano Zampini #define PetscCosComplex(a) petsccomplexlib::cos(a) 2155117d392SLisandro Dalcin #define PetscTanComplex(a) petsccomplexlib::tan(a) 216df4397b0SStefano Zampini #define PetscAsinComplex(a) petsccomplexlib::asin(a) 217df4397b0SStefano Zampini #define PetscAcosComplex(a) petsccomplexlib::acos(a) 2185117d392SLisandro Dalcin #define PetscAtanComplex(a) petsccomplexlib::atan(a) 219df4397b0SStefano Zampini #define PetscSinhComplex(a) petsccomplexlib::sinh(a) 220df4397b0SStefano Zampini #define PetscCoshComplex(a) petsccomplexlib::cosh(a) 221df4397b0SStefano Zampini #define PetscTanhComplex(a) petsccomplexlib::tanh(a) 2225117d392SLisandro Dalcin #define PetscAsinhComplex(a) petsccomplexlib::asinh(a) 2235117d392SLisandro Dalcin #define PetscAcoshComplex(a) petsccomplexlib::acosh(a) 2245117d392SLisandro Dalcin #define PetscAtanhComplex(a) petsccomplexlib::atanh(a) 2255117d392SLisandro Dalcin 2265117d392SLisandro Dalcin /* TODO: Add configure tests 2275117d392SLisandro Dalcin 2285117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX) 2295117d392SLisandro Dalcin #undef PetscTanComplex 2305117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscTanComplex(PetscComplex z) 2315117d392SLisandro Dalcin { 2325117d392SLisandro Dalcin return PetscSinComplex(z)/PetscCosComplex(z); 2335117d392SLisandro Dalcin } 234027d9794SBarry Smith #endif 235debe9ee2SPaul Mullowney 2365117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX) 2375117d392SLisandro Dalcin #undef PetscTanhComplex 2385117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscTanhComplex(PetscComplex z) 2395117d392SLisandro Dalcin { 2405117d392SLisandro Dalcin return PetscSinhComplex(z)/PetscCoshComplex(z); 2415117d392SLisandro Dalcin } 2425117d392SLisandro Dalcin #endif 2435117d392SLisandro Dalcin 2445117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX) 2455117d392SLisandro Dalcin #undef PetscAsinComplex 2465117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAsinComplex(PetscComplex z) 2475117d392SLisandro Dalcin { 2485117d392SLisandro Dalcin const PetscComplex j(0,1); 2495117d392SLisandro Dalcin return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z)); 2505117d392SLisandro Dalcin } 2515117d392SLisandro Dalcin #endif 2525117d392SLisandro Dalcin 2535117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX) 2545117d392SLisandro Dalcin #undef PetscAcosComplex 2555117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAcosComplex(PetscComplex z) 2565117d392SLisandro Dalcin { 2575117d392SLisandro Dalcin const PetscComplex j(0,1); 2585117d392SLisandro Dalcin return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z)); 2595117d392SLisandro Dalcin } 2605117d392SLisandro Dalcin #endif 2615117d392SLisandro Dalcin 2625117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX) 2635117d392SLisandro Dalcin #undef PetscAtanComplex 2645117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAtanComplex(PetscComplex z) 2655117d392SLisandro Dalcin { 2665117d392SLisandro Dalcin const PetscComplex j(0,1); 2675117d392SLisandro Dalcin return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z)); 2685117d392SLisandro Dalcin } 2695117d392SLisandro Dalcin #endif 2705117d392SLisandro Dalcin 2715117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX) 2725117d392SLisandro Dalcin #undef PetscAsinhComplex 2735117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAsinhComplex(PetscComplex z) 2745117d392SLisandro Dalcin { 2755117d392SLisandro Dalcin return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f)); 2765117d392SLisandro Dalcin } 2775117d392SLisandro Dalcin #endif 2785117d392SLisandro Dalcin 2795117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX) 2805117d392SLisandro Dalcin #undef PetscAcoshComplex 2815117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAcoshComplex(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_ATANH_COMPLEX) 2885117d392SLisandro Dalcin #undef PetscAtanhComplex 2895117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAtanhComplex(PetscComplex z) 2905117d392SLisandro Dalcin { 2915117d392SLisandro Dalcin return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z)); 2925117d392SLisandro Dalcin } 2935117d392SLisandro Dalcin #endif 2945117d392SLisandro Dalcin 2955117d392SLisandro Dalcin */ 2965117d392SLisandro Dalcin 297546cf897SSatish Balay #elif defined(PETSC_HAVE_C99_COMPLEX) && !defined(PETSC_USE_REAL___FP16) 2985117d392SLisandro Dalcin /* C99 support of complex number */ 299519e2a1fSPaul Mullowney 300570b7f6dSBarry Smith #if defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL___FP16) 30150f81f78SJed Brown #define PetscRealPartComplex(a) crealf(a) 30250f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a) 30350f81f78SJed Brown #define PetscAbsComplex(a) cabsf(a) 3045117d392SLisandro Dalcin #define PetscArgComplex(a) cargf(a) 30550f81f78SJed Brown #define PetscConjComplex(a) conjf(a) 30650f81f78SJed Brown #define PetscSqrtComplex(a) csqrtf(a) 30750f81f78SJed Brown #define PetscPowComplex(a,b) cpowf(a,b) 30850f81f78SJed Brown #define PetscExpComplex(a) cexpf(a) 30950f81f78SJed Brown #define PetscLogComplex(a) clogf(a) 31050f81f78SJed Brown #define PetscSinComplex(a) csinf(a) 31150f81f78SJed Brown #define PetscCosComplex(a) ccosf(a) 3125117d392SLisandro Dalcin #define PetscTanComplex(a) ctanf(a) 313255453a1SBarry Smith #define PetscAsinComplex(a) casinf(a) 314255453a1SBarry Smith #define PetscAcosComplex(a) cacosf(a) 3155117d392SLisandro Dalcin #define PetscAtanComplex(a) catanf(a) 316a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhf(a) 317a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshf(a) 318a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhf(a) 3195117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinhf(a) 3205117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacoshf(a) 3215117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanhf(a) 3221093a601SBarry Smith 323ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 32450f81f78SJed Brown #define PetscRealPartComplex(a) creal(a) 32550f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a) 32650f81f78SJed Brown #define PetscAbsComplex(a) cabs(a) 3275117d392SLisandro Dalcin #define PetscArgComplex(a) carg(a) 32850f81f78SJed Brown #define PetscConjComplex(a) conj(a) 32950f81f78SJed Brown #define PetscSqrtComplex(a) csqrt(a) 33050f81f78SJed Brown #define PetscPowComplex(a,b) cpow(a,b) 33150f81f78SJed Brown #define PetscExpComplex(a) cexp(a) 33250f81f78SJed Brown #define PetscLogComplex(a) clog(a) 33350f81f78SJed Brown #define PetscSinComplex(a) csin(a) 33450f81f78SJed Brown #define PetscCosComplex(a) ccos(a) 3355117d392SLisandro Dalcin #define PetscTanComplex(a) ctan(a) 336255453a1SBarry Smith #define PetscAsinComplex(a) casin(a) 337255453a1SBarry Smith #define PetscAcosComplex(a) cacos(a) 3385117d392SLisandro Dalcin #define PetscAtanComplex(a) catan(a) 339a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinh(a) 340a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccosh(a) 341a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanh(a) 3425117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinh(a) 3435117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacosh(a) 3445117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanh(a) 3451093a601SBarry Smith 3468c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128) 34750f81f78SJed Brown #define PetscRealPartComplex(a) crealq(a) 34850f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a) 34950f81f78SJed Brown #define PetscAbsComplex(a) cabsq(a) 3505117d392SLisandro Dalcin #define PetscArgComplex(a) cargq(a) 35150f81f78SJed Brown #define PetscConjComplex(a) conjq(a) 35250f81f78SJed Brown #define PetscSqrtComplex(a) csqrtq(a) 35350f81f78SJed Brown #define PetscPowComplex(a,b) cpowq(a,b) 35450f81f78SJed Brown #define PetscExpComplex(a) cexpq(a) 35550f81f78SJed Brown #define PetscLogComplex(a) clogq(a) 35650f81f78SJed Brown #define PetscSinComplex(a) csinq(a) 35750f81f78SJed Brown #define PetscCosComplex(a) ccosq(a) 3585117d392SLisandro Dalcin #define PetscTanComplex(a) ctanq(a) 359255453a1SBarry Smith #define PetscAsinComplex(a) casinq(a) 360255453a1SBarry Smith #define PetscAcosComplex(a) cacosq(a) 3615117d392SLisandro Dalcin #define PetscAtanComplex(a) catanq(a) 362a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhq(a) 363a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshq(a) 364a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhq(a) 3655117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinhq(a) 3665117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacoshq(a) 3675117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanhq(a) 368a4bea5a6SPeter Brune 369ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */ 3702f217381SBarry Smith #endif /* (__cplusplus && PETSC_HAVE_CXX_COMPLEX) else-if (!__cplusplus && PETSC_HAVE_C99_COMPLEX) */ 371e489efc1SBarry Smith 3721093a601SBarry Smith /* 3735117d392SLisandro Dalcin PETSC_i is the imaginary number, i 3741093a601SBarry Smith */ 37550f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i; 3768a351411SToby Isaac 3775117d392SLisandro Dalcin /* 3785117d392SLisandro Dalcin Try to do the right thing for complex number construction: see 3798a351411SToby Isaac http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm 3808a351411SToby Isaac for details 3818a351411SToby Isaac */ 38219e222d7SToby Isaac PETSC_STATIC_INLINE PetscComplex PetscCMPLX(PetscReal x, PetscReal y) 3838a351411SToby Isaac { 3840e1bea35STristan Konolige #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) && !defined(PETSC_USE_REAL___FLOAT128) 3858a351411SToby Isaac return PetscComplex(x,y); 3868a351411SToby Isaac #elif defined(_Imaginary_I) 3878a351411SToby Isaac return x + y * _Imaginary_I; 3888a351411SToby Isaac #else 389616d7c5eSToby Isaac { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5), 390616d7c5eSToby Isaac 391616d7c5eSToby Isaac "For each floating type there is a corresponding real type, which is always a real floating 392616d7c5eSToby Isaac type. For real floating types, it is the same type. For complex types, it is the type given 393616d7c5eSToby Isaac by deleting the keyword _Complex from the type name." 394616d7c5eSToby Isaac 395616d7c5eSToby Isaac So type punning should be portable. */ 396616d7c5eSToby Isaac union { PetscComplex z; PetscReal f[2]; } uz; 397616d7c5eSToby Isaac 398616d7c5eSToby Isaac uz.f[0] = x; 399616d7c5eSToby Isaac uz.f[1] = y; 400616d7c5eSToby Isaac return uz.z; 401616d7c5eSToby Isaac } 40250f81f78SJed Brown #endif 4038a351411SToby Isaac } 4048a351411SToby Isaac 4055117d392SLisandro Dalcin #if defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 4065117d392SLisandro Dalcin #define MPIU_C_COMPLEX MPI_C_COMPLEX 4075117d392SLisandro Dalcin #define MPIU_C_DOUBLE_COMPLEX MPI_C_DOUBLE_COMPLEX 4085117d392SLisandro Dalcin #else 4095117d392SLisandro Dalcin # if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) && !defined(PETSC_USE_REAL___FLOAT128) 4105117d392SLisandro Dalcin typedef petsccomplexlib::complex<double> petsc_mpiu_c_double_complex; 4115117d392SLisandro Dalcin typedef petsccomplexlib::complex<float> petsc_mpiu_c_complex; 4125117d392SLisandro Dalcin # elif !defined(__cplusplus) && defined(PETSC_HAVE_C99_COMPLEX) 4135117d392SLisandro Dalcin typedef double _Complex petsc_mpiu_c_double_complex; 4145117d392SLisandro Dalcin typedef float _Complex petsc_mpiu_c_complex; 4155117d392SLisandro Dalcin # else 4165117d392SLisandro Dalcin typedef struct {double real,imag;} petsc_mpiu_c_double_complex; 4175117d392SLisandro Dalcin typedef struct {float real,imag;} petsc_mpiu_c_complex; 4185117d392SLisandro Dalcin # endif 4195117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU_C_COMPLEX PetscAttrMPITypeTagLayoutCompatible(petsc_mpiu_c_complex); 4205117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU_C_DOUBLE_COMPLEX PetscAttrMPITypeTagLayoutCompatible(petsc_mpiu_c_double_complex); 4215117d392SLisandro Dalcin #endif /* PETSC_HAVE_MPI_C_DOUBLE_COMPLEX */ 4225117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 4235117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 PetscAttrMPITypeTag(__complex128); 4245117d392SLisandro Dalcin #endif /* PETSC_USE_REAL___FLOAT128 */ 4255117d392SLisandro Dalcin 4265117d392SLisandro Dalcin /*MC 4275117d392SLisandro Dalcin MPIU_COMPLEX - MPI datatype corresponding to PetscComplex 4285117d392SLisandro Dalcin 4295117d392SLisandro Dalcin Notes: 4305117d392SLisandro Dalcin In MPI calls that require an MPI datatype that matches a PetscComplex or array of PetscComplex values, pass this value. 4315117d392SLisandro Dalcin 4325117d392SLisandro Dalcin Level: beginner 4335117d392SLisandro Dalcin 4345117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i 4355117d392SLisandro Dalcin M*/ 4365117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 4375117d392SLisandro Dalcin # define MPIU_COMPLEX MPIU_C_COMPLEX 4385117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 4395117d392SLisandro Dalcin # define MPIU_COMPLEX MPIU_C_DOUBLE_COMPLEX 4405117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 4415117d392SLisandro Dalcin # define MPIU_COMPLEX MPIU___COMPLEX128 4425117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 4435117d392SLisandro Dalcin # define MPIU_COMPLEX MPIU_C_COMPLEX 4445117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 4455117d392SLisandro Dalcin 4465117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */ 4475117d392SLisandro Dalcin 4485117d392SLisandro Dalcin /* 4495117d392SLisandro Dalcin Scalar number definitions 4505117d392SLisandro Dalcin */ 4515117d392SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) && !defined(PETSC_SKIP_COMPLEX) 4525117d392SLisandro Dalcin /*MC 4535117d392SLisandro Dalcin MPIU_SCALAR - MPI datatype corresponding to PetscScalar 4545117d392SLisandro Dalcin 4555117d392SLisandro Dalcin Notes: 4565117d392SLisandro Dalcin In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalar values, pass this value. 4575117d392SLisandro Dalcin 4585117d392SLisandro Dalcin Level: beginner 4595117d392SLisandro Dalcin 4605117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_COMPLEX, MPIU_INT 4615117d392SLisandro Dalcin M*/ 4625117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX 4635117d392SLisandro Dalcin 4645117d392SLisandro Dalcin /*MC 4655117d392SLisandro Dalcin PetscRealPart - Returns the real part of a PetscScalar 4665117d392SLisandro Dalcin 4675117d392SLisandro Dalcin Synopsis: 4685117d392SLisandro Dalcin #include <petscmath.h> 4695117d392SLisandro Dalcin PetscReal PetscRealPart(PetscScalar v) 4705117d392SLisandro Dalcin 4715117d392SLisandro Dalcin Not Collective 4725117d392SLisandro Dalcin 4735117d392SLisandro Dalcin Input Parameter: 4745117d392SLisandro Dalcin . v - value to find the real part of 4755117d392SLisandro Dalcin 4765117d392SLisandro Dalcin Level: beginner 4775117d392SLisandro Dalcin 4785117d392SLisandro Dalcin .seealso: PetscScalar, PetscImaginaryPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 4795117d392SLisandro Dalcin 4805117d392SLisandro Dalcin M*/ 4815117d392SLisandro Dalcin #define PetscRealPart(a) PetscRealPartComplex(a) 4825117d392SLisandro Dalcin 4835117d392SLisandro Dalcin /*MC 4845117d392SLisandro Dalcin PetscImaginaryPart - Returns the imaginary part of a PetscScalar 4855117d392SLisandro Dalcin 4865117d392SLisandro Dalcin Synopsis: 4875117d392SLisandro Dalcin #include <petscmath.h> 4885117d392SLisandro Dalcin PetscReal PetscImaginaryPart(PetscScalar v) 4895117d392SLisandro Dalcin 4905117d392SLisandro Dalcin Not Collective 4915117d392SLisandro Dalcin 4925117d392SLisandro Dalcin Input Parameter: 4935117d392SLisandro Dalcin . v - value to find the imaginary part of 4945117d392SLisandro Dalcin 4955117d392SLisandro Dalcin Level: beginner 4965117d392SLisandro Dalcin 4975117d392SLisandro Dalcin Notes: 4985117d392SLisandro Dalcin If PETSc was configured for real numbers then this always returns the value 0 4995117d392SLisandro Dalcin 5005117d392SLisandro Dalcin .seealso: PetscScalar, PetscRealPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 5015117d392SLisandro Dalcin 5025117d392SLisandro Dalcin M*/ 5035117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a) 5045117d392SLisandro Dalcin 5055117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsComplex(a) 5065117d392SLisandro Dalcin #define PetscArgScalar(a) PetscArgComplex(a) 5075117d392SLisandro Dalcin #define PetscConj(a) PetscConjComplex(a) 5085117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtComplex(a) 5095117d392SLisandro Dalcin #define PetscPowScalar(a,b) PetscPowComplex(a,b) 5105117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpComplex(a) 5115117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogComplex(a) 5125117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinComplex(a) 5135117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosComplex(a) 5145117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanComplex(a) 5155117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinComplex(a) 5165117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosComplex(a) 5175117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanComplex(a) 5185117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhComplex(a) 5195117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshComplex(a) 5205117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhComplex(a) 5215117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhComplex(a) 5225117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshComplex(a) 5235117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhComplex(a) 5245117d392SLisandro Dalcin 5255117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */ 5265117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_REAL 5275117d392SLisandro Dalcin #define PetscRealPart(a) (a) 5285117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0) 5295117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsReal(a) 5305117d392SLisandro Dalcin #define PetscArgScalar(a) (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0) 5315117d392SLisandro Dalcin #define PetscConj(a) (a) 5325117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtReal(a) 5335117d392SLisandro Dalcin #define PetscPowScalar(a,b) PetscPowReal(a,b) 5345117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpReal(a) 5355117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogReal(a) 5365117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinReal(a) 5375117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosReal(a) 5385117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanReal(a) 5395117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinReal(a) 5405117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosReal(a) 5415117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanReal(a) 5425117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhReal(a) 5435117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshReal(a) 5445117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhReal(a) 5455117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhReal(a) 5465117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshReal(a) 5475117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhReal(a) 5485117d392SLisandro Dalcin 5495117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */ 5505117d392SLisandro Dalcin 5515117d392SLisandro Dalcin /* 5525117d392SLisandro Dalcin Certain objects may be created using either single or double precision. 5535117d392SLisandro Dalcin This is currently not used. 5545117d392SLisandro Dalcin */ 5555117d392SLisandro Dalcin typedef enum { PETSC_SCALAR_DOUBLE, PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE, PETSC_SCALAR_HALF } PetscScalarPrecision; 5565117d392SLisandro Dalcin 5575117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/ 5585117d392SLisandro Dalcin 5595117d392SLisandro Dalcin /*MC 5605117d392SLisandro Dalcin PetscAbs - Returns the absolute value of a number 5615117d392SLisandro Dalcin 5625117d392SLisandro Dalcin Synopsis: 5635117d392SLisandro Dalcin #include <petscmath.h> 5645117d392SLisandro Dalcin type PetscAbs(type v) 5655117d392SLisandro Dalcin 5665117d392SLisandro Dalcin Not Collective 5675117d392SLisandro Dalcin 5685117d392SLisandro Dalcin Input Parameter: 5695117d392SLisandro Dalcin . v - the number 5705117d392SLisandro Dalcin 5715117d392SLisandro Dalcin Notes: 5725117d392SLisandro Dalcin type can be integer or real floating point value 5735117d392SLisandro Dalcin 5745117d392SLisandro Dalcin Level: beginner 5755117d392SLisandro Dalcin 5765117d392SLisandro Dalcin .seealso: PetscAbsInt(), PetscAbsReal(), PetscAbsScalar() 5775117d392SLisandro Dalcin 5785117d392SLisandro Dalcin M*/ 5795117d392SLisandro Dalcin #define PetscAbs(a) (((a) >= 0) ? (a) : (-(a))) 5805117d392SLisandro Dalcin 5815117d392SLisandro Dalcin /*MC 5825117d392SLisandro Dalcin PetscSign - Returns the sign of a number as an integer 5835117d392SLisandro Dalcin 5845117d392SLisandro Dalcin Synopsis: 5855117d392SLisandro Dalcin #include <petscmath.h> 5865117d392SLisandro Dalcin int PetscSign(type v) 5875117d392SLisandro Dalcin 5885117d392SLisandro Dalcin Not Collective 5895117d392SLisandro Dalcin 5905117d392SLisandro Dalcin Input Parameter: 5915117d392SLisandro Dalcin . v - the number 5925117d392SLisandro Dalcin 5935117d392SLisandro Dalcin Notes: 5945117d392SLisandro Dalcin type can be integer or real floating point value 5955117d392SLisandro Dalcin 5965117d392SLisandro Dalcin Level: beginner 5975117d392SLisandro Dalcin 5985117d392SLisandro Dalcin M*/ 5995117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1) 600e489efc1SBarry Smith 601b6a5bde7SBarry Smith /*MC 602b6a5bde7SBarry Smith PetscMin - Returns minimum of two numbers 603b6a5bde7SBarry Smith 604eca87e8dSBarry Smith Synopsis: 605aaa7dc30SBarry Smith #include <petscmath.h> 606eca87e8dSBarry Smith type PetscMin(type v1,type v2) 607eca87e8dSBarry Smith 608eca87e8dSBarry Smith Not Collective 609eca87e8dSBarry Smith 610b6a5bde7SBarry Smith Input Parameter: 611b6a5bde7SBarry Smith + v1 - first value to find minimum of 612b6a5bde7SBarry Smith - v2 - second value to find minimum of 613b6a5bde7SBarry Smith 61495452b02SPatrick Sanan Notes: 61595452b02SPatrick Sanan type can be integer or floating point value 616b6a5bde7SBarry Smith 617b6a5bde7SBarry Smith Level: beginner 618b6a5bde7SBarry Smith 6191175f9beSHong Zhang .seealso: PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 620b6a5bde7SBarry Smith 621b6a5bde7SBarry Smith M*/ 622e489efc1SBarry Smith #define PetscMin(a,b) (((a)<(b)) ? (a) : (b)) 623b6a5bde7SBarry Smith 624b6a5bde7SBarry Smith /*MC 625b6a5bde7SBarry Smith PetscMax - Returns maxium of two numbers 626b6a5bde7SBarry Smith 627eca87e8dSBarry Smith Synopsis: 628aaa7dc30SBarry Smith #include <petscmath.h> 629eca87e8dSBarry Smith type max PetscMax(type v1,type v2) 630eca87e8dSBarry Smith 631eca87e8dSBarry Smith Not Collective 632eca87e8dSBarry Smith 633b6a5bde7SBarry Smith Input Parameter: 634b6a5bde7SBarry Smith + v1 - first value to find maximum of 635b6a5bde7SBarry Smith - v2 - second value to find maximum of 636b6a5bde7SBarry Smith 63795452b02SPatrick Sanan Notes: 63895452b02SPatrick Sanan type can be integer or floating point value 639b6a5bde7SBarry Smith 640b6a5bde7SBarry Smith Level: beginner 641b6a5bde7SBarry Smith 642d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 643b6a5bde7SBarry Smith 644b6a5bde7SBarry Smith M*/ 645e489efc1SBarry Smith #define PetscMax(a,b) (((a)<(b)) ? (b) : (a)) 646b6a5bde7SBarry Smith 647b6a5bde7SBarry Smith /*MC 648d9a4bb16SJed Brown PetscClipInterval - Returns a number clipped to be within an interval 649d9a4bb16SJed Brown 650d9a4bb16SJed Brown Synopsis: 651aaa7dc30SBarry Smith #include <petscmath.h> 652d9a4bb16SJed Brown type clip PetscClipInterval(type x,type a,type b) 653d9a4bb16SJed Brown 654d9a4bb16SJed Brown Not Collective 655d9a4bb16SJed Brown 656d9a4bb16SJed Brown Input Parameter: 657d9a4bb16SJed Brown + x - value to use if within interval (a,b) 658d9a4bb16SJed Brown . a - lower end of interval 659d9a4bb16SJed Brown - b - upper end of interval 660d9a4bb16SJed Brown 66195452b02SPatrick Sanan Notes: 66295452b02SPatrick Sanan type can be integer or floating point value 663d9a4bb16SJed Brown 664d9a4bb16SJed Brown Level: beginner 665d9a4bb16SJed Brown 666d9a4bb16SJed Brown .seealso: PetscMin(), PetscMax(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 667d9a4bb16SJed Brown 668d9a4bb16SJed Brown M*/ 669d9a4bb16SJed Brown #define PetscClipInterval(x,a,b) (PetscMax((a),PetscMin((x),(b)))) 670d9a4bb16SJed Brown 671d9a4bb16SJed Brown /*MC 672b6a5bde7SBarry Smith PetscAbsInt - Returns the absolute value of an integer 673b6a5bde7SBarry Smith 674b6a5bde7SBarry Smith Synopsis: 675aaa7dc30SBarry Smith #include <petscmath.h> 676b6a5bde7SBarry Smith int abs PetscAbsInt(int v1) 677b6a5bde7SBarry Smith 678eca87e8dSBarry Smith Not Collective 679eca87e8dSBarry Smith 680eca87e8dSBarry Smith Input Parameter: 681eca87e8dSBarry Smith . v1 - the integer 682b6a5bde7SBarry Smith 683b6a5bde7SBarry Smith Level: beginner 684b6a5bde7SBarry Smith 685b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr() 686b6a5bde7SBarry Smith 687b6a5bde7SBarry Smith M*/ 6889fa7d148SSatish Balay #define PetscAbsInt(a) (((a)<0) ? (-(a)) : (a)) 689b6a5bde7SBarry Smith 690b6a5bde7SBarry Smith /*MC 691b6a5bde7SBarry Smith PetscAbsReal - Returns the absolute value of an real number 692b6a5bde7SBarry Smith 693eca87e8dSBarry Smith Synopsis: 694aaa7dc30SBarry Smith #include <petscmath.h> 695eca87e8dSBarry Smith Real abs PetscAbsReal(PetscReal v1) 696eca87e8dSBarry Smith 697eca87e8dSBarry Smith Not Collective 698eca87e8dSBarry Smith 699b6a5bde7SBarry Smith Input Parameter: 700b6a5bde7SBarry Smith . v1 - the double 701b6a5bde7SBarry Smith 702b6a5bde7SBarry Smith 703b6a5bde7SBarry Smith Level: beginner 704b6a5bde7SBarry Smith 705b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr() 706b6a5bde7SBarry Smith 707b6a5bde7SBarry Smith M*/ 7081118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 7091118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 7101118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 7111118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a) 7121118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 7131118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a) 7141118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7151118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a) 7161118d4bcSLisandro Dalcin #endif 717b6a5bde7SBarry Smith 718b6a5bde7SBarry Smith /*MC 719b6a5bde7SBarry Smith PetscSqr - Returns the square of a number 720b6a5bde7SBarry Smith 721b6a5bde7SBarry Smith Synopsis: 722aaa7dc30SBarry Smith #include <petscmath.h> 723b6a5bde7SBarry Smith type sqr PetscSqr(type v1) 724b6a5bde7SBarry Smith 725eca87e8dSBarry Smith Not Collective 726eca87e8dSBarry Smith 727eca87e8dSBarry Smith Input Parameter: 728eca87e8dSBarry Smith . v1 - the value 729eca87e8dSBarry Smith 73095452b02SPatrick Sanan Notes: 73195452b02SPatrick Sanan type can be integer or floating point value 732b6a5bde7SBarry Smith 733b6a5bde7SBarry Smith Level: beginner 734b6a5bde7SBarry Smith 735b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal() 736b6a5bde7SBarry Smith 737b6a5bde7SBarry Smith M*/ 7384ebda54eSMatthew Knepley #define PetscSqr(a) ((a)*(a)) 739e489efc1SBarry Smith 740314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 741ee223c85SLisandro Dalcin 742ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 743ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F 7445117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 7455117d392SLisandro Dalcin #define PetscRealConstant(constant) constant 746ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 747ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q 7485117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7495117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F 750ee223c85SLisandro Dalcin #endif 751ee223c85SLisandro Dalcin 752314da920SBarry Smith /* 753d34fcf5fSBarry Smith Basic constants 754314da920SBarry Smith */ 7552fab75feSLisandro Dalcin #define PETSC_PI PetscRealConstant(3.1415926535897932384626433832795029) 7562fab75feSLisandro Dalcin #define PETSC_PHI PetscRealConstant(1.6180339887498948482045868343656381) 7577b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981) 758d34fcf5fSBarry Smith 759ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 76071fd2e92SBarry Smith #define PETSC_MAX_INT 2147483647 761ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 762ab824b78SBarry Smith #else 763ab824b78SBarry Smith #define PETSC_MAX_INT 9223372036854775807L 764ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1) 765ab824b78SBarry Smith #endif 766e489efc1SBarry Smith 767ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 768ab824b78SBarry Smith # define PETSC_MAX_REAL 3.40282346638528860e+38F 7699fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 77082a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 1.19209290e-07F 77182a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F 772ee223c85SLisandro Dalcin # define PETSC_SMALL 1.e-5F 773ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 774ab824b78SBarry Smith # define PETSC_MAX_REAL 1.7976931348623157e+308 7759fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 77682a7e548SBarry Smith # define PETSC_MACHINE_EPSILON 2.2204460492503131e-16 77782a7e548SBarry Smith # define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08 778cf6e855fSSatish Balay # define PETSC_SMALL 1.e-10 779ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 780ea345e14SBarry Smith # define PETSC_MAX_REAL FLT128_MAX 7819fa7d148SSatish Balay # define PETSC_MIN_REAL (-FLT128_MAX) 782d34fcf5fSBarry Smith # define PETSC_MACHINE_EPSILON FLT128_EPSILON 783ee223c85SLisandro Dalcin # define PETSC_SQRT_MACHINE_EPSILON 1.38777878078144567552953958511352539e-17Q 784ee223c85SLisandro Dalcin # define PETSC_SMALL 1.e-20Q 7855117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7865117d392SLisandro Dalcin # define PETSC_MAX_REAL 65504.0F 7879fa7d148SSatish Balay # define PETSC_MIN_REAL (-PETSC_MAX_REAL) 7885117d392SLisandro Dalcin # define PETSC_MACHINE_EPSILON .0009765625F 7895117d392SLisandro Dalcin # define PETSC_SQRT_MACHINE_EPSILON .03125F 7905117d392SLisandro Dalcin # define PETSC_SMALL 5.e-3F 7919cf09972SJed Brown #endif 7923e523bebSBarry Smith 79325d0f998SSatish Balay #define PETSC_INFINITY (PETSC_MAX_REAL/4) 7949fa7d148SSatish Balay #define PETSC_NINFINITY (-PETSC_INFINITY) 795e270355aSBarry Smith 7969f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsInfReal(PetscReal); 7973948c36eSLisandro Dalcin PETSC_EXTERN PetscBool PetscIsNanReal(PetscReal); 7988b49ba18SBarry Smith PETSC_EXTERN PetscBool PetscIsNormalReal(PetscReal); 7999f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanReal(PetscReal v) {return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;} 8009f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfScalar(PetscScalar v) {return PetscIsInfReal(PetscAbsScalar(v));} 8013948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNanScalar(PetscScalar v) {return PetscIsNanReal(PetscAbsScalar(v));} 8029f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanScalar(PetscScalar v) {return PetscIsInfOrNanReal(PetscAbsScalar(v));} 8033948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNormalScalar(PetscScalar v) {return PetscIsNormalReal(PetscAbsScalar(v));} 8049a25a3ccSBarry Smith 805b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal,PetscReal,PetscReal,PetscReal); 806ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal,PetscReal); 807ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar,PetscScalar); 808ce4818fdSLisandro Dalcin 80998725619SBarry Smith /* 81098725619SBarry Smith These macros are currently hardwired to match the regular data types, so there is no support for a different 81198725619SBarry Smith MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again. 81298725619SBarry Smith */ 81398725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR 81498725619SBarry Smith typedef PetscScalar MatScalar; 81598725619SBarry Smith typedef PetscReal MatReal; 81698725619SBarry Smith 8178ad47952SJed Brown struct petsc_mpiu_2scalar {PetscScalar a,b;}; 8188ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2scalar); 819df4397b0SStefano Zampini 820a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES) 8218ad47952SJed Brown struct petsc_mpiu_2int {PetscInt a,b;}; 8228ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2int); 8238ad47952SJed Brown #else 8248ad47952SJed Brown #define MPIU_2INT MPI_2INT 8258ad47952SJed Brown #endif 826e9fa29b7SSatish Balay 827b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscInt PetscPowInt(PetscInt base,PetscInt power) 828b2fb0278SBarry Smith { 829fa711258SJed Brown PetscInt result = 1; 830fa711258SJed Brown while (power) { 831fa711258SJed Brown if (power & 1) result *= base; 832fa711258SJed Brown power >>= 1; 833fa711258SJed Brown base *= base; 834fa711258SJed Brown } 835fa711258SJed Brown return result; 836fa711258SJed Brown } 837b2fb0278SBarry Smith 838b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscReal PetscPowRealInt(PetscReal base,PetscInt power) 839b2fb0278SBarry Smith { 840fa711258SJed Brown PetscReal result = 1; 841d98d5da7SBarry Smith if (power < 0) { 842d98d5da7SBarry Smith power = -power; 84310d40e53SLisandro Dalcin base = ((PetscReal)1)/base; 844d98d5da7SBarry Smith } 845fa711258SJed Brown while (power) { 846fa711258SJed Brown if (power & 1) result *= base; 847fa711258SJed Brown power >>= 1; 848fa711258SJed Brown base *= base; 849fa711258SJed Brown } 850fa711258SJed Brown return result; 851fa711258SJed Brown } 852fa711258SJed Brown 853b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarInt(PetscScalar base,PetscInt power) 854b2fb0278SBarry Smith { 8555117d392SLisandro Dalcin PetscScalar result = (PetscReal)1; 8568b49ba18SBarry Smith if (power < 0) { 8578b49ba18SBarry Smith power = -power; 85810d40e53SLisandro Dalcin base = ((PetscReal)1)/base; 8598b49ba18SBarry Smith } 8608b49ba18SBarry Smith while (power) { 8618b49ba18SBarry Smith if (power & 1) result *= base; 8628b49ba18SBarry Smith power >>= 1; 8638b49ba18SBarry Smith base *= base; 8648b49ba18SBarry Smith } 8658b49ba18SBarry Smith return result; 8668b49ba18SBarry Smith } 8678b49ba18SBarry Smith 868b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarReal(PetscScalar base,PetscReal power) 869b2fb0278SBarry Smith { 870b2fb0278SBarry Smith PetscScalar cpower = power; 871b2fb0278SBarry Smith return PetscPowScalar(base,cpower); 872b2fb0278SBarry Smith } 87378a59e97SMatthew G. Knepley 874bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt,const PetscReal[],const PetscReal[],PetscReal*,PetscReal*); 875e489efc1SBarry Smith #endif 876