xref: /petsc/include/petscmath.h (revision 3f6de6ef4ddbd77fd57989ee6ffd8428dd7d17ac)
1*3f6de6efSSatish Balay /* $Id: petscmath.h,v 1.4 1998/04/18 13:52:21 bsmith Exp balay $ */
2e489efc1SBarry Smith /*
3314da920SBarry Smith 
4314da920SBarry Smith       PETSc mathematics include file. Defines certain basic mathematical
5314da920SBarry Smith     constants and functions for working with single and double precision
6314da920SBarry Smith     floating point numbers as well as complex and integers.
7314da920SBarry Smith 
8e489efc1SBarry Smith */
9314da920SBarry Smith #include "petsc.h"
10e489efc1SBarry Smith 
110a5f7794SBarry Smith #if !defined(__PETSCMATH_PACKAGE)
120a5f7794SBarry Smith #define __PETSCMATH_PACKAGE
130a5f7794SBarry Smith #include <math.h>
140a5f7794SBarry Smith 
15314da920SBarry Smith /*
16f4ccad53SBarry Smith 
17f4ccad53SBarry Smith      Defines operations that are different for complex and real numbers;
18f4ccad53SBarry Smith    note that one cannot really mix the use of complex and real in the same
19f4ccad53SBarry Smith    PETSc program. All PETSc objects in one program are built around the object
20f4ccad53SBarry Smith    Scalar which is either always a double or a complex.
21f4ccad53SBarry Smith 
22e489efc1SBarry Smith */
230a5f7794SBarry Smith #if defined(USE_PETSC_COMPLEX)
24*3f6de6efSSatish Balay #if defined (PARCH_nt)
25*3f6de6efSSatish Balay #include <complex>
26*3f6de6efSSatish Balay #define PetscReal(a)      a.real()
27*3f6de6efSSatish Balay #define PetscImaginary(a) a.imag()
28*3f6de6efSSatish Balay #define PetscAbsScalar(a) std::abs(a)
29*3f6de6efSSatish Balay #define PetscConj(a)      std::conj(a)
30*3f6de6efSSatish Balay 
31*3f6de6efSSatish Balay #elif defined(HAVE_NONSTANDARD_COMPLEX_H)
32e489efc1SBarry Smith #include HAVE_NONSTANDARD_COMPLEX_H
33e489efc1SBarry Smith #else
34e489efc1SBarry Smith #include <complex.h>
35e489efc1SBarry Smith #endif
36e489efc1SBarry Smith extern  MPI_Datatype      MPIU_COMPLEX;
37e489efc1SBarry Smith #define MPIU_SCALAR       MPIU_COMPLEX
38e489efc1SBarry Smith #define PetscReal(a)      real(a)
39e489efc1SBarry Smith #define PetscImaginary(a) imag(a)
40e489efc1SBarry Smith #define PetscAbsScalar(a) abs(a)
41e489efc1SBarry Smith #define PetscConj(a)      conj(a)
42e489efc1SBarry Smith /*
43e489efc1SBarry Smith   The new complex class for GNU C++ is based on templates and is not backward
44e489efc1SBarry Smith   compatible with all previous complex class libraries.
45e489efc1SBarry Smith */
46e489efc1SBarry Smith #if defined(USES_TEMPLATED_COMPLEX)
47e489efc1SBarry Smith #define Scalar            complex<double>
48e489efc1SBarry Smith #else
49e489efc1SBarry Smith #define Scalar            complex
50e489efc1SBarry Smith #endif
51e489efc1SBarry Smith 
52e489efc1SBarry Smith /* Compiling for real numbers only */
53e489efc1SBarry Smith #else
54e489efc1SBarry Smith #define MPIU_SCALAR       MPI_DOUBLE
55e489efc1SBarry Smith #define PetscReal(a)      (a)
56e489efc1SBarry Smith #define PetscImaginary(a) (a)
57e489efc1SBarry Smith #define PetscAbsScalar(a) ( ((a)<0.0)   ? -(a) : (a) )
58e489efc1SBarry Smith #define Scalar            double
59e489efc1SBarry Smith #define PetscConj(a)      (a)
60e489efc1SBarry Smith #endif
61e489efc1SBarry Smith 
62314da920SBarry Smith /* --------------------------------------------------------------------------*/
63314da920SBarry Smith 
64e489efc1SBarry Smith /*
65e489efc1SBarry Smith    Certain objects may be created using either single
66e489efc1SBarry Smith   or double precision.
67e489efc1SBarry Smith */
68e489efc1SBarry Smith typedef enum { SCALAR_DOUBLE, SCALAR_SINGLE } ScalarPrecision;
69e489efc1SBarry Smith 
70e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */
71e489efc1SBarry Smith extern  Scalar            PETSC_i;
72e489efc1SBarry Smith 
73e489efc1SBarry Smith #define PetscMin(a,b)      ( ((a)<(b)) ? (a) : (b) )
74e489efc1SBarry Smith #define PetscMax(a,b)      ( ((a)<(b)) ? (b) : (a) )
75e489efc1SBarry Smith #define PetscAbsInt(a)     ( ((a)<0)   ? -(a) : (a) )
76e489efc1SBarry Smith #define PetscAbsDouble(a)  ( ((a)<0)   ? -(a) : (a) )
77e489efc1SBarry Smith 
78314da920SBarry Smith /* ----------------------------------------------------------------------------*/
79314da920SBarry Smith /*
80314da920SBarry Smith      Basic constants
81314da920SBarry Smith */
82314da920SBarry Smith #define PETSC_PI                 3.14159265358979323846264
83314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994
84e489efc1SBarry Smith #define PETSC_MAX                1.e300
85e489efc1SBarry Smith #define PETSC_MIN                -1.e300
860a5f7794SBarry Smith #define PETSC_MAX_INT            1000000000;
870a5f7794SBarry Smith #define PETSC_MIN_INT            -1000000000;
88e489efc1SBarry Smith 
89314da920SBarry Smith /* ----------------------------------------------------------------------------*/
90e489efc1SBarry Smith /*
91e489efc1SBarry Smith     PLogDouble variables are used to contain double precision numbers
92e489efc1SBarry Smith   that are not used in the numerical computations, but rather in logging,
93e489efc1SBarry Smith   timing etc.
94e489efc1SBarry Smith */
95e489efc1SBarry Smith typedef double PLogDouble;
96e489efc1SBarry Smith /*
97e489efc1SBarry Smith       Once PETSc is compiling with a ADIC enhanced version of MPI
98e489efc1SBarry Smith    we will create a new MPI_Datatype for the inactive double variables.
99e489efc1SBarry Smith */
100e489efc1SBarry Smith #if defined(AD_DERIV_H)
101e489efc1SBarry Smith /* extern  MPI_Datatype  MPIU_PLOGDOUBLE; */
102e489efc1SBarry Smith #else
103e489efc1SBarry Smith #if !defined(PETSC_USING_MPIUNI)
104e489efc1SBarry Smith #define MPIU_PLOGDOUBLE MPI_DOUBLE
105e489efc1SBarry Smith #endif
106e489efc1SBarry Smith #endif
107e489efc1SBarry Smith 
108e489efc1SBarry Smith 
109e489efc1SBarry Smith #endif
110