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