Example: Shear and tension test for rockbolt crossing a joint
Problem Statement
Note
To view this project in 3DEC, use the menu command . Choose “BlockSel/ Rockbolts” and select “rockbolts.prj” to load. The data files used are shown at the end of this example.
This example simulates shearing and tension on a single joint supported by a rockbolt. This test mimics the examples for hybrid bolts described in Structural Elements.
Simple Shear Test
A simple shear test is simulated using two blocks (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 rockbolt 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.
Figure 2 shows the bolt contribution versus shear displacement. The bolt contribution is essentially the shear stress minus the frictional strength (\(\sigma_n \tan \phi\)). At about 4 mm of shear displacement, the moment limit is exceeded and plastic hinges form. At about 4.5 cm, the bolt itself yields in tension. Finally after about 5 cm of shear, the bolt hits the strain limit and ruptures.
blocks.dat
;
;Build model for hybrid bolt calibration
;
model new
fish automatic-create off
model random 10000
model large-strain on
;
fish define params
; block dimensions
global block_lenH = 0.95
global block_lenV = 2.0
global edge_length_=0.125 ; zone size
; block properties
global ymod_=40e9
global pratio_=0.25
global dens_=2500
; joint properties
global jkn_=3e11
global jks_=3e11
global jfric_=40.0
; --- rockbolt parameters ----
; cable
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.05 ; PLASTIC tensile strain limit
global segment_length_=0.1
; pile
global poiss_ = 0.2
global moi_=5e-5
global plastic_moment_=1e4
global nstiff_ = 1e8
; calculated parameters
global bolt_len=block_lenH*2.
end
[params]
=====================================================
;
;make 2 blocks
block create brick 0 [block_lenH] 0 [block_lenH] 0 [block_lenV]
block create brick [block_lenH] [2*block_lenH] 0 [block_lenH] 0 [block_lenV]
block zone generate edgelength [edge_length_]
; zone and contact properties
block zone cmodel elastic
block zone property young [ymod_] poisson [pratio_] density [dens_]
block contact jmodel assign mohr
block contact property stiffness-normal [jkn_] stiffness-shear [jks_] friction [jfric_]
block contact mat-table default prop stiffness-normal [jkn_] stiffness-shear [jks_] friction [jfric_]
;
; apply common boundary conditions
block hide range position-x 0 [block_lenH] not
block gridpoint apply velocity-z 0 range position-z 0
block hide off
;
block gridpoint apply velocity-y 0 range position-z -1000 1000
; use combined damping to stop vibrations.
block mech damp combined
model save 'blocks'
shear_test.dat
;;-------------------------------------------------------------------------------------------
;; Shear test
;;-------------------------------------------------------------------------------------------
model rest 'blocks'
; define parameters for shear loading
fish def params_shear
; boundary conditions
global normal_stress = 1.0e6
global zvel_=-0.01
; calculated values
local normal_force = normal_stress * block_lenH*block_lenV
global friction_force = normal_force*math.tan(jfric_*math.degrad)
end
[params_shear]
; boundary conditions
block face apply stress-xx [-1.0*normal_stress] range position-x 0
block face apply stress-xx [-1.*normal_stress] range position-x [block_lenH*2.]
;
block hide range position-x 0 [block_lenH]
block gridpoint group 'top' range pos-z [block_lenV]
block hide off
model solve
;
block gridpoint initialize displacement 0 0 0
block contact reset displacement
;
; 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 block.gp.list
if block.gp.group(gi) = 'top'
temp_ = temp_ - block.gp.force.reaction.z(gi)
end_if
end_loop
reaction_force = temp_
bolt_contribution = temp_ - friction_force
end
;
fish history reaction_force
fish history bolt_contribution
block history displacement-z ...
position [1.5*block_lenH] [0.5*block_lenH] [0.5*block_lenV]
model history mechanical unbalanced-maximum
;to run the test - stop at 5 cm of shear displacement
fish def run_it
local test_ = true
local gp_ = block.gp.near(1.5*block_lenH,0.5*block_lenH,0.5*block_lenV)
loop while test_ = true
command
model cycle 10000
end_command
if block.gp.dis.z(gp_) < -0.07
test_ = false
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 x1 = block_lenH-0.5*bolt_len*math.sin(dincl_*math.degrad)+0.001]
[global y1 = 0.5*block_lenH]
[global z1 = 0.5*block_lenV+0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global x2 = block_lenH+0.5*bolt_len*math.sin(dincl_*math.degrad)-0.001]
[global y2 = y1]
[global z2 = 0.5*block_lenV-0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]
struct pile create by-line [bolt_beg] [bolt_end] ...
max-length [segment_length_]
; cable properties
struct pile prop cross-sectional-area [area_] young [e_] ...
poiss [poiss_] coupling-stiffness-shear [grout_stiff_] ...
coupling-cohesion-shear [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]
; pile/rockbolt properties
struct pile prop rockbolt-flag on moi-y [moi_] moi-z [moi_] ...
moi-polar [moi_*10] plastic-moment [plastic_moment_] ...
coupling-stiffness-normal [nstiff_] coupling-cohesion-normal 1e20
;to plate both ends:
struct link attach x rigid y rigid z rigid range pos-x [bolt_beg->x]
struct link attach x rigid y rigid z rigid range pos-x [bolt_end->x]
struct mech damp combined-local
; ramp up shear load over 10000 steps
[global cyc0 = mech.cycle]
fish def ramp
ramp = (mech.cycle - cyc0)/10000.0
end
block gridpoint apply vel-z [zvel_] fish ramp range group 'top'
model cycle 10000
; re-apply load without ramp
block gridpoint apply vel-z [zvel_] range group 'top'
;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 x1 = block_lenH-0.5*bolt_len*math.sin(dincl_*math.degrad)+0.001]
[global y1 = 0.5*block_lenH]
[global z1 = 0.5*block_lenV+0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global x2 = block_lenH+0.5*bolt_len*math.sin(dincl_*math.degrad)-0.001]
[global y2 = y1]
[global z2 = 0.5*block_lenV-0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]
struct pile create by-line [bolt_beg] [bolt_end] ...
max-length [segment_length_]
; cable properties
struct pile prop cross-sectional-area [area_] young [e_] ...
poiss [poiss_] coupling-stiffness-shear [grout_stiff_] ...
coupling-cohesion-shear [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]
; pile/rockbolt properties
struct pile prop rockbolt-flag on moi-y [moi_] moi-z [moi_] ...
moi-polar [moi_*10] plastic-moment [plastic_moment_] ...
coupling-stiffness-normal [nstiff_] coupling-cohesion-normal 1e20
;to plate both ends:
struct link attach x rigid y rigid z rigid range pos-x [bolt_beg->x]
struct link attach x rigid y rigid z rigid range pos-x [bolt_end->x]
struct mech damp combined-local
; ramp up shear load over 10000 steps
[global cyc0 = mech.cycle]
fish def ramp
ramp = (mech.cycle - cyc0)/10000.0
end
block gridpoint apply vel-z [zvel_] fish ramp range group 'top'
model cycle 10000
; re-apply load without ramp
block gridpoint apply vel-z [zvel_] range group 'top'
;run the test - stop when rupture
[run_it]
model save 'shear-70'
Simple Tension Test
The same block and bolt configuration from the simple shear test is used in the tension 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.7 mm of displacement. The bolt yields in tension after 2.5 mm of pull, at which time the bolt behaves plastically and the contribution no longer increases. Fnally, the bolt ruptures at about 7.5 mm of opening.
pullout.dat
;;-------------------------------------------------------------------------------------------
;; Pull-out test
;;-------------------------------------------------------------------------------------------
model restore 'blocks'
;
; Define parameters for pullout test
[global xvel_ = 1e-2]
;
block gridpoint apply velocity-x 0 range position-x 0
;
block hide range position-x 0 [block_lenH]
block gridpoint apply velocity-z 0 range position-z 0
block gridpoint group 'right' range pos-x [block_lenH]
block hide off
;
[global max_force = 0.0]
[global bolt_contribution = 0.0]
;
fish define reaction_force
local temp_ = 0.0
loop foreach local gi block.gp.list
if block.gp.group(gi) = 'right'
temp_ = temp_ + block.gp.force.reaction.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
block history displacement-x ...
position [2*block_lenH] [0.5*block_lenH] [0.5*block_lenV]
model history mechanical unbalanced-maximum
;fish function to run the test - stop when displacement = 1 cm
[global gp_monitor = block.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(block.gp.dis(gp_monitor)) > 8e-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 x1 = block_lenH-0.5*bolt_len*math.sin(dincl_*math.degrad)+0.001]
[global y1 = 0.5*block_lenH]
[global z1 = 0.5*block_lenV+0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global x2 = block_lenH+0.5*bolt_len*math.sin(dincl_*math.degrad)-0.001]
[global y2 = y1]
[global z2 = 0.5*block_lenV-0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]
struct pile create by-line [bolt_beg] [bolt_end] ...
max-length [segment_length_]
; cable properties
struct pile prop cross-sectional-area [area_] young [e_] ...
poiss [poiss_] coupling-stiffness-shear [grout_stiff_] ...
coupling-cohesion-shear [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]
; pile/rockbolt properties
struct pile prop rockbolt-flag on moi-y [moi_] moi-z [moi_] ...
moi-polar [moi_*10] plastic-moment [plastic_moment_] ...
coupling-stiffness-normal [nstiff_] coupling-cohesion-normal 1e20
struct mech damp combined-local
; ramp up tensile load over 10000 steps
[global cyc0 = mech.cycle]
fish def ramp
ramp = (mech.cycle - cyc0)/10000.0
end
block gridpoint apply vel-x [xvel_] fish ramp range group 'right'
model cycle 10000
[run_it]
model save 'pull-90'
program return
===============================================================================
;inclined bolt 70 degrees
model restore 'ini_pull'
[global dincl_=70.]
;To create inclined bolt
[global x1 = block_lenH-0.5*bolt_len*math.sin(dincl_*math.degrad)+0.001]
[global y1 = 0.5*block_lenH]
[global z1 = 0.5*block_lenV+0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global x2 = block_lenH+0.5*bolt_len*math.sin(dincl_*math.degrad)-0.001]
[global y2 = y1]
[global z2 = 0.5*block_lenV-0.5*bolt_len*math.cos(dincl_*math.degrad)]
[global bolt_beg=vector(x1,y1,z1)]
[global bolt_end=vector(x2,y2,z2)]
struct pile create by-line [bolt_beg] [bolt_end] ...
max-length [segment_length_]
; cable properties
struct pile prop cross-sectional-area [area_] young [e_] ...
poiss [poiss_] coupling-stiffness-shear [grout_stiff_] ...
coupling-cohesion-shear [grout_strength_] ...
yield-tension [cable_yield_] tensile-failure-strain [cable_strain_limit_]
; pile/rockbolt properties
struct pile prop rockbolt-flag on moi-y [moi_] moi-z [moi_] ...
moi-polar [moi_*10] plastic-moment [plastic_moment_] ...
coupling-stiffness-normal [nstiff_] coupling-cohesion-normal 1e20
;to plate both ends:
struct link attach x rigid y rigid z rigid range pos-x [bolt_beg->x]
struct link attach x rigid y rigid z rigid range pos-x [bolt_end->x]
; ramp up tensile load over 10000 steps
[global cyc0 = mech.cycle]
fish def ramp
ramp = (mech.cycle - cyc0)/10000.0
end
block gridpoint apply vel-x [xvel_] fish ramp range group 'right'
model cycle 10000
[run_it]
model save 'pull-70'
;-------------------------------------------------------------------------------------------
;end of file
Was this helpful? ... | 3DEC © 2019, Itasca | Updated: Feb 25, 2024 |