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