yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #12675
[Branch ~yade-pkg/yade/git-trunk] Rev 3868: Added an example for generation of 'agglomerate' packing
------------------------------------------------------------
revno: 3868
committer: Jan Stransky <jan.stransky@xxxxxxxxxxx>
timestamp: Wed 2016-05-25 00:46:38 +0200
message:
Added an example for generation of 'agglomerate' packing
added:
examples/agglomerate/
examples/agglomerate/README
examples/agglomerate/compress.py
examples/agglomerate/divide.py
examples/agglomerate/makeCloud.py
examples/agglomerate/simulation.py
--
lp:yade
https://code.launchpad.net/~yade-pkg/yade/git-trunk
Your team Yade developers is subscribed to branch lp:yade.
To unsubscribe from this branch go to https://code.launchpad.net/~yade-pkg/yade/git-trunk/+edit-subscription
=== added directory 'examples/agglomerate'
=== added file 'examples/agglomerate/README'
--- examples/agglomerate/README 1970-01-01 00:00:00 +0000
+++ examples/agglomerate/README 2016-05-24 22:46:38 +0000
@@ -0,0 +1,14 @@
+A series of scripts that prepare and agglomerate packing, i.e. cohesive elastic aggregates, each composed of dense particle packing
+
+A general idea:
+- create a "macro" particles as large spheres using makeCloud
+- "mesh" these macroparticles with smaller spheres
+- run compression to make the loose packing denser
+- save the result
+- use the resulting packing in actual simulation
+
+Scripts in order to run:
+- makeCloud.py ... a script to prepare loose packing of macro particles using makeCloud
+- divide.py ... a script to divide the macro particles from previous step into clump of particles
+- compress.py ... a script to create dense packing of agglomerates
+- simulation.py ... use of prepared dense packing of agglomerates in a simple simulation
=== added file 'examples/agglomerate/compress.py'
--- examples/agglomerate/compress.py 1970-01-01 00:00:00 +0000
+++ examples/agglomerate/compress.py 2016-05-24 22:46:38 +0000
@@ -0,0 +1,59 @@
+######################################################################
+# Compress the loose packing into dense packing. Each agglomerate is
+# considered as clump in this stage
+######################################################################
+from yade import export,ymport
+import random
+random.seed(1)
+
+# add walls first
+dim = (15,15,15)
+walls = aabbWalls(((0,0,0),(dim)))
+wallIds = O.bodies.append(walls)
+
+# load spheres from file, including information of their agglomerates ids
+attrs = []
+sp = ymport.textExt('/tmp/divided.txt',format='x_y_z_r_attrs',attrs=attrs)
+n = max(int(a[0]) for a in attrs)+1
+colors = [randomColor() for _ in xrange(n)]
+agglomerates = [[] for _ in xrange(n)]
+for s,a in zip(sp,attrs):
+ aa = int(a[0])
+ s.agglomerate = aa
+ s.shape.color = colors[aa]
+ agglomerates[aa].append(s)
+for a in agglomerates:
+ O.bodies.appendClumped(a)
+
+O.engines = [
+ ForceResetter(),
+ InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
+ InteractionLoop(
+ [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
+ [Ip2_FrictMat_FrictMat_FrictPhys()],
+ [Law2_ScGeom_FrictPhys_CundallStrack()]
+ ),
+ TriaxialStressController(
+ thickness = 0,
+ stressMask = 7,
+ internalCompaction = False,
+ label = 'compressor',
+ ),
+ NewtonIntegrator(damping=.6),
+]
+O.dt = PWaveTimeStep()
+
+# compress the sample
+compressor.goal1 = compressor.goal2 = compressor.goal3 = -1e-7
+O.run(50000,True)
+compressor.goal1 = compressor.goal2 = compressor.goal3 = -1e-5
+O.run(30000,True)
+
+# save the result, including information of agglomerates which the particle belongs to
+export.textExt('/tmp/compressed.txt','x_y_z_r_attrs',attrs=['b.agglomerate'])
+
+try:
+ from yade import qt
+ qt.View()
+except:
+ pass
=== added file 'examples/agglomerate/divide.py'
--- examples/agglomerate/divide.py 1970-01-01 00:00:00 +0000
+++ examples/agglomerate/divide.py 2016-05-24 22:46:38 +0000
@@ -0,0 +1,36 @@
+######################################################################
+# A script for subdivision of macro perticles into a dense packing of
+# smaller particles
+#
+# Each aggragate is a dense packing, but macroscopically the packing
+# is loose
+######################################################################
+from yade import export,ymport
+import random
+random.seed(1) # to make colors always the same
+
+# load macroparticles
+sp = ymport.text('/tmp/cloud.txt')
+colors = [randomColor() for s in sp]
+# each macroparticle is filled randomDensePack
+for si,s in enumerate(sp):
+ sphere = pack.inSphere(s.state.pos, s.shape.radius)
+ sp1 = pack.randomDensePack(
+ sphere,
+ spheresInCell = 500,
+ radius = .2,
+ memoizeDb = '/tmp/agglomeratepackaux.db',
+ returnSpherePack = True,
+ )
+ ids = sp1.toSimulation(color=colors[si]) # add the result to simulation with uniform color
+ for i in ids:
+ O.bodies[i].agglomerate = si # tell each particle who is its agglomerate
+
+# save the result, including information of agglomerates which the particle belongs to
+export.textExt('/tmp/divided.txt','x_y_z_r_attrs',attrs=['b.agglomerate'])
+
+try:
+ from yade import qt
+ qt.View()
+except:
+ pass
=== added file 'examples/agglomerate/makeCloud.py'
--- examples/agglomerate/makeCloud.py 1970-01-01 00:00:00 +0000
+++ examples/agglomerate/makeCloud.py 2016-05-24 22:46:38 +0000
@@ -0,0 +1,22 @@
+######################################################################
+# A script for prepare loose packing of macro particles
+######################################################################
+from yade import export
+
+dim = (15,15,15) # dimensions for makeCloud
+radius = 1
+fuzz = 0.2
+
+# use of makeCloud function
+sp = pack.SpherePack()
+sp.makeCloud((0,0,0), dim, rMean=radius, rRelFuzz=fuzz, seed=1)
+sp.toSimulation()
+
+# save the result
+export.text('/tmp/cloud.txt')
+
+try:
+ from yade import qt
+ qt.View()
+except:
+ pass
=== added file 'examples/agglomerate/simulation.py'
--- examples/agglomerate/simulation.py 1970-01-01 00:00:00 +0000
+++ examples/agglomerate/simulation.py 2016-05-24 22:46:38 +0000
@@ -0,0 +1,53 @@
+######################################################################
+# Gravity deposition as a simple simulation illustrating creation of
+# cohesive contacts and deleting the unwanted between different
+# agglomerates
+#
+# Using CpmMat, but the same procedure can be used with any material
+######################################################################
+from yade import ymport
+
+wall = O.bodies.append(wall((0,0,3),2))
+
+O.materials.append(CpmMat(neverDamage=True,frictionAngle=0))
+
+# load spheres from file, including information of their agglomerates ids
+attrs = []
+sp = ymport.textExt('/tmp/compressed.txt',format='x_y_z_r_attrs',attrs=attrs)
+n = max(int(a[0]) for a in attrs)+1
+colors = [randomColor() for _ in xrange(n)]
+for s,a in zip(sp,attrs):
+ aa = int(a[0])
+ s.agglomerate = aa
+ s.shape.color = colors[aa]
+O.bodies.append(sp)
+
+factor=1.5
+O.engines=[
+ ForceResetter(),
+ InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=factor,label='bo1aabbs'),Bo1_Wall_Aabb()]),
+ InteractionLoop(
+ [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=factor,label='ig2sss'),Ig2_Wall_Sphere_ScGeom()],
+ [Ip2_FrictMat_FrictMat_FrictPhys(),Ip2_CpmMat_CpmMat_CpmPhys(cohesiveThresholdIter=1)],
+ [Law2_ScGeom_FrictPhys_CundallStrack(),Law2_ScGeom_CpmPhys_Cpm()]
+ ),
+ NewtonIntegrator(gravity=(0,0,-30)),
+]
+O.dt = PWaveTimeStep()
+
+# create cohesive interactions, possible also between different agglomerates
+O.step()
+ig2sss.interactionDetectionFactor = bo1aabbs.aabbEnlargeFactor = 1
+
+# delete the inter-agglomerate interactions
+for i in O.interactions:
+ b1,b2 = [O.bodies[ii] for ii in (i.id1,i.id2)]
+ if b1.agglomerate != b2.agglomerate:
+ O.interactions.erase(i.id1,i.id2)
+O.step()
+
+try:
+ from yade import qt
+ qt.View()
+except:
+ pass