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 "petscsys.h" /*I "petscsys.h" I*/ 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 /* ------------------------Nasty global variables -------------------------------*/ 19 /* 20 Indicates if PETSc started up MPI, or it was 21 already started before PETSc was initialized. 22 */ 23 PetscTruth PETSC_DLLEXPORT PetscBeganMPI = PETSC_FALSE; 24 PetscTruth PETSC_DLLEXPORT PetscInitializeCalled = PETSC_FALSE; 25 PetscTruth PETSC_DLLEXPORT PetscFinalizeCalled = PETSC_FALSE; 26 PetscMPIInt PETSC_DLLEXPORT PetscGlobalRank = -1; 27 PetscMPIInt PETSC_DLLEXPORT PetscGlobalSize = -1; 28 29 #if defined(PETSC_USE_COMPLEX) 30 #if defined(PETSC_COMPLEX_INSTANTIATE) 31 template <> class std::complex<double>; /* instantiate complex template class */ 32 #endif 33 #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 34 MPI_Datatype PETSC_DLLEXPORT MPI_C_DOUBLE_COMPLEX; 35 MPI_Datatype PETSC_DLLEXPORT MPI_C_COMPLEX; 36 #endif 37 PetscScalar PETSC_DLLEXPORT PETSC_i; 38 #else 39 PetscScalar PETSC_DLLEXPORT PETSC_i = 0.0; 40 #endif 41 MPI_Datatype PETSC_DLLEXPORT MPIU_2SCALAR = 0; 42 MPI_Datatype PETSC_DLLEXPORT MPIU_2INT = 0; 43 44 #if defined(PETSC_USE_SCALAR_QD_DD) 45 MPI_Datatype PETSC_DLLEXPORT MPIU_QD_DD; 46 #endif 47 /* 48 These are needed by petscbt.h 49 */ 50 #include "petscbt.h" 51 char PETSC_DLLEXPORT _BT_mask = ' '; 52 char PETSC_DLLEXPORT _BT_c = ' '; 53 PetscInt PETSC_DLLEXPORT _BT_idx = 0; 54 55 /* 56 Function that is called to display all error messages 57 */ 58 PetscErrorCode PETSC_DLLEXPORT (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 59 PetscErrorCode PETSC_DLLEXPORT (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 60 PetscErrorCode PETSC_DLLEXPORT (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 61 62 /* ------------------------------------------------------------------------------*/ 63 /* 64 Optional file where all PETSc output from various prints is saved 65 */ 66 FILE *petsc_history = PETSC_NULL; 67 68 #undef __FUNCT__ 69 #define __FUNCT__ "PetscLogOpenHistoryFile" 70 PetscErrorCode PETSC_DLLEXPORT PetscLogOpenHistoryFile(const char filename[],FILE **fd) 71 { 72 PetscErrorCode ierr; 73 PetscMPIInt rank,size; 74 char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 75 char version[256]; 76 77 PetscFunctionBegin; 78 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 79 if (!rank) { 80 char arch[10]; 81 int err; 82 83 ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 84 ierr = PetscGetDate(date,64);CHKERRQ(ierr); 85 ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 86 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 87 if (filename) { 88 ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 89 } else { 90 ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr); 91 ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr); 92 ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 93 } 94 95 *fd = fopen(fname,"a"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 96 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 97 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 98 ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 99 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 100 ierr = PetscOptionsPrint(*fd);CHKERRQ(ierr); 101 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 102 err = fflush(*fd); 103 if (err) SETERRQ(PETSC_ERR_SYS,"fflush() failed on file"); 104 } 105 PetscFunctionReturn(0); 106 } 107 108 #undef __FUNCT__ 109 #define __FUNCT__ "PetscLogCloseHistoryFile" 110 PetscErrorCode PETSC_DLLEXPORT PetscLogCloseHistoryFile(FILE **fd) 111 { 112 PetscErrorCode ierr; 113 PetscMPIInt rank; 114 char date[64]; 115 int err; 116 117 PetscFunctionBegin; 118 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 119 if (!rank) { 120 ierr = PetscGetDate(date,64);CHKERRQ(ierr); 121 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 122 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 123 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 124 err = fflush(*fd); 125 if (err) SETERRQ(PETSC_ERR_SYS,"fflush() failed on file"); 126 err = fclose(*fd); 127 if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file"); 128 } 129 PetscFunctionReturn(0); 130 } 131 132 /* ------------------------------------------------------------------------------*/ 133 134 /* 135 This is ugly and probably belongs somewhere else, but I want to 136 be able to put a true MPI abort error handler with command line args. 137 138 This is so MPI errors in the debugger will leave all the stack 139 frames. The default abort cleans up and exits. 140 */ 141 142 #undef __FUNCT__ 143 #define __FUNCT__ "Petsc_MPI_AbortOnError" 144 void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag) 145 { 146 PetscFunctionBegin; 147 (*PetscErrorPrintf)("MPI error %d\n",(int)*flag); 148 abort(); 149 } 150 151 #undef __FUNCT__ 152 #define __FUNCT__ "Petsc_MPI_DebuggerOnError" 153 void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag) 154 { 155 PetscErrorCode ierr; 156 157 PetscFunctionBegin; 158 (*PetscErrorPrintf)("MPI error %d\n",(int)*flag); 159 ierr = PetscAttachDebugger(); 160 if (ierr) { /* hopeless so get out */ 161 MPI_Finalize(); 162 exit(*flag); 163 } 164 } 165 166 #undef __FUNCT__ 167 #define __FUNCT__ "PetscEnd" 168 /*@C 169 PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 170 wishes a clean exit somewhere deep in the program. 171 172 Collective on PETSC_COMM_WORLD 173 174 Options Database Keys are the same as for PetscFinalize() 175 176 Level: advanced 177 178 Note: 179 See PetscInitialize() for more general runtime options. 180 181 .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 182 @*/ 183 PetscErrorCode PETSC_DLLEXPORT PetscEnd(void) 184 { 185 PetscFunctionBegin; 186 PetscFinalize(); 187 exit(0); 188 return 0; 189 } 190 191 PetscTruth PetscOptionsPublish = PETSC_FALSE; 192 EXTERN PetscErrorCode PetscSetUseTrMalloc_Private(void); 193 extern PetscTruth petscsetmallocvisited; 194 static char emacsmachinename[256]; 195 196 PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0; 197 PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = 0; 198 199 #undef __FUNCT__ 200 #define __FUNCT__ "PetscSetHelpVersionFunctions" 201 /*@C 202 PetscSetHelpVersionFunctions - Sets functions that print help and version information 203 before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 204 This routine enables a "higher-level" package that uses PETSc to print its messages first. 205 206 Input Parameter: 207 + help - the help function (may be PETSC_NULL) 208 - version - the version function (may be PETSC_NULL) 209 210 Level: developer 211 212 Concepts: package help message 213 214 @*/ 215 PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 216 { 217 PetscFunctionBegin; 218 PetscExternalHelpFunction = help; 219 PetscExternalVersionFunction = version; 220 PetscFunctionReturn(0); 221 } 222 223 #undef __FUNCT__ 224 #define __FUNCT__ "PetscOptionsCheckInitial_Private" 225 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Private(void) 226 { 227 char string[64],mname[PETSC_MAX_PATH_LEN],*f; 228 MPI_Comm comm = PETSC_COMM_WORLD; 229 PetscTruth flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,flgz,flgzout; 230 PetscErrorCode ierr; 231 PetscReal si; 232 int i; 233 PetscMPIInt rank; 234 char version[256]; 235 236 PetscFunctionBegin; 237 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 238 239 /* 240 Setup the memory management; support for tracing malloc() usage 241 */ 242 ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr); 243 #if defined(PETSC_USE_DEBUG) 244 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg1,&flg2);CHKERRQ(ierr); 245 if ((!flg2 || flg1) && !petscsetmallocvisited) { 246 ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr); 247 } 248 #else 249 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr); 250 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc",&flg2,PETSC_NULL);CHKERRQ(ierr); 251 if (flg1 || flg2 || flg3) {ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr);} 252 #endif 253 if (flg3) { 254 ierr = PetscMallocSetDumpLog();CHKERRQ(ierr); 255 } 256 flg1 = PETSC_FALSE; 257 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_debug",&flg1,PETSC_NULL);CHKERRQ(ierr); 258 if (flg1) { 259 ierr = PetscSetUseTrMalloc_Private();CHKERRQ(ierr); 260 ierr = PetscMallocDebug(PETSC_TRUE);CHKERRQ(ierr); 261 } 262 263 flg1 = PETSC_FALSE; 264 ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg1,PETSC_NULL);CHKERRQ(ierr); 265 if (!flg1) { 266 flg1 = PETSC_FALSE; 267 ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg1,PETSC_NULL);CHKERRQ(ierr); 268 } 269 if (flg1) { 270 ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 271 } 272 273 /* 274 Set the display variable for graphics 275 */ 276 ierr = PetscSetDisplay();CHKERRQ(ierr); 277 278 /* 279 Print the PETSc version information 280 */ 281 ierr = PetscOptionsHasName(PETSC_NULL,"-v",&flg1);CHKERRQ(ierr); 282 ierr = PetscOptionsHasName(PETSC_NULL,"-version",&flg2);CHKERRQ(ierr); 283 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg3);CHKERRQ(ierr); 284 if (flg1 || flg2 || flg3){ 285 286 /* 287 Print "higher-level" package version message 288 */ 289 if (PetscExternalVersionFunction) { 290 ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 291 } 292 293 ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 294 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 295 ------------------------------\n");CHKERRQ(ierr); 296 ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 297 ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 298 ierr = (*PetscHelpPrintf)(comm,"See docs/copyright.html for copyright information\n");CHKERRQ(ierr); 299 ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 300 ierr = (*PetscHelpPrintf)(comm,"See docs/troubleshooting.html for problems.\n");CHKERRQ(ierr); 301 ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 302 ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 303 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------\ 304 ------------------------------\n");CHKERRQ(ierr); 305 } 306 307 /* 308 Print "higher-level" package help message 309 */ 310 if (flg3){ 311 if (PetscExternalHelpFunction) { 312 ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 313 } 314 } 315 316 /* 317 Setup the error handling 318 */ 319 flg1 = PETSC_FALSE; 320 ierr = PetscOptionsGetTruth(PETSC_NULL,"-fp_trap",&flg1,PETSC_NULL);CHKERRQ(ierr); 321 if (flg1) { ierr = PetscSetFPTrap(PETSC_FP_TRAP_ON);CHKERRQ(ierr); } 322 flg1 = PETSC_FALSE; 323 ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_abort",&flg1,PETSC_NULL);CHKERRQ(ierr); 324 if (flg1) { ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr)} 325 flg1 = PETSC_FALSE; 326 ierr = PetscOptionsGetTruth(PETSC_NULL,"-on_error_mpiabort",&flg1,PETSC_NULL);CHKERRQ(ierr); 327 if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr)} 328 flg1 = PETSC_FALSE; 329 ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpi_return_on_error",&flg1,PETSC_NULL);CHKERRQ(ierr); 330 if (flg1) { 331 ierr = MPI_Errhandler_set(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr); 332 } 333 flg1 = PETSC_FALSE; 334 ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr); 335 if (!flg1) { ierr = PetscPushSignalHandler(PetscDefaultSignalHandler,(void*)0);CHKERRQ(ierr) } 336 337 /* 338 Setup debugger information 339 */ 340 ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 341 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr); 342 if (flg1) { 343 MPI_Errhandler err_handler; 344 345 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 346 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr); 347 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 348 ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr); 349 } 350 ierr = PetscOptionsGetString(PETSC_NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr); 351 if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 352 ierr = PetscOptionsGetString(PETSC_NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr); 353 ierr = PetscOptionsGetString(PETSC_NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr); 354 if (flg1 || flg2) { 355 PetscMPIInt size; 356 PetscInt lsize,*nodes; 357 MPI_Errhandler err_handler; 358 /* 359 we have to make sure that all processors have opened 360 connections to all other processors, otherwise once the 361 debugger has stated it is likely to receive a SIGUSR1 362 and kill the program. 363 */ 364 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 365 if (size > 2) { 366 PetscMPIInt dummy = 0; 367 MPI_Status status; 368 for (i=0; i<size; i++) { 369 if (rank != i) { 370 ierr = MPI_Send(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD);CHKERRQ(ierr); 371 } 372 } 373 for (i=0; i<size; i++) { 374 if (rank != i) { 375 ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,PETSC_COMM_WORLD,&status);CHKERRQ(ierr); 376 } 377 } 378 } 379 /* check if this processor node should be in debugger */ 380 ierr = PetscMalloc(size*sizeof(PetscInt),&nodes);CHKERRQ(ierr); 381 lsize = size; 382 ierr = PetscOptionsGetIntArray(PETSC_NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 383 if (flag) { 384 for (i=0; i<lsize; i++) { 385 if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 386 } 387 } 388 if (!flag) { 389 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 390 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 391 if (flg1) { 392 ierr = PetscAttachDebugger();CHKERRQ(ierr); 393 } else { 394 ierr = PetscStopForDebugger();CHKERRQ(ierr); 395 } 396 ierr = MPI_Errhandler_create((MPI_Handler_function*)Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 397 ierr = MPI_Errhandler_set(comm,err_handler);CHKERRQ(ierr); 398 } 399 ierr = PetscFree(nodes);CHKERRQ(ierr); 400 } 401 402 ierr = PetscOptionsGetString(PETSC_NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr); 403 if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr)} 404 405 #if defined(PETSC_USE_SOCKET_VIEWER) 406 /* 407 Activates new sockets for zope if needed 408 */ 409 ierr=PetscOptionsHasName(PETSC_NULL,"-zope", &flgz);CHKERRQ(ierr); 410 ierr=PetscOptionsHasName(PETSC_NULL,"-nostdout", &flgzout);CHKERRQ(ierr); 411 if(flgz){ 412 extern FILE* PETSC_ZOPEFD; 413 int sockfd; 414 char hostname[256]; 415 char username[256]; 416 int remoteport = 9999; 417 ierr=PetscOptionsGetString(PETSC_NULL, "-zope", hostname, 256, &flgz);CHKERRQ(ierr); 418 if(!hostname[0]){ 419 ierr=PetscGetHostName(hostname,256);CHKERRQ(ierr);} 420 ierr=PetscOpenSocket(hostname, remoteport, &sockfd);CHKERRQ(ierr); 421 ierr = PetscGetUserName(username, 256); 422 PETSC_ZOPEFD = fdopen(sockfd, "w"); 423 if(flgzout){ 424 PETSC_STDOUT = PETSC_ZOPEFD; 425 fprintf(PETSC_STDOUT, "<<<user>>> %s\n",username); 426 fprintf(PETSC_STDOUT, "<<<start>>>"); 427 } 428 else{ 429 fprintf(PETSC_ZOPEFD, "<<<user>>> %s\n",username); 430 fprintf(PETSC_ZOPEFD, "<<<start>>>"); 431 }} 432 #endif 433 434 /* 435 Setup profiling and logging 436 */ 437 #if defined (PETSC_USE_INFO) 438 { 439 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 440 ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr); 441 if (flg1 && logname[0]) { 442 PetscInfoAllow(PETSC_TRUE,logname); 443 } else if (flg1) { 444 PetscInfoAllow(PETSC_TRUE,PETSC_NULL); 445 } 446 } 447 #endif 448 #if defined(PETSC_USE_LOG) 449 mname[0] = 0; 450 ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 451 if (flg1) { 452 if (mname[0]) { 453 ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 454 } else { 455 ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr); 456 } 457 } 458 #if defined(PETSC_HAVE_MPE) 459 flg1 = PETSC_FALSE; 460 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_mpe",&flg1,PETSC_NULL);CHKERRQ(ierr); 461 if (flg1) PetscLogMPEBegin(); 462 #endif 463 flg1 = PETSC_FALSE; 464 flg2 = PETSC_FALSE; 465 flg3 = PETSC_FALSE; 466 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr); 467 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr); 468 ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr); 469 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 470 else if (flg2 || flg3) { ierr = PetscLogBegin();CHKERRQ(ierr);} 471 472 ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 473 if (flg1) { 474 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 475 FILE *file; 476 if (mname[0]) { 477 sprintf(name,"%s.%d",mname,rank); 478 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 479 file = fopen(fname,"w"); 480 if (!file) { 481 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 482 } 483 } else { 484 file = PETSC_STDOUT; 485 } 486 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 487 } 488 #endif 489 490 /* 491 Setup building of stack frames for all function calls 492 */ 493 #if defined(PETSC_USE_DEBUG) 494 ierr = PetscStackCreate();CHKERRQ(ierr); 495 #endif 496 497 ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr); 498 499 /* 500 Print basic help message 501 */ 502 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 503 if (flg1) { 504 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 505 ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option");CHKERRQ(ierr); 506 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 507 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 508 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 509 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 510 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 511 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 512 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 513 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 514 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 515 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 516 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 517 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 518 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 519 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 520 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 521 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 522 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 523 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 524 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 525 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 526 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 527 ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 528 ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr); 529 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 530 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 531 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 532 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 533 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 534 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 535 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 536 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 537 #if defined(PETSC_USE_LOG) 538 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 539 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 540 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 541 #if defined(PETSC_HAVE_MPE) 542 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 543 #endif 544 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 545 #endif 546 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 547 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 548 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 549 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 550 } 551 552 ierr = PetscOptionsGetReal(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 553 if (flg1) { 554 ierr = PetscSleep(si);CHKERRQ(ierr); 555 } 556 557 ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 558 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 559 if (f) { 560 ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 561 } 562 563 564 PetscFunctionReturn(0); 565 } 566 567 568