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