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

📄 get_constraintofelement.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
📖 第 1 页 / 共 3 页
字号:
    TwoIntOneDouble.Int2 = NodeXYZRef.NumNode ;    /*    Current.x = NodeXYZ.x ; Current.y = NodeXYZ.y ; Current.z = NodeXYZ.z ;    */    /* Calcul du coefficient base sur les coordonnees du noeud de ref ... */    Geo_GetNodesCoordinates( 1, &NodeXYZRef.NumNode,			     &Current.x, &Current.y, &Current.z) ;    Get_ValueOfExpressionByIndex(Index_Coef, NULL, 0., 0., 0., &Value) ;    TwoIntOneDouble.Double = Value.Val[0] ;    if (Current.NbrHar == 1)      TwoIntOneDouble.Double2 = 0. ;    else      TwoIntOneDouble.Double2 = Value.Val[MAX_DIM] ; /* LinkCplx */    List_Add(Couples_L, &TwoIntOneDouble) ;    Msg(DEBUG2, "%d %d : coef %e %e\n", NodeXYZ.NumNode, NodeXYZRef.NumNode, 	TwoIntOneDouble.Double, TwoIntOneDouble.Double2) ;  }  List_Delete(NodeXYZ_L) ;  List_Delete(NodeXYZRef_L) ;  GetDP_End ;}int fcmp_XYZ(const void * a, const void * b) {  double Result, TOL=Current.GeoData->CharacteristicLength * 1.e-8 ;  if (fabs(Result = ((struct NodeXYZ *)a)->x - ((struct NodeXYZ *)b)->x) > TOL)    return (Result > 0.)? 1 : -1 ;  if (fabs(Result = ((struct NodeXYZ *)a)->y - ((struct NodeXYZ *)b)->y) > TOL)    return (Result > 0.)? 1 : -1 ;  if (fabs(Result = ((struct NodeXYZ *)a)->z - ((struct NodeXYZ *)b)->z) > TOL)    return (Result > 0.)? 1 : -1 ;  return 0 ;}/*  G e n e r a t e _ L i n k E d g e s  */void  Generate_LinkEdges(struct ConstraintInFS * Constraint_P,			 struct Group * Group_P,			 struct Group * RegionRef_P, struct Group * SubRegionRef_P,			 List_T * Couples_L) {  int  Nbr_Entity, Nbr_EntityRef ;  List_T  * ExtendedListNodes_L ;  List_T  * CouplesOfNodes_L, * CouplesOfNodes2_L ;  struct EdgeNN  EdgeNN, EdgeNNRef ;  List_T  * EdgeNN_L, * EdgeNNRef_L ;  List_T  * ExtendedListRef_L, * ExtendedSuppListRef_L ;  int  i ;  struct TwoIntOneDouble *TwoIntOneDouble_P, *TwoIntOneDouble2_P, TwoIntOneDouble ;  List_T  * ExtendedList_L ;  int  Save_Num, Flag_Filter ;  GetDP_Begin("Generate_LinkEdges");  /* Couples of nodes */  Generate_ElementaryEntities    (Group_P->InitialList, &ExtendedListNodes_L, NODESOF) ;  if ((Nbr_Entity = List_Nbr(ExtendedListNodes_L)))    CouplesOfNodes_L = List_Create(Nbr_Entity, 1, sizeof(struct TwoIntOneDouble)) ;  else {    GetDP_End ;  /* situation impossible... */  }  if (Constraint_P->ConstraintPerRegion->Case.Link.FilterIndex2 < 0) {    Flag_Filter = 0 ;    CouplesOfNodes2_L = NULL ;    Generate_LinkNodes(Constraint_P, ExtendedListNodes_L, NULL, RegionRef_P, NULL,		       Constraint_P->ConstraintPerRegion->Case.Link.FilterIndex,		       Constraint_P->ConstraintPerRegion->Case.Link.FunctionIndex,		       Constraint_P->ConstraintPerRegion->Case.Link.CoefIndex,		       CouplesOfNodes_L) ;  }  else {    Flag_Filter = 1 ;    CouplesOfNodes2_L = List_Create(Nbr_Entity, 1, sizeof(struct TwoIntOneDouble)) ;    Generate_LinkNodes(Constraint_P, ExtendedListNodes_L, NULL, RegionRef_P, NULL,		       Constraint_P->ConstraintPerRegion->Case.Link.FilterIndex,		       Constraint_P->ConstraintPerRegion->Case.Link.FunctionIndex,		       Constraint_P->ConstraintPerRegion->Case.Link.CoefIndex,		       CouplesOfNodes_L) ;    Generate_LinkNodes(Constraint_P, ExtendedListNodes_L, NULL, RegionRef_P, NULL,		       Constraint_P->ConstraintPerRegion->Case.Link.FilterIndex2,		       Constraint_P->ConstraintPerRegion->Case.Link.FunctionIndex2,		       Constraint_P->ConstraintPerRegion->Case.Link.CoefIndex2,		       CouplesOfNodes2_L) ;  }  /* Couples of edges */  Msg(INFO, "== Couples of edges ==") ;  /* Edges with Constraint */  Nbr_Entity = List_Nbr(Group_P->ExtendedList) ;  Generate_ElementaryEntities_EdgeNN    (Group_P->InitialList, &ExtendedList_L, EDGESOF) ;  if (Group_P->InitialSuppList)    Generate_ElementaryEntities_EdgeNN      (Group_P->InitialSuppList, &ExtendedSuppListRef_L, EDGESOF) ;  else    ExtendedSuppListRef_L = NULL ;  /*  EdgeNN_L = ExtendedList_L ; */  EdgeNN_L = List_Create(Nbr_Entity, 1, sizeof(struct EdgeNN)) ;  /*  if (Nbr_Entity != List_Nbr(EdgeNN_L))  Msg(GERROR, "Constraint Link: strange...") ; */  if (Nbr_Entity != List_Nbr(ExtendedList_L))  Msg(GERROR, "Constraint Link: strange...") ;  for (i = 0 ; i < Nbr_Entity ; i++) {    List_Read(ExtendedList_L, i, &EdgeNN) ;    if (!(ExtendedSuppListRef_L &&	  List_Search(ExtendedSuppListRef_L, &EdgeNN.NumEdge, fcmp_int))) {      if (EdgeNN.Node2 < EdgeNN.Node1) {	Save_Num = EdgeNN.Node2 ;	EdgeNN.Node2 = EdgeNN.Node1 ;  EdgeNN.Node1 = Save_Num ;	/*	List_Write(EdgeNN_L, i, &EdgeNN) ; */      }      List_Add(EdgeNN_L, &EdgeNN) ;    /* -- */      Msg(DEBUG2, "Other %d: a%d, n%d - n%d\n",	  i, EdgeNN.NumEdge, EdgeNN.Node1, EdgeNN.Node2) ;      TwoIntOneDouble_P = (struct TwoIntOneDouble *)	List_PQuery(CouplesOfNodes_L, &EdgeNN.Node1, fcmp_int) ;      TwoIntOneDouble2_P = (struct TwoIntOneDouble *)	List_PQuery(CouplesOfNodes_L, &EdgeNN.Node2, fcmp_int) ;      if (!(TwoIntOneDouble_P && TwoIntOneDouble2_P)) {	if (Flag_Filter) {	  TwoIntOneDouble_P = (struct TwoIntOneDouble *)	    List_PQuery(CouplesOfNodes2_L, &EdgeNN.Node1, fcmp_int) ;	  TwoIntOneDouble2_P = (struct TwoIntOneDouble *)	    List_PQuery(CouplesOfNodes2_L, &EdgeNN.Node2, fcmp_int) ;	  if (!TwoIntOneDouble_P)	    Msg(GERROR, "Constraint Link: unknown node (%d)", EdgeNN.Node1) ;	  if (!TwoIntOneDouble2_P)	    Msg(GERROR, "Constraint Link: unknown node (%d)", EdgeNN.Node2) ;	}	else  Msg(GERROR, "Constraint Link: bad correspondance for edges") ;      }      EdgeNN.Node1 = TwoIntOneDouble_P->Int2 ;      EdgeNN.Node2 = TwoIntOneDouble2_P->Int2 ;      if (fabs(TwoIntOneDouble_P->Double - TwoIntOneDouble2_P->Double) > 1.e-18)	Msg(GERROR, "Constraint Link: Bad Coefficient for Edges") ;      EdgeNN.Coef = TwoIntOneDouble_P->Double ;      EdgeNN.Coef2 = TwoIntOneDouble_P->Double2 ; /* LinkCplx */      if (EdgeNN.Node2 < EdgeNN.Node1) {	Save_Num = EdgeNN.Node2 ;	EdgeNN.Node2 = EdgeNN.Node1 ;  EdgeNN.Node1 = Save_Num ;	EdgeNN.NumEdge *= -1 ;      }      /*      List_Write(EdgeNN_L, i, &EdgeNN) ; */      List_Write(EdgeNN_L, List_Nbr(EdgeNN_L)-1, &EdgeNN) ;      /* -- */      Msg(DEBUG2, "                         -->  a%d, n%d - n%d\n",	  EdgeNN.NumEdge, EdgeNN.Node1, EdgeNN.Node2) ;    }  }  Nbr_Entity = List_Nbr(EdgeNN_L) ;  /* Edges of reference (Link) */  Generate_ElementaryEntities_EdgeNN    (RegionRef_P->InitialList, &ExtendedListRef_L, EDGESOF) ;  if (SubRegionRef_P)    Generate_ElementaryEntities_EdgeNN      (SubRegionRef_P->InitialList, &ExtendedSuppListRef_L, EDGESOF) ;  else    ExtendedSuppListRef_L = NULL ;  Nbr_EntityRef = List_Nbr(ExtendedListRef_L) ;  /*  EdgeNNRef_L = ExtendedListRef_L ; */  EdgeNNRef_L = List_Create(Nbr_EntityRef, 1, sizeof(struct EdgeNN)) ;  for (i = 0 ; i < Nbr_EntityRef ; i++) {    List_Read(ExtendedListRef_L, i, &EdgeNNRef.NumEdge) ;    if (!(ExtendedSuppListRef_L &&	  List_Search(ExtendedSuppListRef_L, &EdgeNNRef.NumEdge, fcmp_int))) {      if (EdgeNNRef.Node2 < EdgeNNRef.Node1) {	Save_Num = EdgeNNRef.Node2 ;	EdgeNNRef.Node2 = EdgeNNRef.Node1 ;  EdgeNNRef.Node1 = Save_Num ;	/*	List_Write(EdgeNNRef_L, i, &EdgeNNRef) ; */      }      List_Add(EdgeNNRef_L, &EdgeNNRef) ;      /* -- */      Msg(DEBUG2, "Ref   %d: a%d, n%d - n%d\n",	  i, EdgeNNRef.NumEdge, EdgeNNRef.Node1, EdgeNNRef.Node2) ;    }  }  Nbr_EntityRef = List_Nbr(EdgeNNRef_L) ;  if (Nbr_EntityRef != Nbr_Entity)    Msg(GERROR, "Constraint Link: bad correspondance of number of Edges (%d, %d)",	Nbr_Entity, Nbr_EntityRef) ;  List_Sort(EdgeNN_L   , fcmp_NN) ;  List_Sort(EdgeNNRef_L, fcmp_NN) ;  for (i = 0 ; i < Nbr_Entity ; i++) {    List_Read(EdgeNN_L, i, &EdgeNN) ;    List_Read(EdgeNNRef_L, i, &EdgeNNRef) ;    Msg(DEBUG2, "%d: a%d, n%d - n%d (%.16g) / a%d, n%d - n%d\n",	i, 	EdgeNN.NumEdge, EdgeNN.Node1, EdgeNN.Node2, EdgeNN.Coef,	EdgeNNRef.NumEdge, EdgeNNRef.Node1, EdgeNNRef.Node2) ;    if (EdgeNN.Node1 != EdgeNNRef.Node1 ||	EdgeNN.Node2 != EdgeNNRef.Node2)      Msg(GERROR, "Constraint Link: bad correspondance of Edges (%d, %d)",	  EdgeNN.NumEdge, EdgeNNRef.NumEdge) ;    TwoIntOneDouble.Int1 = EdgeNN.NumEdge ;    TwoIntOneDouble.Int2 = EdgeNNRef.NumEdge ;    TwoIntOneDouble.Double = EdgeNN.Coef ;    TwoIntOneDouble.Double2 = EdgeNN.Coef2 ; /* LinkCplx */    List_Add(Couples_L, &TwoIntOneDouble) ;  }  List_Delete(EdgeNN_L) ;  List_Delete(EdgeNNRef_L) ;  List_Delete(CouplesOfNodes_L) ;  List_Delete(CouplesOfNodes2_L) ;  Msg(DEBUG2, "====> End Link Edge\n") ;  GetDP_End ;}int fcmp_NN(const void * a, const void * b) {  int Result ;  if ((Result = ((struct EdgeNN *)a)->Node1 - ((struct EdgeNN *)b)->Node1) != 0)    return Result ;  return        ((struct EdgeNN *)a)->Node2 - ((struct EdgeNN *)b)->Node2 ;}void  Generate_ElementaryEntities_EdgeNN  (List_T * InitialList, List_T ** ExtendedList, int Type_Entity) {  Tree_T  * Entity_Tr ;  struct Geo_Element  * GeoElement ;  int     Nbr_Element, i_Element ;  int     Nbr_Entity = 0, i_Entity, * Num_Entities = NULL;  struct EdgeNN  EdgeNN ;  int  * Num_Nodes ;  GetDP_Begin("Generate_ElementaryEntities_EdgeNN");  if (InitialList != NULL) {    Entity_Tr = Tree_Create(sizeof (struct EdgeNN), fcmp_int) ;    Nbr_Element = Geo_GetNbrGeoElements() ;    for (i_Element = 0 ; i_Element < Nbr_Element ; i_Element++) {      GeoElement = Geo_GetGeoElement(i_Element) ;      if (List_Search(InitialList, &GeoElement->Region, fcmp_int) ) {	switch (Type_Entity) {	case EDGESOF :	  if (GeoElement->NbrEdges == 0)  Geo_CreateEdgesOfElement(GeoElement) ;	  Nbr_Entity = GeoElement->NbrEdges  ; Num_Entities = GeoElement->NumEdges ;	  break ;	}	for (i_Entity = 0; i_Entity < Nbr_Entity ; i_Entity++) {	  EdgeNN.NumEdge = abs(Num_Entities[i_Entity]) ;	  Num_Nodes = Geo_GetNodesOfEdgeInElement(GeoElement, i_Entity) ;	  EdgeNN.Node1 = GeoElement->NumNodes[abs(Num_Nodes[0])-1] ;	  EdgeNN.Node2 = GeoElement->NumNodes[abs(Num_Nodes[1])-1] ;	  if ( ! Tree_Search(Entity_Tr, &EdgeNN) )	    Tree_Add(Entity_Tr, &EdgeNN) ;	}      }    }    *ExtendedList = Tree2List(Entity_Tr) ;    Tree_Delete(Entity_Tr) ;  }  else  *ExtendedList = NULL ;  GetDP_End ;}/*  G e n e r a t e _ L i n k R e g i o n s  */void  Generate_LinkRegions(struct ConstraintInFS * Constraint_P,			   List_T * Region_L, List_T * RegionRef_L,			   int Index_Coef, List_T * Couples_L) {  struct TwoIntOneDouble  TwoIntOneDouble ;  struct Value  Value ;  GetDP_Begin("Generate_LinkRegions");  if (List_Nbr(Region_L) > 1 || List_Nbr(RegionRef_L) > 1)    Msg(GERROR, "More than one region for link type constraint") ;  List_Read(Region_L, 0, &TwoIntOneDouble.Int1) ;  List_Read(RegionRef_L, 0, &TwoIntOneDouble.Int2) ;  Get_ValueOfExpressionByIndex(Index_Coef, NULL, 0., 0., 0., &Value) ;  TwoIntOneDouble.Double = Value.Val[0] ;  if (Current.NbrHar == 1)    TwoIntOneDouble.Double2 = 0. ;  else    TwoIntOneDouble.Double2 = Value.Val[MAX_DIM] ; /* LinkCplx */  List_Add(Couples_L, &TwoIntOneDouble) ;  GetDP_End ;}

⌨️ 快捷键说明

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