Advertisement
lingran

Eplastic.py

Aug 23rd, 2013
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.11 KB | None | 0 0
  1.  
  2. ##### part 1 : generate a soil sample by gravity deposit
  3.  
  4. from yade import pack,plot
  5. from yade import utils
  6. import random
  7.  
  8.  
  9. finalFricDegree = 30
  10. O.trackEnergy=True
  11. young=100e6
  12. rmean=0.1
  13.  
  14. rmin=0.05
  15. rmax=0.15
  16.  
  17. mn=Vector3(0,0,-2*rmean)
  18. mx=Vector3(7*2*rmean,5*2*rmean,2*rmean)
  19.  
  20. number=30
  21. fallingHeight=5
  22.  
  23. O.materials.append(CohFrictMat(young=100e6,poisson=0.3,frictionAngle=radians(0),density=2600,normalCohesion=0,shearCohesion=0,alphaKr=0.5,alphaKtw=0.01,momentRotationLaw=False,isCohesive=False,etaRoll=-1,label='spheres'))
  24.  
  25. O.materials.append(FrictMat(young=100e6,poisson=0.3,frictionAngle=0,density=0,label='walls'))
  26.  
  27.  
  28. walls=utils.aabbWalls([mn,mx],thickness=0.5*rmean, oversizeFactor=1.0, material='walls')
  29. wallIds=O.bodies.append(walls)
  30.  
  31.  
  32. ssp=pack.SpherePack()
  33.  
  34. for i in range(1,number):
  35.     r =rmin + (rmax-rmin)*(-0.15*log(1-random.random()))**1.33333
  36.     if r>rmax:
  37.      r =rmin + (rmax-rmin)*(-0.15*log(1-random.random()))**1.33333
  38.     mbegin=(0,0,-1*r)
  39.     mend=(mx[0],mx[1],1*r)
  40.     ssp.makeCloud(minCorner=mbegin,maxCorner=mend,rMean=r,rRelFuzz=0,num=1)
  41.  
  42. O.bodies.append([utils.sphere(center,rad,material='spheres') for center,rad in ssp])
  43.  
  44.  
  45. newton=NewtonIntegrator(damping=0.9,kinSplit=True,gravity=(0,0,0))
  46.  
  47. O.engines=[
  48.     ForceResetter(),
  49.     InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
  50.     InteractionLoop(
  51.         [Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Box_Sphere_ScGeom()],
  52.                 [Ip2_FrictMat_FrictMat_FrictPhys(),Ip2_CohFrictMat_CohFrictMat_CohFrictPhys()],
  53.                 [Law2_ScGeom_FrictPhys_CundallStrack(label='law1'),Law2_ScGeom6D_CohFrictPhys_CohesionMoment(
  54.                               useIncrementalForm=False,
  55.                               always_use_moment_law=False,
  56.                               label='law2')]
  57.     ),
  58.     GravityEngine(gravity=(0,-9.81,0)),
  59.     newton
  60.    
  61. ]
  62.  
  63. for b in O.bodies:
  64.     if isinstance(b.shape,Sphere): b.state.blockedDOFs='zXY' # blocked movement along Z
  65.  
  66.  
  67. O.dt=0.5*utils.PWaveTimeStep()
  68.  
  69. O.trackEnergy=True
  70.  
  71.  
  72. while 1:
  73.     O.run(1000,True)
  74.     unb=unbalancedForce()
  75.     if unb < 0.001:
  76.         break
  77.        
  78. ## reset boundaries  
  79. Mz=max([b.state.pos[1]+b.shape.radius for b in O.bodies if isinstance(b.shape,Sphere)])
  80. h=Mz/4
  81.  
  82. mn=(0,0,-2*rmean)
  83. mxafter=Vector3(mx[0],Mz+2*rmean,2*rmean)
  84.  
  85. O.bodies.erase(0)
  86. O.bodies.erase(1)
  87. O.bodies.erase(2)
  88. O.bodies.erase(3)
  89. O.bodies.erase(4)
  90. O.bodies.erase(5)
  91.  
  92. O.bodies.append(utils.aabbWalls([mn,mxafter],thickness=0.1*rmean, oversizeFactor=1.0, material='walls'))
  93.  
  94. O.bodies.erase(3)
  95. O.bodies.erase(4)
  96. O.bodies.erase(5)
  97.      
  98. ## add friction and moment law
  99. O.materials[0].frictionAngle=radians(finalFricDegree)
  100. O.materials[0].momentRotationLaw=True
  101. O.engines[2].lawDispatcher.functors[1].always_use_moment_law = True
  102.  
  103. O.engines[4].damping=0.000
  104.  
  105. O.run(1000, True)
  106. O.saveTmp()
  107.  
  108.  
  109. #### part 3: add the boulder and conduct impact modelling, track energy dissipations  
  110.  
  111. boulderradius=1.5*rmean
  112.  
  113. sp2=pack.SpherePack()
  114.  
  115. mbegin=(0.5*mxafter[0]*1.0-boulderradius,mxafter[1],-1*boulderradius)
  116. mend=(0.5*mxafter[0]*1.0+boulderradius,mxafter[1]+2
  117. *boulderradius,1*boulderradius)
  118. sp2.makeCloud(minCorner=mbegin,maxCorner=mend,rMean=boulderradius,rRelFuzz=0,num=1)
  119. O.bodies.append([utils.sphere(center,rad,material='spheres') for center,rad in sp2])
  120.  
  121. O.bodies[3].state.blockedDOFs='zXY'
  122.  
  123. O.bodies[3].state.vel=Vector3(0,-5,0)
  124.  
  125. O.dt=0.1*utils.PWaveTimeStep()
  126.  
  127. for i in range (1,2000):
  128.     O.run(20,True)
  129.     if -O.forces.f(3)[1]< O.bodies[3].state.mass*9.81:
  130.       tt=O.time
  131.       break
  132.  
  133.  
  134. O.run(1000,True)
  135. tt=O.time
  136.  
  137. O.saveTmp()
  138.  
  139. tt=O.time
  140. f=open('epTrack.txt','w')
  141. O.step()
  142. e=0
  143. aa=O.energy['plastDissip']
  144.  
  145. for k in range (1,100):
  146.  
  147.     for i in O.interactions:
  148.         Ft=i.phys.shearForce
  149.         du=i.geom.shearInc
  150.         kt=i.phys.ks
  151.         kn=i.phys.kn
  152.         Fn=i.phys.normalForce
  153.             Ftt=Ft-kt*du
  154.         maxFs=Fn.norm()*i.phys.tangensOfFrictionAngle
  155.         if(Ftt.norm() > maxFs):
  156.                 ratio = maxFs / Ftt.norm()
  157.                 trialForce=Ftt
  158.                 Ftt *= ratio
  159.                 e=e+((1/kt)*(trialForce-Ftt)).dot(Ftt)
  160.            
  161.     O.step()
  162.     E=O.energy['plastDissip']-aa
  163.     f.write('%f %f %f \n' %(O.time-tt,e,E))
  164.    
  165.    
  166. f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement