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