yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #09167
[Question #245675]: Enforcing rolling/normal/tangential/rotational spring parameters for a 2D biaxial system
New question #245675 on Yade:
https://answers.launchpad.net/yade/+question/245675
Hello,
I hope you are well.
I am trying to create some simple biaxial simulations (effectively 2D) of spherical particles in Yade. I have had success with simple material properties such as FrictMat(), but would like to extend them to incorporate moment transfer, enforcing some rolling friction to emulate real particles.
>From my understanding of the documentation, I need to involve the use of CohFrictMat() materials, disabling cohesion via isCohesive=False, and enabling momentRotationLaw=True.
My question is: is CohFrictMat() the appropriate material type to incorporate things such as rolling friction --- while disabling cohesion?
If so, how I would go about specifying properties within CohFrictMat() such as:
- Rolling friction,
- Normal spring stiffness k_n
- Tangential spring stiffness k_t
- Rotational spring stiffness k_r
Below I have a simple script setting up a quasi-2D system with CohFrictMat() and loading to isotropic conditions.
Regards,
Sebastian
#______________________________________________________________________________
# Simulation parameters
seed = 1
number_of_particles = 1000
# Materials
material_particle = CohFrictMat(density = 2600,
isCohesive = False,
momentRotationLaw = True,
poisson = 0.25,
young = 1e9,
frictionAngle = 0.7,
)
material_wall_topbottom = material_particle
material_wall_leftright = CohFrictMat(density = 1000,
isCohesive = False,
momentRotationLaw = True,
poisson = 0.25,
young = 1e9,
frictionAngle = 0.0,
)
wall_min, wall_max = Vector3(0,0,-1), Vector3(1,1,1)
cloud_min, cloud_max = Vector3(0,0,0), Vector3(1,1,0)
#______________________________________________________________________________
# Simulation objects
# Walls
wall_obj = utils.aabbWalls(extrema = [wall_min, wall_max])
wall_obj[0].material = material_wall_leftright # min X
wall_obj[1].material = material_wall_leftright # max X
wall_obj[2].material = material_wall_topbottom # min Y
wall_obj[3].material = material_wall_topbottom # max Y
wall_obj[4].material = material_wall_topbottom # min Z
wall_obj[5].material = material_wall_topbottom # max Z
wall_ids = O.bodies.append(wall_obj)
# Particles
sp = pack.SpherePack()
sp.makeCloud(minCorner = cloud_min, maxCorner = cloud_max,
rMean = 0.005, rRelFuzz = 0.5, num = number_of_particles, seed=seed)
sp.toSimulation()
# Set particle material
for body in O.bodies:
if isinstance(body.shape, Sphere):
body.material = material_particle
# Enforce 2D
for body in O.bodies:
if isinstance(body.shape, Sphere):
body.state.blockedDOFs = 'zXY'
# Loading programme
triax_loading = TriaxialStressController(
goal1 = confining_pressure,
goal2 = confining_pressure,
goal3 = 0, # nothing on Z walls since we're 2D
#maxMultiplier = 1.0001,
wall_front_activated = False,
wall_back_activated = False,
)
#______________________________________________________________________________
# Calculation loop
O.engines = [
ForceResetter(),
InsertionSortCollider([
Bo1_Sphere_Aabb(),
Bo1_Wall_Aabb(),
Bo1_Box_Aabb(),
]),
InteractionLoop([
Ig2_Sphere_Sphere_ScGeom6D(),
Ig2_Box_Sphere_ScGeom6D()
], [
Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(
),
], [
Law2_ScGeom6D_CohFrictPhys_CohesionMoment(
always_use_moment_law = True,
),
]
),
triax_loading,
NewtonIntegrator(),
PyRunner(command = 'checkEquilibrium()', iterPeriod = 1000),
]
O.dt = 0.5 * utils.PWaveTimeStep()
O.usesTimeStepper = True
O.saveTmp()
def checkEquilibrium():
if unbalancedForce() < 1e-3:
print "Equilibrium reached"
O.pause()
print "Calming simulation"
utils.calm()
print "Saving isotropic state"
O.save('test.xml.bz2')
--
You received this question notification because you are a member of
yade-users, which is an answer contact for Yade.