# Example: Shear Pull-Tests for a Hybrid bolts in FLAC3D

Problem Statement

Note

To view this project in FLAC3D, use the menu command Help ► Examples…. Choose “ZoneSel/ hybrid/ shear_pull” and select “shear_pull.prj” to load. The data files used are shown at the end of this example.

## Simple Shear Test

A simple shear test is simulated using two blocks of zones (Figure 1). The bottom of the left block is prevented from moving in the vertical direction and the top of the right block is moved downwards at a constant velocity. A hybrid bolt spans the joint from left to right. A normal stress of 1 MPa is applied. The friction angle of the joint is set to 40º and the cohesion is 0.

For the hybrid bolt, the dowel segment is assigned a yield strength of 0.063 MN and a strain limit of 0.3. Figure 2 shows the bolt contribution versus shear displacement. The bolt contribution is essentially the shear force minus the frictional strength ($$\sigma_n \tan \phi$$). At about 7 mm of shear displacement, the dowel segment yields. At about 2.1 cm, the cable itself yields in tension. Finally after about 3 cm of shear, the dowel ruptures and the bolt fails.

blocks.dat

;
;Build model for hybrid bolt calibration
;
model new
fish automatic-create off
model large-strain on
;
fish define params

; block dimensions
global block_lenH = 0.95
global block_lenV = 2.0

; block properties
global ymod_=40e9
global pratio_=0.25
global dens_=2500

; joint properties
global jkn_=3e11
global jks_=3e11
global jfric_=40.0

;hybrid bolt parameters
global area_=201e-6
global e_=1.4e11
global grout_stiff_=3e8
global grout_strength_=2e5
global cable_yield_=100e3
global cable_strain_limit_=0.2  ; tensile
global dowel_stiffness_=1.0e7
global dowel_yield_=62.8e3
global dowel_strain_limit_=0.3 ; shear
global dowel_length_=0.1
global segment_length_=0.1

; calculated parameters
global bolt_len=block_lenH*2.
end
[params]

=====================================================

;
;make 2 blocks with interface
; make left block bigger in -z direction to account for large strain
zone create brick p 0 (0,0,0) ...
p 1 ([2.0*block_lenH],0,0) ...
p 2 (0,[block_LenH],0) ...
p 3 (0,0,[block_lenV]) ...
size 4 4 8

zone interface 'joint' create by-face separate range pos-x [block_lenH]

; zone and contact properties
zone cmodel elastic
zone property young [ymod_] poisson [pratio_] density [dens_]

zone interface node property stiffness-normal [jkn_] ...
stiffness-shear [jks_]  ...
friction [jfric_]
;

; apply common boundary conditions
zone face apply velocity-z 0 range position-x 0 [block_LenH] position-z 0

zone face apply velocity-y 0

; use combined damping to stop vibrations.
zone mech damp combined

model save 'blocks'


shear_test.dat

;;-----------------------------------------------------------------------------
;;		Shear test
;;-----------------------------------------------------------------------------
model rest 'blocks'

fish def params_shear

; boundary conditions
global normal_stress = 1.0e6
global zvel_=-2e-7

; calculated values
local normal_force = normal_stress * block_lenH*block_lenV
end
[params_shear]

; boundary conditions
zone face apply stress-xx [-1.*normal_stress] range position-x 0
zone face apply stress-xx [-1.*normal_stress] range position-x [block_lenH*2.]
;
zone group 'right' range pos-x [block_lenH] [block_lenH*2.]
zone face group 'top' range group 'right' pos-z [block_lenV]
zone gridpoint group 'top' range group 'top'
model solve
;
zone gridpoint initialize displacement 0 0 0

; ??
;block contact reset displacement

zone face apply velocity-z [zvel_] servo ramp range group 'top'
;
; Function to calculate bolt contribution to resisting shear load
[global max_force = 0.0]
[global bolt_contribution = 0.0]

fish define reaction_force
local temp_ = 0.0
loop foreach local gi gp.list
if gp.group(gi) = 'top'
temp_ = temp_ + gp.force.unbal.z(gi)
end_if
end_loop
reaction_force = temp_
bolt_contribution =  temp_ - friction_force
end
;
fish history reaction_force
fish history bolt_contribution
zone history displacement-z ...
position [1.5*block_lenH] [0.5*block_lenH] [0.5*block_lenV]
model history mechanical unbalanced-maximum

history interval 100
;

;to run the test - stop when rupture
fish def run_it
local test_ = true
local max_force = -1e12

loop while test_ = true
command
model cycle 10000
end_command
if max_force < bolt_contribution
max_force = bolt_contribution
else
if bolt_contribution < max_force/10.
test_ = false
end_if
end_if
end_loop
end

model save 'ini_shear.sav'

=================================================================

; Test perpendicular bolt 90 degrees
; Change dincl_ to test other bolt angles
;
model restore 'ini_shear'
[global dincl_=90.]

;To create bolt
[global y1 = 0.5*block_lenH]
[global y2 = y1]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]

struct hybrid create by-line [bolt_beg] [bolt_end] max-length [segment_length_]

; cable properties
struct hybrid prop  cross-sectional-area [area_] young [e_] ...
grout-stiffness [grout_stiff_] grout-cohesion [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]

; dowel properties
struct hybrid prop dowel-active-length [dowel_length_] dowel-stiffness [dowel_stiffness_] ...
dowel-yield [dowel_yield_] dowel-failure-strain [dowel_strain_limit_]

