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