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