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 */ 106524c165SJacob Faibussowitsch #ifndef PETSCMATH_H 1126bd1501SBarry Smith #define PETSCMATH_H 12ac09b921SBarry Smith 130a5f7794SBarry Smith #include <math.h> 1493d501b3SJacob Faibussowitsch #include <petscmacros.h> 15df4397b0SStefano Zampini #include <petscsystypes.h> 16df4397b0SStefano Zampini 17ac09b921SBarry Smith /* SUBMANSEC = Sys */ 18ac09b921SBarry Smith 195117d392SLisandro Dalcin /* 205117d392SLisandro Dalcin 215117d392SLisandro Dalcin Defines operations that are different for complex and real numbers. 225117d392SLisandro Dalcin All PETSc objects in one program are built around the object 235117d392SLisandro Dalcin PetscScalar which is either always a real or a complex. 245117d392SLisandro Dalcin 255117d392SLisandro Dalcin */ 265117d392SLisandro Dalcin 275117d392SLisandro Dalcin /* 285117d392SLisandro Dalcin Real number definitions 295117d392SLisandro Dalcin */ 305117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 315117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 325117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtf(a) 335117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypotf(a, b) 345117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2f(a, b) 355117d392SLisandro Dalcin #define PetscPowReal(a, b) powf(a, b) 365117d392SLisandro Dalcin #define PetscExpReal(a) expf(a) 375117d392SLisandro Dalcin #define PetscLogReal(a) logf(a) 385117d392SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 395117d392SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 405117d392SLisandro Dalcin #define PetscSinReal(a) sinf(a) 415117d392SLisandro Dalcin #define PetscCosReal(a) cosf(a) 425117d392SLisandro Dalcin #define PetscTanReal(a) tanf(a) 435117d392SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 445117d392SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 455117d392SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 465117d392SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 475117d392SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 485117d392SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 495117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhf(a) 505117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshf(a) 515117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhf(a) 52d6685f55SMatthew G. Knepley #define PetscErfReal(a) erff(a) 535117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 545117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 555117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmodf(a, b) 569c3ee494SJed Brown #define PetscCopysignReal(a, b) copysignf(a, b) 575117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 581f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 591f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 601f17fa70SToby Isaac #else 611f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 621f17fa70SToby Isaac #endif 635117d392SLisandro Dalcin 645117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 655117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrt(a) 665117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrt(a) 675117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypot(a, b) 685117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2(a, b) 695117d392SLisandro Dalcin #define PetscPowReal(a, b) pow(a, b) 705117d392SLisandro Dalcin #define PetscExpReal(a) exp(a) 715117d392SLisandro Dalcin #define PetscLogReal(a) log(a) 725117d392SLisandro Dalcin #define PetscLog10Real(a) log10(a) 735117d392SLisandro Dalcin #define PetscLog2Real(a) log2(a) 745117d392SLisandro Dalcin #define PetscSinReal(a) sin(a) 755117d392SLisandro Dalcin #define PetscCosReal(a) cos(a) 765117d392SLisandro Dalcin #define PetscTanReal(a) tan(a) 775117d392SLisandro Dalcin #define PetscAsinReal(a) asin(a) 785117d392SLisandro Dalcin #define PetscAcosReal(a) acos(a) 795117d392SLisandro Dalcin #define PetscAtanReal(a) atan(a) 805117d392SLisandro Dalcin #define PetscSinhReal(a) sinh(a) 815117d392SLisandro Dalcin #define PetscCoshReal(a) cosh(a) 825117d392SLisandro Dalcin #define PetscTanhReal(a) tanh(a) 835117d392SLisandro Dalcin #define PetscAsinhReal(a) asinh(a) 845117d392SLisandro Dalcin #define PetscAcoshReal(a) acosh(a) 855117d392SLisandro Dalcin #define PetscAtanhReal(a) atanh(a) 86d6685f55SMatthew G. Knepley #define PetscErfReal(a) erf(a) 875117d392SLisandro Dalcin #define PetscCeilReal(a) ceil(a) 885117d392SLisandro Dalcin #define PetscFloorReal(a) floor(a) 895117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmod(a, b) 909c3ee494SJed Brown #define PetscCopysignReal(a, b) copysign(a, b) 915117d392SLisandro Dalcin #define PetscTGamma(a) tgamma(a) 921f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 931f17fa70SToby Isaac #define PetscLGamma(a) gamma(a) 941f17fa70SToby Isaac #else 951f17fa70SToby Isaac #define PetscLGamma(a) lgamma(a) 961f17fa70SToby Isaac #endif 975117d392SLisandro Dalcin 985117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 995117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtq(a) 1005117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtq(a) 1015117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypotq(a, b) 1025117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2q(a, b) 1035117d392SLisandro Dalcin #define PetscPowReal(a, b) powq(a, b) 1045117d392SLisandro Dalcin #define PetscExpReal(a) expq(a) 1055117d392SLisandro Dalcin #define PetscLogReal(a) logq(a) 1065117d392SLisandro Dalcin #define PetscLog10Real(a) log10q(a) 1075117d392SLisandro Dalcin #define PetscLog2Real(a) log2q(a) 1085117d392SLisandro Dalcin #define PetscSinReal(a) sinq(a) 1095117d392SLisandro Dalcin #define PetscCosReal(a) cosq(a) 1105117d392SLisandro Dalcin #define PetscTanReal(a) tanq(a) 1115117d392SLisandro Dalcin #define PetscAsinReal(a) asinq(a) 1125117d392SLisandro Dalcin #define PetscAcosReal(a) acosq(a) 1135117d392SLisandro Dalcin #define PetscAtanReal(a) atanq(a) 1145117d392SLisandro Dalcin #define PetscSinhReal(a) sinhq(a) 1155117d392SLisandro Dalcin #define PetscCoshReal(a) coshq(a) 1165117d392SLisandro Dalcin #define PetscTanhReal(a) tanhq(a) 1175117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhq(a) 1185117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshq(a) 1195117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhq(a) 120d6685f55SMatthew G. Knepley #define PetscErfReal(a) erfq(a) 1215117d392SLisandro Dalcin #define PetscCeilReal(a) ceilq(a) 1225117d392SLisandro Dalcin #define PetscFloorReal(a) floorq(a) 1235117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmodq(a, b) 1249c3ee494SJed Brown #define PetscCopysignReal(a, b) copysignq(a, b) 1255117d392SLisandro Dalcin #define PetscTGamma(a) tgammaq(a) 1261f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 1271f17fa70SToby Isaac #define PetscLGamma(a) gammaq(a) 1281f17fa70SToby Isaac #else 1291f17fa70SToby Isaac #define PetscLGamma(a) lgammaq(a) 1301f17fa70SToby Isaac #endif 1315117d392SLisandro Dalcin 1325117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 1335117d392SLisandro Dalcin #define PetscSqrtReal(a) sqrtf(a) 1345117d392SLisandro Dalcin #define PetscCbrtReal(a) cbrtf(a) 1355117d392SLisandro Dalcin #define PetscHypotReal(a, b) hypotf(a, b) 1365117d392SLisandro Dalcin #define PetscAtan2Real(a, b) atan2f(a, b) 1375117d392SLisandro Dalcin #define PetscPowReal(a, b) powf(a, b) 1385117d392SLisandro Dalcin #define PetscExpReal(a) expf(a) 1395117d392SLisandro Dalcin #define PetscLogReal(a) logf(a) 1405117d392SLisandro Dalcin #define PetscLog10Real(a) log10f(a) 1415117d392SLisandro Dalcin #define PetscLog2Real(a) log2f(a) 1425117d392SLisandro Dalcin #define PetscSinReal(a) sinf(a) 1435117d392SLisandro Dalcin #define PetscCosReal(a) cosf(a) 1445117d392SLisandro Dalcin #define PetscTanReal(a) tanf(a) 1455117d392SLisandro Dalcin #define PetscAsinReal(a) asinf(a) 1465117d392SLisandro Dalcin #define PetscAcosReal(a) acosf(a) 1475117d392SLisandro Dalcin #define PetscAtanReal(a) atanf(a) 1485117d392SLisandro Dalcin #define PetscSinhReal(a) sinhf(a) 1495117d392SLisandro Dalcin #define PetscCoshReal(a) coshf(a) 1505117d392SLisandro Dalcin #define PetscTanhReal(a) tanhf(a) 1515117d392SLisandro Dalcin #define PetscAsinhReal(a) asinhf(a) 1525117d392SLisandro Dalcin #define PetscAcoshReal(a) acoshf(a) 1535117d392SLisandro Dalcin #define PetscAtanhReal(a) atanhf(a) 154d6685f55SMatthew G. Knepley #define PetscErfReal(a) erff(a) 1555117d392SLisandro Dalcin #define PetscCeilReal(a) ceilf(a) 1565117d392SLisandro Dalcin #define PetscFloorReal(a) floorf(a) 1575117d392SLisandro Dalcin #define PetscFmodReal(a, b) fmodf(a, b) 1589c3ee494SJed Brown #define PetscCopySignReal(a, b) copysignf(a, b) 1595117d392SLisandro Dalcin #define PetscTGamma(a) tgammaf(a) 1601f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA) 1611f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a) 1621f17fa70SToby Isaac #else 1631f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a) 1641f17fa70SToby Isaac #endif 1655117d392SLisandro Dalcin 1665117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 1675117d392SLisandro Dalcin 168d71ae5a4SJacob Faibussowitsch static inline PetscReal PetscSignReal(PetscReal a) 169d71ae5a4SJacob Faibussowitsch { 1705117d392SLisandro Dalcin return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0)); 1715117d392SLisandro Dalcin } 1725117d392SLisandro Dalcin 1735117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2) 1745117d392SLisandro Dalcin #undef PetscLog2Real 175d71ae5a4SJacob Faibussowitsch static inline PetscReal PetscLog2Real(PetscReal a) 176d71ae5a4SJacob Faibussowitsch { 1775117d392SLisandro Dalcin return PetscLogReal(a) / PetscLogReal((PetscReal)2); 1785117d392SLisandro Dalcin } 1795117d392SLisandro Dalcin #endif 1805117d392SLisandro Dalcin 181a2498233SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128) && !defined(PETSC_SKIP_REAL___FLOAT128) 18293d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PETSC_ATTRIBUTE_MPI_TYPE_TAG(__float128); 1835117d392SLisandro Dalcin #endif 184a2498233SPierre Jolivet #if defined(PETSC_HAVE_REAL___FP16) && !defined(PETSC_SKIP_REAL___FP16) 18593d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___FP16 PETSC_ATTRIBUTE_MPI_TYPE_TAG(__fp16); 1865117d392SLisandro Dalcin #endif 1875117d392SLisandro Dalcin 188df4397b0SStefano Zampini /*MC 18987497f52SBarry Smith MPIU_REAL - Portable MPI datatype corresponding to `PetscReal` independent of what precision `PetscReal` is in 190df4397b0SStefano Zampini 191df4397b0SStefano Zampini Notes: 19287497f52SBarry Smith In MPI calls that require an MPI datatype that matches a `PetscReal` or array of `PetscReal` values, pass this value. 193df4397b0SStefano Zampini 194df4397b0SStefano Zampini Level: beginner 195df4397b0SStefano Zampini 196db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT` 197df4397b0SStefano Zampini M*/ 198c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE) 199c1d390e3SJed Brown #define MPIU_REAL MPI_FLOAT 200c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE) 201c1d390e3SJed Brown #define MPIU_REAL MPI_DOUBLE 202c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128) 203c1d390e3SJed Brown #define MPIU_REAL MPIU___FLOAT128 204570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 205570b7f6dSBarry Smith #define MPIU_REAL MPIU___FP16 206c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */ 20759cb5930SBarry Smith 2081093a601SBarry Smith /* 2091093a601SBarry Smith Complex number definitions 2101093a601SBarry Smith */ 211df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX) 212450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128) 2131093a601SBarry Smith /* C++ support of complex number */ 214b7940d39SSatish Balay 2159fa27a79SStefano Zampini #define PetscRealPartComplex(a) (static_cast<PetscComplex>(a)).real() 2169fa27a79SStefano Zampini #define PetscImaginaryPartComplex(a) (static_cast<PetscComplex>(a)).imag() 2179fa27a79SStefano Zampini #define PetscAbsComplex(a) petsccomplexlib::abs(static_cast<PetscComplex>(a)) 2189fa27a79SStefano Zampini #define PetscArgComplex(a) petsccomplexlib::arg(static_cast<PetscComplex>(a)) 2199fa27a79SStefano Zampini #define PetscConjComplex(a) petsccomplexlib::conj(static_cast<PetscComplex>(a)) 2209fa27a79SStefano Zampini #define PetscSqrtComplex(a) petsccomplexlib::sqrt(static_cast<PetscComplex>(a)) 2219fa27a79SStefano Zampini #define PetscPowComplex(a, b) petsccomplexlib::pow(static_cast<PetscComplex>(a), static_cast<PetscComplex>(b)) 2229fa27a79SStefano Zampini #define PetscExpComplex(a) petsccomplexlib::exp(static_cast<PetscComplex>(a)) 2239fa27a79SStefano Zampini #define PetscLogComplex(a) petsccomplexlib::log(static_cast<PetscComplex>(a)) 2249fa27a79SStefano Zampini #define PetscSinComplex(a) petsccomplexlib::sin(static_cast<PetscComplex>(a)) 2259fa27a79SStefano Zampini #define PetscCosComplex(a) petsccomplexlib::cos(static_cast<PetscComplex>(a)) 2269fa27a79SStefano Zampini #define PetscTanComplex(a) petsccomplexlib::tan(static_cast<PetscComplex>(a)) 2279fa27a79SStefano Zampini #define PetscAsinComplex(a) petsccomplexlib::asin(static_cast<PetscComplex>(a)) 2289fa27a79SStefano Zampini #define PetscAcosComplex(a) petsccomplexlib::acos(static_cast<PetscComplex>(a)) 2299fa27a79SStefano Zampini #define PetscAtanComplex(a) petsccomplexlib::atan(static_cast<PetscComplex>(a)) 2309fa27a79SStefano Zampini #define PetscSinhComplex(a) petsccomplexlib::sinh(static_cast<PetscComplex>(a)) 2319fa27a79SStefano Zampini #define PetscCoshComplex(a) petsccomplexlib::cosh(static_cast<PetscComplex>(a)) 2329fa27a79SStefano Zampini #define PetscTanhComplex(a) petsccomplexlib::tanh(static_cast<PetscComplex>(a)) 2339fa27a79SStefano Zampini #define PetscAsinhComplex(a) petsccomplexlib::asinh(static_cast<PetscComplex>(a)) 2349fa27a79SStefano Zampini #define PetscAcoshComplex(a) petsccomplexlib::acosh(static_cast<PetscComplex>(a)) 2359fa27a79SStefano Zampini #define PetscAtanhComplex(a) petsccomplexlib::atanh(static_cast<PetscComplex>(a)) 2365117d392SLisandro Dalcin 2375117d392SLisandro Dalcin /* TODO: Add configure tests 2385117d392SLisandro Dalcin 2395117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX) 2405117d392SLisandro Dalcin #undef PetscTanComplex 2419fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanComplex(PetscComplex z) 2425117d392SLisandro Dalcin { 2435117d392SLisandro Dalcin return PetscSinComplex(z)/PetscCosComplex(z); 2445117d392SLisandro Dalcin } 245027d9794SBarry Smith #endif 246debe9ee2SPaul Mullowney 2475117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX) 2485117d392SLisandro Dalcin #undef PetscTanhComplex 2499fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanhComplex(PetscComplex z) 2505117d392SLisandro Dalcin { 2515117d392SLisandro Dalcin return PetscSinhComplex(z)/PetscCoshComplex(z); 2525117d392SLisandro Dalcin } 2535117d392SLisandro Dalcin #endif 2545117d392SLisandro Dalcin 2555117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX) 2565117d392SLisandro Dalcin #undef PetscAsinComplex 2579fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinComplex(PetscComplex z) 2585117d392SLisandro Dalcin { 2595117d392SLisandro Dalcin const PetscComplex j(0,1); 2605117d392SLisandro Dalcin return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z)); 2615117d392SLisandro Dalcin } 2625117d392SLisandro Dalcin #endif 2635117d392SLisandro Dalcin 2645117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX) 2655117d392SLisandro Dalcin #undef PetscAcosComplex 2669fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcosComplex(PetscComplex z) 2675117d392SLisandro Dalcin { 2685117d392SLisandro Dalcin const PetscComplex j(0,1); 2695117d392SLisandro Dalcin return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z)); 2705117d392SLisandro Dalcin } 2715117d392SLisandro Dalcin #endif 2725117d392SLisandro Dalcin 2735117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX) 2745117d392SLisandro Dalcin #undef PetscAtanComplex 2759fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanComplex(PetscComplex z) 2765117d392SLisandro Dalcin { 2775117d392SLisandro Dalcin const PetscComplex j(0,1); 2785117d392SLisandro Dalcin return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z)); 2795117d392SLisandro Dalcin } 2805117d392SLisandro Dalcin #endif 2815117d392SLisandro Dalcin 2825117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX) 2835117d392SLisandro Dalcin #undef PetscAsinhComplex 2849fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinhComplex(PetscComplex z) 2855117d392SLisandro Dalcin { 2865117d392SLisandro Dalcin return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f)); 2875117d392SLisandro Dalcin } 2885117d392SLisandro Dalcin #endif 2895117d392SLisandro Dalcin 2905117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX) 2915117d392SLisandro Dalcin #undef PetscAcoshComplex 2929fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcoshComplex(PetscComplex z) 2935117d392SLisandro Dalcin { 2945117d392SLisandro Dalcin return PetscLogComplex(z+PetscSqrtComplex(z*z-1.0f)); 2955117d392SLisandro Dalcin } 2965117d392SLisandro Dalcin #endif 2975117d392SLisandro Dalcin 2985117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATANH_COMPLEX) 2995117d392SLisandro Dalcin #undef PetscAtanhComplex 3009fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanhComplex(PetscComplex z) 3015117d392SLisandro Dalcin { 3025117d392SLisandro Dalcin return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z)); 3035117d392SLisandro Dalcin } 3045117d392SLisandro Dalcin #endif 3055117d392SLisandro Dalcin 3065117d392SLisandro Dalcin */ 3075117d392SLisandro Dalcin 3087a19d461SSatish Balay #else /* C99 support of complex number */ 309519e2a1fSPaul Mullowney 3107a19d461SSatish Balay #if defined(PETSC_USE_REAL_SINGLE) 31150f81f78SJed Brown #define PetscRealPartComplex(a) crealf(a) 31250f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a) 31350f81f78SJed Brown #define PetscAbsComplex(a) cabsf(a) 3145117d392SLisandro Dalcin #define PetscArgComplex(a) cargf(a) 31550f81f78SJed Brown #define PetscConjComplex(a) conjf(a) 31650f81f78SJed Brown #define PetscSqrtComplex(a) csqrtf(a) 31750f81f78SJed Brown #define PetscPowComplex(a, b) cpowf(a, b) 31850f81f78SJed Brown #define PetscExpComplex(a) cexpf(a) 31950f81f78SJed Brown #define PetscLogComplex(a) clogf(a) 32050f81f78SJed Brown #define PetscSinComplex(a) csinf(a) 32150f81f78SJed Brown #define PetscCosComplex(a) ccosf(a) 3225117d392SLisandro Dalcin #define PetscTanComplex(a) ctanf(a) 323255453a1SBarry Smith #define PetscAsinComplex(a) casinf(a) 324255453a1SBarry Smith #define PetscAcosComplex(a) cacosf(a) 3255117d392SLisandro Dalcin #define PetscAtanComplex(a) catanf(a) 326a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhf(a) 327a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshf(a) 328a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhf(a) 3295117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinhf(a) 3305117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacoshf(a) 3315117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanhf(a) 3321093a601SBarry Smith 333ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 33450f81f78SJed Brown #define PetscRealPartComplex(a) creal(a) 33550f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a) 33650f81f78SJed Brown #define PetscAbsComplex(a) cabs(a) 3375117d392SLisandro Dalcin #define PetscArgComplex(a) carg(a) 33850f81f78SJed Brown #define PetscConjComplex(a) conj(a) 33950f81f78SJed Brown #define PetscSqrtComplex(a) csqrt(a) 34050f81f78SJed Brown #define PetscPowComplex(a, b) cpow(a, b) 34150f81f78SJed Brown #define PetscExpComplex(a) cexp(a) 34250f81f78SJed Brown #define PetscLogComplex(a) clog(a) 34350f81f78SJed Brown #define PetscSinComplex(a) csin(a) 34450f81f78SJed Brown #define PetscCosComplex(a) ccos(a) 3455117d392SLisandro Dalcin #define PetscTanComplex(a) ctan(a) 346255453a1SBarry Smith #define PetscAsinComplex(a) casin(a) 347255453a1SBarry Smith #define PetscAcosComplex(a) cacos(a) 3485117d392SLisandro Dalcin #define PetscAtanComplex(a) catan(a) 349a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinh(a) 350a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccosh(a) 351a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanh(a) 3525117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinh(a) 3535117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacosh(a) 3545117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanh(a) 3551093a601SBarry Smith 3568c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128) 35750f81f78SJed Brown #define PetscRealPartComplex(a) crealq(a) 35850f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a) 35950f81f78SJed Brown #define PetscAbsComplex(a) cabsq(a) 3605117d392SLisandro Dalcin #define PetscArgComplex(a) cargq(a) 36150f81f78SJed Brown #define PetscConjComplex(a) conjq(a) 36250f81f78SJed Brown #define PetscSqrtComplex(a) csqrtq(a) 36350f81f78SJed Brown #define PetscPowComplex(a, b) cpowq(a, b) 36450f81f78SJed Brown #define PetscExpComplex(a) cexpq(a) 36550f81f78SJed Brown #define PetscLogComplex(a) clogq(a) 36650f81f78SJed Brown #define PetscSinComplex(a) csinq(a) 36750f81f78SJed Brown #define PetscCosComplex(a) ccosq(a) 3685117d392SLisandro Dalcin #define PetscTanComplex(a) ctanq(a) 369255453a1SBarry Smith #define PetscAsinComplex(a) casinq(a) 370255453a1SBarry Smith #define PetscAcosComplex(a) cacosq(a) 3715117d392SLisandro Dalcin #define PetscAtanComplex(a) catanq(a) 372a4bea5a6SPeter Brune #define PetscSinhComplex(a) csinhq(a) 373a4bea5a6SPeter Brune #define PetscCoshComplex(a) ccoshq(a) 374a4bea5a6SPeter Brune #define PetscTanhComplex(a) ctanhq(a) 3755117d392SLisandro Dalcin #define PetscAsinhComplex(a) casinhq(a) 3765117d392SLisandro Dalcin #define PetscAcoshComplex(a) cacoshq(a) 3775117d392SLisandro Dalcin #define PetscAtanhComplex(a) catanhq(a) 378a4bea5a6SPeter Brune 379ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */ 3807a19d461SSatish Balay #endif /* (__cplusplus) */ 381e489efc1SBarry Smith 3821093a601SBarry Smith /* 3835117d392SLisandro Dalcin PETSC_i is the imaginary number, i 3841093a601SBarry Smith */ 38550f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i; 3868a351411SToby Isaac 3875117d392SLisandro Dalcin /* 3885117d392SLisandro Dalcin Try to do the right thing for complex number construction: see 3898a351411SToby Isaac http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm 3908a351411SToby Isaac for details 3918a351411SToby Isaac */ 392d71ae5a4SJacob Faibussowitsch static inline PetscComplex PetscCMPLX(PetscReal x, PetscReal y) 393d71ae5a4SJacob Faibussowitsch { 394450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128) 3958a351411SToby Isaac return PetscComplex(x, y); 3968a351411SToby Isaac #elif defined(_Imaginary_I) 3978a351411SToby Isaac return x + y * _Imaginary_I; 3988a351411SToby Isaac #else 399616d7c5eSToby Isaac { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5), 400616d7c5eSToby Isaac 401616d7c5eSToby Isaac "For each floating type there is a corresponding real type, which is always a real floating 402616d7c5eSToby Isaac type. For real floating types, it is the same type. For complex types, it is the type given 403616d7c5eSToby Isaac by deleting the keyword _Complex from the type name." 404616d7c5eSToby Isaac 405616d7c5eSToby Isaac So type punning should be portable. */ 4069371c9d4SSatish Balay union 4079371c9d4SSatish Balay { 4089371c9d4SSatish Balay PetscComplex z; 4099371c9d4SSatish Balay PetscReal f[2]; 4109371c9d4SSatish Balay } uz; 411616d7c5eSToby Isaac 412616d7c5eSToby Isaac uz.f[0] = x; 413616d7c5eSToby Isaac uz.f[1] = y; 414616d7c5eSToby Isaac return uz.z; 415616d7c5eSToby Isaac } 41650f81f78SJed Brown #endif 4178a351411SToby Isaac } 4188a351411SToby Isaac 419*edd03b47SJacob Faibussowitsch #define MPIU_C_COMPLEX MPI_C_COMPLEX PETSC_DEPRECATED_MACRO(3, 15, 0, "MPI_C_COMPLEX", ) 420*edd03b47SJacob Faibussowitsch #define MPIU_C_DOUBLE_COMPLEX MPI_C_DOUBLE_COMPLEX PETSC_DEPRECATED_MACRO(3, 15, 0, "MPI_C_DOUBLE_COMPLEX", ) 421de272c7aSSatish Balay 422a2498233SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128) && !defined(PETSC_SKIP_REAL___FLOAT128) 42393d501b3SJacob Faibussowitsch // if complex is not used, then quadmath.h won't be included by petscsystypes.h 42493d501b3SJacob Faibussowitsch #if defined(PETSC_USE_COMPLEX) 42593d501b3SJacob Faibussowitsch #define MPIU___COMPLEX128_ATTR_TAG PETSC_ATTRIBUTE_MPI_TYPE_TAG(__complex128) 42693d501b3SJacob Faibussowitsch #else 42793d501b3SJacob Faibussowitsch #define MPIU___COMPLEX128_ATTR_TAG 42893d501b3SJacob Faibussowitsch #endif 42993d501b3SJacob Faibussowitsch 43093d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 MPIU___COMPLEX128_ATTR_TAG; 43193d501b3SJacob Faibussowitsch 43293d501b3SJacob Faibussowitsch #undef MPIU___COMPLEX128_ATTR_TAG 433613bf2b2SPierre Jolivet #endif /* PETSC_HAVE_REAL___FLOAT128 */ 4345117d392SLisandro Dalcin 4355117d392SLisandro Dalcin /*MC 43687497f52SBarry Smith MPIU_COMPLEX - Portable MPI datatype corresponding to `PetscComplex` independent of the precision of `PetscComplex` 4375117d392SLisandro Dalcin 4385117d392SLisandro Dalcin Notes: 43987497f52SBarry Smith In MPI calls that require an MPI datatype that matches a `PetscComplex` or array of `PetscComplex` values, pass this value. 4405117d392SLisandro Dalcin 4415117d392SLisandro Dalcin Level: beginner 4425117d392SLisandro Dalcin 443db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`, `PETSC_i` 4445117d392SLisandro Dalcin M*/ 4455117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 446de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_COMPLEX 4475117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 448de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX 4495117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 4505117d392SLisandro Dalcin #define MPIU_COMPLEX MPIU___COMPLEX128 4515117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 452de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_COMPLEX 4535117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */ 4545117d392SLisandro Dalcin 4555117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */ 4565117d392SLisandro Dalcin 4575117d392SLisandro Dalcin /* 4585117d392SLisandro Dalcin Scalar number definitions 4595117d392SLisandro Dalcin */ 4607a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX) 4615117d392SLisandro Dalcin /*MC 46287497f52SBarry Smith MPIU_SCALAR - Portable MPI datatype corresponding to `PetscScalar` independent of the precision of `PetscScalar` 4635117d392SLisandro Dalcin 4645117d392SLisandro Dalcin Notes: 46587497f52SBarry Smith In MPI calls that require an MPI datatype that matches a `PetscScalar` or array of `PetscScalar` values, pass this value. 4665117d392SLisandro Dalcin 4675117d392SLisandro Dalcin Level: beginner 4685117d392SLisandro Dalcin 469db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_COMPLEX`, `MPIU_INT` 4705117d392SLisandro Dalcin M*/ 4715117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX 4725117d392SLisandro Dalcin 4735117d392SLisandro Dalcin /*MC 47487497f52SBarry Smith PetscRealPart - Returns the real part of a `PetscScalar` 4755117d392SLisandro Dalcin 4765117d392SLisandro Dalcin Synopsis: 4775117d392SLisandro Dalcin #include <petscmath.h> 4785117d392SLisandro Dalcin PetscReal PetscRealPart(PetscScalar v) 4795117d392SLisandro Dalcin 4805117d392SLisandro Dalcin Not Collective 4815117d392SLisandro Dalcin 4825117d392SLisandro Dalcin Input Parameter: 4835117d392SLisandro Dalcin . v - value to find the real part of 4845117d392SLisandro Dalcin 4855117d392SLisandro Dalcin Level: beginner 4865117d392SLisandro Dalcin 487db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscImaginaryPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 4885117d392SLisandro Dalcin M*/ 4895117d392SLisandro Dalcin #define PetscRealPart(a) PetscRealPartComplex(a) 4905117d392SLisandro Dalcin 4915117d392SLisandro Dalcin /*MC 49287497f52SBarry Smith PetscImaginaryPart - Returns the imaginary part of a `PetscScalar` 4935117d392SLisandro Dalcin 4945117d392SLisandro Dalcin Synopsis: 4955117d392SLisandro Dalcin #include <petscmath.h> 4965117d392SLisandro Dalcin PetscReal PetscImaginaryPart(PetscScalar v) 4975117d392SLisandro Dalcin 4985117d392SLisandro Dalcin Not Collective 4995117d392SLisandro Dalcin 5005117d392SLisandro Dalcin Input Parameter: 5015117d392SLisandro Dalcin . v - value to find the imaginary part of 5025117d392SLisandro Dalcin 5035117d392SLisandro Dalcin Level: beginner 5045117d392SLisandro Dalcin 5055117d392SLisandro Dalcin Notes: 5065117d392SLisandro Dalcin If PETSc was configured for real numbers then this always returns the value 0 5075117d392SLisandro Dalcin 508db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscRealPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 5095117d392SLisandro Dalcin M*/ 5105117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a) 5115117d392SLisandro Dalcin 5125117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsComplex(a) 5135117d392SLisandro Dalcin #define PetscArgScalar(a) PetscArgComplex(a) 5145117d392SLisandro Dalcin #define PetscConj(a) PetscConjComplex(a) 5155117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtComplex(a) 5165117d392SLisandro Dalcin #define PetscPowScalar(a, b) PetscPowComplex(a, b) 5175117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpComplex(a) 5185117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogComplex(a) 5195117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinComplex(a) 5205117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosComplex(a) 5215117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanComplex(a) 5225117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinComplex(a) 5235117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosComplex(a) 5245117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanComplex(a) 5255117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhComplex(a) 5265117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshComplex(a) 5275117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhComplex(a) 5285117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhComplex(a) 5295117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshComplex(a) 5305117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhComplex(a) 5315117d392SLisandro Dalcin 5325117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */ 5335117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_REAL 5345117d392SLisandro Dalcin #define PetscRealPart(a) (a) 5355117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0) 5365117d392SLisandro Dalcin #define PetscAbsScalar(a) PetscAbsReal(a) 5375117d392SLisandro Dalcin #define PetscArgScalar(a) (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0) 5385117d392SLisandro Dalcin #define PetscConj(a) (a) 5395117d392SLisandro Dalcin #define PetscSqrtScalar(a) PetscSqrtReal(a) 5405117d392SLisandro Dalcin #define PetscPowScalar(a, b) PetscPowReal(a, b) 5415117d392SLisandro Dalcin #define PetscExpScalar(a) PetscExpReal(a) 5425117d392SLisandro Dalcin #define PetscLogScalar(a) PetscLogReal(a) 5435117d392SLisandro Dalcin #define PetscSinScalar(a) PetscSinReal(a) 5445117d392SLisandro Dalcin #define PetscCosScalar(a) PetscCosReal(a) 5455117d392SLisandro Dalcin #define PetscTanScalar(a) PetscTanReal(a) 5465117d392SLisandro Dalcin #define PetscAsinScalar(a) PetscAsinReal(a) 5475117d392SLisandro Dalcin #define PetscAcosScalar(a) PetscAcosReal(a) 5485117d392SLisandro Dalcin #define PetscAtanScalar(a) PetscAtanReal(a) 5495117d392SLisandro Dalcin #define PetscSinhScalar(a) PetscSinhReal(a) 5505117d392SLisandro Dalcin #define PetscCoshScalar(a) PetscCoshReal(a) 5515117d392SLisandro Dalcin #define PetscTanhScalar(a) PetscTanhReal(a) 5525117d392SLisandro Dalcin #define PetscAsinhScalar(a) PetscAsinhReal(a) 5535117d392SLisandro Dalcin #define PetscAcoshScalar(a) PetscAcoshReal(a) 5545117d392SLisandro Dalcin #define PetscAtanhScalar(a) PetscAtanhReal(a) 5555117d392SLisandro Dalcin 5565117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */ 5575117d392SLisandro Dalcin 5585117d392SLisandro Dalcin /* 5595117d392SLisandro Dalcin Certain objects may be created using either single or double precision. 5605117d392SLisandro Dalcin This is currently not used. 5615117d392SLisandro Dalcin */ 5629371c9d4SSatish Balay typedef enum { 5639371c9d4SSatish Balay PETSC_SCALAR_DOUBLE, 5649371c9d4SSatish Balay PETSC_SCALAR_SINGLE, 5659371c9d4SSatish Balay PETSC_SCALAR_LONG_DOUBLE, 5669371c9d4SSatish Balay PETSC_SCALAR_HALF 5679371c9d4SSatish Balay } PetscScalarPrecision; 5685117d392SLisandro Dalcin 5695117d392SLisandro Dalcin /*MC 5705117d392SLisandro Dalcin PetscAbs - Returns the absolute value of a number 5715117d392SLisandro Dalcin 5725117d392SLisandro Dalcin Synopsis: 5735117d392SLisandro Dalcin #include <petscmath.h> 5745117d392SLisandro Dalcin type PetscAbs(type v) 5755117d392SLisandro Dalcin 5765117d392SLisandro Dalcin Not Collective 5775117d392SLisandro Dalcin 5785117d392SLisandro Dalcin Input Parameter: 5795117d392SLisandro Dalcin . v - the number 5805117d392SLisandro Dalcin 58116a05f60SBarry Smith Level: beginner 58216a05f60SBarry Smith 58387497f52SBarry Smith Note: 58487497f52SBarry Smith The type can be integer or real floating point value, but cannot be complex 5855117d392SLisandro Dalcin 58616a05f60SBarry Smith .seealso: `PetscAbsInt()`, `PetscAbsReal()`, `PetscAbsScalar()`, `PetscSign()` 5875117d392SLisandro Dalcin M*/ 5885117d392SLisandro Dalcin #define PetscAbs(a) (((a) >= 0) ? (a) : (-(a))) 5895117d392SLisandro Dalcin 5905117d392SLisandro Dalcin /*MC 5915117d392SLisandro Dalcin PetscSign - Returns the sign of a number as an integer 5925117d392SLisandro Dalcin 5935117d392SLisandro Dalcin Synopsis: 5945117d392SLisandro Dalcin #include <petscmath.h> 5955117d392SLisandro Dalcin int PetscSign(type v) 5965117d392SLisandro Dalcin 5975117d392SLisandro Dalcin Not Collective 5985117d392SLisandro Dalcin 5995117d392SLisandro Dalcin Input Parameter: 6005117d392SLisandro Dalcin . v - the number 6015117d392SLisandro Dalcin 60216a05f60SBarry Smith Level: beginner 60316a05f60SBarry Smith 60487497f52SBarry Smith Note: 60587497f52SBarry Smith The type can be integer or real floating point value 6065117d392SLisandro Dalcin 60716a05f60SBarry Smith .seealso: `PetscAbsInt()`, `PetscAbsReal()`, `PetscAbsScalar()` 6085117d392SLisandro Dalcin M*/ 6095117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1) 610e489efc1SBarry Smith 611b6a5bde7SBarry Smith /*MC 612b6a5bde7SBarry Smith PetscMin - Returns minimum of two numbers 613b6a5bde7SBarry Smith 614eca87e8dSBarry Smith Synopsis: 615aaa7dc30SBarry Smith #include <petscmath.h> 616eca87e8dSBarry Smith type PetscMin(type v1,type v2) 617eca87e8dSBarry Smith 618eca87e8dSBarry Smith Not Collective 619eca87e8dSBarry Smith 620d8d19677SJose E. Roman Input Parameters: 621b6a5bde7SBarry Smith + v1 - first value to find minimum of 622b6a5bde7SBarry Smith - v2 - second value to find minimum of 623b6a5bde7SBarry Smith 62416a05f60SBarry Smith Level: beginner 62516a05f60SBarry Smith 62687497f52SBarry Smith Note: 62787497f52SBarry Smith The type can be integer or floating point value 628b6a5bde7SBarry Smith 629db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 630b6a5bde7SBarry Smith M*/ 631e489efc1SBarry Smith #define PetscMin(a, b) (((a) < (b)) ? (a) : (b)) 632b6a5bde7SBarry Smith 633b6a5bde7SBarry Smith /*MC 634d5b43468SJose E. Roman PetscMax - Returns maximum of two numbers 635b6a5bde7SBarry Smith 636eca87e8dSBarry Smith Synopsis: 637aaa7dc30SBarry Smith #include <petscmath.h> 638eca87e8dSBarry Smith type max PetscMax(type v1,type v2) 639eca87e8dSBarry Smith 640eca87e8dSBarry Smith Not Collective 641eca87e8dSBarry Smith 642d8d19677SJose E. Roman Input Parameters: 643b6a5bde7SBarry Smith + v1 - first value to find maximum of 644b6a5bde7SBarry Smith - v2 - second value to find maximum of 645b6a5bde7SBarry Smith 64616a05f60SBarry Smith Level: beginner 64716a05f60SBarry Smith 64887497f52SBarry Smith Note: 64987497f52SBarry Smith The type can be integer or floating point value 650b6a5bde7SBarry Smith 651db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 652b6a5bde7SBarry Smith M*/ 653e489efc1SBarry Smith #define PetscMax(a, b) (((a) < (b)) ? (b) : (a)) 654b6a5bde7SBarry Smith 655b6a5bde7SBarry Smith /*MC 656d9a4bb16SJed Brown PetscClipInterval - Returns a number clipped to be within an interval 657d9a4bb16SJed Brown 658d9a4bb16SJed Brown Synopsis: 659aaa7dc30SBarry Smith #include <petscmath.h> 660d9a4bb16SJed Brown type clip PetscClipInterval(type x,type a,type b) 661d9a4bb16SJed Brown 662d9a4bb16SJed Brown Not Collective 663d9a4bb16SJed Brown 664d8d19677SJose E. Roman Input Parameters: 6650d398bfeSStefano Zampini + x - value to use if within interval [a,b] 666d9a4bb16SJed Brown . a - lower end of interval 667d9a4bb16SJed Brown - b - upper end of interval 668d9a4bb16SJed Brown 66916a05f60SBarry Smith Level: beginner 67016a05f60SBarry Smith 67187497f52SBarry Smith Note: 67287497f52SBarry Smith The type can be integer or floating point value 673d9a4bb16SJed Brown 674db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscMax()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()` 675d9a4bb16SJed Brown M*/ 676d9a4bb16SJed Brown #define PetscClipInterval(x, a, b) (PetscMax((a), PetscMin((x), (b)))) 677d9a4bb16SJed Brown 678d9a4bb16SJed Brown /*MC 679b6a5bde7SBarry Smith PetscAbsInt - Returns the absolute value of an integer 680b6a5bde7SBarry Smith 681b6a5bde7SBarry Smith Synopsis: 682aaa7dc30SBarry Smith #include <petscmath.h> 683b6a5bde7SBarry Smith int abs PetscAbsInt(int v1) 684b6a5bde7SBarry Smith 685eca87e8dSBarry Smith Input Parameter: 686eca87e8dSBarry Smith . v1 - the integer 687b6a5bde7SBarry Smith 688b6a5bde7SBarry Smith Level: beginner 689b6a5bde7SBarry Smith 690db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsReal()`, `PetscSqr()` 691b6a5bde7SBarry Smith M*/ 6929fa7d148SSatish Balay #define PetscAbsInt(a) (((a) < 0) ? (-(a)) : (a)) 693b6a5bde7SBarry Smith 694b6a5bde7SBarry Smith /*MC 695b6a5bde7SBarry Smith PetscAbsReal - Returns the absolute value of an real number 696b6a5bde7SBarry Smith 697eca87e8dSBarry Smith Synopsis: 698aaa7dc30SBarry Smith #include <petscmath.h> 699eca87e8dSBarry Smith Real abs PetscAbsReal(PetscReal v1) 700eca87e8dSBarry Smith 701b6a5bde7SBarry Smith Input Parameter: 70216a05f60SBarry Smith . v1 - the `PetscReal` value 703b6a5bde7SBarry Smith 704b6a5bde7SBarry Smith Level: beginner 705b6a5bde7SBarry Smith 706db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscSqr()` 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 73016a05f60SBarry Smith Level: beginner 73116a05f60SBarry Smith 73287497f52SBarry Smith Note: 73387497f52SBarry Smith The type can be integer or floating point value 734b6a5bde7SBarry Smith 735db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()` 736b6a5bde7SBarry Smith M*/ 7374ebda54eSMatthew Knepley #define PetscSqr(a) ((a) * (a)) 738e489efc1SBarry Smith 739ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE) 740ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F 7415117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 7425117d392SLisandro Dalcin #define PetscRealConstant(constant) constant 743ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128) 744ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q 7455117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7465117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F 747ee223c85SLisandro Dalcin #endif 748ee223c85SLisandro Dalcin 749314da920SBarry Smith /* 750d34fcf5fSBarry Smith Basic constants 751314da920SBarry Smith */ 7522fab75feSLisandro Dalcin #define PETSC_PI PetscRealConstant(3.1415926535897932384626433832795029) 7532fab75feSLisandro Dalcin #define PETSC_PHI PetscRealConstant(1.6180339887498948482045868343656381) 7547b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981) 755d34fcf5fSBarry Smith 756ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 757ab824b78SBarry Smith #define PETSC_MAX_REAL 3.40282346638528860e+38F 7589fa7d148SSatish Balay #define PETSC_MIN_REAL (-PETSC_MAX_REAL) 759f87a0b54SStefano Zampini #define PETSC_REAL_MIN 1.1754944e-38F 76082a7e548SBarry Smith #define PETSC_MACHINE_EPSILON 1.19209290e-07F 76182a7e548SBarry Smith #define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F 762ee223c85SLisandro Dalcin #define PETSC_SMALL 1.e-5F 763ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE) 764ab824b78SBarry Smith #define PETSC_MAX_REAL 1.7976931348623157e+308 7659fa7d148SSatish Balay #define PETSC_MIN_REAL (-PETSC_MAX_REAL) 766f87a0b54SStefano Zampini #define PETSC_REAL_MIN 2.225073858507201e-308 76782a7e548SBarry Smith #define PETSC_MACHINE_EPSILON 2.2204460492503131e-16 76882a7e548SBarry Smith #define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08 769cf6e855fSSatish Balay #define PETSC_SMALL 1.e-10 770ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128) 771ea345e14SBarry Smith #define PETSC_MAX_REAL FLT128_MAX 7729fa7d148SSatish Balay #define PETSC_MIN_REAL (-FLT128_MAX) 773f87a0b54SStefano Zampini #define PETSC_REAL_MIN FLT128_MIN 774d34fcf5fSBarry Smith #define PETSC_MACHINE_EPSILON FLT128_EPSILON 775ee223c85SLisandro Dalcin #define PETSC_SQRT_MACHINE_EPSILON 1.38777878078144567552953958511352539e-17Q 776ee223c85SLisandro Dalcin #define PETSC_SMALL 1.e-20Q 7775117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16) 7785117d392SLisandro Dalcin #define PETSC_MAX_REAL 65504.0F 7799fa7d148SSatish Balay #define PETSC_MIN_REAL (-PETSC_MAX_REAL) 780f87a0b54SStefano Zampini #define PETSC_REAL_MIN .00006103515625F 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); 792d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanReal(PetscReal v) 793d71ae5a4SJacob Faibussowitsch { 7949371c9d4SSatish Balay return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE; 7959371c9d4SSatish Balay } 796d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsInfScalar(PetscScalar v) 797d71ae5a4SJacob Faibussowitsch { 7989371c9d4SSatish Balay return PetscIsInfReal(PetscAbsScalar(v)); 7999371c9d4SSatish Balay } 800d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsNanScalar(PetscScalar v) 801d71ae5a4SJacob Faibussowitsch { 8029371c9d4SSatish Balay return PetscIsNanReal(PetscAbsScalar(v)); 8039371c9d4SSatish Balay } 804d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanScalar(PetscScalar v) 805d71ae5a4SJacob Faibussowitsch { 8069371c9d4SSatish Balay return PetscIsInfOrNanReal(PetscAbsScalar(v)); 8079371c9d4SSatish Balay } 808d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsNormalScalar(PetscScalar v) 809d71ae5a4SJacob Faibussowitsch { 8109371c9d4SSatish Balay return PetscIsNormalReal(PetscAbsScalar(v)); 8119371c9d4SSatish Balay } 8129a25a3ccSBarry Smith 813b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal, PetscReal, PetscReal, PetscReal); 814ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal, PetscReal); 815ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar, PetscScalar); 816ce4818fdSLisandro Dalcin 81728dd6638SJacob Faibussowitsch /*@C 81828dd6638SJacob Faibussowitsch PetscIsCloseAtTolScalar - Like `PetscIsCloseAtTol()` but for `PetscScalar` 81928dd6638SJacob Faibussowitsch 82028dd6638SJacob Faibussowitsch Input Parameters: 82128dd6638SJacob Faibussowitsch + lhs - The first number 82228dd6638SJacob Faibussowitsch . rhs - The second number 82328dd6638SJacob Faibussowitsch . rtol - The relative tolerance 82428dd6638SJacob Faibussowitsch - atol - The absolute tolerance 82528dd6638SJacob Faibussowitsch 82628dd6638SJacob Faibussowitsch Level: beginner 82728dd6638SJacob Faibussowitsch 82828dd6638SJacob Faibussowitsch Note: 82928dd6638SJacob Faibussowitsch This routine is equivalent to `PetscIsCloseAtTol()` when PETSc is configured without complex 83028dd6638SJacob Faibussowitsch numbers. 83128dd6638SJacob Faibussowitsch 83228dd6638SJacob Faibussowitsch .seealso: `PetscIsCloseAtTol()` 83328dd6638SJacob Faibussowitsch @*/ 83428dd6638SJacob Faibussowitsch static inline PetscBool PetscIsCloseAtTolScalar(PetscScalar lhs, PetscScalar rhs, PetscReal rtol, PetscReal atol) 83528dd6638SJacob Faibussowitsch { 83628dd6638SJacob Faibussowitsch PetscBool close = PetscIsCloseAtTol(PetscRealPart(lhs), PetscRealPart(rhs), rtol, atol); 83728dd6638SJacob Faibussowitsch 83828dd6638SJacob Faibussowitsch if (PetscDefined(USE_COMPLEX)) close = (PetscBool)(close && PetscIsCloseAtTol(PetscImaginaryPart(lhs), PetscImaginaryPart(rhs), rtol, atol)); 83928dd6638SJacob Faibussowitsch return close; 84028dd6638SJacob Faibussowitsch } 84128dd6638SJacob Faibussowitsch 84298725619SBarry Smith /* 84398725619SBarry Smith These macros are currently hardwired to match the regular data types, so there is no support for a different 84498725619SBarry Smith MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again. 84598725619SBarry Smith */ 84698725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR 84798725619SBarry Smith typedef PetscScalar MatScalar; 84898725619SBarry Smith typedef PetscReal MatReal; 84998725619SBarry Smith 8509371c9d4SSatish Balay struct petsc_mpiu_2scalar { 8519371c9d4SSatish Balay PetscScalar a, b; 8529371c9d4SSatish Balay }; 85393d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_2scalar); 854df4397b0SStefano Zampini 85593d501b3SJacob Faibussowitsch /* MPI Datatypes for composite reductions */ 85693d501b3SJacob Faibussowitsch struct petsc_mpiu_real_int { 85793d501b3SJacob Faibussowitsch PetscReal v; 85893d501b3SJacob Faibussowitsch PetscInt i; 85993d501b3SJacob Faibussowitsch }; 86093d501b3SJacob Faibussowitsch 86193d501b3SJacob Faibussowitsch struct petsc_mpiu_scalar_int { 86293d501b3SJacob Faibussowitsch PetscScalar v; 86393d501b3SJacob Faibussowitsch PetscInt i; 86493d501b3SJacob Faibussowitsch }; 86593d501b3SJacob Faibussowitsch 86693d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_REAL_INT PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_real_int); 86793d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_scalar_int); 868092991acSStefano Zampini 869a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES) 87093d501b3SJacob Faibussowitsch struct /* __attribute__((packed, aligned(alignof(PetscInt *)))) */ petsc_mpiu_2int { 87193d501b3SJacob Faibussowitsch PetscInt a; 87293d501b3SJacob Faibussowitsch PetscInt b; 8739371c9d4SSatish Balay }; 87493d501b3SJacob Faibussowitsch /* 87593d501b3SJacob Faibussowitsch static_assert(sizeof(struct petsc_mpiu_2int) == 2 * sizeof(PetscInt), ""); 87693d501b3SJacob Faibussowitsch static_assert(alignof(struct petsc_mpiu_2int) == alignof(PetscInt *), ""); 87793d501b3SJacob Faibussowitsch static_assert(alignof(struct petsc_mpiu_2int) == alignof(PetscInt[2]), ""); 87893d501b3SJacob Faibussowitsch 87993d501b3SJacob Faibussowitsch clang generates warnings that petsc_mpiu_2int is not layout compatible with PetscInt[2] or 88093d501b3SJacob Faibussowitsch PetscInt *, even though (with everything else uncommented) both of the static_asserts above 88193d501b3SJacob Faibussowitsch pass! So we just comment it out... 88293d501b3SJacob Faibussowitsch */ 88393d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_2INT /* PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_2int) */; 8848ad47952SJed Brown #else 8858ad47952SJed Brown #define MPIU_2INT MPI_2INT 8868ad47952SJed Brown #endif 887b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPI_4INT; 888b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPIU_4INT; 889e9fa29b7SSatish Balay 890d71ae5a4SJacob Faibussowitsch static inline PetscInt PetscPowInt(PetscInt base, PetscInt power) 891d71ae5a4SJacob Faibussowitsch { 892fa711258SJed Brown PetscInt result = 1; 893fa711258SJed Brown while (power) { 894fa711258SJed Brown if (power & 1) result *= base; 895fa711258SJed Brown power >>= 1; 8966f2c871aSStefano Zampini if (power) base *= base; 897fa711258SJed Brown } 898fa711258SJed Brown return result; 899fa711258SJed Brown } 900b2fb0278SBarry Smith 901d71ae5a4SJacob Faibussowitsch static inline PetscInt64 PetscPowInt64(PetscInt base, PetscInt power) 902d71ae5a4SJacob Faibussowitsch { 903ad70a4c3SStefano Zampini PetscInt64 result = 1; 904ad70a4c3SStefano Zampini while (power) { 905ad70a4c3SStefano Zampini if (power & 1) result *= base; 906ad70a4c3SStefano Zampini power >>= 1; 9076f2c871aSStefano Zampini if (power) base *= base; 908ad70a4c3SStefano Zampini } 909ad70a4c3SStefano Zampini return result; 910ad70a4c3SStefano Zampini } 911ad70a4c3SStefano Zampini 912d71ae5a4SJacob Faibussowitsch static inline PetscReal PetscPowRealInt(PetscReal base, PetscInt power) 913d71ae5a4SJacob Faibussowitsch { 914fa711258SJed Brown PetscReal result = 1; 915d98d5da7SBarry Smith if (power < 0) { 916d98d5da7SBarry Smith power = -power; 91710d40e53SLisandro Dalcin base = ((PetscReal)1) / base; 918d98d5da7SBarry Smith } 919fa711258SJed Brown while (power) { 920fa711258SJed Brown if (power & 1) result *= base; 921fa711258SJed Brown power >>= 1; 9226f2c871aSStefano Zampini if (power) base *= base; 923fa711258SJed Brown } 924fa711258SJed Brown return result; 925fa711258SJed Brown } 926fa711258SJed Brown 927d71ae5a4SJacob Faibussowitsch static inline PetscScalar PetscPowScalarInt(PetscScalar base, PetscInt power) 928d71ae5a4SJacob Faibussowitsch { 9295117d392SLisandro Dalcin PetscScalar result = (PetscReal)1; 9308b49ba18SBarry Smith if (power < 0) { 9318b49ba18SBarry Smith power = -power; 93210d40e53SLisandro Dalcin base = ((PetscReal)1) / base; 9338b49ba18SBarry Smith } 9348b49ba18SBarry Smith while (power) { 9358b49ba18SBarry Smith if (power & 1) result *= base; 9368b49ba18SBarry Smith power >>= 1; 9376f2c871aSStefano Zampini if (power) base *= base; 9388b49ba18SBarry Smith } 9398b49ba18SBarry Smith return result; 9408b49ba18SBarry Smith } 9418b49ba18SBarry Smith 942d71ae5a4SJacob Faibussowitsch static inline PetscScalar PetscPowScalarReal(PetscScalar base, PetscReal power) 943d71ae5a4SJacob Faibussowitsch { 944b2fb0278SBarry Smith PetscScalar cpower = power; 945b2fb0278SBarry Smith return PetscPowScalar(base, cpower); 946b2fb0278SBarry Smith } 94778a59e97SMatthew G. Knepley 948c803a25aSBarry Smith /*MC 94966baab88SBarry Smith PetscApproximateLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers 950c803a25aSBarry Smith 951c803a25aSBarry Smith Synopsis: 952c803a25aSBarry Smith #include <petscmath.h> 95366baab88SBarry Smith bool PetscApproximateLTE(PetscReal x,constant float) 954c803a25aSBarry Smith 955c803a25aSBarry Smith Not Collective 956c803a25aSBarry Smith 957c803a25aSBarry Smith Input Parameters: 958c803a25aSBarry Smith + x - the variable 95916a05f60SBarry Smith - b - the constant float it is checking if `x` is less than or equal to 96016a05f60SBarry Smith 96116a05f60SBarry Smith Level: advanced 962c803a25aSBarry Smith 963c803a25aSBarry Smith Notes: 96487497f52SBarry Smith The fudge factor is the value `PETSC_SMALL` 965c803a25aSBarry Smith 966c803a25aSBarry Smith The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2 967c803a25aSBarry Smith 968c803a25aSBarry Smith This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact 969c803a25aSBarry Smith floating point results. 970c803a25aSBarry Smith 971db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateGTE()` 972c803a25aSBarry Smith M*/ 97366baab88SBarry Smith #define PetscApproximateLTE(x, b) ((x) <= (PetscRealConstant(b) + PETSC_SMALL)) 974c803a25aSBarry Smith 975c803a25aSBarry Smith /*MC 97666baab88SBarry Smith PetscApproximateGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers 977c803a25aSBarry Smith 978c803a25aSBarry Smith Synopsis: 979c803a25aSBarry Smith #include <petscmath.h> 98066baab88SBarry Smith bool PetscApproximateGTE(PetscReal x,constant float) 981c803a25aSBarry Smith 982c803a25aSBarry Smith Not Collective 983c803a25aSBarry Smith 984c803a25aSBarry Smith Input Parameters: 985c803a25aSBarry Smith + x - the variable 98616a05f60SBarry Smith - b - the constant float it is checking if `x` is greater than or equal to 98716a05f60SBarry Smith 98816a05f60SBarry Smith Level: advanced 989c803a25aSBarry Smith 990c803a25aSBarry Smith Notes: 99187497f52SBarry Smith The fudge factor is the value `PETSC_SMALL` 992c803a25aSBarry Smith 993c803a25aSBarry Smith The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2 994c803a25aSBarry Smith 995c803a25aSBarry Smith This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact 996c803a25aSBarry Smith floating point results. 997c803a25aSBarry Smith 998db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()` 999c803a25aSBarry Smith M*/ 100066baab88SBarry Smith #define PetscApproximateGTE(x, b) ((x) >= (PetscRealConstant(b) - PETSC_SMALL)) 1001c803a25aSBarry Smith 1002faa75363SBarry Smith /*MC 1003faa75363SBarry Smith PetscCeilInt - Returns the ceiling of the quotation of two positive integers 1004faa75363SBarry Smith 1005faa75363SBarry Smith Synopsis: 1006faa75363SBarry Smith #include <petscmath.h> 1007faa75363SBarry Smith PetscInt PetscCeilInt(PetscInt x,PetscInt y) 1008faa75363SBarry Smith 1009faa75363SBarry Smith Not Collective 1010faa75363SBarry Smith 1011faa75363SBarry Smith Input Parameters: 1012faa75363SBarry Smith + x - the numerator 1013faa75363SBarry Smith - y - the denominator 1014faa75363SBarry Smith 1015faa75363SBarry Smith Level: advanced 1016faa75363SBarry Smith 1017db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()` 1018faa75363SBarry Smith M*/ 1019faa75363SBarry Smith #define PetscCeilInt(x, y) ((((PetscInt)(x)) / ((PetscInt)(y))) + ((((PetscInt)(x)) % ((PetscInt)(y))) ? 1 : 0)) 1020faa75363SBarry Smith 1021faa75363SBarry Smith #define PetscCeilInt64(x, y) ((((PetscInt64)(x)) / ((PetscInt64)(y))) + ((((PetscInt64)(x)) % ((PetscInt64)(y))) ? 1 : 0)) 1022faa75363SBarry Smith 1023bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt, const PetscReal[], const PetscReal[], PetscReal *, PetscReal *); 1024e489efc1SBarry Smith #endif 1025