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