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 #include "zope.h" 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 PetscTruth flgz; 387 ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz); CHKERRQ(ierr); 388 if(flgz){ 389 char hostname[256]; 390 int remoteport = 9999; 391 int listenport = 9998; 392 ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr); 393 if(!hostname[0]){ 394 ierr=PetscGetHostName(hostname,256); CHKERRQ(ierr);} 395 extern int PETSC_LISTENFD; 396 extern int PETSC_SOCKFD; 397 extern int PETSC_LISTEN_CHECK; 398 ierr=PetscOpenSocket(hostname, remoteport, &PETSC_SOCKFD);CHKERRQ(ierr); 399 PETSC_LISTEN_CHECK = 1; 400 ierr=PetscSocketListen(hostname, listenport, &PETSC_LISTENFD);CHKERRQ(ierr); 401 PETSC_STDOUT = fdopen(PETSC_SOCKFD, "w"); 402 fprintf(PETSC_STDOUT, "<<<start>>>"); 403 } 404 405 /* 406 Setup profiling and logging 407 */ 408 #if defined (PETSC_USE_INFO) 409 ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr); 410 if (flg1) { 411 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 412 ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr); 413 if (logname[0]) { 414 PetscInfoAllow(PETSC_TRUE,logname); 415 } else { 416 PetscInfoAllow(PETSC_TRUE,PETSC_NULL); 417 } 418 } 419 #endif 420 #if defined(PETSC_USE_LOG) 421 mname[0] = 0; 422 ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 423 if (flg1) { 424 if (mname[0]) { 425 ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 426 } else { 427 ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr); 428 } 429 } 430 #if defined(PETSC_HAVE_MPE) 431 ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 432 if (flg1) PetscLogMPEBegin(); 433 #endif 434 ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr); 435 ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr); 436 ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr); 437 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 438 else if (flg2 || flg3) { ierr = PetscLogBegin();CHKERRQ(ierr);} 439 440 ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 441 if (flg1) { 442 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 443 FILE *file; 444 if (mname[0]) { 445 sprintf(name,"%s.%d",mname,rank); 446 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 447 file = fopen(fname,"w"); 448 if (!file) { 449 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 450 } 451 } else { 452 file = PETSC_STDOUT; 453 } 454 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 455 } 456 #endif 457 458 /* 459 Setup building of stack frames for all function calls 460 */ 461 #if defined(PETSC_USE_DEBUG) 462 ierr = PetscStackCreate();CHKERRQ(ierr); 463 #endif 464 465 ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr); 466 467 /* 468 Print basic help message 469 */ 470 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 471 if (flg1) { 472 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 473 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 474 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 475 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 476 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 477 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 478 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 479 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 480 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 481 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 482 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 483 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 484 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 485 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 486 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 487 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 488 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 489 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 490 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 491 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 492 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 493 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 494 ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr); 495 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 496 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 497 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 498 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 499 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 500 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 501 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 502 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 503 #if defined(PETSC_USE_LOG) 504 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 505 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 506 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 507 #if defined(PETSC_HAVE_MPE) 508 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 509 #endif 510 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 511 #endif 512 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 513 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 514 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 515 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 516 } 517 518 ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 519 if (flg1) { 520 ierr = PetscSleep(si);CHKERRQ(ierr); 521 } 522 523 ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 524 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 525 if (f) { 526 ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 527 } 528 529 PetscFunctionReturn(0); 530 } 531 532 533