1e489efc1SBarry Smith /* 2314da920SBarry Smith 3314da920SBarry Smith PETSc mathematics include file. Defines certain basic mathematical 4314da920SBarry Smith constants and functions for working with single and double precision 5314da920SBarry Smith floating point numbers as well as complex and integers. 6314da920SBarry Smith 7e7029fe1SSatish Balay This file is included by petsc.h and should not be used directly. 8e7029fe1SSatish Balay 9e489efc1SBarry Smith */ 10e489efc1SBarry Smith 11488ecbafSBarry Smith #if !defined(__PETSCMATH_H) 12488ecbafSBarry Smith #define __PETSCMATH_H 130a5f7794SBarry Smith #include <math.h> 14e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN 150a5f7794SBarry Smith 16ff73aad6SKris Buschelman extern MPI_Datatype PETSC_DLLEXPORT MPIU_2SCALAR; 17ff73aad6SKris Buschelman extern MPI_Datatype PETSC_DLLEXPORT MPIU_2INT; 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 36ff73aad6SKris Buschelman extern MPI_Datatype PETSC_DLLEXPORT 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 60*f68b968cSBarry Smith # elif defined(PETSC_USE_LONG_DOUBLE) 61*f68b968cSBarry Smith # define MPIU_SCALAR MPI_LONG_DOUBLE 6287828ca2SBarry Smith # else 63e489efc1SBarry Smith # define MPIU_SCALAR MPI_DOUBLE 6487828ca2SBarry Smith # endif 6587828ca2SBarry Smith # if defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE) 663eda8832SBarry Smith # define MPIU_MATSCALAR MPI_FLOAT 67*f68b968cSBarry Smith # elif defined(PETSC_USE_LONG_DOUBLE) 68*f68b968cSBarry Smith # define MPIU_MATSCALAR MPI_LONG_DOUBLE 693eda8832SBarry Smith # else 703eda8832SBarry Smith # define MPIU_MATSCALAR MPI_DOUBLE 713eda8832SBarry Smith # endif 72329f5518SBarry Smith # define PetscRealPart(a) (a) 739b0def1dSBarry Smith # define PetscImaginaryPart(a) (0) 74e489efc1SBarry Smith # define PetscAbsScalar(a) (((a)<0.0) ? -(a) : (a)) 75e489efc1SBarry Smith # define PetscConj(a) (a) 7618a7d68fSSatish Balay # define PetscSqrtScalar(a) sqrt(a) 77184914b5SBarry Smith # define PetscPowScalar(a,b) pow(a,b) 78184914b5SBarry Smith # define PetscExpScalar(a) exp(a) 79184914b5SBarry Smith # define PetscSinScalar(a) sin(a) 80184914b5SBarry Smith # define PetscCosScalar(a) cos(a) 81b0a32e0cSBarry Smith 82b0a32e0cSBarry Smith # if defined(PETSC_USE_SINGLE) 83ea709b57SSatish Balay typedef float PetscScalar; 84*f68b968cSBarry Smith # elif defined(PETSC_USE_LONG_DOUBLE) 85*f68b968cSBarry Smith typedef long double PetscScalar; 86b0a32e0cSBarry Smith # else 87ea709b57SSatish Balay typedef double PetscScalar; 88b0a32e0cSBarry Smith # endif 89e489efc1SBarry Smith #endif 90e489efc1SBarry Smith 91d7d1e502SBarry Smith #if defined(PETSC_USE_SINGLE) 92d7d1e502SBarry Smith # define MPIU_REAL MPI_FLOAT 93*f68b968cSBarry Smith #elif defined(PETSC_USE_LONG_DOUBLE) 94*f68b968cSBarry Smith # define MPIU_REAL MPI_LONG_DOUBLE 95d7d1e502SBarry Smith #else 96d7d1e502SBarry Smith # define MPIU_REAL MPI_DOUBLE 97d7d1e502SBarry Smith #endif 98d7d1e502SBarry Smith 99da9b6338SBarry Smith #define PetscSign(a) (((a) >= 0) ? ((a) == 0 ? 0 : 1) : -1) 10026aa1773SMatthew Knepley #define PetscAbs(a) (((a) >= 0) ? (a) : -(a)) 1013f1db9ecSBarry Smith /* 1023f1db9ecSBarry Smith Allows compiling PETSc so that matrix values are stored in 1033f1db9ecSBarry Smith single precision but all other objects still use double 1043f1db9ecSBarry Smith precision. This does not work for complex numbers in that case 1053f1db9ecSBarry Smith it remains double 1063f1db9ecSBarry Smith 1073f1db9ecSBarry Smith EXPERIMENTAL! NOT YET COMPLETELY WORKING 1083f1db9ecSBarry Smith */ 1093f1db9ecSBarry Smith 11011380375SSatish Balay #if defined(PETSC_USE_MAT_SINGLE) 111b400db4cSSatish Balay typedef float MatScalar; 1123f1db9ecSBarry Smith #else 113ea709b57SSatish Balay typedef PetscScalar MatScalar; 11411380375SSatish Balay #endif 1153f1db9ecSBarry Smith 116329f5518SBarry Smith #if defined(PETSC_USE_SINGLE) 117b400db4cSSatish Balay typedef float PetscReal; 118*f68b968cSBarry Smith #elif defined(PETSC_USE_LONG_DOUBLE) 119*f68b968cSBarry Smith typedef long double PetscReal; 120329f5518SBarry Smith #else 121b400db4cSSatish Balay typedef double PetscReal; 122329f5518SBarry Smith #endif 1233f1db9ecSBarry Smith 124*f68b968cSBarry Smith #if defined(PETSC_USE_COMPLEX) 125*f68b968cSBarry Smith typedef PetscReal MatReal; 126*f68b968cSBarry Smith #elif defined(PETSC_USE_MAT_SINGLE) || defined(PETSC_USE_SINGLE) 127*f68b968cSBarry Smith typedef float MatReal; 128*f68b968cSBarry Smith #else 129*f68b968cSBarry Smith typedef PetscReal MatReal; 130*f68b968cSBarry Smith #endif 131*f68b968cSBarry Smith 132*f68b968cSBarry Smith 133314da920SBarry Smith /* --------------------------------------------------------------------------*/ 134314da920SBarry Smith 135e489efc1SBarry Smith /* 136e489efc1SBarry Smith Certain objects may be created using either single 137e489efc1SBarry Smith or double precision. 138e489efc1SBarry Smith */ 139*f68b968cSBarry Smith typedef enum { PETSC_SCALAR_DOUBLE,PETSC_SCALAR_SINGLE, PETSC_SCALAR_LONG_DOUBLE } PetscScalarPrecision; 140e489efc1SBarry Smith 141e489efc1SBarry Smith /* PETSC_i is the imaginary number, i */ 142ff73aad6SKris Buschelman extern PetscScalar PETSC_DLLEXPORT PETSC_i; 143e489efc1SBarry Smith 144b6a5bde7SBarry Smith /*MC 145b6a5bde7SBarry Smith PetscMin - Returns minimum of two numbers 146b6a5bde7SBarry Smith 147b6a5bde7SBarry Smith Input Parameter: 148b6a5bde7SBarry Smith + v1 - first value to find minimum of 149b6a5bde7SBarry Smith - v2 - second value to find minimum of 150b6a5bde7SBarry Smith 151b6a5bde7SBarry Smith Synopsis: 152b6a5bde7SBarry Smith type PetscMin(type v1,type v2) 153b6a5bde7SBarry Smith 154b6a5bde7SBarry Smith Notes: type can be integer or floating point value 155b6a5bde7SBarry Smith 156b6a5bde7SBarry Smith Level: beginner 157b6a5bde7SBarry Smith 158b6a5bde7SBarry Smith 159b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 160b6a5bde7SBarry Smith 161b6a5bde7SBarry Smith M*/ 162e489efc1SBarry Smith #define PetscMin(a,b) (((a)<(b)) ? (a) : (b)) 163b6a5bde7SBarry Smith 164b6a5bde7SBarry Smith /*MC 165b6a5bde7SBarry Smith PetscMax - Returns maxium of two numbers 166b6a5bde7SBarry Smith 167b6a5bde7SBarry Smith Input Parameter: 168b6a5bde7SBarry Smith + v1 - first value to find maximum of 169b6a5bde7SBarry Smith - v2 - second value to find maximum of 170b6a5bde7SBarry Smith 171b6a5bde7SBarry Smith Synopsis: 172b6a5bde7SBarry Smith type max PetscMax(type v1,type v2) 173b6a5bde7SBarry Smith 174b6a5bde7SBarry Smith Notes: type can be integer or floating point value 175b6a5bde7SBarry Smith 176b6a5bde7SBarry Smith Level: beginner 177b6a5bde7SBarry Smith 178b6a5bde7SBarry Smith .seealso: PetscMin(), PetscAbsInt(), PetscAbsReal(), PetscSqr() 179b6a5bde7SBarry Smith 180b6a5bde7SBarry Smith M*/ 181e489efc1SBarry Smith #define PetscMax(a,b) (((a)<(b)) ? (b) : (a)) 182b6a5bde7SBarry Smith 183b6a5bde7SBarry Smith /*MC 184b6a5bde7SBarry Smith PetscAbsInt - Returns the absolute value of an integer 185b6a5bde7SBarry Smith 186b6a5bde7SBarry Smith Input Parameter: 187b6a5bde7SBarry Smith . v1 - the integer 188b6a5bde7SBarry Smith 189b6a5bde7SBarry Smith Synopsis: 190b6a5bde7SBarry Smith int abs PetscAbsInt(int v1) 191b6a5bde7SBarry Smith 192b6a5bde7SBarry Smith 193b6a5bde7SBarry Smith Level: beginner 194b6a5bde7SBarry Smith 195b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsReal(), PetscSqr() 196b6a5bde7SBarry Smith 197b6a5bde7SBarry Smith M*/ 198e489efc1SBarry Smith #define PetscAbsInt(a) (((a)<0) ? -(a) : (a)) 199b6a5bde7SBarry Smith 200b6a5bde7SBarry Smith /*MC 201b6a5bde7SBarry Smith PetscAbsReal - Returns the absolute value of an real number 202b6a5bde7SBarry Smith 203b6a5bde7SBarry Smith Input Parameter: 204b6a5bde7SBarry Smith . v1 - the double 205b6a5bde7SBarry Smith 206b6a5bde7SBarry Smith Synopsis: 207b6a5bde7SBarry Smith int abs PetscAbsReal(PetscReal v1) 208b6a5bde7SBarry Smith 209b6a5bde7SBarry Smith 210b6a5bde7SBarry Smith Level: beginner 211b6a5bde7SBarry Smith 212b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscSqr() 213b6a5bde7SBarry Smith 214b6a5bde7SBarry Smith M*/ 215f6275e2eSBarry Smith #define PetscAbsReal(a) (((a)<0) ? -(a) : (a)) 216b6a5bde7SBarry Smith 217b6a5bde7SBarry Smith /*MC 218b6a5bde7SBarry Smith PetscSqr - Returns the square of a number 219b6a5bde7SBarry Smith 220b6a5bde7SBarry Smith Input Parameter: 221b6a5bde7SBarry Smith . v1 - the value 222b6a5bde7SBarry Smith 223b6a5bde7SBarry Smith Synopsis: 224b6a5bde7SBarry Smith type sqr PetscSqr(type v1) 225b6a5bde7SBarry Smith 226b6a5bde7SBarry Smith Notes: type can be integer or floating point value 227b6a5bde7SBarry Smith 228b6a5bde7SBarry Smith Level: beginner 229b6a5bde7SBarry Smith 230b6a5bde7SBarry Smith .seealso: PetscMax(), PetscMin(), PetscAbsInt(), PetscAbsReal() 231b6a5bde7SBarry Smith 232b6a5bde7SBarry Smith M*/ 2334ebda54eSMatthew Knepley #define PetscSqr(a) ((a)*(a)) 234e489efc1SBarry Smith 235314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 236314da920SBarry Smith /* 237314da920SBarry Smith Basic constants 238314da920SBarry Smith */ 239314da920SBarry Smith #define PETSC_PI 3.14159265358979323846264 240314da920SBarry Smith #define PETSC_DEGREES_TO_RADIANS 0.01745329251994 241f10639e6SSatish Balay #define PETSC_MAX_INT 1000000000 242f10639e6SSatish Balay #define PETSC_MIN_INT -1000000000 243e489efc1SBarry Smith 24482adfdadSBarry Smith #if defined(PETSC_USE_SINGLE) 2457e032f8bSBarry Smith # define PETSC_MAX 1.e30 2467e032f8bSBarry Smith # define PETSC_MIN -1.e30 247f10639e6SSatish Balay # define PETSC_MACHINE_EPSILON 1.e-7 248f10639e6SSatish Balay # define PETSC_SQRT_MACHINE_EPSILON 3.e-4 249cf6e855fSSatish Balay # define PETSC_SMALL 1.e-5 25082adfdadSBarry Smith #else 2517e032f8bSBarry Smith # define PETSC_MAX 1.e300 2527e032f8bSBarry Smith # define PETSC_MIN -1.e300 253f10639e6SSatish Balay # define PETSC_MACHINE_EPSILON 1.e-14 254f10639e6SSatish Balay # define PETSC_SQRT_MACHINE_EPSILON 1.e-7 255cf6e855fSSatish Balay # define PETSC_SMALL 1.e-10 25682adfdadSBarry Smith #endif 25782adfdadSBarry Smith 258ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGlobalMax(PetscReal*,PetscReal*,MPI_Comm); 259ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGlobalMin(PetscReal*,PetscReal*,MPI_Comm); 260ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGlobalSum(PetscScalar*,PetscScalar*,MPI_Comm); 2613e523bebSBarry Smith 2623e523bebSBarry Smith 263314da920SBarry Smith /* ----------------------------------------------------------------------------*/ 264e489efc1SBarry Smith /* 265b0a32e0cSBarry Smith PetscLogDouble variables are used to contain double precision numbers 266e489efc1SBarry Smith that are not used in the numerical computations, but rather in logging, 267e489efc1SBarry Smith timing etc. 268e489efc1SBarry Smith */ 269b0a32e0cSBarry Smith typedef double PetscLogDouble; 270e489efc1SBarry Smith /* 271e489efc1SBarry Smith Once PETSc is compiling with a ADIC enhanced version of MPI 272e489efc1SBarry Smith we will create a new MPI_Datatype for the inactive double variables. 273e489efc1SBarry Smith */ 274e489efc1SBarry Smith #if defined(AD_DERIV_H) 275b9617806SBarry Smith /* extern MPI_Datatype MPIU_PETSCLOGDOUBLE; */ 276e489efc1SBarry Smith #else 277f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) 278b9617806SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE 279e489efc1SBarry Smith #endif 280e489efc1SBarry Smith #endif 281e489efc1SBarry Smith 28287828ca2SBarry Smith #define PassiveReal PetscReal 283ea709b57SSatish Balay #define PassiveScalar PetscScalar 284d3ecb3a7SBarry Smith 285b0a32e0cSBarry Smith #define PETSCMAP1_a(a,b) a ## _ ## b 286b0a32e0cSBarry Smith #define PETSCMAP1_b(a,b) PETSCMAP1_a(a,b) 28787828ca2SBarry Smith #define PETSCMAP1(a) PETSCMAP1_b(a,PetscScalar) 288e9fa29b7SSatish Balay 289e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 290e489efc1SBarry Smith #endif 291