Questions concerning triaxial test

Asked by lingran

Hi,all

I am a freshman on yade.

Now I am trying to simulate the triaxial test mentioned in Jean-Patrick Plassiard's article "Rockfall impact parameters on embankments: a discrete element method analysis", with the help of tutorial for triaxial tests found in scripts/triax-tutorial.

My questions are:
1. How to generate a certain kind of particle distribution in yade, for example weibull distributon ?? It seems using "psdSizes and psdCumm" is the only way to generate a non-uniform distribution and the only way to obtain a lower porosity(for example 0.3) after confinement in yade, am I right?

2.After the generation of particles, we can obtain coordinates and radius of each particle. My question is how to draw the distribution curve(column chart type) like the one mentioned in Jean-Patrick Plassiard's article: the x axis represents the particle sizes, the y axis represents the number of corresponding particles.

3. Although the mechanical parameters as well as the confining pressure were set the same values as the ones mentioned in Jean-Patrick Plassiard's article, even the porosity after confinement is obtained as low as 0.3, the differential stress q and the volumetric strain ev are about 10-15 percent lower than Jean-Patrick Plassiard's results. Does anyone know the reasons? The difference between SDEC and yade is not the main reason, I guess.

ThanK you in advance!

Good day!
Lingran

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
lingran
Solved:
Last query:
Last reply:

This question was reopened

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#1

Hi Lingran,

1. There is such a huge number of possible distributions, so it is impossible to have all of them implemented. However you can always generate your own distribution in a python script and turn it into a PSD to satisfy yade's form of input (else, you could also add Weibull option in the c++ code of the makeCloud function). For porosity, I don't understand your idea: porosity is a result of compaction without any explicit link to the size distribution. Of course PSD has an effect on compacted porosity , but there is no programatical link between them, uniform or non-uniform are compacted the same way.

2. Plassiard did not work with yade. Drawings can be done in various ways (gnuplot,python,ooffice,excel,etc.). Yade has some drawing features but it will probably not draw what you mention with a unique command.

3. I have no idea, I don't know SDEC. Are sure that the contact laws are really the same?

Revision history for this message
lingran (zhanglingran130) said :
#2

Hi, Bruno,

Thank you very much for the reply, I learn a lot from that.
 It's my great honour to discuss with famous persons like you!

1. what I mean is PSD has an great effect on the compacted porosity. in my situation, at the same confining press of 100kpa, the lowest compacted porosity obtained in uniform distribution is 0.4, however, the lowest compacted porosity obtained using "psdSizes and psdCumm" can be as low as 0.3.

2. same one told me there is an easy way to draw that curve in matlab, I will figure it out later.

3. I think we use the same contact law: the same mechanical parameters(include the cohesion), the same way to calculate normal and tangential force, normal and tangential contact stiffness, the same Mohr-Coulomb rupture criterion...., actually, the maximum differential stress obtained by Plassiard is 400kpa, while in my situation, it is only 300kpa.

cheers
Lingran

Revision history for this message
Anton Gladky (gladky-anton) said :
#3

Hi,

> 2. same one told me there is an easy way to draw that curve in matlab, I
> will figure it out later.

python+matplotlib should do the job.

> 3. I think we use the same contact law: the same mechanical
> parameters(include the cohesion), the same way to calculate normal and
> tangential force, normal and tangential contact stiffness, the same
> Mohr-Coulomb rupture criterion...., actually, the maximum differential
> stress obtained by Plassiard is 400kpa, while in my situation, it is
> only 300kpa.

Take just 2-3 spheres and try to simulate necessary behavior. In this
case you should definitely understand, how works the contact law.

Good luck,

Anton

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#4

Ok, uniform distribution don't compact very well by default since they have a small quantity of small particles.
You can however generate a uniform mass distribution which will reach higher solid fraction (see psd.py example script)

> 3. I think we use the same contact law: the same mechanical
> parameters(include the cohesion), the same way to calculate normal and
> tangential force, normal and tangential contact stiffness, the same
> Mohr-Coulomb rupture criterion...., actually, the maximum differential
> stress obtained by Plassiard is 400kpa, while in my situation, it is
> only 300kpa.

Didn't you include contact moments? If not, it would clearly explain the difference.

If you included them, then note that the implementation of "rolling" are not exactly the same in Plassiard and in Yade.
In Yade, it's only based on the relative rotation (in fact bending angle), while in Plassiard it is more complicated.
It should be possible to find similar results with both implementations but maybe with different parameters.

Revision history for this message
lingran (zhanglingran130) said :
#5

Hi,

Actually, the contact law I used is "Law2_ScGeom6D_CohFrictPhys_CohesionMoment(always_use_moment_law=False)". In Plassiard's articles, he simulated the triaxial tests both with and without using "Moment Transfer Law(MTL)", but the maximum differential stress obtained were around 400kpa no matter considering MTL or not.....

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#6

What article are you referring to?

Revision history for this message
lingran (zhanglingran130) said :
#7

1 "Discrete model of impacts on embankments: refinement of the interaction law and calibration method"
2 " A spherical discrete element model: calibration procedure and incremental response"

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#8

