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