xref: /petsc/include/petscmath.h (revision cf6e855f349c28fa0b7f196fa8310cf3f780eb3d)
1*cf6e855fSSatish Balay /* $Id: petscmath.h,v 1.30 2001/08/10 18:50:00 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 
8e7029fe1SSatish Balay     This file is included by petsc.h and should not be used directly.
9e7029fe1SSatish Balay 
10e489efc1SBarry Smith */
11e489efc1SBarry Smith 
12488ecbafSBarry Smith #if !defined(__PETSCMATH_H)
13488ecbafSBarry Smith #define __PETSCMATH_H
140a5f7794SBarry Smith #include <math.h>
150a5f7794SBarry Smith 
16314da920SBarry Smith /*
17f4ccad53SBarry Smith 
18f4ccad53SBarry Smith      Defines operations that are different for complex and real numbers;
19f4ccad53SBarry Smith    note that one cannot really mix the use of complex and real in the same
20f4ccad53SBarry Smith    PETSc program. All PETSc objects in one program are built around the object
21ea709b57SSatish Balay    PetscScalar which is either always a double or a complex.
22f4ccad53SBarry Smith 
23e489efc1SBarry Smith */
24aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
25adc17e78SSatish Balay 
26c80bc32dSSatish Balay #if defined (PETSC_HAVE_STD_COMPLEX)
27df9b3741SSatish Balay #include <complex>
28aa482453SBarry Smith #elif defined(PETSC_HAVE_NONSTANDARD_COMPLEX_H)
29aa482453SBarry Smith #include PETSC_HAVE_NONSTANDARD_COMPLEX_H
30adc17e78SSatish Balay #else
31adc17e78SSatish Balay #include <complex.h>
32adc17e78SSatish Balay #endif
33adc17e78SSatish Balay 
34adc17e78SSatish Balay extern  MPI_Datatype        MPIU_COMPLEX;
35adc17e78SSatish Balay #define MPIU_SCALAR         MPIU_COMPLEX
363eda8832SBarry Smith #if defined(PETSC_USE_MAT_SINGLE)
373eda8832SBarry Smith #define MPIU_MATSCALAR        ??Notdone
383eda8832SBarry Smith #else
393eda8832SBarry Smith #define MPIU_MATSCALAR      MPIU_COMPLEX
403eda8832SBarry Smith #endif
413eda8832SBarry Smith 
42c80bc32dSSatish Balay #if defined (PETSC_HAVE_STD_COMPLEX)
43329f5518SBarry Smith #define PetscRealPart(a)        (a).real()
44329f5518SBarry Smith #define PetscImaginaryPart(a)   (a).imag()
453f6de6efSSatish Balay #define PetscAbsScalar(a)   std::abs(a)
463f6de6efSSatish Balay #define PetscConj(a)        std::conj(a)
4718a7d68fSSatish Balay #define PetscSqrtScalar(a)  std::sqrt(a)
48184914b5SBarry Smith #define PetscPowScalar(a,b) std::pow(a,b)
49184914b5SBarry Smith #define PetscExpScalar(a)   std::exp(a)
50184914b5SBarry Smith #define PetscSinScalar(a)   std::sin(a)
51184914b5SBarry Smith #define PetscCosScalar(a)   std::cos(a)
52e489efc1SBarry Smith #else
53329f5518SBarry Smith #define PetscRealPart(a)        real(a)
54329f5518SBarry Smith #define PetscImaginaryPart(a)   imag(a)
55e489efc1SBarry Smith #define PetscAbsScalar(a)   abs(a)
56e489efc1SBarry Smith #define PetscConj(a)        conj(a)
5718a7d68fSSatish Balay #define PetscSqrtScalar(a)  sqrt(a)
58184914b5SBarry Smith #define PetscPowScalar(a,b) pow(a,b)
59184914b5SBarry Smith #define PetscExpScalar(a)   exp(a)
60184914b5SBarry Smith #define PetscSinScalar(a)   sin(a)
61184914b5SBarry Smith #define PetscCosScalar(a)   cos(a)
62adc17e78SSatish Balay #endif
63e489efc1SBarry Smith /*
64e489efc1SBarry Smith   The new complex class for GNU C++ is based on templates and is not backward
65e489efc1SBarry Smith   compatible with all previous complex class libraries.
66e489efc1SBarry Smith */
67c80bc32dSSatish Balay #if defined(PETSC_HAVE_STD_COMPLEX)
68ea709b57SSatish Balay   typedef std::complex<double> PetscScalar;
69aa482453SBarry Smith #elif defined(PETSC_HAVE_TEMPLATED_COMPLEX)
70ea709b57SSatish Balay   typedef complex<double> PetscScalar;
71e489efc1SBarry Smith #else
72ea709b57SSatish Balay   typedef complex PetscScalar;
73e489efc1SBarry Smith #endif
74e489efc1SBarry Smith 
75e489efc1SBarry Smith /* Compiling for real numbers only */
76e489efc1SBarry Smith #else
7787828ca2SBarry Smith #  if defined(PETSC_USE_SINGLE)
7887828ca2SBarry Smith #    define MPIU_SCALAR           MPI_FLOAT
7987828ca2SBarry Smith #  else
80e489efc1SBarry Smith #    define MPIU_SCALAR           MPI_DOUBLE
8187828ca2SBarry Smith #  endif
8287828ca2SBarry Smith #  if defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
833eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_FLOAT
843eda8832SBarry Smith #  else
853eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_DOUBLE
863eda8832SBarry Smith #  endif
87329f5518SBarry Smith #  define PetscRealPart(a)      (a)
88329f5518SBarry Smith #  define PetscImaginaryPart(a) (a)
89e489efc1SBarry Smith #  define PetscAbsScalar(a)     (((a)<0.0)   ? -(a) : (a))
90e489efc1SBarry Smith #  define PetscConj(a)          (a)
9118a7d68fSSatish Balay #  define PetscSqrtScalar(a)    sqrt(a)
92184914b5SBarry Smith #  define PetscPowScalar(a,b)   pow(a,b)
93184914b5SBarry Smith #  define PetscExpScalar(a)     exp(a)
94184914b5SBarry Smith #  define PetscSinScalar(a)     sin(a)
95184914b5SBarry Smith #  define PetscCosScalar(a)     cos(a)
96b0a32e0cSBarry Smith 
97b0a32e0cSBarry Smith #  if defined(PETSC_USE_SINGLE)
98ea709b57SSatish Balay   typedef float PetscScalar;
99b0a32e0cSBarry Smith #  else
100ea709b57SSatish Balay   typedef double PetscScalar;
101b0a32e0cSBarry Smith #  endif
102e489efc1SBarry Smith #endif
103e489efc1SBarry Smith 
104d7d1e502SBarry Smith #if defined(PETSC_USE_SINGLE)
105d7d1e502SBarry Smith #  define MPIU_REAL   MPI_FLOAT
106d7d1e502SBarry Smith #else
107d7d1e502SBarry Smith #  define MPIU_REAL   MPI_DOUBLE
108d7d1e502SBarry Smith #endif
109d7d1e502SBarry Smith 
1103f1db9ecSBarry Smith /*
1113f1db9ecSBarry Smith        Allows compiling PETSc so that matrix values are stored in
1123f1db9ecSBarry Smith    single precision but all other objects still use double
1133f1db9ecSBarry Smith    precision. This does not work for complex numbers in that case
1143f1db9ecSBarry Smith    it remains double
1153f1db9ecSBarry Smith 
1163f1db9ecSBarry Smith           EXPERIMENTAL! NOT YET COMPLETELY WORKING
1173f1db9ecSBarry Smith */
118aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1193f1db9ecSBarry Smith 
120ea709b57SSatish Balay typedef PetscScalar MatScalar;
121b400db4cSSatish Balay typedef double MatReal;
1223f1db9ecSBarry Smith 
12387828ca2SBarry Smith #elif defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
1243f1db9ecSBarry Smith 
125b400db4cSSatish Balay typedef float MatScalar;
126b400db4cSSatish Balay typedef float MatReal;
1273f1db9ecSBarry Smith 
1283f1db9ecSBarry Smith #else
1293f1db9ecSBarry Smith 
130ea709b57SSatish Balay typedef PetscScalar MatScalar;
131b400db4cSSatish Balay typedef double MatReal;
1323f1db9ecSBarry Smith 
1333f1db9ecSBarry Smith #endif
1343f1db9ecSBarry Smith 
135329f5518SBarry Smith #if defined(PETSC_USE_SINGLE)
136b400db4cSSatish Balay   typedef float PetscReal;
137329f5518SBarry Smith #else
138b400db4cSSatish Balay   typedef double PetscReal;
139329f5518SBarry Smith #endif
1403f1db9ecSBarry Smith 
141314da920SBarry Smith /* --------------------------------------------------------------------------*/
142314da920SBarry Smith 
143e489efc1SBarry Smith /*
144e489efc1SBarry Smith    Certain objects may be created using either single
145e489efc1SBarry Smith   or double precision.
146e489efc1SBarry Smith */
147ea709b57SSatish Balay typedef enum { PETSC_SCALAR_DOUBLE,PETSC_SCALAR_SINGLE } PetscScalarPrecision;
148e489efc1SBarry Smith 
149e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */
150ea709b57SSatish Balay extern  PetscScalar       PETSC_i;
151e489efc1SBarry Smith 
152e489efc1SBarry Smith #define PetscMin(a,b)      (((a)<(b)) ? (a) : (b))
153e489efc1SBarry Smith #define PetscMax(a,b)      (((a)<(b)) ? (b) : (a))
154e489efc1SBarry Smith #define PetscAbsInt(a)     (((a)<0)   ? -(a) : (a))
155f6275e2eSBarry Smith #define PetscAbsReal(a)  (((a)<0)   ? -(a) : (a))
156e489efc1SBarry Smith 
157314da920SBarry Smith /* ----------------------------------------------------------------------------*/
158314da920SBarry Smith /*
159314da920SBarry Smith      Basic constants
160314da920SBarry Smith */
161314da920SBarry Smith #define PETSC_PI                 3.14159265358979323846264
162314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994
163e489efc1SBarry Smith #define PETSC_MAX                1.e300
164e489efc1SBarry Smith #define PETSC_MIN                -1.e300
165f10639e6SSatish Balay #define PETSC_MAX_INT            1000000000
166f10639e6SSatish Balay #define PETSC_MIN_INT            -1000000000
167e489efc1SBarry Smith 
16882adfdadSBarry Smith #if defined(PETSC_USE_SINGLE)
169f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-7
170f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    3.e-4
171*cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-5
17282adfdadSBarry Smith #else
173f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-14
174f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    1.e-7
175*cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-10
17682adfdadSBarry Smith #endif
17782adfdadSBarry Smith 
178314da920SBarry Smith /* ----------------------------------------------------------------------------*/
179e489efc1SBarry Smith /*
180b0a32e0cSBarry Smith     PetscLogDouble variables are used to contain double precision numbers
181e489efc1SBarry Smith   that are not used in the numerical computations, but rather in logging,
182e489efc1SBarry Smith   timing etc.
183e489efc1SBarry Smith */
184b0a32e0cSBarry Smith typedef double PetscLogDouble;
185e489efc1SBarry Smith /*
186e489efc1SBarry Smith       Once PETSc is compiling with a ADIC enhanced version of MPI
187e489efc1SBarry Smith    we will create a new MPI_Datatype for the inactive double variables.
188e489efc1SBarry Smith */
189e489efc1SBarry Smith #if defined(AD_DERIV_H)
190b9617806SBarry Smith /* extern  MPI_Datatype  MPIU_PETSCLOGDOUBLE; */
191e489efc1SBarry Smith #else
192488ecbafSBarry Smith #if !defined(USING_MPIUNI)
193b9617806SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE
194e489efc1SBarry Smith #endif
195e489efc1SBarry Smith #endif
196e489efc1SBarry Smith 
19787828ca2SBarry Smith #define PassiveReal PetscReal
198ea709b57SSatish Balay #define PassiveScalar PetscScalar
199d3ecb3a7SBarry Smith 
200b0a32e0cSBarry Smith #define PETSCMAP1_a(a,b)  a ## _ ## b
201b0a32e0cSBarry Smith #define PETSCMAP1_b(a,b)  PETSCMAP1_a(a,b)
20287828ca2SBarry Smith #define PETSCMAP1(a)      PETSCMAP1_b(a,PetscScalar)
203e489efc1SBarry Smith #endif
204