Tracking interaction forces on a surface

Asked by Giovanni Lorenzon

Hi everybody,

thanks again for the amazing support that you provide on this platform.

I would like to ask for some suggestions about a project I'm working on. I'm trying to replicate a real-life compaction process in a cylindrical cavity, and I would like to stop the compaction when some specific normal strain value is reached. I am trying to build an actual cylinder to which impose a certain velocity to, and to stop its path towards the sample when a fixed strain is registered upon the contact surface.
The problem is that I am having difficulties in finding an appropriate way to measure the interaction between the particles and the pressing object's surface, in order to define the stopping condition for the compaction process.
Until now I was using the uniax.py example from GitHub, but its execution is way too demanding for the number of particles I'm wishing to simulate.
Any suggestion about which strategy would best fit my purpose?

Thank you very much for your help!

With best regards,

Giovanni Lorenzon

Question information

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

Hi Giovanni,
If what you need is the total force on a particular object then it should be enough to check O.forces.f(bodyId).
Would it answer your question?
Bruno

Revision history for this message
Giovanni Lorenzon (gioloren) said :
#2

Hi Bruno,

Thank you very much for your answer.

I tried with that command, but I couldn't make it work. I thought that maybe the problem was related to the fact that the pressing body is a facet, but I am not sure about that.
The related code that I used was:

#########
press = geom.facetCylinder((0,0,.03), .01, .001, segmentsNumber=30, wallMask=7)
idPress = O.bodies.append(press)

O.engines=[
    [...code related to other purposes...],
    PyRunner(command='addPlotData()', iterPeriod=100),
    ]

def addPlotData():
    plot.addData(
        [...code related to other purposes...],
        force=O.forces.f(idPress)
    )
#########

And each time the command 'addPlotData' was called, YADE gave me the following error message:

"ArgumentError: Python argument types in
    ForceContainer.f(ForceContainer, list)
did not match C++ signature:
    f(pyForceContainer {lvalue}, long id, bool sync=False)"

Anyway, even solving this error, I'm concerned with the very output of the command: wouldn't it give me the amount of all the forces acting on the body, would it? Thus both shear and normal stresses I guess, right? That wouldn't actually be what I was looking for, since I need to define the stopping condition according to the normal stress only.

I also found the command 'forcesOnPlane'/'forcesOnCoordPlane', but also this one computes both shear and normal stresses.
Therefore my worries about which strategy I should adopt.

Thanks again,

Giovanni Lorenzon

Revision history for this message
Best Robert Caulk (rcaulk) said :
#3

Hello Giovanni,

facetCylinder creates a cylindrical geometry in yade composed of facets and returns a list of body ids [1]. The body forces method takes a single body id and returns the traction force on that body [2]. In other words, you will need to index into the facetCylinder list and pull a single bodyId out for use with the body forces method, which will return the traction on the body. If you want to extract a component of the traction you can simply dot it by the unit vector of interest.

Best,

Robert

[1] https://yade-dem.org/doc/yade.geom.html#yade.geom.facetCylinder
[2]https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.ForceContainer.f

Revision history for this message
Giovanni Lorenzon (gioloren) said :
#4

Thanks Robert Caulk, that solved my question.

Revision history for this message
Giovanni Lorenzon (gioloren) said :
#5

Hi Robert,

thank you very much for your suggestion, it totally helped me!

With best regards,

Giovanni