yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #01155
Re: facets
> 2. The shrinkFactor, if I understand, is there to make the surface
> smoother. We still may have two interactions at the edge at the same
> time, which means that the surface rigidity doubles at those points.
Yes, it is. If shrinkFactor>0, we just have a gap between a facets
equal to 2*R*shrinkFactor, where R is a radius of sphere. Me seems, what
this has little benefit...
> I propose to add the following topology information to InteractingFacet:
>
> bool edgeActive[3];
> bool vertexActive[3];
> body_id_t edgeNeighbours[3];
> // maybe also vector<body_id_t> vertexNeighbours[3]
>
> (the names would be different to match spartan naming onf the other
> data members). Then I would make some initializer called, for example,
> FacetTopologyAnalyzer, that would fill those information. Common
> edges/vertices would be active only on one the adjacent facets and the
> inactive ones wouldn't interact at all (in the sense of
> InteractionGeometry).
I considered this option, and me seems that task more difficult.
If we enable the active and inactive edges, then the algorithm is as
follows:
FOR contact IN contacts_list:
(1) IF contact with facet's plane THEN resolve contact;
(2) ELSE IF contact with facet's edge THEN:
(2a) IF the edge is active THEN resolve contact;
(2b) ELSE (the edge is inactive) return false;
Consider the two faces fA and fB and a edge between them.
Let eA is the edge belong to the facet fA, and eB is the edge belong to
the facet fB:
fA eA eB fB
| \ / |
-------------**---------------
Let eB be an active edge. If a sphere S is on fB near eB (and, so, eA)
then S has real contact with only fB because eA is inactive . But if S
is on fA near eA (and, so, eB) then S has real contact with fA AND with
eB because eB is active!
Thus, we will have a surface anisotropy in this case...
I see the another algorithm:
FOR contact IN contacts_list:
(1) IF contact with fA THEN resolve the contact;
(2) ELSE IF contact with eA THEN consider the contact with fB:
(2a) IF contact with fB OR with eB THEN resolve the contact.
But in this algo, when we consider a contact with fB, we need to know
the status of contact with fA...
If we add the static function Interaction::byId(body_id_t, body_id_t) by
analogy with Body::byId, then the algorithm can be modified as follows:
First, to add the following topology information to InteractingFacet:
body_id_t edgesNeighbours[3];
vector<body_id_t> vertexNeighbours[3]
Then,
FOR contact IN contacts_list:
(1) IF contact with facet's plane THEN resolve contact;
(2) ELSE IF contact with facet's edge N THEN:
(2a) IF contact with edgesNeighbours[N] is fresh AND false THEN resolve
contact;
(2b) ELSE return false.
Where a status "fresh" means that the contact have been processed at the
current time step (it can be used interaction's cycle variable for it).
For case of contact with the vertex N step 2a will be as follows:
FOR adjacentFacet IN vertexNeighbours[N]:
IF contact with adjacentFacet is !fresh OR true THEN return false;
resolve contact;
ps. If we added Interaction::byId then if the contact with the facet's
plane is true, then all contacts with the neighbours facets (across
vertices) can be set to false automatically...
Follow ups
References
-
facets
From: Václav Šmilauer, 2009-03-19