yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #25309
Re: [Question #695558]: Dynamics of pfacet object does not appear to be correct
Question #695558 on Yade changed:
https://answers.launchpad.net/yade/+question/695558
Status: Expired => Open
Rohit John is still having a problem:
Dear Klaus Thoeni,
I used the fix mentioned in [1] to fix the problem I was facing. And it
does fix the dynamics my simulation (see code in the first description
of this problem). However, I ran into a problem when I clumped the
pfacet together (I added the nodes, gridconnection and pfacets into one
clump). The clump is having an unexpected rotation. I have put the code
below.
I did not download a new version of yade. But I pasted the fix given in
[1] into the YADE source code I am using and recompiled it. Is this a
correct way to use this fix? I am using Ubuntu 18.04.5 LTS.
Kind regards,
Rohit K. John
[1] https://gitlab.com/yade-
dev/trunk/-/merge_requests/628/diffs?commit_id=fc8e01415108ffd30503bbc37234d51d8d0b0499
# ---------------------------------------------------------------------------------------------------------------- code
from yade import plot, utils
from yade.gridpfacet import *
# ---------------------------------------------------------------------- defining material
bristle_radius = 1e-3
bristle_length = 0.1
bristle_seg_no = 5
bristle_young = 3e9
bristle_poisson = 0.3
bristle_density = 1000
bristle_friction = radians(30)
grid_radius = 1e-3
target_young = 30e9
target_poisson = 0.3
target_density = 10000
target_friction = radians(30)
# ---------------------------------------------------------------------- material
O.materials.append(
FrictMat(
young = bristle_young,
poisson = bristle_poisson,
density = bristle_density,
label = 'cyl_ext_mat',
frictionAngle = bristle_friction,
)
)
O.materials.append(
CohFrictMat(
young = bristle_young,
poisson = bristle_poisson,
density = bristle_density,
label = 'cyl_int_mat',
frictionAngle = bristle_friction,
momentRotationLaw = True,
normalCohesion = 1e40,
shearCohesion = 1e40,
)
)
O.materials.append(
FrictMat(
young = target_young,
poisson = target_poisson,
density = target_density,
label = 'pfacet_ext_mat',
frictionAngle = target_friction,
)
)
O.materials.append(
CohFrictMat(
young = 100*target_young,
poisson = target_poisson,
density = target_density,
label = 'pfacet_int_mat',
frictionAngle = target_friction,
momentRotationLaw = True,
normalCohesion = 1e40,
shearCohesion = 1e40,
)
)
# ---------------------------------------------------------------------- Engines
O.engines = [
ForceResetter(),
InsertionSortCollider([
Bo1_GridConnection_Aabb(),
Bo1_PFacet_Aabb(),
]),
InteractionLoop(
[
Ig2_GridConnection_GridConnection_GridCoGridCoGeom(),
Ig2_GridNode_GridNode_GridNodeGeom6D(),
Ig2_PFacet_PFacet_ScGeom(),
Ig2_GridConnection_PFacet_ScGeom(),
Ig2_Sphere_PFacet_ScGridCoGeom(),
],
[
Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow = True, setCohesionOnNewContacts = False),
Ip2_FrictMat_FrictMat_FrictPhys()
],
[
Law2_GridCoGridCoGeom_FrictPhys_CundallStrack(),
Law2_ScGeom_FrictPhys_CundallStrack(),
Law2_ScGeom6D_CohFrictPhys_CohesionMoment(),
Law2_ScGridCoGeom_FrictPhys_CundallStrack(),
]
),
NewtonIntegrator(gravity = (0,0,-10),damping = 0.0)
]
# ---------------------------------------------------------------------- bodies
# ------------------------------------- custome brush
nodesIds=[]
cylIds=[]
# bristle root location
base_pos = [
[0.003, 0.003, 0],
[0.003, -0.003, 0],
[-0.003, 0.003, 0],
[-0.003, -0.003, 0],
]
dz = bristle_length / bristle_seg_no # grid connection length
for i in base_pos:
bristle = []
for j in range(bristle_seg_no + 1):
bristle.append([
i[0],
i[1],
bristle_length - (i[2] + dz * j)
])
cylinderConnection(
bristle,
bristle_radius,
nodesIds,
cylIds,
color=[1,0,0],
intMaterial='cyl_int_mat',
extMaterial='cyl_ext_mat'
)
O.bodies[nodesIds[-1]].state.blockedDOFs='xyzXYZ'
# ------------------------------------- manaul target
origin = [
0,
0,
bristle_length + bristle_radius + grid_radius
]
x_len = 0.03
y_len = 0.05
z_len = 0.05
nodes = [
[x_len, 0, 0 + origin[2]],
[-x_len, 0, 0 + origin[2]],
[0.0, y_len, z_len + origin[2]],
[0.0,-y_len, z_len + origin[2]],
]
pfacet_nodes = [
[nodes[0], nodes[1], nodes[2]],
[nodes[0], nodes[3], nodes[1]],
]
pnode = []
pcyl = []
pfacet = []
for i in pfacet_nodes:
print(i)
pfacetCreator1(
i,
grid_radius,
nodesIds = pnode,
cylIds = pcyl,
pfIds = pfacet,
wire = False,
fixed = False,
color = [0.5,0.5,0.5],
materialNodes = 'pfacet_int_mat',
material = 'pfacet_ext_mat',
)
target_ids = pnode + pcyl + pfacet
target_clump_id = O.bodies.clump(target_ids)
# ---------------------------------------------------------------------- graphing and additional engines
graph_iter = 1000
plot.plots = {
't':(
'wx_avg', 'wy_avg', 'wz_avg',
)}
# ----------------- initialising the variables
# These variables will be added each iteration and its average will be taken (dividing my the number of iteration) when the graph is plotted
wx_avg = 0
wy_avg = 0
wz_avg = 0
# bodyList = target_body.node_id_list
bodyList = target_ids
def get_avg_state():
global wx_avg, wy_avg, wz_avg
wx_temp = 0
wy_temp = 0
wz_temp = 0
for i in bodyList:
wx_temp += O.bodies[i].state.angVel[0]
wy_temp += O.bodies[i].state.angVel[1]
wz_temp += O.bodies[i].state.angVel[2]
# averaging for all bodies
no_of_bodies = len(bodyList)
wx_temp /= no_of_bodies
wy_temp /= no_of_bodies
wz_temp /= no_of_bodies
# addind to the cumulative states. This will later be divided by
graph_iter to get the average
wx_avg += wx_temp
wy_avg += wy_temp
wz_avg += wz_temp
def graph():
global wx_avg, wy_avg, wz_avg
wx_avg /= graph_iter
wy_avg /= graph_iter
wz_avg /= graph_iter
plot.addData(t = O.time,
wx_avg = wx_avg, wy_avg = wy_avg, wz_avg = wz_avg,
)
plot.plot()
# ---------------------------------------------------------------------- plotting and simulation stop engines
end_time = 4e-1
O.engines += [
PyRunner(command = 'graph()', iterPeriod = graph_iter),
PyRunner(command = 'get_avg_state()', iterPeriod = 1),
]
O.dt = 5e-7
O.saveTmp()
--
You received this question notification because your team yade-users is
an answer contact for Yade.