particle stiffness scaling

Asked by ceguo

Hi,

As I checked the newest version of ESyS (2.2), I found the particle stiffness scaling method is modified. In Model/RotFricInteraction.cpp, it seems if we set meanR_scaling=true, the actual scaling factor is:

((r1+r2)/2)^2/(r1+r2)=(r1+r2)/4.

This really confuses me. Why not use (r1+r2)/2 as the name "meanR_scaling" indicates? Or use 2*r1*r2/(r1+r2) as YADE uses?

Ning

Question information

Language:
English Edit question
Status:
Solved
For:
ESyS-Particle Edit question
Assignee:
No assignee Edit question
Solved by:
Dion Weatherley
Solved:
Last query:
Last reply:
Revision history for this message
Launchpad Janitor (janitor) said :
#1

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

Revision history for this message
ceguo (hhh-guo) said :
#2

Hi,

I need this question to be answered, because I think if we write a paper, the reviewers will ask the same question: why scale with (r1+r2)/4?

Ning

Revision history for this message
Dion Weatherley (d-weatherley) said :
#3

Hi Ning,

My apologies. I didn't notice this question.

The various rotational bonded interactions (RotBonded, RotFriction, BrittleBeam etc.) by default scale the stiffnesses of individual particle-pair interactions according to linear elastic beam theory with the assumption that the beams are cylinders.

Beam theory provides analytical relationships for the various stiffnesses (normal, shear, bending, torsion) as a function of a Young's modulus E, Poisson's ratio and geometrical parameters (the cross-sectional area A and length, L of the beam). Specifically, for normal stiffness:

Kn = E . A / L

If we assume the beams are cylinders, we need to decide the radius (R) of the cylindrical beam. It is not obvious what is the best choice when two unequal-sized particles are to be connected. Various options exist:
1) arithmetic mean: R = (R1 + R2)/2
2) min. radius: R = min{R1,R2}
3) max. radius: R = max{R1,R2}
4) a constant
5) ...

When meanR_scaling=true (the default), the radius of the beams is equal to the arithmetic mean (option 1 above). Consequently, for normal stiffness scaling we have:

Kn = E . A / L = E. pi R^2 / (R1 + R2) = E . pi . ((R1+R2)/2)^2 / (R1 + R2) = E . pi . (R1 + R2) / 4

I hope this answers your question.

Cheers,

Dion

Revision history for this message
ceguo (hhh-guo) said :
#4

Hi Dion,

Thanks very much for the detailed reply. I'm happy with your explanation on the scaling law. Still one more question: since there is no `pi` in the code (effA = effR * effR), can I say the input parameter K is equivalent to E.pi in this case?

Ning

Revision history for this message
Dion Weatherley (d-weatherley) said :
#5

Hi NIng,

In fact the 'pi' is included but just not in the code fragment you are refering to. It is included as part of one of the constructors for the associated interaction group params classes. See for example line numbers 117-127 of Model/RotBondedInteraction.cpp. This is slightly convoluted but necessary to ensure the correct scaling for different choices of beam radius scaling (e.g. when meanR_scaling=false).

Consequently the 'normalK' input parameter is equal to the beam Young's modulus, E when scaling is used.

Cheers,

Dion

Revision history for this message
ceguo (hhh-guo) said :
#6

Hi Dion,

I did a small test on RotFrict model. From force and penetration calculation, I found the particle-particle stiffness is scaled by (r1+r2)/4 without a multiplier of pi. And the particle-wall stiffness is scaled by particle radius times pi (=wall_stiffness x radius x M_PI).

So RotBond model scales differently with RotFrict model. Have anyone also tested this?

Ning

Revision history for this message
Dion Weatherley (d-weatherley) said :
#7

Hi Ning,

Looks like you found an oversight/bug.

Try using FrictionPrms instead of RotFrictionPrms. This one should scale with pi factor.

The API docs for FrictionPrms are here:
http://esys.esscc.uq.edu.au/esys-particle_python_doc/snapshot/pythonapi/html/esys.lsm.LsmPy.FrictionPrms-class.html#__init__

Cheers,

Dion.

Revision history for this message
ceguo (hhh-guo) said :
#8

Hi Dion,

The FrictionPrms doesn't scale M_PI neither. I think there is an error in ./Python/esys/lsm/InteractionParamsPy.cpp:

In lines 619, 630, and 640,
CRotFrictionIGP(name, youngsModulus, poissonsRatio, dynamicMu, staticMu, 0.0, true, **,**) ## 9 parameters here.

There is an extra 'true' which makes the module cannot be properly mapped to CRotFrictionIGP in ./Model/RotFricInteraction.cpp which only requires 8 parameters when using Young's modulus and Poisson's ratio.

Ning

Revision history for this message
ceguo (hhh-guo) said :
#9

Hello everyone,

I'm wondering if anyone has confirmed this issue or I committed a mistake?

Ning

Revision history for this message
ceguo (hhh-guo) said :
#10

Hi,

I've committed the modification and it works well for both RotFrictionPrms and FrictionPrms. I'm wondering if I have access to contribute my corrections to the source code and how?

I didn't check the bonded model for the scaling issue. It would be better for someone with experience to double check it.

Ning

Revision history for this message
Dion Weatherley (d-weatherley) said :
#11

Hi Ning,

Could you please explain exactly what modification you made to get this working? If it is fairly simple, I will add it to the development version in the next few days.

Cheers,

Dion

Revision history for this message
ceguo (hhh-guo) said :
#12

Hi Dion,

Sure. It's fairly simple.
1. In ./Model/RotFricInteraction.cpp, delete line 46 and 49, and add to the following brackets {} (line 55):
{
    k = M_PI*kR;
    k_s = M_PI*kS;
}

2. And in ./Python/esys/lsm/InteractionParamsPy.cpp, remove the FIRST "true" in lines 619, 630, and 640.

Cheers,
Ning

Revision history for this message
Best Dion Weatherley (d-weatherley) said :
#13

Thanks Ning.

I have updated the development version (rev. 1084) to include the bugfix. I decided only to make the second change above. Consequently the correct scaling by a factor of Pi will only be obtained when using FrictionPrms. This is to maintain consistency with how RotBondedPrms and BrittleBeamPrms work.

One can always add the factor of Pi explicitly in the python script when using RotBondedPrms and RotFrictionPrms. The radius scaling will still apply by default, unless one sets scaling=False in the python script.

Although this seems convoluted, it is to ensure a degree of backwards compatibility with scripts that were written prior to introduction of the scaling relationships.

Cheers,

Dion

Revision history for this message
ceguo (hhh-guo) said :
#14

Thanks Dion Weatherley, that solved my question.