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,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr); 338 if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 339 ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr); 340 ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr); 341 if (flg1 || flg2) { 342 PetscMPIInt size; 343 PetscInt lsize,*nodes; 344 MPI_Errhandler err_handler; 345 /* 346 we have to make sure that all processors have opened 347 connections to all other processors, otherwise once the 348 debugger has stated it is likely to receive a SIGUSR1 349 and kill the program. 350 */ 351 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 352 if (size > 2) { 353 PetscMPIInt dummy; 354 MPI_Status status; 355 for (i=0; i<size; i++) { 356 if (rank != i) { 357 ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr); 358 } 359 } 360 for (i=0; i<size; i++) { 361 if (rank != i) { 362 ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr); 363 } 364 } 365 } 366 /* check if this processor node should be in debugger */ 367 ierr = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr); 368 lsize = size; 369 ierr = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 370 if (flag) { 371 for (i=0; i<lsize; i++) { 372 if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 373 } 374 } 375 if (!flag) { 376 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 377 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 378 if (flg1) { 379 ierr = PetscAttachDebugger();CHKERRQ(ierr); 380 } else { 381 ierr = PetscStopForDebugger();CHKERRQ(ierr); 382 } 383 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 384 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 385 } 386 ierr = PetscFree(nodes);CHKERRQ(ierr); 387 } 388 389 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr); 390 if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)} 391 392 393 /* 394 Activates new sockets for zope if needed 395 */ 396 ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz); CHKERRQ(ierr); 397 ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout); CHKERRQ(ierr); 398 if(flgz){ 399 extern FILE* PETSC_ZOPEFD; 400 int sockfd; 401 char hostname[256]; 402 char username[256]; 403 int remoteport = 9999; 404 ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr); 405 if(!hostname[0]){ 406 ierr=PetscGetHostName(hostname,256); CHKERRQ(ierr);} 407 ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr); 408 ierr = PetscGetUserName(username, 256); 409 PETSC_ZOPEFD = fdopen(sockfd, "w"); 410 if(flgzout){ 411 PETSC_STDOUT = PETSC_ZOPEFD; 412 fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username); 413 fprintf(PETSC_STDOUT, "<<<start>>>"); 414 } 415 else{ 416 fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username); 417 fprintf(PETSC_ZOPEFD, "<<<start>>>"); 418 }} 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," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 489 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 490 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 491 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 492 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 493 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 494 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 495 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 496 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 497 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 498 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 499 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 500 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 501 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 502 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 503 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 504 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 505 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 506 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 507 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 508 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 509 ierr = (*PetscHelpPrintf)(comm," -mallocinfo: prints total memory usage\n");CHKERRQ(ierr); 510 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 511 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 512 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 513 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 514 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 515 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 516 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 517 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 518 #if defined(PETSC_USE_LOG) 519 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 520 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 521 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 522 #if defined(PETSC_HAVE_MPE) 523 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 524 #endif 525 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 526 #endif 527 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 528 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 529 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 530 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 531 } 532 533 ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 534 if (flg1) { 535 ierr = PetscSleep(si);CHKERRQ(ierr); 536 } 537 538 ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 539 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 540 if (f) { 541 ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 542 } 543 544 545 PetscFunctionReturn(0); 546 } 547 548 549