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

📄 pos_interactive.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
字号:
#define RCSID "$Id: Pos_Interactive.c,v 1.31 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 "GetDP.h"#include "Data_Passive.h"#include "Treatment_Formulation.h"#include "Pos_Formulation.h"#include "Print_ProblemStructure.h"#include "CurrentData.h"#include "OS.h"extern int     ErrorLevel ;extern int     InteractiveLevel, InteractiveCompute ; extern int     InteractiveInterrupt ;extern struct  PostProcessing InteractivePostProcessing_S ;extern struct  PostSubOperation InteractivePostSubOperation_S ;extern FILE   *yyin;int   yyparse(void) ;void  FinalizeAndExit(void);void  Help(char *start);void Pos_SaveHistory(FILE *fp);void Pos_UsingHistory();void Pos_AddHistory(char *str);char *Pos_Readline(char *str);/* ------------------------------------------------------------------------ *//*  P o s _ I n t e r a c t i v e                                           *//* ------------------------------------------------------------------------ */void  Pos_Interactive(struct Formulation *Formulation_P,		      struct PostProcessing *PostProcessing_P){  struct PostOperation *PostOperation_P;  int   i, j, post=0;  char *myptr, tmp[1000];  GetDP_Begin("Pos_Interactive");  Pos_UsingHistory();  if(Formulation_P && PostProcessing_P) post = 1;  InteractiveLevel = 1;  Msg(INFO, "Entering interactive mode (type 'h' for help)");  /* add a simple gmsh operation in the stack */  sprintf(tmp,"!gmsh %s", Name_MshFile);  Pos_AddHistory(tmp);  if(post){    PostStream = stdout;    InteractivePostProcessing_S = *PostProcessing_P;    /* add all pertinent PostOperations in the stack */    for(i=0 ; i<List_Nbr(Problem_S.PostOperation); i++){      PostOperation_P = (struct PostOperation*)	List_Pointer(Problem_S.PostOperation, i) ;      if(PostProcessing_P == (struct PostProcessing *)	 List_Pointer(Problem_S.PostProcessing, PostOperation_P->PostProcessingIndex)){	for(j=0 ; j<List_Nbr(PostOperation_P->PostSubOperation) ; j++){	  myptr = Print_PostSubOperation(&Problem_S,PostProcessing_P,					 (struct PostSubOperation *)					 List_Pointer(PostOperation_P->PostSubOperation, j));	  if(strlen(myptr)) Pos_AddHistory(myptr);	  Free(myptr);	}      }    }  }  while (1) {    /* read input char until CR, LF, EOF, ^D */    myptr = Pos_Readline(GETDP_PROMPT_STRING);    InteractiveCompute = ErrorLevel = 0;    /* exit interactive if EOF or ^D */    if(!myptr) break;    /* if there is something in the line */    if(strlen(myptr)){      /* remove ending space and ';' */      while(myptr[strlen(myptr)-1]==' ') myptr[strlen(myptr)-1]='\0';      if(myptr[strlen(myptr)-1]==';') myptr[strlen(myptr)-1]='\0';      /* add the command in the stack */      Pos_AddHistory(myptr);      /* parse some simple stuff here (in order not to consume too         many keywords in GetDP.l) */            if(!strcmp(myptr,"q") || /* exit interactive if q, quit, exit */	 !strcmp(myptr,"Quit") || !strcmp(myptr,"quit") || 	 !strcmp(myptr,"Exit") || !strcmp(myptr,"exit")){	Free(myptr);	break;      }      else if(!strcmp(myptr,"h") || !strcmp(myptr,"help")){ /* simple help */	Help(NULL);      }      else if(!strcmp(myptr,"c") || !strcmp(myptr,"p")){ /* simple check */	Print_ProblemStructure(&Problem_S);      }      else if(strlen(myptr) > 2 && 	      (!strncmp(myptr,"c ",2) || (!strncmp(myptr,"p ",2)))){ /* simple check */	Print_Object(atoi(&myptr[2]), &Problem_S);      }      else if(myptr[0] == '!'){ /* system call preceded by '!' */	system(&myptr[1]);      }      else if(!strcmp(myptr,"dir") || !strcmp(myptr,"ls")){ /* direct system calls */	system("ls -al");      }      else if(!strcmp(myptr,"l") || /* log */	      !strcmp(myptr,"log") || !strcmp(myptr,"Log")){	      	Pos_SaveHistory(stdout);      }      else if(strlen(myptr) > 4 &&	      (!strncmp(myptr,"log ",4) || !strncmp(myptr,"Log ",4))){ /* log to file */	if(!(yyin = fopen(&myptr[4],"w"))){	   Msg(WARNING, "Unable to open file '%s'", &myptr[4]);	}	else{	  Pos_SaveHistory(yyin);	  fclose(yyin);	}      }      else{ /* getdp command */	/* write it in the tmp file */	if(!(yyin = fopen(GETDP_TMP_FILENAME,"w")))	   Msg(GERROR, "Unable to open file '%s'", GETDP_TMP_FILENAME);	fprintf(yyin,"%s;\n",myptr);	fclose(yyin);	/* parse the tmp file */	yyin = fopen(GETDP_TMP_FILENAME,"r");	while(!feof(yyin)) yyparse();	fclose(yyin);      }      /* compute something */      if(post && !ErrorLevel && InteractiveCompute){	InteractiveInterrupt = 0;	Pos_Formulation(Formulation_P, PostProcessing_P, &InteractivePostSubOperation_S);      }      Free(myptr);    }  }  InteractiveLevel = 0;  /* delete the tmp file */  UnlinkFile(GETDP_TMP_FILENAME);  if(!post) FinalizeAndExit();  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  H e l p                                                                 *//* ------------------------------------------------------------------------ */void Help_Print(void){   printf(" The Print operation has the structure\n"	 " \n"	 "    Print[ POST-QUANTITY-TERM, WHERE, OPTIONS ]\n"	 " \n"	 " The WHERE argument specifies where the data should be evaluated in the\n"	 " three-dimensional space, and can be one of the following:\n"	 " \n"	 "    OnElementsOf GROUP-DEF\n"	 "    OnRegion     GROUP-DEF\n"	 "    OnGlobal\n"	 "    OnSection    { {EXPR-CST-LIST} {EXPR-CST-LIST} {EXPR-CST-LIST} }\n"	 "    OnGrid       GROUP-DEF\n"	 "    OnGrid       {EXPR,EXPR,EXPR} { {EXPR-CST-LIST}, {EXPR-CST-LIST},\n"	 "                  {EXPR-CST-LIST} }\n"	 "    OnPoint      {EXPR-CST-LIST}\n"	 "    OnLine       { {EXPR-CST-LIST} {EXPR-CST-LIST} } {EXPR-CST}\n"	 "    OnPlane      { {EXPR-CST-LIST} {EXPR-CST-LIST} {EXPR-CST-LIST} }\n"	 "                  {EXPR-CST,EXPR-CST}\n"	 "    OnBox        { {EXPR-CST-LIST} {EXPR-CST-LIST} {EXPR-CST-LIST}\n"	 "                  {EXPR-CST-LIST} } {EXPR-CST,EXPR-CST,EXPR-CST}\n"	 " \n"	 " Check the user's manual (section 'Types for PostOperation') for the\n"	 " detailed description of each operation as well as the list of\n"	 " available OPTIONS.\n"	 " \n"	 " It is possible to interrupt the current Print operation by typing\n"	 " <Ctrl-C>.\n");  /*  char topic[128] ;  while(1){    printf(" \n"	   "Help topics available for Print:\n"	   "    file\n"	   " \n"	   "Help topic: ");    fgets(topic,128,stdin) ;    if     (!strcmp(topic, "file\n")) Help_File();    else if(!strlen(topic) || !strcmp(topic, "\n")) break;    else{      topic[strlen(topic)-1] = '\0';      printf("Sorry, no help for '%s'\n", topic);    }  }  */}void Help_Check(void) {   printf(" The Check operation permits to interactively check the problem definition\n"	 " structure. The syntax for the Check operation is\n"	 " \n"	 "    Check OBJECT\n"	 " \n"	 " where OBJECT is one of the GetDP objects, i.e. Group, Function, Constraint,\n"	 " Jacobian, Integration, FunctionSpace, Formulation, Resolution,\n"	 " PostProcessing or PostOperation.\n"	 " \n"	 " Shortcuts are also available: 'c 1' is the same as 'Check Group'.\n"	 );}void Help_Log(void) {   printf(" The Log operation permits to print the operation history. To print the\n"	 " history into a file name FILE, type\n"	 " \n"	 "    Log FILE\n"	 " \n"	 " To print simply print the history on the screen, type\n"	 " \n"	 "    Log\n"	 " \n"	 " The default Log is also available with the shortcut 'l'.\n");}void Help_Cpu(void) {   printf(" The Cpu operation prints the current resources consumed by GetDP.\n");}void Help_Help(void) {   printf(" To access the help on the topic TOPIC, just type\n"	 " \n"	 	 "    Help TOPIC\n"	 " \n"	 	 " The default help is also available with the shortcut 'h'.\n");}void Help_Quit(void) {   printf(" The Quit operation terminates the interactive mode.\n"	 " Synonyms for Quit are 'q', 'quit', 'exit' and 'Exit'.\n");}void Help(char *start){  char topic[128] ;  if(!start){    printf(" Welcome to the interactive GetDP mode!\n"	   " \n"	   " Just type any operation after the 'getdp>' prompt and press\n"	   " <return> to execute it. A list of pertinent operations for this\n"	   " interactive session is already preloaded in the command line\n"	   " history. You can browse this history by pressing the <up> and\n"	   " <down> keyboard arrows.\n"	   " \n"	   " Editing capabilities similar to those of Emacs are offered while\n"	   " the command line is entered. A line beginning with a '!' is\n"	   " treated as a system call.\n"	   " \n"	   "Help topics available:\n"	   "    Print   Check   Log   Cpu   Help   Quit\n"	   " \n"	   "Help topic: ");    fgets(topic,128,stdin) ;  }  else{    strncpy(topic,start,127) ;    strcat(topic,"\n") ;  }  if     (!strcmp(topic, "Print\n")) Help_Print();  else if(!strcmp(topic, "Check\n")) Help_Check();  else if(!strcmp(topic, "Log\n"))   Help_Log();  else if(!strcmp(topic, "Cpu\n"))   Help_Cpu();  else if(!strcmp(topic, "Help\n"))  Help_Help();  else if(!strcmp(topic, "Quit\n"))  Help_Quit();  else if(!strlen(topic) || !strcmp(topic, "\n")){  }  else{    topic[strlen(topic)-1] = '\0';    printf("Sorry, no help for '%s'\n", topic);  }}

⌨️ 快捷键说明

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