Micro-stress Tesselation

Asked by Gary Pekmezi on 2017-09-13

Per the User's Manual section on Micro-stress and Micro-strain [1], as well as Catalano 2014a [2], there are two types of particle-centered subdomains that can be computed with TesselationWrapper. The figure in [1] illustrates the difference perfectly, and the two examples that follow imply that one can get either the volume for micro-strain or micro-stress by choosing whether to call TW.triangulate() before TW.computeVolumes().

However, I find myself unable to get the micro-stress volume using the sample provided in [1]. Calling TW.computeVolumes() without triangulation merely seems to set all volumes to the pre-tesselation default of -1.0, while doing so after triangulation gives volumes that are clearly for micro-strain (type a in the figure of [1]).

I have tried this with several models and versions of Yade. The MWE for a previous question [3] seems to be the best way to replicate the issue (note to read the first comment for a syntax correction).

[1] https://yade-dem.org/doc/user.html#micro-stress-and-micro-strain
[2] https://yade-dem.org/doc/publications.html#catalano2014a
[3] https://answers.launchpad.net/yade/+question/622071

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Gary Pekmezi
Solved:
2017-09-13
Last query:
2017-09-13
Last reply:
2017-09-13

Hi Gary. thank you for clear question.

I wonder why you believe that "doing so after triangulation gives volumes that are clearly for micro-strain".
I don't think it is possible to get the volume used for microstrain from user's side (but maybe I forgot... I wrote this years ago). It is only used internally when micro-strain is calculated, then strain per particle is returned.

The only volume you should get, if any, corresponds to micro-stress. There is a simple way to prove this based on the fact that stress-cells define a partition, hence the cumulated volume should be the volume of the box. Strain-cells are overlapping OTOH, so the cumulated volume should be 4x the total volume (same tetrahedron counted repeatedly for each 4 vertex).

You can start with the example in [1] and add a few more lines:

tt=TriaxialTest()
tt.generate("test.yade")
O.load("test.yade")
O.run(100,True)
TW=TesselationWrapper()
TW.triangulate()
TW.computeVolumes()
tce=O.engines[4] #the triaxial engine
vol1=tce.height*tce.depth*tce.width
vol2=0
for b in O.bodies:
    if b.id>5: vol2+=TW.volume(b.id) #exclude walls (null volume + segfault...)
print vol2/vol1
#result: 1.0271676694

I would actually dislike this result, it looks like 3% error on the total volume (see below), but it is clearly not x4. Conclusion: what you get is the stress volume.

The reason for the 3% difference is this: TesselationWrapper (vol2) bounds the spheres by assuming walls exactly tangent to the min/max spheres. In the simulation OTOH the walls are slightly indented by the spheres, so the volume defined by tce (vol1) is a bit smaller.
Taking this into account (or just increasing contact stiffness) should give a difference between vol1 and vol2 as low as 1e-5 or 1e-6 typically.
Cheers
Bruno

Gary Pekmezi (gpekmezi) said : #2

Thanks for your response Bruno,

You are, of course, absolutely right: I jumped to a mistaken conclusion. I checked a handful of particles, and missed the obvious way to check globally.