xref: /petsc/include/petscmath.h (revision d6685f554fbda8d96c6a5d73ab0e7a4e21a05c51)
1e489efc1SBarry Smith /*
2314da920SBarry Smith 
3314da920SBarry Smith     PETSc mathematics include file. Defines certain basic mathematical
4a5057860SBarry Smith     constants and functions for working with single, double, and quad precision
5a5057860SBarry Smith     floating point numbers as well as complex single and double.
6314da920SBarry Smith 
7d382aafbSBarry Smith     This file is included by petscsys.h and should not be used directly.
8e7029fe1SSatish Balay 
9e489efc1SBarry Smith */
10e489efc1SBarry Smith 
1126bd1501SBarry Smith #if !defined(PETSCMATH_H)
1226bd1501SBarry Smith #define PETSCMATH_H
130a5f7794SBarry Smith #include <math.h>
14df4397b0SStefano Zampini #include <petscsystypes.h>
15df4397b0SStefano Zampini 
165117d392SLisandro Dalcin /*
175117d392SLisandro Dalcin 
185117d392SLisandro Dalcin    Defines operations that are different for complex and real numbers.
195117d392SLisandro Dalcin    All PETSc objects in one program are built around the object
205117d392SLisandro Dalcin    PetscScalar which is either always a real or a complex.
215117d392SLisandro Dalcin 
225117d392SLisandro Dalcin */
235117d392SLisandro Dalcin 
245117d392SLisandro Dalcin /*
255117d392SLisandro Dalcin     Real number definitions
265117d392SLisandro Dalcin  */
275117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
285117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrtf(a)
295117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrtf(a)
305117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypotf(a,b)
315117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2f(a,b)
325117d392SLisandro Dalcin #define PetscPowReal(a,b)      powf(a,b)
335117d392SLisandro Dalcin #define PetscExpReal(a)        expf(a)
345117d392SLisandro Dalcin #define PetscLogReal(a)        logf(a)
355117d392SLisandro Dalcin #define PetscLog10Real(a)      log10f(a)
365117d392SLisandro Dalcin #define PetscLog2Real(a)       log2f(a)
375117d392SLisandro Dalcin #define PetscSinReal(a)        sinf(a)
385117d392SLisandro Dalcin #define PetscCosReal(a)        cosf(a)
395117d392SLisandro Dalcin #define PetscTanReal(a)        tanf(a)
405117d392SLisandro Dalcin #define PetscAsinReal(a)       asinf(a)
415117d392SLisandro Dalcin #define PetscAcosReal(a)       acosf(a)
425117d392SLisandro Dalcin #define PetscAtanReal(a)       atanf(a)
435117d392SLisandro Dalcin #define PetscSinhReal(a)       sinhf(a)
445117d392SLisandro Dalcin #define PetscCoshReal(a)       coshf(a)
455117d392SLisandro Dalcin #define PetscTanhReal(a)       tanhf(a)
465117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinhf(a)
475117d392SLisandro Dalcin #define PetscAcoshReal(a)      acoshf(a)
485117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanhf(a)
49*d6685f55SMatthew G. Knepley #define PetscErfReal(a)        erff(a)
505117d392SLisandro Dalcin #define PetscCeilReal(a)       ceilf(a)
515117d392SLisandro Dalcin #define PetscFloorReal(a)      floorf(a)
525117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmodf(a,b)
539c3ee494SJed Brown #define PetscCopysignReal(a,b) copysignf(a,b)
545117d392SLisandro Dalcin #define PetscTGamma(a)         tgammaf(a)
551f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
561f17fa70SToby Isaac #define PetscLGamma(a)         gammaf(a)
571f17fa70SToby Isaac #else
581f17fa70SToby Isaac #define PetscLGamma(a)         lgammaf(a)
591f17fa70SToby Isaac #endif
605117d392SLisandro Dalcin 
615117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
625117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrt(a)
635117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrt(a)
645117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypot(a,b)
655117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2(a,b)
665117d392SLisandro Dalcin #define PetscPowReal(a,b)      pow(a,b)
675117d392SLisandro Dalcin #define PetscExpReal(a)        exp(a)
685117d392SLisandro Dalcin #define PetscLogReal(a)        log(a)
695117d392SLisandro Dalcin #define PetscLog10Real(a)      log10(a)
705117d392SLisandro Dalcin #define PetscLog2Real(a)       log2(a)
715117d392SLisandro Dalcin #define PetscSinReal(a)        sin(a)
725117d392SLisandro Dalcin #define PetscCosReal(a)        cos(a)
735117d392SLisandro Dalcin #define PetscTanReal(a)        tan(a)
745117d392SLisandro Dalcin #define PetscAsinReal(a)       asin(a)
755117d392SLisandro Dalcin #define PetscAcosReal(a)       acos(a)
765117d392SLisandro Dalcin #define PetscAtanReal(a)       atan(a)
775117d392SLisandro Dalcin #define PetscSinhReal(a)       sinh(a)
785117d392SLisandro Dalcin #define PetscCoshReal(a)       cosh(a)
795117d392SLisandro Dalcin #define PetscTanhReal(a)       tanh(a)
805117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinh(a)
815117d392SLisandro Dalcin #define PetscAcoshReal(a)      acosh(a)
825117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanh(a)
83*d6685f55SMatthew G. Knepley #define PetscErfReal(a)        erf(a)
845117d392SLisandro Dalcin #define PetscCeilReal(a)       ceil(a)
855117d392SLisandro Dalcin #define PetscFloorReal(a)      floor(a)
865117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmod(a,b)
879c3ee494SJed Brown #define PetscCopysignReal(a,b) copysign(a,b)
885117d392SLisandro Dalcin #define PetscTGamma(a)         tgamma(a)
891f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
901f17fa70SToby Isaac #define PetscLGamma(a)         gamma(a)
911f17fa70SToby Isaac #else
921f17fa70SToby Isaac #define PetscLGamma(a)         lgamma(a)
931f17fa70SToby Isaac #endif
945117d392SLisandro Dalcin 
955117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
965117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrtq(a)
975117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrtq(a)
985117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypotq(a,b)
995117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2q(a,b)
1005117d392SLisandro Dalcin #define PetscPowReal(a,b)      powq(a,b)
1015117d392SLisandro Dalcin #define PetscExpReal(a)        expq(a)
1025117d392SLisandro Dalcin #define PetscLogReal(a)        logq(a)
1035117d392SLisandro Dalcin #define PetscLog10Real(a)      log10q(a)
1045117d392SLisandro Dalcin #define PetscLog2Real(a)       log2q(a)
1055117d392SLisandro Dalcin #define PetscSinReal(a)        sinq(a)
1065117d392SLisandro Dalcin #define PetscCosReal(a)        cosq(a)
1075117d392SLisandro Dalcin #define PetscTanReal(a)        tanq(a)
1085117d392SLisandro Dalcin #define PetscAsinReal(a)       asinq(a)
1095117d392SLisandro Dalcin #define PetscAcosReal(a)       acosq(a)
1105117d392SLisandro Dalcin #define PetscAtanReal(a)       atanq(a)
1115117d392SLisandro Dalcin #define PetscSinhReal(a)       sinhq(a)
1125117d392SLisandro Dalcin #define PetscCoshReal(a)       coshq(a)
1135117d392SLisandro Dalcin #define PetscTanhReal(a)       tanhq(a)
1145117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinhq(a)
1155117d392SLisandro Dalcin #define PetscAcoshReal(a)      acoshq(a)
1165117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanhq(a)
117*d6685f55SMatthew G. Knepley #define PetscErfReal(a)        erfq(a)
1185117d392SLisandro Dalcin #define PetscCeilReal(a)       ceilq(a)
1195117d392SLisandro Dalcin #define PetscFloorReal(a)      floorq(a)
1205117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmodq(a,b)
1219c3ee494SJed Brown #define PetscCopysignReal(a,b) copysignq(a,b)
1225117d392SLisandro Dalcin #define PetscTGamma(a)         tgammaq(a)
1231f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1241f17fa70SToby Isaac #define PetscLGamma(a)         gammaq(a)
1251f17fa70SToby Isaac #else
1261f17fa70SToby Isaac #define PetscLGamma(a)         lgammaq(a)
1271f17fa70SToby Isaac #endif
1285117d392SLisandro Dalcin 
1295117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
1305117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrtf(a)
1315117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrtf(a)
1325117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypotf(a,b)
1335117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2f(a,b)
1345117d392SLisandro Dalcin #define PetscPowReal(a,b)      powf(a,b)
1355117d392SLisandro Dalcin #define PetscExpReal(a)        expf(a)
1365117d392SLisandro Dalcin #define PetscLogReal(a)        logf(a)
1375117d392SLisandro Dalcin #define PetscLog10Real(a)      log10f(a)
1385117d392SLisandro Dalcin #define PetscLog2Real(a)       log2f(a)
1395117d392SLisandro Dalcin #define PetscSinReal(a)        sinf(a)
1405117d392SLisandro Dalcin #define PetscCosReal(a)        cosf(a)
1415117d392SLisandro Dalcin #define PetscTanReal(a)        tanf(a)
1425117d392SLisandro Dalcin #define PetscAsinReal(a)       asinf(a)
1435117d392SLisandro Dalcin #define PetscAcosReal(a)       acosf(a)
1445117d392SLisandro Dalcin #define PetscAtanReal(a)       atanf(a)
1455117d392SLisandro Dalcin #define PetscSinhReal(a)       sinhf(a)
1465117d392SLisandro Dalcin #define PetscCoshReal(a)       coshf(a)
1475117d392SLisandro Dalcin #define PetscTanhReal(a)       tanhf(a)
1485117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinhf(a)
1495117d392SLisandro Dalcin #define PetscAcoshReal(a)      acoshf(a)
1505117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanhf(a)
151*d6685f55SMatthew G. Knepley #define PetscErfReal(a)        erff(a)
1525117d392SLisandro Dalcin #define PetscCeilReal(a)       ceilf(a)
1535117d392SLisandro Dalcin #define PetscFloorReal(a)      floorf(a)
1545117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmodf(a,b)
1559c3ee494SJed Brown #define PetscCopySignReal(a,b) copysignf(a,b)
1565117d392SLisandro Dalcin #define PetscTGamma(a)         tgammaf(a)
1571f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1581f17fa70SToby Isaac #define PetscLGamma(a)         gammaf(a)
1591f17fa70SToby Isaac #else
1601f17fa70SToby Isaac #define PetscLGamma(a)         lgammaf(a)
1611f17fa70SToby Isaac #endif
1625117d392SLisandro Dalcin 
1635117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
1645117d392SLisandro Dalcin 
1659fbee547SJacob Faibussowitsch static inline PetscReal PetscSignReal(PetscReal a)
1665117d392SLisandro Dalcin {
1675117d392SLisandro Dalcin   return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0));
1685117d392SLisandro Dalcin }
1695117d392SLisandro Dalcin 
1705117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2)
1715117d392SLisandro Dalcin #undef PetscLog2Real
1729fbee547SJacob Faibussowitsch static inline PetscReal PetscLog2Real(PetscReal a)
1735117d392SLisandro Dalcin {
1745117d392SLisandro Dalcin   return PetscLogReal(a)/PetscLogReal((PetscReal)2);
1755117d392SLisandro Dalcin }
1765117d392SLisandro Dalcin #endif
1775117d392SLisandro Dalcin 
1785117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
1795117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PetscAttrMPITypeTag(__float128);
1805117d392SLisandro Dalcin #endif
1815117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FP16)
1825117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FP16 PetscAttrMPITypeTag(__fp16);
1835117d392SLisandro Dalcin #endif
1845117d392SLisandro Dalcin 
185df4397b0SStefano Zampini /*MC
186df4397b0SStefano Zampini    MPIU_REAL - MPI datatype corresponding to PetscReal
187df4397b0SStefano Zampini 
188df4397b0SStefano Zampini    Notes:
189df4397b0SStefano Zampini    In MPI calls that require an MPI datatype that matches a PetscReal or array of PetscReal values, pass this value.
190df4397b0SStefano Zampini 
191df4397b0SStefano Zampini    Level: beginner
192df4397b0SStefano Zampini 
193df4397b0SStefano Zampini .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
194df4397b0SStefano Zampini M*/
195c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE)
196c1d390e3SJed Brown #  define MPIU_REAL MPI_FLOAT
197c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE)
198c1d390e3SJed Brown #  define MPIU_REAL MPI_DOUBLE
199c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128)
200c1d390e3SJed Brown #  define MPIU_REAL MPIU___FLOAT128
201570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
202570b7f6dSBarry Smith #  define MPIU_REAL MPIU___FP16
203c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */
20459cb5930SBarry Smith 
2051093a601SBarry Smith /*
2061093a601SBarry Smith     Complex number definitions
2071093a601SBarry Smith  */
208df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX)
209450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128)
2101093a601SBarry Smith /* C++ support of complex number */
211b7940d39SSatish Balay 
21250f81f78SJed Brown #define PetscRealPartComplex(a)      (a).real()
21350f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag()
214df4397b0SStefano Zampini #define PetscAbsComplex(a)           petsccomplexlib::abs(a)
2155117d392SLisandro Dalcin #define PetscArgComplex(a)           petsccomplexlib::arg(a)
216df4397b0SStefano Zampini #define PetscConjComplex(a)          petsccomplexlib::conj(a)
217df4397b0SStefano Zampini #define PetscSqrtComplex(a)          petsccomplexlib::sqrt(a)
218df4397b0SStefano Zampini #define PetscPowComplex(a,b)         petsccomplexlib::pow(a,b)
219df4397b0SStefano Zampini #define PetscExpComplex(a)           petsccomplexlib::exp(a)
220df4397b0SStefano Zampini #define PetscLogComplex(a)           petsccomplexlib::log(a)
221df4397b0SStefano Zampini #define PetscSinComplex(a)           petsccomplexlib::sin(a)
222df4397b0SStefano Zampini #define PetscCosComplex(a)           petsccomplexlib::cos(a)
2235117d392SLisandro Dalcin #define PetscTanComplex(a)           petsccomplexlib::tan(a)
224df4397b0SStefano Zampini #define PetscAsinComplex(a)          petsccomplexlib::asin(a)
225df4397b0SStefano Zampini #define PetscAcosComplex(a)          petsccomplexlib::acos(a)
2265117d392SLisandro Dalcin #define PetscAtanComplex(a)          petsccomplexlib::atan(a)
227df4397b0SStefano Zampini #define PetscSinhComplex(a)          petsccomplexlib::sinh(a)
228df4397b0SStefano Zampini #define PetscCoshComplex(a)          petsccomplexlib::cosh(a)
229df4397b0SStefano Zampini #define PetscTanhComplex(a)          petsccomplexlib::tanh(a)
2305117d392SLisandro Dalcin #define PetscAsinhComplex(a)         petsccomplexlib::asinh(a)
2315117d392SLisandro Dalcin #define PetscAcoshComplex(a)         petsccomplexlib::acosh(a)
2325117d392SLisandro Dalcin #define PetscAtanhComplex(a)         petsccomplexlib::atanh(a)
2335117d392SLisandro Dalcin 
2345117d392SLisandro Dalcin /* TODO: Add configure tests
2355117d392SLisandro Dalcin 
2365117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX)
2375117d392SLisandro Dalcin #undef PetscTanComplex
2389fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanComplex(PetscComplex z)
2395117d392SLisandro Dalcin {
2405117d392SLisandro Dalcin   return PetscSinComplex(z)/PetscCosComplex(z);
2415117d392SLisandro Dalcin }
242027d9794SBarry Smith #endif
243debe9ee2SPaul Mullowney 
2445117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX)
2455117d392SLisandro Dalcin #undef PetscTanhComplex
2469fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanhComplex(PetscComplex z)
2475117d392SLisandro Dalcin {
2485117d392SLisandro Dalcin   return PetscSinhComplex(z)/PetscCoshComplex(z);
2495117d392SLisandro Dalcin }
2505117d392SLisandro Dalcin #endif
2515117d392SLisandro Dalcin 
2525117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX)
2535117d392SLisandro Dalcin #undef PetscAsinComplex
2549fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinComplex(PetscComplex z)
2555117d392SLisandro Dalcin {
2565117d392SLisandro Dalcin   const PetscComplex j(0,1);
2575117d392SLisandro Dalcin   return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z));
2585117d392SLisandro Dalcin }
2595117d392SLisandro Dalcin #endif
2605117d392SLisandro Dalcin 
2615117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX)
2625117d392SLisandro Dalcin #undef PetscAcosComplex
2639fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcosComplex(PetscComplex z)
2645117d392SLisandro Dalcin {
2655117d392SLisandro Dalcin   const PetscComplex j(0,1);
2665117d392SLisandro Dalcin   return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z));
2675117d392SLisandro Dalcin }
2685117d392SLisandro Dalcin #endif
2695117d392SLisandro Dalcin 
2705117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX)
2715117d392SLisandro Dalcin #undef PetscAtanComplex
2729fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanComplex(PetscComplex z)
2735117d392SLisandro Dalcin {
2745117d392SLisandro Dalcin   const PetscComplex j(0,1);
2755117d392SLisandro Dalcin   return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z));
2765117d392SLisandro Dalcin }
2775117d392SLisandro Dalcin #endif
2785117d392SLisandro Dalcin 
2795117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX)
2805117d392SLisandro Dalcin #undef PetscAsinhComplex
2819fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinhComplex(PetscComplex z)
2825117d392SLisandro Dalcin {
2835117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f));
2845117d392SLisandro Dalcin }
2855117d392SLisandro Dalcin #endif
2865117d392SLisandro Dalcin 
2875117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX)
2885117d392SLisandro Dalcin #undef PetscAcoshComplex
2899fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcoshComplex(PetscComplex z)
2905117d392SLisandro Dalcin {
2915117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z-1.0f));
2925117d392SLisandro Dalcin }
2935117d392SLisandro Dalcin #endif
2945117d392SLisandro Dalcin 
2955117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATANH_COMPLEX)
2965117d392SLisandro Dalcin #undef PetscAtanhComplex
2979fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanhComplex(PetscComplex z)
2985117d392SLisandro Dalcin {
2995117d392SLisandro Dalcin   return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z));
3005117d392SLisandro Dalcin }
3015117d392SLisandro Dalcin #endif
3025117d392SLisandro Dalcin 
3035117d392SLisandro Dalcin */
3045117d392SLisandro Dalcin 
3057a19d461SSatish Balay #else /* C99 support of complex number */
306519e2a1fSPaul Mullowney 
3077a19d461SSatish Balay #if defined(PETSC_USE_REAL_SINGLE)
30850f81f78SJed Brown #define PetscRealPartComplex(a)      crealf(a)
30950f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a)
31050f81f78SJed Brown #define PetscAbsComplex(a)           cabsf(a)
3115117d392SLisandro Dalcin #define PetscArgComplex(a)           cargf(a)
31250f81f78SJed Brown #define PetscConjComplex(a)          conjf(a)
31350f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtf(a)
31450f81f78SJed Brown #define PetscPowComplex(a,b)         cpowf(a,b)
31550f81f78SJed Brown #define PetscExpComplex(a)           cexpf(a)
31650f81f78SJed Brown #define PetscLogComplex(a)           clogf(a)
31750f81f78SJed Brown #define PetscSinComplex(a)           csinf(a)
31850f81f78SJed Brown #define PetscCosComplex(a)           ccosf(a)
3195117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanf(a)
320255453a1SBarry Smith #define PetscAsinComplex(a)          casinf(a)
321255453a1SBarry Smith #define PetscAcosComplex(a)          cacosf(a)
3225117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanf(a)
323a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhf(a)
324a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshf(a)
325a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhf(a)
3265117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhf(a)
3275117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshf(a)
3285117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhf(a)
3291093a601SBarry Smith 
330ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
33150f81f78SJed Brown #define PetscRealPartComplex(a)      creal(a)
33250f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a)
33350f81f78SJed Brown #define PetscAbsComplex(a)           cabs(a)
3345117d392SLisandro Dalcin #define PetscArgComplex(a)           carg(a)
33550f81f78SJed Brown #define PetscConjComplex(a)          conj(a)
33650f81f78SJed Brown #define PetscSqrtComplex(a)          csqrt(a)
33750f81f78SJed Brown #define PetscPowComplex(a,b)         cpow(a,b)
33850f81f78SJed Brown #define PetscExpComplex(a)           cexp(a)
33950f81f78SJed Brown #define PetscLogComplex(a)           clog(a)
34050f81f78SJed Brown #define PetscSinComplex(a)           csin(a)
34150f81f78SJed Brown #define PetscCosComplex(a)           ccos(a)
3425117d392SLisandro Dalcin #define PetscTanComplex(a)           ctan(a)
343255453a1SBarry Smith #define PetscAsinComplex(a)          casin(a)
344255453a1SBarry Smith #define PetscAcosComplex(a)          cacos(a)
3455117d392SLisandro Dalcin #define PetscAtanComplex(a)          catan(a)
346a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinh(a)
347a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccosh(a)
348a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanh(a)
3495117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinh(a)
3505117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacosh(a)
3515117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanh(a)
3521093a601SBarry Smith 
3538c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128)
35450f81f78SJed Brown #define PetscRealPartComplex(a)      crealq(a)
35550f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a)
35650f81f78SJed Brown #define PetscAbsComplex(a)           cabsq(a)
3575117d392SLisandro Dalcin #define PetscArgComplex(a)           cargq(a)
35850f81f78SJed Brown #define PetscConjComplex(a)          conjq(a)
35950f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtq(a)
36050f81f78SJed Brown #define PetscPowComplex(a,b)         cpowq(a,b)
36150f81f78SJed Brown #define PetscExpComplex(a)           cexpq(a)
36250f81f78SJed Brown #define PetscLogComplex(a)           clogq(a)
36350f81f78SJed Brown #define PetscSinComplex(a)           csinq(a)
36450f81f78SJed Brown #define PetscCosComplex(a)           ccosq(a)
3655117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanq(a)
366255453a1SBarry Smith #define PetscAsinComplex(a)          casinq(a)
367255453a1SBarry Smith #define PetscAcosComplex(a)          cacosq(a)
3685117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanq(a)
369a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhq(a)
370a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshq(a)
371a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhq(a)
3725117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhq(a)
3735117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshq(a)
3745117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhq(a)
375a4bea5a6SPeter Brune 
376ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */
3777a19d461SSatish Balay #endif /* (__cplusplus) */
378e489efc1SBarry Smith 
3791093a601SBarry Smith /*
3805117d392SLisandro Dalcin    PETSC_i is the imaginary number, i
3811093a601SBarry Smith */
38250f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i;
3838a351411SToby Isaac 
3845117d392SLisandro Dalcin /*
3855117d392SLisandro Dalcin    Try to do the right thing for complex number construction: see
3868a351411SToby Isaac    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm
3878a351411SToby Isaac    for details
3888a351411SToby Isaac */
3899fbee547SJacob Faibussowitsch static inline PetscComplex PetscCMPLX(PetscReal x, PetscReal y)
3908a351411SToby Isaac {
391450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128)
3928a351411SToby Isaac   return PetscComplex(x,y);
3938a351411SToby Isaac #elif defined(_Imaginary_I)
3948a351411SToby Isaac   return x + y * _Imaginary_I;
3958a351411SToby Isaac #else
396616d7c5eSToby Isaac   { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5),
397616d7c5eSToby Isaac 
398616d7c5eSToby Isaac        "For each floating type there is a corresponding real type, which is always a real floating
399616d7c5eSToby Isaac        type. For real floating types, it is the same type. For complex types, it is the type given
400616d7c5eSToby Isaac        by deleting the keyword _Complex from the type name."
401616d7c5eSToby Isaac 
402616d7c5eSToby Isaac        So type punning should be portable. */
403616d7c5eSToby Isaac     union { PetscComplex z; PetscReal f[2]; } uz;
404616d7c5eSToby Isaac 
405616d7c5eSToby Isaac     uz.f[0] = x;
406616d7c5eSToby Isaac     uz.f[1] = y;
407616d7c5eSToby Isaac     return uz.z;
408616d7c5eSToby Isaac   }
40950f81f78SJed Brown #endif
4108a351411SToby Isaac }
4118a351411SToby Isaac 
412de272c7aSSatish Balay #define MPIU_C_COMPLEX MPI_C_COMPLEX PETSC_DEPRECATED_MACRO("GCC warning \"MPIU_C_COMPLEX macro is deprecated use MPI_C_COMPLEX (since version 3.15)\"")
413de272c7aSSatish Balay #define MPIU_C_DOUBLE_COMPLEX MPI_C_DOUBLE_COMPLEX PETSC_DEPRECATED_MACRO("GCC warning \"MPIU_C_DOUBLE_COMPLEX macro is deprecated use MPI_C_DOUBLE_COMPLEX (since version 3.15)\"")
414de272c7aSSatish Balay 
4155117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
4165117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 PetscAttrMPITypeTag(__complex128);
4175117d392SLisandro Dalcin #endif /* PETSC_USE_REAL___FLOAT128 */
4185117d392SLisandro Dalcin 
4195117d392SLisandro Dalcin /*MC
4205117d392SLisandro Dalcin    MPIU_COMPLEX - MPI datatype corresponding to PetscComplex
4215117d392SLisandro Dalcin 
4225117d392SLisandro Dalcin    Notes:
4235117d392SLisandro Dalcin    In MPI calls that require an MPI datatype that matches a PetscComplex or array of PetscComplex values, pass this value.
4245117d392SLisandro Dalcin 
4255117d392SLisandro Dalcin    Level: beginner
4265117d392SLisandro Dalcin 
4275117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i
4285117d392SLisandro Dalcin M*/
4295117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
430de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_COMPLEX
4315117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
432de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX
4335117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
4345117d392SLisandro Dalcin #  define MPIU_COMPLEX MPIU___COMPLEX128
4355117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
436de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_COMPLEX
4375117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
4385117d392SLisandro Dalcin 
4395117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */
4405117d392SLisandro Dalcin 
4415117d392SLisandro Dalcin /*
4425117d392SLisandro Dalcin     Scalar number definitions
4435117d392SLisandro Dalcin  */
4447a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX)
4455117d392SLisandro Dalcin /*MC
4465117d392SLisandro Dalcin    MPIU_SCALAR - MPI datatype corresponding to PetscScalar
4475117d392SLisandro Dalcin 
4485117d392SLisandro Dalcin    Notes:
4495117d392SLisandro Dalcin    In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalar values, pass this value.
4505117d392SLisandro Dalcin 
4515117d392SLisandro Dalcin    Level: beginner
4525117d392SLisandro Dalcin 
4535117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_COMPLEX, MPIU_INT
4545117d392SLisandro Dalcin M*/
4555117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX
4565117d392SLisandro Dalcin 
4575117d392SLisandro Dalcin /*MC
4585117d392SLisandro Dalcin    PetscRealPart - Returns the real part of a PetscScalar
4595117d392SLisandro Dalcin 
4605117d392SLisandro Dalcin    Synopsis:
4615117d392SLisandro Dalcin    #include <petscmath.h>
4625117d392SLisandro Dalcin    PetscReal PetscRealPart(PetscScalar v)
4635117d392SLisandro Dalcin 
4645117d392SLisandro Dalcin    Not Collective
4655117d392SLisandro Dalcin 
4665117d392SLisandro Dalcin    Input Parameter:
4675117d392SLisandro Dalcin .  v - value to find the real part of
4685117d392SLisandro Dalcin 
4695117d392SLisandro Dalcin    Level: beginner
4705117d392SLisandro Dalcin 
4715117d392SLisandro Dalcin .seealso: PetscScalar, PetscImaginaryPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
4725117d392SLisandro Dalcin 
4735117d392SLisandro Dalcin M*/
4745117d392SLisandro Dalcin #define PetscRealPart(a)      PetscRealPartComplex(a)
4755117d392SLisandro Dalcin 
4765117d392SLisandro Dalcin /*MC
4775117d392SLisandro Dalcin    PetscImaginaryPart - Returns the imaginary part of a PetscScalar
4785117d392SLisandro Dalcin 
4795117d392SLisandro Dalcin    Synopsis:
4805117d392SLisandro Dalcin    #include <petscmath.h>
4815117d392SLisandro Dalcin    PetscReal PetscImaginaryPart(PetscScalar v)
4825117d392SLisandro Dalcin 
4835117d392SLisandro Dalcin    Not Collective
4845117d392SLisandro Dalcin 
4855117d392SLisandro Dalcin    Input Parameter:
4865117d392SLisandro Dalcin .  v - value to find the imaginary part of
4875117d392SLisandro Dalcin 
4885117d392SLisandro Dalcin    Level: beginner
4895117d392SLisandro Dalcin 
4905117d392SLisandro Dalcin    Notes:
4915117d392SLisandro Dalcin        If PETSc was configured for real numbers then this always returns the value 0
4925117d392SLisandro Dalcin 
4935117d392SLisandro Dalcin .seealso: PetscScalar, PetscRealPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
4945117d392SLisandro Dalcin 
4955117d392SLisandro Dalcin M*/
4965117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a)
4975117d392SLisandro Dalcin 
4985117d392SLisandro Dalcin #define PetscAbsScalar(a)     PetscAbsComplex(a)
4995117d392SLisandro Dalcin #define PetscArgScalar(a)     PetscArgComplex(a)
5005117d392SLisandro Dalcin #define PetscConj(a)          PetscConjComplex(a)
5015117d392SLisandro Dalcin #define PetscSqrtScalar(a)    PetscSqrtComplex(a)
5025117d392SLisandro Dalcin #define PetscPowScalar(a,b)   PetscPowComplex(a,b)
5035117d392SLisandro Dalcin #define PetscExpScalar(a)     PetscExpComplex(a)
5045117d392SLisandro Dalcin #define PetscLogScalar(a)     PetscLogComplex(a)
5055117d392SLisandro Dalcin #define PetscSinScalar(a)     PetscSinComplex(a)
5065117d392SLisandro Dalcin #define PetscCosScalar(a)     PetscCosComplex(a)
5075117d392SLisandro Dalcin #define PetscTanScalar(a)     PetscTanComplex(a)
5085117d392SLisandro Dalcin #define PetscAsinScalar(a)    PetscAsinComplex(a)
5095117d392SLisandro Dalcin #define PetscAcosScalar(a)    PetscAcosComplex(a)
5105117d392SLisandro Dalcin #define PetscAtanScalar(a)    PetscAtanComplex(a)
5115117d392SLisandro Dalcin #define PetscSinhScalar(a)    PetscSinhComplex(a)
5125117d392SLisandro Dalcin #define PetscCoshScalar(a)    PetscCoshComplex(a)
5135117d392SLisandro Dalcin #define PetscTanhScalar(a)    PetscTanhComplex(a)
5145117d392SLisandro Dalcin #define PetscAsinhScalar(a)   PetscAsinhComplex(a)
5155117d392SLisandro Dalcin #define PetscAcoshScalar(a)   PetscAcoshComplex(a)
5165117d392SLisandro Dalcin #define PetscAtanhScalar(a)   PetscAtanhComplex(a)
5175117d392SLisandro Dalcin 
5185117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */
5195117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_REAL
5205117d392SLisandro Dalcin #define PetscRealPart(a)      (a)
5215117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0)
5225117d392SLisandro Dalcin #define PetscAbsScalar(a)     PetscAbsReal(a)
5235117d392SLisandro Dalcin #define PetscArgScalar(a)     (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0)
5245117d392SLisandro Dalcin #define PetscConj(a)          (a)
5255117d392SLisandro Dalcin #define PetscSqrtScalar(a)    PetscSqrtReal(a)
5265117d392SLisandro Dalcin #define PetscPowScalar(a,b)   PetscPowReal(a,b)
5275117d392SLisandro Dalcin #define PetscExpScalar(a)     PetscExpReal(a)
5285117d392SLisandro Dalcin #define PetscLogScalar(a)     PetscLogReal(a)
5295117d392SLisandro Dalcin #define PetscSinScalar(a)     PetscSinReal(a)
5305117d392SLisandro Dalcin #define PetscCosScalar(a)     PetscCosReal(a)
5315117d392SLisandro Dalcin #define PetscTanScalar(a)     PetscTanReal(a)
5325117d392SLisandro Dalcin #define PetscAsinScalar(a)    PetscAsinReal(a)
5335117d392SLisandro Dalcin #define PetscAcosScalar(a)    PetscAcosReal(a)
5345117d392SLisandro Dalcin #define PetscAtanScalar(a)    PetscAtanReal(a)
5355117d392SLisandro Dalcin #define PetscSinhScalar(a)    PetscSinhReal(a)
5365117d392SLisandro Dalcin #define PetscCoshScalar(a)    PetscCoshReal(a)
5375117d392SLisandro Dalcin #define PetscTanhScalar(a)    PetscTanhReal(a)
5385117d392SLisandro Dalcin #define PetscAsinhScalar(a)   PetscAsinhReal(a)
5395117d392SLisandro Dalcin #define PetscAcoshScalar(a)   PetscAcoshReal(a)
5405117d392SLisandro Dalcin #define PetscAtanhScalar(a)   PetscAtanhReal(a)
5415117d392SLisandro Dalcin 
5425117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */
5435117d392SLisandro Dalcin 
5445117d392SLisandro Dalcin /*
5455117d392SLisandro Dalcin    Certain objects may be created using either single or double precision.
5465117d392SLisandro Dalcin    This is currently not used.
5475117d392SLisandro Dalcin */
5485117d392SLisandro Dalcin typedef enum { PETSC_SCALAR_DOUBLE, PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE, PETSC_SCALAR_HALF } PetscScalarPrecision;
5495117d392SLisandro Dalcin 
5505117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/
5515117d392SLisandro Dalcin 
5525117d392SLisandro Dalcin /*MC
5535117d392SLisandro Dalcin    PetscAbs - Returns the absolute value of a number
5545117d392SLisandro Dalcin 
5555117d392SLisandro Dalcin    Synopsis:
5565117d392SLisandro Dalcin    #include <petscmath.h>
5575117d392SLisandro Dalcin    type PetscAbs(type v)
5585117d392SLisandro Dalcin 
5595117d392SLisandro Dalcin    Not Collective
5605117d392SLisandro Dalcin 
5615117d392SLisandro Dalcin    Input Parameter:
5625117d392SLisandro Dalcin .  v - the number
5635117d392SLisandro Dalcin 
5645117d392SLisandro Dalcin    Notes:
5655117d392SLisandro Dalcin     type can be integer or real floating point value
5665117d392SLisandro Dalcin 
5675117d392SLisandro Dalcin    Level: beginner
5685117d392SLisandro Dalcin 
5695117d392SLisandro Dalcin .seealso: PetscAbsInt(), PetscAbsReal(), PetscAbsScalar()
5705117d392SLisandro Dalcin 
5715117d392SLisandro Dalcin M*/
5725117d392SLisandro Dalcin #define PetscAbs(a)  (((a) >= 0) ? (a) : (-(a)))
5735117d392SLisandro Dalcin 
5745117d392SLisandro Dalcin /*MC
5755117d392SLisandro Dalcin    PetscSign - Returns the sign of a number as an integer
5765117d392SLisandro Dalcin 
5775117d392SLisandro Dalcin    Synopsis:
5785117d392SLisandro Dalcin    #include <petscmath.h>
5795117d392SLisandro Dalcin    int PetscSign(type v)
5805117d392SLisandro Dalcin 
5815117d392SLisandro Dalcin    Not Collective
5825117d392SLisandro Dalcin 
5835117d392SLisandro Dalcin    Input Parameter:
5845117d392SLisandro Dalcin .  v - the number
5855117d392SLisandro Dalcin 
5865117d392SLisandro Dalcin    Notes:
5875117d392SLisandro Dalcin     type can be integer or real floating point value
5885117d392SLisandro Dalcin 
5895117d392SLisandro Dalcin    Level: beginner
5905117d392SLisandro Dalcin 
5915117d392SLisandro Dalcin M*/
5925117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
593e489efc1SBarry Smith 
594b6a5bde7SBarry Smith /*MC
595b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
596b6a5bde7SBarry Smith 
597eca87e8dSBarry Smith    Synopsis:
598aaa7dc30SBarry Smith    #include <petscmath.h>
599eca87e8dSBarry Smith    type PetscMin(type v1,type v2)
600eca87e8dSBarry Smith 
601eca87e8dSBarry Smith    Not Collective
602eca87e8dSBarry Smith 
603d8d19677SJose E. Roman    Input Parameters:
604b6a5bde7SBarry Smith +  v1 - first value to find minimum of
605b6a5bde7SBarry Smith -  v2 - second value to find minimum of
606b6a5bde7SBarry Smith 
60795452b02SPatrick Sanan    Notes:
60895452b02SPatrick Sanan     type can be integer or floating point value
609b6a5bde7SBarry Smith 
610b6a5bde7SBarry Smith    Level: beginner
611b6a5bde7SBarry Smith 
6121175f9beSHong Zhang .seealso: PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
613b6a5bde7SBarry Smith 
614b6a5bde7SBarry Smith M*/
615e489efc1SBarry Smith #define PetscMin(a,b)   (((a)<(b)) ?  (a) : (b))
616b6a5bde7SBarry Smith 
617b6a5bde7SBarry Smith /*MC
618b6a5bde7SBarry Smith    PetscMax - Returns maxium of two numbers
619b6a5bde7SBarry Smith 
620eca87e8dSBarry Smith    Synopsis:
621aaa7dc30SBarry Smith    #include <petscmath.h>
622eca87e8dSBarry Smith    type max PetscMax(type v1,type v2)
623eca87e8dSBarry Smith 
624eca87e8dSBarry Smith    Not Collective
625eca87e8dSBarry Smith 
626d8d19677SJose E. Roman    Input Parameters:
627b6a5bde7SBarry Smith +  v1 - first value to find maximum of
628b6a5bde7SBarry Smith -  v2 - second value to find maximum of
629b6a5bde7SBarry Smith 
63095452b02SPatrick Sanan    Notes:
63195452b02SPatrick Sanan     type can be integer or floating point value
632b6a5bde7SBarry Smith 
633b6a5bde7SBarry Smith    Level: beginner
634b6a5bde7SBarry Smith 
635d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
636b6a5bde7SBarry Smith 
637b6a5bde7SBarry Smith M*/
638e489efc1SBarry Smith #define PetscMax(a,b)   (((a)<(b)) ?  (b) : (a))
639b6a5bde7SBarry Smith 
640b6a5bde7SBarry Smith /*MC
641d9a4bb16SJed Brown    PetscClipInterval - Returns a number clipped to be within an interval
642d9a4bb16SJed Brown 
643d9a4bb16SJed Brown    Synopsis:
644aaa7dc30SBarry Smith    #include <petscmath.h>
645d9a4bb16SJed Brown    type clip PetscClipInterval(type x,type a,type b)
646d9a4bb16SJed Brown 
647d9a4bb16SJed Brown    Not Collective
648d9a4bb16SJed Brown 
649d8d19677SJose E. Roman    Input Parameters:
6500d398bfeSStefano Zampini +  x - value to use if within interval [a,b]
651d9a4bb16SJed Brown .  a - lower end of interval
652d9a4bb16SJed Brown -  b - upper end of interval
653d9a4bb16SJed Brown 
65495452b02SPatrick Sanan    Notes:
65595452b02SPatrick Sanan     type can be integer or floating point value
656d9a4bb16SJed Brown 
657d9a4bb16SJed Brown    Level: beginner
658d9a4bb16SJed Brown 
659d9a4bb16SJed Brown .seealso: PetscMin(), PetscMax(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
660d9a4bb16SJed Brown 
661d9a4bb16SJed Brown M*/
662d9a4bb16SJed Brown #define PetscClipInterval(x,a,b)   (PetscMax((a),PetscMin((x),(b))))
663d9a4bb16SJed Brown 
664d9a4bb16SJed Brown /*MC
665b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
666b6a5bde7SBarry Smith 
667b6a5bde7SBarry Smith    Synopsis:
668aaa7dc30SBarry Smith    #include <petscmath.h>
669b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
670b6a5bde7SBarry Smith 
671eca87e8dSBarry Smith    Not Collective
672eca87e8dSBarry Smith 
673eca87e8dSBarry Smith    Input Parameter:
674eca87e8dSBarry Smith .   v1 - the integer
675b6a5bde7SBarry Smith 
676b6a5bde7SBarry Smith    Level: beginner
677b6a5bde7SBarry Smith 
678b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr()
679b6a5bde7SBarry Smith 
680b6a5bde7SBarry Smith M*/
6819fa7d148SSatish Balay #define PetscAbsInt(a)  (((a)<0)   ? (-(a)) : (a))
682b6a5bde7SBarry Smith 
683b6a5bde7SBarry Smith /*MC
684b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
685b6a5bde7SBarry Smith 
686eca87e8dSBarry Smith    Synopsis:
687aaa7dc30SBarry Smith    #include <petscmath.h>
688eca87e8dSBarry Smith    Real abs PetscAbsReal(PetscReal v1)
689eca87e8dSBarry Smith 
690eca87e8dSBarry Smith    Not Collective
691eca87e8dSBarry Smith 
692b6a5bde7SBarry Smith    Input Parameter:
693b6a5bde7SBarry Smith .   v1 - the double
694b6a5bde7SBarry Smith 
695b6a5bde7SBarry Smith    Level: beginner
696b6a5bde7SBarry Smith 
697b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr()
698b6a5bde7SBarry Smith 
699b6a5bde7SBarry Smith M*/
7001118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
7011118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
7021118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7031118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a)
7041118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
7051118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a)
7061118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7071118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
7081118d4bcSLisandro Dalcin #endif
709b6a5bde7SBarry Smith 
710b6a5bde7SBarry Smith /*MC
711b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
712b6a5bde7SBarry Smith 
713b6a5bde7SBarry Smith    Synopsis:
714aaa7dc30SBarry Smith    #include <petscmath.h>
715b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
716b6a5bde7SBarry Smith 
717eca87e8dSBarry Smith    Not Collective
718eca87e8dSBarry Smith 
719eca87e8dSBarry Smith    Input Parameter:
720eca87e8dSBarry Smith .   v1 - the value
721eca87e8dSBarry Smith 
72295452b02SPatrick Sanan    Notes:
72395452b02SPatrick Sanan     type can be integer or floating point value
724b6a5bde7SBarry Smith 
725b6a5bde7SBarry Smith    Level: beginner
726b6a5bde7SBarry Smith 
727b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal()
728b6a5bde7SBarry Smith 
729b6a5bde7SBarry Smith M*/
7304ebda54eSMatthew Knepley #define PetscSqr(a)     ((a)*(a))
731e489efc1SBarry Smith 
732314da920SBarry Smith /* ----------------------------------------------------------------------------*/
733ee223c85SLisandro Dalcin 
734ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
735ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F
7365117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7375117d392SLisandro Dalcin #define PetscRealConstant(constant) constant
738ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
739ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q
7405117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7415117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F
742ee223c85SLisandro Dalcin #endif
743ee223c85SLisandro Dalcin 
744314da920SBarry Smith /*
745d34fcf5fSBarry Smith      Basic constants
746314da920SBarry Smith */
7472fab75feSLisandro Dalcin #define PETSC_PI    PetscRealConstant(3.1415926535897932384626433832795029)
7482fab75feSLisandro Dalcin #define PETSC_PHI   PetscRealConstant(1.6180339887498948482045868343656381)
7497b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981)
750d34fcf5fSBarry Smith 
751ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES)
75271fd2e92SBarry Smith #define PETSC_MAX_INT            2147483647
753ab824b78SBarry Smith #define PETSC_MIN_INT            (-PETSC_MAX_INT - 1)
754ab824b78SBarry Smith #else
755ab824b78SBarry Smith #define PETSC_MAX_INT            9223372036854775807L
756ab824b78SBarry Smith #define PETSC_MIN_INT            (-PETSC_MAX_INT - 1)
757ab824b78SBarry Smith #endif
758569ea7c4SPierre Jolivet #define PETSC_MAX_UINT16         65535
759e489efc1SBarry Smith 
760ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
761ab824b78SBarry Smith #  define PETSC_MAX_REAL                3.40282346638528860e+38F
7629fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
76382a7e548SBarry Smith #  define PETSC_MACHINE_EPSILON         1.19209290e-07F
76482a7e548SBarry Smith #  define PETSC_SQRT_MACHINE_EPSILON    3.45266983e-04F
765ee223c85SLisandro Dalcin #  define PETSC_SMALL                   1.e-5F
766ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
767ab824b78SBarry Smith #  define PETSC_MAX_REAL                1.7976931348623157e+308
7689fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
76982a7e548SBarry Smith #  define PETSC_MACHINE_EPSILON         2.2204460492503131e-16
77082a7e548SBarry Smith #  define PETSC_SQRT_MACHINE_EPSILON    1.490116119384766e-08
771cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-10
772ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128)
773ea345e14SBarry Smith #  define PETSC_MAX_REAL                FLT128_MAX
7749fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-FLT128_MAX)
775d34fcf5fSBarry Smith #  define PETSC_MACHINE_EPSILON         FLT128_EPSILON
776ee223c85SLisandro Dalcin #  define PETSC_SQRT_MACHINE_EPSILON    1.38777878078144567552953958511352539e-17Q
777ee223c85SLisandro Dalcin #  define PETSC_SMALL                   1.e-20Q
7785117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7795117d392SLisandro Dalcin #  define PETSC_MAX_REAL                65504.0F
7809fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
7815117d392SLisandro Dalcin #  define PETSC_MACHINE_EPSILON         .0009765625F
7825117d392SLisandro Dalcin #  define PETSC_SQRT_MACHINE_EPSILON    .03125F
7835117d392SLisandro Dalcin #  define PETSC_SMALL                   5.e-3F
7849cf09972SJed Brown #endif
7853e523bebSBarry Smith 
78625d0f998SSatish Balay #define PETSC_INFINITY               (PETSC_MAX_REAL/4)
7879fa7d148SSatish Balay #define PETSC_NINFINITY              (-PETSC_INFINITY)
788e270355aSBarry Smith 
7899f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsInfReal(PetscReal);
7903948c36eSLisandro Dalcin PETSC_EXTERN PetscBool PetscIsNanReal(PetscReal);
7918b49ba18SBarry Smith PETSC_EXTERN PetscBool PetscIsNormalReal(PetscReal);
7929fbee547SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanReal(PetscReal v) {return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;}
7939fbee547SJacob Faibussowitsch static inline PetscBool PetscIsInfScalar(PetscScalar v) {return PetscIsInfReal(PetscAbsScalar(v));}
7949fbee547SJacob Faibussowitsch static inline PetscBool PetscIsNanScalar(PetscScalar v) {return PetscIsNanReal(PetscAbsScalar(v));}
7959fbee547SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanScalar(PetscScalar v) {return PetscIsInfOrNanReal(PetscAbsScalar(v));}
7969fbee547SJacob Faibussowitsch static inline PetscBool PetscIsNormalScalar(PetscScalar v) {return PetscIsNormalReal(PetscAbsScalar(v));}
7979a25a3ccSBarry Smith 
798b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal,PetscReal,PetscReal,PetscReal);
799ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal,PetscReal);
800ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar,PetscScalar);
801ce4818fdSLisandro Dalcin 
80298725619SBarry Smith /*
80398725619SBarry Smith     These macros are currently hardwired to match the regular data types, so there is no support for a different
80498725619SBarry Smith     MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again.
80598725619SBarry Smith  */
80698725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR
80798725619SBarry Smith typedef PetscScalar MatScalar;
80898725619SBarry Smith typedef PetscReal MatReal;
80998725619SBarry Smith 
8108ad47952SJed Brown struct petsc_mpiu_2scalar {PetscScalar a,b;};
8118ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2scalar);
812df4397b0SStefano Zampini 
813092991acSStefano Zampini /*
814092991acSStefano Zampini    MPI Datatypes for composite reductions:
815092991acSStefano Zampini    MPIU_REAL_INT -> struct { PetscReal; PetscInt; }
816092991acSStefano Zampini    MPIU_SCALAR_INT -> struct { PetscScalar; PetscInt; }
817092991acSStefano Zampini */
818092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_REAL_INT;
819092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT;
820092991acSStefano Zampini 
821a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES)
8228ad47952SJed Brown struct petsc_mpiu_2int {PetscInt a,b;};
8238ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2int);
8248ad47952SJed Brown #else
8258ad47952SJed Brown #define MPIU_2INT MPI_2INT
8268ad47952SJed Brown #endif
827b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPI_4INT;
828b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPIU_4INT;
829e9fa29b7SSatish Balay 
8309fbee547SJacob Faibussowitsch static inline PetscInt PetscPowInt(PetscInt base,PetscInt power)
831b2fb0278SBarry Smith {
832fa711258SJed Brown   PetscInt result = 1;
833fa711258SJed Brown   while (power) {
834fa711258SJed Brown     if (power & 1) result *= base;
835fa711258SJed Brown     power >>= 1;
836fa711258SJed Brown     base *= base;
837fa711258SJed Brown   }
838fa711258SJed Brown   return result;
839fa711258SJed Brown }
840b2fb0278SBarry Smith 
8419fbee547SJacob Faibussowitsch static inline PetscInt64 PetscPowInt64(PetscInt base,PetscInt power)
842ad70a4c3SStefano Zampini {
843ad70a4c3SStefano Zampini   PetscInt64 result = 1;
844ad70a4c3SStefano Zampini   while (power) {
845ad70a4c3SStefano Zampini     if (power & 1) result *= base;
846ad70a4c3SStefano Zampini     power >>= 1;
847ad70a4c3SStefano Zampini     base *= base;
848ad70a4c3SStefano Zampini   }
849ad70a4c3SStefano Zampini   return result;
850ad70a4c3SStefano Zampini }
851ad70a4c3SStefano Zampini 
8529fbee547SJacob Faibussowitsch static inline PetscReal PetscPowRealInt(PetscReal base,PetscInt power)
853b2fb0278SBarry Smith {
854fa711258SJed Brown   PetscReal result = 1;
855d98d5da7SBarry Smith   if (power < 0) {
856d98d5da7SBarry Smith     power = -power;
85710d40e53SLisandro Dalcin     base  = ((PetscReal)1)/base;
858d98d5da7SBarry Smith   }
859fa711258SJed Brown   while (power) {
860fa711258SJed Brown     if (power & 1) result *= base;
861fa711258SJed Brown     power >>= 1;
862fa711258SJed Brown     base *= base;
863fa711258SJed Brown   }
864fa711258SJed Brown   return result;
865fa711258SJed Brown }
866fa711258SJed Brown 
8679fbee547SJacob Faibussowitsch static inline PetscScalar PetscPowScalarInt(PetscScalar base,PetscInt power)
868b2fb0278SBarry Smith {
8695117d392SLisandro Dalcin   PetscScalar result = (PetscReal)1;
8708b49ba18SBarry Smith   if (power < 0) {
8718b49ba18SBarry Smith     power = -power;
87210d40e53SLisandro Dalcin     base  = ((PetscReal)1)/base;
8738b49ba18SBarry Smith   }
8748b49ba18SBarry Smith   while (power) {
8758b49ba18SBarry Smith     if (power & 1) result *= base;
8768b49ba18SBarry Smith     power >>= 1;
8778b49ba18SBarry Smith     base *= base;
8788b49ba18SBarry Smith   }
8798b49ba18SBarry Smith   return result;
8808b49ba18SBarry Smith }
8818b49ba18SBarry Smith 
8829fbee547SJacob Faibussowitsch static inline PetscScalar PetscPowScalarReal(PetscScalar base,PetscReal power)
883b2fb0278SBarry Smith {
884b2fb0278SBarry Smith   PetscScalar cpower = power;
885b2fb0278SBarry Smith   return PetscPowScalar(base,cpower);
886b2fb0278SBarry Smith }
88778a59e97SMatthew G. Knepley 
888c803a25aSBarry Smith /*MC
88966baab88SBarry Smith     PetscApproximateLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers
890c803a25aSBarry Smith 
891c803a25aSBarry Smith    Synopsis:
892c803a25aSBarry Smith    #include <petscmath.h>
89366baab88SBarry Smith    bool PetscApproximateLTE(PetscReal x,constant float)
894c803a25aSBarry Smith 
895c803a25aSBarry Smith    Not Collective
896c803a25aSBarry Smith 
897c803a25aSBarry Smith    Input Parameters:
898c803a25aSBarry Smith +   x - the variable
899c803a25aSBarry Smith -   b - the constant float it is checking if x is less than or equal to
900c803a25aSBarry Smith 
901c803a25aSBarry Smith    Notes:
902c803a25aSBarry Smith      The fudge factor is the value PETSC_SMALL
903c803a25aSBarry Smith 
904c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
905c803a25aSBarry Smith 
906c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
907c803a25aSBarry Smith      floating point results.
908c803a25aSBarry Smith 
909c803a25aSBarry Smith    Level: advanced
910c803a25aSBarry Smith 
91166baab88SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscApproximateGTE()
912c803a25aSBarry Smith 
913c803a25aSBarry Smith M*/
91466baab88SBarry Smith #define PetscApproximateLTE(x,b)  ((x) <= (PetscRealConstant(b)+PETSC_SMALL))
915c803a25aSBarry Smith 
916c803a25aSBarry Smith /*MC
91766baab88SBarry Smith     PetscApproximateGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers
918c803a25aSBarry Smith 
919c803a25aSBarry Smith    Synopsis:
920c803a25aSBarry Smith    #include <petscmath.h>
92166baab88SBarry Smith    bool PetscApproximateGTE(PetscReal x,constant float)
922c803a25aSBarry Smith 
923c803a25aSBarry Smith    Not Collective
924c803a25aSBarry Smith 
925c803a25aSBarry Smith    Input Parameters:
926c803a25aSBarry Smith +   x - the variable
927c803a25aSBarry Smith -   b - the constant float it is checking if x is greater than or equal to
928c803a25aSBarry Smith 
929c803a25aSBarry Smith    Notes:
930c803a25aSBarry Smith      The fudge factor is the value PETSC_SMALL
931c803a25aSBarry Smith 
932c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
933c803a25aSBarry Smith 
934c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
935c803a25aSBarry Smith      floating point results.
936c803a25aSBarry Smith 
937c803a25aSBarry Smith    Level: advanced
938c803a25aSBarry Smith 
93966baab88SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscApproximateLTE()
940c803a25aSBarry Smith 
941c803a25aSBarry Smith M*/
94266baab88SBarry Smith #define PetscApproximateGTE(x,b)  ((x) >= (PetscRealConstant(b)-PETSC_SMALL))
943c803a25aSBarry Smith 
944faa75363SBarry Smith /*MC
945faa75363SBarry Smith     PetscCeilInt - Returns the ceiling of the quotation of two positive integers
946faa75363SBarry Smith 
947faa75363SBarry Smith    Synopsis:
948faa75363SBarry Smith    #include <petscmath.h>
949faa75363SBarry Smith    PetscInt PetscCeilInt(PetscInt x,PetscInt y)
950faa75363SBarry Smith 
951faa75363SBarry Smith    Not Collective
952faa75363SBarry Smith 
953faa75363SBarry Smith    Input Parameters:
954faa75363SBarry Smith +   x - the numerator
955faa75363SBarry Smith -   y - the denominator
956faa75363SBarry Smith 
957faa75363SBarry Smith    Level: advanced
958faa75363SBarry Smith 
95966baab88SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscApproximateLTE()
960faa75363SBarry Smith 
961faa75363SBarry Smith M*/
962faa75363SBarry Smith #define PetscCeilInt(x,y)  ((((PetscInt)(x))/((PetscInt)(y))) +  ((((PetscInt)(x)) % ((PetscInt)(y))) ? 1 : 0))
963faa75363SBarry Smith 
964faa75363SBarry Smith #define PetscCeilInt64(x,y)  ((((PetscInt64)(x))/((PetscInt64)(y))) +  ((((PetscInt64)(x)) % ((PetscInt64)(y))) ? 1 : 0))
965faa75363SBarry Smith 
966bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt,const PetscReal[],const PetscReal[],PetscReal*,PetscReal*);
967e489efc1SBarry Smith #endif
968