Shear Pull-Tests for a Hybrid Bolt in PFC3D

Note

To view this project in PFC3D, use the menu command Help ► Examples…. Choose “rblocksel/hybrid/shear_pull” and select “shear_pull_pfc3d.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.

../../../../../_images/blocks-shear4.png

Figure 1: Zone blocks and bolt configuration in the shear test. Model is shown after bolt rupture.

../../../../../_images/boltcont_shear4.png

Figure 2: Bolt contribution in the shear test.

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 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
model domain extent [-2.0*block_lenH] [4.0*block_lenH] ...
                    [-1.0*block_lenH] [2.0*block_lenH] ...
                    [-1.0*block_lenV] [2.0*block_lenV] ...
             
rblock create box 0.0  [2.0*block_lenH] ...
                  0.0  [block_lenH] ...
                  0.0  [block_lenV] ...
                    
rblock cut plane point [block_lenH] [block_lenH/2] [block_lenV/2] normal 1 0 0 radius [block_lenV]

;rblock cut plane point [block_lenH/2] [block_lenH/2] [block_lenV/2] normal 1 0 0 radius [block_lenV]
;rblock cut plane point [3*block_lenH/2] [block_lenH/2] [block_lenV/2] normal 1 0 0 radius [block_lenV]

rblock group 'left' slot 'side' range position-x 0.0 [block_lenH]
rblock group 'right' slot 'side' range position-x 0.0 [block_lenH] not

rblock hide range group 'right'
rblock facet group 'joint-left' slot 'joint' range pos-x [block_lenH] by rblock-vertex
rblock hide off

rblock hide range group 'left'
rblock facet group 'joint-right' slot 'joint' range pos-x [block_lenH] by rblock-vertex
rblock hide off

rblock facet group '-x' slot 'boundary' range position-x 0.0 by rblock-vertex
rblock facet group '+x' slot 'boundary' range position-x [block_lenH*2.0] by rblock-vertex
rblock facet group '-y' slot 'boundary' range position-y 0.0 by rblock-vertex
rblock facet group '+y' slot 'boundary' range position-y [block_lenH*2.0] by rblock-vertex
rblock facet group '-z' slot 'boundary' range position-z 0.0 by rblock-vertex
rblock facet group '+z' slot 'boundary' range position-z [block_lenV] by rblock-vertex


; Scale the rigid blocks so that they overlap initially. This
; is important as the contact position for the bonds is based 
; on the original overlap volume. This contact position is 
; incrementally updated when bonded. 
rblock scale relative 1.01 keep-inertial

rblock attribute damp 0.7 density [dens_]

; Use the contact area
[global facetTotal = 0.05]
rblock contact-resolution update-area true accumulate-stress true ...
                          facet-total [facetTotal]

; Specify the springnetwork model properties. Initially
; all bonded contacts have infinite strength. This is 
; useful when equilibrating the model. 
contact cmat default model springnetwork ...
                        method compute-stiffness emod [ymod_] poisson [pratio_] ...
                        property fric [math.tan(jfric_*math.degrad)] ...
                                 sn_ten 1e100 sn_coh 1e100 

model clean
contact method area
contact method bond range group 'left' match 2 
contact method bond range group 'right' match 2

; apply common boundary conditions 
rblock hide range position-x 0 [block_lenH] not
rblock fix velocity-z range group '-z' by rblock-facet
rblock hide off
;
model save 'blocks'

shear_test.dat

;;-----------------------------------------------------------------------------
;;		Shear test
;;-----------------------------------------------------------------------------
model restore 'blocks'

; define parameters for shear loading
fish define params_shear
  ; boundary conditions
  global normal_stress = 1.0e6
  global zvel_=-2e-7
end
[params_shear]

; boundary conditions
rblock facet apply stress-normal [-1.*normal_stress] range group '-x' by rblock-facet
rblock facet apply stress-normal [-1.*normal_stress] range group '+x' by rblock-facet
;
rblock fix spin
model mechanical timestep scale
model solve
;
rblock attribute displacement 0 0 0


; apply shear load

rblock attribute velocity-z 0.0 range group '-z' by rblock-facet
rblock fix velocity-z range group '-z' by rblock-facet
rblock attribute velocity-z [zvel_] range group 'right'
;
; Function to calculate bolt contribution to resisting shear load
[global monitor = rblock.near(2*block_lenH,0.5*block_lenH,0.5*block_lenV)]
[global max_force = 0.0]
[global bolt_contribution = 0.0]
[global cpnt = contact.find('rblock-rblock',2,3)]
fish define reaction_force
  local temp_ = rblock.force.unbal.z(monitor)
  reaction_force = temp_
  global friction_force = math.abs(contact.force.global(cpnt)->z) 
  global bolt_contribution =  temp_ - friction_force
end
;
fish history name 'reaction_force' reaction_force
fish history name 'bolt_contribution' bolt_contribution

rblock history name 'zdisp' displacement-z ...
                             position [1.5*block_lenH] [0.5*block_lenH] [0.5*block_lenV]
model history name 'unbal-max' 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 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 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 name 'dowel-strain' dowel-strain pos 0 0 0
struct hybrid history name 'dowel-force'  dowel-force 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 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 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 name 'dowel-strain' dowel-strain pos 0 0 0
struct hybrid history name 'dowel-force'  dowel-force pos 0 0 0
;run the test - stop when rupture
model cycle 160000

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.

../../../../../_images/blocks-pullout3.png

Figure 3: Zone blocks and bolt configuration in the pullout test. Model is shown after bolt pullout.

../../../../../_images/boltcont_pull3.png

Figure 4: Bolt contribution in the pullout test.

pullout.dat

;;-----------------------------------------------------------------------------
;;		Pull-out test
;;-----------------------------------------------------------------------------
model restore 'blocks'
;
; Define parameters for pullout test
[global xvel_ = 2e-8]
;
rblock fix velocity-x range group '-x' by rblock-facet
;
rblock group 'pull' range group '+x' by rblock-facet
rblock fix velocity-x range group 'pull'
rblock attribute velocity-x [xvel_] range group 'pull'
;
[global max_force = 0.0]
[global bolt_contribution = 0.0]
;
fish define reaction_force
  local temp_ = 0.0
  loop foreach local gi rblock.group.list('pull')
    temp_ = temp_ + rblock.force.app.x(gi)
  end_loop
  reaction_force = math.abs(temp_)
  bolt_contribution =  math.abs(temp_); - friction_force    
end
;
fish history reaction_force
fish history bolt_contribution
rblock 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 monitor = rblock.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(rblock.dis(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 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)]

;[segment_length_ = 0.5*block_lenH]
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_]
  
model mechanical timestep scale 
[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 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