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 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 extern FILE* PETSC_STDOUT; 393 char hostname[256]; 394 int remoteport = 9999; 395 int listenport = 9998; 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, &PETSC_SOCKFD);CHKERRQ(ierr); 400 PETSC_LISTEN_CHECK = 1; 401 ierr=PetscSocketListen(hostname, listenport, &PETSC_LISTENFD);CHKERRQ(ierr); 402 char username[256]; 403 if(flgzout){ 404 PETSC_STDOUT = fdopen(PETSC_SOCKFD, "w"); 405 ierr = PetscGetUserName(username, 256); 406 fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username); 407 fprintf(PETSC_STDOUT, "<<<start>>>"); 408 } 409 else{ 410 PETSC_ZOPEFD = fdopen(PETSC_SOCKFD, "w"); 411 ierr = PetscGetUserName(username, 256); 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