# Bilinear Mohr-Coulomb Joint Model In 3DEC

The Bilinear Mohr-Coulomb 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 (cross-over) is calculated by:

Subcontact failure state are the same as for the i Mohr-Coulomb Joint Model.

## 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 Mohr-Coulomb joint material with the following shear strength parameters.

friction | \(\phi\) | 30 degrees |

friction-2 | \(\phi_2\) | 20 degrees |

cohesion | \(c\) | 1 MPa |

cohesion-2 | \(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:

friction-residual | \(\phi\) | 30 degrees |

f2-residual | \(\phi_2\) | 20 degrees |

cohesion-residual | \(c\) | 0.5 MPa |

c2-residual | \(c_2\) | 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 bilinear-mohr model. This is necessary so that the top block moves upwards uniformly when shear-induced dilation occurs. Dilation values are as follows.

dilation | \(\psi\) | 10 degrees |

dilation-2 | \(\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 large-strain off
;
;
block create brick -1 1
block cut joint-set
;
; 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 2e-3 bulk 50e3 shear 30e3
;
block contact jmodel assign bilinear-mohr
block contact property stiffness-normal 1e5 stiffness-shear 1e5 tension 1e6
;
; just assign strength to central subcontact
block contact property fric 30 fric-2 20 cohesion 1 cohesion-2 2 ...
range pos-x -0.1 0.1 pos-y -0.1 0.1
;
block fix range position-z -1 0
;
block hide range pos-z -1 0
block gridpoint apply velocity-x 1e-4 range position-x -1 1
block hide off
;
block contact history stress-normal position 0 0 0
block contact history stress-shear position 0 0 0
block contact history displacement-shear 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 = 'bmohr-peak.txt']
[openfile(filename)]
model save 'initial-peak'
;
; ===== Normal stress 2 MPa =======
;
block insitu stress 0 0 -2 0 0 0
block face apply stress-zz -2 range position-z 1
;
model cycle 15000
;
[dump(filename)]
;
; ===== Normal stress 4 MPa =======
;
model restore 'initial-peak'
;
;
block insitu stress 0 0 -4 0 0 0
block face apply stress-zz -4 range position-z 1
;
model cycle 25000
;
[dump(filename)]
;
; ===== Normal stress 5 MPa =======
;
model restore 'initial-peak'
;
;
block insitu stress 0 0 -5 0 0 0
block face apply stress-zz -5 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress 6 MPa =======
;
model restore 'initial-peak'
;
;
block insitu stress 0 0 -6 0 0 0
block face apply stress-zz -6 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress 7 MPa =======
;
model restore 'initial-peak'
;
;
block insitu stress 0 0 -7 0 0 0
block face apply stress-zz -7 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress 8 MPa =======;
;
model restore 'initial-peak'
;
;
block insitu stress 0 0 -8 0 0 0
block face apply stress-zz -8 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
=======================================
[make_tables(filename)]
;
```

**bmohr_nstress3.dat**

```
model restore 'initial'
;
block contact prop nstress 3 range pos-x -0.1 0.1 pos-y -0.1 0.1
[filename = 'bmohr-nstress3.txt']
;
[openfile(filename)]
;
model save 'initial-nstress3'
;
; ===== Normal stress = 1 MPa =====
;
block insitu stress 0 0 -1 0 0 0
block face apply stress-zz -1 range position-z 1
;
model cycle 15000
;
[dump(filename)]
;
; ===== Normal stress = 2 MPa =====
;
model restore 'initial-nstress3'
;
;
block insitu stress 0 0 -2 0 0 0
block face apply stress-zz -2 range position-z 1
;
model cycle 20000
;
[dump(filename)]
;
; ===== Normal stress = 2.9 MPa =====
;
model restore 'initial-nstress3'
;
block insitu stress 0 0 -2.9 0 0 0
block face apply stress-zz -2.9 range position-z 1
;
model cycle 25000
;
[dump(filename)]
;
; ===== Normal stress = 3.1 MPa =====
;
model restore 'initial-nstress3'
;
block insitu stress 0 0 -3.1 0 0 0
block face apply stress-zz -3.1 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 4 MPa =====
;
model restore 'initial-nstress3'
;
block insitu stress 0 0 -4 0 0 0
block face apply stress-zz -4 range position-z 1
;
model cycle 30000
;
[dump('bmohr-nstress6.txt')]
;
; ===== Normal stress = 5 MPa =====
;
model restore 'initial-nstress3'
;
block insitu stress 0 0 -5 0 0 0
block face apply stress-zz -5 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
=======================================
[make_tables(filename)]
;
;
```

**bmohr_nstress6.dat**

```
model restore 'initial'
;
block contact prop nstress 6 range pos-x -0.1 0.1 pos-y -0.1 0.1
[filename = 'bmohr-nstress6.txt']
;
[openfile(filename)]
;
model save 'initial-nstress6'
;
; ===== Normal stress = 2 MPa =====
;
block insitu stress 0 0 -2 0 0 0
block face apply stress-zz -2 range position-z 1
;
model cycle 15000
;
[dump(filename)]
;
; ===== Normal stress = 4 MPa =====
;
model restore 'initial-nstress6'
;
;
block insitu stress 0 0 -4 0 0 0
block face apply stress-zz -4 range position-z 1
;
model cycle 20000
;
[dump(filename)]
;
; ===== Normal stress = 5 MPa =====
;
model restore 'initial-nstress6'
;
block insitu stress 0 0 -5 0 0 0
block face apply stress-zz -5 range position-z 1
;
model cycle 25000
;
[dump(filename)]
;
; ===== Normal stress = 5.9 MPa =====
;
model restore 'initial-nstress6'
;
block insitu stress 0 0 -5.9 0 0 0
block face apply stress-zz -5.9 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 6.1 MPa =====
;
model restore 'initial-nstress6'
;
block insitu stress 0 0 -6.1 0 0 0
block face apply stress-zz -6.1 range position-z 1
;
model cycle 30000
;
[dump('bmohr-nstress6.txt')]
;
; ===== Normal stress = 6.5 MPa =====
;
model restore 'initial-nstress6'
;
block insitu stress 0 0 -6.5 0 0 0
block face apply stress-zz -6.5 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 7 MPa =====
;
model restore 'initial-nstress6'
;
block insitu stress 0 0 -7.0 0 0 0
block face apply stress-zz -7.0 range position-z 1
;
model cycle 30000
;
[dump(filename)]
;
; ===== Normal stress = 8 MPa =====
;
model restore 'initial-nstress6'
;
;
block insitu stress 0 0 -8.0 0 0 0
block face apply stress-zz -8.0 range position-z 1
;
model cycle 30000
;
[dump(filename)]
=======================================
[make_tables(filename)]
;
;
```

**dilation.dat**

```
model new
model large-strain off
;
block create brick -1 1 -1 1 -1 1
block cut joint-set
;
; 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 2e-3 bulk 50e3 shear 30e3
;
;
block contact jmodel assign bilinear-mohr
block contact property stiffness-normal 1e5 stiffness-shear 1e5 tension 1e6
;
; here we assign properties to the entire fault
block contact prop fric 30 friction-2 20 coh 1 cohesion-2 2
block contact prop fric-res 30 f2-res 20 coh-res 0.5 c2-res 1
block contact prop dilation 10 dilation-2 5
block fix range position-z -1 0
;
block hide range position-z -1 0
block gridpoint apply velocity-x 1e-4 range position-x -10 10
block hide off
;
block contact history stress-normal position 0 0 0
block contact history stress-shear position 0 0 0
block contact history displacement-shear position 0 0 0
block contact history displacement-normal position 0 0 0
;
;
block insitu stress 0 0 -1 0 0 0
block face apply stress-zz -1 range position-z 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 stress-zz -1 range position-z 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; === Normal stress = 2.3 =====
block face apply stress-zz -0.3 range position-z 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; ==== Normal stress = 2.4 =====
block face apply stress-zz -0.1 range position-z 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; ==== Normal stress = 3 =====
block face apply stress-zz -0.6 range position-z 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
;
; ==== Normal stress = 4 =====
block face apply stress-zz -1 range position-z 1
;
model cycle 4000
[store_dis]
model cyc 1000
[calc_dilation]
[calc_dilation_analytical]
;
```

## Properties

- bilinear-mohr
- cohesion f
Joint cohesion for normal stress less than

`nstress`

.

- cohesion-2 f
Joint cohesion for normal stress greater than

`nstress`

.

- cohesion-residual f
Residual joint cohesion for normal stress less than

`nstress-residual`

.

- c2-residual f
Residual joint cohesion for normal stress greater than

`nstress-residual`

.

- dilation f
Joint dilation angle in degrees for normal stress less than

`nstress-residual`

.

- dilation-2 f
Joint dilation angle in degrees for normal stress greater than

`nstress-residual`

.

- dilation-zero f
Shear displacement at which joint will cease to dilate.

- friction f
Peak friction angle in degrees for normal stress less than

`nstress`

.

- friction-2 f
Peak friction angle in degrees for normal stress greater than

`nstress`

.

- friction-residual f
Residual joint friction angle in degrees for normal stress less

`nstress-residual`

.

- f2-residual f
Residual joint friction angle in degrees for normal stress greater than

`nstress-residual`

.

- nstress f
Normal stress threshold at which peak friction and cohesion changes. If not provided, this is calculated automatically from the cross-over of the two peak failure envelopes.

- nstress-residual f
Normal stress threshold at which residual friction and cohesion changes. If not provided, this is calculated automatically from the cross-over of the two residual failure envelopes.

- stiffness-normal f
Joint normal stiffness (stress / distance).

- stiffness-shear f
Joint shear stiffness (stress / distance).

- tension f
Tensile strength.

- tension-residual f
Residual joint tensile tensile.

Was this helpful? ... | 3DEC © 2019, Itasca | Updated: Dec 22, 2020 |