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