Cylinder powder compaction
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 PeriTriaxialCon
So I tried to use TriaxialCompres
My question is, how can I compact particle in a cylinder cloud? Or is it possible to create a cylinder walls around the sphere and in the bottom and apply pressure from the top only (-z direction)?
My code is:
from __future__ import print_function
sigmaIso=-1e5
#import matplotlib
#matplotlib.
# generate loose packing
from yade import pack, qt, plot
from yade import utils
sample_
young=4e9
,poisson=1
,density=1400
,frictionAng
,isCohesive=True
,normalCohes
,shearCohesi
,momentRotat
,label=
O.materials.
#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
#assembly = pack.randomDens
#assembly.
sp = pack.SpherePack()
sp.makeCloud(
cyl = pack.inCylinder
sp = pack.filterSphe
sp.toSimulation()
O.engines=[
ForceResetter(),
InsertionSortC
InteractionLoop(
[Ig2_
[Ip2_
[Law2_
),
TriaxialCompre
# specify target values and whether they are strains or stresses
goal=
# type of servo-control
dynCell=
# wait until the unbalanced force goes below this value
maxUnbalanced
# call this function when goal is reached and the packing is stable
doneHook=
),
NewtonIntegrat
PyRunner(
]
O.dt=.5*
def addPlotData():
plot.addData(
sxx=triax.
exx=triax.
# save all available energy data
Etot=
)
# enable energy tracking in the code
O.trackEnergy=True
# define what to plot
plot.plots=
# energy plot
' i ':(O.energy.
}
# show the plot
plot.plot()
def compactionFinis
# set the current cell configuration to be the reference one
O.cell.
# change control type: keep constant confinement in x,y, 20% compression in z
triax.
triax.stressMask=3
# allow faster deformation along x,y to better maintain stresses
triax.
# next time, call triaxFinished instead of compactionFinished
triax.
# do not wait for stabilization before calling triaxFinished
triax.
def triaxFinished():
print('Finished')
O.pause()
Question information
- Language:
- English Edit question
- Status:
- Solved
- For:
- Yade Edit question
- Assignee:
- No assignee Edit question
- Solved by:
- Mithushan Soundaranathan
- Solved:
- 2021-02-04
- Last query:
- 2021-02-04
- Last reply:
- 2021-02-01
This question was reopened
- 2021-02-01 by Mithushan Soundaranathan
Karol Brzezinski (kbrzezinski) said : | #1 |
If you just need to prepare a cloud prior to your simulation you should check the manual [1] and this example [2].
If the compaction process is within the scope of your analysis, you can create a cylinder from facets, using this function [3].
[1] https:/
[2] https:/
[3] https:/
Hi,
thank you very much, I have managed to fill a cylinder with a cloud. But have problem when I try to compress the spheres inside the cylinder only in the z-direction. I am not sure how to do it?
Best,
Mithu
Here is my code:
from __future__ import print_function
sigmaIso=-1e5
#import matplotlib
#matplotlib.
# generate loose packing
from yade import pack, qt, plot
from yade import utils
sample_
young=4e9
,poisson=1
,density=1400
,frictionAng
,isCohesive=True
,normalCohes
,shearCohesi
,momentRotat
,label=
O.materials.
#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
#assembly = pack.randomDens
#assembly.
sp = pack.SpherePack()
sp.makeCloud(
#cyl = pack.inCylinder
#sp = pack.filterSphe
sp.toSimulation
id_wall = O.materials.
O.materials[
### WALLS
O.bodies.
O.bodies.
Karol Brzezinski (kbrzezinski) said : | #4 |
Hi,
the first thing is, you need to add "Bo1_Wall_Aabb()" and "Bo1_Facet_Aabb()" in the collider, so the balls could interact with walls and facets. The same story with "Ig2_Wall_
I erased the box from your example, and added one wall at the top of your cloud. It moves down and pushes the balls. The rest is up to you. Please find working code below.
Cheers,
Karol
#######
from __future__ import print_function
sigmaIso=-1e5
#import matplotlib
#matplotlib.
# generate loose packing
from yade import pack, qt, plot
from yade import utils
sample_
young=4e9
,poisson=1
,density=1400
,frictionAng
,isCohesive=True
,normalCohes
,shearCohesi
,momentRotat
,label=
O.materials.
#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
#assembly = pack.randomDens
#assembly.
sp = pack.SpherePack()
sp.makeCloud(
#cyl = pack.inCylinder
#sp = pack.filterSphe
sp.toSimulation
id_wall = O.materials.
O.materials[
### WALLS
O.bodies.
#find max Z coordinate of your cloud
max_z = aabbExtrema()[1][2]
# add top wall
pushWallId = O.bodies.
#set vertical downward speed to the wall
O.bodies[
################### ENGINES
O.engines=[
ForceResetter(),
InsertionSortC
InteractionLoop(
[Ig2_
[Ip2_
[Law2_
),
NewtonIntegrat
]
O.dt=.5*
Hi Karol,
Thank you very much, that was exactly what I was looking for.
Best regards,
Mithu
Hi,
A quick question, the wall moving past the bottom of the cylinder. How do I stop it?
Best,
Mithu
Jan Stránský (honzik) said : | #7 |
a quick answer, see [1] :-)
cheers
Jan
Hi Jan,
Thanks very much, is it possible to give a certain porosity as a stop condition?
How can I save the spheres position and radius after simulation?
Best,
Mithu
Jan Stránský (honzik) said : | #9 |
> is it possible to give a certain porosity as a stop condition?
sure, see [1] :-) the checkUnbalanced() approach, just instead of unbalanced force you check porosity
> How can I save the spheres position and radius after simulation?
the easiest way is to use export.text [2]
cheers
Jan
[1] https:/
[2] https:/
Hi Jan,
Thank you very much :-)
Best,
Mithu
Hi,
I was wondering if it possible to measure the volume of the particle packing at different time during simulation and also "count"the number of particles initially?
I tried to use the num function in makeCloud, but did get the desired number. F.eks when num=100 I only got around 50 particles, and for num=1000 I only got around 400 particles?
Best regards,
Mithushan
If you do not trust makeCloud (I guess the number of the particles could be smaller if there is not enough space in predictor), why don't you count the spheres in the loop:
count = 0
for b in O.bodies:
if isinstance(b.shape, Sphere):
count +=1
Approximate size of your cloud in the current shape could be obtained using tesselation wrapper [1]:
TW=TesselationW
TW.triangulate()
TW.computeVolumes()
totVolume = 0
for i in range(count):
totVolume += TW.volume(i)
Don't forget to triangulate and computeVolumes again to 'refresh' the state (when the shape of your cloud changes).
Karol
[1] https:/
Hi Karol,
Thank you very much, but problem is that I am measuring volume during compression and this method does account for particle deformation.
Best,
Mithu
Hi Mithushan,
I think that I may have trouble understanding the problem.
As far as I know your sample code, you use 'regular' spheres, thus particles don't deform. The shape of your cloud deforms under compression. I expected that you would like to take this deformation into account, and that is why I proposed the tesselation wrapper. If you want to know the volume of the cloud before simulation, you can compute it from its dimensions e.g.
aabbDim(
However, I don't think it is the problem, because the tesselation wrapper would give you the same result (before compression).
Could you try to rephrase the problem?
Karol
Hi Karol,
Thank you for your help.
Best,
Mithushan