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,"-memory_info",&flg1);CHKERRQ(ierr); 252 if (flg1) { 253 ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 254 } 255 256 /* 257 Set the display variable for graphics 258 */ 259 ierr = PetscSetDisplay();CHKERRQ(ierr); 260 261 /* 262 Print the PETSc version information 263 */ 264 ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr); 265 ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr); 266 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr); 267 if (flg1 || flg2 || flg3){ 268 269 /* 270 Print "higher-level" package version message 271 */ 272 if (PetscExternalVersionFunction) { 273 ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 274 } 275 276 ierr = PetscGetVersion(&version);CHKERRQ(ierr); 277 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 278 ------------------------------\n");CHKERRQ(ierr); 279 ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 280 ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 281 ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr); 282 ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 283 ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr); 284 ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 285 ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 286 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 287 ------------------------------\n");CHKERRQ(ierr); 288 } 289 290 /* 291 Print "higher-level" package help message 292 */ 293 if (flg3){ 294 if (PetscExternalHelpFunction) { 295 ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 296 } 297 } 298 299 /* 300 Setup the error handling 301 */ 302 ierr = PetscOptionsHasName(PETSC_NULL,"-fp_trap",&flg1);CHKERRQ(ierr); 303 if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); } 304 ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_abort",&flg1);CHKERRQ(ierr); 305 if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)} 306 ierr = PetscOptionsHasName(PETSC_NULL,"-on_error_stop",&flg1);CHKERRQ(ierr); 307 if (flg1) { ierr = PetscPushErrorHandler(PetscStopErrorHandler,0);CHKERRQ(ierr)} 308 ierr = PetscOptionsHasName(PETSC_NULL,"-mpi_return_on_error",&flg1);CHKERRQ(ierr); 309 if (flg1) { 310 ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr); 311 } 312 ierr = PetscOptionsHasName(PETSC_NULL,"-no_signal_handler",&flg1);CHKERRQ(ierr); 313 if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) } 314 315 /* 316 Setup debugger information 317 */ 318 ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 319 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr); 320 if (flg1) { 321 MPI_Errhandler err_handler; 322 323 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 324 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr); 325 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 326 ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr); 327 } 328 ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr); 329 ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr); 330 if (flg1 || flg2) { 331 PetscMPIInt size; 332 PetscInt lsize,*nodes; 333 MPI_Errhandler err_handler; 334 /* 335 we have to make sure that all processors have opened 336 connections to all other processors, otherwise once the 337 debugger has stated it is likely to receive a SIGUSR1 338 and kill the program. 339 */ 340 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 341 if (size > 2) { 342 PetscMPIInt dummy; 343 MPI_Status status; 344 for (i=0; i<size; i++) { 345 if (rank != i) { 346 ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr); 347 } 348 } 349 for (i=0; i<size; i++) { 350 if (rank != i) { 351 ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr); 352 } 353 } 354 } 355 /* check if this processor node should be in debugger */ 356 ierr = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr); 357 lsize = size; 358 ierr = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 359 if (flag) { 360 for (i=0; i<lsize; i++) { 361 if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 362 } 363 } 364 if (!flag) { 365 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 366 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 367 if (flg1) { 368 ierr = PetscAttachDebugger();CHKERRQ(ierr); 369 } else { 370 ierr = PetscStopForDebugger();CHKERRQ(ierr); 371 } 372 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 373 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 374 } 375 ierr = PetscFree(nodes);CHKERRQ(ierr); 376 } 377 378 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr); 379 if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)} 380 381 /* 382 Setup profiling and logging 383 */ 384 #if defined(PETSC_USE_LOG) 385 mname[0] = 0; 386 ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 387 if (flg1) { 388 if (mname[0]) { 389 ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 390 } else { 391 ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr); 392 } 393 } 394 ierr = PetscOptionsHasName(PETSC_NULL,"-log_info",&flg1);CHKERRQ(ierr); 395 if (flg1) { 396 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 397 ierr = PetscOptionsGetString(PETSC_NULL,"-log_info",logname,250,&flg1);CHKERRQ(ierr); 398 if (logname[0]) { 399 PetscLogInfoAllow(PETSC_TRUE,logname); 400 } else { 401 PetscLogInfoAllow(PETSC_TRUE,PETSC_NULL); 402 } 403 } 404 #if defined(PETSC_HAVE_MPE) 405 ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 406 if (flg1) PetscLogMPEBegin(); 407 #endif 408 ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr); 409 ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr); 410 ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr); 411 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 412 else if (flg2 || flg3) { ierr = PetscLogBegin();CHKERRQ(ierr);} 413 414 ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 415 if (flg1) { 416 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 417 FILE *file; 418 if (mname[0]) { 419 sprintf(name,"%s.%d",mname,rank); 420 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 421 file = fopen(fname,"w"); 422 if (!file) { 423 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 424 } 425 } else { 426 file = stdout; 427 } 428 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 429 } 430 #endif 431 432 /* 433 Setup building of stack frames for all function calls 434 */ 435 #if defined(PETSC_USE_DEBUG) 436 ierr = PetscStackCreate();CHKERRQ(ierr); 437 #endif 438 439 440 /* 441 Print basic help message 442 */ 443 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 444 if (flg1) { 445 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 446 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 447 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 448 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 449 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 450 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 451 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 452 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 453 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 454 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 455 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 456 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 457 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 458 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 459 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 460 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 461 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 462 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 463 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 464 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 465 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 466 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 467 ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr); 468 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 469 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 470 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 471 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 472 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 473 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 474 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has seperate tmp directory\n");CHKERRQ(ierr); 475 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 476 #if defined(PETSC_USE_LOG) 477 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 478 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 479 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 480 #if defined(PETSC_HAVE_MPE) 481 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 482 #endif 483 ierr = (*PetscHelpPrintf)(comm," -log_info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 484 #endif 485 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 486 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 487 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 488 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 489 } 490 491 ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 492 if (flg1) { 493 ierr = PetscSleep(si);CHKERRQ(ierr); 494 } 495 496 ierr = PetscOptionsGetString(PETSC_NULL,"-log_info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 497 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 498 if (f) { 499 ierr = PetscLogInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 500 } 501 502 PetscFunctionReturn(0); 503 } 504 505 506