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

📄 get_dofofelement.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
📖 第 1 页 / 共 2 页
字号:
    Element->NbrGroupsOfEntities = 0 ;  }  *StartingIndex = Element->NbrGroupsOfEntities ;  if (GroupEntity_P->ExtendedList == NULL) Generate_ExtendedGroup(GroupEntity_P) ;  for (i = 0 ; i < Element->GeoElement->NbrEdges ; i++) {    Num_Edge = abs(Element->GeoElement->NumEdges[i]) ;    if (List_Search(GroupEntity_P->ExtendedList, &Num_Edge, fcmp_int )) {      Num_Nodes = Geo_GetNodesOfEdgeInElement(Element->GeoElement, i) ;      Num_Node = Element->GeoElement->NumNodes[abs(Num_Nodes[0])-1] ;      j = *StartingIndex ;      while ((j < Element->NbrGroupsOfEntities) &&	     (Element->NumGroupsOfEntities[j] != Num_Node))  j++ ;      if (j == Element->NbrGroupsOfEntities) {	Element->NumGroupsOfEntities[Element->NbrGroupsOfEntities++] = Num_Node ;	Element->NbrEntitiesInGroups[j] = 0 ;      }      Element->NumEntitiesInGroups[j] [Element->NbrEntitiesInGroups[j]++] =	(Element->GeoElement->NumEdges[i] > 0)? -(i+1) : (i+1) ;      /*-        edge	node 1 o--->---o node 2   =>   (Phi2 - Phi1) s12 ...	-> minus sign associated with node 1 for positive edge from node 1 to node 2      */      Num_Node = Element->GeoElement->NumNodes[abs(Num_Nodes[1])-1] ;      j = *StartingIndex ;      while ((j < Element->NbrGroupsOfEntities) &&	     (Element->NumGroupsOfEntities[j] != Num_Node))  j++ ;      if (j == Element->NbrGroupsOfEntities) {	Element->NumGroupsOfEntities[Element->NbrGroupsOfEntities++] = Num_Node ;	Element->NbrEntitiesInGroups[j] = 0 ;      }      Element->NumEntitiesInGroups[j] [Element->NbrEntitiesInGroups[j]++] =	(Element->GeoElement->NumEdges[i] > 0)? (i+1) : -(i+1) ;    }  }  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  G e t _ R e g i o n F o r E l e m e n t                                 *//* ------------------------------------------------------------------------ */void  Get_RegionForElement(struct Element * Element, int * StartingIndex,			   struct BasisFunction * BasisFunction_P) {  int Nbr_SubFunction, i_SF ;  GetDP_Begin("Get_RegionForElement");  if (Element->NumLastElementForGroupsOfEntities != Element->Num) {    Element->NumLastElementForGroupsOfEntities = Element->Num ;    Element->NbrGroupsOfEntities = 0 ;  }  *StartingIndex = Element->NbrGroupsOfEntities ;  if (!BasisFunction_P->SubFunction) {    Element->NumSubFunction[1][Element->NbrGroupsOfEntities] = 0 ;    Element->NumSubFunction[0][Element->NbrGroupsOfEntities] = -1 ;    Element->NumGroupsOfEntities[Element->NbrGroupsOfEntities++] = Element->Region ;  }  else { /* For SubFunctions (basis functions for a global function) */    Nbr_SubFunction = List_Nbr(BasisFunction_P->SubFunction) ;    for (i_SF = 0 ; i_SF < Nbr_SubFunction ; i_SF++) {      Element->NumSubFunction[1][Element->NbrGroupsOfEntities] = i_SF ; /* Index SF */      Element->NumSubFunction[0][Element->NbrGroupsOfEntities] =	*((int *)List_Pointer(BasisFunction_P->SubFunction, i_SF)) ; /* Index Expression */      if (BasisFunction_P->SubdFunction)	Element->NumSubFunction[2][Element->NbrGroupsOfEntities] =	  *((int *)List_Pointer(BasisFunction_P->SubdFunction, i_SF)) ; /* Index Expression */      Element->NumGroupsOfEntities[Element->NbrGroupsOfEntities++] = Element->Region ;    }  }  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  G e t _ G l o b a l F o r E l e m e n t                                 *//* ------------------------------------------------------------------------ */void  Get_GlobalForElement(struct Element * Element, int * StartingIndex,			   struct BasisFunction * BasisFunction_P) {  int Nbr_Global, i, * Num_Global ;  GetDP_Begin("Get_GlobalForElement");  if (Element->NumLastElementForGroupsOfEntities != Element->Num) {    Element->NumLastElementForGroupsOfEntities = Element->Num ;    Element->NbrGroupsOfEntities = 0 ;  }  *StartingIndex = Element->NbrGroupsOfEntities ;  Nbr_Global = List_Nbr(GroupEntity_P->InitialList) ;  Num_Global = (Nbr_Global)? (int*)List_Pointer(GroupEntity_P->InitialList, 0) : NULL ;  for (i = 0 ; i < Nbr_Global ; i++) {    Element->GlobalBasisFunction[Element->NbrGroupsOfEntities  ] =      (struct GlobalBasisFunction *)      List_Pointer(BasisFunction_P->GlobalBasisFunction, i) ;    /* Attention: correspondance i-i si liste triee ! fait dans yacc */    Element->NumGroupsOfEntities[Element->NbrGroupsOfEntities++] = Num_Global[i] ;  }  if (TreatmentStatus == _PRE)    Get_PreResolutionForGlobalBasisFunction(Nbr_Global, *StartingIndex, Element) ;  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  G e t _ C o d e s O f E l e m e n t                                     *//* ------------------------------------------------------------------------ */void  Get_CodesOfElement(struct FunctionSpace    * FunctionSpace_P,			 struct QuantityStorage  * QuantityStorage_P,			 int Nbr_Entity, int Num_Entity[],			 int StartingIndex,			 int i_BFunction, int TypeConstraint, int * Num_SubFunction) {/* external input/output :     GroupSupport_P    : In     GroupEntity_P     : In  */  int         i_Entity, CodeExist = 0, Code_BasisFunction ;  struct Dof  * Dof_P = NULL;  GetDP_Begin("Get_CodesOfElement");  /*  1.  F o r   e a c h   e n t i t y   t o   w h i c h   a   b a s i s          f u n c t i o n   c o u l d   b e   a s s o c i a t e d :           (Node, Edge, Facet, Volume, GroupOfNodes, Region, ...)  */  for (i_Entity = StartingIndex ; i_Entity < Nbr_Entity ; i_Entity++) {    Code_BasisFunction =      BasisFunction_P->Num + (Num_SubFunction? Num_SubFunction[i_Entity] : 0) ;    switch (TreatmentStatus) {    case _PAR :    case _CAL :    case _POS :    case _CST :      if(!FunctionSpace_P->DofData)	Msg(GERROR, "Empty DofData in FunctionSpace '%s' (no unknowns?)",	    FunctionSpace_P->Name);      CodeExist =	((Dof_P =	  Dof_GetDofStruct(FunctionSpace_P->DofData,			   Code_BasisFunction, abs(Num_Entity[i_Entity]), 0))	 != NULL) ;      if (Flag_SubSpace && CodeExist && TreatmentStatus != _POS)	CodeExist =	  Check_IsEntityInExtendedGroup(GroupEntity_P, abs(Num_Entity[i_Entity]), 0) ;      /* ... parce que le code peut ne pas exister quand sous-espace ! */      break ;    case _PRE :      CodeExist =	Check_IsEntityInExtendedGroup(GroupEntity_P, abs(Num_Entity[i_Entity]), 0) ;      break ;    default :       Msg(GERROR, "Unknown TreatmentStatus (%d)", TreatmentStatus);    }    /*  2.  O n e   a s s o c i a t e s   a   b a s i s   f u n c t i o n :  */    if (CodeExist) {      QuantityStorage_P->BasisFunction[Nbr_ElementaryBF].Dof 	= Dof_P ;      QuantityStorage_P->BasisFunction[Nbr_ElementaryBF].NumEntityInElement	= i_Entity ;      QuantityStorage_P->BasisFunction[Nbr_ElementaryBF].CodeBasisFunction	= Code_BasisFunction ;      QuantityStorage_P->BasisFunction[Nbr_ElementaryBF].CodeEntity	= abs(Num_Entity[i_Entity]) ;      QuantityStorage_P->BasisFunction[Nbr_ElementaryBF].BasisFunction	= BasisFunction_P ;      if (TreatmentStatus == _PRE ||	  TreatmentStatus == _CST)  /* Associated Contraints? */	Treatment_ConstraintForElement(FunctionSpace_P, QuantityStorage_P,				       Num_Entity, i_Entity,				       i_BFunction, TypeConstraint) ;      Nbr_ElementaryBF++ ;          }  /* if CodeExist ... */      }  /* for i_Entity ... */  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  G e t _ D o f O f R e g i o n                                           *//* ------------------------------------------------------------------------ */void  Get_DofOfRegion(int  Num_Region,		      struct GlobalQuantity   * GlobalQuantity_P,		      struct FunctionSpace    * FunctionSpace_P,		      struct QuantityStorage  * QuantityStorage_P) {  int  CodeExist = 0, Num_BasisFunction, Num_AssociateBasisFunction ;  struct Dof  * Dof_P = NULL;  GetDP_Begin("Get_DofOfRegion");  Nbr_ElementaryBF = 0 ;  BasisFunction_P = (struct BasisFunction*)    List_Pointer(FunctionSpace_P->BasisFunction,		 GlobalQuantity_P->ReferenceIndex) ;  GroupEntity_P =  (struct Group*)    List_Pointer(Problem_S.Group, BasisFunction_P->EntityIndex) ;  if (GroupEntity_P->Type == REGIONLIST  &&      List_Search(GroupEntity_P->InitialList, &Num_Region, fcmp_int)) {    if (GlobalQuantity_P->Type == ALIASOF) {      Num_BasisFunction = BasisFunction_P->Num ;      Num_AssociateBasisFunction = 0 ;    }    else {      Num_BasisFunction = GlobalQuantity_P->Num ;      Num_AssociateBasisFunction = BasisFunction_P->Num ;    }    switch (TreatmentStatus) {    case _CAL :  case _POS :      if(!FunctionSpace_P->DofData)	Msg(GERROR, "Empty DofData in FunctionSpace '%s' (no unknowns?)",	    FunctionSpace_P->Name);      CodeExist =	((Dof_P = Dof_GetDofStruct(FunctionSpace_P->DofData,				   Num_BasisFunction, Num_Region, 0)) != NULL) ;      break ;    case _PRE :      CodeExist = 1 ;      break ;    default : break ;    }    if (CodeExist) {      QuantityStorage_P->BasisFunction[0].Dof = Dof_P ;      QuantityStorage_P->BasisFunction[0].CodeBasisFunction = Num_BasisFunction ;      QuantityStorage_P->BasisFunction[0].CodeEntity        = Num_Region ;      QuantityStorage_P->BasisFunction[0].CodeAssociateBasisFunction =	Num_AssociateBasisFunction ;      if (TreatmentStatus == _PRE)  /* Contrainte associee ? */	Treatment_ConstraintForRegion(GlobalQuantity_P,				      FunctionSpace_P, QuantityStorage_P) ;      Nbr_ElementaryBF = 1 ;    }  /* if CodeExist ... */  }  /* if REGIONLIST ... */  QuantityStorage_P->NbrElementaryBasisFunction = Nbr_ElementaryBF ;  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  G e t _ P r e R e s o l u t i o n F o r GlobalBasisFunction             *//* ------------------------------------------------------------------------ */void  Get_PreResolutionForGlobalBasisFunction(int Nbr_Global, int StartingIndex,					      struct Element * Element) {  int i ;  struct PreResolutionInfo  PreResolutionInfo_S ;  GetDP_Begin("Get_PreResolutionForGlobalBasisFunction");  for (i = 0 ; i < Nbr_Global ; i++)    if(List_ISearchSeq(PreResolutionIndex_L,		       &(Element->GlobalBasisFunction[StartingIndex + i]->			 ResolutionIndex), fcmp_int) < 0) {      PreResolutionInfo_S.Index =	Element->GlobalBasisFunction[StartingIndex + i]->ResolutionIndex ;      PreResolutionInfo_S.Type  = PR_GLOBALBASISFUNCTION ;      List_Add(PreResolutionIndex_L, &PreResolutionInfo_S) ;      Msg(INFO, "  Adding Resolution '%s' for Pre-Resolution (Global BF)", 	  ((struct Resolution*)List_Pointer(Problem_S.Resolution,					    PreResolutionInfo_S.Index))->Name) ;    }  GetDP_End ;}

⌨️ 快捷键说明

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