← Back to team overview

yade-users team mailing list archive

[Question #695126]: Cylinder powder compaction

 

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

Hi,

I am working on compaction of powder into cylinder shape. I have created a cylinder cloud with spherical particles, which I am trying to compress.
I tried to use PeriTriaxialController, I am getting error message saying that this will not work for aperiodic simulation. 
So I tried to use TriaxialCompressionEngine, I am not getting any error message. But problem is that the particle will not compact together, the particles are staying at the same place in the cloud. 

My question is, how can I compact particle in a cylinder cloud?

My code is:

from __future__ import print_function
sigmaIso=-1e5

#import matplotlib
#matplotlib.use('Agg')

# generate loose packing
from yade import pack, qt, plot
from yade import utils

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)


#DATOS PROBETA
radius_tablet = 0.015 #1.5 cm
height_tablet = 0.02 #2 cm
radius_particle = 0.001 #1 mm
radius_std = 0.0005 #0.5 mm


# randomDensePack packing
#pred = pack.inCylinder((0,0,0),(0,0,height_tablet),radius=radius_tablet)
#assembly = pack.randomDensePack(pred,radius=radius_particle,rRelFuzz=0,returnSpherePack=True)
#assembly.toSimulation(material='sample_mat')

sp = pack.SpherePack()
sp.makeCloud((0,0,0),(2,2,2),rMean=.1,num=400)
cyl = pack.inCylinder((1,1,0),(1,1,2),1)
sp = pack.filterSpherePack(cyl,sp,True)
sp.toSimulation()

O.engines=[
	ForceResetter(),
	InsertionSortCollider([Bo1_Sphere_Aabb()]),
	InteractionLoop(
		[Ig2_Sphere_Sphere_ScGeom()],
		[Ip2_FrictMat_FrictMat_FrictPhys()],
		[Law2_ScGeom_FrictPhys_CundallStrack()]
	),
	TriaxialCompressionEngine(label='triax',
		# specify target values and whether they are strains or stresses
		goal=(sigmaIso,sigmaIso,sigmaIso),stressMask=7,
		# type of servo-control
		dynCell=True,maxStrainRate=(10,10,10),
		# wait until the unbalanced force goes below this value
		maxUnbalanced=.1,relStressTol=1e-3,
		# call this function when goal is reached and the packing is stable
		doneHook='compactionFinished()'
	),
	NewtonIntegrator(damping=.2),
	PyRunner(command='addPlotData()',iterPeriod=100),
]
O.dt=.5*PWaveTimeStep()

def addPlotData():
	plot.addData(unbalanced=unbalancedForce(),i=O.iter,
		sxx=triax.stress[0],syy=triax.stress[1],szz=triax.stress[2],
		exx=triax.strain[0],eyy=triax.strain[1],ezz=triax.strain[2],
		# save all available energy data
		Etot=O.energy.total(),**O.energy
	)

# enable energy tracking in the code
O.trackEnergy=True

# define what to plot
plot.plots={'i':('unbalanced',),'i ':('sxx','syy','szz'),' i':('exx','eyy','ezz'),
	# energy plot
	' i ':(O.energy.keys,None,'Etot'),
}
# show the plot
plot.plot()

def compactionFinished():
	# set the current cell configuration to be the reference one
	O.cell.trsf=Matrix3.Identity
	# change control type: keep constant confinement in x,y, 20% compression in z
	triax.goal=(sigmaIso,sigmaIso,-.2)
	triax.stressMask=3
	# allow faster deformation along x,y to better maintain stresses
	triax.maxStrainRate=(1.,1.,.1)
	# next time, call triaxFinished instead of compactionFinished
	triax.doneHook='triaxFinished()'
	# do not wait for stabilization before calling triaxFinished
	triax.maxUnbalanced=10

def triaxFinished():
	print('Finished')
	O.pause()

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