I knew the papers but I never realized they reported such high peak stress without LTM.
This is very unusual with spheres, and I'm not surprised you get a lower peak. They say somewhere that the very high peak may be explained by the high coordination number (>7). Do you have so many contacts?

Revision history for this message
lingran (zhanglingran130) said :
#9

Hi Bruno,

sorry to reply to you so late.
Here is the way I used to calculate the coordination number:
###-----------------------------------------####
f=open('contactforce.txt','w')
counter=0

for i in O.interactions:
    f.write(str(i.id1));f.write(" ")
    f.write(str(i.id2));f.write(" ")
    counter +=1

f.close()
###-----------------------------------------####

After reaching the confining pressure of 100kpa, the porosity of the sample is as low as 0.297. At the same time, there are 17394 real interactions were detected, including 1604 interactions between spheres and walls .

since there are 6 walls and 10000 spheres, so the coordination number = (17394-1604)/10000=1.579. It is not a very high value. Did I calculate the coordination number in the right way?

Thank you in advance!

Lingran

Revision history for this message
Christian Jakob (jakob-ifgt) said :
#10

> Did I calculate the coordination number in the right way?

No. Try this (works well, when you have no clumps):

for b in O.bodies:
 c_coord_tmp = 0
 for i in b.intrs():
  if (i.geom.penetrationDepth > 0):
   c_coord_tmp += 1
 c_coord_sum += c_coord_tmp
 c_balls += 1

coord_num = c_coord_sum/c_balls

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#11

1.579 * 2 = 3.16 contacts per grain, this is classical. It probably explains the lower peak.

For coordination number you can use this:
https://yade-dem.org/doc/yade.utils.html#yade.utils.avgNumInteractions

Revision history for this message
Christian Jakob (jakob-ifgt) said :
#12

Sorry, the code will not work, because you only want sphere-sphere contacts for coordination number.
So you can use this one here:

for b in O.bodies:
  c_coord_tmp = 0
  if isinstance(b.shape,Sphere):
    for i in b.intrs():
      if (i.geom.penetrationDepth > 0):
        c_coord_tmp += 1
    c_coord_sum += c_coord_tmp
    c_balls += 1

coord_num = c_coord_sum/c_balls

Revision history for this message
lingran (zhanglingran130) said :
#13

Hi Bruno and Christian,

Thank you very much for pointing out my mistakes and showing me your methods.

To better understand your different ways of calculating coordination number, the number of spheres were set to be 5.

Here is the list of interactions recorded by Christian's method(notice that the interactions between two spheres are counted twice).
###------------###
interactions:id.1, id.2
 6 8
 3 6
 1 6------sphere(id=6) has 5 interactions--(1+2+3+4+5)
 6 7
 4 6
----------
 8 7
 7 10
 1 7------sphere(id=7) has 5 interactions--(1+2+3+4+5)
 4 7
 6 7
----------
 6 8
 8 7------sphere(id=8) has 4 interactions--(1+2+3+4)
 0 8
 5 8
----------
 9 10
 5 9
 1 9------sphere(id=9) has 4 interactions--(1+2+3+4)
 2 9
----------
 9 10
 7 10------sphere(id=10) has 4 interactions--(1+2+3+4)
 0 10
 4 10

c_wallsphere:interactions between walls and spheres
c_spheresphere:interactions between spheres and spheres
n_wall=6:the number of walls
n_sphere:the number of spheres
Z:coordination number

According to Bruno's method:
Z=2*(c_wallsphere+c_spheresphere)/(n_wall+n_sphere)
=2*(12+5)/11=3.0909

According to Christian's method:
Z=[(1+2+3+4+5)*2+(1+2+3+4)*3]/(c_wallsphere+2*c_spheresphere)
=60/(12+2*5)=2.7272

Two different results,I am a little confused, which one I should take?
Sorry for my silly question.

Lingran

Revision history for this message
Christian Jakob (jakob-ifgt) said :
#14

I am not a professional on yade. I think O.interactions gives not only "real" contacts, but also "possible" contacts.
As far as I know coordination number is the average number of contact per particle. So from my point of view for coord. num. I would just count particle-particle contacts, where penetrationDepth > 0 (positive if overlapping, see [1]).

[1] https://yade-dem.org/doc/yade.wrapper.html?highlight=penetration#yade.wrapper.ScGeom.penetrationDepth

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#15

Something like yade.utils.avgNumInteractions() discard the virtual interactions by testing i->isReal(), so this is not a problem.
(c_wallsphere+2*c_spheresphere)/n_sphere is the most meaningful counting in my opinion.
To get this with avgNumInteractions() you can pass the "threshold" parameter to exclude boundaries from the counting (sphere-wall contacts will still count 1).

Revision history for this message
lingran (zhanglingran130) said :
#16

Thanks Chareyre, that solved my question.

Revision history for this message
lingran (zhanglingran130) said :
#17

Thanks Bruno-chareyre, Anton Gladky and Anton Gladky , my problems are solved.

Revision history for this message
lingran (zhanglingran130) said :
#18

Thanks Bruno-chareyre, Anton Gladky and Anton Gladky , my problems are solved.

I have learned a lot, thank you!