1 #define PETSC_DLL 2 /* 3 4 This file defines part of the initialization of PETSc 5 6 This file uses regular malloc and free because it cannot know 7 what malloc is being used until it has already processed the input. 8 */ 9 10 #include "petsc.h" /*I "petsc.h" I*/ 11 #include "petscsys.h" 12 #if defined(PETSC_HAVE_STDLIB_H) 13 #include <stdlib.h> 14 #endif 15 #if defined(PETSC_HAVE_MALLOC_H) 16 #include <malloc.h> 17 #endif 18 #include "petscfix.h" 19 20 /* ------------------------Nasty global variables -------------------------------*/ 21 /* 22 Indicates if PETSc started up MPI, or it was 23 already started before PETSc was initialized. 24 */ 25 PetscTruth PETSC_DLLEXPORT PetscBeganMPI = PETSC_FALSE; 26 PetscTruth PETSC_DLLEXPORT PetscInitializeCalled = PETSC_FALSE; 27 PetscTruth PETSC_DLLEXPORT PetscFinalizeCalled = PETSC_FALSE; 28 PetscMPIInt PETSC_DLLEXPORT PetscGlobalRank = -1; 29 PetscMPIInt PETSC_DLLEXPORT PetscGlobalSize = -1; 30 31 #if defined(PETSC_USE_COMPLEX) 32 #if defined(PETSC_COMPLEX_INSTANTIATE) 33 template <> class std::complex<double>; /* instantiate complex template class */ 34 #endif 35 MPI_Datatype PETSC_DLLEXPORT MPIU_COMPLEX; 36 PetscScalar PETSC_DLLEXPORT PETSC_i; 37 #else 38 PetscScalar PETSC_DLLEXPORT PETSC_i = 0.0; 39 #endif 40 MPI_Datatype PETSC_DLLEXPORT MPIU_2SCALAR = 0; 41 MPI_Datatype PETSC_DLLEXPORT MPIU_2INT = 0; 42 /* 43 These are needed by petscbt.h 44 */ 45 #include "petscbt.h" 46 char PETSC_DLLEXPORT _BT_mask = ' '; 47 char PETSC_DLLEXPORT _BT_c = ' '; 48 PetscInt PETSC_DLLEXPORT _BT_idx = 0; 49 50 /* 51 Function that is called to display all error messages 52 */ 53 PetscErrorCode PETSC_DLLEXPORT (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 54 PetscErrorCode PETSC_DLLEXPORT (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 55 56 /* ------------------------------------------------------------------------------*/ 57 /* 58 Optional file where all PETSc output from various prints is saved 59 */ 60 FILE *petsc_history = PETSC_NULL; 61 62 #undef __FUNCT__ 63 #define __FUNCT__ "PetscLogOpenHistoryFile" 64 PetscErrorCode PETSC_DLLEXPORT PetscLogOpenHistoryFile(const char filename[],FILE **fd) 65 { 66 PetscErrorCode ierr; 67 PetscMPIInt rank,size; 68 char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 69 char version[256]; 70 71 PetscFunctionBegin; 72 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 73 if (!rank) { 74 char arch[10]; 75 ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 76 ierr = PetscGetDate(date,64);CHKERRQ(ierr); 77 ierr = PetscGetVersion(&version,256);CHKERRQ(ierr); 78 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 79 if (filename) { 80 ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 81 } else { 82 ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr); 83 ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr); 84 ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 85 } 86 87 *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 88 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 89 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 90 ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 91 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 92 ierr = PetscOptionsPrint(*fd);CHKERRQ(ierr); 93 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 94 fflush(*fd); 95 } 96 PetscFunctionReturn(0); 97 } 98 99 #undef __FUNCT__ 100 #define __FUNCT__ "PetscLogCloseHistoryFile" 101 PetscErrorCode PETSC_DLLEXPORT PetscLogCloseHistoryFile(FILE **fd) 102 { 103 PetscErrorCode ierr; 104 PetscMPIInt rank; 105 char date[64]; 106 107 PetscFunctionBegin; 108 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 109 if (!rank) { 110 ierr = PetscGetDate(date,64);CHKERRQ(ierr); 111 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 112 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 113 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 114 fflush(*fd); 115 fclose(*fd); 116 } 117 PetscFunctionReturn(0); 118 } 119 120 /* ------------------------------------------------------------------------------*/ 121 122 /* 123 This is ugly and probably belongs somewhere else, but I want to 124 be able to put a true MPI abort error handler with command line args. 125 126 This is so MPI errors in the debugger will leave all the stack 127 frames. The default abort cleans up and exits. 128 */ 129 130 #undef __FUNCT__ 131 #define __FUNCT__ "Petsc_MPI_AbortOnError" 132 void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag) 133 { 134 PetscFunctionBegin; 135 (*PetscErrorPrintf)("MPI error %d\n",(int)*flag); 136 abort(); 137 } 138 139 #undef __FUNCT__ 140 #define __FUNCT__ "Petsc_MPI_DebuggerOnError" 141 void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag) 142 { 143 PetscErrorCode ierr; 144 145 PetscFunctionBegin; 146 (*PetscErrorPrintf)("MPI error %d\n",(int)*flag); 147 ierr = PetscAttachDebugger(); 148 if (ierr) { /* hopeless so get out */ 149 MPI_Finalize(); 150 exit(*flag); 151 } 152 } 153 154 #undef __FUNCT__ 155 #define __FUNCT__ "PetscEnd" 156 /*@C 157 PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 158 wishes a clean exit somewhere deep in the program. 159 160 Collective on PETSC_COMM_WORLD 161 162 Options Database Keys are the same as for PetscFinalize() 163 164 Level: advanced 165 166 Note: 167 See PetscInitialize() for more general runtime options. 168 169 .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 170 @*/ 171 PetscErrorCode PETSC_DLLEXPORT PetscEnd(void) 172 { 173 PetscFunctionBegin; 174 PetscFinalize(); 175 exit(0); 176 return 0; 177 } 178 179 PetscTruth PetscOptionsPublish = PETSC_FALSE; 180 EXTERN PetscErrorCode PetscSetUseTrMalloc_Private(void); 181 extern PetscTruth petscsetmallocvisited; 182 static char emacsmachinename[256]; 183 184 PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0; 185 PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = 0; 186 187 #undef __FUNCT__ 188 #define __FUNCT__ "PetscSetHelpVersionFunctions" 189 /*@C 190 PetscSetHelpVersionFunctions - Sets functions that print help and version information 191 before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 192 This routine enables a "higher-level" package that uses PETSc to print its messages first. 193 194 Input Parameter: 195 + help - the help function (may be PETSC_NULL) 196 - version - the version function (may be PETSc null) 197 198 Level: developer 199 200 Concepts: package help message 201 202 @*/ 203 PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 204 { 205 PetscFunctionBegin; 206 PetscExternalHelpFunction = help; 207 PetscExternalVersionFunction = version; 208 PetscFunctionReturn(0); 209 } 210 211 #undef __FUNCT__ 212 #define __FUNCT__ "PetscOptionsCheckInitial_Private" 213 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Private(void) 214 { 215 char string[64],mname[PETSC_MAX_PATH_LEN],*f; 216 MPI_Comm comm = PETSC_COMM_WORLD; 217 PetscTruth flg1,flg2,flg3,flag; 218 PetscErrorCode ierr; 219 PetscInt si; 220 int i; 221 PetscMPIInt rank; 222 char version[256]; 223 224 PetscFunctionBegin; 225 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 226 227 /* 228 Setup the memory management; support for tracing malloc() usage 229 */ 230 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr); 231 #if defined(PETSC_USE_DEBUG) 232 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr); 233 if ((!flg2 || flg1) && !petscsetmallocvisited) { 234 ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr); 235 } 236 #else 237 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr); 238 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc",&flg2);CHKERRQ(ierr); 239 if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);} 240 #endif 241 if (flg3) { 242 ierr = PetscMallocSetDumpLog();CHKERRQ(ierr); 243 } 244 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_debug",&flg1);CHKERRQ(ierr); 245 if (flg1) { 246 ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr); 247 ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr); 248 } 249 250 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_info",&flg1);CHKERRQ(ierr); 251 if (!flg1) { 252 ierr = PetscOptionsHasName(PETSC_NULL,"-memory_info",&flg1);CHKERRQ(ierr); 253 } 254 if (flg1) { 255 ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 256 } 257 258 /* 259 Set the display variable for graphics 260 */ 261 ierr = PetscSetDisplay();CHKERRQ(ierr); 262 263 /* 264 Print the PETSc version information 265 */ 266 ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr); 267 ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr); 268 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr); 269 if (flg1 || flg2 || flg3){ 270 271 /* 272 Print "higher-level" package version message 273 */ 274 if (PetscExternalVersionFunction) { 275 ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 276 } 277 278 ierr = PetscGetVersion(&version,256);CHKERRQ(ierr); 279 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 280 ------------------------------\n");CHKERRQ(ierr); 281 ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 282 ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 283 ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr); 284 ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 285 ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr); 286 ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 287 ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 288 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 289 ------------------------------\n");CHKERRQ(ierr); 290 } 291 292 /* 293 Print "higher-level" package help message 294 */ 295 if (flg3){ 296 if (PetscExternalHelpFunction) { 297 ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 298 } 299 } 300 301 /* 302 Setup the error handling 303 */ 304 ierr = PetscOptionsHasName(PETSC_NULL,"-fp_trap",&flg1);CHKERRQ(ierr); 305 if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); } 306 ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_abort",&flg1);CHKERRQ(ierr); 307 if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)} 308 ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_mpiabort",&flg1);CHKERRQ(ierr); 309 if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr)} 310 ierr = PetscOptionsHasName(PETSC_NULL,"-mpi_return_on_error",&flg1);CHKERRQ(ierr); 311 if (flg1) { 312 ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr); 313 } 314 ierr = PetscOptionsHasName(PETSC_NULL,"-error_output_none",&flg1);CHKERRQ(ierr); 315 if (flg1) { 316 PetscErrorPrintf = PetscErrorPrintfNone; 317 } 318 ierr = PetscOptionsHasName(PETSC_NULL,"-no_signal_handler",&flg1);CHKERRQ(ierr); 319 if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) } 320 321 /* 322 Setup debugger information 323 */ 324 ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 325 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr); 326 if (flg1) { 327 MPI_Errhandler err_handler; 328 329 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 330 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr); 331 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 332 ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr); 333 } 334 ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr); 335 ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr); 336 if (flg1 || flg2) { 337 PetscMPIInt size; 338 PetscInt lsize,*nodes; 339 MPI_Errhandler err_handler; 340 /* 341 we have to make sure that all processors have opened 342 connections to all other processors, otherwise once the 343 debugger has stated it is likely to receive a SIGUSR1 344 and kill the program. 345 */ 346 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 347 if (size > 2) { 348 PetscMPIInt dummy; 349 MPI_Status status; 350 for (i=0; i<size; i++) { 351 if (rank != i) { 352 ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr); 353 } 354 } 355 for (i=0; i<size; i++) { 356 if (rank != i) { 357 ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr); 358 } 359 } 360 } 361 /* check if this processor node should be in debugger */ 362 ierr = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr); 363 lsize = size; 364 ierr = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 365 if (flag) { 366 for (i=0; i<lsize; i++) { 367 if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 368 } 369 } 370 if (!flag) { 371 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 372 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 373 if (flg1) { 374 ierr = PetscAttachDebugger();CHKERRQ(ierr); 375 } else { 376 ierr = PetscStopForDebugger();CHKERRQ(ierr); 377 } 378 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 379 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 380 } 381 ierr = PetscFree(nodes);CHKERRQ(ierr); 382 } 383 384 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr); 385 if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)} 386 387 /* 388 Setup profiling and logging 389 */ 390 #if defined (PETSC_USE_INFO) 391 ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr); 392 if (flg1) { 393 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 394 ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr); 395 if (logname[0]) { 396 PetscInfoAllow(PETSC_TRUE,logname); 397 } else { 398 PetscInfoAllow(PETSC_TRUE,PETSC_NULL); 399 } 400 } 401 #endif 402 #if defined(PETSC_USE_LOG) 403 mname[0] = 0; 404 ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 405 if (flg1) { 406 if (mname[0]) { 407 ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 408 } else { 409 ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr); 410 } 411 } 412 #if defined(PETSC_HAVE_MPE) 413 ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 414 if (flg1) PetscLogMPEBegin(); 415 #endif 416 ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr); 417 ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr); 418 ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr); 419 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 420 else if (flg2 || flg3) { ierr = PetscLogBegin();CHKERRQ(ierr);} 421 422 ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 423 if (flg1) { 424 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 425 FILE *file; 426 if (mname[0]) { 427 sprintf(name,"%s.%d",mname,rank); 428 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 429 file = fopen(fname,"w"); 430 if (!file) { 431 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 432 } 433 } else { 434 file = stdout; 435 } 436 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 437 } 438 #endif 439 440 /* 441 Setup building of stack frames for all function calls 442 */ 443 #if defined(PETSC_USE_DEBUG) 444 ierr = PetscStackCreate();CHKERRQ(ierr); 445 #endif 446 447 ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr); 448 449 /* 450 Print basic help message 451 */ 452 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 453 if (flg1) { 454 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 455 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 456 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 457 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 458 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 459 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 460 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 461 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 462 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 463 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 464 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 465 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 466 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 467 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 468 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 469 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 470 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 471 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 472 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 473 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 474 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 475 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 476 ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr); 477 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 478 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 479 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 480 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 481 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 482 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 483 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 484 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 485 #if defined(PETSC_USE_LOG) 486 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 487 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 488 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 489 #if defined(PETSC_HAVE_MPE) 490 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 491 #endif 492 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 493 #endif 494 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 495 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 496 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 497 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 498 } 499 500 ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 501 if (flg1) { 502 ierr = PetscSleep(si);CHKERRQ(ierr); 503 } 504 505 ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 506 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 507 if (f) { 508 ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 509 } 510 511 PetscFunctionReturn(0); 512 } 513 514 515