← Back to team overview

yade-users team mailing list archive

[Question #669485]: ¿How to create a cylindrical solid body filled with uniformly distributed spheres for compression?

 

New question #669485 on Yade:
https://answers.launchpad.net/yade/+question/669485

Hi there:

I need to simulate a compression of a cylinder. First, I didn't know that the spheres shouldn't have the same radius, so I created a cylindrical predicate and filled it with regularOrtho and it worked fine (the compression). Later I was told that in order to be realistic the spheres should have an uniform or normal distribution so I filled the predicate this time using randomDensePack but then, the compression doesn't work well. What I can see is that the spheres don't behave like a body but like simply spheres in space, so what I need is a way to make them behave as being part of a solid body. I saw an example in which CohFrictMat was used and I thought that that  was the solution but I get the same behaviour.... I post the source code I have right now...Thanks in advance

from yade import utils
from yade import pack
from yade import qt

sample_material=CohFrictMat(
    young=4e9
   ,poisson=1
   ,density=1400
   ,frictionAngle=radians(30)
   ,isCohesive=True
   ,normalCohesion=1e8*1.2
   ,shearCohesion=.4e8*1.2
   ,momentRotationLaw=True
   ,label='sample_mat')

O.materials.append(sample_material)

O.materials.append(FrictMat(young=210e10,poisson=.7,frictionAngle=.1,label="steel")) # Acero

#DATOS PROBETA
RADIO = 0.075 #7.5 cm
ALTURA = 0.3  #30 cm
radio_particulas = 0.005 #5 mm
radio_fuzz = 0.001 #1 mm

#DATOS CAJAS SUPERIOR e INFERIOR
ancho = RADIO*2 #el mismo ancho que la probeta (cilindro)
largo = RADIO*2 #el mismo largo que la probeta (cilindro)
alto=0.01 #1 cm

#DATOS CAJAS LATERALES
alto_lat = ALTURA
ancho_lat = 0.01 #1 cm
largo_lat = RADIO*2

# randomDensePack packing
pred = pack.inCylinder((0,0,0),(0,0,ALTURA),radius=RADIO)
assembly = pack.randomDensePack(pred,radius=radio_particulas,rRelFuzz=radio_fuzz/radio_particulas,returnSpherePack=True)
assembly.toSimulation(material='sample_mat')

upperBox = box(center=(0,0,ALTURA+alto/2), extents=(ancho/2,largo/2,alto/2),fixed=True,wire=True,material='steel')
bottomBox = box(center=(0,0,-alto/2), extents=(ancho/2,largo/2,alto/2),fixed=True,wire=True, material='steel')
frontBox = box(center=(0,-(RADIO+ancho_lat/2),alto_lat/2), extents=(largo_lat/2,ancho_lat/2,alto_lat/2),fixed=True,wire=True,material='steel')
backBox = box(center=(0,RADIO+ancho_lat/2,alto_lat/2), extents=(largo_lat/2,ancho_lat/2,alto_lat/2),fixed=True,wire=True,material='steel')
leftBox = box(center=(-(RADIO+ancho_lat/2),0,alto_lat/2), extents=(ancho_lat/2,largo_lat/2,alto_lat/2),fixed=True,wire=True,material='steel')
rightBox = box(center=(RADIO+ancho_lat/2,0,alto_lat/2), extents=(ancho_lat/2,largo_lat/2,alto_lat/2),fixed=True,wire=True,material='steel')

O.bodies.append(upperBox)
O.bodies.append(bottomBox)
O.bodies.append(frontBox)
O.bodies.append(backBox)
O.bodies.append(leftBox)
O.bodies.append(rightBox)

###########################
# ENGINES
###########################

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=1.25),Bo1_Box_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom6D(interactionDetectionFactor=1.2),Ig2_Box_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_FrictPhys(),
   Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True,setCohesionOnNewContacts=True)],
  [Law2_ScGeom_FrictPhys_CundallStrack(),
  Law2_ScGeom6D_CohFrictPhys_CohesionMoment(useIncrementalForm=True,label='cohesiveLaw')]  

 ),
 NewtonIntegrator(damping=0.3,gravity=(0,0,-9.81)),
 TranslationEngine(translationAxis=[0,0,-1],velocity=0.5,ids=[upperBox.id]),
 TranslationEngine(translationAxis=[0,0,1],velocity=0.5,ids=[bottomBox.id])
 #VTKRecorder(iterPeriod=100,recorders=['spheres','boxes'],fileName='./videoFrames')
]

O.dt = utils.PWaveTimeStep()

try:
 qt.Controller()
 qt.View() 
except:
 pass

-- 
You received this question notification because your team yade-users is
an answer contact for Yade.