Cohesion Distribution

Asked by Seti

Hi All,

Would you please let me know, how can can model a cemented - 100% bonded - sample with three different material which have different level of cohesion.

 In other words if all of the grains connected to each other - very dense sample - how the force/strength/cohesion (?) between neighbourhood grains with different material properties will be calculated on YADE.

2- If contacts between some spheres during the compression test re-appeared. how can I write the script to prevent taking into account the cohesion between these particular spheres.

3- How can I introduce limitation for implying force, I mean, implying fn on sample, where fmin<fn<fmax and fmin&fmax are known.

Thanks so much
Seti

Question information

Language:
English Edit question
Status:
Expired
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Jérôme Duriez (jduriez) said :
#1

Hello,

The doc of "CohFrict.." related classes should help, here (assuming you're using such contact model, which would probably be a good idea)

1. See [1], together with [2], to understand how the interaction strength ("normalAdhesion" and "shearAdhesion" of "CohFrictPhys") is computed from grains with possibly different strength material properties ("normalCohesion" and "shearCohesion" from CohFrictMat)

2. It is the default behaviour of the "CohFrict.." model to define purely frictional interactions (without cohesion), see setCohesionNow and setCohesionOnNewContacts in [1]
In particular keeping setCohesionOnNewContacts to False will do exactly what you want.

3. I'm not sure I understood your question. All contact models in Yade consider a "fmin" threshold for the normal force fn (I'm considering here compression as positive). This "fmin" threshold in Newton is usually never directly set, though (see previous answers for the "CohFrict.." model)

As for a maximum compressive force threshold "fmax" I'm not aware any contact law in Yade considers such thing. If this is what you want, you will probably have to write your own contact law.

Jerome

[1] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Ip2_CohFrictMat_CohFrictMat_CohFrictPhys
[2] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.CohFrictPhys

Revision history for this message
Seti (seti) said :
#2

Hi Jerome,

Thanks so much for your response. I need to understand how you model the adhesion between two neighbour grains when they have different property ( in particular different cohesion). considering below formula when I have 2 different material Ci how be calculated?

a_i=C_i min(R_1,R_2)^2, i=n,s.

2- Would you please let me how can I access to source of code for calculating the adhesion/adhesion?

I really appreciate your time.

Thanks
Seti

Revision history for this message
Jérôme Duriez (jduriez) said :
#3

All YADE source code can be
* either browsed online at https://github.com/yade/trunk
* or downloaded on your computer following the "source code" section of the installation page of the doc somewhere at https://yade-dem.org/doc/ (which is currently down---hopefully not for long---which prevents me to giving you the exact URL)

Searching e.g. for "normalCohesion" in the code (see the search bar at the top of github.com/yade/trunk webpages) will direct you to pkg/dem/CohesiveFrictionalContactLaw.cpp that includes in particular the code of Ip2_CohFrictMat_CohFrictMat_CohFrictPhys.

Therein, you will find that "normalAdhesion" is computed from the minimum of the particles' "normalCohesion" (the same for "shear.."), see [1] and [2]. Which hopefully answers your first question ! (The doc could be indeed clarified)

Jerome

[1] https://github.com/yade/trunk/blob/48fcf94a46f449dfb1ecda36f69eb8397d08d29d/pkg/dem/CohesiveFrictionalContactLaw.cpp#L251
[2] https://github.com/yade/trunk/blob/48fcf94a46f449dfb1ecda36f69eb8397d08d29d/pkg/dem/CohesiveFrictionalContactLaw.cpp#L285

Revision history for this message
Jérôme Duriez (jduriez) said :
#4

PS: these "iAdhesion" are computed from the minima of "iCohesion" unless you defined some "MatchMaker" in Ip2_CohFrictMat_CohFrictMat_CohFrictPhys.normalCohesion/shearCohesion...

If you do not understand what I'm talking about, just focus on my previous answer...

Revision history for this message
Seti (seti) said :
#5

Dear Jerome,

Thanks for prompt reply.

My exact question is, why C is the smallest value of cohesion between two grains. Just imagine , the first material be loose sand and the the second material be something which we are using for cementation ( bonding the loose sand) - which definitely has the bigger value of cohesion in comparison with the loose sand , in this case assuming the the smallest value of cohesion means we do not consider the effect of binder in our calculation. It is my thought, please correct me if I am wrong.

Regards,
Seti

Revision history for this message
Jérôme Duriez (jduriez) said :
#6

" why C is the smallest value of cohesion between two grains ?"

=> Because the guy who wrote this piece of code had to make a choice, and he made this choice.. Taking the min of two values is by the way a quite "classical" choice in YADE (the same is made to determine the friction angle of an interaction)

As for me I'm quite happy with the idea that a team of two players can not be better than the worst player among the two, but all this is just a matter of choice, as I said..

Thus, I won't deny you the possibility to be unhappy with the current choice. In this case I would recommend you give a look to this "MatchMaker" attribute to address the situations you have in mind.

Revision history for this message
Seti (seti) said :
#7

Thanks Jerome,
I tried to go for your recommendation to use "MatchMaker" however I am not sue how I should use it for various cohesion, what I have seen in documentation, the MatchMaker have been used to assign different frictions , however I have done below attempt which to me is incomplete, would you please advise me how should I use MatchMaker to assign different cohesion:

