Incorporating Multiple Interaction Physics on Bodies

Asked by Austin Sutton

Hello,

My research is heavily focused on the modeling of the powder spreading process in the selective laser melting process. Here, a thin layer of powder is spread across a build area with a recoater arm where a laser then subsequently melts powder particles in a layer-by-layer fashion to create 3-D components. Rather than create my own DEM program, I have turned to YADE for help in simulating the powder spreading process.

So far, I have made a script to simulate the spreading process incorporating Hertz-Mindlin contact (IP2_FrictMat_FrictMat_MindlinPhys accompanied with Law2_ScGeom_MindlinPhys_Mindlin) between the particles as well as boundaries of the recoater arm and substrate, both represented by facets. I now would like to change the interaction type between the facets and spheres to be represented by Law2_ScGeom_FrictPhys_CundallStrack while still maintaining the Hertz-Mindlin contact between the spheres. In other words, I want to be able to incorporate multiple interaction types for the particles being simulated. However, I cannot figure out how to make this change in YADE. Is there a trivial solution to this problem? If so, I'd appreciate any help that anybody can offer.

Thank you,
Austin

Question information

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

Hi,
The short answer is "no", there is no trivial solution.
Yade handles this problem gracefully only if the material properties are of different types (e.g. FrictMat vs. CohFrictMat), which is not your case.
I don't see any solution without touching the source code. If no one else come up with a better solution, you could do this:
1. Derive (in the sense of class inheritance) a Material class called e.g. "HertzMat" and inheriting from FrictMat.
2. Duplicate the content of IP2_FrictMat_FrictMat_MindlinPhys.cpp/hpp into files IP2_HertzMat_HertzMat_MindlinPhys.cpp/hpp and replace FrictMat by HertzMat wherever it appears
___ end of changes in source code ___
3. In your script, assign FrictMat for facets and HetzMat for spheres + use the functors IP2_FrictMat_FrictMat_FrictPhys and IP2_HertzMat_HertzMat_MindlinPhys concurently. It will generate FrictPhys interactions for all pairs (sphere-facet) which are not HertzMat vs. HertzMat, and MindlinPhys interactions for the rest (sphere-sphere).
4. Introduce both Law2_ScGeom_FrictPhys_CundallStrack and Law2_ScGeom_MindlinPhys_Mindlin in the same script, the first will pick-up the facet-sphere contacts.

Let us know if you need more detailed explanation.
Regards
Bruno

p.s. On a more physical aspect, I am wondering why sphere-facet contacts should not follow Hertz-Mindlin. Theoretically it makes no difference if one object in contact is a flat surface.

Revision history for this message
Austin Sutton (atsfk6) said :
#2

Bruno,

Thank you for the detailed response. I figured that such a solution would not be as simple as changing some settings in the interaction loop, but I wanted to make sure before I tried modifying the source code.

If I implemented the solution you proposed, would the interaction loop look as follows?

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb()]),
 InteractionLoop(
  [Ig2_Facet_Sphere_ScGeom(),Ig2_Sphere_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_FrictPhys,IP2_HertzMat_HertzMat_MindlinPhys()],
  [Law2_ScGeom_FrictPhys_CundallStrack,Law2_ScGeom_MindlinPhys_Mindlin()])
        NewtonIntegrator(gravity=(0,-9.81,0),damping=0)]

--> "p.s. On a more physical aspect, I am wondering why sphere-facet contacts should not follow Hertz-Mindlin. Theoretically it makes no difference if one object in contact is a flat surface."

You're correct. The reason why I am doing this is because I want to add adhesion through the DMT formulation (i.e. specifying the surface energy, gamma) for particle-particle interactions. With my current script, specifying the surface energy will apply adhesion not only to the interacting particles, but also between particles and the facets, which is undesirable at the moment. So, is there a way to add only adhesion between the particles using Hertz-Mindlin contact?

Thanks!

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

>would the interaction loop look as follows?

Exactly.

>So, is there a way to add only adhesion between the particles using Hertz-Mindlin contact?

Yes. Move "gamma" parameter from Ip2_FrictMat_FrictMat_MindlinPhys to HertzMat, set gamma=0 for facets and make sure
Ip2_HertzMat_HertzMat_MindlinPhys will define "per interaction" gamma as min(mat1->gamma, mat2->gamma) or something like that (just like it is done for friction or adhesion in many functors). In which case the engines loop would need just one Ip2 and just one Law2; IP2_HertzMat_HertzMat_MindlinPhys() and Law2_ScGeom_MindlinPhys_Mindlin().

Looking at HertzMindlin.hpp I realize that the implementation over-uses the trick of putting the material parameters in the Ip2 functor instead of material class (viscosity, adhesion, stiffness...). This is simpler on short term but not good practice in general, you just found why...
A "HertzMat" should have been introduced in the first place to keep those parameters. If you are doing a step in this direction we can consider including your changes later (for the first method I mentioned in #1 commiting was not an option since it involves mainly code duplication).

Bruno

Revision history for this message
Austin Sutton (atsfk6) said :
#4

Bruno,

--> "Yes. Move "gamma" parameter from Ip2_FrictMat_FrictMat_MindlinPhys to HertzMat, set gamma=0 for facets and make sure
Ip2_HertzMat_HertzMat_MindlinPhys will define "per interaction" gamma as min(mat1->gamma, mat2->gamma) or something like that (just like it is done for friction or adhesion in many functors). In which case the engines loop would need just one Ip2 and just one Law2; IP2_HertzMat_HertzMat_MindlinPhys() and Law2_ScGeom_MindlinPhys_Mindlin()."

I understand now. I'm not the most familiar with C++, but if I need to take this route then I'll put in the time to modify the source code for my needs.

This conversation has helped me a lot. Thank you for your help.

Revision history for this message
Austin Sutton (atsfk6) said :
#5

Thanks Bruno Chareyre, that solved my question.