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