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 /* ------------------------Nasty global variables -------------------------------*/ 20 /* 21 Indicates if PETSc started up MPI, or it was 22 already started before PETSc was initialized. 23 */ 24 PetscTruth PETSC_DLLEXPORT PetscBeganMPI = PETSC_FALSE; 25 PetscTruth PETSC_DLLEXPORT PetscInitializeCalled = PETSC_FALSE; 26 PetscTruth PETSC_DLLEXPORT PetscFinalizeCalled = PETSC_FALSE; 27 PetscMPIInt PETSC_DLLEXPORT PetscGlobalRank = -1; 28 PetscMPIInt PETSC_DLLEXPORT PetscGlobalSize = -1; 29 30 #if defined(PETSC_USE_COMPLEX) 31 #if defined(PETSC_COMPLEX_INSTANTIATE) 32 template <> class std::complex<double>; /* instantiate complex template class */ 33 #endif 34 MPI_Datatype PETSC_DLLEXPORT MPIU_COMPLEX; 35 PetscScalar PETSC_DLLEXPORT PETSC_i; 36 #else 37 PetscScalar PETSC_DLLEXPORT PETSC_i = 0.0; 38 #endif 39 MPI_Datatype PETSC_DLLEXPORT MPIU_2SCALAR = 0; 40 MPI_Datatype PETSC_DLLEXPORT MPIU_2INT = 0; 41 /* 42 These are needed by petscbt.h 43 */ 44 #include "petscbt.h" 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,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr); 337 if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 338 ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr); 339 ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr); 340 if (flg1 || flg2) { 341 PetscMPIInt size; 342 PetscInt lsize,*nodes; 343 MPI_Errhandler err_handler; 344 /* 345 we have to make sure that all processors have opened 346 connections to all other processors, otherwise once the 347 debugger has stated it is likely to receive a SIGUSR1 348 and kill the program. 349 */ 350 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 351 if (size > 2) { 352 PetscMPIInt dummy; 353 MPI_Status status; 354 for (i=0; i<size; i++) { 355 if (rank != i) { 356 ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr); 357 } 358 } 359 for (i=0; i<size; i++) { 360 if (rank != i) { 361 ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr); 362 } 363 } 364 } 365 /* check if this processor node should be in debugger */ 366 ierr = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr); 367 lsize = size; 368 ierr = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 369 if (flag) { 370 for (i=0; i<lsize; i++) { 371 if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 372 } 373 } 374 if (!flag) { 375 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 376 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 377 if (flg1) { 378 ierr = PetscAttachDebugger();CHKERRQ(ierr); 379 } else { 380 ierr = PetscStopForDebugger();CHKERRQ(ierr); 381 } 382 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 383 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 384 } 385 ierr = PetscFree(nodes);CHKERRQ(ierr); 386 } 387 388 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr); 389 if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)} 390 391 #if defined(PETSC_USE_SOCKET_VIEWER) 392 /* 393 Activates new sockets for zope if needed 394 */ 395 ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz); CHKERRQ(ierr); 396 ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout); CHKERRQ(ierr); 397 if(flgz){ 398 extern FILE* PETSC_ZOPEFD; 399 int sockfd; 400 char hostname[256]; 401 char username[256]; 402 int remoteport = 9999; 403 ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr); 404 if(!hostname[0]){ 405 ierr=PetscGetHostName(hostname,256); CHKERRQ(ierr);} 406 ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr); 407 ierr = PetscGetUserName(username, 256); 408 PETSC_ZOPEFD = fdopen(sockfd, "w"); 409 if(flgzout){ 410 PETSC_STDOUT = PETSC_ZOPEFD; 411 fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username); 412 fprintf(PETSC_STDOUT, "<<<start>>>"); 413 } 414 else{ 415 fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username); 416 fprintf(PETSC_ZOPEFD, "<<<start>>>"); 417 }} 418 #endif 419 420 /* 421 Setup profiling and logging 422 */ 423 #if defined (PETSC_USE_INFO) 424 ierr = PetscOptionsHasName(PETSC_NULL,"-info",&flg1);CHKERRQ(ierr); 425 if (flg1) { 426 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 427 ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr); 428 if (logname[0]) { 429 PetscInfoAllow(PETSC_TRUE,logname); 430 } else { 431 PetscInfoAllow(PETSC_TRUE,PETSC_NULL); 432 } 433 } 434 #endif 435 #if defined(PETSC_USE_LOG) 436 mname[0] = 0; 437 ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 438 if (flg1) { 439 if (mname[0]) { 440 ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 441 } else { 442 ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr); 443 } 444 } 445 #if defined(PETSC_HAVE_MPE) 446 ierr = PetscOptionsHasName(PETSC_NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 447 if (flg1) PetscLogMPEBegin(); 448 #endif 449 ierr = PetscOptionsHasName(PETSC_NULL,"-log_all",&flg1);CHKERRQ(ierr); 450 ierr = PetscOptionsHasName(PETSC_NULL,"-log",&flg2);CHKERRQ(ierr); 451 ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr); 452 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 453 else if (flg2 || flg3) { ierr = PetscLogBegin();CHKERRQ(ierr);} 454 455 ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 456 if (flg1) { 457 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 458 FILE *file; 459 if (mname[0]) { 460 sprintf(name,"%s.%d",mname,rank); 461 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 462 file = fopen(fname,"w"); 463 if (!file) { 464 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 465 } 466 } else { 467 file = PETSC_STDOUT; 468 } 469 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 470 } 471 #endif 472 473 /* 474 Setup building of stack frames for all function calls 475 */ 476 #if defined(PETSC_USE_DEBUG) 477 ierr = PetscStackCreate();CHKERRQ(ierr); 478 #endif 479 480 ierr = PetscOptionsHasName(PETSC_NULL,"-options_gui",&PetscOptionsPublish);CHKERRQ(ierr); 481 482 /* 483 Print basic help message 484 */ 485 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 486 if (flg1) { 487 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 488 ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option");CHKERRQ(ierr); 489 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 490 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 491 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 492 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 493 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 494 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 495 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 496 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 497 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 498 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 499 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 500 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 501 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 502 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 503 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 504 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 505 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 506 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 507 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 508 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 509 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 510 ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 511 ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr); 512 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 513 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 514 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 515 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 516 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 517 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 518 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 519 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 520 #if defined(PETSC_USE_LOG) 521 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 522 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 523 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 524 #if defined(PETSC_HAVE_MPE) 525 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 526 #endif 527 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 528 #endif 529 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 530 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 531 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 532 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 533 } 534 535 ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 536 if (flg1) { 537 ierr = PetscSleep(si);CHKERRQ(ierr); 538 } 539 540 ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 541 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 542 if (f) { 543 ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 544 } 545 546 547 PetscFunctionReturn(0); 548 } 549 550 551