1*adc17e78SSatish Balay /* $Id: petscmath.h,v 1.5 1998/05/29 22:42:48 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 8e489efc1SBarry Smith */ 9314da920SBarry Smith #include "petsc.h" 10e489efc1SBarry Smith 110a5f7794SBarry Smith #if !defined(__PETSCMATH_PACKAGE) 120a5f7794SBarry Smith #define __PETSCMATH_PACKAGE 130a5f7794SBarry Smith #include <math.h> 140a5f7794SBarry Smith 15314da920SBarry Smith /* 16f4ccad53SBarry Smith 17f4ccad53SBarry Smith Defines operations that are different for complex and real numbers; 18f4ccad53SBarry Smith note that one cannot really mix the use of complex and real in the same 19f4ccad53SBarry Smith PETSc program. All PETSc objects in one program are built around the object 20f4ccad53SBarry Smith Scalar which is either always a double or a complex. 21f4ccad53SBarry Smith 22e489efc1SBarry Smith */ 230a5f7794SBarry Smith #if defined(USE_PETSC_COMPLEX) 24*adc17e78SSatish Balay 25*adc17e78SSatish Balay #if defined(HAVE_NONSTANDARD_COMPLEX_H) 26*adc17e78SSatish Balay #include HAVE_NONSTANDARD_COMPLEX_H 27*adc17e78SSatish Balay #else 28*adc17e78SSatish Balay #include <complex.h> 29*adc17e78SSatish Balay #endif 30*adc17e78SSatish Balay 31*adc17e78SSatish Balay extern MPI_Datatype MPIU_COMPLEX; 32*adc17e78SSatish Balay #define MPIU_SCALAR MPIU_COMPLEX 333f6de6efSSatish Balay #if defined (PARCH_nt) 34*adc17e78SSatish Balay 353f6de6efSSatish Balay #include <complex> 363f6de6efSSatish Balay #define PetscReal(a) a.real() 373f6de6efSSatish Balay #define PetscImaginary(a) a.imag() 383f6de6efSSatish Balay #define PetscAbsScalar(a) std::abs(a) 393f6de6efSSatish Balay #define PetscConj(a) std::conj(a) 40e489efc1SBarry Smith #else 41e489efc1SBarry Smith #define PetscReal(a) real(a) 42e489efc1SBarry Smith #define PetscImaginary(a) imag(a) 43e489efc1SBarry Smith #define PetscAbsScalar(a) abs(a) 44e489efc1SBarry Smith #define PetscConj(a) conj(a) 45*adc17e78SSatish Balay #endif 46e489efc1SBarry Smith /* 47e489efc1SBarry Smith The new complex class for GNU C++ is based on templates and is not backward 48e489efc1SBarry Smith compatible with all previous complex class libraries. 49e489efc1SBarry Smith */ 50e489efc1SBarry Smith #if defined(USES_TEMPLATED_COMPLEX) 51e489efc1SBarry Smith #define Scalar complex<double> 52e489efc1SBarry Smith #else 53e489efc1SBarry Smith #define Scalar complex 54e489efc1SBarry Smith #endif 55e489efc1SBarry Smith 56e489efc1SBarry Smith /* Compiling for real numbers only */ 57e489efc1SBarry Smith #else 58e489efc1SBarry Smith #define MPIU_SCALAR MPI_DOUBLE 59e489efc1SBarry Smith #define PetscReal(a) (a) 60e489efc1SBarry Smith #define PetscImaginary(a) (a) 61e489efc1SBarry Smith #define PetscAbsScalar(a) ( ((a)<0.0) ? -(a) : (a) ) 62e489efc1SBarry Smith #define Scalar double 63e489efc1SBarry Smith #define PetscConj(a) (a) 64e489efc1SBarry Smith #endif 65e489efc1SBarry Smith 66314da920SBarry Smith /* --------------------------------------------------------------------------*/ 67314da920SBarry Smith 68e489efc1SBarry Smith /* 69e489efc1SBarry Smith Certain objects may be created using either single 70e489efc1SBarry Smith or double precision. 71e489efc1SBarry Smith */ 72e489efc1SBarry Smith typedef enum { SCALAR_DOUBLE, SCALAR_SINGLE } ScalarPrecision; 73e489efc1SBarry Smith 74e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */ 75e489efc1SBarry Smith extern Scalar PETSC_i; 76e489efc1SBarry Smith 77e489efc1SBarry Smith #define PetscMin(a,b) ( ((a)<(b)) ? (a) : (b) ) 78e489efc1SBarry Smith #define PetscMax(a,b) ( ((a)<(b)) ? (b) : (a) ) 79e489efc1SBarry Smith #define PetscAbsInt(a) ( ((a)<0) ? -(a) : (a) ) 80e489efc1SBarry Smith #define PetscAbsDouble(a) ( ((a)<0) ? -(a) : (a) ) 81e489efc1SBarry Smith 82314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 83314da920SBarry Smith /* 84314da920SBarry Smith Basic constants 85314da920SBarry Smith */ 86314da920SBarry Smith #define PETSC_PI 3.14159265358979323846264 87314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994 88e489efc1SBarry Smith #define PETSC_MAX 1.e300 89e489efc1SBarry Smith #define PETSC_MIN -1.e300 900a5f7794SBarry Smith #define PETSC_MAX_INT 1000000000; 910a5f7794SBarry Smith #define PETSC_MIN_INT -1000000000; 92e489efc1SBarry Smith 93314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 94e489efc1SBarry Smith /* 95e489efc1SBarry Smith PLogDouble variables are used to contain double precision numbers 96e489efc1SBarry Smith that are not used in the numerical computations, but rather in logging, 97e489efc1SBarry Smith timing etc. 98e489efc1SBarry Smith */ 99e489efc1SBarry Smith typedef double PLogDouble; 100e489efc1SBarry Smith /* 101e489efc1SBarry Smith Once PETSc is compiling with a ADIC enhanced version of MPI 102e489efc1SBarry Smith we will create a new MPI_Datatype for the inactive double variables. 103e489efc1SBarry Smith */ 104e489efc1SBarry Smith #if defined(AD_DERIV_H) 105e489efc1SBarry Smith /* extern MPI_Datatype MPIU_PLOGDOUBLE; */ 106e489efc1SBarry Smith #else 107e489efc1SBarry Smith #if !defined(PETSC_USING_MPIUNI) 108e489efc1SBarry Smith #define MPIU_PLOGDOUBLE MPI_DOUBLE 109e489efc1SBarry Smith #endif 110e489efc1SBarry Smith #endif 111e489efc1SBarry Smith 112e489efc1SBarry Smith 113e489efc1SBarry Smith #endif 114