← Back to team overview

yade-users team mailing list archive

Re: [Question #647446]: i need help to model gravels (28cm-50cm)in a box. Any help please. is for a college project work.-(we can talk about cost)

 

Question #647446 on Yade changed:
https://answers.launchpad.net/yade/+question/647446

    Status: Open => Answered

Jan Stránský proposed the following answer:
A MWE below. I used polyhedra, but it takes a lot of time. Spheres with high friction coefficient ma be used to simulate polyhedra and make the simulation faster. It very much depends on the purpose of the simulations and allowed level of simplification.
###########
######################################################################
# INPUTS
######################################################################
gravity = 100

# box dimensions
widthl = .3
widthr = .3
widthc = .3
height = .3
thick  = .1
deep   = -.2

# size of grains
sizeMin = 40e-3
sizeMax = 60e-3

frictionAngle = .5
young = 1e8 # stiffness

dt = 1e-3 # time step

nGravityDeposition = 250 # how long to run initial gravity deposition
nCycles = 3 # how many jumps to run afterwards
nStepsBetweenCycles = 200 # number of time steps between jumps
dspl = 20e-3

# how much larger the initial make cloud box should be
fillBoxHFactor = 3
######################################################################
from yade import polyhedra_utils

width = widthl+widthc+widthr

# mat, engines, ...
mat = PolyhedraMat(young=young,poisson=10,frictionAngle=frictionAngle)
O.materials.append(mat)
O.engines=[
   ForceResetter(),
   InsertionSortCollider([Bo1_Polyhedra_Aabb(),Bo1_Facet_Aabb()]),
   InteractionLoop(
      [Ig2_Polyhedra_Polyhedra_PolyhedraGeom(), Ig2_Facet_Polyhedra_PolyhedraGeom()],
      [Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys()],
      [Law2_PolyhedraGeom_PolyhedraPhys_Volumetric()],
   ),
   NewtonIntegrator(damping=0.4,gravity=(0,0,-gravity)),
	PyRunner(iterPeriod=1,command='checker()'),
]
O.dt = dt
def checker():
	for i in range(nCycles):
		ii = nGravityDeposition+i*nStepsBetweenCycles
		if O.iter == ii:
			moveBottom()
		if O.iter == ii+1:
			stopBottom()
	if O.iter == nGravityDeposition+nCycles*nStepsBetweenCycles:
		O.pause()
def moveBottom():
	v = dspl / O.dt
	for b in movables:
		b.state.vel = (0,0,-v)
def stopBottom():
	for b in movables:
		b.state.vel = (0,0,0)

# box
p000 = Vector3(0,0,0)
p100 = Vector3(widthl,0,0)
p200 = Vector3(widthl+widthc,0,0)
p300 = Vector3(widthl+widthc+widthr,0,0)
pxs = (p000,p100,p200,p300)
p001,p101,p201,p301 = [p+Vector3(0,0,height) for p in pxs]
p010,p110,p210,p310 = [p+Vector3(0,thick,0) for p in pxs]
p011,p111,p211,p311 = [p+Vector3(0,thick,height) for p in pxs]
p00b,p10b,p20b,p30b = [p+Vector3(0,0,deep) for p in pxs]
p01b,p11b,p21b,p31b = [p+Vector3(0,thick,deep) for p in pxs]
def rect(vs,**kw):
	v1,v2,v3,v4 = vs
	return [
		facet((v1,v2,v3),**kw),
		facet((v1,v3,v4),**kw),
	]
movables = rect((p100,p200,p210,p110)) # bottom center
rects = (
	(p000,p100,p110,p010), # bottom left
	(p200,p300,p310,p210), # bottom left
	(p000,p010,p011,p001), # left
	(p300,p310,p311,p301), # right
	(p000,p100,p101,p001), # front left
	(p100,p200,p201,p101), # front center
	(p200,p300,p301,p201), # front right
	(p010,p110,p111,p011), # back left
	(p110,p210,p211,p111), # back center
	(p210,p310,p311,p211), # back right
	(p100,p200,p20b,p10b), # front center below
	(p110,p210,p21b,p11b), # back center below
	(p100,p110,p11b,p10b), # left below
	(p200,p210,p21b,p20b), # right below
)
rects = movables + sum((rect(r) for r in rects),[])
O.bodies.append(rects)

# gravel
polyhedra_utils.fillBox((0,0,0),(width,thick,fillBoxHFactor*height),mat,sizemin=3*[sizeMin],sizemax=3*[sizeMax],seed=1)
###########
cheers
Jan

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