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