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 = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);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/faq.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 flg1 = PETSC_FALSE; 439 ierr = PetscOptionsGetTruth(PETSC_NULL,"-info",&flg1,PETSC_NULL);CHKERRQ(ierr); 440 if (flg1) { 441 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 442 ierr = PetscOptionsGetString(PETSC_NULL,"-info",logname,250,&flg1);CHKERRQ(ierr); 443 if (logname[0]) { 444 PetscInfoAllow(PETSC_TRUE,logname); 445 } else { 446 PetscInfoAllow(PETSC_TRUE,PETSC_NULL); 447 } 448 } 449 #endif 450 #if defined(PETSC_USE_LOG) 451 mname[0] = 0; 452 ierr = PetscOptionsGetString(PETSC_NULL,"-log_history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 453 if (flg1) { 454 if (mname[0]) { 455 ierr = PetscLogOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 456 } else { 457 ierr = PetscLogOpenHistoryFile(0,&petsc_history);CHKERRQ(ierr); 458 } 459 } 460 #if defined(PETSC_HAVE_MPE) 461 flg1 = PETSC_FALSE; 462 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_mpe",&flg1,PETSC_NULL);CHKERRQ(ierr); 463 if (flg1) PetscLogMPEBegin(); 464 #endif 465 flg1 = PETSC_FALSE; 466 flg2 = PETSC_FALSE; 467 flg3 = PETSC_FALSE; 468 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_all",&flg1,PETSC_NULL);CHKERRQ(ierr); 469 ierr = PetscOptionsGetTruth(PETSC_NULL,"-log",&flg2,PETSC_NULL);CHKERRQ(ierr); 470 ierr = PetscOptionsHasName(PETSC_NULL,"-log_summary",&flg3);CHKERRQ(ierr); 471 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 472 else if (flg2 || flg3) { ierr = PetscLogBegin();CHKERRQ(ierr);} 473 474 ierr = PetscOptionsGetString(PETSC_NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 475 if (flg1) { 476 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 477 FILE *file; 478 if (mname[0]) { 479 sprintf(name,"%s.%d",mname,rank); 480 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 481 file = fopen(fname,"w"); 482 if (!file) { 483 SETERRQ1(PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 484 } 485 } else { 486 file = PETSC_STDOUT; 487 } 488 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 489 } 490 #endif 491 492 /* 493 Setup building of stack frames for all function calls 494 */ 495 #if defined(PETSC_USE_DEBUG) 496 ierr = PetscStackCreate();CHKERRQ(ierr); 497 #endif 498 499 ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&PetscOptionsPublish,PETSC_NULL);CHKERRQ(ierr); 500 501 /* 502 Print basic help message 503 */ 504 ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr); 505 if (flg1) { 506 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 507 ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option");CHKERRQ(ierr); 508 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is");CHKERRQ(ierr); 509 ierr = (*PetscHelpPrintf)(comm," detected. Useful \n only when run in the debugger\n");CHKERRQ(ierr); 510 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 511 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 512 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 513 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 514 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 515 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 516 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 517 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 518 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 519 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 520 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 521 ierr = (*PetscHelpPrintf)(comm," -display display: Location where graphics and debuggers are displayed\n");CHKERRQ(ierr); 522 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 523 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 524 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 525 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 526 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 527 ierr = (*PetscHelpPrintf)(comm," -malloc: use our error checking malloc\n");CHKERRQ(ierr); 528 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use error checking malloc\n");CHKERRQ(ierr); 529 ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 530 ierr = (*PetscHelpPrintf)(comm," -malloc_log: keeps log of all memory allocations\n");CHKERRQ(ierr); 531 ierr = (*PetscHelpPrintf)(comm," -malloc_debug: enables extended checking for memory corruption\n");CHKERRQ(ierr); 532 ierr = (*PetscHelpPrintf)(comm," -options_table: dump list of options inputted\n");CHKERRQ(ierr); 533 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 534 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 535 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 536 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 537 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 538 ierr = (*PetscHelpPrintf)(comm," -memory_info: print memory usage at end of run\n");CHKERRQ(ierr); 539 #if defined(PETSC_USE_LOG) 540 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 541 ierr = (*PetscHelpPrintf)(comm," -log[_all _summary]: logging objects and events\n");CHKERRQ(ierr); 542 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 543 #if defined(PETSC_HAVE_MPE) 544 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through upshot\n");CHKERRQ(ierr); 545 #endif 546 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 547 #endif 548 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 549 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 550 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 551 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 552 } 553 554 ierr = PetscOptionsGetReal(PETSC_NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 555 if (flg1) { 556 ierr = PetscSleep(si);CHKERRQ(ierr); 557 } 558 559 ierr = PetscOptionsGetString(PETSC_NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 560 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 561 if (f) { 562 ierr = PetscInfoDeactivateClass(PETSC_NULL);CHKERRQ(ierr); 563 } 564 565 566 PetscFunctionReturn(0); 567 } 568 569 570