1 /* $Id: petsc.h,v 1.297 2001/09/07 20:13:16 bsmith Exp $ */ 2 /* 3 This is the main PETSc include file (for C and C++). It is included by all 4 other PETSc include files, so it almost never has to be specifically included. 5 */ 6 #if !defined(__PETSC_H) 7 #define __PETSC_H 8 /* ========================================================================== */ 9 /* 10 This facilitates using C version of PETSc from C++ 11 */ 12 13 #if defined(PETSC_USE_EXTERN_CXX) && defined(__cplusplus) 14 #define PETSC_EXTERN_CXX_BEGIN extern "C" { 15 #define PETSC_EXTERN_CXX_END } 16 #else 17 #define PETSC_EXTERN_CXX_BEGIN 18 #define PETSC_EXTERN_CXX_END 19 #endif 20 /* ========================================================================== */ 21 /* 22 Current PETSc version number and release date 23 */ 24 #include "petscversion.h" 25 26 /* ========================================================================== */ 27 /* 28 petscconf.h is contained in bmake/${PETSC_ARCH}/petscconf.h it is 29 found automatically by the compiler due to the -I${PETSC_DIR}/bmake/${PETSC_ARCH} 30 in the bmake/common_variables definition of PETSC_INCLUDE 31 */ 32 #include "petscconf.h" 33 /* 34 Fixes for configure time choices which impact our interface. Currently only 35 calling conventions and extra compiler checking falls under this category. 36 */ 37 #if !defined(PETSC_PRINTF_FORMAT_CHECK) 38 #define PETSC_PRINTF_FORMAT_CHECK(a,b) 39 #endif 40 #if !defined (PETSC_STDCALL) 41 #define PETSC_STDCALL 42 #endif 43 #if !defined (PETSC_TEMPLATE) 44 #define PETSC_TEMPLATE 45 #endif 46 47 /* ========================================================================== */ 48 49 #include <stdio.h> 50 /* 51 Defines the interface to MPI allowing the use of all MPI functions. 52 */ 53 #include "mpi.h" 54 55 56 /* 57 Declare extern C stuff after incuding external header files 58 */ 59 60 PETSC_EXTERN_CXX_BEGIN 61 62 /* 63 EXTERN indicates a PETSc function defined elsewhere 64 */ 65 #if !defined(EXTERN) 66 #define EXTERN extern 67 #endif 68 69 /* 70 Defines some elementary mathematics functions and constants. 71 */ 72 #include "petscmath.h" 73 74 /* 75 Basic PETSc constants 76 */ 77 78 /*E 79 PetscTruth - Logical variable. Actually an integer 80 81 Level: beginner 82 83 E*/ 84 typedef enum { PETSC_FALSE,PETSC_TRUE } PetscTruth; 85 86 /*M 87 PETSC_NULL - standard way of passing in a null or array or pointer 88 89 Level: beginner 90 91 Notes: accepted by many PETSc functions to not set a parameter and instead use 92 some default 93 94 This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER, 95 PETSC_NULL_DOUBLE_PRECISION etc 96 97 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE 98 99 M*/ 100 #define PETSC_NULL 0 101 102 /*M 103 PETSC_DECIDE - standard way of passing in integer or floating point parameter 104 where you wish PETSc to use the default. 105 106 Level: beginner 107 108 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE 109 110 M*/ 111 #define PETSC_DECIDE -1 112 113 /*M 114 PETSC_DEFAULT - standard way of passing in integer or floating point parameter 115 where you wish PETSc to use the default. 116 117 Level: beginner 118 119 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE 120 121 M*/ 122 #define PETSC_DEFAULT -2 123 124 #define PETSC_YES PETSC_TRUE 125 #define PETSC_NO PETSC_FALSE 126 127 /*M 128 PETSC_IGNORE - same as PETSC_NULL, means PETSc will ignore this argument 129 130 Level: beginner 131 132 Notes: accepted by many PETSc functions to not set a parameter and instead use 133 some default 134 135 This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER, 136 PETSC_NULL_DOUBLE_PRECISION etc 137 138 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_NULL, PETSC_DETERMINE 139 140 M*/ 141 #define PETSC_IGNORE PETSC_NULL 142 143 /*M 144 PETSC_DETERMINE - standard way of passing in integer or floating point parameter 145 where you wish PETSc to compute the required value. 146 147 Level: beginner 148 149 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE, VecSetSizes() 150 151 M*/ 152 #define PETSC_DETERMINE PETSC_DECIDE 153 154 /*M 155 PETSC_COMM_WORLD - a duplicate of the MPI_COMM_WORLD communicator which represents 156 all the processs 157 158 Level: beginner 159 160 Notes: PETSC_COMM_WORLD and MPI_COMM_WORLD are equivalent except that passint MPI_COMM_WORLD 161 into PETSc object constructors will result in using more MPI resources since an MPI_Comm_dup() 162 will be done on it internally. We recommend always using PETSC_COMM_WORLD 163 164 .seealso: PETSC_COMM_SELF 165 166 M*/ 167 extern MPI_Comm PETSC_COMM_WORLD; 168 169 /*M 170 PETSC_COMM_SELF - a duplicate of the MPI_COMM_SELF communicator which represents 171 the current process 172 173 Level: beginner 174 175 Notes: PETSC_COMM_SELF and MPI_COMM_SELF are equivalent except that passint MPI_COMM_SELF 176 into PETSc object constructors will result in using more MPI resources since an MPI_Comm_dup() 177 will be done on it internally. We recommend always using PETSC_COMM_SELF 178 179 .seealso: PETSC_COMM_WORLD 180 181 M*/ 182 extern MPI_Comm PETSC_COMM_SELF; 183 184 extern PetscTruth PetscInitializeCalled; 185 EXTERN int PetscSetCommWorld(MPI_Comm); 186 EXTERN int PetscSetHelpVersionFunctions(int (*)(MPI_Comm),int (*)(MPI_Comm)); 187 188 /*MC 189 PetscMalloc - Allocates memory 190 191 Input Parameter: 192 . m - number of bytes to allocate 193 194 Output Parameter: 195 . result - memory allocated 196 197 Synopsis: 198 int PetscMalloc(size_t m,void **result) 199 200 Level: beginner 201 202 Notes: Memory is always allocated at least double aligned 203 204 .seealso: PetscFree(), PetscNew() 205 206 Concepts: memory allocation 207 208 M*/ 209 #define PetscMalloc(a,b) (*PetscTrMalloc)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__,(void**)(b)) 210 /*MC 211 PetscNew - Allocates memory of a particular type 212 213 Input Parameter: 214 . type - structure name of space to be allocated. Memory of size sizeof(type) is allocated 215 216 Output Parameter: 217 . result - memory allocated 218 219 Synopsis: 220 int PetscNew(struct type,((type *))result) 221 222 Level: beginner 223 224 .seealso: PetscFree(), PetscMalloc() 225 226 Concepts: memory allocation 227 228 M*/ 229 #define PetscNew(A,b) PetscMalloc(sizeof(A),(b)) 230 /*MC 231 PetscFree - Frees memory 232 233 Input Parameter: 234 . memory - memory to free 235 236 Synopsis: 237 int PetscFree(void *memory) 238 239 Level: beginner 240 241 Notes: Memory must have been obtained with PetscNew() or PetscMalloc() 242 243 .seealso: PetscNew(), PetscMalloc() 244 245 Concepts: memory allocation 246 247 M*/ 248 #define PetscFree(a) (*PetscTrFree)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__) 249 EXTERN int (*PetscTrMalloc)(size_t,int,char*,char*,char*,void**); 250 EXTERN int (*PetscTrFree)(void *,int,char*,char*,char*); 251 EXTERN int PetscSetMalloc(int (*)(size_t,int,char*,char*,char*,void**),int (*)(void *,int,char*,char*,char*)); 252 EXTERN int PetscClearMalloc(void); 253 254 /* 255 Routines for tracing memory corruption/bleeding with default PETSc 256 memory allocation 257 */ 258 EXTERN int PetscTrDump(FILE *); 259 EXTERN int PetscTrSpace(PetscLogDouble *,PetscLogDouble *,PetscLogDouble *); 260 EXTERN int PetscTrValid(int,const char[],const char[],const char[]); 261 EXTERN int PetscTrDebugLevel(int); 262 EXTERN int PetscTrLog(void); 263 EXTERN int PetscTrLogDump(FILE *); 264 EXTERN int PetscGetResidentSetSize(PetscLogDouble *); 265 266 /* 267 Variable type where we stash PETSc object pointers in Fortran. 268 Assumes that sizeof(long) == sizeof(void*)which is true on 269 all machines that we know. 270 */ 271 #define PetscFortranAddr long 272 273 /*E 274 PetscDataType - Used for handling different basic data types. 275 276 Level: beginner 277 278 .seealso: PetscBinaryRead(), PetscBinaryWrite(), PetscDataTypeToMPIDataType(), 279 PetscDataTypeGetSize(), PetscDataTypeGetName() 280 281 E*/ 282 typedef enum {PETSC_INT = 0,PETSC_DOUBLE = 1,PETSC_COMPLEX = 2, 283 PETSC_LONG =3 ,PETSC_SHORT = 4,PETSC_FLOAT = 5, 284 PETSC_CHAR = 6,PETSC_LOGICAL = 7} PetscDataType; 285 #if defined(PETSC_USE_COMPLEX) 286 #define PETSC_SCALAR PETSC_COMPLEX 287 #else 288 #if defined(PETSC_USE_SINGLE) 289 #define PETSC_SCALAR PETSC_FLOAT 290 #else 291 #define PETSC_SCALAR PETSC_DOUBLE 292 #endif 293 #endif 294 #if defined(PETSC_USE_SINGLE) 295 #define PETSC_REAL PETSC_FLOAT 296 #else 297 #define PETSC_REAL PETSC_DOUBLE 298 #endif 299 #define PETSC_FORTRANADDR PETSC_LONG 300 301 EXTERN int PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*); 302 EXTERN int PetscDataTypeGetSize(PetscDataType,int*); 303 EXTERN int PetscDataTypeGetName(PetscDataType,char*[]); 304 305 /* 306 Basic memory and string operations. These are usually simple wrappers 307 around the basic Unix system calls, but a few of them have additional 308 functionality and/or error checking. 309 */ 310 EXTERN int PetscMemcpy(void *,const void *,int); 311 EXTERN int PetscBitMemcpy(void*,int,const void*,int,int,PetscDataType); 312 EXTERN int PetscMemmove(void *,void *,int); 313 EXTERN int PetscMemzero(void *,int); 314 EXTERN int PetscMemcmp(const void*,const void*,int,PetscTruth *); 315 EXTERN int PetscStrlen(const char[],int*); 316 EXTERN int PetscStrcmp(const char[],const char[],PetscTruth *); 317 EXTERN int PetscStrgrt(const char[],const char[],PetscTruth *); 318 EXTERN int PetscStrcasecmp(const char[],const char[],PetscTruth*); 319 EXTERN int PetscStrncmp(const char[],const char[],int,PetscTruth*); 320 EXTERN int PetscStrcpy(char[],const char[]); 321 EXTERN int PetscStrcat(char[],const char[]); 322 EXTERN int PetscStrncat(char[],const char[],int); 323 EXTERN int PetscStrncpy(char[],const char[],int); 324 EXTERN int PetscStrchr(const char[],char,char **); 325 EXTERN int PetscStrtolower(char[]); 326 EXTERN int PetscStrrchr(const char[],char,char **); 327 EXTERN int PetscStrstr(const char[],const char[],char **); 328 EXTERN int PetscStrallocpy(const char[],char **); 329 EXTERN int PetscStrreplace(MPI_Comm,const char[],char*,int); 330 #define PetscStrfree(a) ((a) ? PetscFree(a) : 0) 331 typedef struct {char token;char *array;char *current;} PetscToken; 332 EXTERN int PetscTokenCreate(const char[],const char,PetscToken**); 333 EXTERN int PetscTokenFind(PetscToken*,char **); 334 EXTERN int PetscTokenDestroy(PetscToken*); 335 336 /* 337 These are MPI operations for MPI_Allreduce() etc 338 */ 339 EXTERN MPI_Op PetscMaxSum_Op; 340 #if defined(PETSC_USE_COMPLEX) 341 EXTERN MPI_Op PetscSum_Op; 342 #else 343 #define PetscSum_Op MPI_SUM 344 #endif 345 EXTERN int PetscMaxSum(MPI_Comm,const int[],int*,int*); 346 347 /*S 348 PetscObject - any PETSc object, PetscViewer, Mat, Vec, SLES etc 349 350 Level: beginner 351 352 .seealso: PetscObjectDestroy(), PetscObjectView(), PetscObjectGetName(), PetscObjectSetName() 353 S*/ 354 typedef struct _p_PetscObject* PetscObject; 355 356 /*S 357 PetscFList - Linked list of functions, possibly stored in dynamic libraries, accessed 358 by string name 359 360 Level: advanced 361 362 .seealso: PetscFListAdd(), PetscFListDestroy() 363 S*/ 364 typedef struct _PetscFList *PetscFList; 365 366 #include "petscviewer.h" 367 #include "petscoptions.h" 368 369 EXTERN int PetscShowMemoryUsage(PetscViewer,char*); 370 EXTERN int PetscGetTime(PetscLogDouble*); 371 EXTERN int PetscGetCPUTime(PetscLogDouble*); 372 EXTERN int PetscSleep(int); 373 374 /* 375 Initialization of PETSc 376 */ 377 EXTERN int PetscInitialize(int*,char***,char[],const char[]); 378 EXTERN int PetscInitializeNoArguments(void); 379 EXTERN int PetscFinalize(void); 380 EXTERN int PetscInitializeFortran(void); 381 EXTERN int PetscGetArgs(int*,char ***); 382 EXTERN int PetscEnd(void); 383 384 /* 385 ParameterDict is an abstraction for arguments to interface mechanisms 386 */ 387 extern int DICT_COOKIE; 388 typedef struct _p_Dict *ParameterDict; 389 390 typedef void (**PetscVoidFunction)(void); 391 392 /* 393 PetscTryMethod - Queries an object for a method, if it exists then calls it. 394 Can support argument checking 395 */ 396 #if defined(PETSC_FORTRAN_STUBS) 397 #define PetscTryMethod(obj,A,B,C) \ 398 0;{ int (*f)B; \ 399 *ierr = PetscObjectQueryFunction((PetscObject)obj,#A,(PetscVoidFunction)&f);if (*ierr) return; \ 400 if (f) {*ierr = (*f)C;if (*ierr) return;}\ 401 } 402 #else 403 #define PetscTryMethod(obj,A,B,C) \ 404 0;{ int (*f)B, __ierr; \ 405 __ierr = PetscObjectQueryFunction((PetscObject)obj,#A,(PetscVoidFunction)&f);CHKERRQ(__ierr); \ 406 if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\ 407 } 408 #endif 409 410 /* 411 Functions that can act on any PETSc object. 412 */ 413 EXTERN int PetscObjectDestroy(PetscObject); 414 EXTERN int PetscObjectExists(PetscObject,PetscTruth*); 415 EXTERN int PetscObjectGetComm(PetscObject,MPI_Comm *); 416 EXTERN int PetscObjectGetCookie(PetscObject,int *); 417 EXTERN int PetscObjectGetType(PetscObject,int *); 418 EXTERN int PetscObjectSetName(PetscObject,const char[]); 419 EXTERN int PetscObjectGetName(PetscObject,char*[]); 420 EXTERN int PetscObjectReference(PetscObject); 421 EXTERN int PetscObjectGetReference(PetscObject,int*); 422 EXTERN int PetscObjectDereference(PetscObject); 423 EXTERN int PetscObjectGetNewTag(PetscObject,int *); 424 EXTERN int PetscObjectSetParameterDict(PetscObject,ParameterDict); 425 EXTERN int PetscObjectGetParameterDict(PetscObject,ParameterDict*); 426 EXTERN int PetscCommGetNewTag(MPI_Comm,int *); 427 EXTERN int PetscObjectView(PetscObject,PetscViewer); 428 EXTERN int PetscObjectCompose(PetscObject,const char[],PetscObject); 429 EXTERN int PetscObjectQuery(PetscObject,const char[],PetscObject *); 430 EXTERN int PetscObjectComposeFunction(PetscObject,const char[],const char[],void (*)(void)); 431 432 /*MC 433 PetscObjectComposeFunctionDynamic - Associates a function with a given PETSc object. 434 435 Collective on PetscObject 436 437 Input Parameters: 438 + obj - the PETSc object; this must be cast with a (PetscObject), for example, 439 PetscObjectCompose((PetscObject)mat,...); 440 . name - name associated with the child function 441 . fname - name of the function 442 - ptr - function pointer (or PETSC_NULL if using dynamic libraries) 443 444 Level: advanced 445 446 Synopsis: 447 int PetscObjectComposeFunctionDynamic(PetscObject obj,char *name,char *fname,void *ptr) 448 449 Notes: 450 PetscObjectComposeFunctionDynamic() can be used with any PETSc object (such as 451 Mat, Vec, KSP, SNES, etc.) or any user-provided object. 452 453 The composed function must be wrapped in a EXTERN_C_BEGIN/END for this to 454 work in C++/complex with dynamic link libraries (PETSC_USE_DYNAMIC_LIBRARIES) 455 enabled. 456 457 Concepts: objects^composing functions 458 Concepts: composing functions 459 Concepts: functions^querying 460 Concepts: objects^querying 461 Concepts: querying objects 462 463 .seealso: PetscObjectQueryFunction() 464 M*/ 465 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 466 #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,0) 467 #else 468 #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,(void (*)(void))(d)) 469 #endif 470 471 EXTERN int PetscObjectQueryFunction(PetscObject,const char[],void (**)(void)); 472 EXTERN int PetscObjectSetOptionsPrefix(PetscObject,const char[]); 473 EXTERN int PetscObjectAppendOptionsPrefix(PetscObject,const char[]); 474 EXTERN int PetscObjectPrependOptionsPrefix(PetscObject,const char[]); 475 EXTERN int PetscObjectGetOptionsPrefix(PetscObject,char*[]); 476 EXTERN int PetscObjectPublish(PetscObject); 477 EXTERN int PetscObjectChangeTypeName(PetscObject,char *); 478 EXTERN int PetscObjectChangeSerializeName(PetscObject,char *); 479 EXTERN int PetscObjectRegisterDestroy(PetscObject); 480 EXTERN int PetscObjectRegisterDestroyAll(void); 481 EXTERN int PetscObjectName(PetscObject); 482 EXTERN int PetscTypeCompare(PetscObject,char*,PetscTruth*); 483 EXTERN int PetscSerializeCompare(PetscObject,char*,PetscTruth*); 484 485 /* 486 Defines PETSc error handling. 487 */ 488 #include "petscerror.h" 489 490 /*S 491 PetscOList - Linked list of PETSc objects, accessable by string name 492 493 Level: advanced 494 495 .seealso: PetscOListAdd(), PetscOListDestroy(), PetscOListFind() 496 S*/ 497 typedef struct _PetscOList *PetscOList; 498 499 EXTERN int PetscOListDestroy(PetscOList *); 500 EXTERN int PetscOListFind(PetscOList,const char[],PetscObject*); 501 EXTERN int PetscOListReverseFind(PetscOList,PetscObject,char**); 502 EXTERN int PetscOListAdd(PetscOList *,const char[],PetscObject); 503 EXTERN int PetscOListDuplicate(PetscOList,PetscOList *); 504 505 /* 506 Dynamic library lists. Lists of names of routines in dynamic 507 link libraries that will be loaded as needed. 508 */ 509 EXTERN int PetscFListAdd(PetscFList*,const char[],const char[],void (*)(void)); 510 EXTERN int PetscFListDestroy(PetscFList*); 511 EXTERN int PetscFListFind(MPI_Comm,PetscFList,const char[],void (**)(void)); 512 EXTERN int PetscFListPrintTypes(MPI_Comm,FILE*,const char[],const char[],char *,char *,PetscFList); 513 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 514 #define PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,0) 515 #else 516 #define PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,(void (*)(void))c) 517 #endif 518 EXTERN int PetscFListDuplicate(PetscFList,PetscFList *); 519 EXTERN int PetscFListView(PetscFList,PetscViewer); 520 EXTERN int PetscFListConcat(const char [],const char [],char []); 521 EXTERN int PetscFListGet(PetscFList,char ***,int*); 522 523 /*S 524 PetscDLLibraryList - Linked list of dynamics libraries to search for functions 525 526 Level: advanced 527 528 PETSC_USE_DYNAMIC_LIBRARIES must be defined in petscconf.h to use dynamic libraries 529 530 .seealso: PetscDLLibraryOpen() 531 S*/ 532 typedef struct _PetscDLLibraryList *PetscDLLibraryList; 533 extern PetscDLLibraryList DLLibrariesLoaded; 534 EXTERN int PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,int,PetscTruth *); 535 EXTERN int PetscDLLibraryOpen(MPI_Comm,const char[],void **); 536 EXTERN int PetscDLLibrarySym(MPI_Comm,PetscDLLibraryList *,const char[],const char[],void **); 537 EXTERN int PetscDLLibraryAppend(MPI_Comm,PetscDLLibraryList *,const char[]); 538 EXTERN int PetscDLLibraryPrepend(MPI_Comm,PetscDLLibraryList *,const char[]); 539 EXTERN int PetscDLLibraryClose(PetscDLLibraryList); 540 EXTERN int PetscDLLibraryPrintPath(void); 541 EXTERN int PetscDLLibraryGetInfo(void *,char *,char **); 542 543 /* 544 Mechanism for translating PETSc object representations between languages 545 Not currently used. 546 */ 547 typedef enum {PETSC_LANGUAGE_C,PETSC_LANGUAGE_CPP} PetscLanguage; 548 #define PETSC_LANGUAGE_F77 PETSC_LANGUAGE_C 549 EXTERN int PetscObjectComposeLanguage(PetscObject,PetscLanguage,void *); 550 EXTERN int PetscObjectQueryLanguage(PetscObject,PetscLanguage,void **); 551 552 /* 553 Useful utility routines 554 */ 555 EXTERN int PetscSplitOwnership(MPI_Comm,int*,int*); 556 EXTERN int PetscSplitOwnershipBlock(MPI_Comm,int,int*,int*); 557 EXTERN int PetscSequentialPhaseBegin(MPI_Comm,int); 558 EXTERN int PetscSequentialPhaseEnd(MPI_Comm,int); 559 EXTERN int PetscBarrier(PetscObject); 560 EXTERN int PetscMPIDump(FILE*); 561 562 #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE) 563 /* 564 Defines basic graphics available from PETSc. 565 */ 566 #include "petscdraw.h" 567 568 /* 569 Defines the base data structures for all PETSc objects 570 */ 571 #include "petschead.h" 572 573 /* 574 Defines PETSc profiling. 575 */ 576 #include "petsclog.h" 577 578 /* 579 For locking, unlocking and destroying AMS memories associated with 580 PETSc objects 581 */ 582 #if defined(PETSC_HAVE_AMS) 583 584 extern PetscTruth PetscAMSPublishAll; 585 #define PetscPublishAll(v) (PetscAMSPublishAll ? PetscObjectPublish((PetscObject)v) : 0) 586 #define PetscObjectTakeAccess(obj) ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_take_access(((PetscObject)(obj))->amem)) 587 #define PetscObjectGrantAccess(obj) ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_grant_access(((PetscObject)(obj))->amem)) 588 #define PetscObjectDepublish(obj) ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_destroy(((PetscObject)(obj))->amem)); \ 589 ((PetscObject)(obj))->amem = -1; 590 591 #else 592 593 #define PetscPublishAll(v) 0 594 #define PetscObjectTakeAccess(obj) 0 595 #define PetscObjectGrantAccess(obj) 0 596 #define PetscObjectDepublish(obj) 0 597 598 #endif 599 600 601 602 /* 603 This code allows one to pass a MPI communicator between 604 C and Fortran. MPI 2.0 defines a standard API for doing this. 605 The code here is provided to allow PETSc to work with MPI 1.1 606 standard MPI libraries. 607 */ 608 EXTERN int MPICCommToFortranComm(MPI_Comm,int *); 609 EXTERN int MPIFortranCommToCComm(int,MPI_Comm*); 610 611 /* 612 Simple PETSc parallel IO for ASCII printing 613 */ 614 EXTERN int PetscFixFilename(const char[],char[]); 615 EXTERN int PetscFOpen(MPI_Comm,const char[],const char[],FILE**); 616 EXTERN int PetscFClose(MPI_Comm,FILE*); 617 EXTERN int PetscFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4); 618 EXTERN int PetscPrintf(MPI_Comm,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 619 620 /*MC 621 PetscErrorPrintf - Prints error messages. 622 623 Not Collective 624 625 Synopsis: 626 int (*PetscErrorPrintf)(const char format[],...); 627 628 Input Parameters: 629 . format - the usual printf() format string 630 631 Options Database Keys: 632 . -error_output_stderr - cause error messages to be printed to stderr instead of the 633 (default) stdout 634 635 636 Level: developer 637 638 Fortran Note: 639 This routine is not supported in Fortran. 640 641 Concepts: error messages^printing 642 Concepts: printing^error messages 643 644 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf() 645 M*/ 646 EXTERN int (*PetscErrorPrintf)(const char[],...); 647 648 /*MC 649 PetscHelpPrintf - Prints help messages. 650 651 Not Collective 652 653 Synopsis: 654 int (*PetscHelpPrintf)(const char format[],...); 655 656 Input Parameters: 657 . format - the usual printf() format string 658 659 Level: developer 660 661 Fortran Note: 662 This routine is not supported in Fortran. 663 664 Concepts: help messages^printing 665 Concepts: printing^help messages 666 667 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf() 668 M*/ 669 EXTERN int (*PetscHelpPrintf)(MPI_Comm,const char[],...); 670 671 EXTERN int PetscPOpen(MPI_Comm,char *,char*,const char[],FILE **); 672 EXTERN int PetscPClose(MPI_Comm,FILE*); 673 EXTERN int PetscSynchronizedPrintf(MPI_Comm,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 674 EXTERN int PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4); 675 EXTERN int PetscSynchronizedFlush(MPI_Comm); 676 EXTERN int PetscSynchronizedFGets(MPI_Comm,FILE*,int,char[]); 677 EXTERN int PetscStartMatlab(MPI_Comm,char *,char*,FILE**); 678 EXTERN int PetscStartJava(MPI_Comm,char *,char*,FILE**); 679 EXTERN int PetscGetPetscDir(char**); 680 681 EXTERN int PetscPopUpSelect(MPI_Comm,char*,char*,int,char**,int*); 682 /*S 683 PetscObjectContainer - Simple PETSc object that contains a pointer to any required data 684 685 Level: advanced 686 687 .seealso: PetscObject, PetscObjectContainerCreate() 688 S*/ 689 typedef struct _p_PetscObjectContainer* PetscObjectContainer; 690 EXTERN int PetscObjectContainerGetPointer(PetscObjectContainer,void **); 691 EXTERN int PetscObjectContainerSetPointer(PetscObjectContainer,void *); 692 EXTERN int PetscObjectContainerDestroy(PetscObjectContainer); 693 EXTERN int PetscObjectContainerCreate(MPI_Comm comm,PetscObjectContainer *); 694 695 /* 696 For incremental debugging 697 */ 698 extern PetscTruth PetscCompare; 699 EXTERN int PetscCompareDouble(double); 700 EXTERN int PetscCompareScalar(PetscScalar); 701 EXTERN int PetscCompareInt(int); 702 703 /* 704 For use in debuggers 705 */ 706 extern int PetscGlobalRank,PetscGlobalSize; 707 EXTERN int PetscIntView(int,int[],PetscViewer); 708 EXTERN int PetscRealView(int,PetscReal[],PetscViewer); 709 EXTERN int PetscScalarView(int,PetscScalar[],PetscViewer); 710 711 /* 712 Allows accessing Matlab Engine 713 */ 714 #include "petscengine.h" 715 716 /* 717 C code optimization is often enhanced by telling the compiler 718 that certain pointer arguments to functions are not aliased to 719 to other arguments. This is not yet ANSI C standard so we define 720 the macro "restrict" to indicate that the variable is not aliased 721 to any other argument. 722 */ 723 #if defined(PETSC_HAVE_RESTRICT) && !defined(__cplusplus) 724 #define restrict _Restrict 725 #else 726 #if defined(restrict) 727 #undef restrict 728 #endif 729 #define restrict 730 #endif 731 732 /* 733 Determine if some of the kernel computation routines use 734 Fortran (rather than C) for the numerical calculations. On some machines 735 and compilers (like complex numbers) the Fortran version of the routines 736 is faster than the C/C++ versions. The flag PETSC_USE_FORTRAN_KERNELS 737 would be set in the petscconf.h file 738 */ 739 #if defined(PETSC_USE_FORTRAN_KERNELS) 740 741 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ) 742 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ 743 #endif 744 745 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ) 746 #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ 747 #endif 748 749 #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM) 750 #define PETSC_USE_FORTRAN_KERNEL_NORM 751 #endif 752 753 #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY) 754 #define PETSC_USE_FORTRAN_KERNEL_MAXPY 755 #endif 756 757 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ) 758 #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ 759 #endif 760 761 #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 762 #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ 763 #endif 764 765 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ) 766 #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ 767 #endif 768 769 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ) 770 #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ 771 #endif 772 773 #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT) 774 #define PETSC_USE_FORTRAN_KERNEL_MDOT 775 #endif 776 777 #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY) 778 #define PETSC_USE_FORTRAN_KERNEL_XTIMESY 779 #endif 780 781 #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX) 782 #define PETSC_USE_FORTRAN_KERNEL_AYPX 783 #endif 784 785 #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY) 786 #define PETSC_USE_FORTRAN_KERNEL_WAXPY 787 #endif 788 789 #endif 790 791 /* 792 Macros for indicating code that should be compiled with a C interface, 793 rather than a C++ interface. Any routines that are dynamically loaded 794 (such as the PCCreate_XXX() routines) must be wrapped so that the name 795 mangler does not change the functions symbol name. This just hides the 796 ugly extern "C" {} wrappers. 797 */ 798 #if defined(__cplusplus) 799 #define EXTERN_C_BEGIN extern "C" { 800 #define EXTERN_C_END } 801 #else 802 #define EXTERN_C_BEGIN 803 #define EXTERN_C_END 804 #endif 805 806 /* --------------------------------------------------------------------*/ 807 808 /*M 809 size - integer variable used to contain the number of processors in 810 the relevent MPI_Comm 811 812 Level: beginner 813 814 .seealso: rank, comm 815 M*/ 816 817 /*M 818 rank - integer variable used to contain the number of this processor relative 819 to all in the relevent MPI_Comm 820 821 Level: beginner 822 823 .seealso: size, comm 824 M*/ 825 826 /*M 827 comm - MPI_Comm used in the current routine or object 828 829 Level: beginner 830 831 .seealso: size, rank 832 M*/ 833 834 /*M 835 MPI_Comm - the basic object used by MPI to determine which processes are involved in a 836 communication 837 838 Level: beginner 839 840 Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm 841 842 .seealso: size, rank, comm, PETSC_COMM_WORLD, PETSC_COMM_SELF 843 M*/ 844 845 /*M 846 PetscScalar - PETSc type that represents either a double precision real number or 847 a double precision complex number if the code is compiled with BOPT=g_complex or O_complex 848 849 Level: beginner 850 851 .seealso: PetscReal, PassiveReal, PassiveScalar 852 M*/ 853 854 /*M 855 PetscReal - PETSc type that represents a double precision real number 856 857 Level: beginner 858 859 .seealso: PetscScalar, PassiveReal, PassiveScalar 860 M*/ 861 862 /*M 863 PassiveScalar - PETSc type that represents either a double precision real number or 864 a double precision complex number if the code is compiled with BOPT=g_complex or O_complex 865 866 Level: beginner 867 868 This is the same as a PetscScalar except in code that is automatically differentiated it is 869 treated as a constant (not an indendent or dependent variable) 870 871 .seealso: PetscReal, PassiveReal, PetscScalar 872 M*/ 873 874 /*M 875 PassiveReal - PETSc type that represents a double precision real number 876 877 Level: beginner 878 879 This is the same as a PetscReal except in code that is automatically differentiated it is 880 treated as a constant (not an indendent or dependent variable) 881 882 .seealso: PetscScalar, PetscReal, PassiveScalar 883 M*/ 884 885 /* 886 The IBM include files define hz, here we hide it so that it may be used 887 as a regular user variable. 888 */ 889 #if defined(hz) 890 #undef hz 891 #endif 892 893 /* For arrays that contain filenames or paths */ 894 895 896 #if defined(PETSC_HAVE_LIMITS_H) 897 #include <limits.h> 898 #endif 899 #if defined(PETSC_HAVE_SYS_PARAM_H) 900 #include <sys/param.h> 901 #endif 902 903 #if defined(MAXPATHLEN) 904 # define PETSC_MAX_PATH_LEN MAXPATHLEN 905 #elif defined(MAX_PATH) 906 # define PETSC_MAX_PATH_LEN MAX_PATH 907 #elif defined(_MAX_PATH) 908 # define PETSC_MAX_PATH_LEN _MAX_PATH 909 #else 910 # define PETSC_MAX_PATH_LEN 4096 911 #endif 912 913 PETSC_EXTERN_CXX_END 914 #endif 915 916 917