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

Asked by Christopher Stanbridge on 2014-10-29

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:
2014-11-05
Last query:
2014-11-05
Last reply:
2014-11-03
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

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?

Please post a simple but complete script showing the problem.

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

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).

Thanks Chareyre, that solved my question.