Non-touching interactions not being recognized as real, despite interactionDetectionFactor > 1

Asked by Christopher Stanbridge

Hi all,

I am currently running experiments on a cloud of particles made of a CohFrictMat. It is important, for my simulations, that I allow distant contacts; I have both interactionDetectionFactor and aabbEnlargeFactor set to 1.5. However, even with these stipulations in place, geometry and physics are not being created for any interactions where particles are not directly touching (i.e., the creation of REAL interactions behaves as though the interactionDetectionFactor were 1). What could be the source of this discrepancy?

Sincerely,
Christopher Stanbridge

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Chareyre
Solved:
Last query:
Last reply:
Revision history for this message
Best Chareyre (bruno-chareyre-9) said :
#1

Hi,
InteractionDetectionFactor and friends help creating "potential" distant
interactions.
To generate cohesive contacts for those interactions you can turn
setCohesionNow=True in the Ip2 functor. Else the potential interactions
are initially cohesionless, then erased in the same iteration if the
particles are not in contact.
Note that such cohesive interactions will not be force-free after
creation. Most likely they will have very large tensile forces. You can
change this by updating i.phys.unp after creation ( i.phys.unp =
i.phys.penetrationDepth).

Regards
Bruno

Revision history for this message
Christopher Stanbridge (cws105) said :
#2

Hi Bruno,

I have turned setCohesionNow=True (in fact, I had it that way before I asked the question). The distant interactions are still non-real. Here is a list of my engines.

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=1.5), Bo1_Facet_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom6D(interactionDetectionFactor=1.5), Ig2_Facet_Sphere_ScGeom6D()],
  [Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True, setCohesionOnNewContacts=True)],
  [Law2_ScGeom6D_CohFrictPhys_CohesionMoment(),Law2_ScGeom_FrictPhys_CundallStrack()]
 ),

 NewtonIntegrator(damping=damping, gravity=[0, 0, gravity], label='integrator')
]

Which engine could be causing the trouble?

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#3

Please post a simple but complete script showing the problem.

Revision history for this message
Christopher Stanbridge (cws105) said :
#4

damping = 0.4 #ratio
gravity = -9.80665 #m/s

mat42 = O.materials.append(CohFrictMat(isCohesive=True, frictionAngle=radians(42), density=4200, poisson=0.42, young=4.2e9, alphaKr=0.242, alphaKtw=0.1642, normalCohesion=4.2e5, shearCohesion=8.4e5))
Mat42=O.materials[mat42]

O.bodies.append(utils.facet([(-42,-42,0),(42,-42,0),(0,63,0)],wire=False,color=(0.42,0.42,0.42)))
cld = pack.SpherePack()
cld.makeCloud((-1,-1,1),(1,1,5),rMean=0.25,rRelFuzz=0.3)
cld.toSimulation(material=Mat42)

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=1.5), Bo1_Facet_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom6D(interactionDetectionFactor=1.5), Ig2_Facet_Sphere_ScGeom6D()],
  [Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True)],
  [Law2_ScGeom6D_CohFrictPhys_CohesionMoment(),Law2_ScGeom_FrictPhys_CundallStrack()]
 ),

 NewtonIntegrator(damping=damping, gravity=[0, 0, gravity], label='integrator')
]

O.run(1)

len(O.interactions)
#returns the number of "interactions", including distant contacts; usually between 150 and 250

allIntrs = []
for b in O.bodies:
    for i in b.intrs():
        allIntrs.append(i)
print len(allIntrs)
#always seems to return 0

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#5

Hi,
There are two problems in your script.
The first problem is completely unrelated to non-touching particles. It is a wrong usage of O.run(). That is why we need to see complete script. Always.

This means "start a timestep and start counting interactions" in parallel:
   O.run(1)
   count interactions

Obvisously if running one timestep is not a lot faster (and it is not) than counting interactions the result is junk.

You need to first run an iteration, then count:
   O.run(1,True)
   count interactions

The other problem is the tensile strength you define is less than the tensile force generated by the distant interactions. Make normalCohesion=1e20 and you will find 258 interactions with the above script. You can change the tensile strength of existing interactions/materials later (i.e. after iteration 1).

Revision history for this message
Christopher Stanbridge (cws105) said :
#6

Thanks Chareyre, that solved my question.