xref: /petsc/include/petscmath.h (revision f68b968ce39302dfa79eb1a6cfa1998ce074e829)
1e489efc1SBarry Smith /*
2314da920SBarry Smith 
3314da920SBarry Smith       PETSc mathematics include file. Defines certain basic mathematical
4314da920SBarry Smith     constants and functions for working with single and double precision
5314da920SBarry Smith     floating point numbers as well as complex and integers.
6314da920SBarry Smith 
7e7029fe1SSatish Balay     This file is included by petsc.h and should not be used directly.
8e7029fe1SSatish Balay 
9e489efc1SBarry Smith */
10e489efc1SBarry Smith 
11488ecbafSBarry Smith #if !defined(__PETSCMATH_H)
12488ecbafSBarry Smith #define __PETSCMATH_H
130a5f7794SBarry Smith #include <math.h>
14e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
150a5f7794SBarry Smith 
16ff73aad6SKris Buschelman extern  MPI_Datatype PETSC_DLLEXPORT MPIU_2SCALAR;
17ff73aad6SKris Buschelman extern  MPI_Datatype PETSC_DLLEXPORT MPIU_2INT;
18314da920SBarry Smith /*
19f4ccad53SBarry Smith 
20f4ccad53SBarry Smith      Defines operations that are different for complex and real numbers;
21f4ccad53SBarry Smith    note that one cannot really mix the use of complex and real in the same
22f4ccad53SBarry Smith    PETSc program. All PETSc objects in one program are built around the object
23ea709b57SSatish Balay    PetscScalar which is either always a double or a complex.
24f4ccad53SBarry Smith 
25e489efc1SBarry Smith */
26b36a9721SBarry Smith 
2759cb5930SBarry Smith #define PetscExpPassiveScalar(a) PetscExpScalar()
2859cb5930SBarry Smith 
29aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
30adc17e78SSatish Balay 
310bfd3fbfSBarry Smith /*
320bfd3fbfSBarry Smith    PETSc now only supports std::complex
330bfd3fbfSBarry Smith */
34df9b3741SSatish Balay #include <complex>
35adc17e78SSatish Balay 
36ff73aad6SKris Buschelman extern  MPI_Datatype PETSC_DLLEXPORT MPIU_COMPLEX;
37adc17e78SSatish Balay #define MPIU_SCALAR         MPIU_COMPLEX
383eda8832SBarry Smith #if defined(PETSC_USE_MAT_SINGLE)
393eda8832SBarry Smith #define MPIU_MATSCALAR        ??Notdone
403eda8832SBarry Smith #else
413eda8832SBarry Smith #define MPIU_MATSCALAR      MPIU_COMPLEX
423eda8832SBarry Smith #endif
433eda8832SBarry Smith 
44329f5518SBarry Smith #define PetscRealPart(a)        (a).real()
45329f5518SBarry Smith #define PetscImaginaryPart(a)   (a).imag()
463f6de6efSSatish Balay #define PetscAbsScalar(a)   std::abs(a)
473f6de6efSSatish Balay #define PetscConj(a)        std::conj(a)
4818a7d68fSSatish Balay #define PetscSqrtScalar(a)  std::sqrt(a)
49184914b5SBarry Smith #define PetscPowScalar(a,b) std::pow(a,b)
50184914b5SBarry Smith #define PetscExpScalar(a)   std::exp(a)
51184914b5SBarry Smith #define PetscSinScalar(a)   std::sin(a)
52184914b5SBarry Smith #define PetscCosScalar(a)   std::cos(a)
530bfd3fbfSBarry Smith 
54ea709b57SSatish Balay typedef std::complex<double> PetscScalar;
55e489efc1SBarry Smith 
56e489efc1SBarry Smith /* Compiling for real numbers only */
57e489efc1SBarry Smith #else
5887828ca2SBarry Smith #  if defined(PETSC_USE_SINGLE)
5987828ca2SBarry Smith #    define MPIU_SCALAR           MPI_FLOAT
60*f68b968cSBarry Smith #  elif defined(PETSC_USE_LONG_DOUBLE)
61*f68b968cSBarry Smith #    define MPIU_SCALAR           MPI_LONG_DOUBLE
6287828ca2SBarry Smith #  else
63e489efc1SBarry Smith #    define MPIU_SCALAR           MPI_DOUBLE
6487828ca2SBarry Smith #  endif
6587828ca2SBarry Smith #  if defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
663eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_FLOAT
67*f68b968cSBarry Smith #  elif defined(PETSC_USE_LONG_DOUBLE)
68*f68b968cSBarry Smith #    define MPIU_MATSCALAR        MPI_LONG_DOUBLE
693eda8832SBarry Smith #  else
703eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_DOUBLE
713eda8832SBarry Smith #  endif
72329f5518SBarry Smith #  define PetscRealPart(a)      (a)
739b0def1dSBarry Smith #  define PetscImaginaryPart(a) (0)
74e489efc1SBarry Smith #  define PetscAbsScalar(a)     (((a)<0.0)   ? -(a) : (a))
75e489efc1SBarry Smith #  define PetscConj(a)          (a)
7618a7d68fSSatish Balay #  define PetscSqrtScalar(a)    sqrt(a)
77184914b5SBarry Smith #  define PetscPowScalar(a,b)   pow(a,b)
78184914b5SBarry Smith #  define PetscExpScalar(a)     exp(a)
79184914b5SBarry Smith #  define PetscSinScalar(a)     sin(a)
80184914b5SBarry Smith #  define PetscCosScalar(a)     cos(a)
81b0a32e0cSBarry Smith 
82b0a32e0cSBarry Smith #  if defined(PETSC_USE_SINGLE)
83ea709b57SSatish Balay   typedef float PetscScalar;
84*f68b968cSBarry Smith #  elif defined(PETSC_USE_LONG_DOUBLE)
85*f68b968cSBarry Smith   typedef long double PetscScalar;
86b0a32e0cSBarry Smith #  else
87ea709b57SSatish Balay   typedef double PetscScalar;
88b0a32e0cSBarry Smith #  endif
89e489efc1SBarry Smith #endif
90e489efc1SBarry Smith 
91d7d1e502SBarry Smith #if defined(PETSC_USE_SINGLE)
92d7d1e502SBarry Smith #  define MPIU_REAL   MPI_FLOAT
93*f68b968cSBarry Smith #elif defined(PETSC_USE_LONG_DOUBLE)
94*f68b968cSBarry Smith #  define MPIU_REAL   MPI_LONG_DOUBLE
95d7d1e502SBarry Smith #else
96d7d1e502SBarry Smith #  define MPIU_REAL   MPI_DOUBLE
97d7d1e502SBarry Smith #endif
98d7d1e502SBarry Smith 
99da9b6338SBarry Smith #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
10026aa1773SMatthew Knepley #define PetscAbs(a)  (((a) >= 0) ? (a) : -(a))
1013f1db9ecSBarry Smith /*
1023f1db9ecSBarry Smith        Allows compiling PETSc so that matrix values are stored in
1033f1db9ecSBarry Smith    single precision but all other objects still use double
1043f1db9ecSBarry Smith    precision. This does not work for complex numbers in that case
1053f1db9ecSBarry Smith    it remains double
1063f1db9ecSBarry Smith 
1073f1db9ecSBarry Smith           EXPERIMENTAL! NOT YET COMPLETELY WORKING
1083f1db9ecSBarry Smith */
1093f1db9ecSBarry Smith 
11011380375SSatish Balay #if defined(PETSC_USE_MAT_SINGLE)
111b400db4cSSatish Balay typedef float MatScalar;
1123f1db9ecSBarry Smith #else
113ea709b57SSatish Balay typedef PetscScalar MatScalar;
11411380375SSatish Balay #endif
1153f1db9ecSBarry Smith 
116329f5518SBarry Smith #if defined(PETSC_USE_SINGLE)
117b400db4cSSatish Balay   typedef float PetscReal;
118*f68b968cSBarry Smith #elif defined(PETSC_USE_LONG_DOUBLE)
119*f68b968cSBarry Smith   typedef long double PetscReal;
120329f5518SBarry Smith #else
121b400db4cSSatish Balay   typedef double PetscReal;
122329f5518SBarry Smith #endif
1233f1db9ecSBarry Smith 
124*f68b968cSBarry Smith #if defined(PETSC_USE_COMPLEX)
125*f68b968cSBarry Smith typedef PetscReal MatReal;
126*f68b968cSBarry Smith #elif defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
127*f68b968cSBarry Smith typedef float MatReal;
128*f68b968cSBarry Smith #else
129*f68b968cSBarry Smith typedef PetscReal MatReal;
130*f68b968cSBarry Smith #endif
131*f68b968cSBarry Smith 
132*f68b968cSBarry Smith 
133314da920SBarry Smith /* --------------------------------------------------------------------------*/
134314da920SBarry Smith 
135e489efc1SBarry Smith /*
136e489efc1SBarry Smith    Certain objects may be created using either single
137e489efc1SBarry Smith   or double precision.
138e489efc1SBarry Smith */
139*f68b968cSBarry Smith typedef enum { PETSC_SCALAR_DOUBLE,PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE } PetscScalarPrecision;
140e489efc1SBarry Smith 
141e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */
142ff73aad6SKris Buschelman extern  PetscScalar PETSC_DLLEXPORT PETSC_i;
143e489efc1SBarry Smith 
144b6a5bde7SBarry Smith /*MC
145b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
146b6a5bde7SBarry Smith 
147b6a5bde7SBarry Smith    Input Parameter:
148b6a5bde7SBarry Smith +  v1 - first value to find minimum of
149b6a5bde7SBarry Smith -  v2 - second value to find minimum of
150b6a5bde7SBarry Smith 
151b6a5bde7SBarry Smith    Synopsis:
152b6a5bde7SBarry Smith    type PetscMin(type v1,type v2)
153b6a5bde7SBarry Smith 
154b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
155b6a5bde7SBarry Smith 
156b6a5bde7SBarry Smith    Level: beginner
157b6a5bde7SBarry Smith 
158b6a5bde7SBarry Smith 
159b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
160b6a5bde7SBarry Smith 
161b6a5bde7SBarry Smith M*/
162e489efc1SBarry Smith #define PetscMin(a,b)   (((a)<(b)) ?  (a) : (b))
163b6a5bde7SBarry Smith 
164b6a5bde7SBarry Smith /*MC
165b6a5bde7SBarry Smith    PetscMax - Returns maxium of two numbers
166b6a5bde7SBarry Smith 
167b6a5bde7SBarry Smith    Input Parameter:
168b6a5bde7SBarry Smith +  v1 - first value to find maximum of
169b6a5bde7SBarry Smith -  v2 - second value to find maximum of
170b6a5bde7SBarry Smith 
171b6a5bde7SBarry Smith    Synopsis:
172b6a5bde7SBarry Smith    type max PetscMax(type v1,type v2)
173b6a5bde7SBarry Smith 
174b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
175b6a5bde7SBarry Smith 
176b6a5bde7SBarry Smith    Level: beginner
177b6a5bde7SBarry Smith 
178b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
179b6a5bde7SBarry Smith 
180b6a5bde7SBarry Smith M*/
181e489efc1SBarry Smith #define PetscMax(a,b)   (((a)<(b)) ?  (b) : (a))
182b6a5bde7SBarry Smith 
183b6a5bde7SBarry Smith /*MC
184b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
185b6a5bde7SBarry Smith 
186b6a5bde7SBarry Smith    Input Parameter:
187b6a5bde7SBarry Smith .   v1 - the integer
188b6a5bde7SBarry Smith 
189b6a5bde7SBarry Smith    Synopsis:
190b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
191b6a5bde7SBarry Smith 
192b6a5bde7SBarry Smith 
193b6a5bde7SBarry Smith    Level: beginner
194b6a5bde7SBarry Smith 
195b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr()
196b6a5bde7SBarry Smith 
197b6a5bde7SBarry Smith M*/
198e489efc1SBarry Smith #define PetscAbsInt(a)  (((a)<0)   ? -(a) : (a))
199b6a5bde7SBarry Smith 
200b6a5bde7SBarry Smith /*MC
201b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
202b6a5bde7SBarry Smith 
203b6a5bde7SBarry Smith    Input Parameter:
204b6a5bde7SBarry Smith .   v1 - the double
205b6a5bde7SBarry Smith 
206b6a5bde7SBarry Smith    Synopsis:
207b6a5bde7SBarry Smith    int abs PetscAbsReal(PetscReal v1)
208b6a5bde7SBarry Smith 
209b6a5bde7SBarry Smith 
210b6a5bde7SBarry Smith    Level: beginner
211b6a5bde7SBarry Smith 
212b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr()
213b6a5bde7SBarry Smith 
214b6a5bde7SBarry Smith M*/
215f6275e2eSBarry Smith #define PetscAbsReal(a) (((a)<0)   ? -(a) : (a))
216b6a5bde7SBarry Smith 
217b6a5bde7SBarry Smith /*MC
218b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
219b6a5bde7SBarry Smith 
220b6a5bde7SBarry Smith    Input Parameter:
221b6a5bde7SBarry Smith .   v1 - the value
222b6a5bde7SBarry Smith 
223b6a5bde7SBarry Smith    Synopsis:
224b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
225b6a5bde7SBarry Smith 
226b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
227b6a5bde7SBarry Smith 
228b6a5bde7SBarry Smith    Level: beginner
229b6a5bde7SBarry Smith 
230b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal()
231b6a5bde7SBarry Smith 
232b6a5bde7SBarry Smith M*/
2334ebda54eSMatthew Knepley #define PetscSqr(a)     ((a)*(a))
234e489efc1SBarry Smith 
235314da920SBarry Smith /* ----------------------------------------------------------------------------*/
236314da920SBarry Smith /*
237314da920SBarry Smith      Basic constants
238314da920SBarry Smith */
239314da920SBarry Smith #define PETSC_PI                 3.14159265358979323846264
240314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994
241f10639e6SSatish Balay #define PETSC_MAX_INT            1000000000
242f10639e6SSatish Balay #define PETSC_MIN_INT            -1000000000
243e489efc1SBarry Smith 
24482adfdadSBarry Smith #if defined(PETSC_USE_SINGLE)
2457e032f8bSBarry Smith #  define PETSC_MAX                     1.e30
2467e032f8bSBarry Smith #  define PETSC_MIN                    -1.e30
247f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-7
248f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    3.e-4
249cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-5
25082adfdadSBarry Smith #else
2517e032f8bSBarry Smith #  define PETSC_MAX                     1.e300
2527e032f8bSBarry Smith #  define PETSC_MIN                    -1.e300
253f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-14
254f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    1.e-7
255cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-10
25682adfdadSBarry Smith #endif
25782adfdadSBarry Smith 
258ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGlobalMax(PetscReal*,PetscReal*,MPI_Comm);
259ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGlobalMin(PetscReal*,PetscReal*,MPI_Comm);
260ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGlobalSum(PetscScalar*,PetscScalar*,MPI_Comm);
2613e523bebSBarry Smith 
2623e523bebSBarry Smith 
263314da920SBarry Smith /* ----------------------------------------------------------------------------*/
264e489efc1SBarry Smith /*
265b0a32e0cSBarry Smith     PetscLogDouble variables are used to contain double precision numbers
266e489efc1SBarry Smith   that are not used in the numerical computations, but rather in logging,
267e489efc1SBarry Smith   timing etc.
268e489efc1SBarry Smith */
269b0a32e0cSBarry Smith typedef double PetscLogDouble;
270e489efc1SBarry Smith /*
271e489efc1SBarry Smith       Once PETSc is compiling with a ADIC enhanced version of MPI
272e489efc1SBarry Smith    we will create a new MPI_Datatype for the inactive double variables.
273e489efc1SBarry Smith */
274e489efc1SBarry Smith #if defined(AD_DERIV_H)
275b9617806SBarry Smith /* extern  MPI_Datatype  MPIU_PETSCLOGDOUBLE; */
276e489efc1SBarry Smith #else
277f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni)
278b9617806SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE
279e489efc1SBarry Smith #endif
280e489efc1SBarry Smith #endif
281e489efc1SBarry Smith 
28287828ca2SBarry Smith #define PassiveReal   PetscReal
283ea709b57SSatish Balay #define PassiveScalar PetscScalar
284d3ecb3a7SBarry Smith 
285b0a32e0cSBarry Smith #define PETSCMAP1_a(a,b)  a ## _ ## b
286b0a32e0cSBarry Smith #define PETSCMAP1_b(a,b)  PETSCMAP1_a(a,b)
28787828ca2SBarry Smith #define PETSCMAP1(a)      PETSCMAP1_b(a,PetscScalar)
288e9fa29b7SSatish Balay 
289e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
290e489efc1SBarry Smith #endif
291