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