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

📄 pos_formulation.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
字号:
#define RCSID "$Id: Pos_Formulation.c,v 1.53 2006/02/26 00:42:59 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 "Numeric.h"#include "Treatment_Formulation.h"#include "CurrentData.h"#include "Get_DofOfElement.h"#include "Pos_Formulation.h"#include "Pos_Print.h"#include "Pos_Format.h"#include "GmshClient.h"extern int  InteractiveInterrupt ;/* ------------------------------------------------------------------------ *//*  P o s _ F o r m u l a t i o n                                           *//* ------------------------------------------------------------------------ */void  Pos_Formulation(struct Formulation       *Formulation_P,		      struct PostProcessing    *PostProcessing_P,		      struct PostSubOperation  *PostSubOperation_P) {  struct PostQuantity   *NCPQ_P = NULL, *CPQ_P = NULL ;  double                 Pulsation ;  int                    i, Order = 0 ;  char                   FileName[MAX_FILE_NAME_LENGTH], AddExt[100];  GetDP_Begin("Pos_Formulation");  if(PostSubOperation_P->FileOut){    if(PostSubOperation_P->FileOut[0] == '/' ||        PostSubOperation_P->FileOut[0] == '\\'){      strcpy(FileName, PostSubOperation_P->FileOut);    }    else{      strcpy(FileName, Name_Path);      strcat(FileName, PostSubOperation_P->FileOut);    }    if(PostSubOperation_P->LastTimeStepOnly) {      /* We should implement something more general, like strings with	 tags (e.g., "file_%TimeStep.pos") */      sprintf(AddExt, "_%03d", (int)Current.TimeStep) ;      strcat(FileName, AddExt);    }    if(!PostSubOperation_P->CatFile) {      if((PostStream = fopen(FileName, Flag_BIN ? "wb" : "w")))	Msg(DIRECT, "          > '%s'", FileName) ;      else	Msg(GERROR, "Unable to open file '%s'", FileName) ;    }    else {      if((PostStream = fopen(FileName, Flag_BIN ? "ab" : "a")))	Msg(DIRECT, "         >> '%s'", FileName) ;      else	Msg(GERROR, "Unable to open file '%s'", FileName) ;    }  }  else{    PostStream = stdout ;  }  PrintStream = PostStream ;  if(PostSubOperation_P->CatFile == 2)  fprintf(PostStream, "\n\n") ;  /*  two blanks lines for -index in gnuplot  */  Format_PostFormat(PostSubOperation_P->Format) ;  if(PostSubOperation_P->PostQuantityIndex[0] >= 0) {    if(PostSubOperation_P->PostQuantitySupport[0] < 0) { /* Noncumulative */      NCPQ_P = 	(struct PostQuantity *) List_Pointer(PostProcessing_P->PostQuantity, 					     PostSubOperation_P->PostQuantityIndex[0]) ;      CPQ_P = 	(PostSubOperation_P->PostQuantityIndex[1] >= 0) ?	(struct PostQuantity *)List_Pointer(PostProcessing_P->PostQuantity, 					    PostSubOperation_P->PostQuantityIndex[1]) :	NULL ;      Order = 1 ;    }    else {      CPQ_P = 	(struct PostQuantity *) List_Pointer(PostProcessing_P->PostQuantity, 					     PostSubOperation_P->PostQuantityIndex[0]) ;      NCPQ_P = 	(PostSubOperation_P->PostQuantityIndex[1] >= 0) ?	(struct PostQuantity *)List_Pointer(PostProcessing_P->PostQuantity, 					    PostSubOperation_P->PostQuantityIndex[1]) :	NULL ;      Order = 0 ;    }  }  if(List_Nbr(PostSubOperation_P->Frequency_L)){    if(List_Nbr(PostSubOperation_P->Frequency_L) > List_Nbr(Current.DofData->Pulsation))      Msg(GERROR, "Too many frequencies specified in PostOperation");    for(i = 0 ; i < List_Nbr(PostSubOperation_P->Frequency_L) ; i++){      Pulsation = *((double *)List_Pointer(PostSubOperation_P->Frequency_L, i)) * TWO_PI ;      List_Write(Current.DofData->Pulsation, i, &Pulsation) ;    }  }  switch (Formulation_P->Type) {  case FEMEQUATION :    Pos_FemFormulation(Formulation_P, NCPQ_P, CPQ_P, Order, PostSubOperation_P) ;    break ;  case GLOBALEQUATION :    break ;  default :    Msg(GERROR, "Unknown Type for Formulation (%s)", Formulation_P->Name) ;    break;  }  if(PostSubOperation_P->FileOut){    fclose(PostStream) ;    if(Flag_SOCKET > 0 &&        (PostSubOperation_P->Format == FORMAT_GMSH_PARSED ||	PostSubOperation_P->Format == FORMAT_GMSH)){      Gmsh_SendString(Flag_SOCKET, GMSH_CLIENT_MERGE_FILE, FileName);    }  }  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  P o s _ F e m F o r m u l a t i o n                                     *//* ------------------------------------------------------------------------ */void  Pos_FemFormulation(struct Formulation       *Formulation_P,			 struct PostQuantity      *NCPQ_P, 			 struct PostQuantity      *CPQ_P, 			 int                       Order,			 struct PostSubOperation  *PostSubOperation_P) {  struct Element           Element ;  struct DefineQuantity   *DefineQuantity_P0 ;  struct QuantityStorage  *QuantityStorage_P0, QuantityStorage ;  List_T   *QuantityStorage_L ;  int       i ;    GetDP_Begin("Pos_FemFormulation");  Get_InitDofOfElement(&Element) ;  DefineQuantity_P0 = (struct DefineQuantity*)    List_Pointer(Formulation_P->DefineQuantity, 0) ;  QuantityStorage_L = List_Create(List_Nbr(Formulation_P->DefineQuantity),  1, 				  sizeof (struct QuantityStorage) ) ;  for(i = 0 ; i < List_Nbr(Formulation_P->DefineQuantity) ; i++) {        QuantityStorage.DefineQuantity = DefineQuantity_P0 + i ;    if(QuantityStorage.DefineQuantity->Type == INTEGRALQUANTITY &&       QuantityStorage.DefineQuantity->IntegralQuantity.DefineQuantityIndexDof < 0){      QuantityStorage.TypeQuantity = VECTOR ; /* on ne sait pas... */    }    else{      QuantityStorage.TypeQuantity = 	((struct FunctionSpace *)	 List_Pointer(Problem_S.FunctionSpace,		      (DefineQuantity_P0+i)->FunctionSpaceIndex))->Type ;    }        QuantityStorage.NumLastElementForFunctionSpace = 0 ;    List_Add(QuantityStorage_L, &QuantityStorage) ;  }  QuantityStorage_P0 = (struct QuantityStorage*)List_Pointer(QuantityStorage_L, 0) ;  switch (PostSubOperation_P->Type) {  case POP_PRINT :    switch (PostSubOperation_P->SubType) {    case PRINT_ONREGION :      Pos_PrintOnRegion(NCPQ_P, CPQ_P, Order, DefineQuantity_P0, 			QuantityStorage_P0, PostSubOperation_P) ;       break ;    case PRINT_ONELEMENTSOF :    case PRINT_ONGRID   :      Pos_PrintOnElementsOf(NCPQ_P, CPQ_P, Order, DefineQuantity_P0, 			    QuantityStorage_P0, PostSubOperation_P) ;       break ;    case PRINT_ONSECTION_1D :    case PRINT_ONSECTION_2D :      Pos_PrintOnSection(NCPQ_P, CPQ_P, Order, DefineQuantity_P0,			 QuantityStorage_P0, PostSubOperation_P) ;      break ;    case PRINT_ONGRID_0D    :    case PRINT_ONGRID_1D    :    case PRINT_ONGRID_2D    :    case PRINT_ONGRID_3D    :    case PRINT_ONGRID_PARAM :      Pos_PrintOnGrid(NCPQ_P, CPQ_P, Order, DefineQuantity_P0, 		      QuantityStorage_P0, PostSubOperation_P) ;       break ;    case PRINT_WITHARGUMENT :      Pos_PrintWithArgument(NCPQ_P, CPQ_P, Order, DefineQuantity_P0, 			    QuantityStorage_P0, PostSubOperation_P) ;      break ;    default :      Msg(GERROR, "Unknown Operation type for Print");       break;    }        break ;      case POP_EXPRESSION :    Pos_PrintExpression(PostSubOperation_P);    break;  case POP_GROUP :    Pos_PrintGroup(PostSubOperation_P);    break;  default :    Msg(GERROR, "Unknown PostSubOperation type") ;    break;  }  if(InteractiveInterrupt) InteractiveInterrupt=0 ;    List_Delete(QuantityStorage_L);  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  P o s _ I n i t T i m e S t e p s                                       *//* ------------------------------------------------------------------------ */int Pos_InitTimeSteps(struct PostSubOperation *PostSubOperation_P) {  int iTime, NbTimeStep;  GetDP_Begin("Pos_InitTimeSteps");  if(PostSubOperation_P->LastTimeStepOnly){    iTime = List_Nbr(Current.DofData->Solutions) - 1;    List_Reset(PostSubOperation_P->TimeStep_L);    List_Add(PostSubOperation_P->TimeStep_L, &iTime);    GetDP_Return(1);  }  NbTimeStep = List_Nbr(PostSubOperation_P->TimeStep_L);  if(!NbTimeStep || !PostSubOperation_P->FrozenTimeStepList){    NbTimeStep = List_Nbr(Current.DofData->Solutions);    List_Reset(PostSubOperation_P->TimeStep_L);    for(iTime = 0 ; iTime < NbTimeStep ; iTime++)      List_Add(PostSubOperation_P->TimeStep_L, &iTime);  }    GetDP_Return(NbTimeStep);}/* ------------------------------------------------------------------------ *//*  P o s _ I n i t A l l S o l u t i o n s                                 *//* ------------------------------------------------------------------------ */void Pos_InitAllSolutions(List_T * TimeStep_L, int Index_TimeStep) {  int  Num_TimeStep, k, Num_Solution ;  GetDP_Begin("Pos_InitAllSolutions");  List_Read(TimeStep_L, Index_TimeStep, &Num_TimeStep) ;  for(k = 0 ; k < Current.NbrSystem ; k++)    if( (Num_Solution = MIN(List_Nbr((Current.DofData_P0+k)->Solutions)-1,			    Num_TimeStep)) >=0 )      (Current.DofData_P0+k)->CurrentSolution = (struct Solution*)	List_Pointer((Current.DofData_P0+k)->Solutions, Num_Solution) ;  Current.Time = Current.DofData->CurrentSolution->Time ;  Current.TimeImag = Current.DofData->CurrentSolution->TimeImag ;  Current.TimeStep = Num_TimeStep ;  GetDP_End ;}

⌨️ 快捷键说明

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