xref: /petsc/include/petscmath.h (revision 6524c165f7ddaf30fd7457737f668f984c8ababf)
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 */
10*6524c165SJacob Faibussowitsch #ifndef PETSCMATH_H
1126bd1501SBarry Smith #define PETSCMATH_H
12ac09b921SBarry Smith 
130a5f7794SBarry Smith #include <math.h>
1493d501b3SJacob Faibussowitsch #include <petscmacros.h>
15df4397b0SStefano Zampini #include <petscsystypes.h>
16df4397b0SStefano Zampini 
17ac09b921SBarry Smith /* SUBMANSEC = Sys */
18ac09b921SBarry Smith 
195117d392SLisandro Dalcin /*
205117d392SLisandro Dalcin 
215117d392SLisandro Dalcin    Defines operations that are different for complex and real numbers.
225117d392SLisandro Dalcin    All PETSc objects in one program are built around the object
235117d392SLisandro Dalcin    PetscScalar which is either always a real or a complex.
245117d392SLisandro Dalcin 
255117d392SLisandro Dalcin */
265117d392SLisandro Dalcin 
275117d392SLisandro Dalcin /*
285117d392SLisandro Dalcin     Real number definitions
295117d392SLisandro Dalcin  */
305117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
315117d392SLisandro Dalcin #define PetscSqrtReal(a)        sqrtf(a)
325117d392SLisandro Dalcin #define PetscCbrtReal(a)        cbrtf(a)
335117d392SLisandro Dalcin #define PetscHypotReal(a, b)    hypotf(a, b)
345117d392SLisandro Dalcin #define PetscAtan2Real(a, b)    atan2f(a, b)
355117d392SLisandro Dalcin #define PetscPowReal(a, b)      powf(a, b)
365117d392SLisandro Dalcin #define PetscExpReal(a)         expf(a)
375117d392SLisandro Dalcin #define PetscLogReal(a)         logf(a)
385117d392SLisandro Dalcin #define PetscLog10Real(a)       log10f(a)
395117d392SLisandro Dalcin #define PetscLog2Real(a)        log2f(a)
405117d392SLisandro Dalcin #define PetscSinReal(a)         sinf(a)
415117d392SLisandro Dalcin #define PetscCosReal(a)         cosf(a)
425117d392SLisandro Dalcin #define PetscTanReal(a)         tanf(a)
435117d392SLisandro Dalcin #define PetscAsinReal(a)        asinf(a)
445117d392SLisandro Dalcin #define PetscAcosReal(a)        acosf(a)
455117d392SLisandro Dalcin #define PetscAtanReal(a)        atanf(a)
465117d392SLisandro Dalcin #define PetscSinhReal(a)        sinhf(a)
475117d392SLisandro Dalcin #define PetscCoshReal(a)        coshf(a)
485117d392SLisandro Dalcin #define PetscTanhReal(a)        tanhf(a)
495117d392SLisandro Dalcin #define PetscAsinhReal(a)       asinhf(a)
505117d392SLisandro Dalcin #define PetscAcoshReal(a)       acoshf(a)
515117d392SLisandro Dalcin #define PetscAtanhReal(a)       atanhf(a)
52d6685f55SMatthew G. Knepley #define PetscErfReal(a)         erff(a)
535117d392SLisandro Dalcin #define PetscCeilReal(a)        ceilf(a)
545117d392SLisandro Dalcin #define PetscFloorReal(a)       floorf(a)
555117d392SLisandro Dalcin #define PetscFmodReal(a, b)     fmodf(a, b)
569c3ee494SJed Brown #define PetscCopysignReal(a, b) copysignf(a, b)
575117d392SLisandro Dalcin #define PetscTGamma(a)          tgammaf(a)
581f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
591f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a)
601f17fa70SToby Isaac #else
611f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a)
621f17fa70SToby Isaac #endif
635117d392SLisandro Dalcin 
645117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
655117d392SLisandro Dalcin #define PetscSqrtReal(a)        sqrt(a)
665117d392SLisandro Dalcin #define PetscCbrtReal(a)        cbrt(a)
675117d392SLisandro Dalcin #define PetscHypotReal(a, b)    hypot(a, b)
685117d392SLisandro Dalcin #define PetscAtan2Real(a, b)    atan2(a, b)
695117d392SLisandro Dalcin #define PetscPowReal(a, b)      pow(a, b)
705117d392SLisandro Dalcin #define PetscExpReal(a)         exp(a)
715117d392SLisandro Dalcin #define PetscLogReal(a)         log(a)
725117d392SLisandro Dalcin #define PetscLog10Real(a)       log10(a)
735117d392SLisandro Dalcin #define PetscLog2Real(a)        log2(a)
745117d392SLisandro Dalcin #define PetscSinReal(a)         sin(a)
755117d392SLisandro Dalcin #define PetscCosReal(a)         cos(a)
765117d392SLisandro Dalcin #define PetscTanReal(a)         tan(a)
775117d392SLisandro Dalcin #define PetscAsinReal(a)        asin(a)
785117d392SLisandro Dalcin #define PetscAcosReal(a)        acos(a)
795117d392SLisandro Dalcin #define PetscAtanReal(a)        atan(a)
805117d392SLisandro Dalcin #define PetscSinhReal(a)        sinh(a)
815117d392SLisandro Dalcin #define PetscCoshReal(a)        cosh(a)
825117d392SLisandro Dalcin #define PetscTanhReal(a)        tanh(a)
835117d392SLisandro Dalcin #define PetscAsinhReal(a)       asinh(a)
845117d392SLisandro Dalcin #define PetscAcoshReal(a)       acosh(a)
855117d392SLisandro Dalcin #define PetscAtanhReal(a)       atanh(a)
86d6685f55SMatthew G. Knepley #define PetscErfReal(a)         erf(a)
875117d392SLisandro Dalcin #define PetscCeilReal(a)        ceil(a)
885117d392SLisandro Dalcin #define PetscFloorReal(a)       floor(a)
895117d392SLisandro Dalcin #define PetscFmodReal(a, b)     fmod(a, b)
909c3ee494SJed Brown #define PetscCopysignReal(a, b) copysign(a, b)
915117d392SLisandro Dalcin #define PetscTGamma(a)          tgamma(a)
921f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
931f17fa70SToby Isaac #define PetscLGamma(a) gamma(a)
941f17fa70SToby Isaac #else
951f17fa70SToby Isaac #define PetscLGamma(a) lgamma(a)
961f17fa70SToby Isaac #endif
975117d392SLisandro Dalcin 
985117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
995117d392SLisandro Dalcin #define PetscSqrtReal(a)        sqrtq(a)
1005117d392SLisandro Dalcin #define PetscCbrtReal(a)        cbrtq(a)
1015117d392SLisandro Dalcin #define PetscHypotReal(a, b)    hypotq(a, b)
1025117d392SLisandro Dalcin #define PetscAtan2Real(a, b)    atan2q(a, b)
1035117d392SLisandro Dalcin #define PetscPowReal(a, b)      powq(a, b)
1045117d392SLisandro Dalcin #define PetscExpReal(a)         expq(a)
1055117d392SLisandro Dalcin #define PetscLogReal(a)         logq(a)
1065117d392SLisandro Dalcin #define PetscLog10Real(a)       log10q(a)
1075117d392SLisandro Dalcin #define PetscLog2Real(a)        log2q(a)
1085117d392SLisandro Dalcin #define PetscSinReal(a)         sinq(a)
1095117d392SLisandro Dalcin #define PetscCosReal(a)         cosq(a)
1105117d392SLisandro Dalcin #define PetscTanReal(a)         tanq(a)
1115117d392SLisandro Dalcin #define PetscAsinReal(a)        asinq(a)
1125117d392SLisandro Dalcin #define PetscAcosReal(a)        acosq(a)
1135117d392SLisandro Dalcin #define PetscAtanReal(a)        atanq(a)
1145117d392SLisandro Dalcin #define PetscSinhReal(a)        sinhq(a)
1155117d392SLisandro Dalcin #define PetscCoshReal(a)        coshq(a)
1165117d392SLisandro Dalcin #define PetscTanhReal(a)        tanhq(a)
1175117d392SLisandro Dalcin #define PetscAsinhReal(a)       asinhq(a)
1185117d392SLisandro Dalcin #define PetscAcoshReal(a)       acoshq(a)
1195117d392SLisandro Dalcin #define PetscAtanhReal(a)       atanhq(a)
120d6685f55SMatthew G. Knepley #define PetscErfReal(a)         erfq(a)
1215117d392SLisandro Dalcin #define PetscCeilReal(a)        ceilq(a)
1225117d392SLisandro Dalcin #define PetscFloorReal(a)       floorq(a)
1235117d392SLisandro Dalcin #define PetscFmodReal(a, b)     fmodq(a, b)
1249c3ee494SJed Brown #define PetscCopysignReal(a, b) copysignq(a, b)
1255117d392SLisandro Dalcin #define PetscTGamma(a)          tgammaq(a)
1261f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1271f17fa70SToby Isaac #define PetscLGamma(a) gammaq(a)
1281f17fa70SToby Isaac #else
1291f17fa70SToby Isaac #define PetscLGamma(a) lgammaq(a)
1301f17fa70SToby Isaac #endif
1315117d392SLisandro Dalcin 
1325117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
1335117d392SLisandro Dalcin #define PetscSqrtReal(a)        sqrtf(a)
1345117d392SLisandro Dalcin #define PetscCbrtReal(a)        cbrtf(a)
1355117d392SLisandro Dalcin #define PetscHypotReal(a, b)    hypotf(a, b)
1365117d392SLisandro Dalcin #define PetscAtan2Real(a, b)    atan2f(a, b)
1375117d392SLisandro Dalcin #define PetscPowReal(a, b)      powf(a, b)
1385117d392SLisandro Dalcin #define PetscExpReal(a)         expf(a)
1395117d392SLisandro Dalcin #define PetscLogReal(a)         logf(a)
1405117d392SLisandro Dalcin #define PetscLog10Real(a)       log10f(a)
1415117d392SLisandro Dalcin #define PetscLog2Real(a)        log2f(a)
1425117d392SLisandro Dalcin #define PetscSinReal(a)         sinf(a)
1435117d392SLisandro Dalcin #define PetscCosReal(a)         cosf(a)
1445117d392SLisandro Dalcin #define PetscTanReal(a)         tanf(a)
1455117d392SLisandro Dalcin #define PetscAsinReal(a)        asinf(a)
1465117d392SLisandro Dalcin #define PetscAcosReal(a)        acosf(a)
1475117d392SLisandro Dalcin #define PetscAtanReal(a)        atanf(a)
1485117d392SLisandro Dalcin #define PetscSinhReal(a)        sinhf(a)
1495117d392SLisandro Dalcin #define PetscCoshReal(a)        coshf(a)
1505117d392SLisandro Dalcin #define PetscTanhReal(a)        tanhf(a)
1515117d392SLisandro Dalcin #define PetscAsinhReal(a)       asinhf(a)
1525117d392SLisandro Dalcin #define PetscAcoshReal(a)       acoshf(a)
1535117d392SLisandro Dalcin #define PetscAtanhReal(a)       atanhf(a)
154d6685f55SMatthew G. Knepley #define PetscErfReal(a)         erff(a)
1555117d392SLisandro Dalcin #define PetscCeilReal(a)        ceilf(a)
1565117d392SLisandro Dalcin #define PetscFloorReal(a)       floorf(a)
1575117d392SLisandro Dalcin #define PetscFmodReal(a, b)     fmodf(a, b)
1589c3ee494SJed Brown #define PetscCopySignReal(a, b) copysignf(a, b)
1595117d392SLisandro Dalcin #define PetscTGamma(a)          tgammaf(a)
1601f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1611f17fa70SToby Isaac #define PetscLGamma(a) gammaf(a)
1621f17fa70SToby Isaac #else
1631f17fa70SToby Isaac #define PetscLGamma(a) lgammaf(a)
1641f17fa70SToby Isaac #endif
1655117d392SLisandro Dalcin 
1665117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
1675117d392SLisandro Dalcin 
1689371c9d4SSatish Balay static inline PetscReal PetscSignReal(PetscReal a) {
1695117d392SLisandro Dalcin   return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0));
1705117d392SLisandro Dalcin }
1715117d392SLisandro Dalcin 
1725117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2)
1735117d392SLisandro Dalcin #undef PetscLog2Real
1749371c9d4SSatish Balay static inline PetscReal PetscLog2Real(PetscReal a) {
1755117d392SLisandro Dalcin   return PetscLogReal(a) / PetscLogReal((PetscReal)2);
1765117d392SLisandro Dalcin }
1775117d392SLisandro Dalcin #endif
1785117d392SLisandro Dalcin 
179613bf2b2SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128)
18093d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PETSC_ATTRIBUTE_MPI_TYPE_TAG(__float128);
1815117d392SLisandro Dalcin #endif
1829e517322SPierre Jolivet #if defined(PETSC_HAVE_REAL___FP16)
18393d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___FP16 PETSC_ATTRIBUTE_MPI_TYPE_TAG(__fp16);
1845117d392SLisandro Dalcin #endif
1855117d392SLisandro Dalcin 
186df4397b0SStefano Zampini /*MC
18787497f52SBarry Smith    MPIU_REAL - Portable MPI datatype corresponding to `PetscReal` independent of what precision `PetscReal` is in
188df4397b0SStefano Zampini 
189df4397b0SStefano Zampini    Notes:
19087497f52SBarry Smith    In MPI calls that require an MPI datatype that matches a `PetscReal` or array of `PetscReal` values, pass this value.
191df4397b0SStefano Zampini 
192df4397b0SStefano Zampini    Level: beginner
193df4397b0SStefano Zampini 
194db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`
195df4397b0SStefano Zampini M*/
196c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE)
197c1d390e3SJed Brown #define MPIU_REAL MPI_FLOAT
198c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE)
199c1d390e3SJed Brown #define MPIU_REAL MPI_DOUBLE
200c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128)
201c1d390e3SJed Brown #define MPIU_REAL MPIU___FLOAT128
202570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
203570b7f6dSBarry Smith #define MPIU_REAL MPIU___FP16
204c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */
20559cb5930SBarry Smith 
2061093a601SBarry Smith /*
2071093a601SBarry Smith     Complex number definitions
2081093a601SBarry Smith  */
209df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX)
210450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128)
2111093a601SBarry Smith /* C++ support of complex number */
212b7940d39SSatish Balay 
21350f81f78SJed Brown #define PetscRealPartComplex(a)      (a).real()
21450f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag()
215df4397b0SStefano Zampini #define PetscAbsComplex(a)           petsccomplexlib::abs(a)
2165117d392SLisandro Dalcin #define PetscArgComplex(a)           petsccomplexlib::arg(a)
217df4397b0SStefano Zampini #define PetscConjComplex(a)          petsccomplexlib::conj(a)
218df4397b0SStefano Zampini #define PetscSqrtComplex(a)          petsccomplexlib::sqrt(a)
219df4397b0SStefano Zampini #define PetscPowComplex(a, b)        petsccomplexlib::pow(a, b)
220df4397b0SStefano Zampini #define PetscExpComplex(a)           petsccomplexlib::exp(a)
221df4397b0SStefano Zampini #define PetscLogComplex(a)           petsccomplexlib::log(a)
222df4397b0SStefano Zampini #define PetscSinComplex(a)           petsccomplexlib::sin(a)
223df4397b0SStefano Zampini #define PetscCosComplex(a)           petsccomplexlib::cos(a)
2245117d392SLisandro Dalcin #define PetscTanComplex(a)           petsccomplexlib::tan(a)
225df4397b0SStefano Zampini #define PetscAsinComplex(a)          petsccomplexlib::asin(a)
226df4397b0SStefano Zampini #define PetscAcosComplex(a)          petsccomplexlib::acos(a)
2275117d392SLisandro Dalcin #define PetscAtanComplex(a)          petsccomplexlib::atan(a)
228df4397b0SStefano Zampini #define PetscSinhComplex(a)          petsccomplexlib::sinh(a)
229df4397b0SStefano Zampini #define PetscCoshComplex(a)          petsccomplexlib::cosh(a)
230df4397b0SStefano Zampini #define PetscTanhComplex(a)          petsccomplexlib::tanh(a)
2315117d392SLisandro Dalcin #define PetscAsinhComplex(a)         petsccomplexlib::asinh(a)
2325117d392SLisandro Dalcin #define PetscAcoshComplex(a)         petsccomplexlib::acosh(a)
2335117d392SLisandro Dalcin #define PetscAtanhComplex(a)         petsccomplexlib::atanh(a)
2345117d392SLisandro Dalcin 
2355117d392SLisandro Dalcin /* TODO: Add configure tests
2365117d392SLisandro Dalcin 
2375117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX)
2385117d392SLisandro Dalcin #undef PetscTanComplex
2399fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanComplex(PetscComplex z)
2405117d392SLisandro Dalcin {
2415117d392SLisandro Dalcin   return PetscSinComplex(z)/PetscCosComplex(z);
2425117d392SLisandro Dalcin }
243027d9794SBarry Smith #endif
244debe9ee2SPaul Mullowney 
2455117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX)
2465117d392SLisandro Dalcin #undef PetscTanhComplex
2479fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanhComplex(PetscComplex z)
2485117d392SLisandro Dalcin {
2495117d392SLisandro Dalcin   return PetscSinhComplex(z)/PetscCoshComplex(z);
2505117d392SLisandro Dalcin }
2515117d392SLisandro Dalcin #endif
2525117d392SLisandro Dalcin 
2535117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX)
2545117d392SLisandro Dalcin #undef PetscAsinComplex
2559fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinComplex(PetscComplex z)
2565117d392SLisandro Dalcin {
2575117d392SLisandro Dalcin   const PetscComplex j(0,1);
2585117d392SLisandro Dalcin   return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z));
2595117d392SLisandro Dalcin }
2605117d392SLisandro Dalcin #endif
2615117d392SLisandro Dalcin 
2625117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX)
2635117d392SLisandro Dalcin #undef PetscAcosComplex
2649fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcosComplex(PetscComplex z)
2655117d392SLisandro Dalcin {
2665117d392SLisandro Dalcin   const PetscComplex j(0,1);
2675117d392SLisandro Dalcin   return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z));
2685117d392SLisandro Dalcin }
2695117d392SLisandro Dalcin #endif
2705117d392SLisandro Dalcin 
2715117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX)
2725117d392SLisandro Dalcin #undef PetscAtanComplex
2739fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanComplex(PetscComplex z)
2745117d392SLisandro Dalcin {
2755117d392SLisandro Dalcin   const PetscComplex j(0,1);
2765117d392SLisandro Dalcin   return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z));
2775117d392SLisandro Dalcin }
2785117d392SLisandro Dalcin #endif
2795117d392SLisandro Dalcin 
2805117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX)
2815117d392SLisandro Dalcin #undef PetscAsinhComplex
2829fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinhComplex(PetscComplex z)
2835117d392SLisandro Dalcin {
2845117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f));
2855117d392SLisandro Dalcin }
2865117d392SLisandro Dalcin #endif
2875117d392SLisandro Dalcin 
2885117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX)
2895117d392SLisandro Dalcin #undef PetscAcoshComplex
2909fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcoshComplex(PetscComplex z)
2915117d392SLisandro Dalcin {
2925117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z-1.0f));
2935117d392SLisandro Dalcin }
2945117d392SLisandro Dalcin #endif
2955117d392SLisandro Dalcin 
2965117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATANH_COMPLEX)
2975117d392SLisandro Dalcin #undef PetscAtanhComplex
2989fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanhComplex(PetscComplex z)
2995117d392SLisandro Dalcin {
3005117d392SLisandro Dalcin   return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z));
3015117d392SLisandro Dalcin }
3025117d392SLisandro Dalcin #endif
3035117d392SLisandro Dalcin 
3045117d392SLisandro Dalcin */
3055117d392SLisandro Dalcin 
3067a19d461SSatish Balay #else /* C99 support of complex number */
307519e2a1fSPaul Mullowney 
3087a19d461SSatish Balay #if defined(PETSC_USE_REAL_SINGLE)
30950f81f78SJed Brown #define PetscRealPartComplex(a)      crealf(a)
31050f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a)
31150f81f78SJed Brown #define PetscAbsComplex(a)           cabsf(a)
3125117d392SLisandro Dalcin #define PetscArgComplex(a)           cargf(a)
31350f81f78SJed Brown #define PetscConjComplex(a)          conjf(a)
31450f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtf(a)
31550f81f78SJed Brown #define PetscPowComplex(a, b)        cpowf(a, b)
31650f81f78SJed Brown #define PetscExpComplex(a)           cexpf(a)
31750f81f78SJed Brown #define PetscLogComplex(a)           clogf(a)
31850f81f78SJed Brown #define PetscSinComplex(a)           csinf(a)
31950f81f78SJed Brown #define PetscCosComplex(a)           ccosf(a)
3205117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanf(a)
321255453a1SBarry Smith #define PetscAsinComplex(a)          casinf(a)
322255453a1SBarry Smith #define PetscAcosComplex(a)          cacosf(a)
3235117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanf(a)
324a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhf(a)
325a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshf(a)
326a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhf(a)
3275117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhf(a)
3285117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshf(a)
3295117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhf(a)
3301093a601SBarry Smith 
331ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
33250f81f78SJed Brown #define PetscRealPartComplex(a)      creal(a)
33350f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a)
33450f81f78SJed Brown #define PetscAbsComplex(a)           cabs(a)
3355117d392SLisandro Dalcin #define PetscArgComplex(a)           carg(a)
33650f81f78SJed Brown #define PetscConjComplex(a)          conj(a)
33750f81f78SJed Brown #define PetscSqrtComplex(a)          csqrt(a)
33850f81f78SJed Brown #define PetscPowComplex(a, b)        cpow(a, b)
33950f81f78SJed Brown #define PetscExpComplex(a)           cexp(a)
34050f81f78SJed Brown #define PetscLogComplex(a)           clog(a)
34150f81f78SJed Brown #define PetscSinComplex(a)           csin(a)
34250f81f78SJed Brown #define PetscCosComplex(a)           ccos(a)
3435117d392SLisandro Dalcin #define PetscTanComplex(a)           ctan(a)
344255453a1SBarry Smith #define PetscAsinComplex(a)          casin(a)
345255453a1SBarry Smith #define PetscAcosComplex(a)          cacos(a)
3465117d392SLisandro Dalcin #define PetscAtanComplex(a)          catan(a)
347a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinh(a)
348a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccosh(a)
349a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanh(a)
3505117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinh(a)
3515117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacosh(a)
3525117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanh(a)
3531093a601SBarry Smith 
3548c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128)
35550f81f78SJed Brown #define PetscRealPartComplex(a)      crealq(a)
35650f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a)
35750f81f78SJed Brown #define PetscAbsComplex(a)           cabsq(a)
3585117d392SLisandro Dalcin #define PetscArgComplex(a)           cargq(a)
35950f81f78SJed Brown #define PetscConjComplex(a)          conjq(a)
36050f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtq(a)
36150f81f78SJed Brown #define PetscPowComplex(a, b)        cpowq(a, b)
36250f81f78SJed Brown #define PetscExpComplex(a)           cexpq(a)
36350f81f78SJed Brown #define PetscLogComplex(a)           clogq(a)
36450f81f78SJed Brown #define PetscSinComplex(a)           csinq(a)
36550f81f78SJed Brown #define PetscCosComplex(a)           ccosq(a)
3665117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanq(a)
367255453a1SBarry Smith #define PetscAsinComplex(a)          casinq(a)
368255453a1SBarry Smith #define PetscAcosComplex(a)          cacosq(a)
3695117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanq(a)
370a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhq(a)
371a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshq(a)
372a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhq(a)
3735117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhq(a)
3745117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshq(a)
3755117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhq(a)
376a4bea5a6SPeter Brune 
377ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */
3787a19d461SSatish Balay #endif /* (__cplusplus) */
379e489efc1SBarry Smith 
3801093a601SBarry Smith /*
3815117d392SLisandro Dalcin    PETSC_i is the imaginary number, i
3821093a601SBarry Smith */
38350f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i;
3848a351411SToby Isaac 
3855117d392SLisandro Dalcin /*
3865117d392SLisandro Dalcin    Try to do the right thing for complex number construction: see
3878a351411SToby Isaac    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm
3888a351411SToby Isaac    for details
3898a351411SToby Isaac */
3909371c9d4SSatish Balay static inline PetscComplex PetscCMPLX(PetscReal x, PetscReal y) {
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. */
4039371c9d4SSatish Balay     union
4049371c9d4SSatish Balay     {
4059371c9d4SSatish Balay       PetscComplex z;
4069371c9d4SSatish Balay       PetscReal    f[2];
4079371c9d4SSatish Balay     } uz;
408616d7c5eSToby Isaac 
409616d7c5eSToby Isaac     uz.f[0] = x;
410616d7c5eSToby Isaac     uz.f[1] = y;
411616d7c5eSToby Isaac     return uz.z;
412616d7c5eSToby Isaac   }
41350f81f78SJed Brown #endif
4148a351411SToby Isaac }
4158a351411SToby Isaac 
416de272c7aSSatish 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)\"")
417de272c7aSSatish 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)\"")
418de272c7aSSatish Balay 
419613bf2b2SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128)
42093d501b3SJacob Faibussowitsch // if complex is not used, then quadmath.h won't be included by petscsystypes.h
42193d501b3SJacob Faibussowitsch #if defined(PETSC_USE_COMPLEX)
42293d501b3SJacob Faibussowitsch #define MPIU___COMPLEX128_ATTR_TAG PETSC_ATTRIBUTE_MPI_TYPE_TAG(__complex128)
42393d501b3SJacob Faibussowitsch #else
42493d501b3SJacob Faibussowitsch #define MPIU___COMPLEX128_ATTR_TAG
42593d501b3SJacob Faibussowitsch #endif
42693d501b3SJacob Faibussowitsch 
42793d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 MPIU___COMPLEX128_ATTR_TAG;
42893d501b3SJacob Faibussowitsch 
42993d501b3SJacob Faibussowitsch #undef MPIU___COMPLEX128_ATTR_TAG
430613bf2b2SPierre Jolivet #endif /* PETSC_HAVE_REAL___FLOAT128 */
4315117d392SLisandro Dalcin 
4325117d392SLisandro Dalcin /*MC
43387497f52SBarry Smith    MPIU_COMPLEX - Portable MPI datatype corresponding to `PetscComplex` independent of the precision of `PetscComplex`
4345117d392SLisandro Dalcin 
4355117d392SLisandro Dalcin    Notes:
43687497f52SBarry Smith    In MPI calls that require an MPI datatype that matches a `PetscComplex` or array of `PetscComplex` values, pass this value.
4375117d392SLisandro Dalcin 
4385117d392SLisandro Dalcin    Level: beginner
4395117d392SLisandro Dalcin 
440db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`, `PETSC_i`
4415117d392SLisandro Dalcin M*/
4425117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
443de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_COMPLEX
4445117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
445de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX
4465117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
4475117d392SLisandro Dalcin #define MPIU_COMPLEX MPIU___COMPLEX128
4485117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
449de272c7aSSatish Balay #define MPIU_COMPLEX MPI_C_COMPLEX
4505117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
4515117d392SLisandro Dalcin 
4525117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */
4535117d392SLisandro Dalcin 
4545117d392SLisandro Dalcin /*
4555117d392SLisandro Dalcin     Scalar number definitions
4565117d392SLisandro Dalcin  */
4577a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX)
4585117d392SLisandro Dalcin /*MC
45987497f52SBarry Smith    MPIU_SCALAR - Portable MPI datatype corresponding to `PetscScalar` independent of the precision of `PetscScalar`
4605117d392SLisandro Dalcin 
4615117d392SLisandro Dalcin    Notes:
46287497f52SBarry Smith    In MPI calls that require an MPI datatype that matches a `PetscScalar` or array of `PetscScalar` values, pass this value.
4635117d392SLisandro Dalcin 
4645117d392SLisandro Dalcin    Level: beginner
4655117d392SLisandro Dalcin 
466db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_COMPLEX`, `MPIU_INT`
4675117d392SLisandro Dalcin M*/
4685117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX
4695117d392SLisandro Dalcin 
4705117d392SLisandro Dalcin /*MC
47187497f52SBarry Smith    PetscRealPart - Returns the real part of a `PetscScalar`
4725117d392SLisandro Dalcin 
4735117d392SLisandro Dalcin    Synopsis:
4745117d392SLisandro Dalcin    #include <petscmath.h>
4755117d392SLisandro Dalcin    PetscReal PetscRealPart(PetscScalar v)
4765117d392SLisandro Dalcin 
4775117d392SLisandro Dalcin    Not Collective
4785117d392SLisandro Dalcin 
4795117d392SLisandro Dalcin    Input Parameter:
4805117d392SLisandro Dalcin .  v - value to find the real part of
4815117d392SLisandro Dalcin 
4825117d392SLisandro Dalcin    Level: beginner
4835117d392SLisandro Dalcin 
484db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscImaginaryPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
4855117d392SLisandro Dalcin 
4865117d392SLisandro Dalcin M*/
4875117d392SLisandro Dalcin #define PetscRealPart(a) PetscRealPartComplex(a)
4885117d392SLisandro Dalcin 
4895117d392SLisandro Dalcin /*MC
49087497f52SBarry Smith    PetscImaginaryPart - Returns the imaginary part of a `PetscScalar`
4915117d392SLisandro Dalcin 
4925117d392SLisandro Dalcin    Synopsis:
4935117d392SLisandro Dalcin    #include <petscmath.h>
4945117d392SLisandro Dalcin    PetscReal PetscImaginaryPart(PetscScalar v)
4955117d392SLisandro Dalcin 
4965117d392SLisandro Dalcin    Not Collective
4975117d392SLisandro Dalcin 
4985117d392SLisandro Dalcin    Input Parameter:
4995117d392SLisandro Dalcin .  v - value to find the imaginary part of
5005117d392SLisandro Dalcin 
5015117d392SLisandro Dalcin    Level: beginner
5025117d392SLisandro Dalcin 
5035117d392SLisandro Dalcin    Notes:
5045117d392SLisandro Dalcin        If PETSc was configured for real numbers then this always returns the value 0
5055117d392SLisandro Dalcin 
506db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscRealPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
5075117d392SLisandro Dalcin 
5085117d392SLisandro Dalcin M*/
5095117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a)
5105117d392SLisandro Dalcin 
5115117d392SLisandro Dalcin #define PetscAbsScalar(a)    PetscAbsComplex(a)
5125117d392SLisandro Dalcin #define PetscArgScalar(a)    PetscArgComplex(a)
5135117d392SLisandro Dalcin #define PetscConj(a)         PetscConjComplex(a)
5145117d392SLisandro Dalcin #define PetscSqrtScalar(a)   PetscSqrtComplex(a)
5155117d392SLisandro Dalcin #define PetscPowScalar(a, b) PetscPowComplex(a, b)
5165117d392SLisandro Dalcin #define PetscExpScalar(a)    PetscExpComplex(a)
5175117d392SLisandro Dalcin #define PetscLogScalar(a)    PetscLogComplex(a)
5185117d392SLisandro Dalcin #define PetscSinScalar(a)    PetscSinComplex(a)
5195117d392SLisandro Dalcin #define PetscCosScalar(a)    PetscCosComplex(a)
5205117d392SLisandro Dalcin #define PetscTanScalar(a)    PetscTanComplex(a)
5215117d392SLisandro Dalcin #define PetscAsinScalar(a)   PetscAsinComplex(a)
5225117d392SLisandro Dalcin #define PetscAcosScalar(a)   PetscAcosComplex(a)
5235117d392SLisandro Dalcin #define PetscAtanScalar(a)   PetscAtanComplex(a)
5245117d392SLisandro Dalcin #define PetscSinhScalar(a)   PetscSinhComplex(a)
5255117d392SLisandro Dalcin #define PetscCoshScalar(a)   PetscCoshComplex(a)
5265117d392SLisandro Dalcin #define PetscTanhScalar(a)   PetscTanhComplex(a)
5275117d392SLisandro Dalcin #define PetscAsinhScalar(a)  PetscAsinhComplex(a)
5285117d392SLisandro Dalcin #define PetscAcoshScalar(a)  PetscAcoshComplex(a)
5295117d392SLisandro Dalcin #define PetscAtanhScalar(a)  PetscAtanhComplex(a)
5305117d392SLisandro Dalcin 
5315117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */
5325117d392SLisandro Dalcin #define MPIU_SCALAR           MPIU_REAL
5335117d392SLisandro Dalcin #define PetscRealPart(a)      (a)
5345117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0)
5355117d392SLisandro Dalcin #define PetscAbsScalar(a)     PetscAbsReal(a)
5365117d392SLisandro Dalcin #define PetscArgScalar(a)     (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0)
5375117d392SLisandro Dalcin #define PetscConj(a)          (a)
5385117d392SLisandro Dalcin #define PetscSqrtScalar(a)    PetscSqrtReal(a)
5395117d392SLisandro Dalcin #define PetscPowScalar(a, b)  PetscPowReal(a, b)
5405117d392SLisandro Dalcin #define PetscExpScalar(a)     PetscExpReal(a)
5415117d392SLisandro Dalcin #define PetscLogScalar(a)     PetscLogReal(a)
5425117d392SLisandro Dalcin #define PetscSinScalar(a)     PetscSinReal(a)
5435117d392SLisandro Dalcin #define PetscCosScalar(a)     PetscCosReal(a)
5445117d392SLisandro Dalcin #define PetscTanScalar(a)     PetscTanReal(a)
5455117d392SLisandro Dalcin #define PetscAsinScalar(a)    PetscAsinReal(a)
5465117d392SLisandro Dalcin #define PetscAcosScalar(a)    PetscAcosReal(a)
5475117d392SLisandro Dalcin #define PetscAtanScalar(a)    PetscAtanReal(a)
5485117d392SLisandro Dalcin #define PetscSinhScalar(a)    PetscSinhReal(a)
5495117d392SLisandro Dalcin #define PetscCoshScalar(a)    PetscCoshReal(a)
5505117d392SLisandro Dalcin #define PetscTanhScalar(a)    PetscTanhReal(a)
5515117d392SLisandro Dalcin #define PetscAsinhScalar(a)   PetscAsinhReal(a)
5525117d392SLisandro Dalcin #define PetscAcoshScalar(a)   PetscAcoshReal(a)
5535117d392SLisandro Dalcin #define PetscAtanhScalar(a)   PetscAtanhReal(a)
5545117d392SLisandro Dalcin 
5555117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */
5565117d392SLisandro Dalcin 
5575117d392SLisandro Dalcin /*
5585117d392SLisandro Dalcin    Certain objects may be created using either single or double precision.
5595117d392SLisandro Dalcin    This is currently not used.
5605117d392SLisandro Dalcin */
5619371c9d4SSatish Balay typedef enum {
5629371c9d4SSatish Balay   PETSC_SCALAR_DOUBLE,
5639371c9d4SSatish Balay   PETSC_SCALAR_SINGLE,
5649371c9d4SSatish Balay   PETSC_SCALAR_LONG_DOUBLE,
5659371c9d4SSatish Balay   PETSC_SCALAR_HALF
5669371c9d4SSatish Balay } PetscScalarPrecision;
5675117d392SLisandro Dalcin 
5685117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/
5695117d392SLisandro Dalcin 
5705117d392SLisandro Dalcin /*MC
5715117d392SLisandro Dalcin    PetscAbs - Returns the absolute value of a number
5725117d392SLisandro Dalcin 
5735117d392SLisandro Dalcin    Synopsis:
5745117d392SLisandro Dalcin    #include <petscmath.h>
5755117d392SLisandro Dalcin    type PetscAbs(type v)
5765117d392SLisandro Dalcin 
5775117d392SLisandro Dalcin    Not Collective
5785117d392SLisandro Dalcin 
5795117d392SLisandro Dalcin    Input Parameter:
5805117d392SLisandro Dalcin .  v - the number
5815117d392SLisandro Dalcin 
58287497f52SBarry Smith    Note:
58387497f52SBarry Smith    The type can be integer or real floating point value, but cannot be complex
5845117d392SLisandro Dalcin 
5855117d392SLisandro Dalcin    Level: beginner
5865117d392SLisandro Dalcin 
587db781477SPatrick Sanan .seealso: `PetscAbsInt()`, `PetscAbsReal()`, `PetscAbsScalar()`
5885117d392SLisandro Dalcin 
5895117d392SLisandro Dalcin M*/
5905117d392SLisandro Dalcin #define PetscAbs(a) (((a) >= 0) ? (a) : (-(a)))
5915117d392SLisandro Dalcin 
5925117d392SLisandro Dalcin /*MC
5935117d392SLisandro Dalcin    PetscSign - Returns the sign of a number as an integer
5945117d392SLisandro Dalcin 
5955117d392SLisandro Dalcin    Synopsis:
5965117d392SLisandro Dalcin    #include <petscmath.h>
5975117d392SLisandro Dalcin    int PetscSign(type v)
5985117d392SLisandro Dalcin 
5995117d392SLisandro Dalcin    Not Collective
6005117d392SLisandro Dalcin 
6015117d392SLisandro Dalcin    Input Parameter:
6025117d392SLisandro Dalcin .  v - the number
6035117d392SLisandro Dalcin 
60487497f52SBarry Smith    Note:
60587497f52SBarry Smith    The type can be integer or real floating point value
6065117d392SLisandro Dalcin 
6075117d392SLisandro Dalcin    Level: beginner
6085117d392SLisandro Dalcin 
6095117d392SLisandro Dalcin M*/
6105117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
611e489efc1SBarry Smith 
612b6a5bde7SBarry Smith /*MC
613b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
614b6a5bde7SBarry Smith 
615eca87e8dSBarry Smith    Synopsis:
616aaa7dc30SBarry Smith    #include <petscmath.h>
617eca87e8dSBarry Smith    type PetscMin(type v1,type v2)
618eca87e8dSBarry Smith 
619eca87e8dSBarry Smith    Not Collective
620eca87e8dSBarry Smith 
621d8d19677SJose E. Roman    Input Parameters:
622b6a5bde7SBarry Smith +  v1 - first value to find minimum of
623b6a5bde7SBarry Smith -  v2 - second value to find minimum of
624b6a5bde7SBarry Smith 
62587497f52SBarry Smith    Note:
62687497f52SBarry Smith    The type can be integer or floating point value
627b6a5bde7SBarry Smith 
628b6a5bde7SBarry Smith    Level: beginner
629b6a5bde7SBarry Smith 
630db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
631b6a5bde7SBarry Smith 
632b6a5bde7SBarry Smith M*/
633e489efc1SBarry Smith #define PetscMin(a, b) (((a) < (b)) ? (a) : (b))
634b6a5bde7SBarry Smith 
635b6a5bde7SBarry Smith /*MC
636b6a5bde7SBarry Smith    PetscMax - Returns maxium of two numbers
637b6a5bde7SBarry Smith 
638eca87e8dSBarry Smith    Synopsis:
639aaa7dc30SBarry Smith    #include <petscmath.h>
640eca87e8dSBarry Smith    type max PetscMax(type v1,type v2)
641eca87e8dSBarry Smith 
642eca87e8dSBarry Smith    Not Collective
643eca87e8dSBarry Smith 
644d8d19677SJose E. Roman    Input Parameters:
645b6a5bde7SBarry Smith +  v1 - first value to find maximum of
646b6a5bde7SBarry Smith -  v2 - second value to find maximum of
647b6a5bde7SBarry Smith 
64887497f52SBarry Smith    Note:
64987497f52SBarry Smith    The type can be integer or floating point value
650b6a5bde7SBarry Smith 
651b6a5bde7SBarry Smith    Level: beginner
652b6a5bde7SBarry Smith 
653db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
654b6a5bde7SBarry Smith 
655b6a5bde7SBarry Smith M*/
656e489efc1SBarry Smith #define PetscMax(a, b) (((a) < (b)) ? (b) : (a))
657b6a5bde7SBarry Smith 
658b6a5bde7SBarry Smith /*MC
659d9a4bb16SJed Brown    PetscClipInterval - Returns a number clipped to be within an interval
660d9a4bb16SJed Brown 
661d9a4bb16SJed Brown    Synopsis:
662aaa7dc30SBarry Smith    #include <petscmath.h>
663d9a4bb16SJed Brown    type clip PetscClipInterval(type x,type a,type b)
664d9a4bb16SJed Brown 
665d9a4bb16SJed Brown    Not Collective
666d9a4bb16SJed Brown 
667d8d19677SJose E. Roman    Input Parameters:
6680d398bfeSStefano Zampini +  x - value to use if within interval [a,b]
669d9a4bb16SJed Brown .  a - lower end of interval
670d9a4bb16SJed Brown -  b - upper end of interval
671d9a4bb16SJed Brown 
67287497f52SBarry Smith    Note:
67387497f52SBarry Smith    The type can be integer or floating point value
674d9a4bb16SJed Brown 
675d9a4bb16SJed Brown    Level: beginner
676d9a4bb16SJed Brown 
677db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscMax()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
678d9a4bb16SJed Brown 
679d9a4bb16SJed Brown M*/
680d9a4bb16SJed Brown #define PetscClipInterval(x, a, b) (PetscMax((a), PetscMin((x), (b))))
681d9a4bb16SJed Brown 
682d9a4bb16SJed Brown /*MC
683b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
684b6a5bde7SBarry Smith 
685b6a5bde7SBarry Smith    Synopsis:
686aaa7dc30SBarry Smith    #include <petscmath.h>
687b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
688b6a5bde7SBarry Smith 
689eca87e8dSBarry Smith    Input Parameter:
690eca87e8dSBarry Smith .   v1 - the integer
691b6a5bde7SBarry Smith 
692b6a5bde7SBarry Smith    Level: beginner
693b6a5bde7SBarry Smith 
694db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsReal()`, `PetscSqr()`
695b6a5bde7SBarry Smith 
696b6a5bde7SBarry Smith M*/
6979fa7d148SSatish Balay #define PetscAbsInt(a) (((a) < 0) ? (-(a)) : (a))
698b6a5bde7SBarry Smith 
699b6a5bde7SBarry Smith /*MC
700b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
701b6a5bde7SBarry Smith 
702eca87e8dSBarry Smith    Synopsis:
703aaa7dc30SBarry Smith    #include <petscmath.h>
704eca87e8dSBarry Smith    Real abs PetscAbsReal(PetscReal v1)
705eca87e8dSBarry Smith 
706b6a5bde7SBarry Smith    Input Parameter:
707b6a5bde7SBarry Smith .   v1 - the double
708b6a5bde7SBarry Smith 
709b6a5bde7SBarry Smith    Level: beginner
710b6a5bde7SBarry Smith 
711db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscSqr()`
712b6a5bde7SBarry Smith 
713b6a5bde7SBarry Smith M*/
7141118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
7151118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
7161118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7171118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a)
7181118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
7191118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a)
7201118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7211118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
7221118d4bcSLisandro Dalcin #endif
723b6a5bde7SBarry Smith 
724b6a5bde7SBarry Smith /*MC
725b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
726b6a5bde7SBarry Smith 
727b6a5bde7SBarry Smith    Synopsis:
728aaa7dc30SBarry Smith    #include <petscmath.h>
729b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
730b6a5bde7SBarry Smith 
731eca87e8dSBarry Smith    Not Collective
732eca87e8dSBarry Smith 
733eca87e8dSBarry Smith    Input Parameter:
734eca87e8dSBarry Smith .   v1 - the value
735eca87e8dSBarry Smith 
73687497f52SBarry Smith    Note:
73787497f52SBarry Smith    The type can be integer or floating point value
738b6a5bde7SBarry Smith 
739b6a5bde7SBarry Smith    Level: beginner
740b6a5bde7SBarry Smith 
741db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`
742b6a5bde7SBarry Smith 
743b6a5bde7SBarry Smith M*/
7444ebda54eSMatthew Knepley #define PetscSqr(a) ((a) * (a))
745e489efc1SBarry Smith 
746314da920SBarry Smith /* ----------------------------------------------------------------------------*/
747ee223c85SLisandro Dalcin 
748ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
749ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F
7505117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7515117d392SLisandro Dalcin #define PetscRealConstant(constant) constant
752ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
753ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q
7545117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7555117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F
756ee223c85SLisandro Dalcin #endif
757ee223c85SLisandro Dalcin 
758314da920SBarry Smith /*
759d34fcf5fSBarry Smith      Basic constants
760314da920SBarry Smith */
7612fab75feSLisandro Dalcin #define PETSC_PI    PetscRealConstant(3.1415926535897932384626433832795029)
7622fab75feSLisandro Dalcin #define PETSC_PHI   PetscRealConstant(1.6180339887498948482045868343656381)
7637b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981)
764d34fcf5fSBarry Smith 
765ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES)
76671fd2e92SBarry Smith #define PETSC_MAX_INT 2147483647
767ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1)
768ab824b78SBarry Smith #else
769ab824b78SBarry Smith #define PETSC_MAX_INT 9223372036854775807L
770ab824b78SBarry Smith #define PETSC_MIN_INT (-PETSC_MAX_INT - 1)
771ab824b78SBarry Smith #endif
772569ea7c4SPierre Jolivet #define PETSC_MAX_UINT16 65535
773e489efc1SBarry Smith 
774ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
775ab824b78SBarry Smith #define PETSC_MAX_REAL             3.40282346638528860e+38F
7769fa7d148SSatish Balay #define PETSC_MIN_REAL             (-PETSC_MAX_REAL)
77782a7e548SBarry Smith #define PETSC_MACHINE_EPSILON      1.19209290e-07F
77882a7e548SBarry Smith #define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F
779ee223c85SLisandro Dalcin #define PETSC_SMALL                1.e-5F
780ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
781ab824b78SBarry Smith #define PETSC_MAX_REAL             1.7976931348623157e+308
7829fa7d148SSatish Balay #define PETSC_MIN_REAL             (-PETSC_MAX_REAL)
78382a7e548SBarry Smith #define PETSC_MACHINE_EPSILON      2.2204460492503131e-16
78482a7e548SBarry Smith #define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08
785cf6e855fSSatish Balay #define PETSC_SMALL                1.e-10
786ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128)
787ea345e14SBarry Smith #define PETSC_MAX_REAL             FLT128_MAX
7889fa7d148SSatish Balay #define PETSC_MIN_REAL             (-FLT128_MAX)
789d34fcf5fSBarry Smith #define PETSC_MACHINE_EPSILON      FLT128_EPSILON
790ee223c85SLisandro Dalcin #define PETSC_SQRT_MACHINE_EPSILON 1.38777878078144567552953958511352539e-17Q
791ee223c85SLisandro Dalcin #define PETSC_SMALL                1.e-20Q
7925117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7935117d392SLisandro Dalcin #define PETSC_MAX_REAL             65504.0F
7949fa7d148SSatish Balay #define PETSC_MIN_REAL             (-PETSC_MAX_REAL)
7955117d392SLisandro Dalcin #define PETSC_MACHINE_EPSILON      .0009765625F
7965117d392SLisandro Dalcin #define PETSC_SQRT_MACHINE_EPSILON .03125F
7975117d392SLisandro Dalcin #define PETSC_SMALL                5.e-3F
7989cf09972SJed Brown #endif
7993e523bebSBarry Smith 
80025d0f998SSatish Balay #define PETSC_INFINITY  (PETSC_MAX_REAL / 4)
8019fa7d148SSatish Balay #define PETSC_NINFINITY (-PETSC_INFINITY)
802e270355aSBarry Smith 
8039f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool  PetscIsInfReal(PetscReal);
8043948c36eSLisandro Dalcin PETSC_EXTERN PetscBool  PetscIsNanReal(PetscReal);
8058b49ba18SBarry Smith PETSC_EXTERN PetscBool  PetscIsNormalReal(PetscReal);
8069371c9d4SSatish Balay static inline PetscBool PetscIsInfOrNanReal(PetscReal v) {
8079371c9d4SSatish Balay   return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;
8089371c9d4SSatish Balay }
8099371c9d4SSatish Balay static inline PetscBool PetscIsInfScalar(PetscScalar v) {
8109371c9d4SSatish Balay   return PetscIsInfReal(PetscAbsScalar(v));
8119371c9d4SSatish Balay }
8129371c9d4SSatish Balay static inline PetscBool PetscIsNanScalar(PetscScalar v) {
8139371c9d4SSatish Balay   return PetscIsNanReal(PetscAbsScalar(v));
8149371c9d4SSatish Balay }
8159371c9d4SSatish Balay static inline PetscBool PetscIsInfOrNanScalar(PetscScalar v) {
8169371c9d4SSatish Balay   return PetscIsInfOrNanReal(PetscAbsScalar(v));
8179371c9d4SSatish Balay }
8189371c9d4SSatish Balay static inline PetscBool PetscIsNormalScalar(PetscScalar v) {
8199371c9d4SSatish Balay   return PetscIsNormalReal(PetscAbsScalar(v));
8209371c9d4SSatish Balay }
8219a25a3ccSBarry Smith 
822b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal, PetscReal, PetscReal, PetscReal);
823ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal, PetscReal);
824ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar, PetscScalar);
825ce4818fdSLisandro Dalcin 
82698725619SBarry Smith /*
82798725619SBarry Smith     These macros are currently hardwired to match the regular data types, so there is no support for a different
82898725619SBarry Smith     MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again.
82998725619SBarry Smith  */
83098725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR
83198725619SBarry Smith typedef PetscScalar MatScalar;
83298725619SBarry Smith typedef PetscReal   MatReal;
83398725619SBarry Smith 
8349371c9d4SSatish Balay struct petsc_mpiu_2scalar {
8359371c9d4SSatish Balay   PetscScalar a, b;
8369371c9d4SSatish Balay };
83793d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_2scalar);
838df4397b0SStefano Zampini 
83993d501b3SJacob Faibussowitsch /* MPI Datatypes for composite reductions */
84093d501b3SJacob Faibussowitsch struct petsc_mpiu_real_int {
84193d501b3SJacob Faibussowitsch   PetscReal v;
84293d501b3SJacob Faibussowitsch   PetscInt  i;
84393d501b3SJacob Faibussowitsch };
84493d501b3SJacob Faibussowitsch 
84593d501b3SJacob Faibussowitsch struct petsc_mpiu_scalar_int {
84693d501b3SJacob Faibussowitsch   PetscScalar v;
84793d501b3SJacob Faibussowitsch   PetscInt    i;
84893d501b3SJacob Faibussowitsch };
84993d501b3SJacob Faibussowitsch 
85093d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_REAL_INT   PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_real_int);
85193d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_scalar_int);
852092991acSStefano Zampini 
853a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES)
85493d501b3SJacob Faibussowitsch struct /* __attribute__((packed, aligned(alignof(PetscInt *)))) */ petsc_mpiu_2int {
85593d501b3SJacob Faibussowitsch   PetscInt a;
85693d501b3SJacob Faibussowitsch   PetscInt b;
8579371c9d4SSatish Balay };
85893d501b3SJacob Faibussowitsch /*
85993d501b3SJacob Faibussowitsch  static_assert(sizeof(struct petsc_mpiu_2int) == 2 * sizeof(PetscInt), "");
86093d501b3SJacob Faibussowitsch  static_assert(alignof(struct petsc_mpiu_2int) == alignof(PetscInt *), "");
86193d501b3SJacob Faibussowitsch  static_assert(alignof(struct petsc_mpiu_2int) == alignof(PetscInt[2]), "");
86293d501b3SJacob Faibussowitsch 
86393d501b3SJacob Faibussowitsch  clang generates warnings that petsc_mpiu_2int is not layout compatible with PetscInt[2] or
86493d501b3SJacob Faibussowitsch  PetscInt *, even though (with everything else uncommented) both of the static_asserts above
86593d501b3SJacob Faibussowitsch  pass! So we just comment it out...
86693d501b3SJacob Faibussowitsch */
86793d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_2INT /* PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_2int) */;
8688ad47952SJed Brown #else
8698ad47952SJed Brown #define MPIU_2INT MPI_2INT
8708ad47952SJed Brown #endif
871b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPI_4INT;
872b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPIU_4INT;
873e9fa29b7SSatish Balay 
8749371c9d4SSatish Balay static inline PetscInt PetscPowInt(PetscInt base, PetscInt power) {
875fa711258SJed Brown   PetscInt result = 1;
876fa711258SJed Brown   while (power) {
877fa711258SJed Brown     if (power & 1) result *= base;
878fa711258SJed Brown     power >>= 1;
879fa711258SJed Brown     base *= base;
880fa711258SJed Brown   }
881fa711258SJed Brown   return result;
882fa711258SJed Brown }
883b2fb0278SBarry Smith 
8849371c9d4SSatish Balay static inline PetscInt64 PetscPowInt64(PetscInt base, PetscInt power) {
885ad70a4c3SStefano Zampini   PetscInt64 result = 1;
886ad70a4c3SStefano Zampini   while (power) {
887ad70a4c3SStefano Zampini     if (power & 1) result *= base;
888ad70a4c3SStefano Zampini     power >>= 1;
889ad70a4c3SStefano Zampini     base *= base;
890ad70a4c3SStefano Zampini   }
891ad70a4c3SStefano Zampini   return result;
892ad70a4c3SStefano Zampini }
893ad70a4c3SStefano Zampini 
8949371c9d4SSatish Balay static inline PetscReal PetscPowRealInt(PetscReal base, PetscInt power) {
895fa711258SJed Brown   PetscReal result = 1;
896d98d5da7SBarry Smith   if (power < 0) {
897d98d5da7SBarry Smith     power = -power;
89810d40e53SLisandro Dalcin     base  = ((PetscReal)1) / base;
899d98d5da7SBarry Smith   }
900fa711258SJed Brown   while (power) {
901fa711258SJed Brown     if (power & 1) result *= base;
902fa711258SJed Brown     power >>= 1;
903fa711258SJed Brown     base *= base;
904fa711258SJed Brown   }
905fa711258SJed Brown   return result;
906fa711258SJed Brown }
907fa711258SJed Brown 
9089371c9d4SSatish Balay static inline PetscScalar PetscPowScalarInt(PetscScalar base, PetscInt power) {
9095117d392SLisandro Dalcin   PetscScalar result = (PetscReal)1;
9108b49ba18SBarry Smith   if (power < 0) {
9118b49ba18SBarry Smith     power = -power;
91210d40e53SLisandro Dalcin     base  = ((PetscReal)1) / base;
9138b49ba18SBarry Smith   }
9148b49ba18SBarry Smith   while (power) {
9158b49ba18SBarry Smith     if (power & 1) result *= base;
9168b49ba18SBarry Smith     power >>= 1;
9178b49ba18SBarry Smith     base *= base;
9188b49ba18SBarry Smith   }
9198b49ba18SBarry Smith   return result;
9208b49ba18SBarry Smith }
9218b49ba18SBarry Smith 
9229371c9d4SSatish Balay static inline PetscScalar PetscPowScalarReal(PetscScalar base, PetscReal power) {
923b2fb0278SBarry Smith   PetscScalar cpower = power;
924b2fb0278SBarry Smith   return PetscPowScalar(base, cpower);
925b2fb0278SBarry Smith }
92678a59e97SMatthew G. Knepley 
927c803a25aSBarry Smith /*MC
92866baab88SBarry Smith     PetscApproximateLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers
929c803a25aSBarry Smith 
930c803a25aSBarry Smith    Synopsis:
931c803a25aSBarry Smith    #include <petscmath.h>
93266baab88SBarry Smith    bool PetscApproximateLTE(PetscReal x,constant float)
933c803a25aSBarry Smith 
934c803a25aSBarry Smith    Not Collective
935c803a25aSBarry Smith 
936c803a25aSBarry Smith    Input Parameters:
937c803a25aSBarry Smith +   x - the variable
938c803a25aSBarry Smith -   b - the constant float it is checking if x is less than or equal to
939c803a25aSBarry Smith 
940c803a25aSBarry Smith    Notes:
94187497f52SBarry Smith      The fudge factor is the value `PETSC_SMALL`
942c803a25aSBarry Smith 
943c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
944c803a25aSBarry Smith 
945c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
946c803a25aSBarry Smith      floating point results.
947c803a25aSBarry Smith 
948c803a25aSBarry Smith    Level: advanced
949c803a25aSBarry Smith 
950db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateGTE()`
951c803a25aSBarry Smith 
952c803a25aSBarry Smith M*/
95366baab88SBarry Smith #define PetscApproximateLTE(x, b) ((x) <= (PetscRealConstant(b) + PETSC_SMALL))
954c803a25aSBarry Smith 
955c803a25aSBarry Smith /*MC
95666baab88SBarry Smith     PetscApproximateGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers
957c803a25aSBarry Smith 
958c803a25aSBarry Smith    Synopsis:
959c803a25aSBarry Smith    #include <petscmath.h>
96066baab88SBarry Smith    bool PetscApproximateGTE(PetscReal x,constant float)
961c803a25aSBarry Smith 
962c803a25aSBarry Smith    Not Collective
963c803a25aSBarry Smith 
964c803a25aSBarry Smith    Input Parameters:
965c803a25aSBarry Smith +   x - the variable
966c803a25aSBarry Smith -   b - the constant float it is checking if x is greater than or equal to
967c803a25aSBarry Smith 
968c803a25aSBarry Smith    Notes:
96987497f52SBarry Smith      The fudge factor is the value `PETSC_SMALL`
970c803a25aSBarry Smith 
971c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
972c803a25aSBarry Smith 
973c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
974c803a25aSBarry Smith      floating point results.
975c803a25aSBarry Smith 
976c803a25aSBarry Smith    Level: advanced
977c803a25aSBarry Smith 
978db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()`
979c803a25aSBarry Smith 
980c803a25aSBarry Smith M*/
98166baab88SBarry Smith #define PetscApproximateGTE(x, b) ((x) >= (PetscRealConstant(b) - PETSC_SMALL))
982c803a25aSBarry Smith 
983faa75363SBarry Smith /*MC
984faa75363SBarry Smith     PetscCeilInt - Returns the ceiling of the quotation of two positive integers
985faa75363SBarry Smith 
986faa75363SBarry Smith    Synopsis:
987faa75363SBarry Smith    #include <petscmath.h>
988faa75363SBarry Smith    PetscInt PetscCeilInt(PetscInt x,PetscInt y)
989faa75363SBarry Smith 
990faa75363SBarry Smith    Not Collective
991faa75363SBarry Smith 
992faa75363SBarry Smith    Input Parameters:
993faa75363SBarry Smith +   x - the numerator
994faa75363SBarry Smith -   y - the denominator
995faa75363SBarry Smith 
996faa75363SBarry Smith    Level: advanced
997faa75363SBarry Smith 
998db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()`
999faa75363SBarry Smith 
1000faa75363SBarry Smith M*/
1001faa75363SBarry Smith #define PetscCeilInt(x, y) ((((PetscInt)(x)) / ((PetscInt)(y))) + ((((PetscInt)(x)) % ((PetscInt)(y))) ? 1 : 0))
1002faa75363SBarry Smith 
1003faa75363SBarry Smith #define PetscCeilInt64(x, y) ((((PetscInt64)(x)) / ((PetscInt64)(y))) + ((((PetscInt64)(x)) % ((PetscInt64)(y))) ? 1 : 0))
1004faa75363SBarry Smith 
1005bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt, const PetscReal[], const PetscReal[], PetscReal *, PetscReal *);
1006e489efc1SBarry Smith #endif
1007