Triaxial compression test

Submitted by CARLOS AVILA on Fri, 07/09/2010 - 23:32

Hi Christoph,
Could you please let me know, if LIGGGHTS can help me to run a triaxial compression test on a cylindrical shaped assembly of particles. Lateral wall under constant pressure, fixed bottom, and strain(velocity) controlled loading at the top. Any response from you will help. Thank you in advance.
Regards,
Carlos

ckloss's picture

ckloss | Mon, 07/12/2010 - 09:36

Hi Carlos,

yes, that would be possible - with a bit of programming effort.
Fixed bottom and velocity controlled top is out of the box. You probably know the moving mesh feature - the constant pressure lateral wall would be possible by implementing shrinking and growing of mesh combined with a stress controller.

regards,
Christoph

JF's picture

JF | Wed, 07/14/2010 - 15:34

Hi all,

I send you a first idea to control the wall velocity by keeping the stress constant. If we manage to do it, then we'll be able to implement the "numerical membrane" to perform a triaxial test on a cylindrical shaped assembly of particles.

I wrote these few lines from the fix_move_tri.cpp file. It is not a perfect script, it is just a quick idea !!!

I think that we will need to add this possibility in the script:

fix ID group-ID all move/mesh/gran stress_applied X Y Z units box wall-type

In the function void FixMoveTri::initial_integrate(int vflag) inside the fix_move_tric.cpp file:

void FixMoveTri::initial_integrate(int vflag)
{

double max_vel = 0.001; # by default
double depth = yhi-ylo;
double height = zhi-zlo;
double width = xhi-xlo;
double force_applied = 0;
double translation = 0;

double *ftrans;
force_trans = (double *) calloc ((size_t) 3, sizeof (double));

double max_vel1 = max_vel * 3 * width /(depth+height+width);
double max_vel2 = max_vel * 3 * depth /(depth+height+width);
double max_vel3 = max_vel * 3 * height /(depth+height+width);

double delta = (update->ntimestep - time_origin) * dt;

if (mstyle == LINEAR) {
for (int i = 0; i < nlocal; i++) {

if (vxflag) {
force_applied = stress_applied[0]* Surface_triangle;
force_trans[0] = stress_applied[0] - f[i][0]; #if f[i][0] is the resultant force due to the spheres
translation = force_trans[0]/ normal_wall_stifness;

x[i][0] += std::min(std::abs(translation), delta * max_vel1) * Mathr::Sign(translation);
}

}

.....

You have the main idea that I propose, I need to read more the script to know the best way to implement these lines.
It remains few developments to do.

See you soon
Jf

ckloss's picture

ckloss | Wed, 07/14/2010 - 20:36

Hi JF,

I think this idea is good. In general, I think two things are needed: Being able to shrink a mesh (the lateral cylindrical wall) and to move another mesh (the bottom/top walls) in order to keep stress constant. I will send you a short code snippet for the first function by email.

christoph

marketos | Thu, 07/15/2010 - 12:58

Hi Carlos,
I am not sure what you mean by contant pressure at the sides.
If you are trying to simulate a triaxial test I am not sure how appropriate it is to have a shrinking but rigid cylindrical wall.
One idea would be to create extra C++ code that would check for the grains on the outside of your sample, triangulate the surface and apply a force on each proportional to the area that each maps to. This would require a huge coding effort though, but myself and colleagues here would like to see somebody implement this (or implement it in the far future if we really have to).
Please let us know if you go this way.
Cheers,
George

ckloss's picture

ckloss | Thu, 07/15/2010 - 15:34

Hi george,

what you propose sounds interesting, but I have several questions :-)

>>I am not sure how appropriate it is to have a shrinking but rigid cylindrical wall.
Can you explain this (I am not an expert in triaxial stress tests) - making a shrinkable cylindrial wall was my first guess. I agree with you that you might get in trouble if the deformation is too large - but if it is just like 1%...?

>>code that would check for the grains on the outside of your sample, triangulate the surface and apply a force on each >>proportional to the area that each maps to
Which surface would you need to triangulate? What do you mean with "area that each maps to"?

How are these tests conducted in reality - I think there a movable plates that keep stress constant right ?

I will be happy to discuss these issues with you!

Christoph

marketos | Fri, 07/16/2010 - 13:36

Hi Christoph,

I was thinking that Carlos wanted to simulate a test where the lateral boundary is a membrane and the pressure is applied by a fluid. If you simulate this case with a rigid wall you will not get exactly the same boundary conditions and this might be important. For example with the membrane you get the force applied to the particle being proportional to the 'equivalent' area of the particle whereas the rigid wall sets the force proportional to the wall/particle overlap (using the Hooke spring case as an example).

A way of doing this would be to apply the forces due to this 'membrane' boundary to the grains directly, instead of having the wall explicitly in the simulation. Your c++ code would then need to locate the grains on the lateral side of your sample and do a triangulation of the boundary surface (Voronoi I believe), which in Carlos case would be overall cyindrical but locally defined by the vertices of the grain centroids. This would give you an area value for each boundary particle which you could use to calculate the boundary force that should be applied (F=p*A).

You might find bits of this interesting (Cui L, O'Sullivan C, O'Neill S, An analysis of the triaxial apparatus using a mixed boundary three-dimensional discrete element model, GEOTECHNIQUE, 2007, Vol:57, Pages:831-844) and there are probably other papers on this subject out there too. Please contact us if you would like to discuss the implementation a bit better because there might be some code already created for other DEM software- I am not sure cause it was not me who actually did the work for this.

Thanks for all the help with LIGGGHTS!

George

ckloss's picture

ckloss | Fri, 07/16/2010 - 14:08

Hi George,

thanks for the explanation.

>>I was thinking that Carlos wanted to simulate a test where the lateral boundary is a membrane and the pressure is applied by a fluid. If you simulate this case with a rigid wall you will not get exactly the same boundary condition
Agreed - if a membrane with fluid is used that sounds totally logical

>>Please contact us if you would like to discuss the implementation a bit better because there might be some code already created for other DEM software
You're correct - there are many codes that can do Voronoi, e.g. this one
http://math.lbl.gov/voro++/
by Chris Rycroft from U Berkeley. I know this guy and I am sure he would be willing to help if there are any questions. But I am not sure if the code is parallel. We can talk about this in more detail when I come to visit you in August.

Furthermore, I would like to stress out that I will probably not be the one to implement this - my focus is not on geomechanics and triaxial tests. But I would like to help you (the community) to understand the code and implement new features as well as with networking.

>>Thanks for all the help with LIGGGHTS!
You're welcome!

Christoph

marketos | Fri, 07/16/2010 - 15:24

This is perfectly understandable and I do not think we can expect Christoph to do everything.
I think it is worth exchanging ideas as to how to do stuff, as it might help whoever decides to implement this useful feature. Unfortunately I do not think that this is an immediate need for us either at the moment but would love to hear from anybody trying to code it up...
Comments are also very welcome.

Zheng Hu | Fri, 09/29/2017 - 05:07

Dear all,

Is there any progress on this topic after seven years later? Would it be convenient for someone to share any experience or example codes about this? I am also now focusing on this topic and need some help~ Many thanks.

Zheng