xref: /petsc/include/petscmath.h (revision d8d19677bbccf95218448bee62e6b87f4513e133)
1e489efc1SBarry Smith /*
2314da920SBarry Smith 
3314da920SBarry Smith     PETSc mathematics include file. Defines certain basic mathematical
4a5057860SBarry Smith     constants and functions for working with single, double, and quad precision
5a5057860SBarry Smith     floating point numbers as well as complex single and double.
6314da920SBarry Smith 
7d382aafbSBarry Smith     This file is included by petscsys.h and should not be used directly.
8e7029fe1SSatish Balay 
9e489efc1SBarry Smith */
10e489efc1SBarry Smith 
1126bd1501SBarry Smith #if !defined(PETSCMATH_H)
1226bd1501SBarry Smith #define PETSCMATH_H
130a5f7794SBarry Smith #include <math.h>
14df4397b0SStefano Zampini #include <petscsystypes.h>
15df4397b0SStefano Zampini 
165117d392SLisandro Dalcin /*
175117d392SLisandro Dalcin 
185117d392SLisandro Dalcin    Defines operations that are different for complex and real numbers.
195117d392SLisandro Dalcin    All PETSc objects in one program are built around the object
205117d392SLisandro Dalcin    PetscScalar which is either always a real or a complex.
215117d392SLisandro Dalcin 
225117d392SLisandro Dalcin */
235117d392SLisandro Dalcin 
245117d392SLisandro Dalcin /*
255117d392SLisandro Dalcin     Real number definitions
265117d392SLisandro Dalcin  */
275117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
285117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrtf(a)
295117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrtf(a)
305117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypotf(a,b)
315117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2f(a,b)
325117d392SLisandro Dalcin #define PetscPowReal(a,b)      powf(a,b)
335117d392SLisandro Dalcin #define PetscExpReal(a)        expf(a)
345117d392SLisandro Dalcin #define PetscLogReal(a)        logf(a)
355117d392SLisandro Dalcin #define PetscLog10Real(a)      log10f(a)
365117d392SLisandro Dalcin #define PetscLog2Real(a)       log2f(a)
375117d392SLisandro Dalcin #define PetscSinReal(a)        sinf(a)
385117d392SLisandro Dalcin #define PetscCosReal(a)        cosf(a)
395117d392SLisandro Dalcin #define PetscTanReal(a)        tanf(a)
405117d392SLisandro Dalcin #define PetscAsinReal(a)       asinf(a)
415117d392SLisandro Dalcin #define PetscAcosReal(a)       acosf(a)
425117d392SLisandro Dalcin #define PetscAtanReal(a)       atanf(a)
435117d392SLisandro Dalcin #define PetscSinhReal(a)       sinhf(a)
445117d392SLisandro Dalcin #define PetscCoshReal(a)       coshf(a)
455117d392SLisandro Dalcin #define PetscTanhReal(a)       tanhf(a)
465117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinhf(a)
475117d392SLisandro Dalcin #define PetscAcoshReal(a)      acoshf(a)
485117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanhf(a)
495117d392SLisandro Dalcin #define PetscCeilReal(a)       ceilf(a)
505117d392SLisandro Dalcin #define PetscFloorReal(a)      floorf(a)
515117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmodf(a,b)
529c3ee494SJed Brown #define PetscCopysignReal(a,b) copysignf(a,b)
535117d392SLisandro Dalcin #define PetscTGamma(a)         tgammaf(a)
541f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
551f17fa70SToby Isaac #define PetscLGamma(a)         gammaf(a)
561f17fa70SToby Isaac #else
571f17fa70SToby Isaac #define PetscLGamma(a)         lgammaf(a)
581f17fa70SToby Isaac #endif
595117d392SLisandro Dalcin 
605117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
615117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrt(a)
625117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrt(a)
635117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypot(a,b)
645117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2(a,b)
655117d392SLisandro Dalcin #define PetscPowReal(a,b)      pow(a,b)
665117d392SLisandro Dalcin #define PetscExpReal(a)        exp(a)
675117d392SLisandro Dalcin #define PetscLogReal(a)        log(a)
685117d392SLisandro Dalcin #define PetscLog10Real(a)      log10(a)
695117d392SLisandro Dalcin #define PetscLog2Real(a)       log2(a)
705117d392SLisandro Dalcin #define PetscSinReal(a)        sin(a)
715117d392SLisandro Dalcin #define PetscCosReal(a)        cos(a)
725117d392SLisandro Dalcin #define PetscTanReal(a)        tan(a)
735117d392SLisandro Dalcin #define PetscAsinReal(a)       asin(a)
745117d392SLisandro Dalcin #define PetscAcosReal(a)       acos(a)
755117d392SLisandro Dalcin #define PetscAtanReal(a)       atan(a)
765117d392SLisandro Dalcin #define PetscSinhReal(a)       sinh(a)
775117d392SLisandro Dalcin #define PetscCoshReal(a)       cosh(a)
785117d392SLisandro Dalcin #define PetscTanhReal(a)       tanh(a)
795117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinh(a)
805117d392SLisandro Dalcin #define PetscAcoshReal(a)      acosh(a)
815117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanh(a)
825117d392SLisandro Dalcin #define PetscCeilReal(a)       ceil(a)
835117d392SLisandro Dalcin #define PetscFloorReal(a)      floor(a)
845117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmod(a,b)
859c3ee494SJed Brown #define PetscCopysignReal(a,b) copysign(a,b)
865117d392SLisandro Dalcin #define PetscTGamma(a)         tgamma(a)
871f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
881f17fa70SToby Isaac #define PetscLGamma(a)         gamma(a)
891f17fa70SToby Isaac #else
901f17fa70SToby Isaac #define PetscLGamma(a)         lgamma(a)
911f17fa70SToby Isaac #endif
925117d392SLisandro Dalcin 
935117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
945117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrtq(a)
955117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrtq(a)
965117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypotq(a,b)
975117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2q(a,b)
985117d392SLisandro Dalcin #define PetscPowReal(a,b)      powq(a,b)
995117d392SLisandro Dalcin #define PetscExpReal(a)        expq(a)
1005117d392SLisandro Dalcin #define PetscLogReal(a)        logq(a)
1015117d392SLisandro Dalcin #define PetscLog10Real(a)      log10q(a)
1025117d392SLisandro Dalcin #define PetscLog2Real(a)       log2q(a)
1035117d392SLisandro Dalcin #define PetscSinReal(a)        sinq(a)
1045117d392SLisandro Dalcin #define PetscCosReal(a)        cosq(a)
1055117d392SLisandro Dalcin #define PetscTanReal(a)        tanq(a)
1065117d392SLisandro Dalcin #define PetscAsinReal(a)       asinq(a)
1075117d392SLisandro Dalcin #define PetscAcosReal(a)       acosq(a)
1085117d392SLisandro Dalcin #define PetscAtanReal(a)       atanq(a)
1095117d392SLisandro Dalcin #define PetscSinhReal(a)       sinhq(a)
1105117d392SLisandro Dalcin #define PetscCoshReal(a)       coshq(a)
1115117d392SLisandro Dalcin #define PetscTanhReal(a)       tanhq(a)
1125117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinhq(a)
1135117d392SLisandro Dalcin #define PetscAcoshReal(a)      acoshq(a)
1145117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanhq(a)
1155117d392SLisandro Dalcin #define PetscCeilReal(a)       ceilq(a)
1165117d392SLisandro Dalcin #define PetscFloorReal(a)      floorq(a)
1175117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmodq(a,b)
1189c3ee494SJed Brown #define PetscCopysignReal(a,b) copysignq(a,b)
1195117d392SLisandro Dalcin #define PetscTGamma(a)         tgammaq(a)
1201f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1211f17fa70SToby Isaac #define PetscLGamma(a)         gammaq(a)
1221f17fa70SToby Isaac #else
1231f17fa70SToby Isaac #define PetscLGamma(a)         lgammaq(a)
1241f17fa70SToby Isaac #endif
1255117d392SLisandro Dalcin 
1265117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
1275117d392SLisandro Dalcin #define PetscSqrtReal(a)       sqrtf(a)
1285117d392SLisandro Dalcin #define PetscCbrtReal(a)       cbrtf(a)
1295117d392SLisandro Dalcin #define PetscHypotReal(a,b)    hypotf(a,b)
1305117d392SLisandro Dalcin #define PetscAtan2Real(a,b)    atan2f(a,b)
1315117d392SLisandro Dalcin #define PetscPowReal(a,b)      powf(a,b)
1325117d392SLisandro Dalcin #define PetscExpReal(a)        expf(a)
1335117d392SLisandro Dalcin #define PetscLogReal(a)        logf(a)
1345117d392SLisandro Dalcin #define PetscLog10Real(a)      log10f(a)
1355117d392SLisandro Dalcin #define PetscLog2Real(a)       log2f(a)
1365117d392SLisandro Dalcin #define PetscSinReal(a)        sinf(a)
1375117d392SLisandro Dalcin #define PetscCosReal(a)        cosf(a)
1385117d392SLisandro Dalcin #define PetscTanReal(a)        tanf(a)
1395117d392SLisandro Dalcin #define PetscAsinReal(a)       asinf(a)
1405117d392SLisandro Dalcin #define PetscAcosReal(a)       acosf(a)
1415117d392SLisandro Dalcin #define PetscAtanReal(a)       atanf(a)
1425117d392SLisandro Dalcin #define PetscSinhReal(a)       sinhf(a)
1435117d392SLisandro Dalcin #define PetscCoshReal(a)       coshf(a)
1445117d392SLisandro Dalcin #define PetscTanhReal(a)       tanhf(a)
1455117d392SLisandro Dalcin #define PetscAsinhReal(a)      asinhf(a)
1465117d392SLisandro Dalcin #define PetscAcoshReal(a)      acoshf(a)
1475117d392SLisandro Dalcin #define PetscAtanhReal(a)      atanhf(a)
1485117d392SLisandro Dalcin #define PetscCeilReal(a)       ceilf(a)
1495117d392SLisandro Dalcin #define PetscFloorReal(a)      floorf(a)
1505117d392SLisandro Dalcin #define PetscFmodReal(a,b)     fmodf(a,b)
1519c3ee494SJed Brown #define PetscCopySignReal(a,b) copysignf(a,b)
1525117d392SLisandro Dalcin #define PetscTGamma(a)         tgammaf(a)
1531f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1541f17fa70SToby Isaac #define PetscLGamma(a)         gammaf(a)
1551f17fa70SToby Isaac #else
1561f17fa70SToby Isaac #define PetscLGamma(a)         lgammaf(a)
1571f17fa70SToby Isaac #endif
1585117d392SLisandro Dalcin 
1595117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
1605117d392SLisandro Dalcin 
1615117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscReal PetscSignReal(PetscReal a)
1625117d392SLisandro Dalcin {
1635117d392SLisandro Dalcin   return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0));
1645117d392SLisandro Dalcin }
1655117d392SLisandro Dalcin 
1665117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2)
1675117d392SLisandro Dalcin #undef PetscLog2Real
1685117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscReal PetscLog2Real(PetscReal a)
1695117d392SLisandro Dalcin {
1705117d392SLisandro Dalcin   return PetscLogReal(a)/PetscLogReal((PetscReal)2);
1715117d392SLisandro Dalcin }
1725117d392SLisandro Dalcin #endif
1735117d392SLisandro Dalcin 
1745117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
1755117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PetscAttrMPITypeTag(__float128);
1765117d392SLisandro Dalcin #endif
1775117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FP16)
1785117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FP16 PetscAttrMPITypeTag(__fp16);
1795117d392SLisandro Dalcin #endif
1805117d392SLisandro Dalcin 
181df4397b0SStefano Zampini /*MC
182df4397b0SStefano Zampini    MPIU_REAL - MPI datatype corresponding to PetscReal
183df4397b0SStefano Zampini 
184df4397b0SStefano Zampini    Notes:
185df4397b0SStefano Zampini    In MPI calls that require an MPI datatype that matches a PetscReal or array of PetscReal values, pass this value.
186df4397b0SStefano Zampini 
187df4397b0SStefano Zampini    Level: beginner
188df4397b0SStefano Zampini 
189df4397b0SStefano Zampini .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
190df4397b0SStefano Zampini M*/
191c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE)
192c1d390e3SJed Brown #  define MPIU_REAL MPI_FLOAT
193c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE)
194c1d390e3SJed Brown #  define MPIU_REAL MPI_DOUBLE
195c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128)
196c1d390e3SJed Brown #  define MPIU_REAL MPIU___FLOAT128
197570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
198570b7f6dSBarry Smith #  define MPIU_REAL MPIU___FP16
199c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */
20059cb5930SBarry Smith 
2011093a601SBarry Smith /*
2021093a601SBarry Smith     Complex number definitions
2031093a601SBarry Smith  */
204df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX)
205450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128)
2061093a601SBarry Smith /* C++ support of complex number */
207b7940d39SSatish Balay 
20850f81f78SJed Brown #define PetscRealPartComplex(a)      (a).real()
20950f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag()
210df4397b0SStefano Zampini #define PetscAbsComplex(a)           petsccomplexlib::abs(a)
2115117d392SLisandro Dalcin #define PetscArgComplex(a)           petsccomplexlib::arg(a)
212df4397b0SStefano Zampini #define PetscConjComplex(a)          petsccomplexlib::conj(a)
213df4397b0SStefano Zampini #define PetscSqrtComplex(a)          petsccomplexlib::sqrt(a)
214df4397b0SStefano Zampini #define PetscPowComplex(a,b)         petsccomplexlib::pow(a,b)
215df4397b0SStefano Zampini #define PetscExpComplex(a)           petsccomplexlib::exp(a)
216df4397b0SStefano Zampini #define PetscLogComplex(a)           petsccomplexlib::log(a)
217df4397b0SStefano Zampini #define PetscSinComplex(a)           petsccomplexlib::sin(a)
218df4397b0SStefano Zampini #define PetscCosComplex(a)           petsccomplexlib::cos(a)
2195117d392SLisandro Dalcin #define PetscTanComplex(a)           petsccomplexlib::tan(a)
220df4397b0SStefano Zampini #define PetscAsinComplex(a)          petsccomplexlib::asin(a)
221df4397b0SStefano Zampini #define PetscAcosComplex(a)          petsccomplexlib::acos(a)
2225117d392SLisandro Dalcin #define PetscAtanComplex(a)          petsccomplexlib::atan(a)
223df4397b0SStefano Zampini #define PetscSinhComplex(a)          petsccomplexlib::sinh(a)
224df4397b0SStefano Zampini #define PetscCoshComplex(a)          petsccomplexlib::cosh(a)
225df4397b0SStefano Zampini #define PetscTanhComplex(a)          petsccomplexlib::tanh(a)
2265117d392SLisandro Dalcin #define PetscAsinhComplex(a)         petsccomplexlib::asinh(a)
2275117d392SLisandro Dalcin #define PetscAcoshComplex(a)         petsccomplexlib::acosh(a)
2285117d392SLisandro Dalcin #define PetscAtanhComplex(a)         petsccomplexlib::atanh(a)
2295117d392SLisandro Dalcin 
2305117d392SLisandro Dalcin /* TODO: Add configure tests
2315117d392SLisandro Dalcin 
2325117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX)
2335117d392SLisandro Dalcin #undef PetscTanComplex
2345117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscTanComplex(PetscComplex z)
2355117d392SLisandro Dalcin {
2365117d392SLisandro Dalcin   return PetscSinComplex(z)/PetscCosComplex(z);
2375117d392SLisandro Dalcin }
238027d9794SBarry Smith #endif
239debe9ee2SPaul Mullowney 
2405117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX)
2415117d392SLisandro Dalcin #undef PetscTanhComplex
2425117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscTanhComplex(PetscComplex z)
2435117d392SLisandro Dalcin {
2445117d392SLisandro Dalcin   return PetscSinhComplex(z)/PetscCoshComplex(z);
2455117d392SLisandro Dalcin }
2465117d392SLisandro Dalcin #endif
2475117d392SLisandro Dalcin 
2485117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX)
2495117d392SLisandro Dalcin #undef PetscAsinComplex
2505117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAsinComplex(PetscComplex z)
2515117d392SLisandro Dalcin {
2525117d392SLisandro Dalcin   const PetscComplex j(0,1);
2535117d392SLisandro Dalcin   return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z));
2545117d392SLisandro Dalcin }
2555117d392SLisandro Dalcin #endif
2565117d392SLisandro Dalcin 
2575117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX)
2585117d392SLisandro Dalcin #undef PetscAcosComplex
2595117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAcosComplex(PetscComplex z)
2605117d392SLisandro Dalcin {
2615117d392SLisandro Dalcin   const PetscComplex j(0,1);
2625117d392SLisandro Dalcin   return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z));
2635117d392SLisandro Dalcin }
2645117d392SLisandro Dalcin #endif
2655117d392SLisandro Dalcin 
2665117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX)
2675117d392SLisandro Dalcin #undef PetscAtanComplex
2685117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAtanComplex(PetscComplex z)
2695117d392SLisandro Dalcin {
2705117d392SLisandro Dalcin   const PetscComplex j(0,1);
2715117d392SLisandro Dalcin   return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z));
2725117d392SLisandro Dalcin }
2735117d392SLisandro Dalcin #endif
2745117d392SLisandro Dalcin 
2755117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX)
2765117d392SLisandro Dalcin #undef PetscAsinhComplex
2775117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAsinhComplex(PetscComplex z)
2785117d392SLisandro Dalcin {
2795117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f));
2805117d392SLisandro Dalcin }
2815117d392SLisandro Dalcin #endif
2825117d392SLisandro Dalcin 
2835117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX)
2845117d392SLisandro Dalcin #undef PetscAcoshComplex
2855117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAcoshComplex(PetscComplex z)
2865117d392SLisandro Dalcin {
2875117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z-1.0f));
2885117d392SLisandro Dalcin }
2895117d392SLisandro Dalcin #endif
2905117d392SLisandro Dalcin 
2915117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATANH_COMPLEX)
2925117d392SLisandro Dalcin #undef PetscAtanhComplex
2935117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAtanhComplex(PetscComplex z)
2945117d392SLisandro Dalcin {
2955117d392SLisandro Dalcin   return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z));
2965117d392SLisandro Dalcin }
2975117d392SLisandro Dalcin #endif
2985117d392SLisandro Dalcin 
2995117d392SLisandro Dalcin */
3005117d392SLisandro Dalcin 
3017a19d461SSatish Balay #else /* C99 support of complex number */
302519e2a1fSPaul Mullowney 
3037a19d461SSatish Balay #if defined(PETSC_USE_REAL_SINGLE)
30450f81f78SJed Brown #define PetscRealPartComplex(a)      crealf(a)
30550f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a)
30650f81f78SJed Brown #define PetscAbsComplex(a)           cabsf(a)
3075117d392SLisandro Dalcin #define PetscArgComplex(a)           cargf(a)
30850f81f78SJed Brown #define PetscConjComplex(a)          conjf(a)
30950f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtf(a)
31050f81f78SJed Brown #define PetscPowComplex(a,b)         cpowf(a,b)
31150f81f78SJed Brown #define PetscExpComplex(a)           cexpf(a)
31250f81f78SJed Brown #define PetscLogComplex(a)           clogf(a)
31350f81f78SJed Brown #define PetscSinComplex(a)           csinf(a)
31450f81f78SJed Brown #define PetscCosComplex(a)           ccosf(a)
3155117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanf(a)
316255453a1SBarry Smith #define PetscAsinComplex(a)          casinf(a)
317255453a1SBarry Smith #define PetscAcosComplex(a)          cacosf(a)
3185117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanf(a)
319a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhf(a)
320a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshf(a)
321a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhf(a)
3225117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhf(a)
3235117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshf(a)
3245117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhf(a)
3251093a601SBarry Smith 
326ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
32750f81f78SJed Brown #define PetscRealPartComplex(a)      creal(a)
32850f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a)
32950f81f78SJed Brown #define PetscAbsComplex(a)           cabs(a)
3305117d392SLisandro Dalcin #define PetscArgComplex(a)           carg(a)
33150f81f78SJed Brown #define PetscConjComplex(a)          conj(a)
33250f81f78SJed Brown #define PetscSqrtComplex(a)          csqrt(a)
33350f81f78SJed Brown #define PetscPowComplex(a,b)         cpow(a,b)
33450f81f78SJed Brown #define PetscExpComplex(a)           cexp(a)
33550f81f78SJed Brown #define PetscLogComplex(a)           clog(a)
33650f81f78SJed Brown #define PetscSinComplex(a)           csin(a)
33750f81f78SJed Brown #define PetscCosComplex(a)           ccos(a)
3385117d392SLisandro Dalcin #define PetscTanComplex(a)           ctan(a)
339255453a1SBarry Smith #define PetscAsinComplex(a)          casin(a)
340255453a1SBarry Smith #define PetscAcosComplex(a)          cacos(a)
3415117d392SLisandro Dalcin #define PetscAtanComplex(a)          catan(a)
342a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinh(a)
343a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccosh(a)
344a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanh(a)
3455117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinh(a)
3465117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacosh(a)
3475117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanh(a)
3481093a601SBarry Smith 
3498c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128)
35050f81f78SJed Brown #define PetscRealPartComplex(a)      crealq(a)
35150f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a)
35250f81f78SJed Brown #define PetscAbsComplex(a)           cabsq(a)
3535117d392SLisandro Dalcin #define PetscArgComplex(a)           cargq(a)
35450f81f78SJed Brown #define PetscConjComplex(a)          conjq(a)
35550f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtq(a)
35650f81f78SJed Brown #define PetscPowComplex(a,b)         cpowq(a,b)
35750f81f78SJed Brown #define PetscExpComplex(a)           cexpq(a)
35850f81f78SJed Brown #define PetscLogComplex(a)           clogq(a)
35950f81f78SJed Brown #define PetscSinComplex(a)           csinq(a)
36050f81f78SJed Brown #define PetscCosComplex(a)           ccosq(a)
3615117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanq(a)
362255453a1SBarry Smith #define PetscAsinComplex(a)          casinq(a)
363255453a1SBarry Smith #define PetscAcosComplex(a)          cacosq(a)
3645117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanq(a)
365a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhq(a)
366a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshq(a)
367a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhq(a)
3685117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhq(a)
3695117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshq(a)
3705117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhq(a)
371a4bea5a6SPeter Brune 
372ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */
3737a19d461SSatish Balay #endif /* (__cplusplus) */
374e489efc1SBarry Smith 
3751093a601SBarry Smith /*
3765117d392SLisandro Dalcin    PETSC_i is the imaginary number, i
3771093a601SBarry Smith */
37850f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i;
3798a351411SToby Isaac 
3805117d392SLisandro Dalcin /*
3815117d392SLisandro Dalcin    Try to do the right thing for complex number construction: see
3828a351411SToby Isaac    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm
3838a351411SToby Isaac    for details
3848a351411SToby Isaac */
38519e222d7SToby Isaac PETSC_STATIC_INLINE PetscComplex PetscCMPLX(PetscReal x, PetscReal y)
3868a351411SToby Isaac {
387450fc7c9SSatish Balay #if defined(__cplusplus) && !defined(PETSC_USE_REAL___FLOAT128)
3888a351411SToby Isaac   return PetscComplex(x,y);
3898a351411SToby Isaac #elif defined(_Imaginary_I)
3908a351411SToby Isaac   return x + y * _Imaginary_I;
3918a351411SToby Isaac #else
392616d7c5eSToby Isaac   { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5),
393616d7c5eSToby Isaac 
394616d7c5eSToby Isaac        "For each floating type there is a corresponding real type, which is always a real floating
395616d7c5eSToby Isaac        type. For real floating types, it is the same type. For complex types, it is the type given
396616d7c5eSToby Isaac        by deleting the keyword _Complex from the type name."
397616d7c5eSToby Isaac 
398616d7c5eSToby Isaac        So type punning should be portable. */
399616d7c5eSToby Isaac     union { PetscComplex z; PetscReal f[2]; } uz;
400616d7c5eSToby Isaac 
401616d7c5eSToby Isaac     uz.f[0] = x;
402616d7c5eSToby Isaac     uz.f[1] = y;
403616d7c5eSToby Isaac     return uz.z;
404616d7c5eSToby Isaac   }
40550f81f78SJed Brown #endif
4068a351411SToby Isaac }
4078a351411SToby Isaac 
408de272c7aSSatish 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)\"")
409de272c7aSSatish 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)\"")
410de272c7aSSatish Balay 
4115117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
4125117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 PetscAttrMPITypeTag(__complex128);
4135117d392SLisandro Dalcin #endif /* PETSC_USE_REAL___FLOAT128 */
4145117d392SLisandro Dalcin 
4155117d392SLisandro Dalcin /*MC
4165117d392SLisandro Dalcin    MPIU_COMPLEX - MPI datatype corresponding to PetscComplex
4175117d392SLisandro Dalcin 
4185117d392SLisandro Dalcin    Notes:
4195117d392SLisandro Dalcin    In MPI calls that require an MPI datatype that matches a PetscComplex or array of PetscComplex values, pass this value.
4205117d392SLisandro Dalcin 
4215117d392SLisandro Dalcin    Level: beginner
4225117d392SLisandro Dalcin 
4235117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i
4245117d392SLisandro Dalcin M*/
4255117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
426de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_COMPLEX
4275117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
428de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX
4295117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
4305117d392SLisandro Dalcin #  define MPIU_COMPLEX MPIU___COMPLEX128
4315117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
432de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_COMPLEX
4335117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
4345117d392SLisandro Dalcin 
4355117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */
4365117d392SLisandro Dalcin 
4375117d392SLisandro Dalcin /*
4385117d392SLisandro Dalcin     Scalar number definitions
4395117d392SLisandro Dalcin  */
4407a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX)
4415117d392SLisandro Dalcin /*MC
4425117d392SLisandro Dalcin    MPIU_SCALAR - MPI datatype corresponding to PetscScalar
4435117d392SLisandro Dalcin 
4445117d392SLisandro Dalcin    Notes:
4455117d392SLisandro Dalcin    In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalar values, pass this value.
4465117d392SLisandro Dalcin 
4475117d392SLisandro Dalcin    Level: beginner
4485117d392SLisandro Dalcin 
4495117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_COMPLEX, MPIU_INT
4505117d392SLisandro Dalcin M*/
4515117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX
4525117d392SLisandro Dalcin 
4535117d392SLisandro Dalcin /*MC
4545117d392SLisandro Dalcin    PetscRealPart - Returns the real part of a PetscScalar
4555117d392SLisandro Dalcin 
4565117d392SLisandro Dalcin    Synopsis:
4575117d392SLisandro Dalcin    #include <petscmath.h>
4585117d392SLisandro Dalcin    PetscReal PetscRealPart(PetscScalar v)
4595117d392SLisandro Dalcin 
4605117d392SLisandro Dalcin    Not Collective
4615117d392SLisandro Dalcin 
4625117d392SLisandro Dalcin    Input Parameter:
4635117d392SLisandro Dalcin .  v - value to find the real part of
4645117d392SLisandro Dalcin 
4655117d392SLisandro Dalcin    Level: beginner
4665117d392SLisandro Dalcin 
4675117d392SLisandro Dalcin .seealso: PetscScalar, PetscImaginaryPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
4685117d392SLisandro Dalcin 
4695117d392SLisandro Dalcin M*/
4705117d392SLisandro Dalcin #define PetscRealPart(a)      PetscRealPartComplex(a)
4715117d392SLisandro Dalcin 
4725117d392SLisandro Dalcin /*MC
4735117d392SLisandro Dalcin    PetscImaginaryPart - Returns the imaginary part of a PetscScalar
4745117d392SLisandro Dalcin 
4755117d392SLisandro Dalcin    Synopsis:
4765117d392SLisandro Dalcin    #include <petscmath.h>
4775117d392SLisandro Dalcin    PetscReal PetscImaginaryPart(PetscScalar v)
4785117d392SLisandro Dalcin 
4795117d392SLisandro Dalcin    Not Collective
4805117d392SLisandro Dalcin 
4815117d392SLisandro Dalcin    Input Parameter:
4825117d392SLisandro Dalcin .  v - value to find the imaginary part of
4835117d392SLisandro Dalcin 
4845117d392SLisandro Dalcin    Level: beginner
4855117d392SLisandro Dalcin 
4865117d392SLisandro Dalcin    Notes:
4875117d392SLisandro Dalcin        If PETSc was configured for real numbers then this always returns the value 0
4885117d392SLisandro Dalcin 
4895117d392SLisandro Dalcin .seealso: PetscScalar, PetscRealPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
4905117d392SLisandro Dalcin 
4915117d392SLisandro Dalcin M*/
4925117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a)
4935117d392SLisandro Dalcin 
4945117d392SLisandro Dalcin #define PetscAbsScalar(a)     PetscAbsComplex(a)
4955117d392SLisandro Dalcin #define PetscArgScalar(a)     PetscArgComplex(a)
4965117d392SLisandro Dalcin #define PetscConj(a)          PetscConjComplex(a)
4975117d392SLisandro Dalcin #define PetscSqrtScalar(a)    PetscSqrtComplex(a)
4985117d392SLisandro Dalcin #define PetscPowScalar(a,b)   PetscPowComplex(a,b)
4995117d392SLisandro Dalcin #define PetscExpScalar(a)     PetscExpComplex(a)
5005117d392SLisandro Dalcin #define PetscLogScalar(a)     PetscLogComplex(a)
5015117d392SLisandro Dalcin #define PetscSinScalar(a)     PetscSinComplex(a)
5025117d392SLisandro Dalcin #define PetscCosScalar(a)     PetscCosComplex(a)
5035117d392SLisandro Dalcin #define PetscTanScalar(a)     PetscTanComplex(a)
5045117d392SLisandro Dalcin #define PetscAsinScalar(a)    PetscAsinComplex(a)
5055117d392SLisandro Dalcin #define PetscAcosScalar(a)    PetscAcosComplex(a)
5065117d392SLisandro Dalcin #define PetscAtanScalar(a)    PetscAtanComplex(a)
5075117d392SLisandro Dalcin #define PetscSinhScalar(a)    PetscSinhComplex(a)
5085117d392SLisandro Dalcin #define PetscCoshScalar(a)    PetscCoshComplex(a)
5095117d392SLisandro Dalcin #define PetscTanhScalar(a)    PetscTanhComplex(a)
5105117d392SLisandro Dalcin #define PetscAsinhScalar(a)   PetscAsinhComplex(a)
5115117d392SLisandro Dalcin #define PetscAcoshScalar(a)   PetscAcoshComplex(a)
5125117d392SLisandro Dalcin #define PetscAtanhScalar(a)   PetscAtanhComplex(a)
5135117d392SLisandro Dalcin 
5145117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */
5155117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_REAL
5165117d392SLisandro Dalcin #define PetscRealPart(a)      (a)
5175117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0)
5185117d392SLisandro Dalcin #define PetscAbsScalar(a)     PetscAbsReal(a)
5195117d392SLisandro Dalcin #define PetscArgScalar(a)     (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0)
5205117d392SLisandro Dalcin #define PetscConj(a)          (a)
5215117d392SLisandro Dalcin #define PetscSqrtScalar(a)    PetscSqrtReal(a)
5225117d392SLisandro Dalcin #define PetscPowScalar(a,b)   PetscPowReal(a,b)
5235117d392SLisandro Dalcin #define PetscExpScalar(a)     PetscExpReal(a)
5245117d392SLisandro Dalcin #define PetscLogScalar(a)     PetscLogReal(a)
5255117d392SLisandro Dalcin #define PetscSinScalar(a)     PetscSinReal(a)
5265117d392SLisandro Dalcin #define PetscCosScalar(a)     PetscCosReal(a)
5275117d392SLisandro Dalcin #define PetscTanScalar(a)     PetscTanReal(a)
5285117d392SLisandro Dalcin #define PetscAsinScalar(a)    PetscAsinReal(a)
5295117d392SLisandro Dalcin #define PetscAcosScalar(a)    PetscAcosReal(a)
5305117d392SLisandro Dalcin #define PetscAtanScalar(a)    PetscAtanReal(a)
5315117d392SLisandro Dalcin #define PetscSinhScalar(a)    PetscSinhReal(a)
5325117d392SLisandro Dalcin #define PetscCoshScalar(a)    PetscCoshReal(a)
5335117d392SLisandro Dalcin #define PetscTanhScalar(a)    PetscTanhReal(a)
5345117d392SLisandro Dalcin #define PetscAsinhScalar(a)   PetscAsinhReal(a)
5355117d392SLisandro Dalcin #define PetscAcoshScalar(a)   PetscAcoshReal(a)
5365117d392SLisandro Dalcin #define PetscAtanhScalar(a)   PetscAtanhReal(a)
5375117d392SLisandro Dalcin 
5385117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */
5395117d392SLisandro Dalcin 
5405117d392SLisandro Dalcin /*
5415117d392SLisandro Dalcin    Certain objects may be created using either single or double precision.
5425117d392SLisandro Dalcin    This is currently not used.
5435117d392SLisandro Dalcin */
5445117d392SLisandro Dalcin typedef enum { PETSC_SCALAR_DOUBLE, PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE, PETSC_SCALAR_HALF } PetscScalarPrecision;
5455117d392SLisandro Dalcin 
5465117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/
5475117d392SLisandro Dalcin 
5485117d392SLisandro Dalcin /*MC
5495117d392SLisandro Dalcin    PetscAbs - Returns the absolute value of a number
5505117d392SLisandro Dalcin 
5515117d392SLisandro Dalcin    Synopsis:
5525117d392SLisandro Dalcin    #include <petscmath.h>
5535117d392SLisandro Dalcin    type PetscAbs(type v)
5545117d392SLisandro Dalcin 
5555117d392SLisandro Dalcin    Not Collective
5565117d392SLisandro Dalcin 
5575117d392SLisandro Dalcin    Input Parameter:
5585117d392SLisandro Dalcin .  v - the number
5595117d392SLisandro Dalcin 
5605117d392SLisandro Dalcin    Notes:
5615117d392SLisandro Dalcin     type can be integer or real floating point value
5625117d392SLisandro Dalcin 
5635117d392SLisandro Dalcin    Level: beginner
5645117d392SLisandro Dalcin 
5655117d392SLisandro Dalcin .seealso: PetscAbsInt(), PetscAbsReal(), PetscAbsScalar()
5665117d392SLisandro Dalcin 
5675117d392SLisandro Dalcin M*/
5685117d392SLisandro Dalcin #define PetscAbs(a)  (((a) >= 0) ? (a) : (-(a)))
5695117d392SLisandro Dalcin 
5705117d392SLisandro Dalcin /*MC
5715117d392SLisandro Dalcin    PetscSign - Returns the sign of a number as an integer
5725117d392SLisandro Dalcin 
5735117d392SLisandro Dalcin    Synopsis:
5745117d392SLisandro Dalcin    #include <petscmath.h>
5755117d392SLisandro Dalcin    int PetscSign(type v)
5765117d392SLisandro Dalcin 
5775117d392SLisandro Dalcin    Not Collective
5785117d392SLisandro Dalcin 
5795117d392SLisandro Dalcin    Input Parameter:
5805117d392SLisandro Dalcin .  v - the number
5815117d392SLisandro Dalcin 
5825117d392SLisandro Dalcin    Notes:
5835117d392SLisandro Dalcin     type can be integer or real floating point value
5845117d392SLisandro Dalcin 
5855117d392SLisandro Dalcin    Level: beginner
5865117d392SLisandro Dalcin 
5875117d392SLisandro Dalcin M*/
5885117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
589e489efc1SBarry Smith 
590b6a5bde7SBarry Smith /*MC
591b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
592b6a5bde7SBarry Smith 
593eca87e8dSBarry Smith    Synopsis:
594aaa7dc30SBarry Smith    #include <petscmath.h>
595eca87e8dSBarry Smith    type PetscMin(type v1,type v2)
596eca87e8dSBarry Smith 
597eca87e8dSBarry Smith    Not Collective
598eca87e8dSBarry Smith 
599*d8d19677SJose E. Roman    Input Parameters:
600b6a5bde7SBarry Smith +  v1 - first value to find minimum of
601b6a5bde7SBarry Smith -  v2 - second value to find minimum of
602b6a5bde7SBarry Smith 
60395452b02SPatrick Sanan    Notes:
60495452b02SPatrick Sanan     type can be integer or floating point value
605b6a5bde7SBarry Smith 
606b6a5bde7SBarry Smith    Level: beginner
607b6a5bde7SBarry Smith 
6081175f9beSHong Zhang .seealso: PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
609b6a5bde7SBarry Smith 
610b6a5bde7SBarry Smith M*/
611e489efc1SBarry Smith #define PetscMin(a,b)   (((a)<(b)) ?  (a) : (b))
612b6a5bde7SBarry Smith 
613b6a5bde7SBarry Smith /*MC
614b6a5bde7SBarry Smith    PetscMax - Returns maxium of two numbers
615b6a5bde7SBarry Smith 
616eca87e8dSBarry Smith    Synopsis:
617aaa7dc30SBarry Smith    #include <petscmath.h>
618eca87e8dSBarry Smith    type max PetscMax(type v1,type v2)
619eca87e8dSBarry Smith 
620eca87e8dSBarry Smith    Not Collective
621eca87e8dSBarry Smith 
622*d8d19677SJose E. Roman    Input Parameters:
623b6a5bde7SBarry Smith +  v1 - first value to find maximum of
624b6a5bde7SBarry Smith -  v2 - second value to find maximum of
625b6a5bde7SBarry Smith 
62695452b02SPatrick Sanan    Notes:
62795452b02SPatrick Sanan     type can be integer or floating point value
628b6a5bde7SBarry Smith 
629b6a5bde7SBarry Smith    Level: beginner
630b6a5bde7SBarry Smith 
631d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
632b6a5bde7SBarry Smith 
633b6a5bde7SBarry Smith M*/
634e489efc1SBarry Smith #define PetscMax(a,b)   (((a)<(b)) ?  (b) : (a))
635b6a5bde7SBarry Smith 
636b6a5bde7SBarry Smith /*MC
637d9a4bb16SJed Brown    PetscClipInterval - Returns a number clipped to be within an interval
638d9a4bb16SJed Brown 
639d9a4bb16SJed Brown    Synopsis:
640aaa7dc30SBarry Smith    #include <petscmath.h>
641d9a4bb16SJed Brown    type clip PetscClipInterval(type x,type a,type b)
642d9a4bb16SJed Brown 
643d9a4bb16SJed Brown    Not Collective
644d9a4bb16SJed Brown 
645*d8d19677SJose E. Roman    Input Parameters:
6460d398bfeSStefano Zampini +  x - value to use if within interval [a,b]
647d9a4bb16SJed Brown .  a - lower end of interval
648d9a4bb16SJed Brown -  b - upper end of interval
649d9a4bb16SJed Brown 
65095452b02SPatrick Sanan    Notes:
65195452b02SPatrick Sanan     type can be integer or floating point value
652d9a4bb16SJed Brown 
653d9a4bb16SJed Brown    Level: beginner
654d9a4bb16SJed Brown 
655d9a4bb16SJed Brown .seealso: PetscMin(), PetscMax(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
656d9a4bb16SJed Brown 
657d9a4bb16SJed Brown M*/
658d9a4bb16SJed Brown #define PetscClipInterval(x,a,b)   (PetscMax((a),PetscMin((x),(b))))
659d9a4bb16SJed Brown 
660d9a4bb16SJed Brown /*MC
661b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
662b6a5bde7SBarry Smith 
663b6a5bde7SBarry Smith    Synopsis:
664aaa7dc30SBarry Smith    #include <petscmath.h>
665b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
666b6a5bde7SBarry Smith 
667eca87e8dSBarry Smith    Not Collective
668eca87e8dSBarry Smith 
669eca87e8dSBarry Smith    Input Parameter:
670eca87e8dSBarry Smith .   v1 - the integer
671b6a5bde7SBarry Smith 
672b6a5bde7SBarry Smith    Level: beginner
673b6a5bde7SBarry Smith 
674b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr()
675b6a5bde7SBarry Smith 
676b6a5bde7SBarry Smith M*/
6779fa7d148SSatish Balay #define PetscAbsInt(a)  (((a)<0)   ? (-(a)) : (a))
678b6a5bde7SBarry Smith 
679b6a5bde7SBarry Smith /*MC
680b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
681b6a5bde7SBarry Smith 
682eca87e8dSBarry Smith    Synopsis:
683aaa7dc30SBarry Smith    #include <petscmath.h>
684eca87e8dSBarry Smith    Real abs PetscAbsReal(PetscReal v1)
685eca87e8dSBarry Smith 
686eca87e8dSBarry Smith    Not Collective
687eca87e8dSBarry Smith 
688b6a5bde7SBarry Smith    Input Parameter:
689b6a5bde7SBarry Smith .   v1 - the double
690b6a5bde7SBarry Smith 
691b6a5bde7SBarry Smith    Level: beginner
692b6a5bde7SBarry Smith 
693b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr()
694b6a5bde7SBarry Smith 
695b6a5bde7SBarry Smith M*/
6961118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
6971118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
6981118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
6991118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a)
7001118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
7011118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a)
7021118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7031118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
7041118d4bcSLisandro Dalcin #endif
705b6a5bde7SBarry Smith 
706b6a5bde7SBarry Smith /*MC
707b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
708b6a5bde7SBarry Smith 
709b6a5bde7SBarry Smith    Synopsis:
710aaa7dc30SBarry Smith    #include <petscmath.h>
711b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
712b6a5bde7SBarry Smith 
713eca87e8dSBarry Smith    Not Collective
714eca87e8dSBarry Smith 
715eca87e8dSBarry Smith    Input Parameter:
716eca87e8dSBarry Smith .   v1 - the value
717eca87e8dSBarry Smith 
71895452b02SPatrick Sanan    Notes:
71995452b02SPatrick Sanan     type can be integer or floating point value
720b6a5bde7SBarry Smith 
721b6a5bde7SBarry Smith    Level: beginner
722b6a5bde7SBarry Smith 
723b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal()
724b6a5bde7SBarry Smith 
725b6a5bde7SBarry Smith M*/
7264ebda54eSMatthew Knepley #define PetscSqr(a)     ((a)*(a))
727e489efc1SBarry Smith 
728314da920SBarry Smith /* ----------------------------------------------------------------------------*/
729ee223c85SLisandro Dalcin 
730ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
731ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F
7325117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7335117d392SLisandro Dalcin #define PetscRealConstant(constant) constant
734ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
735ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q
7365117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7375117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F
738ee223c85SLisandro Dalcin #endif
739ee223c85SLisandro Dalcin 
740314da920SBarry Smith /*
741d34fcf5fSBarry Smith      Basic constants
742314da920SBarry Smith */
7432fab75feSLisandro Dalcin #define PETSC_PI    PetscRealConstant(3.1415926535897932384626433832795029)
7442fab75feSLisandro Dalcin #define PETSC_PHI   PetscRealConstant(1.6180339887498948482045868343656381)
7457b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981)
746d34fcf5fSBarry Smith 
747ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES)
74871fd2e92SBarry Smith #define PETSC_MAX_INT            2147483647
749ab824b78SBarry Smith #define PETSC_MIN_INT            (-PETSC_MAX_INT - 1)
750ab824b78SBarry Smith #else
751ab824b78SBarry Smith #define PETSC_MAX_INT            9223372036854775807L
752ab824b78SBarry Smith #define PETSC_MIN_INT            (-PETSC_MAX_INT - 1)
753ab824b78SBarry Smith #endif
754569ea7c4SPierre Jolivet #define PETSC_MAX_UINT16         65535
755e489efc1SBarry Smith 
756ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
757ab824b78SBarry Smith #  define PETSC_MAX_REAL                3.40282346638528860e+38F
7589fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
75982a7e548SBarry Smith #  define PETSC_MACHINE_EPSILON         1.19209290e-07F
76082a7e548SBarry Smith #  define PETSC_SQRT_MACHINE_EPSILON    3.45266983e-04F
761ee223c85SLisandro Dalcin #  define PETSC_SMALL                   1.e-5F
762ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
763ab824b78SBarry Smith #  define PETSC_MAX_REAL                1.7976931348623157e+308
7649fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
76582a7e548SBarry Smith #  define PETSC_MACHINE_EPSILON         2.2204460492503131e-16
76682a7e548SBarry Smith #  define PETSC_SQRT_MACHINE_EPSILON    1.490116119384766e-08
767cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-10
768ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128)
769ea345e14SBarry Smith #  define PETSC_MAX_REAL                FLT128_MAX
7709fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-FLT128_MAX)
771d34fcf5fSBarry Smith #  define PETSC_MACHINE_EPSILON         FLT128_EPSILON
772ee223c85SLisandro Dalcin #  define PETSC_SQRT_MACHINE_EPSILON    1.38777878078144567552953958511352539e-17Q
773ee223c85SLisandro Dalcin #  define PETSC_SMALL                   1.e-20Q
7745117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7755117d392SLisandro Dalcin #  define PETSC_MAX_REAL                65504.0F
7769fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
7775117d392SLisandro Dalcin #  define PETSC_MACHINE_EPSILON         .0009765625F
7785117d392SLisandro Dalcin #  define PETSC_SQRT_MACHINE_EPSILON    .03125F
7795117d392SLisandro Dalcin #  define PETSC_SMALL                   5.e-3F
7809cf09972SJed Brown #endif
7813e523bebSBarry Smith 
78225d0f998SSatish Balay #define PETSC_INFINITY               (PETSC_MAX_REAL/4)
7839fa7d148SSatish Balay #define PETSC_NINFINITY              (-PETSC_INFINITY)
784e270355aSBarry Smith 
7859f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsInfReal(PetscReal);
7863948c36eSLisandro Dalcin PETSC_EXTERN PetscBool PetscIsNanReal(PetscReal);
7878b49ba18SBarry Smith PETSC_EXTERN PetscBool PetscIsNormalReal(PetscReal);
7889f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanReal(PetscReal v) {return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;}
7899f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfScalar(PetscScalar v) {return PetscIsInfReal(PetscAbsScalar(v));}
7903948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNanScalar(PetscScalar v) {return PetscIsNanReal(PetscAbsScalar(v));}
7919f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanScalar(PetscScalar v) {return PetscIsInfOrNanReal(PetscAbsScalar(v));}
7923948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNormalScalar(PetscScalar v) {return PetscIsNormalReal(PetscAbsScalar(v));}
7939a25a3ccSBarry Smith 
794b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal,PetscReal,PetscReal,PetscReal);
795ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal,PetscReal);
796ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar,PetscScalar);
797ce4818fdSLisandro Dalcin 
79898725619SBarry Smith /*
79998725619SBarry Smith     These macros are currently hardwired to match the regular data types, so there is no support for a different
80098725619SBarry Smith     MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again.
80198725619SBarry Smith  */
80298725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR
80398725619SBarry Smith typedef PetscScalar MatScalar;
80498725619SBarry Smith typedef PetscReal MatReal;
80598725619SBarry Smith 
8068ad47952SJed Brown struct petsc_mpiu_2scalar {PetscScalar a,b;};
8078ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2scalar);
808df4397b0SStefano Zampini 
809092991acSStefano Zampini /*
810092991acSStefano Zampini    MPI Datatypes for composite reductions:
811092991acSStefano Zampini    MPIU_REAL_INT -> struct { PetscReal; PetscInt; }
812092991acSStefano Zampini    MPIU_SCALAR_INT -> struct { PetscScalar; PetscInt; }
813092991acSStefano Zampini */
814092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_REAL_INT;
815092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT;
816092991acSStefano Zampini 
817a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES)
8188ad47952SJed Brown struct petsc_mpiu_2int {PetscInt a,b;};
8198ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2int);
8208ad47952SJed Brown #else
8218ad47952SJed Brown #define MPIU_2INT MPI_2INT
8228ad47952SJed Brown #endif
823b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPI_4INT;
824b5a892a1SMatthew G. Knepley PETSC_EXTERN MPI_Datatype MPIU_4INT;
825e9fa29b7SSatish Balay 
826b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscInt PetscPowInt(PetscInt base,PetscInt power)
827b2fb0278SBarry Smith {
828fa711258SJed Brown   PetscInt result = 1;
829fa711258SJed Brown   while (power) {
830fa711258SJed Brown     if (power & 1) result *= base;
831fa711258SJed Brown     power >>= 1;
832fa711258SJed Brown     base *= base;
833fa711258SJed Brown   }
834fa711258SJed Brown   return result;
835fa711258SJed Brown }
836b2fb0278SBarry Smith 
837ad70a4c3SStefano Zampini PETSC_STATIC_INLINE PetscInt64 PetscPowInt64(PetscInt base,PetscInt power)
838ad70a4c3SStefano Zampini {
839ad70a4c3SStefano Zampini   PetscInt64 result = 1;
840ad70a4c3SStefano Zampini   while (power) {
841ad70a4c3SStefano Zampini     if (power & 1) result *= base;
842ad70a4c3SStefano Zampini     power >>= 1;
843ad70a4c3SStefano Zampini     base *= base;
844ad70a4c3SStefano Zampini   }
845ad70a4c3SStefano Zampini   return result;
846ad70a4c3SStefano Zampini }
847ad70a4c3SStefano Zampini 
848b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscReal PetscPowRealInt(PetscReal base,PetscInt power)
849b2fb0278SBarry Smith {
850fa711258SJed Brown   PetscReal result = 1;
851d98d5da7SBarry Smith   if (power < 0) {
852d98d5da7SBarry Smith     power = -power;
85310d40e53SLisandro Dalcin     base  = ((PetscReal)1)/base;
854d98d5da7SBarry Smith   }
855fa711258SJed Brown   while (power) {
856fa711258SJed Brown     if (power & 1) result *= base;
857fa711258SJed Brown     power >>= 1;
858fa711258SJed Brown     base *= base;
859fa711258SJed Brown   }
860fa711258SJed Brown   return result;
861fa711258SJed Brown }
862fa711258SJed Brown 
863b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarInt(PetscScalar base,PetscInt power)
864b2fb0278SBarry Smith {
8655117d392SLisandro Dalcin   PetscScalar result = (PetscReal)1;
8668b49ba18SBarry Smith   if (power < 0) {
8678b49ba18SBarry Smith     power = -power;
86810d40e53SLisandro Dalcin     base  = ((PetscReal)1)/base;
8698b49ba18SBarry Smith   }
8708b49ba18SBarry Smith   while (power) {
8718b49ba18SBarry Smith     if (power & 1) result *= base;
8728b49ba18SBarry Smith     power >>= 1;
8738b49ba18SBarry Smith     base *= base;
8748b49ba18SBarry Smith   }
8758b49ba18SBarry Smith   return result;
8768b49ba18SBarry Smith }
8778b49ba18SBarry Smith 
878b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarReal(PetscScalar base,PetscReal power)
879b2fb0278SBarry Smith {
880b2fb0278SBarry Smith   PetscScalar cpower = power;
881b2fb0278SBarry Smith   return PetscPowScalar(base,cpower);
882b2fb0278SBarry Smith }
88378a59e97SMatthew G. Knepley 
884c803a25aSBarry Smith /*MC
885c803a25aSBarry Smith     PetscLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers
886c803a25aSBarry Smith 
887c803a25aSBarry Smith    Synopsis:
888c803a25aSBarry Smith    #include <petscmath.h>
889c803a25aSBarry Smith    bool PetscLTE(PetscReal x,constant float)
890c803a25aSBarry Smith 
891c803a25aSBarry Smith    Not Collective
892c803a25aSBarry Smith 
893c803a25aSBarry Smith    Input Parameters:
894c803a25aSBarry Smith +   x - the variable
895c803a25aSBarry Smith -   b - the constant float it is checking if x is less than or equal to
896c803a25aSBarry Smith 
897c803a25aSBarry Smith    Notes:
898c803a25aSBarry Smith      The fudge factor is the value PETSC_SMALL
899c803a25aSBarry Smith 
900c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
901c803a25aSBarry Smith 
902c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
903c803a25aSBarry Smith      floating point results.
904c803a25aSBarry Smith 
905c803a25aSBarry Smith    Level: advanced
906c803a25aSBarry Smith 
907c803a25aSBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscGTE()
908c803a25aSBarry Smith 
909c803a25aSBarry Smith M*/
910c803a25aSBarry Smith #define PetscLTE(x,b)  ((x) <= (PetscRealConstant(b)+PETSC_SMALL))
911c803a25aSBarry Smith 
912c803a25aSBarry Smith /*MC
913c803a25aSBarry Smith     PetscGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers
914c803a25aSBarry Smith 
915c803a25aSBarry Smith    Synopsis:
916c803a25aSBarry Smith    #include <petscmath.h>
917c803a25aSBarry Smith    bool PetscGTE(PetscReal x,constant float)
918c803a25aSBarry Smith 
919c803a25aSBarry Smith    Not Collective
920c803a25aSBarry Smith 
921c803a25aSBarry Smith    Input Parameters:
922c803a25aSBarry Smith +   x - the variable
923c803a25aSBarry Smith -   b - the constant float it is checking if x is greater than or equal to
924c803a25aSBarry Smith 
925c803a25aSBarry Smith    Notes:
926c803a25aSBarry Smith      The fudge factor is the value PETSC_SMALL
927c803a25aSBarry Smith 
928c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
929c803a25aSBarry Smith 
930c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
931c803a25aSBarry Smith      floating point results.
932c803a25aSBarry Smith 
933c803a25aSBarry Smith    Level: advanced
934c803a25aSBarry Smith 
935c803a25aSBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscLTE()
936c803a25aSBarry Smith 
937c803a25aSBarry Smith M*/
938c803a25aSBarry Smith #define PetscGTE(x,b)  ((x) >= (PetscRealConstant(b)-PETSC_SMALL))
939c803a25aSBarry Smith 
940bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt,const PetscReal[],const PetscReal[],PetscReal*,PetscReal*);
941e489efc1SBarry Smith #endif
942