; to plate both ends:
struct link attach x rigid range pos-x [bolt_beg->x]
struct link attach y rigid range pos-x [bolt_beg->x]
struct link attach z rigid range pos-x [bolt_beg->x]
struct link attach x rigid range pos-x [bolt_end->x]
struct link attach y rigid range pos-x [bolt_end->x]
struct link attach z rigid range pos-x [bolt_end->x]

struct damp combined-local

struct hybrid history dowel-strain pos 0 0 0

;run the test - stop when rupture
[run_it]

model save 'shear-90'

program return

=================================================================

; Test bolt at 70 degrees
;
model restore 'ini_shear'
[global dincl_=70.]

;To create Inclined bolt
[global y1 = 0.5*block_lenH]
[global y2 = y1]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]

struct hybrid create by-line [bolt_beg] [bolt_end] max-length [segment_length_]

; cable properties
struct hybrid prop  cross-sectional-area [area_] young [e_] ...
grout-stiffness [grout_stiff_] grout-cohesion [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]

; dowel properties
struct hybrid prop dowel-active-length [dowel_length_] dowel-stiffness [dowel_stiffness_] ...
dowel-yield [dowel_yield_] dowel-failure-strain [dowel_strain_limit_]

;to plate both ends:
struct link attach x rigid range pos-x [bolt_beg->x]
struct link attach y rigid range pos-x [bolt_beg->x]
struct link attach z rigid range pos-x [bolt_beg->x]
struct link attach x rigid range pos-x [bolt_end->x]
struct link attach y rigid range pos-x [bolt_end->x]
struct link attach z rigid range pos-x [bolt_end->x]

struct damp combined-local

;run the test - stop when rupture
[run_it]

model save 'shear-70'


## Simple Pullout Test

The same block and bolt configuration from the simple shear test is used in the pullout test. In this case no normal stress is applied and the right boundary of the right block is moved to the right at a constant velocity.

Figure 3 shows the block and cable configuration at the end of the test. Figure 4 shows the bolt contribution in this test. Since there is no tensile strength on the joint, the bolt contribution is simply equal to the tensile force applied at the right boundary. This plot shows the initial elastic axial deformation, and then the start of grout failure at around 1.6 mm of displacement. Finally, the cable yields in tension after 2.5 mm of pull, at which time the bolt behaves plastically and the contribution no longer increases.

pullout.dat

;;-----------------------------------------------------------------------------
;;		Pull-out test
;;-----------------------------------------------------------------------------
model restore 'blocks'
;
; Define parameters for pullout test
[global xvel_ = 2e-8]
;
zone face apply velocity-x 0 range position-x 0
;
zone face apply velocity-z 0 range position-z 0
zone gridpoint group 'right' range pos-x [2.0*block_lenH]
;
zone face apply velocity-x [xvel_] range pos-x [2.0*block_lenH]
;
[global max_force = 0.0]
[global bolt_contribution = 0.0]
;
fish define reaction_force
local temp_ = 0.0
loop foreach local gi gp.list
if gp.group(gi) = 'right'
temp_ = temp_ + gp.force.unbal.x(gi)
end_if
end_loop
reaction_force = math.abs(temp_)
bolt_contribution =  math.abs(temp_); - friction_force
end
;
fish history reaction_force
fish history bolt_contribution
zone history displacement-x ...
position [2*block_lenH] [0.5*block_lenH] [0.5*block_lenV]
model history mechanical unbalanced-maximum
history interval 500

;fish function to run the test - stop when rupture
[global gp_monitor = gp.near(2*block_lenH,0.5*block_lenH,0.5*block_lenV)]

fish def run_it
local test_ = true
loop while test_ = true
command
model cycle 10000
end_command
if math.mag(gp.dis(gp_monitor)) > 4e-3
test_ = false
endif
end_loop
end
;
model save 'ini_pull'
;
=================================================================
;
; Test perpendicular bolt 90 degrees
; Change dincl_ to test other bolt angles
;
model restore 'ini_pull'
[global dincl_=90.]

;To create bolt
[global y1 = 0.5*block_lenH]
[global y2 = y1]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]

struct hybrid create by-line [bolt_beg] [bolt_end] max-length [segment_length_]

; cable properties
struct hybrid prop  cross-sectional-area [area_] young [e_] ...
grout-stiffness [grout_stiff_] grout-cohesion [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]

; dowel properties
struct hybrid prop dowel-active-length [dowel_length_] dowel-stiffness [dowel_stiffness_] ...
dowel-yield [dowel_yield_] dowel-failure-strain [dowel_strain_limit_]

[run_it]

model save 'pull-90'

program return

===============================================================================

;inclined bolt 70 degrees

model restore 'ini_pull'
[global dincl_=70.]

;To create inclined bolt
[global y1 = 0.5*block_lenH]
[global y2 = y1]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]

struct hybrid create by-line [bolt_beg] [bolt_end] max-length [segment_length_]

; cable properties
struct hybrid prop  cross-sectional-area [area_] young [e_] ...
grout-stiffness [grout_stiff_] grout-cohesion [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]

; dowel properties
struct hybrid prop dowel-active-length [dowel_length_] dowel-stiffness [dowel_stiffness_] ...
dowel-yield [dowel_yield_] dowel-failure-strain [dowel_strain_limit_]

[run_it]

model save 'pull-70'
;------------------------------------------------------------------------------

;end of file