stress path

Asked by ehsan benabbas on 2021-02-21

Hello,

I made some changes to Bruno's Triaxial code for both 2D and 3D cases. In this code, loading is being applied by moving the top wall downward and the bottom wall upward. For general cases, I want to apply loading by any arbitrary stress path on both 2D and 3D scenarios. Of course for 2D cases,
the stress path can be seen in the p-q (or s-t) coordination system and can be defined in this way and for 3D cases, I think it is better to use the Lode angle in sigma1/p. sigma2/p, and sigma3/p coordination system to define any arbitrary stress path (for example the radial stress path) as loading. My question is how I can define the stress path (the arbitrary one I want) for loading on both 2D (biaxial) and 3D (triaxial) tests?

Thank you for your help.

Question information

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

Hi,
The engine takes target stress-strain as input and it tries to reach them as an output.
So I would think you need to define targets in a sequence, that will be the loading path.
That's what current engine (TriaxialStressController) is supposed to do.
It is not completely clear which "triaxial" code you are speaking about, though.
Bruno

Revision history for this message
ehsan benabbas (ehsanben) said :
#2

Thank you for your response.

Yes I am using TriaxialStressController.

To define the stress path, we can define the parameter b=sigma2-sigma3/sigma1-sigma3 which corresponds to any Lode angle. For example, b=0.28 defines the Lode angle equal to -pi/12. By keeping this parameter "b" constant, the Lode angle will be constant which means we are defining a radial stress path as loading. It should be noted that the mean stress must be constant as well. To do so, we can define a constant strain rate and use some relations to calculate sigma 2 and sigma 3 (lateral stresses) and update their measures because sigma1 (the vertical/axial stress) is getting increased and with respect to the constant mean stress, sigma 2 and 3 must get decrease during the test. As I have the relations for sigma 2 and 3 which are based on "p", "b", and "sigma1". I need to know how I can update the values for sigma2 and 3 during the test to keep the lode angle constant?

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

What you describe is a particular logic for defining a loading path. That's fine but yade is agnostic wrt this.

> how I can update the values for sigma2 and 3 during the test

triax.goalX = updatedSigmaX ?

Or I miss the point?

B

Revision history for this message
ehsan benabbas (ehsanben) said :
#4

Thank you Bruno for your response. I made the following changes to the code, but the problem is for b=0 (which means confining pressures must be equal as b=(sigma1-sigma3)/(sigma2-sigma3) when the axial/vertical direction is direction 2) I get different results in comparison with the case that I had not used "b and p" parameters. I mean when I add these changes, when I put b=0, it must be the same as before, however, I get much higher confining pressures and axial pressure.

To follow the aforementioned logic for defining a loading path, first I defined the following parameters:

################# LOADING #################
strainRate=-0.5 # %/sec
target_strain=0.35
p=-5e5 # Mean Stress , KPa ... Pa=N/m2
sigmaIso=p # Confining Pressure , Kpa ... Pa=N/m2
# Note that direction 2 is vertical/axial and directions 1 & 3 are lateral/confining
b=0 # b = (sigma1-sigma3)/(sigma2-sigma3)

Second, for confining pressure I defined the following lines:

###############################################################
################# APPLYING CONFINING PRESSURE #################

print ('============ APPLYING CONFINING PRESSURE ============')

triax.goal1 = sigmaIso
triax.goal2 = sigmaIso
triax.goal3 = sigmaIso

while 1:
    O.run(ORN,True)
    unb = unbalancedForce()
    meanS=(triax.stress(triax.wall_right_id)[0]+triax.stress(triax.wall_top_id)[1]+triax.stress(triax.wall_front_id)[2])/3
    ConfStressRatio=abs(sigmaIso-triax.meanStress)/abs(sigmaIso)
    print ('~~~~~~~~~~~~~ Phase_01: Converging to Isotropic Compression, 50kPa ~~~~~~~~~~~~~')
    print ('ConfSratio:',ConfStressRatio,' step:', O.iter/ORN, ' Time:',O.time, ' iter/sec',O.speed)
    print ('mean stress engine:',triax.meanStress,' mean stress (Calculated):',meanS)
    if unb<stabilityThreshold and ConfStressRatio<PCPC:
        break

and finally, in the deviatoric phase of the triaxial test I defined the following lines:

######################################################
################# DEVIATORIC LOADING #################

print ('============ APPLYING DEVIATORIC LOADING ============')
triax.internalCompaction=False
setContactFriction(0.5)

# Allow walls to move. >>> False means fixed , True means free to move
triax.wall_top_activated=True
triax.wall_bottom_activated=False
triax.wall_left_activated=True
triax.wall_right_activated=True
triax.wall_back_activated=True
triax.wall_front_activated=True

# Make Stress Control on X,Y,Z directions by setting True, False means Strain Control
triax.stressControl_1=True
triax.stressControl_2=False
triax.stressControl_3=True

# set the rate of strain to the desirable axis
triax.strainRate2=strainRate

# set the deviatoric conditions
triax.stressMask = 5
triax.goal2 = strainRate
sigma2=triax.goal2
sigma1=(((1-b)*3*p)+(((2*b)-1)*sigma2))/(2-b)
triax.goal1 = sigma1
sigma3=((3*p)-((b+1)*sigma2))/(2-b)
triax.goal3 = sigma3

newton.damping=damp

while 1:
    O.run(ORN,True)
    unb=unbalancedForce()
    axialS=triax.stress(triax.wall_top_id)[1]
    eps2=triax.strain[1]
    eps2cal=(triax.height-Ls)/Ls
    print ('~~~~~~~~~~~~~ Phase_02: Converging to Deviatoric Compression, Strain Rate ~~~~~~~~~~~~~')
    print ('sigma2: ',axialS, ' q: ', axialS-sigmaIso,' step= ', O.iter/ORN,' Time:',O.time, ' iter/sec',O.speed)
    print ('Strain2 Calculated: ',eps2cal, ' Strain2 engine: ',eps2,'axial deformation (%)', (eps2-e22Check)*100)
    if abs(eps2-e22Check)>=target_strain: #triax.sigma2
        break

print ('################## Deviatoric phase is finished and saved successfully ##################')

Revision history for this message
ehsan benabbas (ehsanben) said :
#5

All I did in the above is correct, to the only line that needs to be changed is as follows:

sigma2=triax.goal2

that must be changed as follows

sigma2=triax.stress(triax.wall_top_id)[1]

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

Indeed, that was strange:
> triax.goal2 = strainRate
> sigma2=triax.goal2 #huh?

Looks better:
> sigma2=triax.stress(triax.wall_top_id)[1]

And then it does what you want?

Bruno

Revision history for this message
ehsan benabbas (ehsanben) said :
#7

Yes. it almost does what I want. The only strange thing that happens and I don't know why is that if I set the mean stress (p) for example equal to 3e5, I get the value of around 320,000 in the result, not 300,000 (when b=0). Again, b=0 means the previous version of the code (without the stress path).