Bilinear MohrCoulomb Joint Model In 3DEC
The Bilinear MohrCoulomb Joint Model has two different shear strength envelopes. The failure envelope changes when a critical level of normal stress is exceeded. By default, the normal stress threshold is automatically calculated at the intersection of the two failure envelopes, but the user may override this default and specify any value. Both the peak and residual shear strengths can have bilinear envelopes and there may be different normal stress thresholds for the peak and the residual.
It is also possible to specify two different values of dilation, such that dilation angle changes when the residual normal stress threshold is exceeded. If a dilation angle for the high normal stress (\(\psi_2\)) is not given, its value defaults to the dilation of the low stress region (\(\psi_1\)).
Figure 1 shows an example. The low stress failure envelope has a friction angle, \(\phi_1\) = 30 degrees, and cohesion, \(c_1\) = 1 MPa. The high stress envelope has \(\phi_2\) = 20 degrees, and cohesion, \(c_2\) = 2 MPa. The normal stress threshold (crossover) is calculated by:
Subcontact failure state are the same as for the i MohrCoulomb Joint Model.
Summary of Bilinear MohrCoulomb Parameters
The model parameters associated with the bilinear mohrcoulomb model are summarized in Table 1. The model is accessed in 3DEC with the block contact jmodel assign
bilinearmohr
command.
Parameter 
Description 
Keyword 

\(k_n\) 
joint normal stiffness (STRESS/LENGTH) 

\(k_s\) 
joint shear stiffness (STRESS/LENGTH) 

\(\phi\) 
friction angle below sigma_n^c (DEGREES) 

\(\phi_2\) 
friction angle above sigma_n^c (DEGREES) 

\(\phi_{res}\) 
residual friction angle below sigma_n^c (DEGREES). Defaults to phi. 

\(\phi_2^{res}\) 
residual friction angle above sigma_n^c (DEGREES). Defaults to phi_2. 

\(c\) 
cohesion below sigma_n^c (STRESS) 

\(c_2\) 
cohesion above sigma_n^c (STRESS) 

\(c_{res}\) 
residual cohesion below sigma_n^c (STRESS). Defaults to 0. 

\(c_2^{res}\) 
residual cohesion above sigma_n^c (STRESS). Defaults to 0. 

\(\psi\) 
dilation angle below sigma_n^c (DEGREES) 

\(\psi_2\) 
dilation angle above sigma_n^c (DEGREES) 

\(u_{cs}\) 
shear displacement at which dilation stops (LENGTH). Default is infinity 

\(T_f\) 
tensile strength (STRESS) 

\(T_f^{res}\) 
residual tensile strength (STRESS). Default is 0. 

\(\sigma_n^c\) 
normal stress threshold (STRESS) 

\(\sigma_n^c\) 
normal stress threshold for residual envelope (STRESS) 