here is the snip of code:

# Batch execution
nRead=utils.readParamsFromTable(
        num_spheres1=500,# number of spheres len(O.bodies) to verify: 10006 = 10000 particles + 6 walls is correct
        num_spheres2=500,# number of spheres len(O.bodies) to verify: 10006 = 10000 particles + 6 walls is correct
        compFricDegree = 30, # contact friction during the confining phase (1)
        unknownOk=True,
        isoForce=100000, # stress for the isotropic compression phase (1)
        conStress=100000 # confinement stress, for the deviatoric loading session (2)
)
from yade.params import table

num_spheres1=500 # number of spheres called from table
num_spheres2=500
targetPorosity = 0.6 #the porosity we want for the packing (3 specimens: (Ei,n) = (1,0.382), (2,0.387), (3,0.409) )
compFricDegree = table.compFricDegree # initial contact friction during the confining phase (will be decreased during the REFD compaction process)
finalFricDegree = 30 # contact friction during the deviatoric loading
rate=0.01 # loading rate (strain rate)
damp=0.3 # damping coefficient
stabilityThreshold=0.001 # initial value: 0.001
key='_kozooooooooooooooocki,,100kpa,100kpa,30,30,30e9_0.085,0.085,0.085,0.8,D=varried,clumping 3,0.z5 ' # simulation's name here
young=30e9 # contact stiffness k_n/Ds
mn,mx=Vector3(-0.085,-0.085,-0.085),Vector3(0.085,0.085,0.085) # corners of the initial packing
thick = 0.01 # thickness of the plates

## create materials for spheres and plates
O.materials.append(FrictMat(young=young,poisson=0.3,frictionAngle=radians(compFricDegree),momentRotationLaw=True,etaRoll=1,density=2600,isCohesive=True,alphaKr=0.05,label='spheres1'))
O.materials.append(CohFrictMat(young=young,poisson=0.3,frictionAngle=radians(compFricDegree),momentRotationLaw=True,etaRoll=1,density=2600,isCohesive=True,alphaKr=0.05,label='spheres2'))
O.materials.append(FrictMat(young=young,poisson=0.3,frictionAngle=0,density=0,label='walls'))

## create walls around the packing
walls=utils.aabbWalls([mn,mx],thickness=thick,oversizeFactor=1.5,material='walls')
wallIds=O.bodies.append(walls)

## use a SpherePack object to generate a random loose particles packing
sp=pack.SpherePack()
psdSizes=[0.002,0.003,0.004,0.005,0.006,0.007,0.008] # (sizes or radii of the grains vary from 2mm to 9.5mm)
#psdCumm=[1,9,25,50,69,90,95,100] # the correspondent amount (percentage) of each diameter, uncomment for yade-stable
psdCumm=[0.14,0.28,0.34,0.50,0.65,0.85,1.00] # for the code not using percentage, e.g. yade-daily
...

....

....

O.engines=[
        ForceResetter(),
        InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb(),Bo1_Facet_Aabb(),Bo1_Wall_Aabb()]),
        InteractionLoop(
                [Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Box_Sphere_ScGeom(),,Ig2_Wall_Sphere_ScGeom(),Ig2_Facet_Sphere_ScGeom()],
                [Ip2_FrictMat_FrictMat_MindlinPhys(en=MatchMaker(matches=((spheres1,spheres2,.6),(spheres2,spheres2,.55))),es=MatchMaker(matches=((spheres1,spheres2,.6),(spheres2,spheres2,.55))),alphaKr=MatchMaker(matches=((spheres1,spheres2,.1),(spheres2,spheres2,.3))),krot=3),Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(label="cohesiveIp")], [Law2_ScGeom_MindlinPhys_Mindlin(includeMoment=True,includeAdhesion=True)],
                [Law2_ScGeom_FrictPhys_CundallStrack(),Law2_ScGeom6D_CohFrictPhys_CohesionMoment(
   useIncrementalForm=True, #useIncrementalForm is turned on as we want plasticity on the contact moments
   always_use_moment_law=False, #if we want "rolling" friction even if the contact is not cohesive (or cohesion is broken), we will have to turn this true somewhere
   label='cohesiveLaw')]
        ),
        ## We will use the global stiffness of each body to determine an optimal timestep (see https://yade-dem.org/w/images/1/1b/Chareyre&Villard2005_licensed.pdf)
        GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.5),
        triax,
        TriaxialStateRecorder(iterPeriod=50,file='WallStresses'+key),
        newton
]

Thanks for your time
Seti

Revision history for this message
Jérôme Duriez (jduriez) said :
#8

In fact, I've never used MatchMaker myself..

In principle using such thing to define cohesion should follow the exact same method as to define friction. In case you face difficulties, I would recommend you try first with a two spheres problem.

This would lead to a much shorter script and much simpler situation, increasing your chances to succeed or other users to help you in case you wish to post here (or in a separate, more precise, question) such 2 spheres script. The script above is way too long/complicated..

Revision history for this message
Seti (seti) said :
#10

Thanks Jerome, I have opened another question. Hope it helps :(

Revision history for this message
Launchpad Janitor (janitor) said :
#11

This question was expired because it remained in the 'Open' state without activity for the last 15 days.