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