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 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,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 = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);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 = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr); 244 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr); 245 if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);} 246 #endif 247 if (flg3) { 248 ierr = PetscMallocSetDumpLog();CHKERRQ(ierr); 249 } 250 flg1 = PETSC_FALSE; 251 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr); 252 if (flg1) { 253 ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr); 254 ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr); 255 } 256 257 flg1 = PETSC_FALSE; 258 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr); 259 if (!flg1) { 260 flg1 = PETSC_FALSE; 261 ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr); 262 } 263 if (flg1) { 264 ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 265 } 266 267 /* 268 Set the display variable for graphics 269 */ 270 ierr = PetscSetDisplay();CHKERRQ(ierr); 271 272 /* 273 Print the PETSc version information 274 */ 275 ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr); 276 ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr); 277 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr); 278 if (flg1 || flg2 || flg3){ 279 280 /* 281 Print "higher-level" package version message 282 */ 283 if (PetscExternalVersionFunction) { 284 ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 285 } 286 287 ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 288 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 289 ------------------------------\n");CHKERRQ(ierr); 290 ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 291 ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 292 ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr); 293 ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 294 ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr); 295 ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 296 ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 297 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 298 ------------------------------\n");CHKERRQ(ierr); 299 } 300 301 /* 302 Print "higher-level" package help message 303 */ 304 if (flg3){ 305 if (PetscExternalHelpFunction) { 306 ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 307 } 308 } 309 310 /* 311 Setup the error handling 312 */ 313 flg1 = PETSC_FALSE; 314 ierr = PetscOptionsGetTruth(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr); 315 if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); } 316 flg1 = PETSC_FALSE; 317 ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr); 318 if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)} 319 flg1 = PETSC_FALSE; 320 ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr); 321 if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr)} 322 flg1 = PETSC_FALSE; 323 ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr); 324 if (flg1) { 325 ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr); 326 } 327 flg1 = PETSC_FALSE; 328 ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr); 329 if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) } 330 331 /* 332 Setup debugger information 333 */ 334 ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 335 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr); 336 if (flg1) { 337 MPI_Errhandler err_handler; 338 339 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 340 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr); 341 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 342 ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr); 343 } 344 ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr); 345 if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 346 ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr); 347 ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr); 348 if (flg1 || flg2) { 349 PetscMPIInt size; 350 PetscInt lsize,*nodes; 351 MPI_Errhandler err_handler; 352 /* 353 we have to make sure that all processors have opened 354 connections to all other processors, otherwise once the 355 debugger has stated it is likely to receive a SIGUSR1 356 and kill the program. 357 */ 358 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 359 if (size > 2) { 360 PetscMPIInt dummy; 361 MPI_Status status; 362 for (i=0; i<size; i++) { 363 if (rank != i) { 364 ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr); 365 } 366 } 367 for (i=0; i<size; i++) { 368 if (rank != i) { 369 ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr); 370 } 371 } 372 } 373 /* check if this processor node should be in debugger */ 374 ierr = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr); 375 lsize = size; 376 ierr = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 377 if (flag) { 378 for (i=0; i<lsize; i++) { 379 if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 380 } 381 } 382 if (!flag) { 383 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 384 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 385 if (flg1) { 386 ierr = PetscAttachDebugger();CHKERRQ(ierr); 387 } else { 388 ierr = PetscStopForDebugger();CHKERRQ(ierr); 389 } 390 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 391 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 392 } 393 ierr = PetscFree(nodes);CHKERRQ(ierr); 394 } 395 396 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr); 397 if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)} 398 399 #if defined(PETSC_USE_SOCKET_VIEWER) 400 /* 401 Activates new sockets for zope if needed 402 */ 403 ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr); 404 ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr); 405 if(flgz){ 406 extern FILE* PETSC_ZOPEFD; 407 int sockfd; 408 char hostname[256]; 409 char username[256]; 410 int remoteport = 9999; 411 ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr); 412 if(!hostname[0]){ 413 ierr=PetscGetHostName(hostname,256);CHKERRQ(ierr);} 414 ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr); 415 ierr = PetscGetUserName(username, 256); 416 PETSC_ZOPEFD = fdopen(sockfd, "w"); 417 if(flgzout){ 418 PETSC_STDOUT = PETSC_ZOPEFD; 419 fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username); 420 fprintf(PETSC_STDOUT, "<<<start>>>"); 421 } 422 else{ 423 fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username); 424 fprintf(PETSC_ZOPEFD, "<<<start>>>"); 425 }} 426 #endif 427 428 /* 429 Setup profiling and logging 430 */ 431 #if defined (PETSC_USE_INFO) 432 flg1 = PETSC_FALSE; 433 ierr = PetscOptionsGetTruth(PETSC_NULL,"-info",&flg1,PETSC_NULL);CHKERRQ(ierr); 434 if (flg1) { 435 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 436 ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr); 437 if (logname[0]) { 438 PetscInfoAllow(PETSC_TRUE,logname); 439 } else { 440 PetscInfoAllow(PETSC_TRUE,PETSC_NULL); 441 } 442 } 443 #endif 444 #if defined(PETSC_USE_LOG) 445 mname[0] = 0; 446 ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 447 if (flg1) { 448 if (mname[0]) { 449 ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 450 } else { 451 ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr); 452 } 453 } 454 #if defined(PETSC_HAVE_MPE) 455 flg1 = PETSC_FALSE; 456 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_mpe",&flg1,PETSC_NULL);CHKERRQ(ierr); 457 if (flg1) PetscLogMPEBegin(); 458 #endif 459 flg1 = PETSC_FALSE; 460 flg2 = PETSC_FALSE; 461 flg3 = PETSC_FALSE; 462 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr); 463 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr); 464 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_summary",&flg3,PETSC_NULL);CHKERRQ(ierr); 465 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 466 else if (flg2 || flg3) { ierr = PetscLogBegin();CHKERRQ(ierr);} 467 468 ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 469 if (flg1) { 470 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 471 FILE *file; 472 if (mname[0]) { 473 sprintf(name,"%s.%d",mname,rank); 474 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 475 file = fopen(fname,"w"); 476 if (!file) { 477 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 478 } 479 } else { 480 file = PETSC_STDOUT; 481 } 482 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 483 } 484 #endif 485 486 /* 487 Setup building of stack frames for all function calls 488 */ 489 #if defined(PETSC_USE_DEBUG) 490 ierr = PetscStackCreate();CHKERRQ(ierr); 491 #endif 492 493 ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr); 494 495 /* 496 Print basic help message 497 */ 498 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 499 if (flg1) { 500 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 501 ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option");CHKERRQ(ierr); 502 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 503 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 504 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 505 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 506 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 507 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 508 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 509 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 510 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 511 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 512 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 513 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 514 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 515 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 516 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 517 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 518 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 519 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 520 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 521 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 522 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 523 ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 524 ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr); 525 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 526 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 527 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 528 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 529 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 530 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 531 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 532 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 533 #if defined(PETSC_USE_LOG) 534 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 535 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 536 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 537 #if defined(PETSC_HAVE_MPE) 538 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 539 #endif 540 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 541 #endif 542 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 543 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 544 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 545 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 546 } 547 548 ierr = PetscOptionsGetInt(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 549 if (flg1) { 550 ierr = PetscSleep(si);CHKERRQ(ierr); 551 } 552 553 ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 554 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 555 if (f) { 556 ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 557 } 558 559 560 PetscFunctionReturn(0); 561 } 562 563 564