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