The relationship of Young modulus, Poisson’s ratio and shear modulus

Asked by liukeqi

Hello everyone,
I want to use the boundary controller “peri3dController” to test the property of the concrete material, but I found that the relation of Young modulus(E), Poisson’s ratio and shear modulus(G) did not accord with the formula G =E/2(1+poisson). I use the formula “stress/strain” to calculate the Young modulus and shear modulus, and use the formula “-1/2*(strain[y]+strain[z])/strain[x]” to calculate the Poisson’s ratio.I also found that in the source code “ConcretePM.cpp”, “void Ip2_CpmMat_CpmMat_CpmPhys::go()”, there is “cpmPhys->G = mat1->young*mat1->poisson;”. Can you tell me why the source code do not accord with the formula G =E/2(1+poisson)? Is there any misunderstanding for me? If I want to make the material accord with the formula G =E/2(1+poisson), which material should I choose or what parameter should I change to meet the condition? Thanks a lot. This is my code.

###############################first, calculate the shear modulus
#!/usr/bin/python # This is server.py file
from __future__ import division
import string
from yade import plot,qt
from yade.pack import *
from yade import pack, plot

O.materials.append(CpmMat(density=4800,young=10.4e10,frictionAngle=.7,poisson=.15,sigmaT=3e6,epsCrackOnset=1e-4,relDuctility=30))

initSize=1.2

sp=pack.randomPeriPack(radius=.05,initSize=Vector3(initSize,initSize,initSize))

sp.toSimulation()

plot.plots={'iter':('sx','sy','sz','syz','szx','sxy',),'iter_':('ex','ey','ez','eyz','ezx','exy',),'exy':('sxy',)}

def plotAddData():
 plot.addData(
  iter=O.iter,iter_=O.iter,
  sx=p3d.stress[0],sy=p3d.stress[1],sz=p3d.stress[2],
  syz=p3d.stress[3],szx=p3d.stress[4],sxy=p3d.stress[5],
  ex=p3d.strain[0],ey=p3d.strain[1],ez=p3d.strain[2],
  eyz=p3d.strain[3],ezx=p3d.strain[4],exy=p3d.strain[5],
 )

O.dt=PWaveTimeStep()/2

EnlargeFactor=1.5
EnlargeFactor=1.0
O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=EnlargeFactor,label='bo1s')]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=EnlargeFactor,label='ig2ss')],
  [Ip2_CpmMat_CpmMat_CpmPhys()],[Law2_ScGeom_CpmPhys_Cpm()]),
 NewtonIntegrator(),
 Peri3dController(

       stressMask=0b011111, # prescribed ex,ey,sz,syz,ezx,sxy; e..strain; s..stress
       nSteps=4000, # how many time steps the simulation will last
       # after reaching nSteps do doneHook action
       doneHook='print "Simulation with Peri3dController finished."; O.pause()',

       # the prescribed path (step,value of stress/strain) can be defined in absolute values

       # or in relative values

       # if the goal value is 0, the absolute stress/strain values are always considered (step values remain relative)

       # if ##Path is not explicitly defined, it is considered as linear function between (0,0) and (nSteps,goal)
       # as in yzPath and xyPath
       # the relative values are really relative (zxPath gives the same - except of the sign from goal value - result as yyPath)

       # variables used in the first step
       label='p3d'
       ),
 PyRunner(command='plotAddData()',iterPeriod=1),
]

p3d.goal=(0,0,0,0,0,-0.00002) #xx, yy, zz, yz, zx, xy
O.step()
bo1s.aabbEnlargeFactor=ig2ss.interactionDetectionFactor=1.
O.run(); O.wait()

print "the shear modulus"
print p3d.stress[5]/p3d.strain[5]

plot.plot(subPlots=False)

##########################second, calculate the Young modulus and Poisson's ratio
#!/usr/bin/python # This is server.py file
from __future__ import division
import string
from yade import plot,qt
from yade.pack import *
from yade import pack, plot