Examples
To view these examples in 3DEC, use the menu command . Choose “3DEC/ Constitutive_Models/ BilinearMohr” and select “bmohr.prj” to load. The main data files used are shown at the end of this example. All data files are found in the project.
A simple model is created from a 1×1×1 m block cut in half horizontally (Figure 2). The bottom block is held fixed. A normal stress is applied to the top of the top block. The top block is then moved horizontally to produce slip.
Peak strength test
A single point in the middle of the intersecting faces is assigned the Bilinear MohrCoulomb joint material with the following shear strength parameters.
friction 
\(\phi\) 
30 degrees 
friction2 
\(\phi_2\) 
20 degrees 
cohesion 
\(c\) 
1 MPa 
cohesion2 
\(c_2\) 
2 MPa 
The default normal stress threshold is used (automatically calculated as 4.7 MPa). The normal stress is applied, and the model is sheared to failure. This was repeated multiple times for different normal stresses. The peak shear stress was measured for each model. The results are shown in Figure 3. The model behaves as expected.
Normal stress threshold tests
The same test is run, but the normal stress threshold is specified (instead of using the default). Two tests are run, one with a normal stress threshold below the default (3 MPa), and one with a normal stress threshold above the default (6 MPa). Results are shown in Figure 4 and Figure 5. The model behaves as expected.
Residual strength test
The same model is run using the following values for residual strengths:
frictionresidual 
\(\phi_{res}\) 
30 degrees 
f2residual 
\(\phi_2^{res}\) 
20 degrees 
cohesionresidual 
\(c_{res}\) 
0.5 MPa 
c2residual 
\(c_2^{res}\) 
1 MPa 
The residual normal stress threshold was automatically calculated by 3DEC to be 2.3 MPa.
In this test a constant downward velocity is applied to the top boundary, causing the normal stress to gradually increase during shearing. The results are shown in Figure 6. The model behaves as expected.
Dilation test
The model is rerun with all subcontacts assigned the bilinearmohr model. This is necessary so that the top block moves upwards uniformly when shearinduced dilation occurs. Dilation values are as follows.
dilation 
\(\psi\) 
10 degrees 
dilation2 
\(\psi_2\) 
5 degrees 
The default residual normal stress threshold is used (2.3 MPa).
The top block is sheared as before. Normal stress is gradually increased by increasing levels of normal stress to the top boundary and cycling for 10,000 cycles at each level (i.e., normal stress is increased and then held constant for 10,000 steps while shearing). The dilation is calculated by observing the change in joint normal displacement and shear displacement over the last 1,000 steps of each normal stress cycle. The calculated dilation angles are shown in Figure 7.
Data Files
bmohr_test.dat
;
model new
model largestrain off
;
;
block create brick 1 1
block cut jointset
;
; create central subcontact
block zone generate fix 0 0 0
block zone generate edgelength 2 fix 0 0 0
; use MPa
block zone cmodel assign elastic
block zone property density 2e3 bulk 50e3 shear 30e3
;
block contact jmodel assign bilinearmohr
block contact property stiffnessnormal 1e5 stiffnessshear 1e5 tension 1e6
;
; just assign strength to central subcontact
block contact property fric 30 fric2 20 cohesion 1 cohesion2 2 ...
range posx 0.1 0.1 posy 0.1 0.1
;
block fix range positionz 1 0
;
block hide range posz 1 0
block gridpoint apply velocityx 1e4 range positionx 1 1
block hide off
;
block contact history stressnormal position 0 0 0
block contact history stressshear position 0 0 0
block contact history displacementshear position 0 0 0
;
; listen for the peak shear stress
program call 'analytical_peak.fis'
[setup]
;
fish callback add monitor 1.0
;
model save 'initial'
==============================================
;
[global filename = 'bmohrpeak.txt']
[openfile(filename)]
model save 'initialpeak'
;
; ===== Normal stress 2 MPa =======
;
block insitu stress 0 0 2 0 0 0
block face apply stresszz 2 range positionz 1
;
model cycle 15000
;
[dump(filename)]
;
; ===== Normal stress 4 MPa =======
;
model restore 'initialpeak'
;
;
block insitu stress 0 0 4 0 0 0
block face apply stresszz 4 range positionz 1
;
model cycle 25000
;
[dump(filename)]
;
; ===== Normal stress 5 MPa =======
;
model restore 'initialpeak'
;
;
block insitu stress 0 0 5 0 0 0
block face apply stresszz 5 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress 6 MPa =======
;
model restore 'initialpeak'
;
;
block insitu stress 0 0 6 0 0 0
block face apply stresszz 6 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress 7 MPa =======
;
model restore 'initialpeak'
;
;
block insitu stress 0 0 7 0 0 0
block face apply stresszz 7 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress 8 MPa =======;
;
model restore 'initialpeak'
;
;
block insitu stress 0 0 8 0 0 0
block face apply stresszz 8 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
=======================================
[make_tables(filename)]
;
bmohr_nstress3.dat
model restore 'initial'
;
block contact prop nstress 3 range posx 0.1 0.1 posy 0.1 0.1
[filename = 'bmohrnstress3.txt']
;
[openfile(filename)]
;
model save 'initialnstress3'
;
; ===== Normal stress = 1 MPa =====
;
block insitu stress 0 0 1 0 0 0
block face apply stresszz 1 range positionz 1
;
model cycle 15000
;
[dump(filename)]
;
; ===== Normal stress = 2 MPa =====
;
model restore 'initialnstress3'
;
;
block insitu stress 0 0 2 0 0 0
block face apply stresszz 2 range positionz 1
;
model cycle 20000
;
[dump(filename)]
;
; ===== Normal stress = 2.9 MPa =====
;
model restore 'initialnstress3'
;
block insitu stress 0 0 2.9 0 0 0
block face apply stresszz 2.9 range positionz 1
;
model cycle 25000
;
[dump(filename)]
;
; ===== Normal stress = 3.1 MPa =====
;
model restore 'initialnstress3'
;
block insitu stress 0 0 3.1 0 0 0
block face apply stresszz 3.1 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 4 MPa =====
;
model restore 'initialnstress3'
;
block insitu stress 0 0 4 0 0 0
block face apply stresszz 4 range positionz 1
;
model cycle 30000
;
[dump('bmohrnstress6.txt')]
;
; ===== Normal stress = 5 MPa =====
;
model restore 'initialnstress3'
;
block insitu stress 0 0 5 0 0 0
block face apply stresszz 5 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
=======================================
[make_tables(filename)]
;
;
bmohr_nstress6.dat
model restore 'initial'
;
block contact prop nstress 6 range posx 0.1 0.1 posy 0.1 0.1
[filename = 'bmohrnstress6.txt']
;
[openfile(filename)]
;
model save 'initialnstress6'
;
; ===== Normal stress = 2 MPa =====
;
block insitu stress 0 0 2 0 0 0
block face apply stresszz 2 range positionz 1
;
model cycle 15000
;
[dump(filename)]
;
; ===== Normal stress = 4 MPa =====
;
model restore 'initialnstress6'
;
;
block insitu stress 0 0 4 0 0 0
block face apply stresszz 4 range positionz 1
;
model cycle 20000
;
[dump(filename)]
;
; ===== Normal stress = 5 MPa =====
;
model restore 'initialnstress6'
;
block insitu stress 0 0 5 0 0 0
block face apply stresszz 5 range positionz 1
;
model cycle 25000
;
[dump(filename)]
;
; ===== Normal stress = 5.9 MPa =====
;
model restore 'initialnstress6'
;
block insitu stress 0 0 5.9 0 0 0
block face apply stresszz 5.9 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 6.1 MPa =====
;
model restore 'initialnstress6'
;
block insitu stress 0 0 6.1 0 0 0
block face apply stresszz 6.1 range positionz 1
;
model cycle 30000
;
[dump('bmohrnstress6.txt')]
;
; ===== Normal stress = 6.5 MPa =====
;
model restore 'initialnstress6'
;
block insitu stress 0 0 6.5 0 0 0
block face apply stresszz 6.5 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 7 MPa =====
;
model restore 'initialnstress6'
;
block insitu stress 0 0 7.0 0 0 0
block face apply stresszz 7.0 range positionz 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 8 MPa =====
;
model restore 'initialnstress6'
;
;
block insitu stress 0 0 8.0 0 0 0
block face apply stresszz 8.0 range positionz 1
;
model cycle 30000
;
[dump(filename)]
=======================================
[make_tables(filename)]
;
;
dilation.dat
model new
model largestrain off
;
block create brick 1 1 1 1 1 1
block cut jointset
;
; create central subcontact
block zone generate fix 0 0 0
block zone generate edgelength 2 fix 0 0 0
; properties in MPa
block zone cmodel assign elastic
block zone property density 2e3 bulk 50e3 shear 30e3
;
;
block contact jmodel assign bilinearmohr
block contact property stiffnessnormal 1e5 stiffnessshear 1e5 tension 1e6
;
; here we assign properties to the entire fault
block contact prop fric 30 friction2 20 coh 1 cohesion2 2
block contact prop fricres 30 f2res 20 cohres 0.5 c2res 1
block contact prop dilation 10 dilation2 5
block fix range positionz 1 0
;
block hide range positionz 1 0
block gridpoint apply velocityx 1e4 range positionx 10 10
block hide off
;
block contact history stressnormal position 0 0 0
block contact history stressshear position 0 0 0
block contact history displacementshear position 0 0 0
block contact history displacementnormal position 0 0 0
;
;
block insitu stress 0 0 1 0 0 0
block face apply stresszz 1 range positionz 1
;
model cycle 5000
;
model save 'failed'
;
=======================================
;
;
model restore 'failed'
;
history purge
program call 'analytical_dilation.fis'
[setup]
;
; store current displacements on middle point
[store_dis]
;
; ==== Normal stress = 1 MPa ===============
;
model cycle 1000
;
; calculate dilation and add to table
[calc_dilation]
;
; ===== Normal stress = 2 MPa ==============
; adds to previous! total = 2 MPa
block face apply stresszz 1 range positionz 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; === Normal stress = 2.3 =====
block face apply stresszz 0.3 range positionz 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; ==== Normal stress = 2.4 =====
block face apply stresszz 0.1 range positionz 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; ==== Normal stress = 3 =====
block face apply stresszz 0.6 range positionz 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; ==== Normal stress = 4 =====
block face apply stresszz 1 range positionz 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
[calc_dilation_analytical]
;
Properties
 cohesion f
