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