O.materials.append(CpmMat(density=4800,young=10.4e10,frictionAngle=.7,poisson=.15,sigmaT=3e6,epsCrackOnset=1e-4,relDuctility=30))

initSize=1.2

sp=pack.randomPeriPack(radius=.05,initSize=Vector3(initSize,initSize,initSize))

sp.toSimulation()

plot.plots={'iter':('sx','sy','sz','syz','szx','sxy',),'iter_':('ex','ey','ez','eyz','ezx','exy',),'ex':('sx',)}

def plotAddData():
 plot.addData(
  iter=O.iter,iter_=O.iter,
  sx=p3d.stress[0],sy=p3d.stress[1],sz=p3d.stress[2],
  syz=p3d.stress[3],szx=p3d.stress[4],sxy=p3d.stress[5],
  ex=p3d.strain[0],ey=p3d.strain[1],ez=p3d.strain[2],
  eyz=p3d.strain[3],ezx=p3d.strain[4],exy=p3d.strain[5],
 )

O.dt=PWaveTimeStep()/2

EnlargeFactor=1.5
EnlargeFactor=1.0
O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=EnlargeFactor,label='bo1s')]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=EnlargeFactor,label='ig2ss')],
  [Ip2_CpmMat_CpmMat_CpmPhys()],[Law2_ScGeom_CpmPhys_Cpm()]),
 NewtonIntegrator(),
 Peri3dController(

       stressMask=0b111110, # prescribed ex,ey,sz,syz,ezx,sxy; e..strain; s..stress
       nSteps=4000, # how many time steps the simulation will last
       # after reaching nSteps do doneHook action
       doneHook='print "Simulation with Peri3dController finished."; O.pause()',

       # the prescribed path (step,value of stress/strain) can be defined in absolute values

       # or in relative values

       # if the goal value is 0, the absolute stress/strain values are always considered (step values remain relative)

       # if ##Path is not explicitly defined, it is considered as linear function between (0,0) and (nSteps,goal)
       # as in yzPath and xyPath
       # the relative values are really relative (zxPath gives the same - except of the sign from goal value - result as yyPath)

       # variables used in the first step
       label='p3d'
       ),
 PyRunner(command='plotAddData()',iterPeriod=1),
]

p3d.goal=(-0.00002,0,0,0,0,0) #xx, yy, zz, yz, zx, xy
O.step()
bo1s.aabbEnlargeFactor=ig2ss.interactionDetectionFactor=1.
O.run(); O.wait()
print "Young modulus"
print p3d.stress[0]/p3d.strain[0]

print "Poisson's ratio"
print -1/2*(p3d.strain[1]+p3d.strain[2])/p3d.strain[0]

plot.plot(subPlots=False)

Question information

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

Hello,

the input parameters "young" and "poisson", as well as contact parameters
"E", "G" etc. are the model (or "micro") parameters. The overall structural
response (or "macro" parameters), Young' modulus, shear modulus and
Poisson's ratio is somehow related to them, but they are not the same. See
the links below for more information.