Joint cohesion for normal stress less than
nstress
.
 cohesion2 f
Joint cohesion for normal stress greater than
nstress
.
 cohesionresidual f
Residual joint cohesion for normal stress less than
nstressresidual
.
 c2residual f
Residual joint cohesion for normal stress greater than
nstressresidual
.
 dilation f
Joint dilation angle in degrees for normal stress less than
nstressresidual
.
 dilation2 f
Joint dilation angle in degrees for normal stress greater than
nstressresidual
.
 dilationzero f
Shear displacement at which joint will cease to dilate.
 friction f
Peak friction angle in degrees for normal stress less than
nstress
.
 friction2 f
Peak friction angle in degrees for normal stress greater than
nstress
.
 frictionresidual f
Residual joint friction angle in degrees for normal stress less
nstressresidual
.
 f2residual f
Residual joint friction angle in degrees for normal stress greater than
nstressresidual
.
 nstress f
Normal stress threshold at which peak friction and cohesion changes. If not provided, this is calculated automatically from the crossover of the two peak failure envelopes.
 nstressresidual f
Normal stress threshold at which residual friction and cohesion changes. If not provided, this is calculated automatically from the crossover of the two residual failure envelopes.
 stiffnessnormal f
Joint normal stiffness (stress / distance).
 stiffnessshear f
Joint shear stiffness (stress / distance).
 tension f
Tensile strength.
 tensionresidual f
Residual joint tensile tensile.
Was this helpful? ...  Itasca Software © 2023, Itasca  Updated: Sep 13, 2023 