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

📄 get_functionvalue.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
字号:
#define RCSID "$Id: Get_FunctionValue.c,v 1.17 2006/02/26 00:42:54 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 "Treatment_Formulation.h"#include "Cal_Quantity.h"#include "Get_Geometry.h"#include "GeoData.h"#include "CurrentData.h"#include "Numeric.h"#include "Tools.h"/* ------------------------------------------------------------------------ *//*  G e t _ V a l u e F r o m F o r m                                       *//* ------------------------------------------------------------------------ */int Get_ValueFromForm(int Form) {    GetDP_Begin("Get_ValueFromForm");  switch (Form) {  case FORM0  :    case FORM3  : case FORM3P :    case SCALAR :    GetDP_Return(SCALAR) ;      case FORM1  : case FORM1P  : case FORM1S :   case FORM2  : case FORM2P  : case FORM2S :  case VECTOR : case VECTORP :    GetDP_Return(VECTOR) ;  default :    Msg(GERROR, "Unknown Form type in 'Get_ValueFromForm'");    GetDP_Return(-1) ;  }}/* ------------------------------------------------------------------------ *//*  G e t _ I n t e g r a t i o n C a s e                                   *//* ------------------------------------------------------------------------ *//*    Il faudrait reorganiser les 'Current.XXX'    Ca devient un peu le bordel.   */struct IntegrationCase * Get_IntegrationCase (struct Element * Element, 					      List_T *IntegrationCase_L, 					      int     CriterionIndex) {  struct Value Criterion ;  GetDP_Begin("Get_IntegrationCase");  if (CriterionIndex >= 0){        Current.Element = Element ;    Current.ElementSource = Element->ElementSource ;    Get_ValueOfExpression      ((struct Expression *)       List_Pointer(Problem_S.Expression, CriterionIndex),       NULL, 0., 0., 0., &Criterion) ;    if(Criterion.Val[0] < 0 || Criterion.Val[0] >= List_Nbr(IntegrationCase_L))      Msg(GERROR, "Integration criterion out of range");  }  else {    if(List_Nbr(IntegrationCase_L) > 1)      Msg(GERROR, "Missing integration criterion");    Criterion.Val[0] = 0;  }  GetDP_Return((struct IntegrationCase*) List_Pointer(IntegrationCase_L,						      (int)Criterion.Val[0])) ;}/* ------------------------------------------------------------------------ *//*  G e t _ F u n c t i o n V a l u e                                       *//* ------------------------------------------------------------------------ */void  Get_FunctionValue(int Nbr_Function,			void (*xFunctionBF[])(),			int Type_Operator,			struct QuantityStorage  * QuantityStorage_P,			int * Type_Form) {  int  i ;  GetDP_Begin("Get_FunctionValue");  switch (Type_Operator) {  case NOOP :    *Type_Form = QuantityStorage_P->TypeQuantity ;    for (i = 0 ; i < Nbr_Function ; i++)      xFunctionBF[i] =	QuantityStorage_P->BasisFunction[i].BasisFunction->Function ;    break ;  case EXTDER :    *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;    for (i = 0 ; i < Nbr_Function ; i++)      xFunctionBF[i] =	QuantityStorage_P->BasisFunction[i].BasisFunction->dFunction ;    break ;  case EXTDERINV :    *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;    for (i = 0 ; i < Nbr_Function ; i++)      xFunctionBF[i] =	QuantityStorage_P->BasisFunction[i].BasisFunction->dInvFunction ;    break ;  case GRAD :    if (QuantityStorage_P->TypeQuantity == FORM0) {      *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dFunction ;    }    else if (QuantityStorage_P->TypeQuantity == SCALAR) {      *Type_Form = VECTOR ;    }    break ;  case CURL :    if ((QuantityStorage_P->TypeQuantity == FORM1) ||	(QuantityStorage_P->TypeQuantity == FORM1P)) {      *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dFunction ;    }    else if (QuantityStorage_P->TypeQuantity == VECTOR) {      *Type_Form = VECTOR ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dFunction ;    }    break ;  case DIV :    if (QuantityStorage_P->TypeQuantity == FORM2) {      *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dFunction ;    }    else if (QuantityStorage_P->TypeQuantity == VECTOR) {      *Type_Form = SCALAR ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dInvFunction ;    }    break ;  case GRADINV :    if (QuantityStorage_P->TypeQuantity == FORM1) {      *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dInvFunction ;    }    else if (QuantityStorage_P->TypeQuantity == VECTOR) {      *Type_Form = SCALAR ;    }    break ;  case CURLINV :    if (QuantityStorage_P->TypeQuantity == FORM2) {      *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dInvFunction ;    }    else if (QuantityStorage_P->TypeQuantity == VECTOR) {      *Type_Form = VECTOR ;    }    break ;  case DIVINV :    if ((QuantityStorage_P->TypeQuantity == FORM3) ||	(QuantityStorage_P->TypeQuantity == FORM3P)) {      *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dInvFunction ;    }    else if (QuantityStorage_P->TypeQuantity == SCALAR) {      *Type_Form = VECTOR ;    }    break ;  case _D1 :    if (QuantityStorage_P->TypeQuantity == VECTOR) {      *Type_Form = VECTOR ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dFunction ;    }    break ;  case _D2 :    if (QuantityStorage_P->TypeQuantity == VECTOR) {      *Type_Form = VECTOR ;      for (i = 0 ; i < Nbr_Function ; i++)	xFunctionBF[i] =	  QuantityStorage_P->BasisFunction[i].BasisFunction->dInvFunction ;    }    break ;  default :    Msg(GERROR, "Unknown operator in 'Get_FunctionValue'");    break;  }  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  G e t _ I n i t F u n c t i o n V a l u e                               *//* ------------------------------------------------------------------------ */void  Get_InitFunctionValue(int Type_Operator,			    struct QuantityStorage  * QuantityStorage_P,			    int * Type_Form) {  GetDP_Begin("Get_InitFunctionValue");  switch (Type_Operator) {  case NOOP :    *Type_Form = QuantityStorage_P->TypeQuantity ;  break ;  case EXTDER :    *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;  break ;  case EXTDERINV :    *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;  break ;  case GRAD :    if (QuantityStorage_P->TypeQuantity == FORM0)      *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;    else if (QuantityStorage_P->TypeQuantity == SCALAR)  *Type_Form = VECTOR ;    break ;  case CURL :    if ((QuantityStorage_P->TypeQuantity == FORM1) ||	(QuantityStorage_P->TypeQuantity == FORM1P))      *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;    else if (QuantityStorage_P->TypeQuantity == VECTOR)  *Type_Form = VECTOR ;    break ;  case DIV  :    if (QuantityStorage_P->TypeQuantity == FORM2)      *Type_Form = QuantityStorage_P->TypeQuantity + 1 ;    else if (QuantityStorage_P->TypeQuantity == VECTOR)  *Type_Form = SCALAR ;    break ;  case GRADINV :    if (QuantityStorage_P->TypeQuantity == FORM1)       *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;    else if (QuantityStorage_P->TypeQuantity == VECTOR)  *Type_Form = SCALAR ;    break ;  case CURLINV :    if (QuantityStorage_P->TypeQuantity == FORM2)       *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;    else if (QuantityStorage_P->TypeQuantity == VECTOR)  *Type_Form = VECTOR ;    break ;  case DIVINV :    if ((QuantityStorage_P->TypeQuantity == FORM3) ||	(QuantityStorage_P->TypeQuantity == FORM3P))      *Type_Form = QuantityStorage_P->TypeQuantity - 1 ;    else if (QuantityStorage_P->TypeQuantity == SCALAR)  *Type_Form = VECTOR ;    break ;  case _D1 :  case _D2 :    if (QuantityStorage_P->TypeQuantity == VECTOR)      *Type_Form = VECTOR ;    else      *Type_Form = VECTOR ;    break ;  default :    Msg(GERROR, "Unknown operator in 'Get_InitFunctionValue'");    break;  }  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  C a l _ I n t e r p o l a t i o n O r d e r                             *//* ------------------------------------------------------------------------ */double Cal_InterpolationOrder(struct Element * Element,			      struct QuantityStorage * QuantityStorage){  int i ;  double Order = 0.0 ;  GetDP_Begin("Cal_InterpolationOrder");  for(i = 0 ; i < QuantityStorage->NbrElementaryBasisFunction ; i++)    if(QuantityStorage->BasisFunction[i].Dof->Type == DOF_UNKNOWN)      Order = MAX(QuantityStorage->BasisFunction[i].BasisFunction->Order, Order) ;  GetDP_Return(Order) ;}/* ------------------------------------------------------------------------ *//*  C a l _ M a x E d g e L e n g t h                                       *//* ------------------------------------------------------------------------ */double Cal_MaxEdgeLength(struct Element * Element){  int    i, *IM, *N, NbrEdges ;  double l, lmax = 0.0 ;    GetDP_Begin("Cal_MaxEdgeLength");  IM = Geo_GetIM_Den(Element->Type, &NbrEdges) ;  for(i = 0 ; i < NbrEdges ; i++){    N = IM + i * NBR_MAX_SUBENTITIES_IN_ELEMENT ;    l = sqrt(SQU(Element->x[abs(N[1])-1]-Element->x[abs(N[0])-1]) +	     SQU(Element->y[abs(N[1])-1]-Element->y[abs(N[0])-1]) +	     SQU(Element->z[abs(N[1])-1]-Element->z[abs(N[0])-1])) ;    lmax = MAX(lmax, l) ;  }  GetDP_Return(lmax) ;}

⌨️ 快捷键说明

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