xref: /petsc/include/petscmath.h (revision d5b43468fb8780a8feea140ccd6fa3e6a50411cc)
1e489efc1SBarry Smith /*
2314da920SBarry Smith 
3314da920SBarry Smith     PETSc mathematics include file. Defines certain basic mathematical
4a5057860SBarry Smith     constants and functions for working with single, double, and quad precision
5a5057860SBarry Smith     floating point numbers as well as complex single and double.
6314da920SBarry Smith 
7d382aafbSBarry Smith     This file is included by petscsys.h and should not be used directly.
8e7029fe1SSatish Balay 
9e489efc1SBarry Smith */
106524c165SJacob Faibussowitsch #ifndef PETSCMATH_H
1126bd1501SBarry Smith #define PETSCMATH_H
12ac09b921SBarry Smith 
130a5f7794SBarry Smith #include <math.h>
1493d501b3SJacob Faibussowitsch #include <petscmacros.h>
15df4397b0SStefano Zampini #include <petscsystypes.h>
16df4397b0SStefano Zampini 
17ac09b921SBarry Smith /* SUBMANSEC = Sys */
18ac09b921SBarry Smith 
195117d392SLisandro Dalcin /*
205117d392SLisandro Dalcin 
215117d392SLisandro Dalcin    Defines operations that are different for complex and real numbers.
225117d392SLisandro Dalcin    All PETSc objects in one program are built around the object
235117d392SLisandro Dalcin    PetscScalar which is either always a real or a complex.
245117d392SLisandro Dalcin 
255117d392SLisandro Dalcin */
265117d392SLisandro Dalcin 
275117d392SLisandro Dalcin /*
285117d392SLisandro Dalcin     Real number definitions
295117d392SLisandro Dalcin  */
305117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
315117d392SLisandro Dalcin   #define PetscSqrtReal(a)        sqrtf(a)
325117d392SLisandro Dalcin   #define PetscCbrtReal(a)        cbrtf(a)
335117d392SLisandro Dalcin   #define PetscHypotReal(a, b)    hypotf(a, b)
345117d392SLisandro Dalcin   #define PetscAtan2Real(a, b)    atan2f(a, b)
355117d392SLisandro Dalcin   #define PetscPowReal(a, b)      powf(a, b)
365117d392SLisandro Dalcin   #define PetscExpReal(a)         expf(a)
375117d392SLisandro Dalcin   #define PetscLogReal(a)         logf(a)
385117d392SLisandro Dalcin   #define PetscLog10Real(a)       log10f(a)
395117d392SLisandro Dalcin   #define PetscLog2Real(a)        log2f(a)
405117d392SLisandro Dalcin   #define PetscSinReal(a)         sinf(a)
415117d392SLisandro Dalcin   #define PetscCosReal(a)         cosf(a)
425117d392SLisandro Dalcin   #define PetscTanReal(a)         tanf(a)
435117d392SLisandro Dalcin   #define PetscAsinReal(a)        asinf(a)
445117d392SLisandro Dalcin   #define PetscAcosReal(a)        acosf(a)
455117d392SLisandro Dalcin   #define PetscAtanReal(a)        atanf(a)
465117d392SLisandro Dalcin   #define PetscSinhReal(a)        sinhf(a)
475117d392SLisandro Dalcin   #define PetscCoshReal(a)        coshf(a)
485117d392SLisandro Dalcin   #define PetscTanhReal(a)        tanhf(a)
495117d392SLisandro Dalcin   #define PetscAsinhReal(a)       asinhf(a)
505117d392SLisandro Dalcin   #define PetscAcoshReal(a)       acoshf(a)
515117d392SLisandro Dalcin   #define PetscAtanhReal(a)       atanhf(a)
52d6685f55SMatthew G. Knepley   #define PetscErfReal(a)         erff(a)
535117d392SLisandro Dalcin   #define PetscCeilReal(a)        ceilf(a)
545117d392SLisandro Dalcin   #define PetscFloorReal(a)       floorf(a)
555117d392SLisandro Dalcin   #define PetscFmodReal(a, b)     fmodf(a, b)
569c3ee494SJed Brown   #define PetscCopysignReal(a, b) copysignf(a, b)
575117d392SLisandro Dalcin   #define PetscTGamma(a)          tgammaf(a)
581f17fa70SToby Isaac   #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
591f17fa70SToby Isaac     #define PetscLGamma(a) gammaf(a)
601f17fa70SToby Isaac   #else
611f17fa70SToby Isaac     #define PetscLGamma(a) lgammaf(a)
621f17fa70SToby Isaac   #endif
635117d392SLisandro Dalcin 
645117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
655117d392SLisandro Dalcin   #define PetscSqrtReal(a)        sqrt(a)
665117d392SLisandro Dalcin   #define PetscCbrtReal(a)        cbrt(a)
675117d392SLisandro Dalcin   #define PetscHypotReal(a, b)    hypot(a, b)
685117d392SLisandro Dalcin   #define PetscAtan2Real(a, b)    atan2(a, b)
695117d392SLisandro Dalcin   #define PetscPowReal(a, b)      pow(a, b)
705117d392SLisandro Dalcin   #define PetscExpReal(a)         exp(a)
715117d392SLisandro Dalcin   #define PetscLogReal(a)         log(a)
725117d392SLisandro Dalcin   #define PetscLog10Real(a)       log10(a)
735117d392SLisandro Dalcin   #define PetscLog2Real(a)        log2(a)
745117d392SLisandro Dalcin   #define PetscSinReal(a)         sin(a)
755117d392SLisandro Dalcin   #define PetscCosReal(a)         cos(a)
765117d392SLisandro Dalcin   #define PetscTanReal(a)         tan(a)
775117d392SLisandro Dalcin   #define PetscAsinReal(a)        asin(a)
785117d392SLisandro Dalcin   #define PetscAcosReal(a)        acos(a)
795117d392SLisandro Dalcin   #define PetscAtanReal(a)        atan(a)
805117d392SLisandro Dalcin   #define PetscSinhReal(a)        sinh(a)
815117d392SLisandro Dalcin   #define PetscCoshReal(a)        cosh(a)
825117d392SLisandro Dalcin   #define PetscTanhReal(a)        tanh(a)
835117d392SLisandro Dalcin   #define PetscAsinhReal(a)       asinh(a)
845117d392SLisandro Dalcin   #define PetscAcoshReal(a)       acosh(a)
855117d392SLisandro Dalcin   #define PetscAtanhReal(a)       atanh(a)
86d6685f55SMatthew G. Knepley   #define PetscErfReal(a)         erf(a)
875117d392SLisandro Dalcin   #define PetscCeilReal(a)        ceil(a)
885117d392SLisandro Dalcin   #define PetscFloorReal(a)       floor(a)
895117d392SLisandro Dalcin   #define PetscFmodReal(a, b)     fmod(a, b)
909c3ee494SJed Brown   #define PetscCopysignReal(a, b) copysign(a, b)
915117d392SLisandro Dalcin   #define PetscTGamma(a)          tgamma(a)
921f17fa70SToby Isaac   #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
931f17fa70SToby Isaac     #define PetscLGamma(a) gamma(a)
941f17fa70SToby Isaac   #else
951f17fa70SToby Isaac     #define PetscLGamma(a) lgamma(a)
961f17fa70SToby Isaac   #endif
975117d392SLisandro Dalcin 
985117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
995117d392SLisandro Dalcin   #define PetscSqrtReal(a)        sqrtq(a)
1005117d392SLisandro Dalcin   #define PetscCbrtReal(a)        cbrtq(a)
1015117d392SLisandro Dalcin   #define PetscHypotReal(a, b)    hypotq(a, b)
1025117d392SLisandro Dalcin   #define PetscAtan2Real(a, b)    atan2q(a, b)
1035117d392SLisandro Dalcin   #define PetscPowReal(a, b)      powq(a, b)
1045117d392SLisandro Dalcin   #define PetscExpReal(a)         expq(a)
1055117d392SLisandro Dalcin   #define PetscLogReal(a)         logq(a)
1065117d392SLisandro Dalcin   #define PetscLog10Real(a)       log10q(a)
1075117d392SLisandro Dalcin   #define PetscLog2Real(a)        log2q(a)
1085117d392SLisandro Dalcin   #define PetscSinReal(a)         sinq(a)
1095117d392SLisandro Dalcin   #define PetscCosReal(a)         cosq(a)
1105117d392SLisandro Dalcin   #define PetscTanReal(a)         tanq(a)
1115117d392SLisandro Dalcin   #define PetscAsinReal(a)        asinq(a)
1125117d392SLisandro Dalcin   #define PetscAcosReal(a)        acosq(a)
1135117d392SLisandro Dalcin   #define PetscAtanReal(a)        atanq(a)
1145117d392SLisandro Dalcin   #define PetscSinhReal(a)        sinhq(a)
1155117d392SLisandro Dalcin   #define PetscCoshReal(a)        coshq(a)
1165117d392SLisandro Dalcin   #define PetscTanhReal(a)        tanhq(a)
1175117d392SLisandro Dalcin   #define PetscAsinhReal(a)       asinhq(a)
1185117d392SLisandro Dalcin   #define PetscAcoshReal(a)       acoshq(a)
1195117d392SLisandro Dalcin   #define PetscAtanhReal(a)       atanhq(a)
120d6685f55SMatthew G. Knepley   #define PetscErfReal(a)         erfq(a)
1215117d392SLisandro Dalcin   #define PetscCeilReal(a)        ceilq(a)
1225117d392SLisandro Dalcin   #define PetscFloorReal(a)       floorq(a)
1235117d392SLisandro Dalcin   #define PetscFmodReal(a, b)     fmodq(a, b)
1249c3ee494SJed Brown   #define PetscCopysignReal(a, b) copysignq(a, b)
1255117d392SLisandro Dalcin   #define PetscTGamma(a)          tgammaq(a)
1261f17fa70SToby Isaac   #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1271f17fa70SToby Isaac     #define PetscLGamma(a) gammaq(a)
1281f17fa70SToby Isaac   #else
1291f17fa70SToby Isaac     #define PetscLGamma(a) lgammaq(a)
1301f17fa70SToby Isaac   #endif
1315117d392SLisandro Dalcin 
1325117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
1335117d392SLisandro Dalcin   #define PetscSqrtReal(a)        sqrtf(a)
1345117d392SLisandro Dalcin   #define PetscCbrtReal(a)        cbrtf(a)
1355117d392SLisandro Dalcin   #define PetscHypotReal(a, b)    hypotf(a, b)
1365117d392SLisandro Dalcin   #define PetscAtan2Real(a, b)    atan2f(a, b)
1375117d392SLisandro Dalcin   #define PetscPowReal(a, b)      powf(a, b)
1385117d392SLisandro Dalcin   #define PetscExpReal(a)         expf(a)
1395117d392SLisandro Dalcin   #define PetscLogReal(a)         logf(a)
1405117d392SLisandro Dalcin   #define PetscLog10Real(a)       log10f(a)
1415117d392SLisandro Dalcin   #define PetscLog2Real(a)        log2f(a)
1425117d392SLisandro Dalcin   #define PetscSinReal(a)         sinf(a)
1435117d392SLisandro Dalcin   #define PetscCosReal(a)         cosf(a)
1445117d392SLisandro Dalcin   #define PetscTanReal(a)         tanf(a)
1455117d392SLisandro Dalcin   #define PetscAsinReal(a)        asinf(a)
1465117d392SLisandro Dalcin   #define PetscAcosReal(a)        acosf(a)
1475117d392SLisandro Dalcin   #define PetscAtanReal(a)        atanf(a)
1485117d392SLisandro Dalcin   #define PetscSinhReal(a)        sinhf(a)
1495117d392SLisandro Dalcin   #define PetscCoshReal(a)        coshf(a)
1505117d392SLisandro Dalcin   #define PetscTanhReal(a)        tanhf(a)
1515117d392SLisandro Dalcin   #define PetscAsinhReal(a)       asinhf(a)
1525117d392SLisandro Dalcin   #define PetscAcoshReal(a)       acoshf(a)
1535117d392SLisandro Dalcin   #define PetscAtanhReal(a)       atanhf(a)
154d6685f55SMatthew G. Knepley   #define PetscErfReal(a)         erff(a)
1555117d392SLisandro Dalcin   #define PetscCeilReal(a)        ceilf(a)
1565117d392SLisandro Dalcin   #define PetscFloorReal(a)       floorf(a)
1575117d392SLisandro Dalcin   #define PetscFmodReal(a, b)     fmodf(a, b)
1589c3ee494SJed Brown   #define PetscCopySignReal(a, b) copysignf(a, b)
1595117d392SLisandro Dalcin   #define PetscTGamma(a)          tgammaf(a)
1601f17fa70SToby Isaac   #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1611f17fa70SToby Isaac     #define PetscLGamma(a) gammaf(a)
1621f17fa70SToby Isaac   #else
1631f17fa70SToby Isaac     #define PetscLGamma(a) lgammaf(a)
1641f17fa70SToby Isaac   #endif
1655117d392SLisandro Dalcin 
1665117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
1675117d392SLisandro Dalcin 
168d71ae5a4SJacob Faibussowitsch static inline PetscReal PetscSignReal(PetscReal a)
169d71ae5a4SJacob Faibussowitsch {
1705117d392SLisandro Dalcin   return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0));
1715117d392SLisandro Dalcin }
1725117d392SLisandro Dalcin 
1735117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2)
1745117d392SLisandro Dalcin   #undef PetscLog2Real
175d71ae5a4SJacob Faibussowitsch static inline PetscReal PetscLog2Real(PetscReal a)
176d71ae5a4SJacob Faibussowitsch {
1775117d392SLisandro Dalcin   return PetscLogReal(a) / PetscLogReal((PetscReal)2);
1785117d392SLisandro Dalcin }
1795117d392SLisandro Dalcin #endif
1805117d392SLisandro Dalcin 
181613bf2b2SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128)
18293d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PETSC_ATTRIBUTE_MPI_TYPE_TAG(__float128);
1835117d392SLisandro Dalcin #endif
1849e517322SPierre Jolivet #if defined(PETSC_HAVE_REAL___FP16)
18593d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___FP16 PETSC_ATTRIBUTE_MPI_TYPE_TAG(__fp16);
1865117d392SLisandro Dalcin #endif
1875117d392SLisandro Dalcin 
188df4397b0SStefano Zampini /*MC
18987497f52SBarry Smith    MPIU_REAL - Portable MPI datatype corresponding to `PetscReal` independent of what precision `PetscReal` is in
190df4397b0SStefano Zampini 
191df4397b0SStefano Zampini    Notes:
19287497f52SBarry Smith    In MPI calls that require an MPI datatype that matches a `PetscReal` or array of `PetscReal` values, pass this value.
193df4397b0SStefano Zampini 
194df4397b0SStefano Zampini    Level: beginner
195df4397b0SStefano Zampini 
196db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`
197df4397b0SStefano Zampini M*/
198c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE)
199c1d390e3SJed Brown   #define MPIU_REAL MPI_FLOAT
200c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE)
201c1d390e3SJed Brown   #define MPIU_REAL MPI_DOUBLE
202c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128)
203c1d390e3SJed Brown   #define MPIU_REAL MPIU___FLOAT128
204570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
205570b7f6dSBarry Smith   #define MPIU_REAL MPIU___FP16
206c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */
20759cb5930SBarry Smith 
2081093a601SBarry Smith /*
2091093a601SBarry Smith     Complex number definitions
2101093a601SBarry Smith  */
211df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX)
212450fc7c9SSatish Balay   #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128)
2131093a601SBarry Smith     /* C++ support of complex number */
214b7940d39SSatish Balay 
21550f81f78SJed Brown     #define PetscRealPartComplex(a)      (a).real()
21650f81f78SJed Brown     #define PetscImaginaryPartComplex(a) (a).imag()
217df4397b0SStefano Zampini     #define PetscAbsComplex(a)           petsccomplexlib::abs(a)
2185117d392SLisandro Dalcin     #define PetscArgComplex(a)           petsccomplexlib::arg(a)
219df4397b0SStefano Zampini     #define PetscConjComplex(a)          petsccomplexlib::conj(a)
220df4397b0SStefano Zampini     #define PetscSqrtComplex(a)          petsccomplexlib::sqrt(a)
221df4397b0SStefano Zampini     #define PetscPowComplex(a, b)        petsccomplexlib::pow(a, b)
222df4397b0SStefano Zampini     #define PetscExpComplex(a)           petsccomplexlib::exp(a)
223df4397b0SStefano Zampini     #define PetscLogComplex(a)           petsccomplexlib::log(a)
224df4397b0SStefano Zampini     #define PetscSinComplex(a)           petsccomplexlib::sin(a)
225df4397b0SStefano Zampini     #define PetscCosComplex(a)           petsccomplexlib::cos(a)
2265117d392SLisandro Dalcin     #define PetscTanComplex(a)           petsccomplexlib::tan(a)
227df4397b0SStefano Zampini     #define PetscAsinComplex(a)          petsccomplexlib::asin(a)
228df4397b0SStefano Zampini     #define PetscAcosComplex(a)          petsccomplexlib::acos(a)
2295117d392SLisandro Dalcin     #define PetscAtanComplex(a)          petsccomplexlib::atan(a)
230df4397b0SStefano Zampini     #define PetscSinhComplex(a)          petsccomplexlib::sinh(a)
231df4397b0SStefano Zampini     #define PetscCoshComplex(a)          petsccomplexlib::cosh(a)
232df4397b0SStefano Zampini     #define PetscTanhComplex(a)          petsccomplexlib::tanh(a)
2335117d392SLisandro Dalcin     #define PetscAsinhComplex(a)         petsccomplexlib::asinh(a)
2345117d392SLisandro Dalcin     #define PetscAcoshComplex(a)         petsccomplexlib::acosh(a)
2355117d392SLisandro Dalcin     #define PetscAtanhComplex(a)         petsccomplexlib::atanh(a)
2365117d392SLisandro Dalcin 
2375117d392SLisandro Dalcin     /* TODO: Add configure tests
2385117d392SLisandro Dalcin 
2395117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX)
2405117d392SLisandro Dalcin #undef PetscTanComplex
2419fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanComplex(PetscComplex z)
2425117d392SLisandro Dalcin {
2435117d392SLisandro Dalcin   return PetscSinComplex(z)/PetscCosComplex(z);
2445117d392SLisandro Dalcin }
245027d9794SBarry Smith #endif
246debe9ee2SPaul Mullowney 
2475117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX)
2485117d392SLisandro Dalcin #undef PetscTanhComplex
2499fbee547SJacob Faibussowitsch static inline PetscComplex PetscTanhComplex(PetscComplex z)
2505117d392SLisandro Dalcin {
2515117d392SLisandro Dalcin   return PetscSinhComplex(z)/PetscCoshComplex(z);
2525117d392SLisandro Dalcin }
2535117d392SLisandro Dalcin #endif
2545117d392SLisandro Dalcin 
2555117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX)
2565117d392SLisandro Dalcin #undef PetscAsinComplex
2579fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinComplex(PetscComplex z)
2585117d392SLisandro Dalcin {
2595117d392SLisandro Dalcin   const PetscComplex j(0,1);
2605117d392SLisandro Dalcin   return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z));
2615117d392SLisandro Dalcin }
2625117d392SLisandro Dalcin #endif
2635117d392SLisandro Dalcin 
2645117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX)
2655117d392SLisandro Dalcin #undef PetscAcosComplex
2669fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcosComplex(PetscComplex z)
2675117d392SLisandro Dalcin {
2685117d392SLisandro Dalcin   const PetscComplex j(0,1);
2695117d392SLisandro Dalcin   return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z));
2705117d392SLisandro Dalcin }
2715117d392SLisandro Dalcin #endif
2725117d392SLisandro Dalcin 
2735117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX)
2745117d392SLisandro Dalcin #undef PetscAtanComplex
2759fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanComplex(PetscComplex z)
2765117d392SLisandro Dalcin {
2775117d392SLisandro Dalcin   const PetscComplex j(0,1);
2785117d392SLisandro Dalcin   return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z));
2795117d392SLisandro Dalcin }
2805117d392SLisandro Dalcin #endif
2815117d392SLisandro Dalcin 
2825117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX)
2835117d392SLisandro Dalcin #undef PetscAsinhComplex
2849fbee547SJacob Faibussowitsch static inline PetscComplex PetscAsinhComplex(PetscComplex z)
2855117d392SLisandro Dalcin {
2865117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f));
2875117d392SLisandro Dalcin }
2885117d392SLisandro Dalcin #endif
2895117d392SLisandro Dalcin 
2905117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX)
2915117d392SLisandro Dalcin #undef PetscAcoshComplex
2929fbee547SJacob Faibussowitsch static inline PetscComplex PetscAcoshComplex(PetscComplex z)
2935117d392SLisandro Dalcin {
2945117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z-1.0f));
2955117d392SLisandro Dalcin }
2965117d392SLisandro Dalcin #endif
2975117d392SLisandro Dalcin 
2985117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATANH_COMPLEX)
2995117d392SLisandro Dalcin #undef PetscAtanhComplex
3009fbee547SJacob Faibussowitsch static inline PetscComplex PetscAtanhComplex(PetscComplex z)
3015117d392SLisandro Dalcin {
3025117d392SLisandro Dalcin   return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z));
3035117d392SLisandro Dalcin }
3045117d392SLisandro Dalcin #endif
3055117d392SLisandro Dalcin 
3065117d392SLisandro Dalcin */
3075117d392SLisandro Dalcin 
3087a19d461SSatish Balay   #else /* C99 support of complex number */
309519e2a1fSPaul Mullowney 
3107a19d461SSatish Balay     #if defined(PETSC_USE_REAL_SINGLE)
31150f81f78SJed Brown       #define PetscRealPartComplex(a)      crealf(a)
31250f81f78SJed Brown       #define PetscImaginaryPartComplex(a) cimagf(a)
31350f81f78SJed Brown       #define PetscAbsComplex(a)           cabsf(a)
3145117d392SLisandro Dalcin       #define PetscArgComplex(a)           cargf(a)
31550f81f78SJed Brown       #define PetscConjComplex(a)          conjf(a)
31650f81f78SJed Brown       #define PetscSqrtComplex(a)          csqrtf(a)
31750f81f78SJed Brown       #define PetscPowComplex(a, b)        cpowf(a, b)
31850f81f78SJed Brown       #define PetscExpComplex(a)           cexpf(a)
31950f81f78SJed Brown       #define PetscLogComplex(a)           clogf(a)
32050f81f78SJed Brown       #define PetscSinComplex(a)           csinf(a)
32150f81f78SJed Brown       #define PetscCosComplex(a)           ccosf(a)
3225117d392SLisandro Dalcin       #define PetscTanComplex(a)           ctanf(a)
323255453a1SBarry Smith       #define PetscAsinComplex(a)          casinf(a)
324255453a1SBarry Smith       #define PetscAcosComplex(a)          cacosf(a)
3255117d392SLisandro Dalcin       #define PetscAtanComplex(a)          catanf(a)
326a4bea5a6SPeter Brune       #define PetscSinhComplex(a)          csinhf(a)
327a4bea5a6SPeter Brune       #define PetscCoshComplex(a)          ccoshf(a)
328a4bea5a6SPeter Brune       #define PetscTanhComplex(a)          ctanhf(a)
3295117d392SLisandro Dalcin       #define PetscAsinhComplex(a)         casinhf(a)
3305117d392SLisandro Dalcin       #define PetscAcoshComplex(a)         cacoshf(a)
3315117d392SLisandro Dalcin       #define PetscAtanhComplex(a)         catanhf(a)
3321093a601SBarry Smith 
333ce63c4c1SBarry Smith     #elif defined(PETSC_USE_REAL_DOUBLE)
33450f81f78SJed Brown       #define PetscRealPartComplex(a)      creal(a)
33550f81f78SJed Brown       #define PetscImaginaryPartComplex(a) cimag(a)
33650f81f78SJed Brown       #define PetscAbsComplex(a)           cabs(a)
3375117d392SLisandro Dalcin       #define PetscArgComplex(a)           carg(a)
33850f81f78SJed Brown       #define PetscConjComplex(a)          conj(a)
33950f81f78SJed Brown       #define PetscSqrtComplex(a)          csqrt(a)
34050f81f78SJed Brown       #define PetscPowComplex(a, b)        cpow(a, b)
34150f81f78SJed Brown       #define PetscExpComplex(a)           cexp(a)
34250f81f78SJed Brown       #define PetscLogComplex(a)           clog(a)
34350f81f78SJed Brown       #define PetscSinComplex(a)           csin(a)
34450f81f78SJed Brown       #define PetscCosComplex(a)           ccos(a)
3455117d392SLisandro Dalcin       #define PetscTanComplex(a)           ctan(a)
346255453a1SBarry Smith       #define PetscAsinComplex(a)          casin(a)
347255453a1SBarry Smith       #define PetscAcosComplex(a)          cacos(a)
3485117d392SLisandro Dalcin       #define PetscAtanComplex(a)          catan(a)
349a4bea5a6SPeter Brune       #define PetscSinhComplex(a)          csinh(a)
350a4bea5a6SPeter Brune       #define PetscCoshComplex(a)          ccosh(a)
351a4bea5a6SPeter Brune       #define PetscTanhComplex(a)          ctanh(a)
3525117d392SLisandro Dalcin       #define PetscAsinhComplex(a)         casinh(a)
3535117d392SLisandro Dalcin       #define PetscAcoshComplex(a)         cacosh(a)
3545117d392SLisandro Dalcin       #define PetscAtanhComplex(a)         catanh(a)
3551093a601SBarry Smith 
3568c764dc5SJose Roman     #elif defined(PETSC_USE_REAL___FLOAT128)
35750f81f78SJed Brown       #define PetscRealPartComplex(a)      crealq(a)
35850f81f78SJed Brown       #define PetscImaginaryPartComplex(a) cimagq(a)
35950f81f78SJed Brown       #define PetscAbsComplex(a)           cabsq(a)
3605117d392SLisandro Dalcin       #define PetscArgComplex(a)           cargq(a)
36150f81f78SJed Brown       #define PetscConjComplex(a)          conjq(a)
36250f81f78SJed Brown       #define PetscSqrtComplex(a)          csqrtq(a)
36350f81f78SJed Brown       #define PetscPowComplex(a, b)        cpowq(a, b)
36450f81f78SJed Brown       #define PetscExpComplex(a)           cexpq(a)
36550f81f78SJed Brown       #define PetscLogComplex(a)           clogq(a)
36650f81f78SJed Brown       #define PetscSinComplex(a)           csinq(a)
36750f81f78SJed Brown       #define PetscCosComplex(a)           ccosq(a)
3685117d392SLisandro Dalcin       #define PetscTanComplex(a)           ctanq(a)
369255453a1SBarry Smith       #define PetscAsinComplex(a)          casinq(a)
370255453a1SBarry Smith       #define PetscAcosComplex(a)          cacosq(a)
3715117d392SLisandro Dalcin       #define PetscAtanComplex(a)          catanq(a)
372a4bea5a6SPeter Brune       #define PetscSinhComplex(a)          csinhq(a)
373a4bea5a6SPeter Brune       #define PetscCoshComplex(a)          ccoshq(a)
374a4bea5a6SPeter Brune       #define PetscTanhComplex(a)          ctanhq(a)
3755117d392SLisandro Dalcin       #define PetscAsinhComplex(a)         casinhq(a)
3765117d392SLisandro Dalcin       #define PetscAcoshComplex(a)         cacoshq(a)
3775117d392SLisandro Dalcin       #define PetscAtanhComplex(a)         catanhq(a)
378a4bea5a6SPeter Brune 
379ce63c4c1SBarry Smith     #endif /* PETSC_USE_REAL_* */
3807a19d461SSatish Balay   #endif   /* (__cplusplus) */
381e489efc1SBarry Smith 
3821093a601SBarry Smith /*
3835117d392SLisandro Dalcin    PETSC_i is the imaginary number, i
3841093a601SBarry Smith */
38550f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i;
3868a351411SToby Isaac 
3875117d392SLisandro Dalcin /*
3885117d392SLisandro Dalcin    Try to do the right thing for complex number construction: see
3898a351411SToby Isaac    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm
3908a351411SToby Isaac    for details
3918a351411SToby Isaac */
392d71ae5a4SJacob Faibussowitsch static inline PetscComplex PetscCMPLX(PetscReal x, PetscReal y)
393d71ae5a4SJacob Faibussowitsch {
394450fc7c9SSatish Balay   #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128)
3958a351411SToby Isaac   return PetscComplex(x, y);
3968a351411SToby Isaac   #elif defined(_Imaginary_I)
3978a351411SToby Isaac   return x + y * _Imaginary_I;
3988a351411SToby Isaac   #else
399616d7c5eSToby Isaac   { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5),
400616d7c5eSToby Isaac 
401616d7c5eSToby Isaac        "For each floating type there is a corresponding real type, which is always a real floating
402616d7c5eSToby Isaac        type. For real floating types, it is the same type. For complex types, it is the type given
403616d7c5eSToby Isaac        by deleting the keyword _Complex from the type name."
404616d7c5eSToby Isaac 
405616d7c5eSToby Isaac        So type punning should be portable. */
4069371c9d4SSatish Balay     union
4079371c9d4SSatish Balay     {
4089371c9d4SSatish Balay       PetscComplex z;
4099371c9d4SSatish Balay       PetscReal    f[2];
4109371c9d4SSatish Balay     } uz;
411616d7c5eSToby Isaac 
412616d7c5eSToby Isaac     uz.f[0] = x;
413616d7c5eSToby Isaac     uz.f[1] = y;
414616d7c5eSToby Isaac     return uz.z;
415616d7c5eSToby Isaac   }
41650f81f78SJed Brown   #endif
4178a351411SToby Isaac }
4188a351411SToby Isaac 
419de272c7aSSatish 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)\"")
420de272c7aSSatish 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)\"")
421de272c7aSSatish Balay 
422613bf2b2SPierre Jolivet   #if defined(PETSC_HAVE_REAL___FLOAT128)
42393d501b3SJacob Faibussowitsch     // if complex is not used, then quadmath.h won't be included by petscsystypes.h
42493d501b3SJacob Faibussowitsch     #if defined(PETSC_USE_COMPLEX)
42593d501b3SJacob Faibussowitsch       #define MPIU___COMPLEX128_ATTR_TAG PETSC_ATTRIBUTE_MPI_TYPE_TAG(__complex128)
42693d501b3SJacob Faibussowitsch     #else
42793d501b3SJacob Faibussowitsch       #define MPIU___COMPLEX128_ATTR_TAG
42893d501b3SJacob Faibussowitsch     #endif
42993d501b3SJacob Faibussowitsch 
43093d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 MPIU___COMPLEX128_ATTR_TAG;
43193d501b3SJacob Faibussowitsch 
43293d501b3SJacob Faibussowitsch     #undef MPIU___COMPLEX128_ATTR_TAG
433613bf2b2SPierre Jolivet   #endif /* PETSC_HAVE_REAL___FLOAT128 */
4345117d392SLisandro Dalcin 
4355117d392SLisandro Dalcin   /*MC
43687497f52SBarry Smith    MPIU_COMPLEX - Portable MPI datatype corresponding to `PetscComplex` independent of the precision of `PetscComplex`
4375117d392SLisandro Dalcin 
4385117d392SLisandro Dalcin    Notes:
43987497f52SBarry Smith    In MPI calls that require an MPI datatype that matches a `PetscComplex` or array of `PetscComplex` values, pass this value.
4405117d392SLisandro Dalcin 
4415117d392SLisandro Dalcin    Level: beginner
4425117d392SLisandro Dalcin 
443db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`, `PETSC_i`
4445117d392SLisandro Dalcin M*/
4455117d392SLisandro Dalcin   #if defined(PETSC_USE_REAL_SINGLE)
446de272c7aSSatish Balay     #define MPIU_COMPLEX MPI_C_COMPLEX
4475117d392SLisandro Dalcin   #elif defined(PETSC_USE_REAL_DOUBLE)
448de272c7aSSatish Balay     #define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX
4495117d392SLisandro Dalcin   #elif defined(PETSC_USE_REAL___FLOAT128)
4505117d392SLisandro Dalcin     #define MPIU_COMPLEX MPIU___COMPLEX128
4515117d392SLisandro Dalcin   #elif defined(PETSC_USE_REAL___FP16)
452de272c7aSSatish Balay     #define MPIU_COMPLEX MPI_C_COMPLEX
4535117d392SLisandro Dalcin   #endif /* PETSC_USE_REAL_* */
4545117d392SLisandro Dalcin 
4555117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */
4565117d392SLisandro Dalcin 
4575117d392SLisandro Dalcin /*
4585117d392SLisandro Dalcin     Scalar number definitions
4595117d392SLisandro Dalcin  */
4607a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX)
4615117d392SLisandro Dalcin   /*MC
46287497f52SBarry Smith    MPIU_SCALAR - Portable MPI datatype corresponding to `PetscScalar` independent of the precision of `PetscScalar`
4635117d392SLisandro Dalcin 
4645117d392SLisandro Dalcin    Notes:
46587497f52SBarry Smith    In MPI calls that require an MPI datatype that matches a `PetscScalar` or array of `PetscScalar` values, pass this value.
4665117d392SLisandro Dalcin 
4675117d392SLisandro Dalcin    Level: beginner
4685117d392SLisandro Dalcin 
469db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_COMPLEX`, `MPIU_INT`
4705117d392SLisandro Dalcin M*/
4715117d392SLisandro Dalcin   #define MPIU_SCALAR MPIU_COMPLEX
4725117d392SLisandro Dalcin 
4735117d392SLisandro Dalcin   /*MC
47487497f52SBarry Smith    PetscRealPart - Returns the real part of a `PetscScalar`
4755117d392SLisandro Dalcin 
4765117d392SLisandro Dalcin    Synopsis:
4775117d392SLisandro Dalcin    #include <petscmath.h>
4785117d392SLisandro Dalcin    PetscReal PetscRealPart(PetscScalar v)
4795117d392SLisandro Dalcin 
4805117d392SLisandro Dalcin    Not Collective
4815117d392SLisandro Dalcin 
4825117d392SLisandro Dalcin    Input Parameter:
4835117d392SLisandro Dalcin .  v - value to find the real part of
4845117d392SLisandro Dalcin 
4855117d392SLisandro Dalcin    Level: beginner
4865117d392SLisandro Dalcin 
487db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscImaginaryPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
4885117d392SLisandro Dalcin 
4895117d392SLisandro Dalcin M*/
4905117d392SLisandro Dalcin   #define PetscRealPart(a) PetscRealPartComplex(a)
4915117d392SLisandro Dalcin 
4925117d392SLisandro Dalcin   /*MC
49387497f52SBarry Smith    PetscImaginaryPart - Returns the imaginary part of a `PetscScalar`
4945117d392SLisandro Dalcin 
4955117d392SLisandro Dalcin    Synopsis:
4965117d392SLisandro Dalcin    #include <petscmath.h>
4975117d392SLisandro Dalcin    PetscReal PetscImaginaryPart(PetscScalar v)
4985117d392SLisandro Dalcin 
4995117d392SLisandro Dalcin    Not Collective
5005117d392SLisandro Dalcin 
5015117d392SLisandro Dalcin    Input Parameter:
5025117d392SLisandro Dalcin .  v - value to find the imaginary part of
5035117d392SLisandro Dalcin 
5045117d392SLisandro Dalcin    Level: beginner
5055117d392SLisandro Dalcin 
5065117d392SLisandro Dalcin    Notes:
5075117d392SLisandro Dalcin        If PETSc was configured for real numbers then this always returns the value 0
5085117d392SLisandro Dalcin 
509db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscRealPart()`, `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
5105117d392SLisandro Dalcin 
5115117d392SLisandro Dalcin M*/
5125117d392SLisandro Dalcin   #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a)
5135117d392SLisandro Dalcin 
5145117d392SLisandro Dalcin   #define PetscAbsScalar(a)    PetscAbsComplex(a)
5155117d392SLisandro Dalcin   #define PetscArgScalar(a)    PetscArgComplex(a)
5165117d392SLisandro Dalcin   #define PetscConj(a)         PetscConjComplex(a)
5175117d392SLisandro Dalcin   #define PetscSqrtScalar(a)   PetscSqrtComplex(a)
5185117d392SLisandro Dalcin   #define PetscPowScalar(a, b) PetscPowComplex(a, b)
5195117d392SLisandro Dalcin   #define PetscExpScalar(a)    PetscExpComplex(a)
5205117d392SLisandro Dalcin   #define PetscLogScalar(a)    PetscLogComplex(a)
5215117d392SLisandro Dalcin   #define PetscSinScalar(a)    PetscSinComplex(a)
5225117d392SLisandro Dalcin   #define PetscCosScalar(a)    PetscCosComplex(a)
5235117d392SLisandro Dalcin   #define PetscTanScalar(a)    PetscTanComplex(a)
5245117d392SLisandro Dalcin   #define PetscAsinScalar(a)   PetscAsinComplex(a)
5255117d392SLisandro Dalcin   #define PetscAcosScalar(a)   PetscAcosComplex(a)
5265117d392SLisandro Dalcin   #define PetscAtanScalar(a)   PetscAtanComplex(a)
5275117d392SLisandro Dalcin   #define PetscSinhScalar(a)   PetscSinhComplex(a)
5285117d392SLisandro Dalcin   #define PetscCoshScalar(a)   PetscCoshComplex(a)
5295117d392SLisandro Dalcin   #define PetscTanhScalar(a)   PetscTanhComplex(a)
5305117d392SLisandro Dalcin   #define PetscAsinhScalar(a)  PetscAsinhComplex(a)
5315117d392SLisandro Dalcin   #define PetscAcoshScalar(a)  PetscAcoshComplex(a)
5325117d392SLisandro Dalcin   #define PetscAtanhScalar(a)  PetscAtanhComplex(a)
5335117d392SLisandro Dalcin 
5345117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */
5355117d392SLisandro Dalcin   #define MPIU_SCALAR           MPIU_REAL
5365117d392SLisandro Dalcin   #define PetscRealPart(a)      (a)
5375117d392SLisandro Dalcin   #define PetscImaginaryPart(a) ((PetscReal)0)
5385117d392SLisandro Dalcin   #define PetscAbsScalar(a)     PetscAbsReal(a)
5395117d392SLisandro Dalcin   #define PetscArgScalar(a)     (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0)
5405117d392SLisandro Dalcin   #define PetscConj(a)          (a)
5415117d392SLisandro Dalcin   #define PetscSqrtScalar(a)    PetscSqrtReal(a)
5425117d392SLisandro Dalcin   #define PetscPowScalar(a, b)  PetscPowReal(a, b)
5435117d392SLisandro Dalcin   #define PetscExpScalar(a)     PetscExpReal(a)
5445117d392SLisandro Dalcin   #define PetscLogScalar(a)     PetscLogReal(a)
5455117d392SLisandro Dalcin   #define PetscSinScalar(a)     PetscSinReal(a)
5465117d392SLisandro Dalcin   #define PetscCosScalar(a)     PetscCosReal(a)
5475117d392SLisandro Dalcin   #define PetscTanScalar(a)     PetscTanReal(a)
5485117d392SLisandro Dalcin   #define PetscAsinScalar(a)    PetscAsinReal(a)
5495117d392SLisandro Dalcin   #define PetscAcosScalar(a)    PetscAcosReal(a)
5505117d392SLisandro Dalcin   #define PetscAtanScalar(a)    PetscAtanReal(a)
5515117d392SLisandro Dalcin   #define PetscSinhScalar(a)    PetscSinhReal(a)
5525117d392SLisandro Dalcin   #define PetscCoshScalar(a)    PetscCoshReal(a)
5535117d392SLisandro Dalcin   #define PetscTanhScalar(a)    PetscTanhReal(a)
5545117d392SLisandro Dalcin   #define PetscAsinhScalar(a)   PetscAsinhReal(a)
5555117d392SLisandro Dalcin   #define PetscAcoshScalar(a)   PetscAcoshReal(a)
5565117d392SLisandro Dalcin   #define PetscAtanhScalar(a)   PetscAtanhReal(a)
5575117d392SLisandro Dalcin 
5585117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */
5595117d392SLisandro Dalcin 
5605117d392SLisandro Dalcin /*
5615117d392SLisandro Dalcin    Certain objects may be created using either single or double precision.
5625117d392SLisandro Dalcin    This is currently not used.
5635117d392SLisandro Dalcin */
5649371c9d4SSatish Balay typedef enum {
5659371c9d4SSatish Balay   PETSC_SCALAR_DOUBLE,
5669371c9d4SSatish Balay   PETSC_SCALAR_SINGLE,
5679371c9d4SSatish Balay   PETSC_SCALAR_LONG_DOUBLE,
5689371c9d4SSatish Balay   PETSC_SCALAR_HALF
5699371c9d4SSatish Balay } PetscScalarPrecision;
5705117d392SLisandro Dalcin 
5715117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/
5725117d392SLisandro Dalcin 
5735117d392SLisandro Dalcin /*MC
5745117d392SLisandro Dalcin    PetscAbs - Returns the absolute value of a number
5755117d392SLisandro Dalcin 
5765117d392SLisandro Dalcin    Synopsis:
5775117d392SLisandro Dalcin    #include <petscmath.h>
5785117d392SLisandro Dalcin    type PetscAbs(type v)
5795117d392SLisandro Dalcin 
5805117d392SLisandro Dalcin    Not Collective
5815117d392SLisandro Dalcin 
5825117d392SLisandro Dalcin    Input Parameter:
5835117d392SLisandro Dalcin .  v - the number
5845117d392SLisandro Dalcin 
58587497f52SBarry Smith    Note:
58687497f52SBarry Smith    The type can be integer or real floating point value, but cannot be complex
5875117d392SLisandro Dalcin 
5885117d392SLisandro Dalcin    Level: beginner
5895117d392SLisandro Dalcin 
590db781477SPatrick Sanan .seealso: `PetscAbsInt()`, `PetscAbsReal()`, `PetscAbsScalar()`
5915117d392SLisandro Dalcin 
5925117d392SLisandro Dalcin M*/
5935117d392SLisandro Dalcin #define PetscAbs(a) (((a) >= 0) ? (a) : (-(a)))
5945117d392SLisandro Dalcin 
5955117d392SLisandro Dalcin /*MC
5965117d392SLisandro Dalcin    PetscSign - Returns the sign of a number as an integer
5975117d392SLisandro Dalcin 
5985117d392SLisandro Dalcin    Synopsis:
5995117d392SLisandro Dalcin    #include <petscmath.h>
6005117d392SLisandro Dalcin    int PetscSign(type v)
6015117d392SLisandro Dalcin 
6025117d392SLisandro Dalcin    Not Collective
6035117d392SLisandro Dalcin 
6045117d392SLisandro Dalcin    Input Parameter:
6055117d392SLisandro Dalcin .  v - the number
6065117d392SLisandro Dalcin 
60787497f52SBarry Smith    Note:
60887497f52SBarry Smith    The type can be integer or real floating point value
6095117d392SLisandro Dalcin 
6105117d392SLisandro Dalcin    Level: beginner
6115117d392SLisandro Dalcin 
6125117d392SLisandro Dalcin M*/
6135117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
614e489efc1SBarry Smith 
615b6a5bde7SBarry Smith /*MC
616b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
617b6a5bde7SBarry Smith 
618eca87e8dSBarry Smith    Synopsis:
619aaa7dc30SBarry Smith    #include <petscmath.h>
620eca87e8dSBarry Smith    type PetscMin(type v1,type v2)
621eca87e8dSBarry Smith 
622eca87e8dSBarry Smith    Not Collective
623eca87e8dSBarry Smith 
624d8d19677SJose E. Roman    Input Parameters:
625b6a5bde7SBarry Smith +  v1 - first value to find minimum of
626b6a5bde7SBarry Smith -  v2 - second value to find minimum of
627b6a5bde7SBarry Smith 
62887497f52SBarry Smith    Note:
62987497f52SBarry Smith    The type can be integer or floating point value
630b6a5bde7SBarry Smith 
631b6a5bde7SBarry Smith    Level: beginner
632b6a5bde7SBarry Smith 
633db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
634b6a5bde7SBarry Smith 
635b6a5bde7SBarry Smith M*/
636e489efc1SBarry Smith #define PetscMin(a, b) (((a) < (b)) ? (a) : (b))
637b6a5bde7SBarry Smith 
638b6a5bde7SBarry Smith /*MC
639*d5b43468SJose E. Roman    PetscMax - Returns maximum of two numbers
640b6a5bde7SBarry Smith 
641eca87e8dSBarry Smith    Synopsis:
642aaa7dc30SBarry Smith    #include <petscmath.h>
643eca87e8dSBarry Smith    type max PetscMax(type v1,type v2)
644eca87e8dSBarry Smith 
645eca87e8dSBarry Smith    Not Collective
646eca87e8dSBarry Smith 
647d8d19677SJose E. Roman    Input Parameters:
648b6a5bde7SBarry Smith +  v1 - first value to find maximum of
649b6a5bde7SBarry Smith -  v2 - second value to find maximum of
650b6a5bde7SBarry Smith 
65187497f52SBarry Smith    Note:
65287497f52SBarry Smith    The type can be integer or floating point value
653b6a5bde7SBarry Smith 
654b6a5bde7SBarry Smith    Level: beginner
655b6a5bde7SBarry Smith 
656db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscClipInterval()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
657b6a5bde7SBarry Smith 
658b6a5bde7SBarry Smith M*/
659e489efc1SBarry Smith #define PetscMax(a, b) (((a) < (b)) ? (b) : (a))
660b6a5bde7SBarry Smith 
661b6a5bde7SBarry Smith /*MC
662d9a4bb16SJed Brown    PetscClipInterval - Returns a number clipped to be within an interval
663d9a4bb16SJed Brown 
664d9a4bb16SJed Brown    Synopsis:
665aaa7dc30SBarry Smith    #include <petscmath.h>
666d9a4bb16SJed Brown    type clip PetscClipInterval(type x,type a,type b)
667d9a4bb16SJed Brown 
668d9a4bb16SJed Brown    Not Collective
669d9a4bb16SJed Brown 
670d8d19677SJose E. Roman    Input Parameters:
6710d398bfeSStefano Zampini +  x - value to use if within interval [a,b]
672d9a4bb16SJed Brown .  a - lower end of interval
673d9a4bb16SJed Brown -  b - upper end of interval
674d9a4bb16SJed Brown 
67587497f52SBarry Smith    Note:
67687497f52SBarry Smith    The type can be integer or floating point value
677d9a4bb16SJed Brown 
678d9a4bb16SJed Brown    Level: beginner
679d9a4bb16SJed Brown 
680db781477SPatrick Sanan .seealso: `PetscMin()`, `PetscMax()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscSqr()`
681d9a4bb16SJed Brown 
682d9a4bb16SJed Brown M*/
683d9a4bb16SJed Brown #define PetscClipInterval(x, a, b) (PetscMax((a), PetscMin((x), (b))))
684d9a4bb16SJed Brown 
685d9a4bb16SJed Brown /*MC
686b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
687b6a5bde7SBarry Smith 
688b6a5bde7SBarry Smith    Synopsis:
689aaa7dc30SBarry Smith    #include <petscmath.h>
690b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
691b6a5bde7SBarry Smith 
692eca87e8dSBarry Smith    Input Parameter:
693eca87e8dSBarry Smith .   v1 - the integer
694b6a5bde7SBarry Smith 
695b6a5bde7SBarry Smith    Level: beginner
696b6a5bde7SBarry Smith 
697db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsReal()`, `PetscSqr()`
698b6a5bde7SBarry Smith 
699b6a5bde7SBarry Smith M*/
7009fa7d148SSatish Balay #define PetscAbsInt(a) (((a) < 0) ? (-(a)) : (a))
701b6a5bde7SBarry Smith 
702b6a5bde7SBarry Smith /*MC
703b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
704b6a5bde7SBarry Smith 
705eca87e8dSBarry Smith    Synopsis:
706aaa7dc30SBarry Smith    #include <petscmath.h>
707eca87e8dSBarry Smith    Real abs PetscAbsReal(PetscReal v1)
708eca87e8dSBarry Smith 
709b6a5bde7SBarry Smith    Input Parameter:
710b6a5bde7SBarry Smith .   v1 - the double
711b6a5bde7SBarry Smith 
712b6a5bde7SBarry Smith    Level: beginner
713b6a5bde7SBarry Smith 
714db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscSqr()`
715b6a5bde7SBarry Smith 
716b6a5bde7SBarry Smith M*/
7171118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
7181118d4bcSLisandro Dalcin   #define PetscAbsReal(a) fabsf(a)
7191118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7201118d4bcSLisandro Dalcin   #define PetscAbsReal(a) fabs(a)
7211118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
7221118d4bcSLisandro Dalcin   #define PetscAbsReal(a) fabsq(a)
7231118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7241118d4bcSLisandro Dalcin   #define PetscAbsReal(a) fabsf(a)
7251118d4bcSLisandro Dalcin #endif
726b6a5bde7SBarry Smith 
727b6a5bde7SBarry Smith /*MC
728b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
729b6a5bde7SBarry Smith 
730b6a5bde7SBarry Smith    Synopsis:
731aaa7dc30SBarry Smith    #include <petscmath.h>
732b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
733b6a5bde7SBarry Smith 
734eca87e8dSBarry Smith    Not Collective
735eca87e8dSBarry Smith 
736eca87e8dSBarry Smith    Input Parameter:
737eca87e8dSBarry Smith .   v1 - the value
738eca87e8dSBarry Smith 
73987497f52SBarry Smith    Note:
74087497f52SBarry Smith    The type can be integer or floating point value
741b6a5bde7SBarry Smith 
742b6a5bde7SBarry Smith    Level: beginner
743b6a5bde7SBarry Smith 
744db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`
745b6a5bde7SBarry Smith 
746b6a5bde7SBarry Smith M*/
7474ebda54eSMatthew Knepley #define PetscSqr(a) ((a) * (a))
748e489efc1SBarry Smith 
749314da920SBarry Smith /* ----------------------------------------------------------------------------*/
750ee223c85SLisandro Dalcin 
751ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
752ee223c85SLisandro Dalcin   #define PetscRealConstant(constant) constant##F
7535117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7545117d392SLisandro Dalcin   #define PetscRealConstant(constant) constant
755ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
756ee223c85SLisandro Dalcin   #define PetscRealConstant(constant) constant##Q
7575117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7585117d392SLisandro Dalcin   #define PetscRealConstant(constant) constant##F
759ee223c85SLisandro Dalcin #endif
760ee223c85SLisandro Dalcin 
761314da920SBarry Smith /*
762d34fcf5fSBarry Smith      Basic constants
763314da920SBarry Smith */
7642fab75feSLisandro Dalcin #define PETSC_PI    PetscRealConstant(3.1415926535897932384626433832795029)
7652fab75feSLisandro Dalcin #define PETSC_PHI   PetscRealConstant(1.6180339887498948482045868343656381)
7667b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981)
767d34fcf5fSBarry Smith 
768ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES)
76971fd2e92SBarry Smith   #define PETSC_MAX_INT 2147483647
770ab824b78SBarry Smith   #define PETSC_MIN_INT (-PETSC_MAX_INT - 1)
771ab824b78SBarry Smith #else
772ab824b78SBarry Smith   #define PETSC_MAX_INT 9223372036854775807L
773ab824b78SBarry Smith   #define PETSC_MIN_INT (-PETSC_MAX_INT - 1)
774ab824b78SBarry Smith #endif
775569ea7c4SPierre Jolivet #define PETSC_MAX_UINT16 65535
776e489efc1SBarry Smith 
777ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
778ab824b78SBarry Smith   #define PETSC_MAX_REAL             3.40282346638528860e+38F
7799fa7d148SSatish Balay   #define PETSC_MIN_REAL             (-PETSC_MAX_REAL)
78082a7e548SBarry Smith   #define PETSC_MACHINE_EPSILON      1.19209290e-07F
78182a7e548SBarry Smith   #define PETSC_SQRT_MACHINE_EPSILON 3.45266983e-04F
782ee223c85SLisandro Dalcin   #define PETSC_SMALL                1.e-5F
783ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
784ab824b78SBarry Smith   #define PETSC_MAX_REAL             1.7976931348623157e+308
7859fa7d148SSatish Balay   #define PETSC_MIN_REAL             (-PETSC_MAX_REAL)
78682a7e548SBarry Smith   #define PETSC_MACHINE_EPSILON      2.2204460492503131e-16
78782a7e548SBarry Smith   #define PETSC_SQRT_MACHINE_EPSILON 1.490116119384766e-08
788cf6e855fSSatish Balay   #define PETSC_SMALL                1.e-10
789ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128)
790ea345e14SBarry Smith   #define PETSC_MAX_REAL             FLT128_MAX
7919fa7d148SSatish Balay   #define PETSC_MIN_REAL             (-FLT128_MAX)
792d34fcf5fSBarry Smith   #define PETSC_MACHINE_EPSILON      FLT128_EPSILON
793ee223c85SLisandro Dalcin   #define PETSC_SQRT_MACHINE_EPSILON 1.38777878078144567552953958511352539e-17Q
794ee223c85SLisandro Dalcin   #define PETSC_SMALL                1.e-20Q
7955117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7965117d392SLisandro Dalcin   #define PETSC_MAX_REAL             65504.0F
7979fa7d148SSatish Balay   #define PETSC_MIN_REAL             (-PETSC_MAX_REAL)
7985117d392SLisandro Dalcin   #define PETSC_MACHINE_EPSILON      .0009765625F
7995117d392SLisandro Dalcin   #define PETSC_SQRT_MACHINE_EPSILON .03125F
8005117d392SLisandro Dalcin   #define PETSC_SMALL                5.e-3F
8019cf09972SJed Brown #endif
8023e523bebSBarry Smith 
80325d0f998SSatish Balay #define PETSC_INFINITY  (PETSC_MAX_REAL / 4)
8049fa7d148SSatish Balay #define PETSC_NINFINITY (-PETSC_INFINITY)
805e270355aSBarry Smith 
8069f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool  PetscIsInfReal(PetscReal);
8073948c36eSLisandro Dalcin PETSC_EXTERN PetscBool  PetscIsNanReal(PetscReal);
8088b49ba18SBarry Smith PETSC_EXTERN PetscBool  PetscIsNormalReal(PetscReal);
809d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanReal(PetscReal v)
810d71ae5a4SJacob Faibussowitsch {
8119371c9d4SSatish Balay   return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;
8129371c9d4SSatish Balay }
813d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsInfScalar(PetscScalar v)
814d71ae5a4SJacob Faibussowitsch {
8159371c9d4SSatish Balay   return PetscIsInfReal(PetscAbsScalar(v));
8169371c9d4SSatish Balay }
817d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsNanScalar(PetscScalar v)
818d71ae5a4SJacob Faibussowitsch {
8199371c9d4SSatish Balay   return PetscIsNanReal(PetscAbsScalar(v));
8209371c9d4SSatish Balay }
821d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsInfOrNanScalar(PetscScalar v)
822d71ae5a4SJacob Faibussowitsch {
8239371c9d4SSatish Balay   return PetscIsInfOrNanReal(PetscAbsScalar(v));
8249371c9d4SSatish Balay }
825d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscIsNormalScalar(PetscScalar v)
826d71ae5a4SJacob Faibussowitsch {
8279371c9d4SSatish Balay   return PetscIsNormalReal(PetscAbsScalar(v));
8289371c9d4SSatish Balay }
8299a25a3ccSBarry Smith 
830b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal, PetscReal, PetscReal, PetscReal);
831ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal, PetscReal);
832ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar, PetscScalar);
833ce4818fdSLisandro Dalcin 
83498725619SBarry Smith /*
83598725619SBarry Smith     These macros are currently hardwired to match the regular data types, so there is no support for a different
83698725619SBarry Smith     MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again.
83798725619SBarry Smith  */
83898725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR
83998725619SBarry Smith typedef PetscScalar MatScalar;
84098725619SBarry Smith typedef PetscReal   MatReal;
84198725619SBarry Smith 
8429371c9d4SSatish Balay struct petsc_mpiu_2scalar {
8439371c9d4SSatish Balay   PetscScalar a, b;
8449371c9d4SSatish Balay };
84593d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_2scalar);
846df4397b0SStefano Zampini 
84793d501b3SJacob Faibussowitsch /* MPI Datatypes for composite reductions */
84893d501b3SJacob Faibussowitsch struct petsc_mpiu_real_int {
84993d501b3SJacob Faibussowitsch   PetscReal v;
85093d501b3SJacob Faibussowitsch   PetscInt  i;
85193d501b3SJacob Faibussowitsch };
85293d501b3SJacob Faibussowitsch 
85393d501b3SJacob Faibussowitsch struct petsc_mpiu_scalar_int {
85493d501b3SJacob Faibussowitsch   PetscScalar v;
85593d501b3SJacob Faibussowitsch   PetscInt    i;
85693d501b3SJacob Faibussowitsch };
85793d501b3SJacob Faibussowitsch 
85893d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_REAL_INT PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_real_int);
85993d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_scalar_int);
860092991acSStefano Zampini 
861a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES)
86293d501b3SJacob Faibussowitsch struct /* __attribute__((packed, aligned(alignof(PetscInt *)))) */ petsc_mpiu_2int {
86393d501b3SJacob Faibussowitsch   PetscInt a;
86493d501b3SJacob Faibussowitsch   PetscInt b;
8659371c9d4SSatish Balay };
86693d501b3SJacob Faibussowitsch /*
86793d501b3SJacob Faibussowitsch  static_assert(sizeof(struct petsc_mpiu_2int) == 2 * sizeof(PetscInt), "");
86893d501b3SJacob Faibussowitsch  static_assert(alignof(struct petsc_mpiu_2int) == alignof(PetscInt *), "");
86993d501b3SJacob Faibussowitsch  static_assert(alignof(struct petsc_mpiu_2int) == alignof(PetscInt[2]), "");
87093d501b3SJacob Faibussowitsch 
87193d501b3SJacob Faibussowitsch  clang generates warnings that petsc_mpiu_2int is not layout compatible with PetscInt[2] or
87293d501b3SJacob Faibussowitsch  PetscInt *, even though (with everything else uncommented) both of the static_asserts above
87393d501b3SJacob Faibussowitsch  pass! So we just comment it out...
87493d501b3SJacob Faibussowitsch */
87593d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_2INT /* PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE(struct petsc_mpiu_2int) */;
8768ad47952SJed Brown #else
8778ad47952SJed Brown   #define MPIU_2INT MPI_2INT
8788ad47952SJed Brown #endif
879b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPI_4INT;
880b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPIU_4INT;
881e9fa29b7SSatish Balay 
882d71ae5a4SJacob Faibussowitsch static inline PetscInt PetscPowInt(PetscInt base, PetscInt power)
883d71ae5a4SJacob Faibussowitsch {
884fa711258SJed Brown   PetscInt result = 1;
885fa711258SJed Brown   while (power) {
886fa711258SJed Brown     if (power & 1) result *= base;
887fa711258SJed Brown     power >>= 1;
888fa711258SJed Brown     base *= base;
889fa711258SJed Brown   }
890fa711258SJed Brown   return result;
891fa711258SJed Brown }
892b2fb0278SBarry Smith 
893d71ae5a4SJacob Faibussowitsch static inline PetscInt64 PetscPowInt64(PetscInt base, PetscInt power)
894d71ae5a4SJacob Faibussowitsch {
895ad70a4c3SStefano Zampini   PetscInt64 result = 1;
896ad70a4c3SStefano Zampini   while (power) {
897ad70a4c3SStefano Zampini     if (power & 1) result *= base;
898ad70a4c3SStefano Zampini     power >>= 1;
899ad70a4c3SStefano Zampini     base *= base;
900ad70a4c3SStefano Zampini   }
901ad70a4c3SStefano Zampini   return result;
902ad70a4c3SStefano Zampini }
903ad70a4c3SStefano Zampini 
904d71ae5a4SJacob Faibussowitsch static inline PetscReal PetscPowRealInt(PetscReal base, PetscInt power)
905d71ae5a4SJacob Faibussowitsch {
906fa711258SJed Brown   PetscReal result = 1;
907d98d5da7SBarry Smith   if (power < 0) {
908d98d5da7SBarry Smith     power = -power;
90910d40e53SLisandro Dalcin     base  = ((PetscReal)1) / base;
910d98d5da7SBarry Smith   }
911fa711258SJed Brown   while (power) {
912fa711258SJed Brown     if (power & 1) result *= base;
913fa711258SJed Brown     power >>= 1;
914fa711258SJed Brown     base *= base;
915fa711258SJed Brown   }
916fa711258SJed Brown   return result;
917fa711258SJed Brown }
918fa711258SJed Brown 
919d71ae5a4SJacob Faibussowitsch static inline PetscScalar PetscPowScalarInt(PetscScalar base, PetscInt power)
920d71ae5a4SJacob Faibussowitsch {
9215117d392SLisandro Dalcin   PetscScalar result = (PetscReal)1;
9228b49ba18SBarry Smith   if (power < 0) {
9238b49ba18SBarry Smith     power = -power;
92410d40e53SLisandro Dalcin     base  = ((PetscReal)1) / base;
9258b49ba18SBarry Smith   }
9268b49ba18SBarry Smith   while (power) {
9278b49ba18SBarry Smith     if (power & 1) result *= base;
9288b49ba18SBarry Smith     power >>= 1;
9298b49ba18SBarry Smith     base *= base;
9308b49ba18SBarry Smith   }
9318b49ba18SBarry Smith   return result;
9328b49ba18SBarry Smith }
9338b49ba18SBarry Smith 
934d71ae5a4SJacob Faibussowitsch static inline PetscScalar PetscPowScalarReal(PetscScalar base, PetscReal power)
935d71ae5a4SJacob Faibussowitsch {
936b2fb0278SBarry Smith   PetscScalar cpower = power;
937b2fb0278SBarry Smith   return PetscPowScalar(base, cpower);
938b2fb0278SBarry Smith }
93978a59e97SMatthew G. Knepley 
940c803a25aSBarry Smith /*MC
94166baab88SBarry Smith     PetscApproximateLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers
942c803a25aSBarry Smith 
943c803a25aSBarry Smith    Synopsis:
944c803a25aSBarry Smith    #include <petscmath.h>
94566baab88SBarry Smith    bool PetscApproximateLTE(PetscReal x,constant float)
946c803a25aSBarry Smith 
947c803a25aSBarry Smith    Not Collective
948c803a25aSBarry Smith 
949c803a25aSBarry Smith    Input Parameters:
950c803a25aSBarry Smith +   x - the variable
951c803a25aSBarry Smith -   b - the constant float it is checking if x is less than or equal to
952c803a25aSBarry Smith 
953c803a25aSBarry Smith    Notes:
95487497f52SBarry Smith      The fudge factor is the value `PETSC_SMALL`
955c803a25aSBarry Smith 
956c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
957c803a25aSBarry Smith 
958c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
959c803a25aSBarry Smith      floating point results.
960c803a25aSBarry Smith 
961c803a25aSBarry Smith    Level: advanced
962c803a25aSBarry Smith 
963db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateGTE()`
964c803a25aSBarry Smith 
965c803a25aSBarry Smith M*/
96666baab88SBarry Smith #define PetscApproximateLTE(x, b) ((x) <= (PetscRealConstant(b) + PETSC_SMALL))
967c803a25aSBarry Smith 
968c803a25aSBarry Smith /*MC
96966baab88SBarry Smith     PetscApproximateGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers
970c803a25aSBarry Smith 
971c803a25aSBarry Smith    Synopsis:
972c803a25aSBarry Smith    #include <petscmath.h>
97366baab88SBarry Smith    bool PetscApproximateGTE(PetscReal x,constant float)
974c803a25aSBarry Smith 
975c803a25aSBarry Smith    Not Collective
976c803a25aSBarry Smith 
977c803a25aSBarry Smith    Input Parameters:
978c803a25aSBarry Smith +   x - the variable
979c803a25aSBarry Smith -   b - the constant float it is checking if x is greater than or equal to
980c803a25aSBarry Smith 
981c803a25aSBarry Smith    Notes:
98287497f52SBarry Smith      The fudge factor is the value `PETSC_SMALL`
983c803a25aSBarry Smith 
984c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
985c803a25aSBarry Smith 
986c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
987c803a25aSBarry Smith      floating point results.
988c803a25aSBarry Smith 
989c803a25aSBarry Smith    Level: advanced
990c803a25aSBarry Smith 
991db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()`
992c803a25aSBarry Smith 
993c803a25aSBarry Smith M*/
99466baab88SBarry Smith #define PetscApproximateGTE(x, b) ((x) >= (PetscRealConstant(b) - PETSC_SMALL))
995c803a25aSBarry Smith 
996faa75363SBarry Smith /*MC
997faa75363SBarry Smith     PetscCeilInt - Returns the ceiling of the quotation of two positive integers
998faa75363SBarry Smith 
999faa75363SBarry Smith    Synopsis:
1000faa75363SBarry Smith    #include <petscmath.h>
1001faa75363SBarry Smith    PetscInt PetscCeilInt(PetscInt x,PetscInt y)
1002faa75363SBarry Smith 
1003faa75363SBarry Smith    Not Collective
1004faa75363SBarry Smith 
1005faa75363SBarry Smith    Input Parameters:
1006faa75363SBarry Smith +   x - the numerator
1007faa75363SBarry Smith -   y - the denominator
1008faa75363SBarry Smith 
1009faa75363SBarry Smith    Level: advanced
1010faa75363SBarry Smith 
1011db781477SPatrick Sanan .seealso: `PetscMax()`, `PetscMin()`, `PetscAbsInt()`, `PetscAbsReal()`, `PetscApproximateLTE()`
1012faa75363SBarry Smith 
1013faa75363SBarry Smith M*/
1014faa75363SBarry Smith #define PetscCeilInt(x, y) ((((PetscInt)(x)) / ((PetscInt)(y))) + ((((PetscInt)(x)) % ((PetscInt)(y))) ? 1 : 0))
1015faa75363SBarry Smith 
1016faa75363SBarry Smith #define PetscCeilInt64(x, y) ((((PetscInt64)(x)) / ((PetscInt64)(y))) + ((((PetscInt64)(x)) % ((PetscInt64)(y))) ? 1 : 0))
1017faa75363SBarry Smith 
1018bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt, const PetscReal[], const PetscReal[], PetscReal *, PetscReal *);
1019e489efc1SBarry Smith #endif
1020