xref: /petsc/include/petscmath.h (revision e9fa29b77eaf32efadba30e98aa12b45e655e5d0)
173f4d377SMatthew Knepley /* $Id: petscmath.h,v 1.32 2001/08/30 20:37:06 bsmith Exp $ */
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>
15*e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
160a5f7794SBarry Smith 
17b36a9721SBarry Smith extern  MPI_Datatype        MPIU_2SCALAR;
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 
36adc17e78SSatish Balay extern  MPI_Datatype        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
6087828ca2SBarry Smith #  else
61e489efc1SBarry Smith #    define MPIU_SCALAR           MPI_DOUBLE
6287828ca2SBarry Smith #  endif
6387828ca2SBarry Smith #  if defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
643eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_FLOAT
653eda8832SBarry Smith #  else
663eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_DOUBLE
673eda8832SBarry Smith #  endif
68329f5518SBarry Smith #  define PetscRealPart(a)      (a)
69329f5518SBarry Smith #  define PetscImaginaryPart(a) (a)
70e489efc1SBarry Smith #  define PetscAbsScalar(a)     (((a)<0.0)   ? -(a) : (a))
71e489efc1SBarry Smith #  define PetscConj(a)          (a)
7218a7d68fSSatish Balay #  define PetscSqrtScalar(a)    sqrt(a)
73184914b5SBarry Smith #  define PetscPowScalar(a,b)   pow(a,b)
74184914b5SBarry Smith #  define PetscExpScalar(a)     exp(a)
75184914b5SBarry Smith #  define PetscSinScalar(a)     sin(a)
76184914b5SBarry Smith #  define PetscCosScalar(a)     cos(a)
77b0a32e0cSBarry Smith 
78b0a32e0cSBarry Smith #  if defined(PETSC_USE_SINGLE)
79ea709b57SSatish Balay   typedef float PetscScalar;
80b0a32e0cSBarry Smith #  else
81ea709b57SSatish Balay   typedef double PetscScalar;
82b0a32e0cSBarry Smith #  endif
83e489efc1SBarry Smith #endif
84e489efc1SBarry Smith 
85d7d1e502SBarry Smith #if defined(PETSC_USE_SINGLE)
86d7d1e502SBarry Smith #  define MPIU_REAL   MPI_FLOAT
87d7d1e502SBarry Smith #else
88d7d1e502SBarry Smith #  define MPIU_REAL   MPI_DOUBLE
89d7d1e502SBarry Smith #endif
90d7d1e502SBarry Smith 
91da9b6338SBarry Smith #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
92da9b6338SBarry Smith #define PetscAbs(a)  (((a) >= 0) ? a : -a)
933f1db9ecSBarry Smith /*
943f1db9ecSBarry Smith        Allows compiling PETSc so that matrix values are stored in
953f1db9ecSBarry Smith    single precision but all other objects still use double
963f1db9ecSBarry Smith    precision. This does not work for complex numbers in that case
973f1db9ecSBarry Smith    it remains double
983f1db9ecSBarry Smith 
993f1db9ecSBarry Smith           EXPERIMENTAL! NOT YET COMPLETELY WORKING
1003f1db9ecSBarry Smith */
1013f1db9ecSBarry Smith 
10211380375SSatish Balay #if defined(PETSC_USE_MAT_SINGLE)
103b400db4cSSatish Balay typedef float MatScalar;
1043f1db9ecSBarry Smith #else
105ea709b57SSatish Balay typedef PetscScalar MatScalar;
10611380375SSatish Balay #endif
1073f1db9ecSBarry Smith 
10811380375SSatish Balay #if defined(PETSC_USE_COMPLEX)
10911380375SSatish Balay typedef double MatReal;
11011380375SSatish Balay #elif defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
11111380375SSatish Balay typedef float MatReal;
11211380375SSatish Balay #else
11311380375SSatish Balay typedef double MatReal;
1143f1db9ecSBarry Smith #endif
1153f1db9ecSBarry Smith 
116329f5518SBarry Smith #if defined(PETSC_USE_SINGLE)
117b400db4cSSatish Balay   typedef float PetscReal;
118329f5518SBarry Smith #else
119b400db4cSSatish Balay   typedef double PetscReal;
120329f5518SBarry Smith #endif
1213f1db9ecSBarry Smith 
122314da920SBarry Smith /* --------------------------------------------------------------------------*/
123314da920SBarry Smith 
124e489efc1SBarry Smith /*
125e489efc1SBarry Smith    Certain objects may be created using either single
126e489efc1SBarry Smith   or double precision.
127e489efc1SBarry Smith */
128ea709b57SSatish Balay typedef enum { PETSC_SCALAR_DOUBLE,PETSC_SCALAR_SINGLE } PetscScalarPrecision;
129e489efc1SBarry Smith 
130e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */
131ea709b57SSatish Balay extern  PetscScalar       PETSC_i;
132e489efc1SBarry Smith 
133b6a5bde7SBarry Smith /*MC
134b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
135b6a5bde7SBarry Smith 
136b6a5bde7SBarry Smith    Input Parameter:
137b6a5bde7SBarry Smith +  v1 - first value to find minimum of
138b6a5bde7SBarry Smith -  v2 - second value to find minimum of
139b6a5bde7SBarry Smith 
140b6a5bde7SBarry Smith    Synopsis:
141b6a5bde7SBarry Smith    type PetscMin(type v1,type v2)
142b6a5bde7SBarry Smith 
143b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
144b6a5bde7SBarry Smith 
145b6a5bde7SBarry Smith    Level: beginner
146b6a5bde7SBarry Smith 
147b6a5bde7SBarry Smith 
148b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
149b6a5bde7SBarry Smith 
150b6a5bde7SBarry Smith M*/
151e489efc1SBarry Smith #define PetscMin(a,b)   (((a)<(b)) ?  (a) : (b))
152b6a5bde7SBarry Smith 
153b6a5bde7SBarry Smith /*MC
154b6a5bde7SBarry Smith    PetscMax - Returns maxium of two numbers
155b6a5bde7SBarry Smith 
156b6a5bde7SBarry Smith    Input Parameter:
157b6a5bde7SBarry Smith +  v1 - first value to find maximum of
158b6a5bde7SBarry Smith -  v2 - second value to find maximum of
159b6a5bde7SBarry Smith 
160b6a5bde7SBarry Smith    Synopsis:
161b6a5bde7SBarry Smith    type max PetscMax(type v1,type v2)
162b6a5bde7SBarry Smith 
163b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
164b6a5bde7SBarry Smith 
165b6a5bde7SBarry Smith    Level: beginner
166b6a5bde7SBarry Smith 
167b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
168b6a5bde7SBarry Smith 
169b6a5bde7SBarry Smith M*/
170e489efc1SBarry Smith #define PetscMax(a,b)   (((a)<(b)) ?  (b) : (a))
171b6a5bde7SBarry Smith 
172b6a5bde7SBarry Smith /*MC
173b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
174b6a5bde7SBarry Smith 
175b6a5bde7SBarry Smith    Input Parameter:
176b6a5bde7SBarry Smith .   v1 - the integer
177b6a5bde7SBarry Smith 
178b6a5bde7SBarry Smith    Synopsis:
179b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
180b6a5bde7SBarry Smith 
181b6a5bde7SBarry Smith 
182b6a5bde7SBarry Smith    Level: beginner
183b6a5bde7SBarry Smith 
184b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr()
185b6a5bde7SBarry Smith 
186b6a5bde7SBarry Smith M*/
187e489efc1SBarry Smith #define PetscAbsInt(a)  (((a)<0)   ? -(a) : (a))
188b6a5bde7SBarry Smith 
189b6a5bde7SBarry Smith /*MC
190b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
191b6a5bde7SBarry Smith 
192b6a5bde7SBarry Smith    Input Parameter:
193b6a5bde7SBarry Smith .   v1 - the double
194b6a5bde7SBarry Smith 
195b6a5bde7SBarry Smith    Synopsis:
196b6a5bde7SBarry Smith    int abs PetscAbsReal(PetscReal v1)
197b6a5bde7SBarry Smith 
198b6a5bde7SBarry Smith 
199b6a5bde7SBarry Smith    Level: beginner
200b6a5bde7SBarry Smith 
201b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr()
202b6a5bde7SBarry Smith 
203b6a5bde7SBarry Smith M*/
204f6275e2eSBarry Smith #define PetscAbsReal(a) (((a)<0)   ? -(a) : (a))
205b6a5bde7SBarry Smith 
206b6a5bde7SBarry Smith /*MC
207b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
208b6a5bde7SBarry Smith 
209b6a5bde7SBarry Smith    Input Parameter:
210b6a5bde7SBarry Smith .   v1 - the value
211b6a5bde7SBarry Smith 
212b6a5bde7SBarry Smith    Synopsis:
213b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
214b6a5bde7SBarry Smith 
215b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
216b6a5bde7SBarry Smith 
217b6a5bde7SBarry Smith    Level: beginner
218b6a5bde7SBarry Smith 
219b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal()
220b6a5bde7SBarry Smith 
221b6a5bde7SBarry Smith M*/
2224ebda54eSMatthew Knepley #define PetscSqr(a)     ((a)*(a))
223e489efc1SBarry Smith 
224314da920SBarry Smith /* ----------------------------------------------------------------------------*/
225314da920SBarry Smith /*
226314da920SBarry Smith      Basic constants
227314da920SBarry Smith */
228314da920SBarry Smith #define PETSC_PI                 3.14159265358979323846264
229314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994
230f10639e6SSatish Balay #define PETSC_MAX_INT            1000000000
231f10639e6SSatish Balay #define PETSC_MIN_INT            -1000000000
232e489efc1SBarry Smith 
23382adfdadSBarry Smith #if defined(PETSC_USE_SINGLE)
2347e032f8bSBarry Smith #  define PETSC_MAX                1.e30
2357e032f8bSBarry Smith #  define PETSC_MIN                -1.e30
236f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-7
237f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    3.e-4
238cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-5
23982adfdadSBarry Smith #else
2407e032f8bSBarry Smith #  define PETSC_MAX                1.e300
2417e032f8bSBarry Smith #  define PETSC_MIN                -1.e300
242f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-14
243f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    1.e-7
244cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-10
24582adfdadSBarry Smith #endif
24682adfdadSBarry Smith 
2472740c1caSMatthew Knepley extern int PetscGlobalMax(PetscReal*,PetscReal*,MPI_Comm);
2482740c1caSMatthew Knepley extern int PetscGlobalMin(PetscReal*,PetscReal*,MPI_Comm);
2493e523bebSBarry Smith extern int PetscGlobalSum(PetscScalar*,PetscScalar*,MPI_Comm);
2503e523bebSBarry Smith 
2513e523bebSBarry Smith 
252314da920SBarry Smith /* ----------------------------------------------------------------------------*/
253e489efc1SBarry Smith /*
254b0a32e0cSBarry Smith     PetscLogDouble variables are used to contain double precision numbers
255e489efc1SBarry Smith   that are not used in the numerical computations, but rather in logging,
256e489efc1SBarry Smith   timing etc.
257e489efc1SBarry Smith */
258b0a32e0cSBarry Smith typedef double PetscLogDouble;
259e489efc1SBarry Smith /*
260e489efc1SBarry Smith       Once PETSc is compiling with a ADIC enhanced version of MPI
261e489efc1SBarry Smith    we will create a new MPI_Datatype for the inactive double variables.
262e489efc1SBarry Smith */
263e489efc1SBarry Smith #if defined(AD_DERIV_H)
264b9617806SBarry Smith /* extern  MPI_Datatype  MPIU_PETSCLOGDOUBLE; */
265e489efc1SBarry Smith #else
266f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni)
267b9617806SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE
268e489efc1SBarry Smith #endif
269e489efc1SBarry Smith #endif
270e489efc1SBarry Smith 
27187828ca2SBarry Smith #define PassiveReal   PetscReal
272ea709b57SSatish Balay #define PassiveScalar PetscScalar
273d3ecb3a7SBarry Smith 
274b0a32e0cSBarry Smith #define PETSCMAP1_a(a,b)  a ## _ ## b
275b0a32e0cSBarry Smith #define PETSCMAP1_b(a,b)  PETSCMAP1_a(a,b)
27687828ca2SBarry Smith #define PETSCMAP1(a)      PETSCMAP1_b(a,PetscScalar)
277*e9fa29b7SSatish Balay 
278*e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
279e489efc1SBarry Smith #endif
280