How to achieve the cohesion bond constraint between particles of CohFrictMat in code

Asked by xuanshenyu

    As we know, particles of CohFrictMat material can form cohesion bonds when they come into contact. Recently I have been learning the code related to CohFrictMat material(CohesiveFrictionalContactLaw.cpp and CohesiveFrictionalContactLaw.hpp).
   But I have one puzzle, it's intuitive that the cohesion bonding between particles of CohFrictMat material would constrain the relative transport between particles or something, but how does that work in the code?

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
xuanshenyu
Solved:
Last query:
Last reply:
Revision history for this message
Jan Stránský (honzik) said :
#1

Hello,

> the cohesion bonding between particles of CohFrictMat material would constrain the relative transport between particles or something

Please be more specific:
- what is "the relative transport"? mutual motion? transport of heat? ... ?
- what does "something" mean here?

Cheers
Jan

Revision history for this message
xuanshenyu (shenyuxuan) said :
#2

ok, we also can write a case of merely two particles and add a constant force F(-100,0,0) at the particle of ID=0.
 the particle of ID=0 and the particle of ID=1 will move together at a constant velocity to the left. In theory, A and B are bonded as a whole, so they will move to the left as a whole, but how is the internal force between the other two particles calculated and added in the code? If I'm not clear enough, please let me know.
############
#locale.setlocale(locale.LC.ALL,'en_US.UTF-8')
rho=920
gravity=0
#mat
mat1 = O.materials.append(CohFrictMat(isCohesive=True, frictionAngle=radians(15.6), density=rho, poisson=0.33, young=5.358e8, alphaKr=0.242, alphaKtw=0.1, normalCohesion=2e5, shearCohesion=2e5))
Mat1=O.materials[mat1]

#sphere
coordinates=numpy.genfromtxt("zuobiao.csv",delimiter=",") //(0.01,0.01,0) (0.03,0.01,0)
particle=[sphere((x,y,z),radius=0.01,material=Mat1,color=(1,1,0)) for x,y,z in coordinates]
Particle=O.bodies.append(particle)

#add engines
O.engines=[
      ForceResetter(),
      InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=1.1), Bo1_Facet_Aabb()]),
      InteractionLoop(
              [Ig2_Sphere_Sphere_ScGeom6D(interactionDetectionFactor=1.1)],
              [Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True),Ip2_FrictMat_FrictMat_FrictPhys()],
              [Law2_ScGeom6D_CohFrictPhys_CohesionMoment()]
      ),
      NewtonIntegrator(gravity=(0, 0, -gravity), damping=0.2),
      PyRunner(command='addForce()',iterPeriod=1),
      VTKRecorder(iterPeriod=100,recorders=['all'],fileName='out-')
]

def addForce():
    O.forces.addF(0,Vector3(0,0,-100))
#timestep
O.dt = .1* PWaveTimeStep()
O.step()
O.run(5000,True)
O.saveTmp()
#############

Revision history for this message
Jan Stránský (honzik) said :
#3

> coordinates=numpy.genfromtxt("zuobiao.csv",delimiter=",") //(0.01,0.01,0) (0.03,0.01,0)

If providing code, please provide MWE [1]
W = working, such that we can directly run it.
I **assume** it could be rewritten as
coordinates=(0.01,0.01,0),(0.03,0.01,0)
but is is much more preferable that you provide the code to be used.

> the particle of ID=0 and the particle of ID=1 will move together at a constant velocity to the left.

No, not at all.

If you prescribe force, constant acceleration (not velocity) would be meaningful. Velocity should be increasing.

If you clump the particles together (to form a rigid body), then they will move with same velocity (together?).
If they are not clumped, they do NOT move with same velocity (just print velocities in your script, they are not the same), there is no reason for it.

> In theory, A and B are bonded as a whole, so they will move to the left as a whole,

depending on the definition "bonded as a whole", "move as a whole" and other conditions.
- if the bond stiffness is "low", inertia of particles "high" the force "high", the will not "move as a whole"
- the cohesive bond may break
- ...

> but how is the internal force between the other two particles calculated and added in the code?

The internal forces is computed similarly to any other (cohesive or non-cohesive) contact law.
a) Based on mutual motion, the value of internal force is evaluated
b) The force is applied to the interacting bodies (same value, opposite direction)

For Law2_ScGeom6D_CohFrictPhys_CohesionMoment (as in the provided code), it would be:
a) function go [2], search normalForce and shearForce
b) [3]

Cheers
Jan

[1] https://www.yade-dem.org/wiki/Howtoask
[2] https://gitlab.com/yade-dev/trunk/-/blob/master/pkg/dem/CohesiveFrictionalContactLaw.cpp#L109
[3] https://gitlab.com/yade-dev/trunk/-/blob/master/pkg/dem/CohesiveFrictionalContactLaw.cpp#L168

Revision history for this message
xuanshenyu (shenyuxuan) said :
#4

Thank you for your patience. The two particles do not have the same velocity, and the velocity change of the particle without added force was "delayed" compared to the particle with added force. And ,This Solved My Problem.