📄 get_constraintofelement.c
字号:
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 + -