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