← Back to team overview

yade-users team mailing list archive

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

 

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

    Status: Open => Answered

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"

Upgraded script:
###
# -*- encoding=utf-8 -*-
# This script demonstrates polyhedra splitting/crushing under compression.
from yade import polyhedra_utils

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:
    from yade import qt
    qt.Controller()
    v = qt.View()
    v.ortho = True
except:
    pass

O.run(30000)
###

Cheers
Jan

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