G and E/2(1+nu), computed from the simulation results, should
approximatelly fit together. The formula (and that for Young's modulus and
Poisson's ratio) of course are valid only in elastic range. With the input
data in your script, the concrete already exhibit some inelastic effects,
so the results of elastic constants does not fit together. Replace material
in both cases with following (or decrease stresses and strains to remain in
elastic range) and it should work

O.materials.append(CpmMat(density=4800,young=10.4e10,frictionAngle=.7,poisson=.15,sigmaT=3e60,epsCrackOnset=1e60,relDuctility=30,neverDamage=True))

I tried it and the difference was 2%.

cheers
Jan

[1] https://answers.launchpad.net/yade/+question/198594
[2] https://answers.launchpad.net/yade/+question/248983
[3] https://answers.launchpad.net/yade/+question/222363
[4] https://www.yade-dem.org/doc/formulation.html#stiffnesses
[5] https://www.yade-dem.org/doc/formulation.html#contact-cross-section

2016-04-08 5:22 GMT+02:00 liukeqi <email address hidden>:

> Question #290179 on Yade changed:
> https://answers.launchpad.net/yade/+question/290179
>
> Description changed to:
> Hello everyone,
> I want to use the boundary controller “peri3dController” to test the
> property of the concrete material, but I found that the relation of Young
> modulus(E), Poisson’s ratio and shear modulus(G) did not accord with the
> formula G =E/2(1+poisson). I use the formula “stress/strain” to calculate
> the Young modulus and shear modulus, and use the formula
> “-1/2*(strain[y]+strain[z])/strain[x]” to calculate the Poisson’s ratio.I
> also found that in the source code “ConcretePM.cpp”, “void
> Ip2_CpmMat_CpmMat_CpmPhys::go()”, there is “cpmPhys->G =
> mat1->young*mat1->poisson;”. Can you tell me why the source code do not
> accord with the formula G =E/2(1+poisson)? Is there any misunderstanding
> for me? If I want to make the material accord with the formula G
> =E/2(1+poisson), which material should I choose or what parameter should I
> change to meet the condition? Thanks a lot. This is my code.
>
> ###############################first, calculate the shear modulus
> #!/usr/bin/python # This is server.py file
> from __future__ import division
> import string
> from yade import plot,qt
> from yade.pack import *
> from yade import pack, plot
>
>
> O.materials.append(CpmMat(density=4800,young=10.4e10,frictionAngle=.7,poisson=.15,sigmaT=3e6,epsCrackOnset=1e-4,relDuctility=30))
>
> initSize=1.2
>
>
> sp=pack.randomPeriPack(radius=.05,initSize=Vector3(initSize,initSize,initSize))
>
> sp.toSimulation()
>
>
> plot.plots={'iter':('sx','sy','sz','syz','szx','sxy',),'iter_':('ex','ey','ez','eyz','ezx','exy',),'exy':('sxy',)}
>
> def plotAddData():
> plot.addData(
> iter=O.iter,iter_=O.iter,
> sx=p3d.stress[0],sy=p3d.stress[1],sz=p3d.stress[2],
> syz=p3d.stress[3],szx=p3d.stress[4],sxy=p3d.stress[5],
> ex=p3d.strain[0],ey=p3d.strain[1],ez=p3d.strain[2],
> eyz=p3d.strain[3],ezx=p3d.strain[4],exy=p3d.strain[5],
> )
>
>
> O.dt=PWaveTimeStep()/2
>
> EnlargeFactor=1.5
> EnlargeFactor=1.0
> O.engines=[
> ForceResetter(),
>
> InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=EnlargeFactor,label='bo1s')]),
> InteractionLoop(
>
> [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=EnlargeFactor,label='ig2ss')],
> [Ip2_CpmMat_CpmMat_CpmPhys()],[Law2_ScGeom_CpmPhys_Cpm()]),
> NewtonIntegrator(),
> Peri3dController(
>
>
> stressMask=0b011111, # prescribed ex,ey,sz,syz,ezx,sxy; e..strain;
> s..stress
> nSteps=4000,
> # how many time steps the simulation will last
> # after reaching
> nSteps do doneHook action
> doneHook='print
> "Simulation with Peri3dController finished."; O.pause()',
>
> # the prescribed
> path (step,value of stress/strain) can be defined in absolute values
>
> # or in relative
> values
>
> # if the goal
> value is 0, the absolute stress/strain values are always considered (step
> values remain relative)
>
> # if ##Path is not
> explicitly defined, it is considered as linear function between (0,0) and
> (nSteps,goal)
> # as in yzPath and
> xyPath
> # the relative
> values are really relative (zxPath gives the same - except of the sign from
> goal value - result as yyPath)
>
>
> # variables used
> in the first step
> label='p3d'
> ),
> PyRunner(command='plotAddData()',iterPeriod=1),
> ]
>
>
> p3d.goal=(0,0,0,0,0,-0.00002) #xx, yy, zz, yz, zx, xy
> O.step()
> bo1s.aabbEnlargeFactor=ig2ss.interactionDetectionFactor=1.
> O.run(); O.wait()
>
> print "the shear modulus"
> print p3d.stress[5]/p3d.strain[5]
>
>
> plot.plot(subPlots=False)
>
> ##########################second, calculate the Young modulus and
> Poisson's ratio
> #!/usr/bin/python # This is server.py file
> from __future__ import division
> import string
> from yade import plot,qt
> from yade.pack import *
> from yade import pack, plot
>
>
> O.materials.append(CpmMat(density=4800,young=10.4e10,frictionAngle=.7,poisson=.15,sigmaT=3e6,epsCrackOnset=1e-4,relDuctility=30))
>
> initSize=1.2
>
>
> sp=pack.randomPeriPack(radius=.05,initSize=Vector3(initSize,initSize,initSize))
>
> sp.toSimulation()
>
>
> plot.plots={'iter':('sx','sy','sz','syz','szx','sxy',),'iter_':('ex','ey','ez','eyz','ezx','exy',),'ex':('sx',)}
>
> def plotAddData():
> plot.addData(
> iter=O.iter,iter_=O.iter,
> sx=p3d.stress[0],sy=p3d.stress[1],sz=p3d.stress[2],
> syz=p3d.stress[3],szx=p3d.stress[4],sxy=p3d.stress[5],
> ex=p3d.strain[0],ey=p3d.strain[1],ez=p3d.strain[2],
> eyz=p3d.strain[3],ezx=p3d.strain[4],exy=p3d.strain[5],
> )
>
> O.dt=PWaveTimeStep()/2
>
> EnlargeFactor=1.5
> EnlargeFactor=1.0
> O.engines=[
> ForceResetter(),
>
> InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=EnlargeFactor,label='bo1s')]),
> InteractionLoop(
>
> [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=EnlargeFactor,label='ig2ss')],
> [Ip2_CpmMat_CpmMat_CpmPhys()],[Law2_ScGeom_CpmPhys_Cpm()]),
> NewtonIntegrator(),
> Peri3dController(
>
>
> stressMask=0b111110, # prescribed ex,ey,sz,syz,ezx,sxy; e..strain;
> s..stress
> nSteps=4000,
> # how many time steps the simulation will last
> # after reaching
> nSteps do doneHook action
> doneHook='print
> "Simulation with Peri3dController finished."; O.pause()',
>
> # the prescribed
> path (step,value of stress/strain) can be defined in absolute values
>
> # or in relative
> values
>
> # if the goal
> value is 0, the absolute stress/strain values are always considered (step
> values remain relative)
>
> # if ##Path is not
> explicitly defined, it is considered as linear function between (0,0) and
> (nSteps,goal)
> # as in yzPath and
> xyPath
> # the relative
> values are really relative (zxPath gives the same - except of the sign from
> goal value - result as yyPath)
>
>
> # variables used
> in the first step
> label='p3d'
> ),
> PyRunner(command='plotAddData()',iterPeriod=1),
> ]
>
>
> p3d.goal=(-0.00002,0,0,0,0,0) #xx, yy, zz, yz, zx, xy
> O.step()
> bo1s.aabbEnlargeFactor=ig2ss.interactionDetectionFactor=1.
> O.run(); O.wait()
> print "Young modulus"
> print p3d.stress[0]/p3d.strain[0]
>
> print "Poisson's ratio"
> print -1/2*(p3d.strain[1]+p3d.strain[2])/p3d.strain[0]
>
>
> plot.plot(subPlots=False)
>
> --
> You received this question notification because your team yade-users 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
liukeqi (891979456-h) said :
#2

Thanks Jan Stránský , that solved my question.