# yade-users team mailing list archive

## Re: [Question #698285]: How to make each polyhedron break only once?

Jan Stránský proposed the following answer:
Hello,

one option: before the splitter, check and change material to a non-
breakable one for the polyhedrons that are not "original"

###
# -*- encoding=utf-8 -*-
# This script demonstrates polyhedra splitting/crushing under compression.

gravel1 = PolyhedraMat()
gravel1.IsSplitable = True
gravel1.strength = 1e0
gravel2 = PolyhedraMat()
gravel2.IsSplitable = True
gravel2.strength = 2e0
gravel3 = PolyhedraMat()
gravel3.IsSplitable = True
gravel3.strength = 4e0

# new non splitable material
nonSplitableMat = PolyhedraMat()
#nonSplitableMat.IsSplitable = False # False is default?

steel = PolyhedraMat()
steel.young = 1e10

d = .05
p1 = polyhedra_utils.polyhedra(gravel1, size=(d,d,d), seed=1)
p2 = polyhedra_utils.polyhedra(gravel2, size=(d,d,d), seed=1)
p3 = polyhedra_utils.polyhedra(gravel3, size=(d,d,d), seed=1)
p2.state.pos = (2*d,0,0)
p3.state.pos = (4*d,0,0)
p2.state.ori = p3.state.ori = p1.state.ori

d = .035
w1 = utils.wall(+d, axis=1, sense=-1, material=steel)
w2 = utils.wall(-d, axis=1, sense=+1, material=steel)
v = 5e-1
w1.state.vel = (0,-v,0)
w2.state.vel = (0,+v,0)
O.bodies.append((p1,p2,p3,w1,w2))

# IDs of original bodies
originalIds = set(b.id for b in O.bodies)
def changeMaterial():
for b in O.bodies:
if not isinstance(b.shape,Polyhedra): # only polyhedrons
continue
if b.id not in originalIds: # only non-original polyhedrons
b.mat = nonSplitableMat # set the non splitable material

O.engines=[
ForceResetter(),
InsertionSortCollider([Bo1_Polyhedra_Aabb(),Bo1_Wall_Aabb()]),
InteractionLoop(
[Ig2_Wall_Polyhedra_PolyhedraGeom(), Ig2_Polyhedra_Polyhedra_PolyhedraGeom()],
[Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys()],
[Law2_PolyhedraGeom_PolyhedraPhys_Volumetric()]
),
NewtonIntegrator(),
# check / change material before splitting
PyRunner(iterPeriod=100,command="changeMaterial()"),
PolyhedraSplitter(iterPeriod=100),
]

O.dt=1e-6

try:
qt.Controller()
v = qt.View()
v.ortho = True
except:
pass

O.run(30000)
###

Cheers
Jan

--