1*d382aafbSBarry Smith /* 2*d382aafbSBarry Smith This is the main PETSc include file (for C and C++). It is included by all 3*d382aafbSBarry Smith other PETSc include files, so it almost never has to be specifically included. 4*d382aafbSBarry Smith */ 5*d382aafbSBarry Smith #if !defined(__PETSC_H) 6*d382aafbSBarry Smith #define __PETSC_H 7*d382aafbSBarry Smith /* ========================================================================== */ 8*d382aafbSBarry Smith /* 9*d382aafbSBarry Smith petscconf.h is contained in ${PETSC_ARCH}/include/petscconf.h it is 10*d382aafbSBarry Smith found automatically by the compiler due to the -I${PETSC_DIR}/${PETSC_ARCH}/include 11*d382aafbSBarry Smith in the conf/variables definition of PETSC_INCLUDE 12*d382aafbSBarry Smith */ 13*d382aafbSBarry Smith #include "petscconf.h" 14*d382aafbSBarry Smith #include "petscfix.h" 15*d382aafbSBarry Smith 16*d382aafbSBarry Smith /* ========================================================================== */ 17*d382aafbSBarry Smith /* 18*d382aafbSBarry Smith This facilitates using C version of PETSc from C++ and 19*d382aafbSBarry Smith C++ version from C. Use --with-c-support --with-clanguage=c++ with config/configure.py for the latter) 20*d382aafbSBarry Smith */ 21*d382aafbSBarry Smith #if defined(PETSC_CLANGUAGE_CXX) && !defined(PETSC_USE_EXTERN_CXX) && !defined(__cplusplus) 22*d382aafbSBarry Smith #error "PETSc configured with --with-clanguage=c++ and NOT --with-c-support - it can be used only with a C++ compiler" 23*d382aafbSBarry Smith #endif 24*d382aafbSBarry Smith 25*d382aafbSBarry Smith #if defined(PETSC_USE_EXTERN_CXX) && defined(__cplusplus) 26*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_BEGIN extern "C" { 27*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_END } 28*d382aafbSBarry Smith #else 29*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_BEGIN 30*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_END 31*d382aafbSBarry Smith #endif 32*d382aafbSBarry Smith /* ========================================================================== */ 33*d382aafbSBarry Smith /* 34*d382aafbSBarry Smith Current PETSc version number and release date. Also listed in 35*d382aafbSBarry Smith Web page 36*d382aafbSBarry Smith src/docs/tex/manual/intro.tex, 37*d382aafbSBarry Smith src/docs/tex/manual/manual.tex. 38*d382aafbSBarry Smith src/docs/website/index.html. 39*d382aafbSBarry Smith */ 40*d382aafbSBarry Smith #include "petscversion.h" 41*d382aafbSBarry Smith #define PETSC_AUTHOR_INFO "\ 42*d382aafbSBarry Smith The PETSc Team\n\ 43*d382aafbSBarry Smith petsc-maint@mcs.anl.gov\n\ 44*d382aafbSBarry Smith http://www.mcs.anl.gov/petsc/\n" 45*d382aafbSBarry Smith #if (PETSC_VERSION_RELEASE == 1) 46*d382aafbSBarry Smith #define PetscGetVersion(version,len) (PetscSNPrintf(version,len,"Petsc Release Version %d.%d.%d, Patch %d, ", \ 47*d382aafbSBarry Smith PETSC_VERSION_MAJOR,PETSC_VERSION_MINOR, PETSC_VERSION_SUBMINOR, \ 48*d382aafbSBarry Smith PETSC_VERSION_PATCH),PetscStrcat(version,PETSC_VERSION_PATCH_DATE)) 49*d382aafbSBarry Smith #else 50*d382aafbSBarry Smith #define PetscGetVersion(version,len) (PetscSNPrintf(version,len,"Petsc Development"), \ 51*d382aafbSBarry Smith PetscStrcat(version," HG revision: "),PetscStrcat(version,PETSC_VERSION_HG), \ 52*d382aafbSBarry Smith PetscStrcat(version," HG Date: "),PetscStrcat(version,PETSC_VERSION_DATE_HG)) 53*d382aafbSBarry Smith #endif 54*d382aafbSBarry Smith 55*d382aafbSBarry Smith /*MC 56*d382aafbSBarry Smith PetscGetVersion - Gets the PETSc version information in a string. 57*d382aafbSBarry Smith 58*d382aafbSBarry Smith Input Parameter: 59*d382aafbSBarry Smith . len - length of the string 60*d382aafbSBarry Smith 61*d382aafbSBarry Smith Output Parameter: 62*d382aafbSBarry Smith . version - version string 63*d382aafbSBarry Smith 64*d382aafbSBarry Smith Level: developer 65*d382aafbSBarry Smith 66*d382aafbSBarry Smith Usage: 67*d382aafbSBarry Smith char version[256]; 68*d382aafbSBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr) 69*d382aafbSBarry Smith 70*d382aafbSBarry Smith Fortran Note: 71*d382aafbSBarry Smith This routine is not supported in Fortran. 72*d382aafbSBarry Smith 73*d382aafbSBarry Smith .seealso: PetscGetProgramName() 74*d382aafbSBarry Smith 75*d382aafbSBarry Smith M*/ 76*d382aafbSBarry Smith 77*d382aafbSBarry Smith /* ========================================================================== */ 78*d382aafbSBarry Smith 79*d382aafbSBarry Smith /* 80*d382aafbSBarry Smith Currently cannot check formatting for PETSc print statements because we have our 81*d382aafbSBarry Smith own format %D and %G 82*d382aafbSBarry Smith */ 83*d382aafbSBarry Smith #undef PETSC_PRINTF_FORMAT_CHECK 84*d382aafbSBarry Smith #define PETSC_PRINTF_FORMAT_CHECK(a,b) 85*d382aafbSBarry Smith #undef PETSC_FPRINTF_FORMAT_CHECK 86*d382aafbSBarry Smith #define PETSC_FPRINTF_FORMAT_CHECK(a,b) 87*d382aafbSBarry Smith 88*d382aafbSBarry Smith /* 89*d382aafbSBarry Smith Fixes for config/configure.py time choices which impact our interface. Currently only 90*d382aafbSBarry Smith calling conventions and extra compiler checking falls under this category. 91*d382aafbSBarry Smith */ 92*d382aafbSBarry Smith #if !defined(PETSC_STDCALL) 93*d382aafbSBarry Smith #define PETSC_STDCALL 94*d382aafbSBarry Smith #endif 95*d382aafbSBarry Smith #if !defined(PETSC_TEMPLATE) 96*d382aafbSBarry Smith #define PETSC_TEMPLATE 97*d382aafbSBarry Smith #endif 98*d382aafbSBarry Smith #if !defined(PETSC_HAVE_DLL_EXPORT) 99*d382aafbSBarry Smith #define PETSC_DLL_EXPORT 100*d382aafbSBarry Smith #define PETSC_DLL_IMPORT 101*d382aafbSBarry Smith #endif 102*d382aafbSBarry Smith #if !defined(PETSC_DLLEXPORT) 103*d382aafbSBarry Smith #define PETSC_DLLEXPORT 104*d382aafbSBarry Smith #endif 105*d382aafbSBarry Smith #if !defined(PETSCVEC_DLLEXPORT) 106*d382aafbSBarry Smith #define PETSCVEC_DLLEXPORT 107*d382aafbSBarry Smith #endif 108*d382aafbSBarry Smith #if !defined(PETSCMAT_DLLEXPORT) 109*d382aafbSBarry Smith #define PETSCMAT_DLLEXPORT 110*d382aafbSBarry Smith #endif 111*d382aafbSBarry Smith #if !defined(PETSCDM_DLLEXPORT) 112*d382aafbSBarry Smith #define PETSCDM_DLLEXPORT 113*d382aafbSBarry Smith #endif 114*d382aafbSBarry Smith #if !defined(PETSCKSP_DLLEXPORT) 115*d382aafbSBarry Smith #define PETSCKSP_DLLEXPORT 116*d382aafbSBarry Smith #endif 117*d382aafbSBarry Smith #if !defined(PETSCSNES_DLLEXPORT) 118*d382aafbSBarry Smith #define PETSCSNES_DLLEXPORT 119*d382aafbSBarry Smith #endif 120*d382aafbSBarry Smith #if !defined(PETSCTS_DLLEXPORT) 121*d382aafbSBarry Smith #define PETSCTS_DLLEXPORT 122*d382aafbSBarry Smith #endif 123*d382aafbSBarry Smith #if !defined(PETSCFORTRAN_DLLEXPORT) 124*d382aafbSBarry Smith #define PETSCFORTRAN_DLLEXPORT 125*d382aafbSBarry Smith #endif 126*d382aafbSBarry Smith /* ========================================================================== */ 127*d382aafbSBarry Smith 128*d382aafbSBarry Smith /* 129*d382aafbSBarry Smith Defines the interface to MPI allowing the use of all MPI functions. 130*d382aafbSBarry Smith 131*d382aafbSBarry Smith PETSc does not use the C++ binding of MPI at ALL. The following flag 132*d382aafbSBarry Smith makes sure the C++ bindings are not included. The C++ bindings REQUIRE 133*d382aafbSBarry Smith putting mpi.h before ANY C++ include files, we cannot control this 134*d382aafbSBarry Smith with all PETSc users. Users who want to use the MPI C++ bindings can include 135*d382aafbSBarry Smith mpicxx.h directly in their code 136*d382aafbSBarry Smith */ 137*d382aafbSBarry Smith #if defined(PETSC_HAVE_MPI) 138*d382aafbSBarry Smith #define MPICH_SKIP_MPICXX 1 139*d382aafbSBarry Smith #define OMPI_SKIP_MPICXX 1 140*d382aafbSBarry Smith #include "mpi.h" 141*d382aafbSBarry Smith #else 142*d382aafbSBarry Smith #include "mpiuni/mpi.h" 143*d382aafbSBarry Smith #endif 144*d382aafbSBarry Smith /* 145*d382aafbSBarry Smith Yuck, we need to put stdio.h AFTER mpi.h for MPICH2 with C++ compiler 146*d382aafbSBarry Smith see the top of mpicxx.h in the MPICH2 distribution. 147*d382aafbSBarry Smith 148*d382aafbSBarry Smith The MPI STANDARD HAS TO BE CHANGED to prevent this nonsense. 149*d382aafbSBarry Smith */ 150*d382aafbSBarry Smith #include <stdio.h> 151*d382aafbSBarry Smith 152*d382aafbSBarry Smith /* MSMPI on 32bit windows requires this yukky hack - that breaks MPI standard compliance */ 153*d382aafbSBarry Smith #if !defined(MPIAPI) 154*d382aafbSBarry Smith #define MPIAPI 155*d382aafbSBarry Smith #endif 156*d382aafbSBarry Smith 157*d382aafbSBarry Smith /*MC 158*d382aafbSBarry Smith PetscErrorCode - datatype used for return error code from all PETSc functions 159*d382aafbSBarry Smith 160*d382aafbSBarry Smith Level: beginner 161*d382aafbSBarry Smith 162*d382aafbSBarry Smith .seealso: CHKERRQ, SETERRQ 163*d382aafbSBarry Smith M*/ 164*d382aafbSBarry Smith typedef int PetscErrorCode; 165*d382aafbSBarry Smith 166*d382aafbSBarry Smith /*MC 167*d382aafbSBarry Smith 168*d382aafbSBarry Smith PetscCookie - A unique id used to identify each PETSc object. 169*d382aafbSBarry Smith (internal integer in the data structure used for error 170*d382aafbSBarry Smith checking). These are all defined by an offset from the lowest 171*d382aafbSBarry Smith one, PETSC_SMALLEST_COOKIE. 172*d382aafbSBarry Smith 173*d382aafbSBarry Smith Level: advanced 174*d382aafbSBarry Smith 175*d382aafbSBarry Smith .seealso: PetscCookieRegister(), PetscLogEventRegister(), PetscHeaderCreate() 176*d382aafbSBarry Smith M*/ 177*d382aafbSBarry Smith typedef int PetscCookie; 178*d382aafbSBarry Smith 179*d382aafbSBarry Smith /*MC 180*d382aafbSBarry Smith PetscLogEvent - id used to identify PETSc or user events - primarily for logging 181*d382aafbSBarry Smith 182*d382aafbSBarry Smith Level: intermediate 183*d382aafbSBarry Smith 184*d382aafbSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage 185*d382aafbSBarry Smith M*/ 186*d382aafbSBarry Smith typedef int PetscLogEvent; 187*d382aafbSBarry Smith 188*d382aafbSBarry Smith /*MC 189*d382aafbSBarry Smith PetscLogStage - id used to identify user stages of runs - for logging 190*d382aafbSBarry Smith 191*d382aafbSBarry Smith Level: intermediate 192*d382aafbSBarry Smith 193*d382aafbSBarry Smith .seealso: PetscLogStageRegister(), PetscLogStageBegin(), PetscLogStageEnd(), PetscLogEvent 194*d382aafbSBarry Smith M*/ 195*d382aafbSBarry Smith typedef int PetscLogStage; 196*d382aafbSBarry Smith 197*d382aafbSBarry Smith /*MC 198*d382aafbSBarry Smith PetscBLASInt - datatype used to represent 'int' parameters to BLAS/LAPACK functions. 199*d382aafbSBarry Smith 200*d382aafbSBarry Smith Level: intermediate 201*d382aafbSBarry Smith 202*d382aafbSBarry Smith Notes: usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but 203*d382aafbSBarry Smith standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt 204*d382aafbSBarry Smith 205*d382aafbSBarry Smith .seealso: PetscMPIInt, PetscInt 206*d382aafbSBarry Smith 207*d382aafbSBarry Smith M*/ 208*d382aafbSBarry Smith typedef int PetscBLASInt; 209*d382aafbSBarry Smith 210*d382aafbSBarry Smith /*MC 211*d382aafbSBarry Smith PetscMPIInt - datatype used to represent 'int' parameters to MPI functions. 212*d382aafbSBarry Smith 213*d382aafbSBarry Smith Level: intermediate 214*d382aafbSBarry Smith 215*d382aafbSBarry Smith Notes: usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but 216*d382aafbSBarry Smith standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt 217*d382aafbSBarry Smith 218*d382aafbSBarry Smith PetscBLASIntCheck(a) checks if the given PetscInt a will fit in a PetscBLASInt, if not it generates a 219*d382aafbSBarry Smith PETSC_ERR_ARG_OUTOFRANGE. 220*d382aafbSBarry Smith 221*d382aafbSBarry Smith PetscBLASInt b = PetscBLASIntCast(a) checks if the given PetscInt a will fit in a PetscBLASInt, if not it 222*d382aafbSBarry Smith generates a PETSC_ERR_ARG_OUTOFRANGE 223*d382aafbSBarry Smith 224*d382aafbSBarry Smith .seealso: PetscBLASInt, PetscInt 225*d382aafbSBarry Smith 226*d382aafbSBarry Smith M*/ 227*d382aafbSBarry Smith typedef int PetscMPIInt; 228*d382aafbSBarry Smith 229*d382aafbSBarry Smith /*MC 230*d382aafbSBarry Smith PetscEnum - datatype used to pass enum types within PETSc functions. 231*d382aafbSBarry Smith 232*d382aafbSBarry Smith Level: intermediate 233*d382aafbSBarry Smith 234*d382aafbSBarry Smith PetscMPIIntCheck(a) checks if the given PetscInt a will fit in a PetscMPIInt, if not it generates a 235*d382aafbSBarry Smith PETSC_ERR_ARG_OUTOFRANGE. 236*d382aafbSBarry Smith 237*d382aafbSBarry Smith PetscMPIInt b = PetscMPIIntCast(a) checks if the given PetscInt a will fit in a PetscMPIInt, if not it 238*d382aafbSBarry Smith generates a PETSC_ERR_ARG_OUTOFRANGE 239*d382aafbSBarry Smith 240*d382aafbSBarry Smith .seealso: PetscOptionsGetEnum(), PetscOptionsEnum(), PetscBagRegisterEnum() 241*d382aafbSBarry Smith M*/ 242*d382aafbSBarry Smith typedef enum { ENUM_DUMMY } PetscEnum; 243*d382aafbSBarry Smith 244*d382aafbSBarry Smith /*MC 245*d382aafbSBarry Smith PetscInt - PETSc type that represents integer - used primarily to 246*d382aafbSBarry Smith represent size of objects. Its size can be configured with the option 247*d382aafbSBarry Smith --with-64-bit-indices - to be either 32bit or 64bit [default 32 bit ints] 248*d382aafbSBarry Smith 249*d382aafbSBarry Smith Level: intermediate 250*d382aafbSBarry Smith 251*d382aafbSBarry Smith 252*d382aafbSBarry Smith .seealso: PetscScalar, PetscBLASInt, PetscMPIInt 253*d382aafbSBarry Smith M*/ 254*d382aafbSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 255*d382aafbSBarry Smith typedef long long PetscInt; 256*d382aafbSBarry Smith #define MPIU_INT MPI_LONG_LONG_INT 257*d382aafbSBarry Smith #else 258*d382aafbSBarry Smith typedef int PetscInt; 259*d382aafbSBarry Smith #define MPIU_INT MPI_INT 260*d382aafbSBarry Smith #endif 261*d382aafbSBarry Smith 262*d382aafbSBarry Smith /* add in MPIU type for size_t */ 263*d382aafbSBarry Smith #if (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_INT) 264*d382aafbSBarry Smith #define MPIU_SIZE_T MPI_INT 265*d382aafbSBarry Smith #elif (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_LONG) 266*d382aafbSBarry Smith #define MPIU_SIZE_T MPI_LONG 267*d382aafbSBarry Smith #elif (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_LONG_LONG) 268*d382aafbSBarry Smith #define MPIU_SIZE_T MPI_LONG_LONG_INT 269*d382aafbSBarry Smith #else 270*d382aafbSBarry Smith #error "Unknown size for size_t! Send us a bugreport at petsc-maint@mcs.anl.gov" 271*d382aafbSBarry Smith #endif 272*d382aafbSBarry Smith 273*d382aafbSBarry Smith 274*d382aafbSBarry Smith /* 275*d382aafbSBarry Smith You can use PETSC_STDOUT as a replacement of stdout. You can also change 276*d382aafbSBarry Smith the value of PETSC_STDOUT to redirect all standard output elsewhere 277*d382aafbSBarry Smith */ 278*d382aafbSBarry Smith 279*d382aafbSBarry Smith extern FILE* PETSC_STDOUT; 280*d382aafbSBarry Smith 281*d382aafbSBarry Smith /* 282*d382aafbSBarry Smith You can use PETSC_STDERR as a replacement of stderr. You can also change 283*d382aafbSBarry Smith the value of PETSC_STDERR to redirect all standard error elsewhere 284*d382aafbSBarry Smith */ 285*d382aafbSBarry Smith extern FILE* PETSC_STDERR; 286*d382aafbSBarry Smith 287*d382aafbSBarry Smith /* 288*d382aafbSBarry Smith PETSC_ZOPEFD is used to send data to the PETSc webpage. It can be used 289*d382aafbSBarry Smith in conjunction with PETSC_STDOUT, or by itself. 290*d382aafbSBarry Smith */ 291*d382aafbSBarry Smith extern FILE* PETSC_ZOPEFD; 292*d382aafbSBarry Smith 293*d382aafbSBarry Smith #if !defined(PETSC_USE_EXTERN_CXX) && defined(__cplusplus) 294*d382aafbSBarry Smith /*MC 295*d382aafbSBarry Smith PetscPolymorphicSubroutine - allows defining a C++ polymorphic version of 296*d382aafbSBarry Smith a PETSc function that remove certain optional arguments for a simplier user interface 297*d382aafbSBarry Smith 298*d382aafbSBarry Smith Not collective 299*d382aafbSBarry Smith 300*d382aafbSBarry Smith Synopsis: 301*d382aafbSBarry Smith PetscPolymorphicSubroutine(Functionname,(arguments of C++ function),(arguments of C function)) 302*d382aafbSBarry Smith 303*d382aafbSBarry Smith Level: developer 304*d382aafbSBarry Smith 305*d382aafbSBarry Smith Example: 306*d382aafbSBarry Smith PetscPolymorphicSubroutine(VecNorm,(Vec x,PetscReal *r),(x,NORM_2,r)) generates the new routine 307*d382aafbSBarry Smith PetscErrorCode VecNorm(Vec x,PetscReal *r) = VecNorm(x,NORM_2,r) 308*d382aafbSBarry Smith 309*d382aafbSBarry Smith .seealso: PetscPolymorphicFunction() 310*d382aafbSBarry Smith 311*d382aafbSBarry Smith M*/ 312*d382aafbSBarry Smith #define PetscPolymorphicSubroutine(A,B,C) PETSC_STATIC_INLINE PetscErrorCode A B {return A C;} 313*d382aafbSBarry Smith 314*d382aafbSBarry Smith /*MC 315*d382aafbSBarry Smith PetscPolymorphicScalar - allows defining a C++ polymorphic version of 316*d382aafbSBarry Smith a PETSc function that replaces a PetscScalar * argument with a PetscScalar argument 317*d382aafbSBarry Smith 318*d382aafbSBarry Smith Not collective 319*d382aafbSBarry Smith 320*d382aafbSBarry Smith Synopsis: 321*d382aafbSBarry Smith PetscPolymorphicScalar(Functionname,(arguments of C++ function),(arguments of C function)) 322*d382aafbSBarry Smith 323*d382aafbSBarry Smith Level: developer 324*d382aafbSBarry Smith 325*d382aafbSBarry Smith Example: 326*d382aafbSBarry Smith PetscPolymorphicScalar(VecAXPY,(PetscScalar _val,Vec x,Vec y),(&_Val,x,y)) generates the new routine 327*d382aafbSBarry Smith PetscErrorCode VecAXPY(PetscScalar _val,Vec x,Vec y) = {PetscScalar _Val = _val; return VecAXPY(&_Val,x,y);} 328*d382aafbSBarry Smith 329*d382aafbSBarry Smith .seealso: PetscPolymorphicFunction(),PetscPolymorphicSubroutine() 330*d382aafbSBarry Smith 331*d382aafbSBarry Smith M*/ 332*d382aafbSBarry Smith #define PetscPolymorphicScalar(A,B,C) PETSC_STATIC_INLINE PetscErrorCode A B {PetscScalar _Val = _val; return A C;} 333*d382aafbSBarry Smith 334*d382aafbSBarry Smith /*MC 335*d382aafbSBarry Smith PetscPolymorphicFunction - allows defining a C++ polymorphic version of 336*d382aafbSBarry Smith a PETSc function that remove certain optional arguments for a simplier user interface 337*d382aafbSBarry Smith and returns the computed value (istead of an error code) 338*d382aafbSBarry Smith 339*d382aafbSBarry Smith Not collective 340*d382aafbSBarry Smith 341*d382aafbSBarry Smith Synopsis: 342*d382aafbSBarry Smith PetscPolymorphicFunction(Functionname,(arguments of C++ function),(arguments of C function),return type,return variable name) 343*d382aafbSBarry Smith 344*d382aafbSBarry Smith Level: developer 345*d382aafbSBarry Smith 346*d382aafbSBarry Smith Example: 347*d382aafbSBarry Smith PetscPolymorphicFunction(VecNorm,(Vec x,NormType t),(x,t,&r),PetscReal,r) generates the new routine 348*d382aafbSBarry Smith PetscReal VecNorm(Vec x,NormType t) = {PetscReal r; VecNorm(x,t,&r); return r;} 349*d382aafbSBarry Smith 350*d382aafbSBarry Smith .seealso: PetscPolymorphicSubroutine() 351*d382aafbSBarry Smith 352*d382aafbSBarry Smith M*/ 353*d382aafbSBarry Smith #define PetscPolymorphicFunction(A,B,C,D,E) PETSC_STATIC_INLINE D A B {D E; A C;return E;} 354*d382aafbSBarry Smith 355*d382aafbSBarry Smith #else 356*d382aafbSBarry Smith #define PetscPolymorphicSubroutine(A,B,C) 357*d382aafbSBarry Smith #define PetscPolymorphicScalar(A,B,C) 358*d382aafbSBarry Smith #define PetscPolymorphicFunction(A,B,C,D,E) 359*d382aafbSBarry Smith #endif 360*d382aafbSBarry Smith 361*d382aafbSBarry Smith /*MC 362*d382aafbSBarry Smith PetscUnlikely - hints the compiler that the given condition is usually FALSE 363*d382aafbSBarry Smith 364*d382aafbSBarry Smith Not Collective 365*d382aafbSBarry Smith 366*d382aafbSBarry Smith Synopsis: 367*d382aafbSBarry Smith PetscTruth PetscUnlikely(PetscTruth cond) 368*d382aafbSBarry Smith 369*d382aafbSBarry Smith Input Parameters: 370*d382aafbSBarry Smith . cond - condition or expression 371*d382aafbSBarry Smith 372*d382aafbSBarry Smith Note: This returns the same truth value, it is only a hint to compilers that the resulting 373*d382aafbSBarry Smith branch is unlikely. 374*d382aafbSBarry Smith 375*d382aafbSBarry Smith Level: advanced 376*d382aafbSBarry Smith 377*d382aafbSBarry Smith .seealso: PetscLikely(), CHKERRQ 378*d382aafbSBarry Smith M*/ 379*d382aafbSBarry Smith 380*d382aafbSBarry Smith /*MC 381*d382aafbSBarry Smith PetscLikely - hints the compiler that the given condition is usually TRUE 382*d382aafbSBarry Smith 383*d382aafbSBarry Smith Not Collective 384*d382aafbSBarry Smith 385*d382aafbSBarry Smith Synopsis: 386*d382aafbSBarry Smith PetscTruth PetscUnlikely(PetscTruth cond) 387*d382aafbSBarry Smith 388*d382aafbSBarry Smith Input Parameters: 389*d382aafbSBarry Smith . cond - condition or expression 390*d382aafbSBarry Smith 391*d382aafbSBarry Smith Note: This returns the same truth value, it is only a hint to compilers that the resulting 392*d382aafbSBarry Smith branch is likely. 393*d382aafbSBarry Smith 394*d382aafbSBarry Smith Level: advanced 395*d382aafbSBarry Smith 396*d382aafbSBarry Smith .seealso: PetscUnlikely() 397*d382aafbSBarry Smith M*/ 398*d382aafbSBarry Smith #if defined(PETSC_HAVE_BUILTIN_EXPECT) 399*d382aafbSBarry Smith # define PetscUnlikely(cond) __builtin_expect(!!(cond),0) 400*d382aafbSBarry Smith # define PetscLikely(cond) __builtin_expect(!!(cond),1) 401*d382aafbSBarry Smith #else 402*d382aafbSBarry Smith # define PetscUnlikely(cond) cond 403*d382aafbSBarry Smith # define PetscLikely(cond) cond 404*d382aafbSBarry Smith #endif 405*d382aafbSBarry Smith 406*d382aafbSBarry Smith /* 407*d382aafbSBarry Smith Extern indicates a PETSc function defined elsewhere 408*d382aafbSBarry Smith */ 409*d382aafbSBarry Smith #if !defined(EXTERN) 410*d382aafbSBarry Smith #define EXTERN extern 411*d382aafbSBarry Smith #endif 412*d382aafbSBarry Smith 413*d382aafbSBarry Smith /* 414*d382aafbSBarry Smith Defines some elementary mathematics functions and constants. 415*d382aafbSBarry Smith */ 416*d382aafbSBarry Smith #include "petscmath.h" 417*d382aafbSBarry Smith 418*d382aafbSBarry Smith /* 419*d382aafbSBarry Smith Declare extern C stuff after including external header files 420*d382aafbSBarry Smith */ 421*d382aafbSBarry Smith 422*d382aafbSBarry Smith PETSC_EXTERN_CXX_BEGIN 423*d382aafbSBarry Smith 424*d382aafbSBarry Smith /* 425*d382aafbSBarry Smith Basic PETSc constants 426*d382aafbSBarry Smith */ 427*d382aafbSBarry Smith 428*d382aafbSBarry Smith /*E 429*d382aafbSBarry Smith PetscTruth - Logical variable. Actually an integer 430*d382aafbSBarry Smith 431*d382aafbSBarry Smith Level: beginner 432*d382aafbSBarry Smith 433*d382aafbSBarry Smith E*/ 434*d382aafbSBarry Smith typedef enum { PETSC_FALSE,PETSC_TRUE } PetscTruth; 435*d382aafbSBarry Smith extern const char *PetscTruths[]; 436*d382aafbSBarry Smith 437*d382aafbSBarry Smith /*MC 438*d382aafbSBarry Smith PETSC_FALSE - False value of PetscTruth 439*d382aafbSBarry Smith 440*d382aafbSBarry Smith Level: beginner 441*d382aafbSBarry Smith 442*d382aafbSBarry Smith Note: Zero integer 443*d382aafbSBarry Smith 444*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_TRUE 445*d382aafbSBarry Smith M*/ 446*d382aafbSBarry Smith 447*d382aafbSBarry Smith /*MC 448*d382aafbSBarry Smith PETSC_TRUE - True value of PetscTruth 449*d382aafbSBarry Smith 450*d382aafbSBarry Smith Level: beginner 451*d382aafbSBarry Smith 452*d382aafbSBarry Smith Note: Nonzero integer 453*d382aafbSBarry Smith 454*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_FALSE 455*d382aafbSBarry Smith M*/ 456*d382aafbSBarry Smith 457*d382aafbSBarry Smith /*MC 458*d382aafbSBarry Smith PETSC_YES - Alias for PETSC_TRUE 459*d382aafbSBarry Smith 460*d382aafbSBarry Smith Level: beginner 461*d382aafbSBarry Smith 462*d382aafbSBarry Smith Note: Zero integer 463*d382aafbSBarry Smith 464*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_TRUE, PETSC_FALSE, PETSC_NO 465*d382aafbSBarry Smith M*/ 466*d382aafbSBarry Smith #define PETSC_YES PETSC_TRUE 467*d382aafbSBarry Smith 468*d382aafbSBarry Smith /*MC 469*d382aafbSBarry Smith PETSC_NO - Alias for PETSC_FALSE 470*d382aafbSBarry Smith 471*d382aafbSBarry Smith Level: beginner 472*d382aafbSBarry Smith 473*d382aafbSBarry Smith Note: Nonzero integer 474*d382aafbSBarry Smith 475*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_TRUE, PETSC_FALSE, PETSC_YES 476*d382aafbSBarry Smith M*/ 477*d382aafbSBarry Smith #define PETSC_NO PETSC_FALSE 478*d382aafbSBarry Smith 479*d382aafbSBarry Smith /*MC 480*d382aafbSBarry Smith PETSC_NULL - standard way of passing in a null or array or pointer 481*d382aafbSBarry Smith 482*d382aafbSBarry Smith Level: beginner 483*d382aafbSBarry Smith 484*d382aafbSBarry Smith Notes: accepted by many PETSc functions to not set a parameter and instead use 485*d382aafbSBarry Smith some default 486*d382aafbSBarry Smith 487*d382aafbSBarry Smith This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER, 488*d382aafbSBarry Smith PETSC_NULL_DOUBLE_PRECISION etc 489*d382aafbSBarry Smith 490*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE 491*d382aafbSBarry Smith 492*d382aafbSBarry Smith M*/ 493*d382aafbSBarry Smith #define PETSC_NULL 0 494*d382aafbSBarry Smith 495*d382aafbSBarry Smith /*MC 496*d382aafbSBarry Smith PETSC_DECIDE - standard way of passing in integer or floating point parameter 497*d382aafbSBarry Smith where you wish PETSc to use the default. 498*d382aafbSBarry Smith 499*d382aafbSBarry Smith Level: beginner 500*d382aafbSBarry Smith 501*d382aafbSBarry Smith .seealso: PETSC_NULL, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE 502*d382aafbSBarry Smith 503*d382aafbSBarry Smith M*/ 504*d382aafbSBarry Smith #define PETSC_DECIDE -1 505*d382aafbSBarry Smith 506*d382aafbSBarry Smith /*MC 507*d382aafbSBarry Smith PETSC_DEFAULT - standard way of passing in integer or floating point parameter 508*d382aafbSBarry Smith where you wish PETSc to use the default. 509*d382aafbSBarry Smith 510*d382aafbSBarry Smith Level: beginner 511*d382aafbSBarry Smith 512*d382aafbSBarry Smith Fortran Notes: You need to use PETSC_DEFAULT_INTEGER or PETSC_DEFAULT_DOUBLE_PRECISION. 513*d382aafbSBarry Smith 514*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_NULL, PETSC_IGNORE, PETSC_DETERMINE 515*d382aafbSBarry Smith 516*d382aafbSBarry Smith M*/ 517*d382aafbSBarry Smith #define PETSC_DEFAULT -2 518*d382aafbSBarry Smith 519*d382aafbSBarry Smith 520*d382aafbSBarry Smith /*MC 521*d382aafbSBarry Smith PETSC_IGNORE - same as PETSC_NULL, means PETSc will ignore this argument 522*d382aafbSBarry Smith 523*d382aafbSBarry Smith Level: beginner 524*d382aafbSBarry Smith 525*d382aafbSBarry Smith Note: accepted by many PETSc functions to not set a parameter and instead use 526*d382aafbSBarry Smith some default 527*d382aafbSBarry Smith 528*d382aafbSBarry Smith Fortran Notes: This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER, 529*d382aafbSBarry Smith PETSC_NULL_DOUBLE_PRECISION etc 530*d382aafbSBarry Smith 531*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_NULL, PETSC_DETERMINE 532*d382aafbSBarry Smith 533*d382aafbSBarry Smith M*/ 534*d382aafbSBarry Smith #define PETSC_IGNORE PETSC_NULL 535*d382aafbSBarry Smith 536*d382aafbSBarry Smith /*MC 537*d382aafbSBarry Smith PETSC_DETERMINE - standard way of passing in integer or floating point parameter 538*d382aafbSBarry Smith where you wish PETSc to compute the required value. 539*d382aafbSBarry Smith 540*d382aafbSBarry Smith Level: beginner 541*d382aafbSBarry Smith 542*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_NULL, VecSetSizes() 543*d382aafbSBarry Smith 544*d382aafbSBarry Smith M*/ 545*d382aafbSBarry Smith #define PETSC_DETERMINE PETSC_DECIDE 546*d382aafbSBarry Smith 547*d382aafbSBarry Smith /*MC 548*d382aafbSBarry Smith PETSC_COMM_WORLD - the equivalent of the MPI_COMM_WORLD communicator which represents 549*d382aafbSBarry Smith all the processs that PETSc knows about. 550*d382aafbSBarry Smith 551*d382aafbSBarry Smith Level: beginner 552*d382aafbSBarry Smith 553*d382aafbSBarry Smith Notes: By default PETSC_COMM_WORLD and MPI_COMM_WORLD are identical unless you wish to 554*d382aafbSBarry Smith run PETSc on ONLY a subset of MPI_COMM_WORLD. In that case create your new (smaller) 555*d382aafbSBarry Smith communicator, call it, say comm, and set PETSC_COMM_WORLD = comm BEFORE calling 556*d382aafbSBarry Smith PetscInitialize() 557*d382aafbSBarry Smith 558*d382aafbSBarry Smith .seealso: PETSC_COMM_SELF 559*d382aafbSBarry Smith 560*d382aafbSBarry Smith M*/ 561*d382aafbSBarry Smith extern MPI_Comm PETSC_COMM_WORLD; 562*d382aafbSBarry Smith 563*d382aafbSBarry Smith /*MC 564*d382aafbSBarry Smith PETSC_COMM_SELF - a duplicate of the MPI_COMM_SELF communicator which represents 565*d382aafbSBarry Smith the current process 566*d382aafbSBarry Smith 567*d382aafbSBarry Smith Level: beginner 568*d382aafbSBarry Smith 569*d382aafbSBarry Smith Notes: PETSC_COMM_SELF and MPI_COMM_SELF are equivalent. 570*d382aafbSBarry Smith 571*d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD 572*d382aafbSBarry Smith 573*d382aafbSBarry Smith M*/ 574*d382aafbSBarry Smith #define PETSC_COMM_SELF MPI_COMM_SELF 575*d382aafbSBarry Smith 576*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscTruth PetscInitializeCalled; 577*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscTruth PetscFinalizeCalled; 578*d382aafbSBarry Smith 579*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*)(MPI_Comm),PetscErrorCode (*)(MPI_Comm)); 580*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCommDuplicate(MPI_Comm,MPI_Comm*,int*); 581*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCommDestroy(MPI_Comm*); 582*d382aafbSBarry Smith 583*d382aafbSBarry Smith /*MC 584*d382aafbSBarry Smith PetscMalloc - Allocates memory 585*d382aafbSBarry Smith 586*d382aafbSBarry Smith Input Parameter: 587*d382aafbSBarry Smith . m - number of bytes to allocate 588*d382aafbSBarry Smith 589*d382aafbSBarry Smith Output Parameter: 590*d382aafbSBarry Smith . result - memory allocated 591*d382aafbSBarry Smith 592*d382aafbSBarry Smith Synopsis: 593*d382aafbSBarry Smith PetscErrorCode PetscMalloc(size_t m,void **result) 594*d382aafbSBarry Smith 595*d382aafbSBarry Smith Level: beginner 596*d382aafbSBarry Smith 597*d382aafbSBarry Smith Notes: Memory is always allocated at least double aligned 598*d382aafbSBarry Smith 599*d382aafbSBarry Smith If you request memory of zero size it will allocate no space and assign the pointer to 0; PetscFree() will 600*d382aafbSBarry Smith properly handle not freeing the null pointer. 601*d382aafbSBarry Smith 602*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew() 603*d382aafbSBarry Smith 604*d382aafbSBarry Smith Concepts: memory allocation 605*d382aafbSBarry Smith 606*d382aafbSBarry Smith M*/ 607*d382aafbSBarry Smith #define PetscMalloc(a,b) ((a != 0) ? (*PetscTrMalloc)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__,(void**)(b)) : (*(b) = 0,0) ) 608*d382aafbSBarry Smith 609*d382aafbSBarry Smith /*MC 610*d382aafbSBarry Smith PetscAddrAlign - Returns an address with PETSC_MEMALIGN alignment 611*d382aafbSBarry Smith 612*d382aafbSBarry Smith Input Parameters: 613*d382aafbSBarry Smith . addr - address to align (any pointer type) 614*d382aafbSBarry Smith 615*d382aafbSBarry Smith Synopsis: 616*d382aafbSBarry Smith void *PetscAddrAlign(void *addr) 617*d382aafbSBarry Smith 618*d382aafbSBarry Smith Level: developer 619*d382aafbSBarry Smith 620*d382aafbSBarry Smith .seealso: PetscMallocAlign() 621*d382aafbSBarry Smith 622*d382aafbSBarry Smith Concepts: memory allocation 623*d382aafbSBarry Smith M*/ 624*d382aafbSBarry Smith #if defined PETSC_UINTPTR_T 625*d382aafbSBarry Smith # define PetscAddrAlign(a) (void*)((((PETSC_UINTPTR_T)(a))+(PETSC_MEMALIGN-1)) & ~(PETSC_MEMALIGN-1)) 626*d382aafbSBarry Smith #else 627*d382aafbSBarry Smith # define PetscAddrAlign(a) (void*)(a) 628*d382aafbSBarry Smith #endif 629*d382aafbSBarry Smith 630*d382aafbSBarry Smith /*MC 631*d382aafbSBarry Smith PetscMalloc2 - Allocates 2 chunks of memory 632*d382aafbSBarry Smith 633*d382aafbSBarry Smith Input Parameter: 634*d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 635*d382aafbSBarry Smith . t1 - type of first memory elements 636*d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 637*d382aafbSBarry Smith - t2 - type of second memory elements 638*d382aafbSBarry Smith 639*d382aafbSBarry Smith Output Parameter: 640*d382aafbSBarry Smith + r1 - memory allocated in first chunk 641*d382aafbSBarry Smith - r2 - memory allocated in second chunk 642*d382aafbSBarry Smith 643*d382aafbSBarry Smith Synopsis: 644*d382aafbSBarry Smith PetscErrorCode PetscMalloc2(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2) 645*d382aafbSBarry Smith 646*d382aafbSBarry Smith Level: developer 647*d382aafbSBarry Smith 648*d382aafbSBarry Smith Notes: Memory of first chunk is always allocated at least double aligned 649*d382aafbSBarry Smith 650*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc() 651*d382aafbSBarry Smith 652*d382aafbSBarry Smith Concepts: memory allocation 653*d382aafbSBarry Smith 654*d382aafbSBarry Smith M*/ 655*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 656*d382aafbSBarry Smith #define PetscMalloc2(m1,t1,r1,m2,t2,r2) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2)) 657*d382aafbSBarry Smith #else 658*d382aafbSBarry Smith #define PetscMalloc2(m1,t1,r1,m2,t2,r2) (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(PETSC_MEMALIGN-1),r1) \ 659*d382aafbSBarry Smith || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),0)) 660*d382aafbSBarry Smith #endif 661*d382aafbSBarry Smith 662*d382aafbSBarry Smith /*MC 663*d382aafbSBarry Smith PetscMalloc3 - Allocates 3 chunks of memory 664*d382aafbSBarry Smith 665*d382aafbSBarry Smith Input Parameter: 666*d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 667*d382aafbSBarry Smith . t1 - type of first memory elements 668*d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 669*d382aafbSBarry Smith . t2 - type of second memory elements 670*d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 671*d382aafbSBarry Smith - t3 - type of third memory elements 672*d382aafbSBarry Smith 673*d382aafbSBarry Smith Output Parameter: 674*d382aafbSBarry Smith + r1 - memory allocated in first chunk 675*d382aafbSBarry Smith . r2 - memory allocated in second chunk 676*d382aafbSBarry Smith - r3 - memory allocated in third chunk 677*d382aafbSBarry Smith 678*d382aafbSBarry Smith Synopsis: 679*d382aafbSBarry Smith PetscErrorCode PetscMalloc3(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3) 680*d382aafbSBarry Smith 681*d382aafbSBarry Smith Level: developer 682*d382aafbSBarry Smith 683*d382aafbSBarry Smith Notes: Memory of first chunk is always allocated at least double aligned 684*d382aafbSBarry Smith 685*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3() 686*d382aafbSBarry Smith 687*d382aafbSBarry Smith Concepts: memory allocation 688*d382aafbSBarry Smith 689*d382aafbSBarry Smith M*/ 690*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 691*d382aafbSBarry Smith #define PetscMalloc3(m1,t1,r1,m2,t2,r2,m3,t3,r3) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3)) 692*d382aafbSBarry Smith #else 693*d382aafbSBarry Smith #define PetscMalloc3(m1,t1,r1,m2,t2,r2,m3,t3,r3) (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+2*(PETSC_MEMALIGN-1),r1) \ 694*d382aafbSBarry Smith || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),0)) 695*d382aafbSBarry Smith #endif 696*d382aafbSBarry Smith 697*d382aafbSBarry Smith /*MC 698*d382aafbSBarry Smith PetscMalloc4 - Allocates 4 chunks of memory 699*d382aafbSBarry Smith 700*d382aafbSBarry Smith Input Parameter: 701*d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 702*d382aafbSBarry Smith . t1 - type of first memory elements 703*d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 704*d382aafbSBarry Smith . t2 - type of second memory elements 705*d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 706*d382aafbSBarry Smith . t3 - type of third memory elements 707*d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 708*d382aafbSBarry Smith - t4 - type of fourth memory elements 709*d382aafbSBarry Smith 710*d382aafbSBarry Smith Output Parameter: 711*d382aafbSBarry Smith + r1 - memory allocated in first chunk 712*d382aafbSBarry Smith . r2 - memory allocated in second chunk 713*d382aafbSBarry Smith . r3 - memory allocated in third chunk 714*d382aafbSBarry Smith - r4 - memory allocated in fourth chunk 715*d382aafbSBarry Smith 716*d382aafbSBarry Smith Synopsis: 717*d382aafbSBarry Smith PetscErrorCode PetscMalloc4(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4) 718*d382aafbSBarry Smith 719*d382aafbSBarry Smith Level: developer 720*d382aafbSBarry Smith 721*d382aafbSBarry Smith Notes: Memory of first chunk is always allocated at least double aligned 722*d382aafbSBarry Smith 723*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4() 724*d382aafbSBarry Smith 725*d382aafbSBarry Smith Concepts: memory allocation 726*d382aafbSBarry Smith 727*d382aafbSBarry Smith M*/ 728*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 729*d382aafbSBarry Smith #define PetscMalloc4(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4)) 730*d382aafbSBarry Smith #else 731*d382aafbSBarry Smith #define PetscMalloc4(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4) \ 732*d382aafbSBarry Smith (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+3*(PETSC_MEMALIGN-1),r1) \ 733*d382aafbSBarry Smith || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),0)) 734*d382aafbSBarry Smith #endif 735*d382aafbSBarry Smith 736*d382aafbSBarry Smith /*MC 737*d382aafbSBarry Smith PetscMalloc5 - Allocates 5 chunks of memory 738*d382aafbSBarry Smith 739*d382aafbSBarry Smith Input Parameter: 740*d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 741*d382aafbSBarry Smith . t1 - type of first memory elements 742*d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 743*d382aafbSBarry Smith . t2 - type of second memory elements 744*d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 745*d382aafbSBarry Smith . t3 - type of third memory elements 746*d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 747*d382aafbSBarry Smith . t4 - type of fourth memory elements 748*d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 749*d382aafbSBarry Smith - t5 - type of fifth memory elements 750*d382aafbSBarry Smith 751*d382aafbSBarry Smith Output Parameter: 752*d382aafbSBarry Smith + r1 - memory allocated in first chunk 753*d382aafbSBarry Smith . r2 - memory allocated in second chunk 754*d382aafbSBarry Smith . r3 - memory allocated in third chunk 755*d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 756*d382aafbSBarry Smith - r5 - memory allocated in fifth chunk 757*d382aafbSBarry Smith 758*d382aafbSBarry Smith Synopsis: 759*d382aafbSBarry Smith PetscErrorCode PetscMalloc5(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4,size_t m5,type t5,void **r5) 760*d382aafbSBarry Smith 761*d382aafbSBarry Smith Level: developer 762*d382aafbSBarry Smith 763*d382aafbSBarry Smith Notes: Memory of first chunk is always allocated at least double aligned 764*d382aafbSBarry Smith 765*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4(), PetscFree5() 766*d382aafbSBarry Smith 767*d382aafbSBarry Smith Concepts: memory allocation 768*d382aafbSBarry Smith 769*d382aafbSBarry Smith M*/ 770*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 771*d382aafbSBarry Smith #define PetscMalloc5(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4) || PetscMalloc((m5)*sizeof(t5),r5)) 772*d382aafbSBarry Smith #else 773*d382aafbSBarry Smith #define PetscMalloc5(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5) \ 774*d382aafbSBarry Smith (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+(m5)*sizeof(t5)+4*(PETSC_MEMALIGN-1),r1) \ 775*d382aafbSBarry Smith || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),*(r5) = (t5*)PetscAddrAlign(*(r4)+m4),0)) 776*d382aafbSBarry Smith #endif 777*d382aafbSBarry Smith 778*d382aafbSBarry Smith 779*d382aafbSBarry Smith /*MC 780*d382aafbSBarry Smith PetscMalloc6 - Allocates 6 chunks of memory 781*d382aafbSBarry Smith 782*d382aafbSBarry Smith Input Parameter: 783*d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 784*d382aafbSBarry Smith . t1 - type of first memory elements 785*d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 786*d382aafbSBarry Smith . t2 - type of second memory elements 787*d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 788*d382aafbSBarry Smith . t3 - type of third memory elements 789*d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 790*d382aafbSBarry Smith . t4 - type of fourth memory elements 791*d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 792*d382aafbSBarry Smith . t5 - type of fifth memory elements 793*d382aafbSBarry Smith . m6 - number of elements to allocate in 6th chunk (may be zero) 794*d382aafbSBarry Smith - t6 - type of sixth memory elements 795*d382aafbSBarry Smith 796*d382aafbSBarry Smith Output Parameter: 797*d382aafbSBarry Smith + r1 - memory allocated in first chunk 798*d382aafbSBarry Smith . r2 - memory allocated in second chunk 799*d382aafbSBarry Smith . r3 - memory allocated in third chunk 800*d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 801*d382aafbSBarry Smith . r5 - memory allocated in fifth chunk 802*d382aafbSBarry Smith - r6 - memory allocated in sixth chunk 803*d382aafbSBarry Smith 804*d382aafbSBarry Smith Synopsis: 805*d382aafbSBarry Smith PetscErrorCode PetscMalloc6(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4,size_t m5,type t5,void **r5,size_t m6,type t6,void **r6) 806*d382aafbSBarry Smith 807*d382aafbSBarry Smith Level: developer 808*d382aafbSBarry Smith 809*d382aafbSBarry Smith Notes: Memory of first chunk is always allocated at least double aligned 810*d382aafbSBarry Smith 811*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4(), PetscFree5(), PetscFree6() 812*d382aafbSBarry Smith 813*d382aafbSBarry Smith Concepts: memory allocation 814*d382aafbSBarry Smith 815*d382aafbSBarry Smith M*/ 816*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 817*d382aafbSBarry Smith #define PetscMalloc6(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4) || PetscMalloc((m5)*sizeof(t5),r5) || PetscMalloc((m6)*sizeof(t6),r6)) 818*d382aafbSBarry Smith #else 819*d382aafbSBarry Smith #define PetscMalloc6(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6) \ 820*d382aafbSBarry Smith (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+(m5)*sizeof(t5)+(m6)*sizeof(t6)+5*(PETSC_MEMALIGN-1),r1) \ 821*d382aafbSBarry Smith || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),*(r5) = (t5*)PetscAddrAlign(*(r4)+m4),*(r6) = (t6*)PetscAddrAlign(*(r5)+m5),0)) 822*d382aafbSBarry Smith #endif 823*d382aafbSBarry Smith 824*d382aafbSBarry Smith /*MC 825*d382aafbSBarry Smith PetscMalloc7 - Allocates 7 chunks of memory 826*d382aafbSBarry Smith 827*d382aafbSBarry Smith Input Parameter: 828*d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 829*d382aafbSBarry Smith . t1 - type of first memory elements 830*d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 831*d382aafbSBarry Smith . t2 - type of second memory elements 832*d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 833*d382aafbSBarry Smith . t3 - type of third memory elements 834*d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 835*d382aafbSBarry Smith . t4 - type of fourth memory elements 836*d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 837*d382aafbSBarry Smith . t5 - type of fifth memory elements 838*d382aafbSBarry Smith . m6 - number of elements to allocate in 6th chunk (may be zero) 839*d382aafbSBarry Smith . t6 - type of sixth memory elements 840*d382aafbSBarry Smith . m7 - number of elements to allocate in 7th chunk (may be zero) 841*d382aafbSBarry Smith - t7 - type of sixth memory elements 842*d382aafbSBarry Smith 843*d382aafbSBarry Smith Output Parameter: 844*d382aafbSBarry Smith + r1 - memory allocated in first chunk 845*d382aafbSBarry Smith . r2 - memory allocated in second chunk 846*d382aafbSBarry Smith . r3 - memory allocated in third chunk 847*d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 848*d382aafbSBarry Smith . r5 - memory allocated in fifth chunk 849*d382aafbSBarry Smith . r6 - memory allocated in sixth chunk 850*d382aafbSBarry Smith - r7 - memory allocated in sixth chunk 851*d382aafbSBarry Smith 852*d382aafbSBarry Smith Synopsis: 853*d382aafbSBarry Smith PetscErrorCode PetscMalloc7(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4,size_t m5,type t5,void **r5,size_t m6,type t6,void **r6,size_t m7,type t7,void **r7) 854*d382aafbSBarry Smith 855*d382aafbSBarry Smith Level: developer 856*d382aafbSBarry Smith 857*d382aafbSBarry Smith Notes: Memory of first chunk is always allocated at least double aligned 858*d382aafbSBarry Smith 859*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4(), PetscFree5(), PetscFree6(), PetscFree7() 860*d382aafbSBarry Smith 861*d382aafbSBarry Smith Concepts: memory allocation 862*d382aafbSBarry Smith 863*d382aafbSBarry Smith M*/ 864*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 865*d382aafbSBarry Smith #define PetscMalloc7(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6,m7,t7,r7) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4) || PetscMalloc((m5)*sizeof(t5),r5) || PetscMalloc((m6)*sizeof(t6),r6) || PetscMalloc((m7)*sizeof(t7),r7)) 866*d382aafbSBarry Smith #else 867*d382aafbSBarry Smith #define PetscMalloc7(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6,m7,t7,r7) \ 868*d382aafbSBarry Smith (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+(m5)*sizeof(t5)+(m6)*sizeof(t6)+(m7)*sizeof(t7)+6*(PETSC_MEMALIGN-1),r1) \ 869*d382aafbSBarry Smith || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),*(r5) = (t5*)PetscAddrAlign(*(r4)+m4),*(r6) = (t6*)PetscAddrAlign(*(r5)+m5),*(r7) = (t7*)PetscAddrAlign(*(r6)+m6),0)) 870*d382aafbSBarry Smith #endif 871*d382aafbSBarry Smith 872*d382aafbSBarry Smith /*MC 873*d382aafbSBarry Smith PetscNew - Allocates memory of a particular type, zeros the memory! 874*d382aafbSBarry Smith 875*d382aafbSBarry Smith Input Parameter: 876*d382aafbSBarry Smith . type - structure name of space to be allocated. Memory of size sizeof(type) is allocated 877*d382aafbSBarry Smith 878*d382aafbSBarry Smith Output Parameter: 879*d382aafbSBarry Smith . result - memory allocated 880*d382aafbSBarry Smith 881*d382aafbSBarry Smith Synopsis: 882*d382aafbSBarry Smith PetscErrorCode PetscNew(struct type,((type *))result) 883*d382aafbSBarry Smith 884*d382aafbSBarry Smith Level: beginner 885*d382aafbSBarry Smith 886*d382aafbSBarry Smith .seealso: PetscFree(), PetscMalloc() 887*d382aafbSBarry Smith 888*d382aafbSBarry Smith Concepts: memory allocation 889*d382aafbSBarry Smith 890*d382aafbSBarry Smith M*/ 891*d382aafbSBarry Smith #define PetscNew(A,b) (PetscMalloc(sizeof(A),(b)) || PetscMemzero(*(b),sizeof(A))) 892*d382aafbSBarry Smith #define PetscNewLog(o,A,b) (PetscNew(A,b) || ((o) ? PetscLogObjectMemory(o,sizeof(A)) : 0)) 893*d382aafbSBarry Smith 894*d382aafbSBarry Smith /*MC 895*d382aafbSBarry Smith PetscFree - Frees memory 896*d382aafbSBarry Smith 897*d382aafbSBarry Smith Input Parameter: 898*d382aafbSBarry Smith . memory - memory to free (the pointer is ALWAYS set to 0 upon sucess) 899*d382aafbSBarry Smith 900*d382aafbSBarry Smith Synopsis: 901*d382aafbSBarry Smith PetscErrorCode PetscFree(void *memory) 902*d382aafbSBarry Smith 903*d382aafbSBarry Smith Level: beginner 904*d382aafbSBarry Smith 905*d382aafbSBarry Smith Notes: Memory must have been obtained with PetscNew() or PetscMalloc() 906*d382aafbSBarry Smith 907*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscFreeVoid() 908*d382aafbSBarry Smith 909*d382aafbSBarry Smith Concepts: memory allocation 910*d382aafbSBarry Smith 911*d382aafbSBarry Smith M*/ 912*d382aafbSBarry Smith #define PetscFree(a) ((a) ? ((*PetscTrFree)((void*)(a),__LINE__,__FUNCT__,__FILE__,__SDIR__) || ((a = 0),0)) : 0) 913*d382aafbSBarry Smith 914*d382aafbSBarry Smith /*MC 915*d382aafbSBarry Smith PetscFreeVoid - Frees memory 916*d382aafbSBarry Smith 917*d382aafbSBarry Smith Input Parameter: 918*d382aafbSBarry Smith . memory - memory to free 919*d382aafbSBarry Smith 920*d382aafbSBarry Smith Synopsis: 921*d382aafbSBarry Smith void PetscFreeVoid(void *memory) 922*d382aafbSBarry Smith 923*d382aafbSBarry Smith Level: beginner 924*d382aafbSBarry Smith 925*d382aafbSBarry Smith Notes: This is different from PetscFree() in that no error code is returned 926*d382aafbSBarry Smith 927*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc() 928*d382aafbSBarry Smith 929*d382aafbSBarry Smith Concepts: memory allocation 930*d382aafbSBarry Smith 931*d382aafbSBarry Smith M*/ 932*d382aafbSBarry Smith #define PetscFreeVoid(a) ((*PetscTrFree)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__),(a) = 0) 933*d382aafbSBarry Smith 934*d382aafbSBarry Smith 935*d382aafbSBarry Smith /*MC 936*d382aafbSBarry Smith PetscFree2 - Frees 2 chunks of memory obtained with PetscMalloc2() 937*d382aafbSBarry Smith 938*d382aafbSBarry Smith Input Parameter: 939*d382aafbSBarry Smith + memory1 - memory to free 940*d382aafbSBarry Smith - memory2 - 2nd memory to free 941*d382aafbSBarry Smith 942*d382aafbSBarry Smith 943*d382aafbSBarry Smith Synopsis: 944*d382aafbSBarry Smith PetscErrorCode PetscFree2(void *memory1,void *memory2) 945*d382aafbSBarry Smith 946*d382aafbSBarry Smith Level: developer 947*d382aafbSBarry Smith 948*d382aafbSBarry Smith Notes: Memory must have been obtained with PetscMalloc2() 949*d382aafbSBarry Smith 950*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree() 951*d382aafbSBarry Smith 952*d382aafbSBarry Smith Concepts: memory allocation 953*d382aafbSBarry Smith 954*d382aafbSBarry Smith M*/ 955*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 956*d382aafbSBarry Smith #define PetscFree2(m1,m2) (PetscFree(m2) || PetscFree(m1)) 957*d382aafbSBarry Smith #else 958*d382aafbSBarry Smith #define PetscFree2(m1,m2) (PetscFree(m1)) 959*d382aafbSBarry Smith #endif 960*d382aafbSBarry Smith 961*d382aafbSBarry Smith /*MC 962*d382aafbSBarry Smith PetscFree3 - Frees 3 chunks of memory obtained with PetscMalloc3() 963*d382aafbSBarry Smith 964*d382aafbSBarry Smith Input Parameter: 965*d382aafbSBarry Smith + memory1 - memory to free 966*d382aafbSBarry Smith . memory2 - 2nd memory to free 967*d382aafbSBarry Smith - memory3 - 3rd memory to free 968*d382aafbSBarry Smith 969*d382aafbSBarry Smith 970*d382aafbSBarry Smith Synopsis: 971*d382aafbSBarry Smith PetscErrorCode PetscFree3(void *memory1,void *memory2,void *memory3) 972*d382aafbSBarry Smith 973*d382aafbSBarry Smith Level: developer 974*d382aafbSBarry Smith 975*d382aafbSBarry Smith Notes: Memory must have been obtained with PetscMalloc3() 976*d382aafbSBarry Smith 977*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3() 978*d382aafbSBarry Smith 979*d382aafbSBarry Smith Concepts: memory allocation 980*d382aafbSBarry Smith 981*d382aafbSBarry Smith M*/ 982*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 983*d382aafbSBarry Smith #define PetscFree3(m1,m2,m3) (PetscFree(m3) || PetscFree(m2) || PetscFree(m1)) 984*d382aafbSBarry Smith #else 985*d382aafbSBarry Smith #define PetscFree3(m1,m2,m3) (PetscFree(m1)) 986*d382aafbSBarry Smith #endif 987*d382aafbSBarry Smith 988*d382aafbSBarry Smith /*MC 989*d382aafbSBarry Smith PetscFree4 - Frees 4 chunks of memory obtained with PetscMalloc4() 990*d382aafbSBarry Smith 991*d382aafbSBarry Smith Input Parameter: 992*d382aafbSBarry Smith + m1 - memory to free 993*d382aafbSBarry Smith . m2 - 2nd memory to free 994*d382aafbSBarry Smith . m3 - 3rd memory to free 995*d382aafbSBarry Smith - m4 - 4th memory to free 996*d382aafbSBarry Smith 997*d382aafbSBarry Smith 998*d382aafbSBarry Smith Synopsis: 999*d382aafbSBarry Smith PetscErrorCode PetscFree4(void *m1,void *m2,void *m3,void *m4) 1000*d382aafbSBarry Smith 1001*d382aafbSBarry Smith Level: developer 1002*d382aafbSBarry Smith 1003*d382aafbSBarry Smith Notes: Memory must have been obtained with PetscMalloc4() 1004*d382aafbSBarry Smith 1005*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4() 1006*d382aafbSBarry Smith 1007*d382aafbSBarry Smith Concepts: memory allocation 1008*d382aafbSBarry Smith 1009*d382aafbSBarry Smith M*/ 1010*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1011*d382aafbSBarry Smith #define PetscFree4(m1,m2,m3,m4) (PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1)) 1012*d382aafbSBarry Smith #else 1013*d382aafbSBarry Smith #define PetscFree4(m1,m2,m3,m4) (PetscFree(m1)) 1014*d382aafbSBarry Smith #endif 1015*d382aafbSBarry Smith 1016*d382aafbSBarry Smith /*MC 1017*d382aafbSBarry Smith PetscFree5 - Frees 5 chunks of memory obtained with PetscMalloc5() 1018*d382aafbSBarry Smith 1019*d382aafbSBarry Smith Input Parameter: 1020*d382aafbSBarry Smith + m1 - memory to free 1021*d382aafbSBarry Smith . m2 - 2nd memory to free 1022*d382aafbSBarry Smith . m3 - 3rd memory to free 1023*d382aafbSBarry Smith . m4 - 4th memory to free 1024*d382aafbSBarry Smith - m5 - 5th memory to free 1025*d382aafbSBarry Smith 1026*d382aafbSBarry Smith 1027*d382aafbSBarry Smith Synopsis: 1028*d382aafbSBarry Smith PetscErrorCode PetscFree5(void *m1,void *m2,void *m3,void *m4,void *m5) 1029*d382aafbSBarry Smith 1030*d382aafbSBarry Smith Level: developer 1031*d382aafbSBarry Smith 1032*d382aafbSBarry Smith Notes: Memory must have been obtained with PetscMalloc5() 1033*d382aafbSBarry Smith 1034*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5() 1035*d382aafbSBarry Smith 1036*d382aafbSBarry Smith Concepts: memory allocation 1037*d382aafbSBarry Smith 1038*d382aafbSBarry Smith M*/ 1039*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1040*d382aafbSBarry Smith #define PetscFree5(m1,m2,m3,m4,m5) (PetscFree(m5) || PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1)) 1041*d382aafbSBarry Smith #else 1042*d382aafbSBarry Smith #define PetscFree5(m1,m2,m3,m4,m5) (PetscFree(m1)) 1043*d382aafbSBarry Smith #endif 1044*d382aafbSBarry Smith 1045*d382aafbSBarry Smith 1046*d382aafbSBarry Smith /*MC 1047*d382aafbSBarry Smith PetscFree6 - Frees 6 chunks of memory obtained with PetscMalloc6() 1048*d382aafbSBarry Smith 1049*d382aafbSBarry Smith Input Parameter: 1050*d382aafbSBarry Smith + m1 - memory to free 1051*d382aafbSBarry Smith . m2 - 2nd memory to free 1052*d382aafbSBarry Smith . m3 - 3rd memory to free 1053*d382aafbSBarry Smith . m4 - 4th memory to free 1054*d382aafbSBarry Smith . m5 - 5th memory to free 1055*d382aafbSBarry Smith - m6 - 6th memory to free 1056*d382aafbSBarry Smith 1057*d382aafbSBarry Smith 1058*d382aafbSBarry Smith Synopsis: 1059*d382aafbSBarry Smith PetscErrorCode PetscFree6(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6) 1060*d382aafbSBarry Smith 1061*d382aafbSBarry Smith Level: developer 1062*d382aafbSBarry Smith 1063*d382aafbSBarry Smith Notes: Memory must have been obtained with PetscMalloc6() 1064*d382aafbSBarry Smith 1065*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6() 1066*d382aafbSBarry Smith 1067*d382aafbSBarry Smith Concepts: memory allocation 1068*d382aafbSBarry Smith 1069*d382aafbSBarry Smith M*/ 1070*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1071*d382aafbSBarry Smith #define PetscFree6(m1,m2,m3,m4,m5,m6) (PetscFree(m6) || PetscFree(m5) || PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1)) 1072*d382aafbSBarry Smith #else 1073*d382aafbSBarry Smith #define PetscFree6(m1,m2,m3,m4,m5,m6) (PetscFree(m1)) 1074*d382aafbSBarry Smith #endif 1075*d382aafbSBarry Smith 1076*d382aafbSBarry Smith /*MC 1077*d382aafbSBarry Smith PetscFree7 - Frees 7 chunks of memory obtained with PetscMalloc7() 1078*d382aafbSBarry Smith 1079*d382aafbSBarry Smith Input Parameter: 1080*d382aafbSBarry Smith + m1 - memory to free 1081*d382aafbSBarry Smith . m2 - 2nd memory to free 1082*d382aafbSBarry Smith . m3 - 3rd memory to free 1083*d382aafbSBarry Smith . m4 - 4th memory to free 1084*d382aafbSBarry Smith . m5 - 5th memory to free 1085*d382aafbSBarry Smith . m6 - 6th memory to free 1086*d382aafbSBarry Smith - m7 - 7th memory to free 1087*d382aafbSBarry Smith 1088*d382aafbSBarry Smith 1089*d382aafbSBarry Smith Synopsis: 1090*d382aafbSBarry Smith PetscErrorCode PetscFree7(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6,void *m7) 1091*d382aafbSBarry Smith 1092*d382aafbSBarry Smith Level: developer 1093*d382aafbSBarry Smith 1094*d382aafbSBarry Smith Notes: Memory must have been obtained with PetscMalloc7() 1095*d382aafbSBarry Smith 1096*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6(), 1097*d382aafbSBarry Smith PetscMalloc7() 1098*d382aafbSBarry Smith 1099*d382aafbSBarry Smith Concepts: memory allocation 1100*d382aafbSBarry Smith 1101*d382aafbSBarry Smith M*/ 1102*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1103*d382aafbSBarry Smith #define PetscFree7(m1,m2,m3,m4,m5,m6,m7) (PetscFree(m7) || PetscFree(m6) || PetscFree(m5) || PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1)) 1104*d382aafbSBarry Smith #else 1105*d382aafbSBarry Smith #define PetscFree7(m1,m2,m3,m4,m5,m6,m7) (PetscFree(m1)) 1106*d382aafbSBarry Smith #endif 1107*d382aafbSBarry Smith 1108*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*PetscTrMalloc)(size_t,int,const char[],const char[],const char[],void**); 1109*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*PetscTrFree)(void*,int,const char[],const char[],const char[]); 1110*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocSet(PetscErrorCode (*)(size_t,int,const char[],const char[],const char[],void**),PetscErrorCode (*)(void*,int,const char[],const char[],const char[])); 1111*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocClear(void); 1112*d382aafbSBarry Smith 1113*d382aafbSBarry Smith /* 1114*d382aafbSBarry Smith Routines for tracing memory corruption/bleeding with default PETSc 1115*d382aafbSBarry Smith memory allocation 1116*d382aafbSBarry Smith */ 1117*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocDump(FILE *); 1118*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocDumpLog(FILE *); 1119*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocGetCurrentUsage(PetscLogDouble *); 1120*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocGetMaximumUsage(PetscLogDouble *); 1121*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocDebug(PetscTruth); 1122*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocValidate(int,const char[],const char[],const char[]); 1123*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMallocSetDumpLog(void); 1124*d382aafbSBarry Smith 1125*d382aafbSBarry Smith 1126*d382aafbSBarry Smith /* 1127*d382aafbSBarry Smith Variable type where we stash PETSc object pointers in Fortran. 1128*d382aafbSBarry Smith On most machines size(pointer) == sizeof(long) - except windows 1129*d382aafbSBarry Smith where its sizeof(long long) 1130*d382aafbSBarry Smith */ 1131*d382aafbSBarry Smith 1132*d382aafbSBarry Smith #if (PETSC_SIZEOF_VOID_P) == (PETSC_SIZEOF_LONG) 1133*d382aafbSBarry Smith #define PetscFortranAddr long 1134*d382aafbSBarry Smith #elif (PETSC_SIZEOF_VOID_P) == (PETSC_SIZEOF_LONG_LONG) 1135*d382aafbSBarry Smith #define PetscFortranAddr long long 1136*d382aafbSBarry Smith #else 1137*d382aafbSBarry Smith #error "Unknown size for PetscFortranAddr! Send us a bugreport at petsc-maint@mcs.anl.gov" 1138*d382aafbSBarry Smith #endif 1139*d382aafbSBarry Smith 1140*d382aafbSBarry Smith /*E 1141*d382aafbSBarry Smith PetscDataType - Used for handling different basic data types. 1142*d382aafbSBarry Smith 1143*d382aafbSBarry Smith Level: beginner 1144*d382aafbSBarry Smith 1145*d382aafbSBarry Smith Developer comment: It would be nice if we could always just use MPI Datatypes, why can we not? 1146*d382aafbSBarry Smith 1147*d382aafbSBarry Smith .seealso: PetscBinaryRead(), PetscBinaryWrite(), PetscDataTypeToMPIDataType(), 1148*d382aafbSBarry Smith PetscDataTypeGetSize() 1149*d382aafbSBarry Smith 1150*d382aafbSBarry Smith E*/ 1151*d382aafbSBarry Smith typedef enum {PETSC_INT = 0,PETSC_DOUBLE = 1,PETSC_COMPLEX = 2, PETSC_LONG = 3 ,PETSC_SHORT = 4,PETSC_FLOAT = 5, 1152*d382aafbSBarry Smith PETSC_CHAR = 6,PETSC_LOGICAL = 7,PETSC_ENUM = 8,PETSC_TRUTH=9, PETSC_LONG_DOUBLE = 10, PETSC_QD_DD = 11} PetscDataType; 1153*d382aafbSBarry Smith extern const char *PetscDataTypes[]; 1154*d382aafbSBarry Smith 1155*d382aafbSBarry Smith #if defined(PETSC_USE_COMPLEX) 1156*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_COMPLEX 1157*d382aafbSBarry Smith #else 1158*d382aafbSBarry Smith #if defined(PETSC_USE_SCALAR_SINGLE) 1159*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_FLOAT 1160*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_LONG_DOUBLE) 1161*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_LONG_DOUBLE 1162*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_INT) 1163*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_INT 1164*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_QD_DD) 1165*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_QD_DD 1166*d382aafbSBarry Smith #else 1167*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_DOUBLE 1168*d382aafbSBarry Smith #endif 1169*d382aafbSBarry Smith #endif 1170*d382aafbSBarry Smith #if defined(PETSC_USE_SCALAR_SINGLE) 1171*d382aafbSBarry Smith #define PETSC_REAL PETSC_FLOAT 1172*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_LONG_DOUBLE) 1173*d382aafbSBarry Smith #define PETSC_REAL PETSC_LONG_DOUBLE 1174*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_INT) 1175*d382aafbSBarry Smith #define PETSC_REAL PETSC_INT 1176*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_QD_DD) 1177*d382aafbSBarry Smith #define PETSC_REAL PETSC_QD_DD 1178*d382aafbSBarry Smith #else 1179*d382aafbSBarry Smith #define PETSC_REAL PETSC_DOUBLE 1180*d382aafbSBarry Smith #endif 1181*d382aafbSBarry Smith #define PETSC_FORTRANADDR PETSC_LONG 1182*d382aafbSBarry Smith 1183*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*); 1184*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMPIDataTypeToPetscDataType(MPI_Datatype,PetscDataType*); 1185*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDataTypeGetSize(PetscDataType,size_t*); 1186*d382aafbSBarry Smith 1187*d382aafbSBarry Smith /* 1188*d382aafbSBarry Smith Basic memory and string operations. These are usually simple wrappers 1189*d382aafbSBarry Smith around the basic Unix system calls, but a few of them have additional 1190*d382aafbSBarry Smith functionality and/or error checking. 1191*d382aafbSBarry Smith */ 1192*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBitMemcpy(void*,PetscInt,const void*,PetscInt,PetscInt,PetscDataType); 1193*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemmove(void*,void *,size_t); 1194*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemcmp(const void*,const void*,size_t,PetscTruth *); 1195*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrlen(const char[],size_t*); 1196*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrcmp(const char[],const char[],PetscTruth *); 1197*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrgrt(const char[],const char[],PetscTruth *); 1198*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrcasecmp(const char[],const char[],PetscTruth*); 1199*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrncmp(const char[],const char[],size_t,PetscTruth*); 1200*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrcpy(char[],const char[]); 1201*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrcat(char[],const char[]); 1202*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrncat(char[],const char[],size_t); 1203*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrncpy(char[],const char[],size_t); 1204*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrchr(const char[],char,char *[]); 1205*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrtolower(char[]); 1206*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrrchr(const char[],char,char *[]); 1207*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrstr(const char[],const char[],char *[]); 1208*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrrstr(const char[],const char[],char *[]); 1209*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrallocpy(const char[],char *[]); 1210*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStrreplace(MPI_Comm,const char[],char[],size_t); 1211*d382aafbSBarry Smith #define PetscStrfree(a) ((a) ? PetscFree(a) : 0) 1212*d382aafbSBarry Smith 1213*d382aafbSBarry Smith 1214*d382aafbSBarry Smith /*S 1215*d382aafbSBarry Smith PetscToken - 'Token' used for managing tokenizing strings 1216*d382aafbSBarry Smith 1217*d382aafbSBarry Smith Level: intermediate 1218*d382aafbSBarry Smith 1219*d382aafbSBarry Smith .seealso: PetscTokenCreate(), PetscTokenFind(), PetscTokenDestroy() 1220*d382aafbSBarry Smith S*/ 1221*d382aafbSBarry Smith typedef struct _p_PetscToken* PetscToken; 1222*d382aafbSBarry Smith 1223*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTokenCreate(const char[],const char,PetscToken*); 1224*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTokenFind(PetscToken,char *[]); 1225*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTokenDestroy(PetscToken); 1226*d382aafbSBarry Smith 1227*d382aafbSBarry Smith /* 1228*d382aafbSBarry Smith These are MPI operations for MPI_Allreduce() etc 1229*d382aafbSBarry Smith */ 1230*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT MPI_Op PetscMaxSum_Op; 1231*d382aafbSBarry Smith #if defined(PETSC_USE_COMPLEX) && !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 1232*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT MPI_Op MPIU_SUM; 1233*d382aafbSBarry Smith #else 1234*d382aafbSBarry Smith #define MPIU_SUM MPI_SUM 1235*d382aafbSBarry Smith #endif 1236*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm,const PetscInt[],PetscInt*,PetscInt*); 1237*d382aafbSBarry Smith 1238*d382aafbSBarry Smith /*S 1239*d382aafbSBarry Smith PetscObject - any PETSc object, PetscViewer, Mat, Vec, KSP etc 1240*d382aafbSBarry Smith 1241*d382aafbSBarry Smith Level: beginner 1242*d382aafbSBarry Smith 1243*d382aafbSBarry Smith Note: This is the base class from which all objects appear. 1244*d382aafbSBarry Smith 1245*d382aafbSBarry Smith .seealso: PetscObjectDestroy(), PetscObjectView(), PetscObjectGetName(), PetscObjectSetName() 1246*d382aafbSBarry Smith S*/ 1247*d382aafbSBarry Smith typedef struct _p_PetscObject* PetscObject; 1248*d382aafbSBarry Smith 1249*d382aafbSBarry Smith /*S 1250*d382aafbSBarry Smith PetscFList - Linked list of functions, possibly stored in dynamic libraries, accessed 1251*d382aafbSBarry Smith by string name 1252*d382aafbSBarry Smith 1253*d382aafbSBarry Smith Level: advanced 1254*d382aafbSBarry Smith 1255*d382aafbSBarry Smith .seealso: PetscFListAdd(), PetscFListDestroy() 1256*d382aafbSBarry Smith S*/ 1257*d382aafbSBarry Smith typedef struct _n_PetscFList *PetscFList; 1258*d382aafbSBarry Smith 1259*d382aafbSBarry Smith /*E 1260*d382aafbSBarry Smith PetscFileMode - Access mode for a file. 1261*d382aafbSBarry Smith 1262*d382aafbSBarry Smith Level: beginner 1263*d382aafbSBarry Smith 1264*d382aafbSBarry Smith FILE_MODE_READ - open a file at its beginning for reading 1265*d382aafbSBarry Smith 1266*d382aafbSBarry Smith FILE_MODE_WRITE - open a file at its beginning for writing (will create if the file does not exist) 1267*d382aafbSBarry Smith 1268*d382aafbSBarry Smith FILE_MODE_APPEND - open a file at end for writing 1269*d382aafbSBarry Smith 1270*d382aafbSBarry Smith FILE_MODE_UPDATE - open a file for updating, meaning for reading and writing 1271*d382aafbSBarry Smith 1272*d382aafbSBarry Smith FILE_MODE_APPEND_UPDATE - open a file for updating, meaning for reading and writing, at the end 1273*d382aafbSBarry Smith 1274*d382aafbSBarry Smith .seealso: PetscViewerFileSetMode() 1275*d382aafbSBarry Smith E*/ 1276*d382aafbSBarry Smith typedef enum {FILE_MODE_READ, FILE_MODE_WRITE, FILE_MODE_APPEND, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE} PetscFileMode; 1277*d382aafbSBarry Smith 1278*d382aafbSBarry Smith #include "petscviewer.h" 1279*d382aafbSBarry Smith #include "petscoptions.h" 1280*d382aafbSBarry Smith 1281*d382aafbSBarry Smith #define PETSC_SMALLEST_COOKIE 1211211 1282*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscCookie PETSC_LARGEST_COOKIE; 1283*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscCookie PETSC_OBJECT_COOKIE; 1284*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCookieRegister(const char[],PetscCookie *); 1285*d382aafbSBarry Smith 1286*d382aafbSBarry Smith /* 1287*d382aafbSBarry Smith Routines that get memory usage information from the OS 1288*d382aafbSBarry Smith */ 1289*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemoryGetCurrentUsage(PetscLogDouble *); 1290*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemoryGetMaximumUsage(PetscLogDouble *); 1291*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemorySetGetMaximumUsage(void); 1292*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemoryShowUsage(PetscViewer,const char[]); 1293*d382aafbSBarry Smith 1294*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoAllow(PetscTruth,const char []); 1295*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetTime(PetscLogDouble*); 1296*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetCPUTime(PetscLogDouble*); 1297*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSleep(PetscReal); 1298*d382aafbSBarry Smith 1299*d382aafbSBarry Smith /* 1300*d382aafbSBarry Smith Initialization of PETSc 1301*d382aafbSBarry Smith */ 1302*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int*,char***,const char[],const char[]); 1303*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscInitialize,(int *argc,char ***args),(argc,args,PETSC_NULL,PETSC_NULL)) 1304*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void); 1305*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *); 1306*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *); 1307*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void); 1308*d382aafbSBarry Smith EXTERN PetscErrorCode PetscInitializeFortran(void); 1309*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int*,char ***); 1310*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***); 1311*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **); 1312*d382aafbSBarry Smith 1313*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscEnd(void); 1314*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitializePackage(const char[]); 1315*d382aafbSBarry Smith 1316*d382aafbSBarry Smith extern MPI_Comm PETSC_COMM_LOCAL_WORLD; 1317*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPMerge(PetscMPIInt,PetscErrorCode (*)(void*),void*); 1318*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPSpawn(PetscMPIInt); 1319*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPFinalize(void); 1320*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPRun(MPI_Comm,PetscErrorCode (*)(MPI_Comm,void *),void*); 1321*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPRunCtx(MPI_Comm,PetscErrorCode (*)(MPI_Comm,void*,void *),void*); 1322*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPFree(MPI_Comm,void*); 1323*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPMalloc(MPI_Comm,size_t,void**); 1324*d382aafbSBarry Smith 1325*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPythonInitialize(const char[],const char[]); 1326*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPythonFinalize(void); 1327*d382aafbSBarry Smith 1328*d382aafbSBarry Smith /* 1329*d382aafbSBarry Smith These are so that in extern C code we can caste function pointers to non-extern C 1330*d382aafbSBarry Smith function pointers. Since the regular C++ code expects its function pointers to be 1331*d382aafbSBarry Smith C++. 1332*d382aafbSBarry Smith */ 1333*d382aafbSBarry Smith typedef void (**PetscVoidStarFunction)(void); 1334*d382aafbSBarry Smith typedef void (*PetscVoidFunction)(void); 1335*d382aafbSBarry Smith typedef PetscErrorCode (*PetscErrorCodeFunction)(void); 1336*d382aafbSBarry Smith 1337*d382aafbSBarry Smith /* 1338*d382aafbSBarry Smith PetscTryMethod - Queries an object for a method, if it exists then calls it. 1339*d382aafbSBarry Smith These are intended to be used only inside PETSc functions. 1340*d382aafbSBarry Smith */ 1341*d382aafbSBarry Smith #define PetscTryMethod(obj,A,B,C) \ 1342*d382aafbSBarry Smith 0;{ PetscErrorCode (*f)B, __ierr; \ 1343*d382aafbSBarry Smith __ierr = PetscObjectQueryFunction((PetscObject)obj,A,(PetscVoidStarFunction)&f);CHKERRQ(__ierr); \ 1344*d382aafbSBarry Smith if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\ 1345*d382aafbSBarry Smith } 1346*d382aafbSBarry Smith #define PetscUseMethod(obj,A,B,C) \ 1347*d382aafbSBarry Smith 0;{ PetscErrorCode (*f)B, __ierr; \ 1348*d382aafbSBarry Smith __ierr = PetscObjectQueryFunction((PetscObject)obj,A,(PetscVoidStarFunction)&f);CHKERRQ(__ierr); \ 1349*d382aafbSBarry Smith if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\ 1350*d382aafbSBarry Smith else {SETERRQ1(PETSC_ERR_SUP,"Cannot locate function %s in object",A);} \ 1351*d382aafbSBarry Smith } 1352*d382aafbSBarry Smith /* 1353*d382aafbSBarry Smith Functions that can act on any PETSc object. 1354*d382aafbSBarry Smith */ 1355*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectCreate(MPI_Comm,PetscObject*); 1356*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectCreateGeneric(MPI_Comm, PetscCookie, const char [], PetscObject *); 1357*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject); 1358*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectExists(PetscObject,PetscTruth*); 1359*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetComm(PetscObject,MPI_Comm *); 1360*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetCookie(PetscObject,PetscCookie *); 1361*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetType(PetscObject,const char []); 1362*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetType(PetscObject,const char *[]); 1363*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetName(PetscObject,const char[]); 1364*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetName(PetscObject,const char*[]); 1365*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetTabLevel(PetscObject,PetscInt); 1366*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetTabLevel(PetscObject,PetscInt*); 1367*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectIncrementTabLevel(PetscObject,PetscObject,PetscInt); 1368*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectReference(PetscObject); 1369*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetReference(PetscObject,PetscInt*); 1370*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectDereference(PetscObject); 1371*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetNewTag(PetscObject,PetscMPIInt *); 1372*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject,PetscViewer); 1373*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectCompose(PetscObject,const char[],PetscObject); 1374*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectQuery(PetscObject,const char[],PetscObject *); 1375*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectComposeFunction(PetscObject,const char[],const char[],void (*)(void)); 1376*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetFromOptions(PetscObject); 1377*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetUp(PetscObject); 1378*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCommGetNewTag(MPI_Comm,PetscMPIInt *); 1379*d382aafbSBarry Smith 1380*d382aafbSBarry Smith /*MC 1381*d382aafbSBarry Smith PetscObjectComposeFunctionDynamic - Associates a function with a given PETSc object. 1382*d382aafbSBarry Smith 1383*d382aafbSBarry Smith Collective on PetscObject 1384*d382aafbSBarry Smith 1385*d382aafbSBarry Smith Input Parameters: 1386*d382aafbSBarry Smith + obj - the PETSc object; this must be cast with a (PetscObject), for example, 1387*d382aafbSBarry Smith PetscObjectCompose((PetscObject)mat,...); 1388*d382aafbSBarry Smith . name - name associated with the child function 1389*d382aafbSBarry Smith . fname - name of the function 1390*d382aafbSBarry Smith - ptr - function pointer (or PETSC_NULL if using dynamic libraries) 1391*d382aafbSBarry Smith 1392*d382aafbSBarry Smith Level: advanced 1393*d382aafbSBarry Smith 1394*d382aafbSBarry Smith Synopsis: 1395*d382aafbSBarry Smith PetscErrorCode PetscObjectComposeFunctionDynamic(PetscObject obj,const char name[],const char fname[],void *ptr) 1396*d382aafbSBarry Smith 1397*d382aafbSBarry Smith Notes: 1398*d382aafbSBarry Smith To remove a registered routine, pass in a PETSC_NULL rname and fnc(). 1399*d382aafbSBarry Smith 1400*d382aafbSBarry Smith PetscObjectComposeFunctionDynamic() can be used with any PETSc object (such as 1401*d382aafbSBarry Smith Mat, Vec, KSP, SNES, etc.) or any user-provided object. 1402*d382aafbSBarry Smith 1403*d382aafbSBarry Smith The composed function must be wrapped in a EXTERN_C_BEGIN/END for this to 1404*d382aafbSBarry Smith work in C++/complex with dynamic link libraries (config/configure.py options --with-shared --with-dynamic) 1405*d382aafbSBarry Smith enabled. 1406*d382aafbSBarry Smith 1407*d382aafbSBarry Smith Concepts: objects^composing functions 1408*d382aafbSBarry Smith Concepts: composing functions 1409*d382aafbSBarry Smith Concepts: functions^querying 1410*d382aafbSBarry Smith Concepts: objects^querying 1411*d382aafbSBarry Smith Concepts: querying objects 1412*d382aafbSBarry Smith 1413*d382aafbSBarry Smith .seealso: PetscObjectQueryFunction() 1414*d382aafbSBarry Smith M*/ 1415*d382aafbSBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1416*d382aafbSBarry Smith #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,0) 1417*d382aafbSBarry Smith #else 1418*d382aafbSBarry Smith #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,(PetscVoidFunction)(d)) 1419*d382aafbSBarry Smith #endif 1420*d382aafbSBarry Smith 1421*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectQueryFunction(PetscObject,const char[],void (**)(void)); 1422*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetOptionsPrefix(PetscObject,const char[]); 1423*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectAppendOptionsPrefix(PetscObject,const char[]); 1424*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectPrependOptionsPrefix(PetscObject,const char[]); 1425*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetOptionsPrefix(PetscObject,const char*[]); 1426*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectPublish(PetscObject); 1427*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectChangeTypeName(PetscObject,const char[]); 1428*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject); 1429*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void); 1430*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectName(PetscObject); 1431*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject,const char[],PetscTruth*); 1432*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRegisterFinalize(PetscErrorCode (*)(void)); 1433*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRegisterFinalizeAll(void); 1434*d382aafbSBarry Smith 1435*d382aafbSBarry Smith /* 1436*d382aafbSBarry Smith Defines PETSc error handling. 1437*d382aafbSBarry Smith */ 1438*d382aafbSBarry Smith #include "petscerror.h" 1439*d382aafbSBarry Smith 1440*d382aafbSBarry Smith /*S 1441*d382aafbSBarry Smith PetscOList - Linked list of PETSc objects, accessable by string name 1442*d382aafbSBarry Smith 1443*d382aafbSBarry Smith Level: advanced 1444*d382aafbSBarry Smith 1445*d382aafbSBarry Smith .seealso: PetscOListAdd(), PetscOListDestroy(), PetscOListFind() 1446*d382aafbSBarry Smith S*/ 1447*d382aafbSBarry Smith typedef struct _n_PetscOList *PetscOList; 1448*d382aafbSBarry Smith 1449*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListDestroy(PetscOList); 1450*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListFind(PetscOList,const char[],PetscObject*); 1451*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListReverseFind(PetscOList,PetscObject,char**); 1452*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListAdd(PetscOList *,const char[],PetscObject); 1453*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListDuplicate(PetscOList,PetscOList *); 1454*d382aafbSBarry Smith 1455*d382aafbSBarry Smith /* 1456*d382aafbSBarry Smith Dynamic library lists. Lists of names of routines in dynamic 1457*d382aafbSBarry Smith link libraries that will be loaded as needed. 1458*d382aafbSBarry Smith */ 1459*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListAdd(PetscFList*,const char[],const char[],void (*)(void)); 1460*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListDestroy(PetscFList*); 1461*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListFind(PetscFList,MPI_Comm,const char[],void (**)(void)); 1462*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFList,const char[]); 1463*d382aafbSBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 1464*d382aafbSBarry Smith #define PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,0) 1465*d382aafbSBarry Smith #else 1466*d382aafbSBarry Smith #define PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,(void (*)(void))c) 1467*d382aafbSBarry Smith #endif 1468*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListDuplicate(PetscFList,PetscFList *); 1469*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListView(PetscFList,PetscViewer); 1470*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListConcat(const char [],const char [],char []); 1471*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListGet(PetscFList,char ***,int*); 1472*d382aafbSBarry Smith 1473*d382aafbSBarry Smith /*S 1474*d382aafbSBarry Smith PetscDLLibrary - Linked list of dynamics libraries to search for functions 1475*d382aafbSBarry Smith 1476*d382aafbSBarry Smith Level: advanced 1477*d382aafbSBarry Smith 1478*d382aafbSBarry Smith --with-shared --with-dynamic must be used with config/configure.py to use dynamic libraries 1479*d382aafbSBarry Smith 1480*d382aafbSBarry Smith .seealso: PetscDLLibraryOpen() 1481*d382aafbSBarry Smith S*/ 1482*d382aafbSBarry Smith typedef struct _n_PetscDLLibrary *PetscDLLibrary; 1483*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscDLLibrary DLLibrariesLoaded; 1484*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryAppend(MPI_Comm,PetscDLLibrary *,const char[]); 1485*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryPrepend(MPI_Comm,PetscDLLibrary *,const char[]); 1486*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibrarySym(MPI_Comm,PetscDLLibrary *,const char[],const char[],void **); 1487*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryPrintPath(PetscDLLibrary); 1488*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,size_t,PetscTruth *); 1489*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryOpen(MPI_Comm,const char[],PetscDLLibrary *); 1490*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryClose(PetscDLLibrary); 1491*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryCCAAppend(MPI_Comm,PetscDLLibrary *,const char[]); 1492*d382aafbSBarry Smith 1493*d382aafbSBarry Smith /* 1494*d382aafbSBarry Smith Useful utility routines 1495*d382aafbSBarry Smith */ 1496*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSplitOwnership(MPI_Comm,PetscInt*,PetscInt*); 1497*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSplitOwnershipBlock(MPI_Comm,PetscInt,PetscInt*,PetscInt*); 1498*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSequentialPhaseBegin(MPI_Comm,PetscMPIInt); 1499*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseBegin,(MPI_Comm comm),(comm,1)) 1500*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseBegin,(void),(PETSC_COMM_WORLD,1)) 1501*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSequentialPhaseEnd(MPI_Comm,PetscMPIInt); 1502*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseEnd,(MPI_Comm comm),(comm,1)) 1503*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseEnd,(void),(PETSC_COMM_WORLD,1)) 1504*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBarrier(PetscObject); 1505*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMPIDump(FILE*); 1506*d382aafbSBarry Smith 1507*d382aafbSBarry Smith #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE) 1508*d382aafbSBarry Smith /* 1509*d382aafbSBarry Smith Defines basic graphics available from PETSc. 1510*d382aafbSBarry Smith */ 1511*d382aafbSBarry Smith #include "petscdraw.h" 1512*d382aafbSBarry Smith 1513*d382aafbSBarry Smith /* 1514*d382aafbSBarry Smith Defines the base data structures for all PETSc objects 1515*d382aafbSBarry Smith */ 1516*d382aafbSBarry Smith #include "private/petscimpl.h" 1517*d382aafbSBarry Smith /* 1518*d382aafbSBarry Smith Defines PETSc profiling. 1519*d382aafbSBarry Smith */ 1520*d382aafbSBarry Smith #include "petsclog.h" 1521*d382aafbSBarry Smith 1522*d382aafbSBarry Smith /* 1523*d382aafbSBarry Smith For locking, unlocking and destroying AMS memories associated with 1524*d382aafbSBarry Smith PETSc objects. Not currently used. 1525*d382aafbSBarry Smith */ 1526*d382aafbSBarry Smith #define PetscPublishAll(v) 0 1527*d382aafbSBarry Smith #define PetscObjectTakeAccess(obj) 0 1528*d382aafbSBarry Smith #define PetscObjectGrantAccess(obj) 0 1529*d382aafbSBarry Smith #define PetscObjectDepublish(obj) 0 1530*d382aafbSBarry Smith 1531*d382aafbSBarry Smith /* 1532*d382aafbSBarry Smith Simple PETSc parallel IO for ASCII printing 1533*d382aafbSBarry Smith */ 1534*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFixFilename(const char[],char[]); 1535*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFOpen(MPI_Comm,const char[],const char[],FILE**); 1536*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFClose(MPI_Comm,FILE*); 1537*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4); 1538*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPrintf(MPI_Comm,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 1539*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSNPrintf(char*,size_t,const char [],...); 1540*d382aafbSBarry Smith 1541*d382aafbSBarry Smith /* These are used internally by PETSc ASCII IO routines*/ 1542*d382aafbSBarry Smith #include <stdarg.h> 1543*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscVSNPrintf(char*,size_t,const char[],int*,va_list); 1544*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT (*PetscVFPrintf)(FILE*,const char[],va_list); 1545*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscVFPrintfDefault(FILE*,const char[],va_list); 1546*d382aafbSBarry Smith 1547*d382aafbSBarry Smith /*MC 1548*d382aafbSBarry Smith PetscErrorPrintf - Prints error messages. 1549*d382aafbSBarry Smith 1550*d382aafbSBarry Smith Not Collective 1551*d382aafbSBarry Smith 1552*d382aafbSBarry Smith Synopsis: 1553*d382aafbSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char format[],...); 1554*d382aafbSBarry Smith 1555*d382aafbSBarry Smith Input Parameters: 1556*d382aafbSBarry Smith . format - the usual printf() format string 1557*d382aafbSBarry Smith 1558*d382aafbSBarry Smith Options Database Keys: 1559*d382aafbSBarry Smith + -error_output_stdout - cause error messages to be printed to stdout instead of the 1560*d382aafbSBarry Smith (default) stderr 1561*d382aafbSBarry Smith - -error_output_none to turn off all printing of error messages (does not change the way the 1562*d382aafbSBarry Smith error is handled.) 1563*d382aafbSBarry Smith 1564*d382aafbSBarry Smith Notes: Use 1565*d382aafbSBarry Smith $ PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the 1566*d382aafbSBarry Smith $ error is handled.) and 1567*d382aafbSBarry Smith $ PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on 1568*d382aafbSBarry Smith 1569*d382aafbSBarry Smith Use 1570*d382aafbSBarry Smith PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file. 1571*d382aafbSBarry Smith PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file. 1572*d382aafbSBarry Smith 1573*d382aafbSBarry Smith Use 1574*d382aafbSBarry Smith PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print 1575*d382aafbSBarry Smith 1576*d382aafbSBarry Smith Level: developer 1577*d382aafbSBarry Smith 1578*d382aafbSBarry Smith Fortran Note: 1579*d382aafbSBarry Smith This routine is not supported in Fortran. 1580*d382aafbSBarry Smith 1581*d382aafbSBarry Smith Concepts: error messages^printing 1582*d382aafbSBarry Smith Concepts: printing^error messages 1583*d382aafbSBarry Smith 1584*d382aafbSBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf(), PetscPrintf(), PetscErrorHandlerPush() 1585*d382aafbSBarry Smith M*/ 1586*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*PetscErrorPrintf)(const char[],...); 1587*d382aafbSBarry Smith 1588*d382aafbSBarry Smith /*MC 1589*d382aafbSBarry Smith PetscHelpPrintf - Prints help messages. 1590*d382aafbSBarry Smith 1591*d382aafbSBarry Smith Not Collective 1592*d382aafbSBarry Smith 1593*d382aafbSBarry Smith Synopsis: 1594*d382aafbSBarry Smith PetscErrorCode (*PetscHelpPrintf)(const char format[],...); 1595*d382aafbSBarry Smith 1596*d382aafbSBarry Smith Input Parameters: 1597*d382aafbSBarry Smith . format - the usual printf() format string 1598*d382aafbSBarry Smith 1599*d382aafbSBarry Smith Level: developer 1600*d382aafbSBarry Smith 1601*d382aafbSBarry Smith Fortran Note: 1602*d382aafbSBarry Smith This routine is not supported in Fortran. 1603*d382aafbSBarry Smith 1604*d382aafbSBarry Smith Concepts: help messages^printing 1605*d382aafbSBarry Smith Concepts: printing^help messages 1606*d382aafbSBarry Smith 1607*d382aafbSBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf() 1608*d382aafbSBarry Smith M*/ 1609*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char[],...); 1610*d382aafbSBarry Smith 1611*d382aafbSBarry Smith EXTERN PetscErrorCode PetscErrorPrintfDefault(const char [],...); 1612*d382aafbSBarry Smith EXTERN PetscErrorCode PetscErrorPrintfNone(const char [],...); 1613*d382aafbSBarry Smith EXTERN PetscErrorCode PetscHelpPrintfDefault(MPI_Comm,const char [],...); 1614*d382aafbSBarry Smith 1615*d382aafbSBarry Smith #if defined(PETSC_HAVE_POPEN) 1616*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **); 1617*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPClose(MPI_Comm,FILE*); 1618*d382aafbSBarry Smith #endif 1619*d382aafbSBarry Smith 1620*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSynchronizedPrintf(MPI_Comm,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 1621*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4); 1622*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSynchronizedFlush(MPI_Comm); 1623*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSynchronizedFGets(MPI_Comm,FILE*,size_t,char[]); 1624*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**); 1625*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStartJava(MPI_Comm,const char[],const char[],FILE**); 1626*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetPetscDir(const char*[]); 1627*d382aafbSBarry Smith 1628*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPopUpSelect(MPI_Comm,const char*,const char*,int,const char**,int*); 1629*d382aafbSBarry Smith 1630*d382aafbSBarry Smith /*S 1631*d382aafbSBarry Smith PetscContainer - Simple PETSc object that contains a pointer to any required data 1632*d382aafbSBarry Smith 1633*d382aafbSBarry Smith Level: advanced 1634*d382aafbSBarry Smith 1635*d382aafbSBarry Smith .seealso: PetscObject, PetscContainerCreate() 1636*d382aafbSBarry Smith S*/ 1637*d382aafbSBarry Smith extern PetscCookie PETSC_DLLEXPORT PETSC_CONTAINER_COOKIE; 1638*d382aafbSBarry Smith typedef struct _p_PetscContainer* PetscContainer; 1639*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerGetPointer(PetscContainer,void **); 1640*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerSetPointer(PetscContainer,void *); 1641*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerDestroy(PetscContainer); 1642*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerCreate(MPI_Comm,PetscContainer *); 1643*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerSetUserDestroy(PetscContainer, PetscErrorCode (*)(void*)); 1644*d382aafbSBarry Smith 1645*d382aafbSBarry Smith /* 1646*d382aafbSBarry Smith For use in debuggers 1647*d382aafbSBarry Smith */ 1648*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscMPIInt PetscGlobalRank; 1649*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscMPIInt PetscGlobalSize; 1650*d382aafbSBarry Smith 1651*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscIntView(PetscInt,const PetscInt[],PetscViewer); 1652*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRealView(PetscInt,const PetscReal[],PetscViewer); 1653*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscScalarView(PetscInt,const PetscScalar[],PetscViewer); 1654*d382aafbSBarry Smith 1655*d382aafbSBarry Smith #if defined(PETSC_HAVE_MEMORY_H) 1656*d382aafbSBarry Smith #include <memory.h> 1657*d382aafbSBarry Smith #endif 1658*d382aafbSBarry Smith #if defined(PETSC_HAVE_STDLIB_H) 1659*d382aafbSBarry Smith #include <stdlib.h> 1660*d382aafbSBarry Smith #endif 1661*d382aafbSBarry Smith #if defined(PETSC_HAVE_STRINGS_H) 1662*d382aafbSBarry Smith #include <strings.h> 1663*d382aafbSBarry Smith #endif 1664*d382aafbSBarry Smith #if defined(PETSC_HAVE_STRING_H) 1665*d382aafbSBarry Smith #include <string.h> 1666*d382aafbSBarry Smith #endif 1667*d382aafbSBarry Smith #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) 1668*d382aafbSBarry Smith #include "petscblaslapack.h" 1669*d382aafbSBarry Smith #endif 1670*d382aafbSBarry Smith #if defined(PETSC_HAVE_XMMINTRIN_H) 1671*d382aafbSBarry Smith #include <xmmintrin.h> 1672*d382aafbSBarry Smith #endif 1673*d382aafbSBarry Smith #if defined(PETSC_HAVE_STDINT_H) 1674*d382aafbSBarry Smith #include <stdint.h> 1675*d382aafbSBarry Smith #endif 1676*d382aafbSBarry Smith 1677*d382aafbSBarry Smith /*@C 1678*d382aafbSBarry Smith PetscMemcpy - Copies n bytes, beginning at location b, to the space 1679*d382aafbSBarry Smith beginning at location a. The two memory regions CANNOT overlap, use 1680*d382aafbSBarry Smith PetscMemmove() in that case. 1681*d382aafbSBarry Smith 1682*d382aafbSBarry Smith Not Collective 1683*d382aafbSBarry Smith 1684*d382aafbSBarry Smith Input Parameters: 1685*d382aafbSBarry Smith + b - pointer to initial memory space 1686*d382aafbSBarry Smith - n - length (in bytes) of space to copy 1687*d382aafbSBarry Smith 1688*d382aafbSBarry Smith Output Parameter: 1689*d382aafbSBarry Smith . a - pointer to copy space 1690*d382aafbSBarry Smith 1691*d382aafbSBarry Smith Level: intermediate 1692*d382aafbSBarry Smith 1693*d382aafbSBarry Smith Compile Option: 1694*d382aafbSBarry Smith PETSC_PREFER_DCOPY_FOR_MEMCPY will cause the BLAS dcopy() routine to be used 1695*d382aafbSBarry Smith for memory copies on double precision values. 1696*d382aafbSBarry Smith PETSC_PREFER_COPY_FOR_MEMCPY will cause C code to be used 1697*d382aafbSBarry Smith for memory copies on double precision values. 1698*d382aafbSBarry Smith PETSC_PREFER_FORTRAN_FORMEMCPY will cause Fortran code to be used 1699*d382aafbSBarry Smith for memory copies on double precision values. 1700*d382aafbSBarry Smith 1701*d382aafbSBarry Smith Note: 1702*d382aafbSBarry Smith This routine is analogous to memcpy(). 1703*d382aafbSBarry Smith 1704*d382aafbSBarry Smith Concepts: memory^copying 1705*d382aafbSBarry Smith Concepts: copying^memory 1706*d382aafbSBarry Smith 1707*d382aafbSBarry Smith .seealso: PetscMemmove() 1708*d382aafbSBarry Smith 1709*d382aafbSBarry Smith @*/ 1710*d382aafbSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PETSC_DLLEXPORT PetscMemcpy(void *a,const void *b,size_t n) 1711*d382aafbSBarry Smith { 1712*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1713*d382aafbSBarry Smith unsigned long al = (unsigned long) a,bl = (unsigned long) b; 1714*d382aafbSBarry Smith unsigned long nl = (unsigned long) n; 1715*d382aafbSBarry Smith if (n > 0 && !b) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer"); 1716*d382aafbSBarry Smith if (n > 0 && !a) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to copy to a null pointer"); 1717*d382aafbSBarry Smith #endif 1718*d382aafbSBarry Smith PetscFunctionBegin; 1719*d382aafbSBarry Smith if (a != b) { 1720*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1721*d382aafbSBarry Smith if ((al > bl && (al - bl) < nl) || (bl - al) < nl) { 1722*d382aafbSBarry Smith SETERRQ3(PETSC_ERR_ARG_INCOMP,"Memory regions overlap: either use PetscMemmov()\n\ 1723*d382aafbSBarry Smith or make sure your copy regions and lengths are correct. \n\ 1724*d382aafbSBarry Smith Length (bytes) %ld first address %ld second address %ld",nl,al,bl); 1725*d382aafbSBarry Smith } 1726*d382aafbSBarry Smith #endif 1727*d382aafbSBarry Smith #if (defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) || defined(PETSC_PREFER_COPY_FOR_MEMCPY) || defined(PETSC_PREFER_FORTRAN_FORMEMCPY)) 1728*d382aafbSBarry Smith if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1729*d382aafbSBarry Smith size_t len = n/sizeof(PetscScalar); 1730*d382aafbSBarry Smith #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) 1731*d382aafbSBarry Smith PetscBLASInt one = 1,blen = PetscBLASIntCast(len); 1732*d382aafbSBarry Smith BLAScopy_(&blen,(PetscScalar *)b,&one,(PetscScalar *)a,&one); 1733*d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FORMEMCPY) 1734*d382aafbSBarry Smith fortrancopy_(&len,(PetscScalar*)b,(PetscScalar*)a); 1735*d382aafbSBarry Smith #else 1736*d382aafbSBarry Smith size_t i; 1737*d382aafbSBarry Smith PetscScalar *x = (PetscScalar*)b, *y = (PetscScalar*)a; 1738*d382aafbSBarry Smith for (i=0; i<len; i++) y[i] = x[i]; 1739*d382aafbSBarry Smith #endif 1740*d382aafbSBarry Smith } else { 1741*d382aafbSBarry Smith memcpy((char*)(a),(char*)(b),n); 1742*d382aafbSBarry Smith } 1743*d382aafbSBarry Smith #elif defined(PETSC_HAVE__INTEL_FAST_MEMCPY) 1744*d382aafbSBarry Smith _intel_fast_memcpy((char*)(a),(char*)(b),n); 1745*d382aafbSBarry Smith #else 1746*d382aafbSBarry Smith memcpy((char*)(a),(char*)(b),n); 1747*d382aafbSBarry Smith #endif 1748*d382aafbSBarry Smith } 1749*d382aafbSBarry Smith PetscFunctionReturn(0); 1750*d382aafbSBarry Smith } 1751*d382aafbSBarry Smith 1752*d382aafbSBarry Smith /*@C 1753*d382aafbSBarry Smith PetscMemzero - Zeros the specified memory. 1754*d382aafbSBarry Smith 1755*d382aafbSBarry Smith Not Collective 1756*d382aafbSBarry Smith 1757*d382aafbSBarry Smith Input Parameters: 1758*d382aafbSBarry Smith + a - pointer to beginning memory location 1759*d382aafbSBarry Smith - n - length (in bytes) of memory to initialize 1760*d382aafbSBarry Smith 1761*d382aafbSBarry Smith Level: intermediate 1762*d382aafbSBarry Smith 1763*d382aafbSBarry Smith Compile Option: 1764*d382aafbSBarry Smith PETSC_PREFER_BZERO - on certain machines (the IBM RS6000) the bzero() routine happens 1765*d382aafbSBarry Smith to be faster than the memset() routine. This flag causes the bzero() routine to be used. 1766*d382aafbSBarry Smith 1767*d382aafbSBarry Smith Concepts: memory^zeroing 1768*d382aafbSBarry Smith Concepts: zeroing^memory 1769*d382aafbSBarry Smith 1770*d382aafbSBarry Smith .seealso: PetscMemcpy() 1771*d382aafbSBarry Smith @*/ 1772*d382aafbSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PETSC_DLLEXPORT PetscMemzero(void *a,size_t n) 1773*d382aafbSBarry Smith { 1774*d382aafbSBarry Smith if (n > 0) { 1775*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1776*d382aafbSBarry Smith if (!a) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to zero at a null pointer"); 1777*d382aafbSBarry Smith #endif 1778*d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) 1779*d382aafbSBarry Smith if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1780*d382aafbSBarry Smith size_t i,len = n/sizeof(PetscScalar); 1781*d382aafbSBarry Smith PetscScalar *x = (PetscScalar*)a; 1782*d382aafbSBarry Smith for (i=0; i<len; i++) x[i] = 0.0; 1783*d382aafbSBarry Smith } else { 1784*d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO) 1785*d382aafbSBarry Smith if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1786*d382aafbSBarry Smith PetscInt len = n/sizeof(PetscScalar); 1787*d382aafbSBarry Smith fortranzero_(&len,(PetscScalar*)a); 1788*d382aafbSBarry Smith } else { 1789*d382aafbSBarry Smith #endif 1790*d382aafbSBarry Smith #if defined(PETSC_PREFER_BZERO) 1791*d382aafbSBarry Smith bzero((char *)a,n); 1792*d382aafbSBarry Smith #elif defined (PETSC_HAVE__INTEL_FAST_MEMSET) 1793*d382aafbSBarry Smith _intel_fast_memset((char*)a,0,n); 1794*d382aafbSBarry Smith #else 1795*d382aafbSBarry Smith memset((char*)a,0,n); 1796*d382aafbSBarry Smith #endif 1797*d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) || defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO) 1798*d382aafbSBarry Smith } 1799*d382aafbSBarry Smith #endif 1800*d382aafbSBarry Smith } 1801*d382aafbSBarry Smith return 0; 1802*d382aafbSBarry Smith } 1803*d382aafbSBarry Smith 1804*d382aafbSBarry Smith /*MC 1805*d382aafbSBarry Smith PetscPrefetchBlock - Prefetches a block of memory 1806*d382aafbSBarry Smith 1807*d382aafbSBarry Smith Not Collective 1808*d382aafbSBarry Smith 1809*d382aafbSBarry Smith Input Parameters: 1810*d382aafbSBarry Smith + a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar) 1811*d382aafbSBarry Smith . n - number of elements to fetch 1812*d382aafbSBarry Smith . rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors) 1813*d382aafbSBarry Smith - t - temporal locality (0,1,2,3), see note 1814*d382aafbSBarry Smith 1815*d382aafbSBarry Smith Level: developer 1816*d382aafbSBarry Smith 1817*d382aafbSBarry Smith Synopsis: 1818*d382aafbSBarry Smith void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t) 1819*d382aafbSBarry Smith 1820*d382aafbSBarry Smith Notes: 1821*d382aafbSBarry Smith The last two arguments (rw and t) must be compile-time constants. 1822*d382aafbSBarry Smith 1823*d382aafbSBarry Smith There are four levels of temporal locality (not all architectures distinguish) 1824*d382aafbSBarry Smith + 0 - Non-temporal. Prefetches directly to L1, evicts to memory (skips higher level cache unless it was already there when prefetched). 1825*d382aafbSBarry Smith . 1 - Temporal with respect to high-level cache only. Only prefetches to high-level cache (not L1), kept at high levels after eviction from L1. 1826*d382aafbSBarry Smith . 2 - Same as 1, but keep in mid-level cache. (On most systems, 1 and 2 are equivalent.) 1827*d382aafbSBarry Smith - 3 - Fetch to all levels of cache and evict to the closest level. Use this when the memory will be reused regularly despite necessary eviction from L1. 1828*d382aafbSBarry Smith 1829*d382aafbSBarry Smith This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid 1830*d382aafbSBarry Smith address). 1831*d382aafbSBarry Smith 1832*d382aafbSBarry Smith Concepts: memory 1833*d382aafbSBarry Smith M*/ 1834*d382aafbSBarry Smith #define PetscPrefetchBlock(a,n,rw,t) do { \ 1835*d382aafbSBarry Smith const char *_p = (const char*)(a),*_end = (const char*)((a)+(n)); \ 1836*d382aafbSBarry Smith for ( ; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p,(rw),(t)); \ 1837*d382aafbSBarry Smith } while (0) 1838*d382aafbSBarry Smith 1839*d382aafbSBarry Smith /* 1840*d382aafbSBarry Smith Allows accessing Matlab Engine 1841*d382aafbSBarry Smith */ 1842*d382aafbSBarry Smith #include "petscmatlab.h" 1843*d382aafbSBarry Smith 1844*d382aafbSBarry Smith /* 1845*d382aafbSBarry Smith Determine if some of the kernel computation routines use 1846*d382aafbSBarry Smith Fortran (rather than C) for the numerical calculations. On some machines 1847*d382aafbSBarry Smith and compilers (like complex numbers) the Fortran version of the routines 1848*d382aafbSBarry Smith is faster than the C/C++ versions. The flag --with-fortran-kernels 1849*d382aafbSBarry Smith should be used with config/configure.py to turn these on. 1850*d382aafbSBarry Smith */ 1851*d382aafbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNELS) 1852*d382aafbSBarry Smith 1853*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL) 1854*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTCRL 1855*d382aafbSBarry Smith #endif 1856*d382aafbSBarry Smith 1857*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCSRPERM) 1858*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTCSRPERM 1859*d382aafbSBarry Smith #endif 1860*d382aafbSBarry Smith 1861*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ) 1862*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ 1863*d382aafbSBarry Smith #endif 1864*d382aafbSBarry Smith 1865*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ) 1866*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ 1867*d382aafbSBarry Smith #endif 1868*d382aafbSBarry Smith 1869*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM) 1870*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_NORM 1871*d382aafbSBarry Smith #endif 1872*d382aafbSBarry Smith 1873*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY) 1874*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MAXPY 1875*d382aafbSBarry Smith #endif 1876*d382aafbSBarry Smith 1877*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ) 1878*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ 1879*d382aafbSBarry Smith #endif 1880*d382aafbSBarry Smith 1881*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 1882*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ 1883*d382aafbSBarry Smith #endif 1884*d382aafbSBarry Smith 1885*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ) 1886*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ 1887*d382aafbSBarry Smith #endif 1888*d382aafbSBarry Smith 1889*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ) 1890*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ 1891*d382aafbSBarry Smith #endif 1892*d382aafbSBarry Smith 1893*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT) 1894*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MDOT 1895*d382aafbSBarry Smith #endif 1896*d382aafbSBarry Smith 1897*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY) 1898*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_XTIMESY 1899*d382aafbSBarry Smith #endif 1900*d382aafbSBarry Smith 1901*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX) 1902*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_AYPX 1903*d382aafbSBarry Smith #endif 1904*d382aafbSBarry Smith 1905*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY) 1906*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_WAXPY 1907*d382aafbSBarry Smith #endif 1908*d382aafbSBarry Smith 1909*d382aafbSBarry Smith #endif 1910*d382aafbSBarry Smith 1911*d382aafbSBarry Smith /* 1912*d382aafbSBarry Smith Macros for indicating code that should be compiled with a C interface, 1913*d382aafbSBarry Smith rather than a C++ interface. Any routines that are dynamically loaded 1914*d382aafbSBarry Smith (such as the PCCreate_XXX() routines) must be wrapped so that the name 1915*d382aafbSBarry Smith mangler does not change the functions symbol name. This just hides the 1916*d382aafbSBarry Smith ugly extern "C" {} wrappers. 1917*d382aafbSBarry Smith */ 1918*d382aafbSBarry Smith #if defined(__cplusplus) 1919*d382aafbSBarry Smith #define EXTERN_C_BEGIN extern "C" { 1920*d382aafbSBarry Smith #define EXTERN_C_END } 1921*d382aafbSBarry Smith #else 1922*d382aafbSBarry Smith #define EXTERN_C_BEGIN 1923*d382aafbSBarry Smith #define EXTERN_C_END 1924*d382aafbSBarry Smith #endif 1925*d382aafbSBarry Smith 1926*d382aafbSBarry Smith /* --------------------------------------------------------------------*/ 1927*d382aafbSBarry Smith 1928*d382aafbSBarry Smith /*MC 1929*d382aafbSBarry Smith MPI_Comm - the basic object used by MPI to determine which processes are involved in a 1930*d382aafbSBarry Smith communication 1931*d382aafbSBarry Smith 1932*d382aafbSBarry Smith Level: beginner 1933*d382aafbSBarry Smith 1934*d382aafbSBarry Smith Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm 1935*d382aafbSBarry Smith 1936*d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD, PETSC_COMM_SELF 1937*d382aafbSBarry Smith M*/ 1938*d382aafbSBarry Smith 1939*d382aafbSBarry Smith /*MC 1940*d382aafbSBarry Smith PetscScalar - PETSc type that represents either a double precision real number, a double precision 1941*d382aafbSBarry Smith complex number, a single precision real number, a long double or an int - if the code is configured 1942*d382aafbSBarry Smith with --with-scalar-type=real,complex --with-precision=single,double,longdouble,int,matsingle 1943*d382aafbSBarry Smith 1944*d382aafbSBarry Smith 1945*d382aafbSBarry Smith Level: beginner 1946*d382aafbSBarry Smith 1947*d382aafbSBarry Smith .seealso: PetscReal, PassiveReal, PassiveScalar, MPIU_SCALAR, PetscInt 1948*d382aafbSBarry Smith M*/ 1949*d382aafbSBarry Smith 1950*d382aafbSBarry Smith /*MC 1951*d382aafbSBarry Smith PetscReal - PETSc type that represents a real number version of PetscScalar 1952*d382aafbSBarry Smith 1953*d382aafbSBarry Smith Level: beginner 1954*d382aafbSBarry Smith 1955*d382aafbSBarry Smith .seealso: PetscScalar, PassiveReal, PassiveScalar 1956*d382aafbSBarry Smith M*/ 1957*d382aafbSBarry Smith 1958*d382aafbSBarry Smith /*MC 1959*d382aafbSBarry Smith PassiveScalar - PETSc type that represents a PetscScalar 1960*d382aafbSBarry Smith Level: beginner 1961*d382aafbSBarry Smith 1962*d382aafbSBarry Smith This is the same as a PetscScalar except in code that is automatically differentiated it is 1963*d382aafbSBarry Smith treated as a constant (not an indendent or dependent variable) 1964*d382aafbSBarry Smith 1965*d382aafbSBarry Smith .seealso: PetscReal, PassiveReal, PetscScalar 1966*d382aafbSBarry Smith M*/ 1967*d382aafbSBarry Smith 1968*d382aafbSBarry Smith /*MC 1969*d382aafbSBarry Smith PassiveReal - PETSc type that represents a PetscReal 1970*d382aafbSBarry Smith 1971*d382aafbSBarry Smith Level: beginner 1972*d382aafbSBarry Smith 1973*d382aafbSBarry Smith This is the same as a PetscReal except in code that is automatically differentiated it is 1974*d382aafbSBarry Smith treated as a constant (not an indendent or dependent variable) 1975*d382aafbSBarry Smith 1976*d382aafbSBarry Smith .seealso: PetscScalar, PetscReal, PassiveScalar 1977*d382aafbSBarry Smith M*/ 1978*d382aafbSBarry Smith 1979*d382aafbSBarry Smith /*MC 1980*d382aafbSBarry Smith MPIU_SCALAR - MPI datatype corresponding to PetscScalar 1981*d382aafbSBarry Smith 1982*d382aafbSBarry Smith Level: beginner 1983*d382aafbSBarry Smith 1984*d382aafbSBarry Smith Note: In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalars 1985*d382aafbSBarry Smith pass this value 1986*d382aafbSBarry Smith 1987*d382aafbSBarry Smith .seealso: PetscReal, PassiveReal, PassiveScalar, PetscScalar, MPIU_INT 1988*d382aafbSBarry Smith M*/ 1989*d382aafbSBarry Smith 1990*d382aafbSBarry Smith #if defined(PETSC_HAVE_MPIIO) 1991*d382aafbSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN) 1992*d382aafbSBarry Smith extern PetscErrorCode MPIU_File_write_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 1993*d382aafbSBarry Smith extern PetscErrorCode MPIU_File_read_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 1994*d382aafbSBarry Smith #else 1995*d382aafbSBarry Smith #define MPIU_File_write_all(a,b,c,d,e) MPI_File_write_all(a,b,c,d,e) 1996*d382aafbSBarry Smith #define MPIU_File_read_all(a,b,c,d,e) MPI_File_read_all(a,b,c,d,e) 1997*d382aafbSBarry Smith #endif 1998*d382aafbSBarry Smith #endif 1999*d382aafbSBarry Smith 2000*d382aafbSBarry Smith /* the following petsc_static_inline require petscerror.h */ 2001*d382aafbSBarry Smith 2002*d382aafbSBarry Smith /* Limit MPI to 32-bits */ 2003*d382aafbSBarry Smith #define PETSC_MPI_INT_MAX 2147483647 2004*d382aafbSBarry Smith #define PETSC_MPI_INT_MIN -2147483647 2005*d382aafbSBarry Smith /* Limit BLAS to 32-bits */ 2006*d382aafbSBarry Smith #define PETSC_BLAS_INT_MAX 2147483647 2007*d382aafbSBarry Smith #define PETSC_BLAS_INT_MIN -2147483647 2008*d382aafbSBarry Smith /* On 32 bit systems HDF5 is limited by size of integer, because hsize_t is defined as size_t */ 2009*d382aafbSBarry Smith #define PETSC_HDF5_INT_MAX 2147483647 2010*d382aafbSBarry Smith #define PETSC_HDF5_INT_MIN -2147483647 2011*d382aafbSBarry Smith 2012*d382aafbSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 2013*d382aafbSBarry Smith #define PetscMPIIntCheck(a) if ((a) > PETSC_MPI_INT_MAX) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Message too long for MPI") 2014*d382aafbSBarry Smith #define PetscBLASIntCheck(a) if ((a) > PETSC_BLAS_INT_MAX) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Array too long for BLAS/LAPACK") 2015*d382aafbSBarry Smith #define PetscMPIIntCast(a) (a);PetscMPIIntCheck(a) 2016*d382aafbSBarry Smith #define PetscBLASIntCast(a) (a);PetscBLASIntCheck(a) 2017*d382aafbSBarry Smith 2018*d382aafbSBarry Smith #if (PETSC_SIZEOF_SIZE_T == 4) 2019*d382aafbSBarry Smith #define PetscHDF5IntCheck(a) if ((a) > PETSC_HDF5_INT_MAX) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Array too long for HDF5") 2020*d382aafbSBarry Smith #define PetscHDF5IntCast(a) (a);PetscHDF5IntCheck(a) 2021*d382aafbSBarry Smith #else 2022*d382aafbSBarry Smith #define PetscHDF5IntCheck(a) 2023*d382aafbSBarry Smith #define PetscHDF5IntCast(a) a 2024*d382aafbSBarry Smith #endif 2025*d382aafbSBarry Smith 2026*d382aafbSBarry Smith #else 2027*d382aafbSBarry Smith #define PetscMPIIntCheck(a) 2028*d382aafbSBarry Smith #define PetscBLASIntCheck(a) 2029*d382aafbSBarry Smith #define PetscHDF5IntCheck(a) 2030*d382aafbSBarry Smith #define PetscMPIIntCast(a) a 2031*d382aafbSBarry Smith #define PetscBLASIntCast(a) a 2032*d382aafbSBarry Smith #define PetscHDF5IntCast(a) a 2033*d382aafbSBarry Smith #endif 2034*d382aafbSBarry Smith 2035*d382aafbSBarry Smith 2036*d382aafbSBarry Smith /* 2037*d382aafbSBarry Smith The IBM include files define hz, here we hide it so that it may be used 2038*d382aafbSBarry Smith as a regular user variable. 2039*d382aafbSBarry Smith */ 2040*d382aafbSBarry Smith #if defined(hz) 2041*d382aafbSBarry Smith #undef hz 2042*d382aafbSBarry Smith #endif 2043*d382aafbSBarry Smith 2044*d382aafbSBarry Smith /* For arrays that contain filenames or paths */ 2045*d382aafbSBarry Smith 2046*d382aafbSBarry Smith 2047*d382aafbSBarry Smith #if defined(PETSC_HAVE_LIMITS_H) 2048*d382aafbSBarry Smith #include <limits.h> 2049*d382aafbSBarry Smith #endif 2050*d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_PARAM_H) 2051*d382aafbSBarry Smith #include <sys/param.h> 2052*d382aafbSBarry Smith #endif 2053*d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_TYPES_H) 2054*d382aafbSBarry Smith #include <sys/types.h> 2055*d382aafbSBarry Smith #endif 2056*d382aafbSBarry Smith #if defined(MAXPATHLEN) 2057*d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN MAXPATHLEN 2058*d382aafbSBarry Smith #elif defined(MAX_PATH) 2059*d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN MAX_PATH 2060*d382aafbSBarry Smith #elif defined(_MAX_PATH) 2061*d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN _MAX_PATH 2062*d382aafbSBarry Smith #else 2063*d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN 4096 2064*d382aafbSBarry Smith #endif 2065*d382aafbSBarry Smith 2066*d382aafbSBarry Smith /* Special support for C++ */ 2067*d382aafbSBarry Smith #include "petscsys.hh" 2068*d382aafbSBarry Smith 2069*d382aafbSBarry Smith /*MC 2070*d382aafbSBarry Smith 2071*d382aafbSBarry Smith UsingFortran - Fortran can be used with PETSc in four distinct approaches 2072*d382aafbSBarry Smith 2073*d382aafbSBarry Smith $ 1) classic Fortran 77 style 2074*d382aafbSBarry Smith $#include "petscXXX.h" to work with material from the XXX component of PETSc 2075*d382aafbSBarry Smith $ XXX variablename 2076*d382aafbSBarry Smith $ You cannot use this approach if you wish to use the Fortran 90 specific PETSc routines 2077*d382aafbSBarry Smith $ which end in F90; such as VecGetArrayF90() 2078*d382aafbSBarry Smith $ 2079*d382aafbSBarry Smith $ 2) classic Fortran 90 style 2080*d382aafbSBarry Smith $#include "petscXXX.h" 2081*d382aafbSBarry Smith $#include "petscXXX.h90" to work with material from the XXX component of PETSc 2082*d382aafbSBarry Smith $ XXX variablename 2083*d382aafbSBarry Smith $ 2084*d382aafbSBarry Smith $ 3) Using Fortran modules 2085*d382aafbSBarry Smith $#include "petscXXXdef.h" 2086*d382aafbSBarry Smith $ use petscXXXX 2087*d382aafbSBarry Smith $ XXX variablename 2088*d382aafbSBarry Smith $ 2089*d382aafbSBarry Smith $ 4) Use Fortran modules and Fortran data types for PETSc types 2090*d382aafbSBarry Smith $#include "petscXXXdef.h" 2091*d382aafbSBarry Smith $ use petscXXXX 2092*d382aafbSBarry Smith $ type(XXX) variablename 2093*d382aafbSBarry Smith $ To use this approach you must config/configure.py PETSc with the additional 2094*d382aafbSBarry Smith $ option --with-fortran-datatypes You cannot use the type(XXX) declaration approach without using Fortran modules 2095*d382aafbSBarry Smith 2096*d382aafbSBarry Smith Finally if you absolutely do not want to use any #include you can use either 2097*d382aafbSBarry Smith 2098*d382aafbSBarry Smith $ 3a) skip the #include BUT you cannot use any PETSc data type names like Vec, Mat, PetscInt, PetscErrorCode etc 2099*d382aafbSBarry Smith $ and you must declare the variables as integer, for example 2100*d382aafbSBarry Smith $ integer variablename 2101*d382aafbSBarry Smith $ 2102*d382aafbSBarry Smith $ 4a) skip the #include, you use the object types like type(Vec) type(Mat) but cannot use the data type 2103*d382aafbSBarry Smith $ names like PetscErrorCode, PetscInt etc. again for those you must use integer 2104*d382aafbSBarry Smith 2105*d382aafbSBarry Smith We recommend either 2 or 3. Approaches 2 and 3 provide type checking for most PETSc function calls; 4 has type checking 2106*d382aafbSBarry Smith for only a few PETSc functions. 2107*d382aafbSBarry Smith 2108*d382aafbSBarry Smith Fortran type checking with interfaces is strick, this means you cannot pass a scalar value when an array value 2109*d382aafbSBarry Smith is expected (even though it is legal Fortran). For example when setting a single value in a matrix with MatSetValues() 2110*d382aafbSBarry Smith you cannot have something like 2111*d382aafbSBarry Smith $ PetscInt row,col 2112*d382aafbSBarry Smith $ PetscScalar val 2113*d382aafbSBarry Smith $ ... 2114*d382aafbSBarry Smith $ call MatSetValues(mat,1,row,1,col,val,INSERT_VALUES,ierr) 2115*d382aafbSBarry Smith You must instead have 2116*d382aafbSBarry Smith $ PetscInt row(1),col(1) 2117*d382aafbSBarry Smith $ PetscScalar val(1) 2118*d382aafbSBarry Smith $ ... 2119*d382aafbSBarry Smith $ call MatSetValues(mat,1,row,1,col,val,INSERT_VALUES,ierr) 2120*d382aafbSBarry Smith 2121*d382aafbSBarry Smith 2122*d382aafbSBarry Smith See the example src/vec/vec/examples/tutorials/ex20f90.F90 for an example that can use all four approaches 2123*d382aafbSBarry Smith 2124*d382aafbSBarry Smith Developer Notes: The finclude/petscXXXdef.h contain all the #defines (would be typedefs in C code) these 2125*d382aafbSBarry Smith automatically include their predecessors; for example finclude/petscvecdef.h includes finclude/petscisdef.h 2126*d382aafbSBarry Smith 2127*d382aafbSBarry Smith The finclude/petscXXXX.h contain all the parameter statements for that package. These automatically include 2128*d382aafbSBarry Smith their finclude/petscXXXdef.h file but DO NOT automatically include their predecessors; for example 2129*d382aafbSBarry Smith finclude/petscvec.h does NOT automatically include finclude/petscis.h 2130*d382aafbSBarry Smith 2131*d382aafbSBarry Smith The finclude/ftn-custom/petscXXXdef.h90 are not intended to be used directly in code, they define the 2132*d382aafbSBarry Smith Fortran data type type(XXX) (for example type(Vec)) when PETSc is config/configure.py with the --with-fortran-datatypes option. 2133*d382aafbSBarry Smith 2134*d382aafbSBarry Smith The finclude/ftn-custom/petscXXX.h90 (not included directly by code) contain interface definitions for 2135*d382aafbSBarry Smith the PETSc Fortran stubs that have different bindings then their C version (for example VecGetArrayF90). 2136*d382aafbSBarry Smith 2137*d382aafbSBarry Smith The finclude/ftn-auto/petscXXX.h90 (not included directly by code) contain interface definitions generated 2138*d382aafbSBarry Smith automatically by "make allfortranstubs". 2139*d382aafbSBarry Smith 2140*d382aafbSBarry Smith The finclude/petscXXX.h90 includes the custom finclude/ftn-custom/petscXXX.h90 and if config/configure.py 2141*d382aafbSBarry Smith was run with --with-fortran-interfaces it also includes the finclude/ftn-auto/petscXXX.h90 These DO NOT automatically 2142*d382aafbSBarry Smith include their predecessors 2143*d382aafbSBarry Smith 2144*d382aafbSBarry Smith Level: beginner 2145*d382aafbSBarry Smith 2146*d382aafbSBarry Smith M*/ 2147*d382aafbSBarry Smith 2148*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetArchType(char[],size_t); 2149*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetHostName(char[],size_t); 2150*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetUserName(char[],size_t); 2151*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetProgramName(char[],size_t); 2152*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetProgramName(const char[]); 2153*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetDate(char[],size_t); 2154*d382aafbSBarry Smith 2155*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortInt(PetscInt,PetscInt[]); 2156*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]); 2157*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]); 2158*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]); 2159*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortMPIIntWithArray(PetscMPIInt,PetscMPIInt[],PetscMPIInt[]); 2160*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]); 2161*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortReal(PetscInt,PetscReal[]); 2162*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]); 2163*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortSplit(PetscInt,PetscInt,PetscScalar[],PetscInt[]); 2164*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortSplitReal(PetscInt,PetscInt,PetscReal[],PetscInt[]); 2165*d382aafbSBarry Smith 2166*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDisplay(void); 2167*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetDisplay(char[],size_t); 2168*d382aafbSBarry Smith 2169*d382aafbSBarry Smith /*E 2170*d382aafbSBarry Smith PetscRandomType - String with the name of a PETSc randomizer 2171*d382aafbSBarry Smith with an optional dynamic library name, for example 2172*d382aafbSBarry Smith http://www.mcs.anl.gov/petsc/lib.a:myrandcreate() 2173*d382aafbSBarry Smith 2174*d382aafbSBarry Smith Level: beginner 2175*d382aafbSBarry Smith 2176*d382aafbSBarry Smith Notes: to use the SPRNG you must have config/configure.py PETSc 2177*d382aafbSBarry Smith with the option --download-sprng 2178*d382aafbSBarry Smith 2179*d382aafbSBarry Smith .seealso: PetscRandomSetType(), PetscRandom 2180*d382aafbSBarry Smith E*/ 2181*d382aafbSBarry Smith #define PetscRandomType char* 2182*d382aafbSBarry Smith #define PETSCRAND "rand" 2183*d382aafbSBarry Smith #define PETSCRAND48 "rand48" 2184*d382aafbSBarry Smith #define PETSCSPRNG "sprng" 2185*d382aafbSBarry Smith 2186*d382aafbSBarry Smith /* Logging support */ 2187*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscCookie PETSC_RANDOM_COOKIE; 2188*d382aafbSBarry Smith 2189*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomInitializePackage(const char[]); 2190*d382aafbSBarry Smith 2191*d382aafbSBarry Smith /*S 2192*d382aafbSBarry Smith PetscRandom - Abstract PETSc object that manages generating random numbers 2193*d382aafbSBarry Smith 2194*d382aafbSBarry Smith Level: intermediate 2195*d382aafbSBarry Smith 2196*d382aafbSBarry Smith Concepts: random numbers 2197*d382aafbSBarry Smith 2198*d382aafbSBarry Smith .seealso: PetscRandomCreate(), PetscRandomGetValue(), PetscRandomType 2199*d382aafbSBarry Smith S*/ 2200*d382aafbSBarry Smith typedef struct _p_PetscRandom* PetscRandom; 2201*d382aafbSBarry Smith 2202*d382aafbSBarry Smith /* Dynamic creation and loading functions */ 2203*d382aafbSBarry Smith extern PetscFList PetscRandomList; 2204*d382aafbSBarry Smith extern PetscTruth PetscRandomRegisterAllCalled; 2205*d382aafbSBarry Smith 2206*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomRegisterAll(const char []); 2207*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomRegister(const char[],const char[],const char[],PetscErrorCode (*)(PetscRandom)); 2208*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomRegisterDestroy(void); 2209*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetType(PetscRandom, const PetscRandomType); 2210*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetFromOptions(PetscRandom); 2211*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetType(PetscRandom, const PetscRandomType*); 2212*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomViewFromOptions(PetscRandom,char*); 2213*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomView(PetscRandom,PetscViewer); 2214*d382aafbSBarry Smith 2215*d382aafbSBarry Smith /*MC 2216*d382aafbSBarry Smith PetscRandomRegisterDynamic - Adds a new PetscRandom component implementation 2217*d382aafbSBarry Smith 2218*d382aafbSBarry Smith Synopsis: 2219*d382aafbSBarry Smith PetscErrorCode PetscRandomRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(PetscRandom)) 2220*d382aafbSBarry Smith 2221*d382aafbSBarry Smith Not Collective 2222*d382aafbSBarry Smith 2223*d382aafbSBarry Smith Input Parameters: 2224*d382aafbSBarry Smith + name - The name of a new user-defined creation routine 2225*d382aafbSBarry Smith . path - The path (either absolute or relative) of the library containing this routine 2226*d382aafbSBarry Smith . func_name - The name of routine to create method context 2227*d382aafbSBarry Smith - create_func - The creation routine itself 2228*d382aafbSBarry Smith 2229*d382aafbSBarry Smith Notes: 2230*d382aafbSBarry Smith PetscRandomRegisterDynamic() may be called multiple times to add several user-defined randome number generators 2231*d382aafbSBarry Smith 2232*d382aafbSBarry Smith If dynamic libraries are used, then the fourth input argument (routine_create) is ignored. 2233*d382aafbSBarry Smith 2234*d382aafbSBarry Smith Sample usage: 2235*d382aafbSBarry Smith .vb 2236*d382aafbSBarry Smith PetscRandomRegisterDynamic("my_rand","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyPetscRandomtorCreate", MyPetscRandomtorCreate); 2237*d382aafbSBarry Smith .ve 2238*d382aafbSBarry Smith 2239*d382aafbSBarry Smith Then, your random type can be chosen with the procedural interface via 2240*d382aafbSBarry Smith .vb 2241*d382aafbSBarry Smith PetscRandomCreate(MPI_Comm, PetscRandom *); 2242*d382aafbSBarry Smith PetscRandomSetType(PetscRandom,"my_random_name"); 2243*d382aafbSBarry Smith .ve 2244*d382aafbSBarry Smith or at runtime via the option 2245*d382aafbSBarry Smith .vb 2246*d382aafbSBarry Smith -random_type my_random_name 2247*d382aafbSBarry Smith .ve 2248*d382aafbSBarry Smith 2249*d382aafbSBarry Smith Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values. 2250*d382aafbSBarry Smith 2251*d382aafbSBarry Smith For an example of the code needed to interface your own random number generator see 2252*d382aafbSBarry Smith src/sys/random/impls/rand/rand.c 2253*d382aafbSBarry Smith 2254*d382aafbSBarry Smith Level: advanced 2255*d382aafbSBarry Smith 2256*d382aafbSBarry Smith .keywords: PetscRandom, register 2257*d382aafbSBarry Smith .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister() 2258*d382aafbSBarry Smith M*/ 2259*d382aafbSBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 2260*d382aafbSBarry Smith #define PetscRandomRegisterDynamic(a,b,c,d) PetscRandomRegister(a,b,c,0) 2261*d382aafbSBarry Smith #else 2262*d382aafbSBarry Smith #define PetscRandomRegisterDynamic(a,b,c,d) PetscRandomRegister(a,b,c,d) 2263*d382aafbSBarry Smith #endif 2264*d382aafbSBarry Smith 2265*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomCreate(MPI_Comm,PetscRandom*); 2266*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetValue(PetscRandom,PetscScalar*); 2267*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetValueReal(PetscRandom,PetscReal*); 2268*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetInterval(PetscRandom,PetscScalar*,PetscScalar*); 2269*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar); 2270*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetSeed(PetscRandom,unsigned long); 2271*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetSeed(PetscRandom,unsigned long *); 2272*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSeed(PetscRandom); 2273*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomDestroy(PetscRandom); 2274*d382aafbSBarry Smith 2275*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFullPath(const char[],char[],size_t); 2276*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetRelativePath(const char[],char[],size_t); 2277*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetWorkingDirectory(char[],size_t); 2278*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetRealPath(const char[],char[]); 2279*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetHomeDirectory(char[],size_t); 2280*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTestFile(const char[],char,PetscTruth*); 2281*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTestDirectory(const char[],char,PetscTruth*); 2282*d382aafbSBarry Smith 2283*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryRead(int,void*,PetscInt,PetscDataType); 2284*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySynchronizedRead(MPI_Comm,int,void*,PetscInt,PetscDataType); 2285*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySynchronizedWrite(MPI_Comm,int,void*,PetscInt,PetscDataType,PetscTruth); 2286*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryWrite(int,void*,PetscInt,PetscDataType,PetscTruth); 2287*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryOpen(const char[],PetscFileMode,int *); 2288*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryClose(int); 2289*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSharedTmp(MPI_Comm,PetscTruth *); 2290*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSharedWorkingDirectory(MPI_Comm,PetscTruth *); 2291*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetTmp(MPI_Comm,char[],size_t); 2292*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFileRetrieve(MPI_Comm,const char[],char[],size_t,PetscTruth*); 2293*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLs(MPI_Comm,const char[],char[],size_t,PetscTruth*); 2294*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenSocket(char*,int,int*); 2295*d382aafbSBarry Smith 2296*d382aafbSBarry Smith /* 2297*d382aafbSBarry Smith In binary files variables are stored using the following lengths, 2298*d382aafbSBarry Smith regardless of how they are stored in memory on any one particular 2299*d382aafbSBarry Smith machine. Use these rather then sizeof() in computing sizes for 2300*d382aafbSBarry Smith PetscBinarySeek(). 2301*d382aafbSBarry Smith */ 2302*d382aafbSBarry Smith #define PETSC_BINARY_INT_SIZE (32/8) 2303*d382aafbSBarry Smith #define PETSC_BINARY_FLOAT_SIZE (32/8) 2304*d382aafbSBarry Smith #define PETSC_BINARY_CHAR_SIZE (8/8) 2305*d382aafbSBarry Smith #define PETSC_BINARY_SHORT_SIZE (16/8) 2306*d382aafbSBarry Smith #define PETSC_BINARY_DOUBLE_SIZE (64/8) 2307*d382aafbSBarry Smith #define PETSC_BINARY_SCALAR_SIZE sizeof(PetscScalar) 2308*d382aafbSBarry Smith 2309*d382aafbSBarry Smith /*E 2310*d382aafbSBarry Smith PetscBinarySeekType - argument to PetscBinarySeek() 2311*d382aafbSBarry Smith 2312*d382aafbSBarry Smith Level: advanced 2313*d382aafbSBarry Smith 2314*d382aafbSBarry Smith .seealso: PetscBinarySeek(), PetscBinarySynchronizedSeek() 2315*d382aafbSBarry Smith E*/ 2316*d382aafbSBarry Smith typedef enum {PETSC_BINARY_SEEK_SET = 0,PETSC_BINARY_SEEK_CUR = 1,PETSC_BINARY_SEEK_END = 2} PetscBinarySeekType; 2317*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*); 2318*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySynchronizedSeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*); 2319*d382aafbSBarry Smith 2320*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDebugTerminal(const char[]); 2321*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDebugger(const char[],PetscTruth); 2322*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDefaultDebugger(void); 2323*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDebuggerFromString(char*); 2324*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscAttachDebugger(void); 2325*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStopForDebugger(void); 2326*d382aafbSBarry Smith 2327*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGatherNumberOfMessages(MPI_Comm,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt*); 2328*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**); 2329*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**,PetscMPIInt**); 2330*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscInt***,MPI_Request**); 2331*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscScalar***,MPI_Request**); 2332*d382aafbSBarry Smith 2333*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSSEIsEnabled(MPI_Comm,PetscTruth *,PetscTruth *); 2334*d382aafbSBarry Smith 2335*d382aafbSBarry Smith /*E 2336*d382aafbSBarry Smith InsertMode - Whether entries are inserted or added into vectors or matrices 2337*d382aafbSBarry Smith 2338*d382aafbSBarry Smith Level: beginner 2339*d382aafbSBarry Smith 2340*d382aafbSBarry Smith .seealso: VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 2341*d382aafbSBarry Smith VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), 2342*d382aafbSBarry Smith MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 2343*d382aafbSBarry Smith E*/ 2344*d382aafbSBarry Smith typedef enum {NOT_SET_VALUES, INSERT_VALUES, ADD_VALUES, MAX_VALUES} InsertMode; 2345*d382aafbSBarry Smith 2346*d382aafbSBarry Smith /*MC 2347*d382aafbSBarry Smith INSERT_VALUES - Put a value into a vector or matrix, overwrites any previous value 2348*d382aafbSBarry Smith 2349*d382aafbSBarry Smith Level: beginner 2350*d382aafbSBarry Smith 2351*d382aafbSBarry Smith .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 2352*d382aafbSBarry Smith VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES, 2353*d382aafbSBarry Smith MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 2354*d382aafbSBarry Smith 2355*d382aafbSBarry Smith M*/ 2356*d382aafbSBarry Smith 2357*d382aafbSBarry Smith /*MC 2358*d382aafbSBarry Smith ADD_VALUES - Adds a value into a vector or matrix, if there previously was no value, just puts the 2359*d382aafbSBarry Smith value into that location 2360*d382aafbSBarry Smith 2361*d382aafbSBarry Smith Level: beginner 2362*d382aafbSBarry Smith 2363*d382aafbSBarry Smith .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 2364*d382aafbSBarry Smith VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES, 2365*d382aafbSBarry Smith MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 2366*d382aafbSBarry Smith 2367*d382aafbSBarry Smith M*/ 2368*d382aafbSBarry Smith 2369*d382aafbSBarry Smith /*MC 2370*d382aafbSBarry Smith MAX_VALUES - Puts the maximum of the scattered/gathered value and the current value into each location 2371*d382aafbSBarry Smith 2372*d382aafbSBarry Smith Level: beginner 2373*d382aafbSBarry Smith 2374*d382aafbSBarry Smith .seealso: InsertMode, VecScatterBegin(), VecScatterEnd(), ADD_VALUES, INSERT_VALUES 2375*d382aafbSBarry Smith 2376*d382aafbSBarry Smith M*/ 2377*d382aafbSBarry Smith 2378*d382aafbSBarry Smith /*E 2379*d382aafbSBarry Smith ScatterMode - Determines the direction of a scatter 2380*d382aafbSBarry Smith 2381*d382aafbSBarry Smith Level: beginner 2382*d382aafbSBarry Smith 2383*d382aafbSBarry Smith .seealso: VecScatter, VecScatterBegin(), VecScatterEnd() 2384*d382aafbSBarry Smith E*/ 2385*d382aafbSBarry Smith typedef enum {SCATTER_FORWARD=0, SCATTER_REVERSE=1, SCATTER_FORWARD_LOCAL=2, SCATTER_REVERSE_LOCAL=3, SCATTER_LOCAL=2} ScatterMode; 2386*d382aafbSBarry Smith 2387*d382aafbSBarry Smith /*MC 2388*d382aafbSBarry Smith SCATTER_FORWARD - Scatters the values as dictated by the VecScatterCreate() call 2389*d382aafbSBarry Smith 2390*d382aafbSBarry Smith Level: beginner 2391*d382aafbSBarry Smith 2392*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD_LOCAL, 2393*d382aafbSBarry Smith SCATTER_REVERSE_LOCAL 2394*d382aafbSBarry Smith 2395*d382aafbSBarry Smith M*/ 2396*d382aafbSBarry Smith 2397*d382aafbSBarry Smith /*MC 2398*d382aafbSBarry Smith SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in 2399*d382aafbSBarry Smith in the VecScatterCreate() 2400*d382aafbSBarry Smith 2401*d382aafbSBarry Smith Level: beginner 2402*d382aafbSBarry Smith 2403*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 2404*d382aafbSBarry Smith SCATTER_REVERSE_LOCAL 2405*d382aafbSBarry Smith 2406*d382aafbSBarry Smith M*/ 2407*d382aafbSBarry Smith 2408*d382aafbSBarry Smith /*MC 2409*d382aafbSBarry Smith SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the VecScatterCreate() call except NO parallel communication 2410*d382aafbSBarry Smith is done. Any variables that have be moved between processes are ignored 2411*d382aafbSBarry Smith 2412*d382aafbSBarry Smith Level: developer 2413*d382aafbSBarry Smith 2414*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD, 2415*d382aafbSBarry Smith SCATTER_REVERSE_LOCAL 2416*d382aafbSBarry Smith 2417*d382aafbSBarry Smith M*/ 2418*d382aafbSBarry Smith 2419*d382aafbSBarry Smith /*MC 2420*d382aafbSBarry Smith SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in 2421*d382aafbSBarry Smith in the VecScatterCreate() except NO parallel communication 2422*d382aafbSBarry Smith is done. Any variables that have be moved between processes are ignored 2423*d382aafbSBarry Smith 2424*d382aafbSBarry Smith Level: developer 2425*d382aafbSBarry Smith 2426*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 2427*d382aafbSBarry Smith SCATTER_REVERSE 2428*d382aafbSBarry Smith 2429*d382aafbSBarry Smith M*/ 2430*d382aafbSBarry Smith 2431*d382aafbSBarry Smith /*S 2432*d382aafbSBarry Smith PetscSubcomm - Context of MPI subcommunicators, used by PCREDUNDANT 2433*d382aafbSBarry Smith 2434*d382aafbSBarry Smith Level: advanced 2435*d382aafbSBarry Smith 2436*d382aafbSBarry Smith Concepts: communicator, create 2437*d382aafbSBarry Smith S*/ 2438*d382aafbSBarry Smith typedef struct _n_PetscSubcomm* PetscSubcomm; 2439*d382aafbSBarry Smith 2440*d382aafbSBarry Smith struct _n_PetscSubcomm { 2441*d382aafbSBarry Smith MPI_Comm parent; /* parent communicator */ 2442*d382aafbSBarry Smith MPI_Comm dupparent; /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */ 2443*d382aafbSBarry Smith MPI_Comm comm; /* this communicator */ 2444*d382aafbSBarry Smith PetscInt n; /* num of subcommunicators under the parent communicator */ 2445*d382aafbSBarry Smith PetscInt color; /* color of processors belong to this communicator */ 2446*d382aafbSBarry Smith }; 2447*d382aafbSBarry Smith 2448*d382aafbSBarry Smith EXTERN PetscErrorCode PETSCMAT_DLLEXPORT PetscSubcommCreate(MPI_Comm,PetscInt,PetscSubcomm*); 2449*d382aafbSBarry Smith EXTERN PetscErrorCode PETSCMAT_DLLEXPORT PetscSubcommDestroy(PetscSubcomm); 2450*d382aafbSBarry Smith 2451*d382aafbSBarry Smith PETSC_EXTERN_CXX_END 2452*d382aafbSBarry Smith #endif 2453