A simple case for stress strain curve

Asked by behzad

Hi,

Imagine we have a material sample composed of let's say five spheres with the same radius of 1, touching in line creating a a vertial beam. (as given below)
We put this sample between two facets and apply a certain velocity to the facet(s) to compress the sample.
So, it's a simple compression test on a sample.
I wonder how can we plot the stress-strain curve of this sample.
I guess it can work if I put;

stress=utils.bodyStressTensors()
 and then I call for stress[box_2[[2][2] it should work.
But how this stress is calculated? Does Yade get it from the area estimated from the sphere/facet penetration?
If it's the case what happens if the sample is composed of a random packing of spheres making a cylinder? Does Yade calculate the stress automatically from each contacting spheres or I need to get the force on the facet and then divide it by the area of the sample?

=======================
O.reset()
from yade import utils, plot
from yade import pack, qt

id_Mat1=O.materials.append(FrictMat(young=1e8,poisson=0.3,density=1000,frictionAngle=1))
Mat=O.materials[id_Mat1]

id_Mat2=O.materials.append(FrictMat(young=1e10,poisson=0.3,density=1000,frictionAngle=1))
Rigid=O.materials[id_Mat2]

s1=utils.sphere([0.0,0.0,1.0],1.0,fixed=True,material=Mat)
s2=utils.sphere([0.0,0.0,3.0],1.0,fixed=True,material=Mat)
s3=utils.sphere([0.0,0.0,5.0],1.0,fixed=True,material=Mat)
s4=utils.sphere([0.0,0.0,7.0],1.0,fixed=True,material=Mat)
s5=utils.sphere([0.0,0.0,9.0],1.0,fixed=True,material=Mat)

O.bodies.append(s1)

box_1 = O.bodies.append(box((0,0,0),(1,1,.001),fixed=True,material=Rigid))
box_2 = O.bodies.append(box((0,0,10.0),(1,1,.0001),fixed=True,material=Rigid))

O.engines=[
ForceResetter(),
InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
InteractionLoop(
[Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
[Ip2_FrictMat_FrictMat_FrictPhys()],
[Law2_ScGeom_FrictPhys_CundallStrack()]
),
NewtonIntegrator(damping=0.7,gravity=[0,0,0]),
PyRunner(command='AutoData()',iterPeriod=1000)
]

O.bodies[box_2].state.vel=(0,0,-0.001)

qt.View()

======================================

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
behzad
Solved:
Last query:
Last reply:
Revision history for this message
Jan Stránský (honzik) said :
#1

Hi Behzad,

the function you ask calls function getStressLWForEachBody [1]. It basicly
does what is described in its documentation [2]. For each body, a stress is
estimated from interaction forces acting on the body.

Estimated because of the volume, which is not (unless very special cases
like a space fully filled by boxes) uniquely defined. If you look to [1],
you would find that the algorithm is designed for spherical particles and
in that case the volume is real volume of the sphere. For real packing,
average stress of the packing would be lower than average of these body
stresses (because sum of volume of spheres < volume of box, as stated in
doc [2]).

If a sphere is interacting with facet or box, some suitable radius (like
radius of the interacting sphere) is assigned for the facet (for IGeom
purposes). Note that for each interaction this assigned radius may be
different. Consequently, if you fix facet size, forces acting on the facet
and only change spheres' sizes, you would get different stresses on the
facet. This is the consequence of the design of the function for spheres
(maybe it could be mentioned in the docs). In case of same sized sphere and
same forces, computed stress would be always the same.

HTH
Jan

[1]
http://bazaar.launchpad.net/~yade-pkg/yade/git-trunk/view/head:/pkg/dem/Shop_02.cpp#L398
[2] https://yade-dem.org/doc/yade.utils.html#yade._utils.bodyStressTensors

2014-05-05 20:41 GMT+02:00 behzad majidi <
<email address hidden>>:

> New question #248206 on Yade:
> https://answers.launchpad.net/yade/+question/248206
>
> Hi,
>
> Imagine we have a material sample composed of let's say five spheres with
> the same radius of 1, touching in line creating a a vertial beam. (as given
> below)
> We put this sample between two facets and apply a certain velocity to the
> facet(s) to compress the sample.
> So, it's a simple compression test on a sample.
> I wonder how can we plot the stress-strain curve of this sample.
> I guess it can work if I put;
>
> stress=utils.bodyStressTensors()
> and then I call for stress[box_2[[2][2] it should work.
> But how this stress is calculated? Does Yade get it from the area
> estimated from the sphere/facet penetration?
> If it's the case what happens if the sample is composed of a random
> packing of spheres making a cylinder? Does Yade calculate the stress
> automatically from each contacting spheres or I need to get the force on
> the facet and then divide it by the area of the sample?
>
> =======================
> O.reset()
> from yade import utils, plot
> from yade import pack, qt
>
>
>
> id_Mat1=O.materials.append(FrictMat(young=1e8,poisson=0.3,density=1000,frictionAngle=1))
> Mat=O.materials[id_Mat1]
>
>
> id_Mat2=O.materials.append(FrictMat(young=1e10,poisson=0.3,density=1000,frictionAngle=1))
> Rigid=O.materials[id_Mat2]
>
>
> s1=utils.sphere([0.0,0.0,1.0],1.0,fixed=True,material=Mat)
> s2=utils.sphere([0.0,0.0,3.0],1.0,fixed=True,material=Mat)
> s3=utils.sphere([0.0,0.0,5.0],1.0,fixed=True,material=Mat)
> s4=utils.sphere([0.0,0.0,7.0],1.0,fixed=True,material=Mat)
> s5=utils.sphere([0.0,0.0,9.0],1.0,fixed=True,material=Mat)
>
> O.bodies.append(s1)
>
>
> box_1 = O.bodies.append(box((0,0,0),(1,1,.001),fixed=True,material=Rigid))
> box_2 =
> O.bodies.append(box((0,0,10.0),(1,1,.0001),fixed=True,material=Rigid))
>
> O.engines=[
> ForceResetter(),
> InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
> InteractionLoop(
> [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
> [Ip2_FrictMat_FrictMat_FrictPhys()],
> [Law2_ScGeom_FrictPhys_CundallStrack()]
> ),
> NewtonIntegrator(damping=0.7,gravity=[0,0,0]),
> PyRunner(command='AutoData()',iterPeriod=1000)
> ]
>
>
> O.bodies[box_2].state.vel=(0,0,-0.001)
>
> qt.View()
>
> ======================================
>
> --
> You received this question notification because you are a member of
> yade-users, which is an answer contact for Yade.
>
> _______________________________________________
> Mailing list: https://launchpad.net/~yade-users
> Post to : <email address hidden>
> Unsubscribe : https://launchpad.net/~yade-users
> More help : https://help.launchpad.net/ListHelp
>

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

To me, this column test is better described by a force-displacement relation. Of course you can convert this to stress-strain if you define the height and cross-sectional area of the column, but using more advanced post-processing like bodyStressTensors has no obvious advantage.
You could solve the volume problem mentionned by Jan using [1], but it would give exactly the same as dividing by the cross sectional area mentionned above.

[1] https://www.yade-dem.org/doc/user.html#micro-stress-and-micro-strain

Revision history for this message
behzad (behzad-majidi) said :
#3

So, can I conclude that in the case of a cylindrical sample composed of a random packing of spheres which is being compressed by a facet, the stress can be fairly determined by dividing the unbalanced force on the facet by the area of the sample?

and this value would not be the same as the one returned by bodyStressTensors for the facet! Right?
I wanted to know which value is more realistic.

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

>So, can I conclude that in the case of a cylindrical sample composed of a random packing...

Erm.. not really. If you change your question I may also change my answer...
The problem is the cross sectional area of a random packing is less well defined than that of an organized column. But let's say you can define it. By "unbalanced force" on a facet I mean you mean just "force", correct? If so, ok.

Micro-stress averaging on particles would be also ok but more tricky for a cylinder, because the boundary itself is not clearly defined (same problem for defining cross sectional area btw).

I never expected bodyStressTensors() to give anything meaningful for a facet when I wrote it. If you read the doc you will see that the maths hardly apply to a flat zero-volume object.
I have no idea what it would give to be honnest, but I'm sure it is irrelevant.

Revision history for this message
behzad (behzad-majidi) said :
#5

Thanks
Yeah I meant just force!

cheers,
Behzad