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 16*b36a9721SBarry 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 */ 25*b36a9721SBarry 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 130e489efc1SBarry Smith #define PetscMin(a,b) (((a)<(b)) ? (a) : (b)) 131e489efc1SBarry Smith #define PetscMax(a,b) (((a)<(b)) ? (b) : (a)) 132e489efc1SBarry Smith #define PetscAbsInt(a) (((a)<0) ? -(a) : (a)) 133f6275e2eSBarry Smith #define PetscAbsReal(a) (((a)<0) ? -(a) : (a)) 1344ebda54eSMatthew Knepley #define PetscSqr(a) ((a)*(a)) 135e489efc1SBarry Smith 136314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 137314da920SBarry Smith /* 138314da920SBarry Smith Basic constants 139314da920SBarry Smith */ 140314da920SBarry Smith #define PETSC_PI 3.14159265358979323846264 141314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994 142f10639e6SSatish Balay #define PETSC_MAX_INT 1000000000 143f10639e6SSatish Balay #define PETSC_MIN_INT -1000000000 144e489efc1SBarry Smith 14582adfdadSBarry Smith #if defined(PETSC_USE_SINGLE) 1467e032f8bSBarry Smith # define PETSC_MAX 1.e30 1477e032f8bSBarry Smith # define PETSC_MIN -1.e30 148f10639e6SSatish Balay # define PETSC_MACHINE_EPSILON 1.e-7 149f10639e6SSatish Balay # define PETSC_SQRT_MACHINE_EPSILON 3.e-4 150cf6e855fSSatish Balay # define PETSC_SMALL 1.e-5 15182adfdadSBarry Smith #else 1527e032f8bSBarry Smith # define PETSC_MAX 1.e300 1537e032f8bSBarry Smith # define PETSC_MIN -1.e300 154f10639e6SSatish Balay # define PETSC_MACHINE_EPSILON 1.e-14 155f10639e6SSatish Balay # define PETSC_SQRT_MACHINE_EPSILON 1.e-7 156cf6e855fSSatish Balay # define PETSC_SMALL 1.e-10 15782adfdadSBarry Smith #endif 15882adfdadSBarry Smith 1592740c1caSMatthew Knepley extern int PetscGlobalMax(PetscReal*,PetscReal*,MPI_Comm); 1602740c1caSMatthew Knepley extern int PetscGlobalMin(PetscReal*,PetscReal*,MPI_Comm); 1613e523bebSBarry Smith extern int PetscGlobalSum(PetscScalar*,PetscScalar*,MPI_Comm); 1623e523bebSBarry Smith 1633e523bebSBarry Smith 164314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 165e489efc1SBarry Smith /* 166b0a32e0cSBarry Smith PetscLogDouble variables are used to contain double precision numbers 167e489efc1SBarry Smith that are not used in the numerical computations, but rather in logging, 168e489efc1SBarry Smith timing etc. 169e489efc1SBarry Smith */ 170b0a32e0cSBarry Smith typedef double PetscLogDouble; 171e489efc1SBarry Smith /* 172e489efc1SBarry Smith Once PETSc is compiling with a ADIC enhanced version of MPI 173e489efc1SBarry Smith we will create a new MPI_Datatype for the inactive double variables. 174e489efc1SBarry Smith */ 175e489efc1SBarry Smith #if defined(AD_DERIV_H) 176b9617806SBarry Smith /* extern MPI_Datatype MPIU_PETSCLOGDOUBLE; */ 177e489efc1SBarry Smith #else 178f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) 179b9617806SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE 180e489efc1SBarry Smith #endif 181e489efc1SBarry Smith #endif 182e489efc1SBarry Smith 18387828ca2SBarry Smith #define PassiveReal PetscReal 184ea709b57SSatish Balay #define PassiveScalar PetscScalar 185d3ecb3a7SBarry Smith 186b0a32e0cSBarry Smith #define PETSCMAP1_a(a,b) a ## _ ## b 187b0a32e0cSBarry Smith #define PETSCMAP1_b(a,b) PETSCMAP1_a(a,b) 18887828ca2SBarry Smith #define PETSCMAP1(a) PETSCMAP1_b(a,PetscScalar) 189e489efc1SBarry Smith #endif 190