1 #define PETSC_DLL 2 /* 3 This file defines the initialization of PETSc, including PetscInitialize() 4 */ 5 6 #include "petsc.h" /*I "petsc.h" I*/ 7 #include "petscsys.h" 8 9 #if defined(PETSC_USE_LOG) 10 EXTERN PetscErrorCode PetscLogBegin_Private(void); 11 #endif 12 13 /* -----------------------------------------------------------------------------------------*/ 14 15 extern FILE *petsc_history; 16 17 EXTERN PetscErrorCode PetscInitialize_DynamicLibraries(void); 18 EXTERN PetscErrorCode PetscFinalize_DynamicLibraries(void); 19 EXTERN PetscErrorCode PetscFListDestroyAll(void); 20 EXTERN PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int); 21 EXTERN PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int); 22 EXTERN PetscErrorCode PetscLogCloseHistoryFile(FILE **); 23 EXTERN PetscErrorCode PetscOptionsHelpDestroyList(void); 24 25 /* this is used by the _, __, and ___ macros (see include/petscerror.h) */ 26 PetscErrorCode __gierr = 0; 27 28 /* user may set this BEFORE calling PetscInitialize() */ 29 MPI_Comm PETSC_COMM_WORLD = 0; 30 31 /* 32 Declare and set all the string names of the PETSc enums 33 */ 34 const char *PetscTruths[] = {"FALSE","TRUE","PetscTruth","PETSC_",0}; 35 const char *PetscDataTypes[] = {"INT", "DOUBLE", "COMPLEX", 36 "LONG","SHORT", "FLOAT", 37 "CHAR","LOGICAL","ENUM","TRUTH","LONGDOUBLE","PetscDataType","PETSC_",0}; 38 39 PetscCookie PETSC_LARGEST_COOKIE = PETSC_SMALLEST_COOKIE; 40 PetscCookie PETSC_OBJECT_COOKIE = 0; 41 42 PetscTruth PetscPreLoadingUsed = PETSC_FALSE; 43 PetscTruth PetscPreLoadingOn = PETSC_FALSE; 44 45 PetscErrorCode PETSC_DLLEXPORT PetscCookieRegister(PetscCookie *cookie) 46 { 47 if (*cookie == PETSC_DECIDE || *cookie == PETSC_NULL) { 48 *cookie = ++PETSC_LARGEST_COOKIE; 49 } else if (*cookie > 0) { 50 /* Need to check here for montonicity and insert if necessary */ 51 return 0; 52 } else { 53 SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Invalid suggested cookie %d", (int)*cookie); 54 } 55 return 0; 56 } 57 58 /* 59 Checks the options database for initializations related to the 60 PETSc components 61 */ 62 #undef __FUNCT__ 63 #define __FUNCT__ "PetscOptionsCheckInitial_Components" 64 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Components(void) 65 { 66 PetscTruth flg1; 67 PetscErrorCode ierr; 68 69 PetscFunctionBegin; 70 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 71 if (flg1) { 72 #if defined (PETSC_USE_LOG) 73 MPI_Comm comm = PETSC_COMM_WORLD; 74 ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr); 75 ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr); 76 ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr); 77 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 78 #endif 79 } 80 PetscFunctionReturn(0); 81 } 82 83 #undef __FUNCT__ 84 #define __FUNCT__ "PetscInitializeNoArguments" 85 /*@C 86 PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without 87 the command line arguments. 88 89 Collective 90 91 Level: advanced 92 93 .seealso: PetscInitialize(), PetscInitializeFortran() 94 @*/ 95 PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void) 96 { 97 PetscErrorCode ierr; 98 int argc = 0; 99 char **args = 0; 100 101 PetscFunctionBegin; 102 ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL); 103 PetscFunctionReturn(ierr); 104 } 105 106 #undef __FUNCT__ 107 #define __FUNCT__ "PetscInitialized" 108 /*@ 109 PetscInitialized - Determine whether PETSc is initialized. 110 111 Level: beginner 112 113 .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 114 @*/ 115 PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *isInitialized) 116 { 117 PetscFunctionBegin; 118 PetscValidPointer(isInitialized, 1); 119 *isInitialized = PetscInitializeCalled; 120 PetscFunctionReturn(0); 121 } 122 123 #undef __FUNCT__ 124 #define __FUNCT__ "PetscFinalized" 125 /*@ 126 PetscFinalized - Determine whether PetscFinalize() has been called yet 127 128 Level: developer 129 130 .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran() 131 @*/ 132 PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *isFinalized) 133 { 134 PetscFunctionBegin; 135 PetscValidPointer(isFinalized, 1); 136 *isFinalized = PetscFinalizeCalled; 137 PetscFunctionReturn(0); 138 } 139 140 EXTERN PetscErrorCode PetscOptionsCheckInitial_Private(void); 141 extern PetscTruth PetscBeganMPI; 142 143 /* 144 This function is the MPI reduction operation used to compute the sum of the 145 first half of the datatype and the max of the second half. 146 */ 147 MPI_Op PetscMaxSum_Op = 0; 148 149 EXTERN_C_BEGIN 150 #undef __FUNCT__ 151 #define __FUNCT__ "PetscMaxSum_Local" 152 void PETSC_DLLEXPORT PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype) 153 { 154 PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt; 155 156 PetscFunctionBegin; 157 if (*datatype != MPIU_2INT) { 158 (*PetscErrorPrintf)("Can only handle MPIU_2INT data types"); 159 MPI_Abort(MPI_COMM_WORLD,1); 160 } 161 162 for (i=0; i<count; i++) { 163 xout[2*i] = PetscMax(xout[2*i],xin[2*i]); 164 xout[2*i+1] += xin[2*i+1]; 165 } 166 PetscStackPop; 167 return; 168 } 169 EXTERN_C_END 170 171 /* 172 Returns the max of the first entry owned by this processor and the 173 sum of the second entry. 174 */ 175 #undef __FUNCT__ 176 #define __FUNCT__ "PetscMaxSum" 177 PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum) 178 { 179 PetscMPIInt size,rank; 180 PetscInt *work; 181 PetscErrorCode ierr; 182 183 PetscFunctionBegin; 184 ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 185 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 186 ierr = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr); 187 ierr = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr); 188 *max = work[2*rank]; 189 *sum = work[2*rank+1]; 190 ierr = PetscFree(work);CHKERRQ(ierr); 191 PetscFunctionReturn(0); 192 } 193 194 /* ----------------------------------------------------------------------------*/ 195 MPI_Op PETSC_DLLEXPORT PetscADMax_Op = 0; 196 197 EXTERN_C_BEGIN 198 #undef __FUNCT__ 199 #define __FUNCT__ "PetscADMax_Local" 200 void PETSC_DLLEXPORT PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 201 { 202 PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 203 PetscInt i,count = *cnt; 204 205 PetscFunctionBegin; 206 if (*datatype != MPIU_2SCALAR) { 207 (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 208 MPI_Abort(MPI_COMM_WORLD,1); 209 } 210 211 for (i=0; i<count; i++) { 212 if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) { 213 xout[2*i] = xin[2*i]; 214 xout[2*i+1] = xin[2*i+1]; 215 } 216 } 217 218 PetscStackPop; 219 return; 220 } 221 EXTERN_C_END 222 223 MPI_Op PETSC_DLLEXPORT PetscADMin_Op = 0; 224 225 EXTERN_C_BEGIN 226 #undef __FUNCT__ 227 #define __FUNCT__ "PetscADMin_Local" 228 void PETSC_DLLEXPORT PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 229 { 230 PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 231 PetscInt i,count = *cnt; 232 233 PetscFunctionBegin; 234 if (*datatype != MPIU_2SCALAR) { 235 (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types"); 236 MPI_Abort(MPI_COMM_WORLD,1); 237 } 238 239 for (i=0; i<count; i++) { 240 if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) { 241 xout[2*i] = xin[2*i]; 242 xout[2*i+1] = xin[2*i+1]; 243 } 244 } 245 246 PetscStackPop; 247 return; 248 } 249 EXTERN_C_END 250 /* ---------------------------------------------------------------------------------------*/ 251 252 #if defined(PETSC_USE_COMPLEX) 253 MPI_Op PetscSum_Op = 0; 254 255 EXTERN_C_BEGIN 256 #undef __FUNCT__ 257 #define __FUNCT__ "PetscSum_Local" 258 void PETSC_DLLEXPORT PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype) 259 { 260 PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out; 261 PetscInt i,count = *cnt; 262 263 PetscFunctionBegin; 264 if (*datatype != MPIU_SCALAR) { 265 (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types"); 266 MPI_Abort(MPI_COMM_WORLD,1); 267 } 268 269 for (i=0; i<count; i++) { 270 xout[i] += xin[i]; 271 } 272 273 PetscStackPop; 274 return; 275 } 276 EXTERN_C_END 277 #endif 278 279 static int PetscGlobalArgc = 0; 280 static char **PetscGlobalArgs = 0; 281 282 #undef __FUNCT__ 283 #define __FUNCT__ "PetscGetArgs" 284 /*@C 285 PetscGetArgs - Allows you to access the raw command line arguments anywhere 286 after PetscInitialize() is called but before PetscFinalize(). 287 288 Not Collective 289 290 Output Parameters: 291 + argc - count of number of command line arguments 292 - args - the command line arguments 293 294 Level: intermediate 295 296 Notes: 297 This is usually used to pass the command line arguments into other libraries 298 that are called internally deep in PETSc or the application. 299 300 Concepts: command line arguments 301 302 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments() 303 304 @*/ 305 PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int *argc,char ***args) 306 { 307 PetscFunctionBegin; 308 if (!PetscGlobalArgs) { 309 SETERRQ(PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 310 } 311 *argc = PetscGlobalArgc; 312 *args = PetscGlobalArgs; 313 PetscFunctionReturn(0); 314 } 315 316 #undef __FUNCT__ 317 #define __FUNCT__ "PetscGetArguments" 318 /*@C 319 PetscGetArguments - Allows you to access the command line arguments anywhere 320 after PetscInitialize() is called but before PetscFinalize(). 321 322 Not Collective 323 324 Output Parameters: 325 . args - the command line arguments 326 327 Level: intermediate 328 329 Notes: 330 This does NOT start with the program name and IS null terminated (final arg is void) 331 332 Concepts: command line arguments 333 334 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments() 335 336 @*/ 337 PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***args) 338 { 339 PetscInt i,argc = PetscGlobalArgc; 340 PetscErrorCode ierr; 341 342 PetscFunctionBegin; 343 if (!PetscGlobalArgs) { 344 SETERRQ(PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()"); 345 } 346 ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr); 347 for (i=0; i<argc-1; i++) { 348 ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr); 349 } 350 (*args)[argc-1] = 0; 351 PetscFunctionReturn(0); 352 } 353 354 #undef __FUNCT__ 355 #define __FUNCT__ "PetscFreeArguments" 356 /*@C 357 PetscFreeArguments - Frees the memory obtained with PetscGetArguments() 358 359 Not Collective 360 361 Output Parameters: 362 . args - the command line arguments 363 364 Level: intermediate 365 366 Concepts: command line arguments 367 368 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments() 369 370 @*/ 371 PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **args) 372 { 373 PetscInt i = 0; 374 PetscErrorCode ierr; 375 376 PetscFunctionBegin; 377 while (args[i]) { 378 ierr = PetscFree(args[i]);CHKERRQ(ierr); 379 i++; 380 } 381 ierr = PetscFree(args);CHKERRQ(ierr); 382 PetscFunctionReturn(0); 383 } 384 385 #undef __FUNCT__ 386 #define __FUNCT__ "PetscInitialize" 387 /*@C 388 PetscInitialize - Initializes the PETSc database and MPI. 389 PetscInitialize() calls MPI_Init() if that has yet to be called, 390 so this routine should always be called near the beginning of 391 your program -- usually the very first line! 392 393 Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set 394 395 Input Parameters: 396 + argc - count of number of command line arguments 397 . args - the command line arguments 398 . file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for 399 code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 400 - help - [optional] Help message to print, use PETSC_NULL for no message 401 402 If you wish PETSc to run on a subcommunicator of MPI_COMM_WORLD, create that 403 communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize() 404 405 Options Database Keys: 406 + -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger 407 . -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected 408 . -on_error_emacs <machinename> causes emacsclient to jump to error file 409 . -on_error_abort calls abort() when error detected (no traceback) 410 . -on_error_stop calls MPI_abort() when error detected 411 . -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger 412 . -debugger_pause [sleeptime] (in seconds) - Pauses debugger 413 . -stop_for_debugger - Print message on how to attach debugger manually to 414 process and wait (-debugger_pause) seconds for attachment 415 . -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries) 416 . -malloc no - Indicates not to use error-checking malloc 417 . -malloc_debug - check for memory corruption at EVERY malloc or free 418 . -fp_trap - Stops on floating point exceptions (Note that on the 419 IBM RS6000 this slows code by at least a factor of 10.) 420 . -no_signal_handler - Indicates not to trap error signals 421 . -shared_tmp - indicates /tmp directory is shared by all processors 422 . -not_shared_tmp - each processor has own /tmp 423 . -tmp - alternative name of /tmp directory 424 . -get_total_flops - returns total flops done by all processors 425 - -memory_info - Print memory usage at end of run 426 427 Options Database Keys for Profiling: 428 See the Profiling chapter of the users manual for details. 429 + -log_trace [filename] - Print traces of all PETSc calls 430 to the screen (useful to determine where a program 431 hangs without running in the debugger). See PetscLogTraceBegin(). 432 . -info <optional filename> - Prints verbose information to the screen 433 - -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages 434 435 Environmental Variables: 436 + PETSC_TMP - alternative tmp directory 437 . PETSC_SHARED_TMP - tmp is shared by all processes 438 . PETSC_NOT_SHARED_TMP - each process has its own private tmp 439 . PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer 440 - PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to 441 442 443 Level: beginner 444 445 Notes: 446 If for some reason you must call MPI_Init() separately, call 447 it before PetscInitialize(). 448 449 Fortran Version: 450 In Fortran this routine has the format 451 $ call PetscInitialize(file,ierr) 452 453 + ierr - error return code 454 - file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_CHARACTER_NULL to not check for 455 code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files 456 457 Important Fortran Note: 458 In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a 459 null character string; you CANNOT just use PETSC_NULL as 460 in the C version. See the users manual for details. 461 462 463 Concepts: initializing PETSc 464 465 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs() 466 467 @*/ 468 PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int *argc,char ***args,const char file[],const char help[]) 469 { 470 PetscErrorCode ierr; 471 PetscMPIInt flag, size,nodesize; 472 PetscTruth flg; 473 char hostname[256]; 474 475 PetscFunctionBegin; 476 if (PetscInitializeCalled) PetscFunctionReturn(0); 477 478 /* this must be initialized in a routine, not as a constant declaration*/ 479 PETSC_STDOUT = stdout; 480 481 ierr = PetscOptionsCreate();CHKERRQ(ierr); 482 483 /* 484 We initialize the program name here (before MPI_Init()) because MPICH has a bug in 485 it that it sets args[0] on all processors to be args[0] on the first processor. 486 */ 487 if (argc && *argc) { 488 ierr = PetscSetProgramName(**args);CHKERRQ(ierr); 489 } else { 490 ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr); 491 } 492 493 494 ierr = MPI_Initialized(&flag);CHKERRQ(ierr); 495 if (!flag) { 496 if (PETSC_COMM_WORLD) SETERRQ(PETSC_ERR_SUP,"You cannot set PETSC_COMM_WORLD if you have not initialized MPI first"); 497 ierr = MPI_Init(argc,args);CHKERRQ(ierr); 498 PetscBeganMPI = PETSC_TRUE; 499 } 500 if (argc && args) { 501 PetscGlobalArgc = *argc; 502 PetscGlobalArgs = *args; 503 } 504 PetscInitializeCalled = PETSC_TRUE; 505 PetscFinalizeCalled = PETSC_FALSE; 506 507 if (!PETSC_COMM_WORLD) { 508 PETSC_COMM_WORLD = MPI_COMM_WORLD; 509 } 510 511 /* Done after init due to a bug in MPICH-GM? */ 512 ierr = PetscErrorPrintfInitialize();CHKERRQ(ierr); 513 514 ierr = MPI_Comm_rank(MPI_COMM_WORLD,&PetscGlobalRank);CHKERRQ(ierr); 515 ierr = MPI_Comm_size(MPI_COMM_WORLD,&PetscGlobalSize);CHKERRQ(ierr); 516 517 #if defined(PETSC_USE_COMPLEX) 518 /* 519 Initialized the global complex variable; this is because with 520 shared libraries the constructors for global variables 521 are not called; at least on IRIX. 522 */ 523 { 524 #if defined(PETSC_CLANGUAGE_CXX) 525 PetscScalar ic(0.0,1.0); 526 PETSC_i = ic; 527 #else 528 PetscScalar ic; 529 ic = 1.I; 530 PETSC_i = ic; 531 #endif 532 } 533 534 ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPIU_COMPLEX);CHKERRQ(ierr); 535 ierr = MPI_Type_commit(&MPIU_COMPLEX);CHKERRQ(ierr); 536 ierr = MPI_Op_create(PetscSum_Local,1,&PetscSum_Op);CHKERRQ(ierr); 537 #endif 538 539 /* 540 Create the PETSc MPI reduction operator that sums of the first 541 half of the entries and maxes the second half. 542 */ 543 ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr); 544 545 ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr); 546 ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr); 547 ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr); 548 ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr); 549 550 ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr); 551 ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr); 552 553 /* 554 Build the options database and check for user setup requests 555 */ 556 ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr); 557 558 /* 559 Print main application help message 560 */ 561 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr); 562 if (help && flg) { 563 ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr); 564 } 565 ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr); 566 567 /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */ 568 #if defined(PETSC_USE_LOG) 569 ierr = PetscLogBegin_Private();CHKERRQ(ierr); 570 #endif 571 572 /* 573 Load the dynamic libraries (on machines that support them), this registers all 574 the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes) 575 */ 576 ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr); 577 578 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 579 ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr); 580 ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr); 581 ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr); 582 583 ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr); 584 /* Check the options database for options related to the options database itself */ 585 ierr = PetscOptionsSetFromOptions(); CHKERRQ(ierr); 586 587 ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_spawn_size",&nodesize,&flg);CHKERRQ(ierr); 588 if (flg) { 589 #if defined(PETSC_HAVE_MPI_COMM_SPAWN) 590 ierr = PetscOpenMPSpawn(nodesize);CHKERRQ(ierr); 591 #else 592 SETERRQ(PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -openmp_merge_size instead"); 593 #endif 594 } else { 595 ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_merge_size",&nodesize,&flg);CHKERRQ(ierr); 596 if (flg) { 597 ierr = PetscOpenMPMerge(nodesize);CHKERRQ(ierr); 598 } 599 } 600 601 PetscFunctionReturn(ierr); 602 } 603 604 605 #undef __FUNCT__ 606 #define __FUNCT__ "PetscFinalize" 607 /*@C 608 PetscFinalize - Checks for options to be called at the conclusion 609 of the program. MPI_Finalize() is called only if the user had not 610 called MPI_Init() before calling PetscInitialize(). 611 612 Collective on PETSC_COMM_WORLD 613 614 Options Database Keys: 615 + -options_table - Calls PetscOptionsPrint() 616 . -options_left - Prints unused options that remain in the database 617 . -options_left no - Does not print unused options that remain in the database 618 . -mpidump - Calls PetscMPIDump() 619 . -malloc_dump - Calls PetscMallocDump() 620 . -malloc_info - Prints total memory usage 621 - -malloc_log - Prints summary of memory usage 622 623 Options Database Keys for Profiling: 624 See the Profiling chapter of the users manual for details. 625 + -log_summary [filename] - Prints summary of flop and timing 626 information to screen. If the filename is specified the 627 summary is written to the file. (for code compiled with 628 PETSC_USE_LOG). See PetscLogPrintSummary(). 629 . -log_all [filename] - Logs extensive profiling information 630 (for code compiled with PETSC_USE_LOG). See PetscLogDump(). 631 . -log [filename] - Logs basic profiline information (for 632 code compiled with PETSC_USE_LOG). See PetscLogDump(). 633 . -log_sync - Log the synchronization in scatters, inner products 634 and norms 635 - -log_mpe [filename] - Creates a logfile viewable by the 636 utility Upshot/Nupshot (in MPICH distribution) 637 638 Level: beginner 639 640 Note: 641 See PetscInitialize() for more general runtime options. 642 643 .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscEnd() 644 @*/ 645 PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void) 646 { 647 PetscErrorCode ierr; 648 PetscMPIInt rank; 649 int nopt; 650 PetscTruth flg1,flg2,flg3; 651 652 PetscFunctionBegin; 653 654 if (!PetscInitializeCalled) { 655 (*PetscErrorPrintf)("PetscInitialize() must be called before PetscFinalize()\n"); 656 PetscFunctionReturn(0); 657 } 658 ierr = PetscOpenMPFinalize();CHKERRQ(ierr); 659 660 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 661 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_info",&flg2);CHKERRQ(ierr); 662 if (!flg2) { 663 ierr = PetscOptionsHasName(PETSC_NULL,"-memory_info",&flg2);CHKERRQ(ierr); 664 } 665 if (flg2) { 666 ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr); 667 } 668 669 /* Destroy auxiliary packages */ 670 #if defined(PETSC_HAVE_MATHEMATICA) 671 ierr = PetscViewerMathematicaFinalizePackage();CHKERRQ(ierr); 672 #endif 673 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 674 #if defined(PETSC_HAVE_SIEVE) 675 { 676 PetscErrorCode (*func)(void); 677 char lib[PETSC_MAX_PATH_LEN]; 678 679 ierr = PetscStrcpy(lib,"${PETSC_LIB_DIR}");CHKERRQ(ierr); 680 ierr = PetscStrcat(lib,"/libpetscdm");CHKERRQ(ierr); 681 ierr = PetscDLLibrarySym(PETSC_COMM_WORLD,&DLLibrariesLoaded,lib,"DMFinalizePackage",(void **) &func);CHKERRQ(ierr); 682 if (func) { 683 ierr = (*func)();CHKERRQ(ierr); 684 } 685 } 686 #endif 687 #endif 688 689 /* 690 Destroy all the function registration lists created 691 */ 692 ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr); 693 694 #if defined(PETSC_USE_LOG) 695 ierr = PetscOptionsHasName(PETSC_NULL,"-get_total_flops",&flg1);CHKERRQ(ierr); 696 if (flg1) { 697 PetscLogDouble flops = 0; 698 ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 699 ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr); 700 } 701 #endif 702 703 /* 704 Free all objects registered with PetscObjectRegisterDestroy() such ast 705 PETSC_VIEWER_XXX_(). 706 */ 707 ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr); 708 ierr = PetscOptionsHelpDestroyList();CHKERRQ(ierr); 709 710 #if defined(PETSC_USE_DEBUG) 711 if (PetscStackActive) { 712 ierr = PetscStackDestroy();CHKERRQ(ierr); 713 } 714 #endif 715 716 #if defined(PETSC_USE_LOG) 717 { 718 char mname[PETSC_MAX_PATH_LEN]; 719 #if defined(PETSC_HAVE_MPE) 720 mname[0] = 0; 721 ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 722 if (flg1){ 723 if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);} 724 else {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);} 725 } 726 #endif 727 mname[0] = 0; 728 ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 729 if (flg1) { 730 if (mname[0]) {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);} 731 else {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,0);CHKERRQ(ierr);} 732 } 733 734 mname[0] = 0; 735 ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 736 ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr); 737 if (flg1 || flg2){ 738 if (mname[0]) PetscLogDump(mname); 739 else PetscLogDump(0); 740 } 741 ierr = PetscLogDestroy();CHKERRQ(ierr); 742 } 743 #endif 744 ierr = PetscOptionsHasName(PETSC_NULL,"-no_signal_handler",&flg1);CHKERRQ(ierr); 745 if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);} 746 ierr = PetscOptionsHasName(PETSC_NULL,"-mpidump",&flg1);CHKERRQ(ierr); 747 if (flg1) { 748 ierr = PetscMPIDump(stdout);CHKERRQ(ierr); 749 } 750 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr); 751 ierr = PetscOptionsHasName(PETSC_NULL,"-options_table",&flg2);CHKERRQ(ierr); 752 if (flg2) { 753 if (!rank) {ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);} 754 } 755 756 /* to prevent PETSc -options_left from warning */ 757 ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr) 758 ierr = PetscOptionsHasName(PETSC_NULL,"-error_output_stderr",&flg1);CHKERRQ(ierr); 759 760 flg3 = PETSC_FALSE; /* default value is required */ 761 ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr); 762 ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr); 763 if (flg3) { 764 if (!flg2) { /* have not yet printed the options */ 765 ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr); 766 } 767 if (!nopt) { 768 ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr); 769 } else if (nopt == 1) { 770 ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr); 771 } else { 772 ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %d unused database options. They are:\n",nopt);CHKERRQ(ierr); 773 } 774 } 775 #if defined(PETSC_USE_DEBUG) 776 if (nopt && !flg3 && !flg1) { 777 ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr); 778 ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr); 779 ierr = PetscOptionsLeft();CHKERRQ(ierr); 780 } else if (nopt && flg3) { 781 #else 782 if (nopt && flg3) { 783 #endif 784 ierr = PetscOptionsLeft();CHKERRQ(ierr); 785 } 786 787 ierr = PetscOptionsHasName(PETSC_NULL,"-log_history",&flg1);CHKERRQ(ierr); 788 if (flg1) { 789 ierr = PetscLogCloseHistoryFile(&petsc_history);CHKERRQ(ierr); 790 petsc_history = 0; 791 } 792 793 ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr); 794 795 /* 796 Free all the registered create functions, such as KSPList, VecList, SNESList, etc 797 */ 798 ierr = PetscFListDestroyAll();CHKERRQ(ierr); 799 800 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr); 801 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr); 802 if (flg1) { 803 char fname[PETSC_MAX_PATH_LEN]; 804 FILE *fd; 805 806 fname[0] = 0; 807 ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr); 808 if (flg1 && fname[0]) { 809 char sname[PETSC_MAX_PATH_LEN]; 810 811 sprintf(sname,"%s_%d",fname,rank); 812 fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 813 ierr = PetscMallocDump(fd);CHKERRQ(ierr); 814 fclose(fd); 815 } else { 816 MPI_Comm local_comm; 817 818 ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr); 819 ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr); 820 ierr = PetscMallocDump(stdout);CHKERRQ(ierr); 821 ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr); 822 ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr); 823 } 824 } 825 if (flg3) { 826 char fname[PETSC_MAX_PATH_LEN]; 827 FILE *fd; 828 829 fname[0] = 0; 830 ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr); 831 if (flg1 && fname[0]) { 832 char sname[PETSC_MAX_PATH_LEN]; 833 834 sprintf(sname,"%s_%d",fname,rank); 835 fd = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname); 836 ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr); 837 fclose(fd); 838 } else { 839 ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr); 840 } 841 } 842 /* Can be destroyed only after all the options are used */ 843 ierr = PetscOptionsDestroy();CHKERRQ(ierr); 844 845 PetscGlobalArgc = 0; 846 PetscGlobalArgs = 0; 847 848 #if defined(PETSC_USE_COMPLEX) 849 ierr = MPI_Op_free(&PetscSum_Op);CHKERRQ(ierr); 850 ierr = MPI_Type_free(&MPIU_COMPLEX);CHKERRQ(ierr); 851 #endif 852 ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr); 853 ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr); 854 ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr); 855 ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr); 856 ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr); 857 858 ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr); 859 if (PetscBeganMPI) { 860 ierr = MPI_Finalize();CHKERRQ(ierr); 861 } 862 863 /* 864 865 Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because 866 the communicator has some outstanding requests on it. Specifically if the 867 flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See 868 src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate() 869 is never freed as it should be. Thus one may obtain messages of the form 870 [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the 871 memory was not freed. 872 873 */ 874 ierr = PetscClearMalloc();CHKERRQ(ierr); 875 PetscInitializeCalled = PETSC_FALSE; 876 PetscFinalizeCalled = PETSC_TRUE; 877 PetscFunctionReturn(ierr); 878 } 879 880 /* 881 These may be used in code that ADIC is to be used on 882 */ 883 884 #undef __FUNCT__ 885 #define __FUNCT__ "PetscGlobalMax" 886 /*@C 887 PetscGlobalMax - Computes the maximum value over several processors 888 889 Collective on MPI_Comm 890 891 Input Parameters: 892 + local - the local value 893 - comm - the processors that find the maximum 894 895 Output Parameter: 896 . result - the maximum value 897 898 Level: intermediate 899 900 Notes: 901 These functions are to be used inside user functions that are to be processed with 902 ADIC. PETSc will automatically provide differentiated versions of these functions 903 904 .seealso: PetscGlobalMin(), PetscGlobalSum() 905 @*/ 906 PetscErrorCode PETSC_DLLEXPORT PetscGlobalMax(PetscReal* local,PetscReal* result,MPI_Comm comm) 907 { 908 return MPI_Allreduce(local,result,1,MPIU_REAL,MPI_MAX,comm); 909 } 910 911 #undef __FUNCT__ 912 #define __FUNCT__ "PetscGlobalMin" 913 /*@C 914 PetscGlobalMin - Computes the minimum value over several processors 915 916 Collective on MPI_Comm 917 918 Input Parameters: 919 + local - the local value 920 - comm - the processors that find the minimum 921 922 Output Parameter: 923 . result - the minimum value 924 925 Level: intermediate 926 927 Notes: 928 These functions are to be used inside user functions that are to be processed with 929 ADIC. PETSc will automatically provide differentiated versions of these functions 930 931 .seealso: PetscGlobalMax(), PetscGlobalSum() 932 @*/ 933 PetscErrorCode PETSC_DLLEXPORT PetscGlobalMin(PetscReal* local,PetscReal* result,MPI_Comm comm) 934 { 935 return MPI_Allreduce(local,result,1,MPIU_REAL,MPI_MIN,comm); 936 } 937 938 #undef __FUNCT__ 939 #define __FUNCT__ "PetscGlobalSum" 940 /*@C 941 PetscGlobalSum - Computes the sum over sever processors 942 943 Collective on MPI_Comm 944 945 Input Parameters: 946 + local - the local value 947 - comm - the processors that find the sum 948 949 Output Parameter: 950 . result - the sum 951 952 Level: intermediate 953 954 Notes: 955 These functions are to be used inside user functions that are to be processed with 956 ADIC. PETSc will automatically provide differentiated versions of these functions 957 958 .seealso: PetscGlobalMin(), PetscGlobalMax() 959 @*/ 960 PetscErrorCode PETSC_DLLEXPORT PetscGlobalSum(PetscScalar* local,PetscScalar* result,MPI_Comm comm) 961 { 962 return MPI_Allreduce(local,result,1,MPIU_SCALAR,PetscSum_Op,comm); 963 } 964 965 966