xref: /petsc/include/petscmath.h (revision 092991ac1244d667ecf45705734b89bd49b3016b)
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)
525117d392SLisandro Dalcin #define PetscTGamma(a)      tgammaf(a)
531f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
541f17fa70SToby Isaac #define PetscLGamma(a)      gammaf(a)
551f17fa70SToby Isaac #else
561f17fa70SToby Isaac #define PetscLGamma(a)      lgammaf(a)
571f17fa70SToby Isaac #endif
585117d392SLisandro Dalcin 
595117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
605117d392SLisandro Dalcin #define PetscSqrtReal(a)    sqrt(a)
615117d392SLisandro Dalcin #define PetscCbrtReal(a)    cbrt(a)
625117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypot(a,b)
635117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2(a,b)
645117d392SLisandro Dalcin #define PetscPowReal(a,b)   pow(a,b)
655117d392SLisandro Dalcin #define PetscExpReal(a)     exp(a)
665117d392SLisandro Dalcin #define PetscLogReal(a)     log(a)
675117d392SLisandro Dalcin #define PetscLog10Real(a)   log10(a)
685117d392SLisandro Dalcin #define PetscLog2Real(a)    log2(a)
695117d392SLisandro Dalcin #define PetscSinReal(a)     sin(a)
705117d392SLisandro Dalcin #define PetscCosReal(a)     cos(a)
715117d392SLisandro Dalcin #define PetscTanReal(a)     tan(a)
725117d392SLisandro Dalcin #define PetscAsinReal(a)    asin(a)
735117d392SLisandro Dalcin #define PetscAcosReal(a)    acos(a)
745117d392SLisandro Dalcin #define PetscAtanReal(a)    atan(a)
755117d392SLisandro Dalcin #define PetscSinhReal(a)    sinh(a)
765117d392SLisandro Dalcin #define PetscCoshReal(a)    cosh(a)
775117d392SLisandro Dalcin #define PetscTanhReal(a)    tanh(a)
785117d392SLisandro Dalcin #define PetscAsinhReal(a)   asinh(a)
795117d392SLisandro Dalcin #define PetscAcoshReal(a)   acosh(a)
805117d392SLisandro Dalcin #define PetscAtanhReal(a)   atanh(a)
815117d392SLisandro Dalcin #define PetscCeilReal(a)    ceil(a)
825117d392SLisandro Dalcin #define PetscFloorReal(a)   floor(a)
835117d392SLisandro Dalcin #define PetscFmodReal(a,b)  fmod(a,b)
845117d392SLisandro Dalcin #define PetscTGamma(a)      tgamma(a)
851f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
861f17fa70SToby Isaac #define PetscLGamma(a)      gamma(a)
871f17fa70SToby Isaac #else
881f17fa70SToby Isaac #define PetscLGamma(a)      lgamma(a)
891f17fa70SToby Isaac #endif
905117d392SLisandro Dalcin 
915117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
925117d392SLisandro Dalcin #define PetscSqrtReal(a)    sqrtq(a)
935117d392SLisandro Dalcin #define PetscCbrtReal(a)    cbrtq(a)
945117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypotq(a,b)
955117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2q(a,b)
965117d392SLisandro Dalcin #define PetscPowReal(a,b)   powq(a,b)
975117d392SLisandro Dalcin #define PetscExpReal(a)     expq(a)
985117d392SLisandro Dalcin #define PetscLogReal(a)     logq(a)
995117d392SLisandro Dalcin #define PetscLog10Real(a)   log10q(a)
1005117d392SLisandro Dalcin #define PetscLog2Real(a)    log2q(a)
1015117d392SLisandro Dalcin #define PetscSinReal(a)     sinq(a)
1025117d392SLisandro Dalcin #define PetscCosReal(a)     cosq(a)
1035117d392SLisandro Dalcin #define PetscTanReal(a)     tanq(a)
1045117d392SLisandro Dalcin #define PetscAsinReal(a)    asinq(a)
1055117d392SLisandro Dalcin #define PetscAcosReal(a)    acosq(a)
1065117d392SLisandro Dalcin #define PetscAtanReal(a)    atanq(a)
1075117d392SLisandro Dalcin #define PetscSinhReal(a)    sinhq(a)
1085117d392SLisandro Dalcin #define PetscCoshReal(a)    coshq(a)
1095117d392SLisandro Dalcin #define PetscTanhReal(a)    tanhq(a)
1105117d392SLisandro Dalcin #define PetscAsinhReal(a)   asinhq(a)
1115117d392SLisandro Dalcin #define PetscAcoshReal(a)   acoshq(a)
1125117d392SLisandro Dalcin #define PetscAtanhReal(a)   atanhq(a)
1135117d392SLisandro Dalcin #define PetscCeilReal(a)    ceilq(a)
1145117d392SLisandro Dalcin #define PetscFloorReal(a)   floorq(a)
1155117d392SLisandro Dalcin #define PetscFmodReal(a,b)  fmodq(a,b)
1165117d392SLisandro Dalcin #define PetscTGamma(a)      tgammaq(a)
1171f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1181f17fa70SToby Isaac #define PetscLGamma(a)      gammaq(a)
1191f17fa70SToby Isaac #else
1201f17fa70SToby Isaac #define PetscLGamma(a)      lgammaq(a)
1211f17fa70SToby Isaac #endif
1225117d392SLisandro Dalcin 
1235117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
1245117d392SLisandro Dalcin #define PetscSqrtReal(a)    sqrtf(a)
1255117d392SLisandro Dalcin #define PetscCbrtReal(a)    cbrtf(a)
1265117d392SLisandro Dalcin #define PetscHypotReal(a,b) hypotf(a,b)
1275117d392SLisandro Dalcin #define PetscAtan2Real(a,b) atan2f(a,b)
1285117d392SLisandro Dalcin #define PetscPowReal(a,b)   powf(a,b)
1295117d392SLisandro Dalcin #define PetscExpReal(a)     expf(a)
1305117d392SLisandro Dalcin #define PetscLogReal(a)     logf(a)
1315117d392SLisandro Dalcin #define PetscLog10Real(a)   log10f(a)
1325117d392SLisandro Dalcin #define PetscLog2Real(a)    log2f(a)
1335117d392SLisandro Dalcin #define PetscSinReal(a)     sinf(a)
1345117d392SLisandro Dalcin #define PetscCosReal(a)     cosf(a)
1355117d392SLisandro Dalcin #define PetscTanReal(a)     tanf(a)
1365117d392SLisandro Dalcin #define PetscAsinReal(a)    asinf(a)
1375117d392SLisandro Dalcin #define PetscAcosReal(a)    acosf(a)
1385117d392SLisandro Dalcin #define PetscAtanReal(a)    atanf(a)
1395117d392SLisandro Dalcin #define PetscSinhReal(a)    sinhf(a)
1405117d392SLisandro Dalcin #define PetscCoshReal(a)    coshf(a)
1415117d392SLisandro Dalcin #define PetscTanhReal(a)    tanhf(a)
1425117d392SLisandro Dalcin #define PetscAsinhReal(a)   asinhf(a)
1435117d392SLisandro Dalcin #define PetscAcoshReal(a)   acoshf(a)
1445117d392SLisandro Dalcin #define PetscAtanhReal(a)   atanhf(a)
1455117d392SLisandro Dalcin #define PetscCeilReal(a)    ceilf(a)
1465117d392SLisandro Dalcin #define PetscFloorReal(a)   floorf(a)
1475117d392SLisandro Dalcin #define PetscFmodReal(a,b)  fmodf(a,b)
1485117d392SLisandro Dalcin #define PetscTGamma(a)      tgammaf(a)
1491f17fa70SToby Isaac #if defined(PETSC_HAVE_LGAMMA_IS_GAMMA)
1501f17fa70SToby Isaac #define PetscLGamma(a)      gammaf(a)
1511f17fa70SToby Isaac #else
1521f17fa70SToby Isaac #define PetscLGamma(a)      lgammaf(a)
1531f17fa70SToby Isaac #endif
1545117d392SLisandro Dalcin 
1555117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
1565117d392SLisandro Dalcin 
1575117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscReal PetscSignReal(PetscReal a)
1585117d392SLisandro Dalcin {
1595117d392SLisandro Dalcin   return (PetscReal)((a < (PetscReal)0) ? -1 : ((a > (PetscReal)0) ? 1 : 0));
1605117d392SLisandro Dalcin }
1615117d392SLisandro Dalcin 
1625117d392SLisandro Dalcin #if !defined(PETSC_HAVE_LOG2)
1635117d392SLisandro Dalcin #undef PetscLog2Real
1645117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscReal PetscLog2Real(PetscReal a)
1655117d392SLisandro Dalcin {
1665117d392SLisandro Dalcin   return PetscLogReal(a)/PetscLogReal((PetscReal)2);
1675117d392SLisandro Dalcin }
1685117d392SLisandro Dalcin #endif
1695117d392SLisandro Dalcin 
1705117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
1715117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FLOAT128 PetscAttrMPITypeTag(__float128);
1725117d392SLisandro Dalcin #endif
1735117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FP16)
1745117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___FP16 PetscAttrMPITypeTag(__fp16);
1755117d392SLisandro Dalcin #endif
1765117d392SLisandro Dalcin 
177df4397b0SStefano Zampini /*MC
178df4397b0SStefano Zampini    MPIU_REAL - MPI datatype corresponding to PetscReal
179df4397b0SStefano Zampini 
180df4397b0SStefano Zampini    Notes:
181df4397b0SStefano Zampini    In MPI calls that require an MPI datatype that matches a PetscReal or array of PetscReal values, pass this value.
182df4397b0SStefano Zampini 
183df4397b0SStefano Zampini    Level: beginner
184df4397b0SStefano Zampini 
185df4397b0SStefano Zampini .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
186df4397b0SStefano Zampini M*/
187c1d390e3SJed Brown #if defined(PETSC_USE_REAL_SINGLE)
188c1d390e3SJed Brown #  define MPIU_REAL MPI_FLOAT
189c1d390e3SJed Brown #elif defined(PETSC_USE_REAL_DOUBLE)
190c1d390e3SJed Brown #  define MPIU_REAL MPI_DOUBLE
191c1d390e3SJed Brown #elif defined(PETSC_USE_REAL___FLOAT128)
192c1d390e3SJed Brown #  define MPIU_REAL MPIU___FLOAT128
193570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16)
194570b7f6dSBarry Smith #  define MPIU_REAL MPIU___FP16
195c1d390e3SJed Brown #endif /* PETSC_USE_REAL_* */
19659cb5930SBarry Smith 
1971093a601SBarry Smith /*
1981093a601SBarry Smith     Complex number definitions
1991093a601SBarry Smith  */
200df4397b0SStefano Zampini #if defined(PETSC_HAVE_COMPLEX)
2017a19d461SSatish Balay #if defined(__cplusplus)
2021093a601SBarry Smith /* C++ support of complex number */
203b7940d39SSatish Balay 
20450f81f78SJed Brown #define PetscRealPartComplex(a)      (a).real()
20550f81f78SJed Brown #define PetscImaginaryPartComplex(a) (a).imag()
206df4397b0SStefano Zampini #define PetscAbsComplex(a)           petsccomplexlib::abs(a)
2075117d392SLisandro Dalcin #define PetscArgComplex(a)           petsccomplexlib::arg(a)
208df4397b0SStefano Zampini #define PetscConjComplex(a)          petsccomplexlib::conj(a)
209df4397b0SStefano Zampini #define PetscSqrtComplex(a)          petsccomplexlib::sqrt(a)
210df4397b0SStefano Zampini #define PetscPowComplex(a,b)         petsccomplexlib::pow(a,b)
211df4397b0SStefano Zampini #define PetscExpComplex(a)           petsccomplexlib::exp(a)
212df4397b0SStefano Zampini #define PetscLogComplex(a)           petsccomplexlib::log(a)
213df4397b0SStefano Zampini #define PetscSinComplex(a)           petsccomplexlib::sin(a)
214df4397b0SStefano Zampini #define PetscCosComplex(a)           petsccomplexlib::cos(a)
2155117d392SLisandro Dalcin #define PetscTanComplex(a)           petsccomplexlib::tan(a)
216df4397b0SStefano Zampini #define PetscAsinComplex(a)          petsccomplexlib::asin(a)
217df4397b0SStefano Zampini #define PetscAcosComplex(a)          petsccomplexlib::acos(a)
2185117d392SLisandro Dalcin #define PetscAtanComplex(a)          petsccomplexlib::atan(a)
219df4397b0SStefano Zampini #define PetscSinhComplex(a)          petsccomplexlib::sinh(a)
220df4397b0SStefano Zampini #define PetscCoshComplex(a)          petsccomplexlib::cosh(a)
221df4397b0SStefano Zampini #define PetscTanhComplex(a)          petsccomplexlib::tanh(a)
2225117d392SLisandro Dalcin #define PetscAsinhComplex(a)         petsccomplexlib::asinh(a)
2235117d392SLisandro Dalcin #define PetscAcoshComplex(a)         petsccomplexlib::acosh(a)
2245117d392SLisandro Dalcin #define PetscAtanhComplex(a)         petsccomplexlib::atanh(a)
2255117d392SLisandro Dalcin 
2265117d392SLisandro Dalcin /* TODO: Add configure tests
2275117d392SLisandro Dalcin 
2285117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TAN_COMPLEX)
2295117d392SLisandro Dalcin #undef PetscTanComplex
2305117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscTanComplex(PetscComplex z)
2315117d392SLisandro Dalcin {
2325117d392SLisandro Dalcin   return PetscSinComplex(z)/PetscCosComplex(z);
2335117d392SLisandro Dalcin }
234027d9794SBarry Smith #endif
235debe9ee2SPaul Mullowney 
2365117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_TANH_COMPLEX)
2375117d392SLisandro Dalcin #undef PetscTanhComplex
2385117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscTanhComplex(PetscComplex z)
2395117d392SLisandro Dalcin {
2405117d392SLisandro Dalcin   return PetscSinhComplex(z)/PetscCoshComplex(z);
2415117d392SLisandro Dalcin }
2425117d392SLisandro Dalcin #endif
2435117d392SLisandro Dalcin 
2445117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASIN_COMPLEX)
2455117d392SLisandro Dalcin #undef PetscAsinComplex
2465117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAsinComplex(PetscComplex z)
2475117d392SLisandro Dalcin {
2485117d392SLisandro Dalcin   const PetscComplex j(0,1);
2495117d392SLisandro Dalcin   return -j*PetscLogComplex(j*z+PetscSqrtComplex(1.0f-z*z));
2505117d392SLisandro Dalcin }
2515117d392SLisandro Dalcin #endif
2525117d392SLisandro Dalcin 
2535117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOS_COMPLEX)
2545117d392SLisandro Dalcin #undef PetscAcosComplex
2555117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAcosComplex(PetscComplex z)
2565117d392SLisandro Dalcin {
2575117d392SLisandro Dalcin   const PetscComplex j(0,1);
2585117d392SLisandro Dalcin   return j*PetscLogComplex(z-j*PetscSqrtComplex(1.0f-z*z));
2595117d392SLisandro Dalcin }
2605117d392SLisandro Dalcin #endif
2615117d392SLisandro Dalcin 
2625117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATAN_COMPLEX)
2635117d392SLisandro Dalcin #undef PetscAtanComplex
2645117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAtanComplex(PetscComplex z)
2655117d392SLisandro Dalcin {
2665117d392SLisandro Dalcin   const PetscComplex j(0,1);
2675117d392SLisandro Dalcin   return 0.5f*j*PetscLogComplex((1.0f-j*z)/(1.0f+j*z));
2685117d392SLisandro Dalcin }
2695117d392SLisandro Dalcin #endif
2705117d392SLisandro Dalcin 
2715117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ASINH_COMPLEX)
2725117d392SLisandro Dalcin #undef PetscAsinhComplex
2735117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAsinhComplex(PetscComplex z)
2745117d392SLisandro Dalcin {
2755117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z+1.0f));
2765117d392SLisandro Dalcin }
2775117d392SLisandro Dalcin #endif
2785117d392SLisandro Dalcin 
2795117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ACOSH_COMPLEX)
2805117d392SLisandro Dalcin #undef PetscAcoshComplex
2815117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAcoshComplex(PetscComplex z)
2825117d392SLisandro Dalcin {
2835117d392SLisandro Dalcin   return PetscLogComplex(z+PetscSqrtComplex(z*z-1.0f));
2845117d392SLisandro Dalcin }
2855117d392SLisandro Dalcin #endif
2865117d392SLisandro Dalcin 
2875117d392SLisandro Dalcin #if !defined(PETSC_HAVE_CXX_ATANH_COMPLEX)
2885117d392SLisandro Dalcin #undef PetscAtanhComplex
2895117d392SLisandro Dalcin PETSC_STATIC_INLINE PetscComplex PetscAtanhComplex(PetscComplex z)
2905117d392SLisandro Dalcin {
2915117d392SLisandro Dalcin   return 0.5f*PetscLogComplex((1.0f+z)/(1.0f-z));
2925117d392SLisandro Dalcin }
2935117d392SLisandro Dalcin #endif
2945117d392SLisandro Dalcin 
2955117d392SLisandro Dalcin */
2965117d392SLisandro Dalcin 
2977a19d461SSatish Balay #else /* C99 support of complex number */
298519e2a1fSPaul Mullowney 
2997a19d461SSatish Balay #if defined(PETSC_USE_REAL_SINGLE)
30050f81f78SJed Brown #define PetscRealPartComplex(a)      crealf(a)
30150f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagf(a)
30250f81f78SJed Brown #define PetscAbsComplex(a)           cabsf(a)
3035117d392SLisandro Dalcin #define PetscArgComplex(a)           cargf(a)
30450f81f78SJed Brown #define PetscConjComplex(a)          conjf(a)
30550f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtf(a)
30650f81f78SJed Brown #define PetscPowComplex(a,b)         cpowf(a,b)
30750f81f78SJed Brown #define PetscExpComplex(a)           cexpf(a)
30850f81f78SJed Brown #define PetscLogComplex(a)           clogf(a)
30950f81f78SJed Brown #define PetscSinComplex(a)           csinf(a)
31050f81f78SJed Brown #define PetscCosComplex(a)           ccosf(a)
3115117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanf(a)
312255453a1SBarry Smith #define PetscAsinComplex(a)          casinf(a)
313255453a1SBarry Smith #define PetscAcosComplex(a)          cacosf(a)
3145117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanf(a)
315a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhf(a)
316a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshf(a)
317a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhf(a)
3185117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhf(a)
3195117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshf(a)
3205117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhf(a)
3211093a601SBarry Smith 
322ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
32350f81f78SJed Brown #define PetscRealPartComplex(a)      creal(a)
32450f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimag(a)
32550f81f78SJed Brown #define PetscAbsComplex(a)           cabs(a)
3265117d392SLisandro Dalcin #define PetscArgComplex(a)           carg(a)
32750f81f78SJed Brown #define PetscConjComplex(a)          conj(a)
32850f81f78SJed Brown #define PetscSqrtComplex(a)          csqrt(a)
32950f81f78SJed Brown #define PetscPowComplex(a,b)         cpow(a,b)
33050f81f78SJed Brown #define PetscExpComplex(a)           cexp(a)
33150f81f78SJed Brown #define PetscLogComplex(a)           clog(a)
33250f81f78SJed Brown #define PetscSinComplex(a)           csin(a)
33350f81f78SJed Brown #define PetscCosComplex(a)           ccos(a)
3345117d392SLisandro Dalcin #define PetscTanComplex(a)           ctan(a)
335255453a1SBarry Smith #define PetscAsinComplex(a)          casin(a)
336255453a1SBarry Smith #define PetscAcosComplex(a)          cacos(a)
3375117d392SLisandro Dalcin #define PetscAtanComplex(a)          catan(a)
338a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinh(a)
339a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccosh(a)
340a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanh(a)
3415117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinh(a)
3425117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacosh(a)
3435117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanh(a)
3441093a601SBarry Smith 
3458c764dc5SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128)
34650f81f78SJed Brown #define PetscRealPartComplex(a)      crealq(a)
34750f81f78SJed Brown #define PetscImaginaryPartComplex(a) cimagq(a)
34850f81f78SJed Brown #define PetscAbsComplex(a)           cabsq(a)
3495117d392SLisandro Dalcin #define PetscArgComplex(a)           cargq(a)
35050f81f78SJed Brown #define PetscConjComplex(a)          conjq(a)
35150f81f78SJed Brown #define PetscSqrtComplex(a)          csqrtq(a)
35250f81f78SJed Brown #define PetscPowComplex(a,b)         cpowq(a,b)
35350f81f78SJed Brown #define PetscExpComplex(a)           cexpq(a)
35450f81f78SJed Brown #define PetscLogComplex(a)           clogq(a)
35550f81f78SJed Brown #define PetscSinComplex(a)           csinq(a)
35650f81f78SJed Brown #define PetscCosComplex(a)           ccosq(a)
3575117d392SLisandro Dalcin #define PetscTanComplex(a)           ctanq(a)
358255453a1SBarry Smith #define PetscAsinComplex(a)          casinq(a)
359255453a1SBarry Smith #define PetscAcosComplex(a)          cacosq(a)
3605117d392SLisandro Dalcin #define PetscAtanComplex(a)          catanq(a)
361a4bea5a6SPeter Brune #define PetscSinhComplex(a)          csinhq(a)
362a4bea5a6SPeter Brune #define PetscCoshComplex(a)          ccoshq(a)
363a4bea5a6SPeter Brune #define PetscTanhComplex(a)          ctanhq(a)
3645117d392SLisandro Dalcin #define PetscAsinhComplex(a)         casinhq(a)
3655117d392SLisandro Dalcin #define PetscAcoshComplex(a)         cacoshq(a)
3665117d392SLisandro Dalcin #define PetscAtanhComplex(a)         catanhq(a)
367a4bea5a6SPeter Brune 
368ce63c4c1SBarry Smith #endif /* PETSC_USE_REAL_* */
3697a19d461SSatish Balay #endif /* (__cplusplus) */
370e489efc1SBarry Smith 
3711093a601SBarry Smith /*
3725117d392SLisandro Dalcin    PETSC_i is the imaginary number, i
3731093a601SBarry Smith */
37450f81f78SJed Brown PETSC_EXTERN PetscComplex PETSC_i;
3758a351411SToby Isaac 
3765117d392SLisandro Dalcin /*
3775117d392SLisandro Dalcin    Try to do the right thing for complex number construction: see
3788a351411SToby Isaac    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1464.htm
3798a351411SToby Isaac    for details
3808a351411SToby Isaac */
38119e222d7SToby Isaac PETSC_STATIC_INLINE PetscComplex PetscCMPLX(PetscReal x, PetscReal y)
3828a351411SToby Isaac {
3837a19d461SSatish Balay #if defined(__cplusplus)
3848a351411SToby Isaac   return PetscComplex(x,y);
3858a351411SToby Isaac #elif defined(_Imaginary_I)
3868a351411SToby Isaac   return x + y * _Imaginary_I;
3878a351411SToby Isaac #else
388616d7c5eSToby Isaac   { /* In both C99 and C11 (ISO/IEC 9899, Section 6.2.5),
389616d7c5eSToby Isaac 
390616d7c5eSToby Isaac        "For each floating type there is a corresponding real type, which is always a real floating
391616d7c5eSToby Isaac        type. For real floating types, it is the same type. For complex types, it is the type given
392616d7c5eSToby Isaac        by deleting the keyword _Complex from the type name."
393616d7c5eSToby Isaac 
394616d7c5eSToby Isaac        So type punning should be portable. */
395616d7c5eSToby Isaac     union { PetscComplex z; PetscReal f[2]; } uz;
396616d7c5eSToby Isaac 
397616d7c5eSToby Isaac     uz.f[0] = x;
398616d7c5eSToby Isaac     uz.f[1] = y;
399616d7c5eSToby Isaac     return uz.z;
400616d7c5eSToby Isaac   }
40150f81f78SJed Brown #endif
4028a351411SToby Isaac }
4038a351411SToby Isaac 
404de272c7aSSatish 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)\"")
405de272c7aSSatish 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)\"")
406de272c7aSSatish Balay 
4075117d392SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
4085117d392SLisandro Dalcin PETSC_EXTERN MPI_Datatype MPIU___COMPLEX128 PetscAttrMPITypeTag(__complex128);
4095117d392SLisandro Dalcin #endif /* PETSC_USE_REAL___FLOAT128 */
4105117d392SLisandro Dalcin 
4115117d392SLisandro Dalcin /*MC
4125117d392SLisandro Dalcin    MPIU_COMPLEX - MPI datatype corresponding to PetscComplex
4135117d392SLisandro Dalcin 
4145117d392SLisandro Dalcin    Notes:
4155117d392SLisandro Dalcin    In MPI calls that require an MPI datatype that matches a PetscComplex or array of PetscComplex values, pass this value.
4165117d392SLisandro Dalcin 
4175117d392SLisandro Dalcin    Level: beginner
4185117d392SLisandro Dalcin 
4195117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i
4205117d392SLisandro Dalcin M*/
4215117d392SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
422de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_COMPLEX
4235117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
424de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_DOUBLE_COMPLEX
4255117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
4265117d392SLisandro Dalcin #  define MPIU_COMPLEX MPIU___COMPLEX128
4275117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
428de272c7aSSatish Balay #  define MPIU_COMPLEX MPI_C_COMPLEX
4295117d392SLisandro Dalcin #endif /* PETSC_USE_REAL_* */
4305117d392SLisandro Dalcin 
4315117d392SLisandro Dalcin #endif /* PETSC_HAVE_COMPLEX */
4325117d392SLisandro Dalcin 
4335117d392SLisandro Dalcin /*
4345117d392SLisandro Dalcin     Scalar number definitions
4355117d392SLisandro Dalcin  */
4367a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX)
4375117d392SLisandro Dalcin /*MC
4385117d392SLisandro Dalcin    MPIU_SCALAR - MPI datatype corresponding to PetscScalar
4395117d392SLisandro Dalcin 
4405117d392SLisandro Dalcin    Notes:
4415117d392SLisandro Dalcin    In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalar values, pass this value.
4425117d392SLisandro Dalcin 
4435117d392SLisandro Dalcin    Level: beginner
4445117d392SLisandro Dalcin 
4455117d392SLisandro Dalcin .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_COMPLEX, MPIU_INT
4465117d392SLisandro Dalcin M*/
4475117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_COMPLEX
4485117d392SLisandro Dalcin 
4495117d392SLisandro Dalcin /*MC
4505117d392SLisandro Dalcin    PetscRealPart - Returns the real part of a PetscScalar
4515117d392SLisandro Dalcin 
4525117d392SLisandro Dalcin    Synopsis:
4535117d392SLisandro Dalcin    #include <petscmath.h>
4545117d392SLisandro Dalcin    PetscReal PetscRealPart(PetscScalar v)
4555117d392SLisandro Dalcin 
4565117d392SLisandro Dalcin    Not Collective
4575117d392SLisandro Dalcin 
4585117d392SLisandro Dalcin    Input Parameter:
4595117d392SLisandro Dalcin .  v - value to find the real part of
4605117d392SLisandro Dalcin 
4615117d392SLisandro Dalcin    Level: beginner
4625117d392SLisandro Dalcin 
4635117d392SLisandro Dalcin .seealso: PetscScalar, PetscImaginaryPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
4645117d392SLisandro Dalcin 
4655117d392SLisandro Dalcin M*/
4665117d392SLisandro Dalcin #define PetscRealPart(a)      PetscRealPartComplex(a)
4675117d392SLisandro Dalcin 
4685117d392SLisandro Dalcin /*MC
4695117d392SLisandro Dalcin    PetscImaginaryPart - Returns the imaginary part of a PetscScalar
4705117d392SLisandro Dalcin 
4715117d392SLisandro Dalcin    Synopsis:
4725117d392SLisandro Dalcin    #include <petscmath.h>
4735117d392SLisandro Dalcin    PetscReal PetscImaginaryPart(PetscScalar v)
4745117d392SLisandro Dalcin 
4755117d392SLisandro Dalcin    Not Collective
4765117d392SLisandro Dalcin 
4775117d392SLisandro Dalcin    Input Parameter:
4785117d392SLisandro Dalcin .  v - value to find the imaginary part of
4795117d392SLisandro Dalcin 
4805117d392SLisandro Dalcin    Level: beginner
4815117d392SLisandro Dalcin 
4825117d392SLisandro Dalcin    Notes:
4835117d392SLisandro Dalcin        If PETSc was configured for real numbers then this always returns the value 0
4845117d392SLisandro Dalcin 
4855117d392SLisandro Dalcin .seealso: PetscScalar, PetscRealPart(), PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
4865117d392SLisandro Dalcin 
4875117d392SLisandro Dalcin M*/
4885117d392SLisandro Dalcin #define PetscImaginaryPart(a) PetscImaginaryPartComplex(a)
4895117d392SLisandro Dalcin 
4905117d392SLisandro Dalcin #define PetscAbsScalar(a)     PetscAbsComplex(a)
4915117d392SLisandro Dalcin #define PetscArgScalar(a)     PetscArgComplex(a)
4925117d392SLisandro Dalcin #define PetscConj(a)          PetscConjComplex(a)
4935117d392SLisandro Dalcin #define PetscSqrtScalar(a)    PetscSqrtComplex(a)
4945117d392SLisandro Dalcin #define PetscPowScalar(a,b)   PetscPowComplex(a,b)
4955117d392SLisandro Dalcin #define PetscExpScalar(a)     PetscExpComplex(a)
4965117d392SLisandro Dalcin #define PetscLogScalar(a)     PetscLogComplex(a)
4975117d392SLisandro Dalcin #define PetscSinScalar(a)     PetscSinComplex(a)
4985117d392SLisandro Dalcin #define PetscCosScalar(a)     PetscCosComplex(a)
4995117d392SLisandro Dalcin #define PetscTanScalar(a)     PetscTanComplex(a)
5005117d392SLisandro Dalcin #define PetscAsinScalar(a)    PetscAsinComplex(a)
5015117d392SLisandro Dalcin #define PetscAcosScalar(a)    PetscAcosComplex(a)
5025117d392SLisandro Dalcin #define PetscAtanScalar(a)    PetscAtanComplex(a)
5035117d392SLisandro Dalcin #define PetscSinhScalar(a)    PetscSinhComplex(a)
5045117d392SLisandro Dalcin #define PetscCoshScalar(a)    PetscCoshComplex(a)
5055117d392SLisandro Dalcin #define PetscTanhScalar(a)    PetscTanhComplex(a)
5065117d392SLisandro Dalcin #define PetscAsinhScalar(a)   PetscAsinhComplex(a)
5075117d392SLisandro Dalcin #define PetscAcoshScalar(a)   PetscAcoshComplex(a)
5085117d392SLisandro Dalcin #define PetscAtanhScalar(a)   PetscAtanhComplex(a)
5095117d392SLisandro Dalcin 
5105117d392SLisandro Dalcin #else /* PETSC_USE_COMPLEX */
5115117d392SLisandro Dalcin #define MPIU_SCALAR MPIU_REAL
5125117d392SLisandro Dalcin #define PetscRealPart(a)      (a)
5135117d392SLisandro Dalcin #define PetscImaginaryPart(a) ((PetscReal)0)
5145117d392SLisandro Dalcin #define PetscAbsScalar(a)     PetscAbsReal(a)
5155117d392SLisandro Dalcin #define PetscArgScalar(a)     (((a) < (PetscReal)0) ? PETSC_PI : (PetscReal)0)
5165117d392SLisandro Dalcin #define PetscConj(a)          (a)
5175117d392SLisandro Dalcin #define PetscSqrtScalar(a)    PetscSqrtReal(a)
5185117d392SLisandro Dalcin #define PetscPowScalar(a,b)   PetscPowReal(a,b)
5195117d392SLisandro Dalcin #define PetscExpScalar(a)     PetscExpReal(a)
5205117d392SLisandro Dalcin #define PetscLogScalar(a)     PetscLogReal(a)
5215117d392SLisandro Dalcin #define PetscSinScalar(a)     PetscSinReal(a)
5225117d392SLisandro Dalcin #define PetscCosScalar(a)     PetscCosReal(a)
5235117d392SLisandro Dalcin #define PetscTanScalar(a)     PetscTanReal(a)
5245117d392SLisandro Dalcin #define PetscAsinScalar(a)    PetscAsinReal(a)
5255117d392SLisandro Dalcin #define PetscAcosScalar(a)    PetscAcosReal(a)
5265117d392SLisandro Dalcin #define PetscAtanScalar(a)    PetscAtanReal(a)
5275117d392SLisandro Dalcin #define PetscSinhScalar(a)    PetscSinhReal(a)
5285117d392SLisandro Dalcin #define PetscCoshScalar(a)    PetscCoshReal(a)
5295117d392SLisandro Dalcin #define PetscTanhScalar(a)    PetscTanhReal(a)
5305117d392SLisandro Dalcin #define PetscAsinhScalar(a)   PetscAsinhReal(a)
5315117d392SLisandro Dalcin #define PetscAcoshScalar(a)   PetscAcoshReal(a)
5325117d392SLisandro Dalcin #define PetscAtanhScalar(a)   PetscAtanhReal(a)
5335117d392SLisandro Dalcin 
5345117d392SLisandro Dalcin #endif /* PETSC_USE_COMPLEX */
5355117d392SLisandro Dalcin 
5365117d392SLisandro Dalcin /*
5375117d392SLisandro Dalcin    Certain objects may be created using either single or double precision.
5385117d392SLisandro Dalcin    This is currently not used.
5395117d392SLisandro Dalcin */
5405117d392SLisandro Dalcin typedef enum { PETSC_SCALAR_DOUBLE, PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE, PETSC_SCALAR_HALF } PetscScalarPrecision;
5415117d392SLisandro Dalcin 
5425117d392SLisandro Dalcin /* --------------------------------------------------------------------------*/
5435117d392SLisandro Dalcin 
5445117d392SLisandro Dalcin /*MC
5455117d392SLisandro Dalcin    PetscAbs - Returns the absolute value of a number
5465117d392SLisandro Dalcin 
5475117d392SLisandro Dalcin    Synopsis:
5485117d392SLisandro Dalcin    #include <petscmath.h>
5495117d392SLisandro Dalcin    type PetscAbs(type v)
5505117d392SLisandro Dalcin 
5515117d392SLisandro Dalcin    Not Collective
5525117d392SLisandro Dalcin 
5535117d392SLisandro Dalcin    Input Parameter:
5545117d392SLisandro Dalcin .  v - the number
5555117d392SLisandro Dalcin 
5565117d392SLisandro Dalcin    Notes:
5575117d392SLisandro Dalcin     type can be integer or real floating point value
5585117d392SLisandro Dalcin 
5595117d392SLisandro Dalcin    Level: beginner
5605117d392SLisandro Dalcin 
5615117d392SLisandro Dalcin .seealso: PetscAbsInt(), PetscAbsReal(), PetscAbsScalar()
5625117d392SLisandro Dalcin 
5635117d392SLisandro Dalcin M*/
5645117d392SLisandro Dalcin #define PetscAbs(a)  (((a) >= 0) ? (a) : (-(a)))
5655117d392SLisandro Dalcin 
5665117d392SLisandro Dalcin /*MC
5675117d392SLisandro Dalcin    PetscSign - Returns the sign of a number as an integer
5685117d392SLisandro Dalcin 
5695117d392SLisandro Dalcin    Synopsis:
5705117d392SLisandro Dalcin    #include <petscmath.h>
5715117d392SLisandro Dalcin    int PetscSign(type v)
5725117d392SLisandro Dalcin 
5735117d392SLisandro Dalcin    Not Collective
5745117d392SLisandro Dalcin 
5755117d392SLisandro Dalcin    Input Parameter:
5765117d392SLisandro Dalcin .  v - the number
5775117d392SLisandro Dalcin 
5785117d392SLisandro Dalcin    Notes:
5795117d392SLisandro Dalcin     type can be integer or real floating point value
5805117d392SLisandro Dalcin 
5815117d392SLisandro Dalcin    Level: beginner
5825117d392SLisandro Dalcin 
5835117d392SLisandro Dalcin M*/
5845117d392SLisandro Dalcin #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
585e489efc1SBarry Smith 
586b6a5bde7SBarry Smith /*MC
587b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
588b6a5bde7SBarry Smith 
589eca87e8dSBarry Smith    Synopsis:
590aaa7dc30SBarry Smith    #include <petscmath.h>
591eca87e8dSBarry Smith    type PetscMin(type v1,type v2)
592eca87e8dSBarry Smith 
593eca87e8dSBarry Smith    Not Collective
594eca87e8dSBarry Smith 
595b6a5bde7SBarry Smith    Input Parameter:
596b6a5bde7SBarry Smith +  v1 - first value to find minimum of
597b6a5bde7SBarry Smith -  v2 - second value to find minimum of
598b6a5bde7SBarry Smith 
59995452b02SPatrick Sanan    Notes:
60095452b02SPatrick Sanan     type can be integer or floating point value
601b6a5bde7SBarry Smith 
602b6a5bde7SBarry Smith    Level: beginner
603b6a5bde7SBarry Smith 
6041175f9beSHong Zhang .seealso: PetscMax(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
605b6a5bde7SBarry Smith 
606b6a5bde7SBarry Smith M*/
607e489efc1SBarry Smith #define PetscMin(a,b)   (((a)<(b)) ?  (a) : (b))
608b6a5bde7SBarry Smith 
609b6a5bde7SBarry Smith /*MC
610b6a5bde7SBarry Smith    PetscMax - Returns maxium of two numbers
611b6a5bde7SBarry Smith 
612eca87e8dSBarry Smith    Synopsis:
613aaa7dc30SBarry Smith    #include <petscmath.h>
614eca87e8dSBarry Smith    type max PetscMax(type v1,type v2)
615eca87e8dSBarry Smith 
616eca87e8dSBarry Smith    Not Collective
617eca87e8dSBarry Smith 
618b6a5bde7SBarry Smith    Input Parameter:
619b6a5bde7SBarry Smith +  v1 - first value to find maximum of
620b6a5bde7SBarry Smith -  v2 - second value to find maximum of
621b6a5bde7SBarry Smith 
62295452b02SPatrick Sanan    Notes:
62395452b02SPatrick Sanan     type can be integer or floating point value
624b6a5bde7SBarry Smith 
625b6a5bde7SBarry Smith    Level: beginner
626b6a5bde7SBarry Smith 
627d9a4bb16SJed Brown .seealso: PetscMin(), PetscClipInterval(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
628b6a5bde7SBarry Smith 
629b6a5bde7SBarry Smith M*/
630e489efc1SBarry Smith #define PetscMax(a,b)   (((a)<(b)) ?  (b) : (a))
631b6a5bde7SBarry Smith 
632b6a5bde7SBarry Smith /*MC
633d9a4bb16SJed Brown    PetscClipInterval - Returns a number clipped to be within an interval
634d9a4bb16SJed Brown 
635d9a4bb16SJed Brown    Synopsis:
636aaa7dc30SBarry Smith    #include <petscmath.h>
637d9a4bb16SJed Brown    type clip PetscClipInterval(type x,type a,type b)
638d9a4bb16SJed Brown 
639d9a4bb16SJed Brown    Not Collective
640d9a4bb16SJed Brown 
641d9a4bb16SJed Brown    Input Parameter:
6420d398bfeSStefano Zampini +  x - value to use if within interval [a,b]
643d9a4bb16SJed Brown .  a - lower end of interval
644d9a4bb16SJed Brown -  b - upper end of interval
645d9a4bb16SJed Brown 
64695452b02SPatrick Sanan    Notes:
64795452b02SPatrick Sanan     type can be integer or floating point value
648d9a4bb16SJed Brown 
649d9a4bb16SJed Brown    Level: beginner
650d9a4bb16SJed Brown 
651d9a4bb16SJed Brown .seealso: PetscMin(), PetscMax(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
652d9a4bb16SJed Brown 
653d9a4bb16SJed Brown M*/
654d9a4bb16SJed Brown #define PetscClipInterval(x,a,b)   (PetscMax((a),PetscMin((x),(b))))
655d9a4bb16SJed Brown 
656d9a4bb16SJed Brown /*MC
657b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
658b6a5bde7SBarry Smith 
659b6a5bde7SBarry Smith    Synopsis:
660aaa7dc30SBarry Smith    #include <petscmath.h>
661b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
662b6a5bde7SBarry Smith 
663eca87e8dSBarry Smith    Not Collective
664eca87e8dSBarry Smith 
665eca87e8dSBarry Smith    Input Parameter:
666eca87e8dSBarry Smith .   v1 - the integer
667b6a5bde7SBarry Smith 
668b6a5bde7SBarry Smith    Level: beginner
669b6a5bde7SBarry Smith 
670b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr()
671b6a5bde7SBarry Smith 
672b6a5bde7SBarry Smith M*/
6739fa7d148SSatish Balay #define PetscAbsInt(a)  (((a)<0)   ? (-(a)) : (a))
674b6a5bde7SBarry Smith 
675b6a5bde7SBarry Smith /*MC
676b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
677b6a5bde7SBarry Smith 
678eca87e8dSBarry Smith    Synopsis:
679aaa7dc30SBarry Smith    #include <petscmath.h>
680eca87e8dSBarry Smith    Real abs PetscAbsReal(PetscReal v1)
681eca87e8dSBarry Smith 
682eca87e8dSBarry Smith    Not Collective
683eca87e8dSBarry Smith 
684b6a5bde7SBarry Smith    Input Parameter:
685b6a5bde7SBarry Smith .   v1 - the double
686b6a5bde7SBarry Smith 
687b6a5bde7SBarry Smith    Level: beginner
688b6a5bde7SBarry Smith 
689b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr()
690b6a5bde7SBarry Smith 
691b6a5bde7SBarry Smith M*/
6921118d4bcSLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
6931118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
6941118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
6951118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabs(a)
6961118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
6971118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsq(a)
6981118d4bcSLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
6991118d4bcSLisandro Dalcin #define PetscAbsReal(a) fabsf(a)
7001118d4bcSLisandro Dalcin #endif
701b6a5bde7SBarry Smith 
702b6a5bde7SBarry Smith /*MC
703b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
704b6a5bde7SBarry Smith 
705b6a5bde7SBarry Smith    Synopsis:
706aaa7dc30SBarry Smith    #include <petscmath.h>
707b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
708b6a5bde7SBarry Smith 
709eca87e8dSBarry Smith    Not Collective
710eca87e8dSBarry Smith 
711eca87e8dSBarry Smith    Input Parameter:
712eca87e8dSBarry Smith .   v1 - the value
713eca87e8dSBarry Smith 
71495452b02SPatrick Sanan    Notes:
71595452b02SPatrick Sanan     type can be integer or floating point value
716b6a5bde7SBarry Smith 
717b6a5bde7SBarry Smith    Level: beginner
718b6a5bde7SBarry Smith 
719b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal()
720b6a5bde7SBarry Smith 
721b6a5bde7SBarry Smith M*/
7224ebda54eSMatthew Knepley #define PetscSqr(a)     ((a)*(a))
723e489efc1SBarry Smith 
724314da920SBarry Smith /* ----------------------------------------------------------------------------*/
725ee223c85SLisandro Dalcin 
726ee223c85SLisandro Dalcin #if defined(PETSC_USE_REAL_SINGLE)
727ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##F
7285117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE)
7295117d392SLisandro Dalcin #define PetscRealConstant(constant) constant
730ee223c85SLisandro Dalcin #elif defined(PETSC_USE_REAL___FLOAT128)
731ee223c85SLisandro Dalcin #define PetscRealConstant(constant) constant##Q
7325117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7335117d392SLisandro Dalcin #define PetscRealConstant(constant) constant##F
734ee223c85SLisandro Dalcin #endif
735ee223c85SLisandro Dalcin 
736314da920SBarry Smith /*
737d34fcf5fSBarry Smith      Basic constants
738314da920SBarry Smith */
7392fab75feSLisandro Dalcin #define PETSC_PI    PetscRealConstant(3.1415926535897932384626433832795029)
7402fab75feSLisandro Dalcin #define PETSC_PHI   PetscRealConstant(1.6180339887498948482045868343656381)
7417b156302SMatthew G. Knepley #define PETSC_SQRT2 PetscRealConstant(1.4142135623730950488016887242096981)
742d34fcf5fSBarry Smith 
743ab824b78SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES)
74471fd2e92SBarry Smith #define PETSC_MAX_INT            2147483647
745ab824b78SBarry Smith #define PETSC_MIN_INT            (-PETSC_MAX_INT - 1)
746ab824b78SBarry Smith #else
747ab824b78SBarry Smith #define PETSC_MAX_INT            9223372036854775807L
748ab824b78SBarry Smith #define PETSC_MIN_INT            (-PETSC_MAX_INT - 1)
749ab824b78SBarry Smith #endif
750569ea7c4SPierre Jolivet #define PETSC_MAX_UINT16         65535
751e489efc1SBarry Smith 
752ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
753ab824b78SBarry Smith #  define PETSC_MAX_REAL                3.40282346638528860e+38F
7549fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
75582a7e548SBarry Smith #  define PETSC_MACHINE_EPSILON         1.19209290e-07F
75682a7e548SBarry Smith #  define PETSC_SQRT_MACHINE_EPSILON    3.45266983e-04F
757ee223c85SLisandro Dalcin #  define PETSC_SMALL                   1.e-5F
758ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
759ab824b78SBarry Smith #  define PETSC_MAX_REAL                1.7976931348623157e+308
7609fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
76182a7e548SBarry Smith #  define PETSC_MACHINE_EPSILON         2.2204460492503131e-16
76282a7e548SBarry Smith #  define PETSC_SQRT_MACHINE_EPSILON    1.490116119384766e-08
763cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-10
764ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128)
765ea345e14SBarry Smith #  define PETSC_MAX_REAL                FLT128_MAX
7669fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-FLT128_MAX)
767d34fcf5fSBarry Smith #  define PETSC_MACHINE_EPSILON         FLT128_EPSILON
768ee223c85SLisandro Dalcin #  define PETSC_SQRT_MACHINE_EPSILON    1.38777878078144567552953958511352539e-17Q
769ee223c85SLisandro Dalcin #  define PETSC_SMALL                   1.e-20Q
7705117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL___FP16)
7715117d392SLisandro Dalcin #  define PETSC_MAX_REAL                65504.0F
7729fa7d148SSatish Balay #  define PETSC_MIN_REAL                (-PETSC_MAX_REAL)
7735117d392SLisandro Dalcin #  define PETSC_MACHINE_EPSILON         .0009765625F
7745117d392SLisandro Dalcin #  define PETSC_SQRT_MACHINE_EPSILON    .03125F
7755117d392SLisandro Dalcin #  define PETSC_SMALL                   5.e-3F
7769cf09972SJed Brown #endif
7773e523bebSBarry Smith 
77825d0f998SSatish Balay #define PETSC_INFINITY               (PETSC_MAX_REAL/4)
7799fa7d148SSatish Balay #define PETSC_NINFINITY              (-PETSC_INFINITY)
780e270355aSBarry Smith 
7819f4f8022SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsInfReal(PetscReal);
7823948c36eSLisandro Dalcin PETSC_EXTERN PetscBool PetscIsNanReal(PetscReal);
7838b49ba18SBarry Smith PETSC_EXTERN PetscBool PetscIsNormalReal(PetscReal);
7849f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanReal(PetscReal v) {return PetscIsInfReal(v) || PetscIsNanReal(v) ? PETSC_TRUE : PETSC_FALSE;}
7859f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfScalar(PetscScalar v) {return PetscIsInfReal(PetscAbsScalar(v));}
7863948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNanScalar(PetscScalar v) {return PetscIsNanReal(PetscAbsScalar(v));}
7879f4f8022SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsInfOrNanScalar(PetscScalar v) {return PetscIsInfOrNanReal(PetscAbsScalar(v));}
7883948c36eSLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscIsNormalScalar(PetscScalar v) {return PetscIsNormalReal(PetscAbsScalar(v));}
7899a25a3ccSBarry Smith 
790b10005b4SLisandro Dalcin PETSC_EXTERN PetscBool PetscIsCloseAtTol(PetscReal,PetscReal,PetscReal,PetscReal);
791ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualReal(PetscReal,PetscReal);
792ce4818fdSLisandro Dalcin PETSC_EXTERN PetscBool PetscEqualScalar(PetscScalar,PetscScalar);
793ce4818fdSLisandro Dalcin 
79498725619SBarry Smith /*
79598725619SBarry Smith     These macros are currently hardwired to match the regular data types, so there is no support for a different
79698725619SBarry Smith     MatScalar from PetscScalar. We left the MatScalar in the source just in case we use it again.
79798725619SBarry Smith  */
79898725619SBarry Smith #define MPIU_MATSCALAR MPIU_SCALAR
79998725619SBarry Smith typedef PetscScalar MatScalar;
80098725619SBarry Smith typedef PetscReal MatReal;
80198725619SBarry Smith 
8028ad47952SJed Brown struct petsc_mpiu_2scalar {PetscScalar a,b;};
8038ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2SCALAR PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2scalar);
804df4397b0SStefano Zampini 
805*092991acSStefano Zampini /*
806*092991acSStefano Zampini    MPI Datatypes for composite reductions:
807*092991acSStefano Zampini    MPIU_REAL_INT -> struct { PetscReal; PetscInt; }
808*092991acSStefano Zampini    MPIU_SCALAR_INT -> struct { PetscScalar; PetscInt; }
809*092991acSStefano Zampini */
810*092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_REAL_INT;
811*092991acSStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_SCALAR_INT;
812*092991acSStefano Zampini 
813a616ada9SVaclav Hapla #if defined(PETSC_USE_64BIT_INDICES)
8148ad47952SJed Brown struct petsc_mpiu_2int {PetscInt a,b;};
8158ad47952SJed Brown PETSC_EXTERN MPI_Datatype MPIU_2INT PetscAttrMPITypeTagLayoutCompatible(struct petsc_mpiu_2int);
8168ad47952SJed Brown #else
8178ad47952SJed Brown #define MPIU_2INT MPI_2INT
8188ad47952SJed Brown #endif
819e9fa29b7SSatish Balay 
820b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscInt PetscPowInt(PetscInt base,PetscInt power)
821b2fb0278SBarry Smith {
822fa711258SJed Brown   PetscInt result = 1;
823fa711258SJed Brown   while (power) {
824fa711258SJed Brown     if (power & 1) result *= base;
825fa711258SJed Brown     power >>= 1;
826fa711258SJed Brown     base *= base;
827fa711258SJed Brown   }
828fa711258SJed Brown   return result;
829fa711258SJed Brown }
830b2fb0278SBarry Smith 
831ad70a4c3SStefano Zampini PETSC_STATIC_INLINE PetscInt64 PetscPowInt64(PetscInt base,PetscInt power)
832ad70a4c3SStefano Zampini {
833ad70a4c3SStefano Zampini   PetscInt64 result = 1;
834ad70a4c3SStefano Zampini   while (power) {
835ad70a4c3SStefano Zampini     if (power & 1) result *= base;
836ad70a4c3SStefano Zampini     power >>= 1;
837ad70a4c3SStefano Zampini     base *= base;
838ad70a4c3SStefano Zampini   }
839ad70a4c3SStefano Zampini   return result;
840ad70a4c3SStefano Zampini }
841ad70a4c3SStefano Zampini 
842b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscReal PetscPowRealInt(PetscReal base,PetscInt power)
843b2fb0278SBarry Smith {
844fa711258SJed Brown   PetscReal result = 1;
845d98d5da7SBarry Smith   if (power < 0) {
846d98d5da7SBarry Smith     power = -power;
84710d40e53SLisandro Dalcin     base  = ((PetscReal)1)/base;
848d98d5da7SBarry Smith   }
849fa711258SJed Brown   while (power) {
850fa711258SJed Brown     if (power & 1) result *= base;
851fa711258SJed Brown     power >>= 1;
852fa711258SJed Brown     base *= base;
853fa711258SJed Brown   }
854fa711258SJed Brown   return result;
855fa711258SJed Brown }
856fa711258SJed Brown 
857b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarInt(PetscScalar base,PetscInt power)
858b2fb0278SBarry Smith {
8595117d392SLisandro Dalcin   PetscScalar result = (PetscReal)1;
8608b49ba18SBarry Smith   if (power < 0) {
8618b49ba18SBarry Smith     power = -power;
86210d40e53SLisandro Dalcin     base  = ((PetscReal)1)/base;
8638b49ba18SBarry Smith   }
8648b49ba18SBarry Smith   while (power) {
8658b49ba18SBarry Smith     if (power & 1) result *= base;
8668b49ba18SBarry Smith     power >>= 1;
8678b49ba18SBarry Smith     base *= base;
8688b49ba18SBarry Smith   }
8698b49ba18SBarry Smith   return result;
8708b49ba18SBarry Smith }
8718b49ba18SBarry Smith 
872b2fb0278SBarry Smith PETSC_STATIC_INLINE PetscScalar PetscPowScalarReal(PetscScalar base,PetscReal power)
873b2fb0278SBarry Smith {
874b2fb0278SBarry Smith   PetscScalar cpower = power;
875b2fb0278SBarry Smith   return PetscPowScalar(base,cpower);
876b2fb0278SBarry Smith }
87778a59e97SMatthew G. Knepley 
878c803a25aSBarry Smith /*MC
879c803a25aSBarry Smith     PetscLTE - Performs a less than or equal to on a given constant with a fudge for floating point numbers
880c803a25aSBarry Smith 
881c803a25aSBarry Smith    Synopsis:
882c803a25aSBarry Smith    #include <petscmath.h>
883c803a25aSBarry Smith    bool PetscLTE(PetscReal x,constant float)
884c803a25aSBarry Smith 
885c803a25aSBarry Smith    Not Collective
886c803a25aSBarry Smith 
887c803a25aSBarry Smith    Input Parameters:
888c803a25aSBarry Smith +   x - the variable
889c803a25aSBarry Smith -   b - the constant float it is checking if x is less than or equal to
890c803a25aSBarry Smith 
891c803a25aSBarry Smith    Notes:
892c803a25aSBarry Smith      The fudge factor is the value PETSC_SMALL
893c803a25aSBarry Smith 
894c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
895c803a25aSBarry Smith 
896c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
897c803a25aSBarry Smith      floating point results.
898c803a25aSBarry Smith 
899c803a25aSBarry Smith    Level: advanced
900c803a25aSBarry Smith 
901c803a25aSBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscGTE()
902c803a25aSBarry Smith 
903c803a25aSBarry Smith M*/
904c803a25aSBarry Smith #define PetscLTE(x,b)  ((x) <= (PetscRealConstant(b)+PETSC_SMALL))
905c803a25aSBarry Smith 
906c803a25aSBarry Smith /*MC
907c803a25aSBarry Smith     PetscGTE - Performs a greater than or equal to on a given constant with a fudge for floating point numbers
908c803a25aSBarry Smith 
909c803a25aSBarry Smith    Synopsis:
910c803a25aSBarry Smith    #include <petscmath.h>
911c803a25aSBarry Smith    bool PetscGTE(PetscReal x,constant float)
912c803a25aSBarry Smith 
913c803a25aSBarry Smith    Not Collective
914c803a25aSBarry Smith 
915c803a25aSBarry Smith    Input Parameters:
916c803a25aSBarry Smith +   x - the variable
917c803a25aSBarry Smith -   b - the constant float it is checking if x is greater than or equal to
918c803a25aSBarry Smith 
919c803a25aSBarry Smith    Notes:
920c803a25aSBarry Smith      The fudge factor is the value PETSC_SMALL
921c803a25aSBarry Smith 
922c803a25aSBarry Smith      The constant numerical value is automatically set to the appropriate precision of PETSc so can just be provided as, for example, 3.2
923c803a25aSBarry Smith 
924c803a25aSBarry Smith      This is used in several examples for setting initial conditions based on coordinate values that are computed with i*h that produces inexact
925c803a25aSBarry Smith      floating point results.
926c803a25aSBarry Smith 
927c803a25aSBarry Smith    Level: advanced
928c803a25aSBarry Smith 
929c803a25aSBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscLTE()
930c803a25aSBarry Smith 
931c803a25aSBarry Smith M*/
932c803a25aSBarry Smith #define PetscGTE(x,b)  ((x) >= (PetscRealConstant(b)-PETSC_SMALL))
933c803a25aSBarry Smith 
934bebf13c0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLinearRegression(PetscInt,const PetscReal[],const PetscReal[],PetscReal*,PetscReal*);
935e489efc1SBarry Smith #endif
936