xref: /petsc/include/petscmath.h (revision b6a5bde7d88fd57f632ab7283ed3a043cff22a4a)
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>
150a5f7794SBarry Smith 
16b36a9721SBarry Smith extern  MPI_Datatype        MPIU_2SCALAR;
17314da920SBarry Smith /*
18f4ccad53SBarry Smith 
19f4ccad53SBarry Smith      Defines operations that are different for complex and real numbers;
20f4ccad53SBarry Smith    note that one cannot really mix the use of complex and real in the same
21f4ccad53SBarry Smith    PETSc program. All PETSc objects in one program are built around the object
22ea709b57SSatish Balay    PetscScalar which is either always a double or a complex.
23f4ccad53SBarry Smith 
24e489efc1SBarry Smith */
25b36a9721SBarry Smith 
26aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
27adc17e78SSatish Balay 
280bfd3fbfSBarry Smith /*
290bfd3fbfSBarry Smith    PETSc now only supports std::complex
300bfd3fbfSBarry Smith */
31df9b3741SSatish Balay #include <complex>
32adc17e78SSatish Balay 
33adc17e78SSatish Balay extern  MPI_Datatype        MPIU_COMPLEX;
34adc17e78SSatish Balay #define MPIU_SCALAR         MPIU_COMPLEX
353eda8832SBarry Smith #if defined(PETSC_USE_MAT_SINGLE)
363eda8832SBarry Smith #define MPIU_MATSCALAR        ??Notdone
373eda8832SBarry Smith #else
383eda8832SBarry Smith #define MPIU_MATSCALAR      MPIU_COMPLEX
393eda8832SBarry Smith #endif
403eda8832SBarry Smith 
41329f5518SBarry Smith #define PetscRealPart(a)        (a).real()
42329f5518SBarry Smith #define PetscImaginaryPart(a)   (a).imag()
433f6de6efSSatish Balay #define PetscAbsScalar(a)   std::abs(a)
443f6de6efSSatish Balay #define PetscConj(a)        std::conj(a)
4518a7d68fSSatish Balay #define PetscSqrtScalar(a)  std::sqrt(a)
46184914b5SBarry Smith #define PetscPowScalar(a,b) std::pow(a,b)
47184914b5SBarry Smith #define PetscExpScalar(a)   std::exp(a)
48184914b5SBarry Smith #define PetscSinScalar(a)   std::sin(a)
49184914b5SBarry Smith #define PetscCosScalar(a)   std::cos(a)
500bfd3fbfSBarry Smith 
51ea709b57SSatish Balay typedef std::complex<double> PetscScalar;
52e489efc1SBarry Smith 
53e489efc1SBarry Smith /* Compiling for real numbers only */
54e489efc1SBarry Smith #else
5587828ca2SBarry Smith #  if defined(PETSC_USE_SINGLE)
5687828ca2SBarry Smith #    define MPIU_SCALAR           MPI_FLOAT
5787828ca2SBarry Smith #  else
58e489efc1SBarry Smith #    define MPIU_SCALAR           MPI_DOUBLE
5987828ca2SBarry Smith #  endif
6087828ca2SBarry Smith #  if defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
613eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_FLOAT
623eda8832SBarry Smith #  else
633eda8832SBarry Smith #    define MPIU_MATSCALAR        MPI_DOUBLE
643eda8832SBarry Smith #  endif
65329f5518SBarry Smith #  define PetscRealPart(a)      (a)
66329f5518SBarry Smith #  define PetscImaginaryPart(a) (a)
67e489efc1SBarry Smith #  define PetscAbsScalar(a)     (((a)<0.0)   ? -(a) : (a))
68e489efc1SBarry Smith #  define PetscConj(a)          (a)
6918a7d68fSSatish Balay #  define PetscSqrtScalar(a)    sqrt(a)
70184914b5SBarry Smith #  define PetscPowScalar(a,b)   pow(a,b)
71184914b5SBarry Smith #  define PetscExpScalar(a)     exp(a)
72184914b5SBarry Smith #  define PetscSinScalar(a)     sin(a)
73184914b5SBarry Smith #  define PetscCosScalar(a)     cos(a)
74b0a32e0cSBarry Smith 
75b0a32e0cSBarry Smith #  if defined(PETSC_USE_SINGLE)
76ea709b57SSatish Balay   typedef float PetscScalar;
77b0a32e0cSBarry Smith #  else
78ea709b57SSatish Balay   typedef double PetscScalar;
79b0a32e0cSBarry Smith #  endif
80e489efc1SBarry Smith #endif
81e489efc1SBarry Smith 
82d7d1e502SBarry Smith #if defined(PETSC_USE_SINGLE)
83d7d1e502SBarry Smith #  define MPIU_REAL   MPI_FLOAT
84d7d1e502SBarry Smith #else
85d7d1e502SBarry Smith #  define MPIU_REAL   MPI_DOUBLE
86d7d1e502SBarry Smith #endif
87d7d1e502SBarry Smith 
88da9b6338SBarry Smith #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1)
89da9b6338SBarry Smith #define PetscAbs(a)  (((a) >= 0) ? a : -a)
903f1db9ecSBarry Smith /*
913f1db9ecSBarry Smith        Allows compiling PETSc so that matrix values are stored in
923f1db9ecSBarry Smith    single precision but all other objects still use double
933f1db9ecSBarry Smith    precision. This does not work for complex numbers in that case
943f1db9ecSBarry Smith    it remains double
953f1db9ecSBarry Smith 
963f1db9ecSBarry Smith           EXPERIMENTAL! NOT YET COMPLETELY WORKING
973f1db9ecSBarry Smith */
983f1db9ecSBarry Smith 
9911380375SSatish Balay #if defined(PETSC_USE_MAT_SINGLE)
100b400db4cSSatish Balay typedef float MatScalar;
1013f1db9ecSBarry Smith #else
102ea709b57SSatish Balay typedef PetscScalar MatScalar;
10311380375SSatish Balay #endif
1043f1db9ecSBarry Smith 
10511380375SSatish Balay #if defined(PETSC_USE_COMPLEX)
10611380375SSatish Balay typedef double MatReal;
10711380375SSatish Balay #elif defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE)
10811380375SSatish Balay typedef float MatReal;
10911380375SSatish Balay #else
11011380375SSatish Balay typedef double MatReal;
1113f1db9ecSBarry Smith #endif
1123f1db9ecSBarry Smith 
113329f5518SBarry Smith #if defined(PETSC_USE_SINGLE)
114b400db4cSSatish Balay   typedef float PetscReal;
115329f5518SBarry Smith #else
116b400db4cSSatish Balay   typedef double PetscReal;
117329f5518SBarry Smith #endif
1183f1db9ecSBarry Smith 
119314da920SBarry Smith /* --------------------------------------------------------------------------*/
120314da920SBarry Smith 
121e489efc1SBarry Smith /*
122e489efc1SBarry Smith    Certain objects may be created using either single
123e489efc1SBarry Smith   or double precision.
124e489efc1SBarry Smith */
125ea709b57SSatish Balay typedef enum { PETSC_SCALAR_DOUBLE,PETSC_SCALAR_SINGLE } PetscScalarPrecision;
126e489efc1SBarry Smith 
127e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */
128ea709b57SSatish Balay extern  PetscScalar       PETSC_i;
129e489efc1SBarry Smith 
130*b6a5bde7SBarry Smith /*MC
131*b6a5bde7SBarry Smith    PetscMin - Returns minimum of two numbers
132*b6a5bde7SBarry Smith 
133*b6a5bde7SBarry Smith    Input Parameter:
134*b6a5bde7SBarry Smith +  v1 - first value to find minimum of
135*b6a5bde7SBarry Smith -  v2 - second value to find minimum of
136*b6a5bde7SBarry Smith 
137*b6a5bde7SBarry Smith    Synopsis:
138*b6a5bde7SBarry Smith    type PetscMin(type v1,type v2)
139*b6a5bde7SBarry Smith 
140*b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
141*b6a5bde7SBarry Smith 
142*b6a5bde7SBarry Smith    Level: beginner
143*b6a5bde7SBarry Smith 
144*b6a5bde7SBarry Smith 
145*b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
146*b6a5bde7SBarry Smith 
147*b6a5bde7SBarry Smith M*/
148e489efc1SBarry Smith #define PetscMin(a,b)   (((a)<(b)) ?  (a) : (b))
149*b6a5bde7SBarry Smith 
150*b6a5bde7SBarry Smith /*MC
151*b6a5bde7SBarry Smith    PetscMax - Returns maxium of two numbers
152*b6a5bde7SBarry Smith 
153*b6a5bde7SBarry Smith    Input Parameter:
154*b6a5bde7SBarry Smith +  v1 - first value to find maximum of
155*b6a5bde7SBarry Smith -  v2 - second value to find maximum of
156*b6a5bde7SBarry Smith 
157*b6a5bde7SBarry Smith    Synopsis:
158*b6a5bde7SBarry Smith    type max PetscMax(type v1,type v2)
159*b6a5bde7SBarry Smith 
160*b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
161*b6a5bde7SBarry Smith 
162*b6a5bde7SBarry Smith    Level: beginner
163*b6a5bde7SBarry Smith 
164*b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr()
165*b6a5bde7SBarry Smith 
166*b6a5bde7SBarry Smith M*/
167e489efc1SBarry Smith #define PetscMax(a,b)   (((a)<(b)) ?  (b) : (a))
168*b6a5bde7SBarry Smith 
169*b6a5bde7SBarry Smith /*MC
170*b6a5bde7SBarry Smith    PetscAbsInt - Returns the absolute value of an integer
171*b6a5bde7SBarry Smith 
172*b6a5bde7SBarry Smith    Input Parameter:
173*b6a5bde7SBarry Smith .   v1 - the integer
174*b6a5bde7SBarry Smith 
175*b6a5bde7SBarry Smith    Synopsis:
176*b6a5bde7SBarry Smith    int abs PetscAbsInt(int v1)
177*b6a5bde7SBarry Smith 
178*b6a5bde7SBarry Smith 
179*b6a5bde7SBarry Smith    Level: beginner
180*b6a5bde7SBarry Smith 
181*b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr()
182*b6a5bde7SBarry Smith 
183*b6a5bde7SBarry Smith M*/
184e489efc1SBarry Smith #define PetscAbsInt(a)  (((a)<0)   ? -(a) : (a))
185*b6a5bde7SBarry Smith 
186*b6a5bde7SBarry Smith /*MC
187*b6a5bde7SBarry Smith    PetscAbsReal - Returns the absolute value of an real number
188*b6a5bde7SBarry Smith 
189*b6a5bde7SBarry Smith    Input Parameter:
190*b6a5bde7SBarry Smith .   v1 - the double
191*b6a5bde7SBarry Smith 
192*b6a5bde7SBarry Smith    Synopsis:
193*b6a5bde7SBarry Smith    int abs PetscAbsReal(PetscReal v1)
194*b6a5bde7SBarry Smith 
195*b6a5bde7SBarry Smith 
196*b6a5bde7SBarry Smith    Level: beginner
197*b6a5bde7SBarry Smith 
198*b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr()
199*b6a5bde7SBarry Smith 
200*b6a5bde7SBarry Smith M*/
201f6275e2eSBarry Smith #define PetscAbsReal(a) (((a)<0)   ? -(a) : (a))
202*b6a5bde7SBarry Smith 
203*b6a5bde7SBarry Smith /*MC
204*b6a5bde7SBarry Smith    PetscSqr - Returns the square of a number
205*b6a5bde7SBarry Smith 
206*b6a5bde7SBarry Smith    Input Parameter:
207*b6a5bde7SBarry Smith .   v1 - the value
208*b6a5bde7SBarry Smith 
209*b6a5bde7SBarry Smith    Synopsis:
210*b6a5bde7SBarry Smith    type sqr PetscSqr(type v1)
211*b6a5bde7SBarry Smith 
212*b6a5bde7SBarry Smith    Notes: type can be integer or floating point value
213*b6a5bde7SBarry Smith 
214*b6a5bde7SBarry Smith    Level: beginner
215*b6a5bde7SBarry Smith 
216*b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal()
217*b6a5bde7SBarry Smith 
218*b6a5bde7SBarry Smith M*/
2194ebda54eSMatthew Knepley #define PetscSqr(a)     ((a)*(a))
220e489efc1SBarry Smith 
221314da920SBarry Smith /* ----------------------------------------------------------------------------*/
222314da920SBarry Smith /*
223314da920SBarry Smith      Basic constants
224314da920SBarry Smith */
225314da920SBarry Smith #define PETSC_PI                 3.14159265358979323846264
226314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994
227f10639e6SSatish Balay #define PETSC_MAX_INT            1000000000
228f10639e6SSatish Balay #define PETSC_MIN_INT            -1000000000
229e489efc1SBarry Smith 
23082adfdadSBarry Smith #if defined(PETSC_USE_SINGLE)
2317e032f8bSBarry Smith #  define PETSC_MAX                1.e30
2327e032f8bSBarry Smith #  define PETSC_MIN                -1.e30
233f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-7
234f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    3.e-4
235cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-5
23682adfdadSBarry Smith #else
2377e032f8bSBarry Smith #  define PETSC_MAX                1.e300
2387e032f8bSBarry Smith #  define PETSC_MIN                -1.e300
239f10639e6SSatish Balay #  define PETSC_MACHINE_EPSILON         1.e-14
240f10639e6SSatish Balay #  define PETSC_SQRT_MACHINE_EPSILON    1.e-7
241cf6e855fSSatish Balay #  define PETSC_SMALL                   1.e-10
24282adfdadSBarry Smith #endif
24382adfdadSBarry Smith 
2442740c1caSMatthew Knepley extern int PetscGlobalMax(PetscReal*,PetscReal*,MPI_Comm);
2452740c1caSMatthew Knepley extern int PetscGlobalMin(PetscReal*,PetscReal*,MPI_Comm);
2463e523bebSBarry Smith extern int PetscGlobalSum(PetscScalar*,PetscScalar*,MPI_Comm);
2473e523bebSBarry Smith 
2483e523bebSBarry Smith 
249314da920SBarry Smith /* ----------------------------------------------------------------------------*/
250e489efc1SBarry Smith /*
251b0a32e0cSBarry Smith     PetscLogDouble variables are used to contain double precision numbers
252e489efc1SBarry Smith   that are not used in the numerical computations, but rather in logging,
253e489efc1SBarry Smith   timing etc.
254e489efc1SBarry Smith */
255b0a32e0cSBarry Smith typedef double PetscLogDouble;
256e489efc1SBarry Smith /*
257e489efc1SBarry Smith       Once PETSc is compiling with a ADIC enhanced version of MPI
258e489efc1SBarry Smith    we will create a new MPI_Datatype for the inactive double variables.
259e489efc1SBarry Smith */
260e489efc1SBarry Smith #if defined(AD_DERIV_H)
261b9617806SBarry Smith /* extern  MPI_Datatype  MPIU_PETSCLOGDOUBLE; */
262e489efc1SBarry Smith #else
263f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni)
264b9617806SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE
265e489efc1SBarry Smith #endif
266e489efc1SBarry Smith #endif
267e489efc1SBarry Smith 
26887828ca2SBarry Smith #define PassiveReal   PetscReal
269ea709b57SSatish Balay #define PassiveScalar PetscScalar
270d3ecb3a7SBarry Smith 
271b0a32e0cSBarry Smith #define PETSCMAP1_a(a,b)  a ## _ ## b
272b0a32e0cSBarry Smith #define PETSCMAP1_b(a,b)  PETSCMAP1_a(a,b)
27387828ca2SBarry Smith #define PETSCMAP1(a)      PETSCMAP1_b(a,PetscScalar)
274e489efc1SBarry Smith #endif
275