⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
字号:
#define RCSID "$Id: Message.c,v 1.84 2006/02/26 16:34:28 geuzaine Exp $"/* * Copyright (C) 1997-2006 P. Dular, C. Geuzaine * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. * * Please report all bugs and problems to <getdp@geuz.org>. */#include <signal.h>#include "GetDP.h"#include "GetDPVersion.h"#include "CurrentData.h"#include "LinAlg.h"#include "GmshClient.h"#include "OS.h"#if !defined(GETDP_EXTRA_VERSION)#error #error include/GetDPVersion.h is not up-to-date. #error Please run 'make tag'.#error#endifextern int     InteractiveLevel, InteractiveInterrupt ;void FinalizeAndExit(void);/* ------------------------------------------------------------------------ *//*  I n f o                                                                 *//* ------------------------------------------------------------------------ */char acronym[]   = "GetDP, a General environment for the treatment of Discrete Problems\n";char copyright[] = "Copyright (C) 1997-2006 Patrick Dular and Christophe Geuzaine\n";char version[]   = "Version      : %s\n";char license[]   = "License      : %s\n";char os[]        = "Build OS     : %s\n";char date[]      = "Build date   : %s\n";char host[]      = "Build host   : %s\n";char packager[]  = "Packager     : %s\n";char url[]       = "Web site     : http://www.geuz.org/getdp/\n";char email[]     = "Mailing list : getdp@geuz.org\n";#if defined(HAVE_SPARSKIT)#if defined(HAVE_ILU_FLOAT)char solver[]    = "Solver       : Sparskit (real arithmetic, single precision preconditioning)\n";#elsechar solver[]    = "Solver       : Sparskit (real arithmetic)\n";#endif#else#if defined(PETSC_USE_COMPLEX)char solver[]    = "Solver       : PETSc (complex arithmetic)\n";#elsechar solver[]    = "Solver       : PETSc (real arithmetic)\n";#endif#endifchar help[] = #if defined(HAVE_SPARSKIT)  "Usage: %s [file] [options]\n"#else  "Usage: [mpirun [MPI options]] %s [file] [options] [PETSc options]\n"#endif  "Processing options:\n"  "  -pre 'Resolution'         pre-processing\n"  "  -cal                      processing\n"  "  -pos 'PostOperation(s)'   post-processing\n"  "  -ipos 'PostProcessing(s)' interactive post-processing\n"  "  -msh file                 read mesh (in msh format) from file\n"  "  -restart                  resume processing from where it stopped\n"  "  -solve 'Resolution'       same as -pre 'Resolution' -cal\n"  "  -split                    save processing results in separate files\n"  "  -res file(s)              load processing results from file(s)\n"  "  -name string              use string as generic file name\n"  "  -adapt file               read adaptation constraints from file\n"  "  -order num                restrict maximum interpolation order\n"#if defined(HAVE_SPARSKIT)  "Linear solver options:\n"  "  -solver file              specify parameter file (default: solver.par)\n"  "  -'Parameter' num          override value of solver parameter 'Parameter'\n"#endif  "Output options:\n"  "  -bin                      use binary format for output files\n"  "  -log                      save processing history in log file\n"  "  -socket string            communicate through socket string\n"  "Other options:\n"  "  -check                    interactive check of problem structure\n"  "  -v num                    set verbosity level (default: 4)\n"  "  -p num                    set progress indicator update (default: 10)\n"  "  -version                  show version number\n"  "  -info                     show detailed version information\n"  "  -help                     show this message\n"  ;void Info (int level, char *arg0){    switch(level){  case 0 :    fprintf(stderr, acronym);    fprintf(stderr, copyright);    fprintf(stderr, help, arg0);    break;  case 1:    fprintf(stderr, "%s\n", GETDP_VERSION);    break;  case 2:    fprintf(stderr, version, GETDP_VERSION);    fprintf(stderr, license, GETDP_SHORT_LICENSE);    fprintf(stderr, os, GETDP_OS);    fprintf(stderr, date, GETDP_DATE);    fprintf(stderr, host, GETDP_HOST);    fprintf(stderr, packager, GETDP_PACKAGER);    fprintf(stderr, solver);    fprintf(stderr, url);    fprintf(stderr, email);    break;  }  FinalizeAndExit();}/* ------------------------------------------------------------------------ *//*  S i g n a l                                                             *//* ------------------------------------------------------------------------ */void Signal (int sig_num){  /* It is VERY wrong to call stdio functions in a signal handler. But     who cares? ;-) */  if(sig_num == SIGINT){    if(!InteractiveLevel){      if(TreatmentStatus == _CAL && Flag_VERBOSE > 1){	Msg(BIGINFO, "Switching to low verbosity mode"); 	Flag_VERBOSE = 1;      }      else Msg(GERROR, "Interrupt (generated from terminal special character)");     }    else      InteractiveInterrupt = 1;    return;  }  switch (sig_num){  case SIGSEGV :     Msg(BIGERROR, "Segmentation violation (invalid memory reference)");    break;  case SIGFPE :     Msg(BIGERROR, "Floating point exception (division by zero?)");    break;  default :    Msg(GERROR, "Unknown signal");    break;  }}/* ------------------------------------------------------------------------ *//*  M s g                                                                   *//* ------------------------------------------------------------------------ */void Print_GetDPContext(FILE *stream){#if defined(HAVE_DEBUG_STACK)  char FileName[256], FileVersion[256], FunctionName[256], FileAuthor[256];  char Dum[256], FileDate[256];  int  i, Line ;  fprintf(stream, "Debug     : Stack trace (depth = %d) is printed below\n",	  GetDP_CurrentStackIndex);  for(i = 0; i < GetDP_CurrentStackIndex; i++){    sscanf(GetDP_CurrentSourceFile[i],	   "$Id: %s %s %s %s %s", FileName, FileVersion, FileDate, Dum, FileAuthor);    FileName[strlen(FileName)-2] = '\0' ;    strcpy(FunctionName, GetDP_CurrentFunction[i]);    Line = GetDP_CurrentSourceLine[i];    fprintf(stream, "'%s' in '%s', line %d (version %s by %s on %s)\n", 	    FunctionName, FileName, Line, FileVersion, FileAuthor, FileDate);  }#endif}void PrintMsg(FILE *stream, int level, int Verbosity, 	      va_list args, char *fmt, int *abort) {  int  verb, nl, gmshlevel;  char *str, prefix[1000], sockmsg[1000];  switch(level){  case CHECK     : verb = 0; nl = 0; str = NULL; break;  case GERROR    : /* fall-through */  case BIGERROR  : verb = 0; nl = 1; str = ERROR_STR; *abort = 1; break;  case WARNING   : verb = 0; nl = 1; str = WARNING_STR; break;  case OPERATION : verb = 2; nl = 1; str = OPERATION_STR; break;  case LOADING   : verb = 2; nl = 1; str = LOADING_STR; break;  case INFO      : verb = 3; nl = 1; str = INFO_STR; break;  case INFO1     : verb = 3; nl = 0; str = INFO_STR; break;  case INFO2     : verb = 3; nl = 0; str = NULL; break;  case INFO3     : verb = 3; nl = 1; str = NULL; break;  case BIGINFO   : verb = 1; nl = 1; str = BIGINFO_STR; break;  case DEBUG     : verb =99; nl = 0; str = NULL; break;  case DEBUG2    : verb =98; nl = 0; str = NULL; break;  case SPARSKIT  : verb = 3; nl = 0; str = SPARSKIT_STR; break;  case PETSC     : verb = 3; nl = 1; str = PETSC_STR; break;  case ITER      : verb = 4; nl = 0; str = NULL; break;  case DIRECT    : /* fall-through */  default        : verb = 1; nl = 1; str = NULL; break;  }  if(Verbosity >= verb || stream == LogStream){    if(Flag_SOCKET > 0 && stream != LogStream){      if(str) strcpy(prefix, str); else strcpy(prefix, "");      vsprintf(sockmsg, fmt, args);      if(!nl) sockmsg[strlen(sockmsg)-1] = '\0' ;      strcat(prefix, sockmsg);      switch(level){      case GERROR   : /* fall-through */      case BIGERROR : gmshlevel = GMSH_CLIENT_ERROR; break;      case WARNING  : gmshlevel = GMSH_CLIENT_WARNING; break;      default       : gmshlevel = GMSH_CLIENT_INFO; break;      }      Gmsh_SendString(Flag_SOCKET, gmshlevel, prefix);    }#if !defined(WIN32)     else{ /* on everything but windows, don't print anything if getdp	     is called with a socket arg: it would be piped to	     .xsession-errors */#endif      if(str) fprintf(stream, str);       vfprintf(stream, fmt, args);       if(nl) fprintf(stream, "\n");      if(level == BIGERROR){	fprintf(stream, WHITE_STR "------------------------------------------------------\n");	fprintf(stream, WHITE_STR "You have discovered a bug in GetDP! You may report it\n");	fprintf(stream, WHITE_STR "by e-mail (together with any helpful data permitting to\n");	fprintf(stream, WHITE_STR "reproduce it) to <getdp@geuz.org>\n");      }      if(*abort){	Print_GetDPContext(stream);      }#if !defined(WIN32)     }#endif  }  fflush(stream);}void PrintResources(FILE *stream, char *fmt, double s, long mem){  char msg[1000];  if(mem)    sprintf(msg, RESOURCES_STR "%scpu %g s / mem %ld kb\n", fmt, s, mem);  else    sprintf(msg, RESOURCES_STR "%scpu %g s\n", fmt, s);  if(Flag_SOCKET > 0)    Gmsh_SendString(Flag_SOCKET, GMSH_CLIENT_INFO, msg);  else    fprintf(stream, msg);}void Msg(int level, char *fmt, ...){  va_list  args;  int      abort = 0;  double   s;  long     mem ;  if(Current.RankCpu && level != PETSC) return ;  if(level == RESOURCES){    if(Flag_LOG || Flag_VERBOSE > 3) GetResources(&s, &mem) ;    if(Flag_VERBOSE > 3) PrintResources(stderr, fmt, s, mem) ;    if(Flag_LOG) PrintResources(LogStream, fmt, s, mem) ;  }  else if(level == SUMMARY){    if(Flag_LOG || Flag_VERBOSE > 0) GetResources(&s, &mem) ;    if(Flag_VERBOSE > 0) PrintResources(stderr, fmt, s, mem) ;    if(Flag_LOG) PrintResources(LogStream, fmt, s, mem) ;  }  else{    va_start (args, fmt);    PrintMsg(stderr,level, Flag_VERBOSE, args, fmt, &abort) ;    if(Flag_LOG) {      PrintMsg(LogStream, level, Flag_VERBOSE, args, fmt, &abort) ;    }    va_end (args);    if(abort){      Debug();      FinalizeAndExit();    }  }}/* ------------------------------------------------------------------------ *//*  P r o g r e s s                                                         *//* ------------------------------------------------------------------------ */void Progress(int current, int final, char *label){  char sockmsg[100];  static int ProgressIndex ;  if(Current.RankCpu || !Flag_VERBOSE || !Flag_PROGRESS) return ;  if(!current){    ProgressIndex = 0;    if(100/(double)final > Flag_PROGRESS) Flag_PROGRESS = 100/final+1 ;  }  if(100*current/(double)final >= ProgressIndex){    if(Flag_SOCKET > 0){      sprintf(sockmsg, "(%s%d %%)", label, ProgressIndex) ;      Gmsh_SendString(Flag_SOCKET, GMSH_CLIENT_PROGRESS, sockmsg);    }    else      fprintf(stderr, "(%s%d %%)     \r", label, ProgressIndex) ;    ProgressIndex += Flag_PROGRESS ;  }  if(current >= final-1){    if(Flag_SOCKET < 0) fprintf(stderr, "                        \r") ;  }}/* ------------------------------------------------------------------------ *//*  D e b u g                                                               *//* ------------------------------------------------------------------------ */void Debug(void){  /* non-empty so that optimizing compilers don't get rid of it */  fprintf(stderr, " ") ;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -