xref: /petsc/include/petscmath.h (revision f4ccad53451057e33db2c67f7c461b9758e98732)
1*f4ccad53SBarry Smith /* $Id: petscmath.h,v 1.2 1997/08/29 20:31:53 bsmith Exp bsmith $ */
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 #if !defined(__PETSCMATH_PACKAGE)
10314da920SBarry Smith #define __PETSCMAT_PACKAGE
11e489efc1SBarry Smith 
12314da920SBarry Smith #include "petsc.h"
13e489efc1SBarry Smith 
14314da920SBarry Smith /*
15*f4ccad53SBarry Smith 
16*f4ccad53SBarry Smith      Defines operations that are different for complex and real numbers;
17*f4ccad53SBarry Smith    note that one cannot really mix the use of complex and real in the same
18*f4ccad53SBarry Smith    PETSc program. All PETSc objects in one program are built around the object
19*f4ccad53SBarry Smith    Scalar which is either always a double or a complex.
20*f4ccad53SBarry Smith 
21e489efc1SBarry Smith */
22e489efc1SBarry Smith #if defined(PETSC_COMPLEX)
23e489efc1SBarry Smith #if defined(HAVE_NONSTANDARD_COMPLEX_H)
24e489efc1SBarry Smith #include HAVE_NONSTANDARD_COMPLEX_H
25e489efc1SBarry Smith #else
26e489efc1SBarry Smith #include <complex.h>
27e489efc1SBarry Smith #endif
28e489efc1SBarry Smith extern  MPI_Datatype      MPIU_COMPLEX;
29e489efc1SBarry Smith #define MPIU_SCALAR       MPIU_COMPLEX
30e489efc1SBarry Smith #define PetscReal(a)      real(a)
31e489efc1SBarry Smith #define PetscImaginary(a) imag(a)
32e489efc1SBarry Smith #define PetscAbsScalar(a) abs(a)
33e489efc1SBarry Smith #define PetscConj(a)      conj(a)
34e489efc1SBarry Smith /*
35e489efc1SBarry Smith   The new complex class for GNU C++ is based on templates and is not backward
36e489efc1SBarry Smith   compatible with all previous complex class libraries.
37e489efc1SBarry Smith */
38e489efc1SBarry Smith #if defined(USES_TEMPLATED_COMPLEX)
39e489efc1SBarry Smith #define Scalar            complex<double>
40e489efc1SBarry Smith #else
41e489efc1SBarry Smith #define Scalar            complex
42e489efc1SBarry Smith #endif
43e489efc1SBarry Smith 
44e489efc1SBarry Smith /* Compiling for real numbers only */
45e489efc1SBarry Smith #else
46e489efc1SBarry Smith #define MPIU_SCALAR       MPI_DOUBLE
47e489efc1SBarry Smith #define PetscReal(a)      (a)
48e489efc1SBarry Smith #define PetscImaginary(a) (a)
49e489efc1SBarry Smith #define PetscAbsScalar(a) ( ((a)<0.0)   ? -(a) : (a) )
50e489efc1SBarry Smith #define Scalar            double
51e489efc1SBarry Smith #define PetscConj(a)      (a)
52e489efc1SBarry Smith #endif
53e489efc1SBarry Smith 
54314da920SBarry Smith /* --------------------------------------------------------------------------*/
55314da920SBarry Smith 
56e489efc1SBarry Smith /*
57e489efc1SBarry Smith    Certain objects may be created using either single
58e489efc1SBarry Smith   or double precision.
59e489efc1SBarry Smith */
60e489efc1SBarry Smith typedef enum { SCALAR_DOUBLE, SCALAR_SINGLE } ScalarPrecision;
61e489efc1SBarry Smith 
62e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */
63e489efc1SBarry Smith extern  Scalar            PETSC_i;
64e489efc1SBarry Smith 
65e489efc1SBarry Smith #define PetscMin(a,b)      ( ((a)<(b)) ? (a) : (b) )
66e489efc1SBarry Smith #define PetscMax(a,b)      ( ((a)<(b)) ? (b) : (a) )
67e489efc1SBarry Smith #define PetscAbsInt(a)     ( ((a)<0)   ? -(a) : (a) )
68e489efc1SBarry Smith #define PetscAbsDouble(a)  ( ((a)<0)   ? -(a) : (a) )
69e489efc1SBarry Smith 
70314da920SBarry Smith /* ----------------------------------------------------------------------------*/
71314da920SBarry Smith /*
72314da920SBarry Smith      Basic constants
73314da920SBarry Smith */
74314da920SBarry Smith #define PETSC_PI                 3.14159265358979323846264
75314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994
76e489efc1SBarry Smith #define PETSC_MAX                1.e300
77e489efc1SBarry Smith #define PETSC_MIN                -1.e300
78e489efc1SBarry Smith 
79314da920SBarry Smith /* ----------------------------------------------------------------------------*/
80e489efc1SBarry Smith /*
81e489efc1SBarry Smith     PLogDouble variables are used to contain double precision numbers
82e489efc1SBarry Smith   that are not used in the numerical computations, but rather in logging,
83e489efc1SBarry Smith   timing etc.
84e489efc1SBarry Smith */
85e489efc1SBarry Smith typedef double PLogDouble;
86e489efc1SBarry Smith /*
87e489efc1SBarry Smith       Once PETSc is compiling with a ADIC enhanced version of MPI
88e489efc1SBarry Smith    we will create a new MPI_Datatype for the inactive double variables.
89e489efc1SBarry Smith */
90e489efc1SBarry Smith #if defined(AD_DERIV_H)
91e489efc1SBarry Smith /* extern  MPI_Datatype  MPIU_PLOGDOUBLE; */
92e489efc1SBarry Smith #else
93e489efc1SBarry Smith #if !defined(PETSC_USING_MPIUNI)
94e489efc1SBarry Smith #define MPIU_PLOGDOUBLE MPI_DOUBLE
95e489efc1SBarry Smith #endif
96e489efc1SBarry Smith #endif
97e489efc1SBarry Smith 
98e489efc1SBarry Smith 
99e489efc1SBarry Smith #endif
100