Bug in UniaxialStrainer ?

Asked by Hicham BENNIOU

Hi people !

I encountered problem that was solved by modifying this part [1].

Problem :

box shaped specimen, UniaxialStrainer axis is vertical (axis =2), forces are applied on lateral surfaces (axis 0 and axis 1)
upper spheres (posIds) and lower spheres (negIds) should move along axis 2 only, but they move along axis 0 and axis 1 also, making the crossSection smaller than it should be which creates an additional shear force that will inevitably break the links between those spheres and the specimen.

Fix :

replace :
b->state->vel[axis]=pNormalized*(v1-v0)+v0;

by :
switch(axis){
   case 0: {
    b->state->vel[0]=pNormalized*(v1-v0)+v0;
    b->state->vel[1]=0;
    b->state->vel[2]=0;
    break;
    }
   case 1: {
    b->state->vel[0]=0;
    b->state->vel[1]=pNormalized*(v1-v0)+v0;
    b->state->vel[2]=0;
    break;
    }
   case 2: {
    b->state->vel[0]=0;
    b->state->vel[1]=0;
    b->state->vel[2]=pNormalized*(v1-v0)+v0;
    break;
    }
   default: throw std::invalid_argument(("UniaxialStrainer: unknown axis value "+boost::lexical_cast<string>(axis)+" (should be 0,1,2)").c_str());

Am I the only one facing this problem ?

Cheers,
Hicham

[1] : https://github.com/yade/trunk/blob/master/pkg/dem/UniaxialStrainer.cpp#L77

Question information

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

Hi Hicham,
I think it is a feature of uniaxialStrainer to allow lateral deformations, not a bug.
This behavior actually minimizes the boundary effects. You should have even more stress concentration near the plates if you don't allow the thining of the cross section at the top and bottom.

Anyway, if you definitely need no deformation of upper/lower spheres it should be possible without changing the code.
Do this once before the test:

for id in posIds:
   O.bodies[id].state.blockedDOFs="xyz" #(or even "xyzXYZ"?)
   O.bodies[id].state.vel=(0,0,0) #useless if velocities are null initially

They will move like a rigid block.

Bruno

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

Hi

Did you give a look to UniaxialStrainer.blockDisplacements / blockRotations ?
https://yade-dem.org/doc/yade.wrapper.html?highlight=uniaxialstrainer#yade.wrapper.UniaxialStrainer.blockDisplacements

Revision history for this message
Hicham BENNIOU (benniou-hicham-deactivatedaccount) said :
#3

Hi Jerome and Bruno,

Yes, of course, but still, even when you block all displacements and rotations spheres move along the two other axis.

Cheers,

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

We need to see that with a script maybe. For the moment I don't understand the problem.