xref: /petsc/include/petscmath.h (revision 18a7d68fc2f5cf5dd06b272efb89dfa4051d0411)
1*18a7d68fSSatish Balay /* $Id: petscmath.h,v 1.7 1998/05/30 00:05:39 balay 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)
24adc17e78SSatish Balay 
25df9b3741SSatish Balay #if defined (PARCH_nt)
26df9b3741SSatish Balay #include <complex>
27df9b3741SSatish Balay #elif defined(HAVE_NONSTANDARD_COMPLEX_H)
28adc17e78SSatish Balay #include HAVE_NONSTANDARD_COMPLEX_H
29adc17e78SSatish Balay #else
30adc17e78SSatish Balay #include <complex.h>
31adc17e78SSatish Balay #endif
32adc17e78SSatish Balay 
33adc17e78SSatish Balay extern  MPI_Datatype       MPIU_COMPLEX;
34adc17e78SSatish Balay #define MPIU_SCALAR        MPIU_COMPLEX
353f6de6efSSatish Balay #if defined (PARCH_nt)
36df9b3741SSatish Balay #define PetscReal(a)       (a).real()
37df9b3741SSatish Balay #define PetscImaginary(a)  (a).imag()
383f6de6efSSatish Balay #define PetscAbsScalar(a)  std::abs(a)
393f6de6efSSatish Balay #define PetscConj(a)       std::conj(a)
40*18a7d68fSSatish Balay #define PetscSqrtScalar(a) std::sqrt(a)
41e489efc1SBarry Smith #else
42e489efc1SBarry Smith #define PetscReal(a)       real(a)
43e489efc1SBarry Smith #define PetscImaginary(a)  imag(a)
44e489efc1SBarry Smith #define PetscAbsScalar(a)  abs(a)
45e489efc1SBarry Smith #define PetscConj(a)       conj(a)
46*18a7d68fSSatish Balay #define PetscSqrtScalar(a) sqrt(a)
47adc17e78SSatish Balay #endif
48e489efc1SBarry Smith /*
49e489efc1SBarry Smith   The new complex class for GNU C++ is based on templates and is not backward
50e489efc1SBarry Smith   compatible with all previous complex class libraries.
51e489efc1SBarry Smith */
52df9b3741SSatish Balay #if defined(PARCH_nt)
53df9b3741SSatish Balay #define Scalar            std::complex<double>
54df9b3741SSatish Balay #elif defined(USES_TEMPLATED_COMPLEX)
55e489efc1SBarry Smith #define Scalar            complex<double>
56e489efc1SBarry Smith #else
57e489efc1SBarry Smith #define Scalar            complex
58e489efc1SBarry Smith #endif
59e489efc1SBarry Smith 
60e489efc1SBarry Smith /* Compiling for real numbers only */
61e489efc1SBarry Smith #else
62e489efc1SBarry Smith #define MPIU_SCALAR        MPI_DOUBLE
63e489efc1SBarry Smith #define PetscReal(a)       (a)
64e489efc1SBarry Smith #define PetscImaginary(a)  (a)
65e489efc1SBarry Smith #define PetscAbsScalar(a)  ( ((a)<0.0)   ? -(a) : (a) )
66e489efc1SBarry Smith #define Scalar             double
67e489efc1SBarry Smith #define PetscConj(a)       (a)
68*18a7d68fSSatish Balay #define PetscSqrtScalar(a) sqrt(a)
69e489efc1SBarry Smith #endif
70e489efc1SBarry Smith 
71314da920SBarry Smith /* --------------------------------------------------------------------------*/
72314da920SBarry Smith 
73e489efc1SBarry Smith /*
74e489efc1SBarry Smith    Certain objects may be created using either single
75e489efc1SBarry Smith   or double precision.
76e489efc1SBarry Smith */
77e489efc1SBarry Smith typedef enum { SCALAR_DOUBLE, SCALAR_SINGLE } ScalarPrecision;
78e489efc1SBarry Smith 
79e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */
80e489efc1SBarry Smith extern  Scalar            PETSC_i;
81e489efc1SBarry Smith 
82e489efc1SBarry Smith #define PetscMin(a,b)      ( ((a)<(b)) ? (a) : (b) )
83e489efc1SBarry Smith #define PetscMax(a,b)      ( ((a)<(b)) ? (b) : (a) )
84e489efc1SBarry Smith #define PetscAbsInt(a)     ( ((a)<0)   ? -(a) : (a) )
85e489efc1SBarry Smith #define PetscAbsDouble(a)  ( ((a)<0)   ? -(a) : (a) )
86e489efc1SBarry Smith 
87314da920SBarry Smith /* ----------------------------------------------------------------------------*/
88314da920SBarry Smith /*
89314da920SBarry Smith      Basic constants
90314da920SBarry Smith */
91314da920SBarry Smith #define PETSC_PI                 3.14159265358979323846264
92314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994
93e489efc1SBarry Smith #define PETSC_MAX                1.e300
94e489efc1SBarry Smith #define PETSC_MIN                -1.e300
950a5f7794SBarry Smith #define PETSC_MAX_INT            1000000000;
960a5f7794SBarry Smith #define PETSC_MIN_INT            -1000000000;
97e489efc1SBarry Smith 
98314da920SBarry Smith /* ----------------------------------------------------------------------------*/
99e489efc1SBarry Smith /*
100e489efc1SBarry Smith     PLogDouble variables are used to contain double precision numbers
101e489efc1SBarry Smith   that are not used in the numerical computations, but rather in logging,
102e489efc1SBarry Smith   timing etc.
103e489efc1SBarry Smith */
104e489efc1SBarry Smith typedef double PLogDouble;
105e489efc1SBarry Smith /*
106e489efc1SBarry Smith       Once PETSc is compiling with a ADIC enhanced version of MPI
107e489efc1SBarry Smith    we will create a new MPI_Datatype for the inactive double variables.
108e489efc1SBarry Smith */
109e489efc1SBarry Smith #if defined(AD_DERIV_H)
110e489efc1SBarry Smith /* extern  MPI_Datatype  MPIU_PLOGDOUBLE; */
111e489efc1SBarry Smith #else
112e489efc1SBarry Smith #if !defined(PETSC_USING_MPIUNI)
113e489efc1SBarry Smith #define MPIU_PLOGDOUBLE MPI_DOUBLE
114e489efc1SBarry Smith #endif
115e489efc1SBarry Smith #endif
116e489efc1SBarry Smith 
117e489efc1SBarry Smith 
118e489efc1SBarry Smith #endif
119