← Back to team overview

yade-dev team mailing list archive

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