Brazilian Test (FLAC3D)

Problem Statement

Note

The project file for this example is available to be viewed/run in FLAC3D.[1] The main data files used are shown at the end of this example. The remaining data files can be found in the project.

The Brazilian test (see Goodman 1980, for example) is used to estimate the tensile strength of rock and concrete. A disk or cylinder of the material is loaded diametrically between the platens of a testing machine. Failure is usually by splitting across the loaded diameter. The Brazilian tensile strength is estimated from the test result by reporting the horizontal stress, \(σ_t\) (i.e., the stress perpendicular to the loaded diameter along the center part of the specimen), that corresponds to the applied compression load. The relation between \(σ_t\) and the applied load can be determined approximately from an analytical expression, assuming that the material is homogeneous, linearly elastic, and isotropic. This verification test compares the FLAC3D calculation to this solution.

The Brazilian test is only valid if the primary fracture initiates from the center of the specimen and spreads along the loaded diameter (which dictates the configuration of the numerical grid). The FLAC3D analysis can also study the test conditions that affect fracture initiation. In this example, the influence of the size of the loading area of the platen is evaluated. The parameters describing the problem conditions are shown in Figure 1. The loading area is defined by \(2α\), which is the angular distance over which the applied force, \(F\), is assumed to be distributed radially. \(r_o\) is the radius of the specimens.

../../../../../_images/brazilianTest_configuration.png

Figure 1: The Brazilian test configuration.

Analytical Solution

The stress component normal to the loading diameter, \(σ_θ\), and the stress component along the loading diameter, \(σ_r\), are given by the expressions (see Vutukuri et al. 1974).

\[\begin{split}\begin{align} \sigma_{\theta } =& + \frac{F}{\pi r_o t \alpha}\left [\frac{ \left( 1 - \left(\frac{r}{r_o}\right)^2 \right) \sin 2 \alpha}{1 -2\left(\frac{r}{r_o}\right)^2 \cos 2\alpha + \left(\frac{r}{r_o}\right)^4} - \tan^{-1}\left(\frac{1 + \left(\frac{r}{r_o}\right)^2}{1- \left(\frac{r}{r_o}\right)^2} \tan\alpha \right) \right ] \\ \\ \sigma_r =& - \frac{F}{\pi r_o t \alpha}\left [\frac{ \left( 1 - \left(\frac{r}{r_o}\right)^2 \right) \sin 2 \alpha}{1 -2\left(\frac{r}{r_o}\right)^2 \cos 2\alpha + \left(\frac{r}{r_o}\right)^4} + \tan^{-1}\left(\frac{1 + \left(\frac{r}{r_o}\right)^2}{1- \left(\frac{r}{r_o}\right)^2} \tan\alpha \right) \right ] \end{align}\end{split}\]

where \(t\) is the thickness of the cylindrical specimen and \(r\) is the distance from the center of the specimen. (Compressive stress is negative.)

The value of \(σ_θ\) at the center of the cylinder is

\[\sigma^c_\theta = \frac{F}{\pi r_o t} \left[ \frac{\sin 2\alpha}{\alpha} -1 \right] \approx \frac{F}{\pi r_o t}\]

This approximation is used to calculate the tensile strength, \(σ_t\). It is assumed that failure is independent of stresses that develop normal to the disk face and is a plane-strain solution.

FLAC3D Model

The model for the FLAC3D analysis of the Brazilian test represents a cylindrical specimen with a radius, \(r_o\), of 20 m and a thickness, \(t\) , of 0.2 m. Only the top half of the cylinder is modeled because of the symmetry of the Brazilian test. Figure Figure #btf3d-grid shows the FLAC3D grid. The strain-softening material model is used to simulate the behavior of the specimen. The elastic material properties and mass density assigned to the specimen are

density (\(ρ\))

2500 kg/m3

shear modulus (\(G\))

1.0 GPa

bulk modulus (\(K\))

3.0 GPa

The strength properties assigned to the strain-softening model are

cohesion (\(c\))

3.0 MPa

friction angle (\(φ\))

45

dilation angle (\(ψ\))

0

tensile strength (\(σ_t\))

1.0 MPa

The material is considered brittle with a total loss of cohesion at a plastic shear strain of \(10^{(-6)}\), and a total loss of tensile strength at a plastic tensile strain of \(10^{(-6)}\).

../../../../../_images/brazilianTest_geometry1.png

Figure 2: FLAC3D grid for Brazilian test.

The zone face apply stress-normal command is used to apply the diametrical load as a normal stress. The boundary over which the pressure is applied is selected to correspond to the loading area defined by 2α. Two cases of loading area are studied: Case 1 corresponds to \(2α ≈13^°\); and Case 2 corresponds to \(2α ≈5^°\). The applied normal stress increases at a rate of 1.0 kPa per step. The load is increased to a level that is a few steps below the load at which failure initiates. The boundary conditions and applied forces for Case 1 at a normal stress of 15.3 MPa are shown in Figure 3. A FISH function, load, calculates the applied load, \(F\), and the horizontal stress, \(σ_θ^c\), at the center of the specimen. The analytical expressions are input in Tables 11 and 12 with FISH function braz_analytical, and the FLAC3D results for \(σ_r\) and \(σ_θ\) through the specimen are stored in Tables 21 and 22 via FISH function braz_num, for comparison purposes.

../../../../../_images/brazilianTest_case1-applied-load1.png

Figure 3: Boundary conditions and applied load.

Results

The FLAC3D values for \(σ_r\) and \(σ_θ\) along the loading diameter are compared to the analytical solution in Figure 4 for Case 1 and in Figure 5 for Case 2. In both cases the agreement is very good. The failure mode is very different for each case. In Case 1, for the wider loading area, tensile failure initiates in the center of the cylinder and propagates upward, as shown in Figure 6. In Case 2, shear failure initiates first at the base of the applied load, and then shear and tensile failure propagate downward toward the center of the specimen. This is shown in Figure 7. For further discussion on the influence of loading area on the mode of failure, see Vutukuri et al. (1974).

../../../../../_images/brazilianTest_case1-stress-comparison1.png

Figure 4: Comparison of \(σ_r\) and \(σ_θ\) for Case 1.

../../../../../_images/brazilianTest_case2-stress-comparison1.png

Figure 5: Comparison of \(σ_r\) and \(σ_θ\) for Case 2.

../../../../../_images/brazilianTest_case1-plasticity-indicators1.png

Figure 6: Initial plasticity state for Case 1.

../../../../../_images/brazilianTest_case2-plasticity-indicators1.png

Figure 7: Initial plasticity state for Case 2.

References

Goodman, R. E. Introduction to Rock Mechanics. New York: John Wiley & Sons (1980).

Vutukuri, V. S., R. D. Lama and S. S. Saluja. Handbook on Mechanical Properties of Rocks, Vol. 1. Clausthal, Germany: Trans Tech. (1974).

Data Files

case1.dat

;------------------------------------------------------------------------------
;The Brazilian test is used to estimate the tensile strength of rock and 
;concrete. A disk or cylinder of the material is loaded diametrically between
;the platens of a testing machine.The boundary over which the pressure is 
;applied is selected to correspond to the loading area defined by 2α.
;Two cases of loading area are studied: 

;Case 1 corresponds to 2α ≈ 13 degree 
;------------------------------------------------------------------------------

model new
model large-strain off
model configure
; Create zones
program call 'grid.dat'
zone generate from-sketch
; Assign constitutive model and properties 
zone cmodel assign strain-softening
zone property bulk 3.e9 shear 1.e9 density 2500 ...
              friction 45 cohesion 3.e6 tension 1.e6 dilation 5
zone property table-cohesion '1' table-tension '2'
table '1' add (0.0,3.e6),(1.e-6,0),(1.0,0.0)
table '2' add (0.0,1.0e6),(1.e-6,0),(1.0,0.0)
zone face skin
; Boundary Conditions
zone gridpoint fix velocity-z range group 'Bottom'
zone gridpoint fix velocity-y
[pnt = list(gp.list)(gp.isgroup(::gp.list,"Bottom"))]

;define angle
fish define parm_case1
    global alfa = math.atan(2.2641/19.8714)
    global ang_factor = math.sin(2.0*alfa)/alfa-1.0
end
[parm_case1]

;define load
fish define load
    local sum = -1.0*list.sum(gp.force.unbal(::pnt)->z)
    load = sum
    global sigma_t = sum*ang_factor/(20.0*math.pi)
end

; Analytical solution
fish define braz_analytical
    local rad0 = 20.0
    local app_str = float(global.step) * 1000.0
    local app_for = 2.0 * app_str * rad0 * alfa    
    loop local jj (1,40)
        local rad = 0.25 + (float(jj-1) * 0.5)
        local radrat = rad / rad0
        local for_den = math.pi * rad0 * alfa
        local t1_t = (1.0 - (radrat)^2) * math.sin (2.0 * alfa)
        local t1_b = 1.0 - (2.0 * (radrat)^2 * math.cos(2.0*alfa)) + (radrat)^4
        local t2_t = (1.0 + (radrat)^2) / (1.0 - (radrat)^2)
        local t2_b =  math.tan(alfa)
        local t2_tb = t2_t * t2_b
        local t2   = math.atan(t2_tb)
        local sigma_t =   (app_for / for_den) * ((t1_t / t1_b) - t2)
        local sigma_r = - (app_for / for_den) * ((t1_t / t1_b) + t2)
        table.x('11',jj) = rad
        table.y('11',jj) = sigma_t
        table.x('12',jj) = rad
        table.y('12',jj) = sigma_r
    end_loop
end

;Numerical results from FLAC2D
fish define braz_num 
    zone.field.name = 'stress-xx'
    zone.field.method.name = 'poly'
    zone.field.init
    loop local jj (1,40)
        local rad = 0.25 + (float(jj-1) * 0.5)
        table.x('21',jj) = rad
        table.y('21',jj) = zone.field.get(0,0.1,rad)
    end_loop
    
    zone.field.name = 'stress-zz'
    zone.field.method.name = 'poly'
    zone.field.init
    loop jj (1,40)
        rad = 0.25 + (float(jj-1) * 0.5)
        table.x('22',jj) = rad
        table.y('22',jj) = zone.field.get(0,0.1,rad)
    end_loop
end

;define loading ramp
fish define loading_ramp
    loading_ramp= global.step
end

zone face apply stress-normal -1.0e3 fish loading_ramp ...
                range position-z 19.870 20
history interval 10
model history mechanical unbalanced-maximum
zone history stress quantity xx position (-0.496,0.0,0.0)
zone history stress quantity yy position (-0.496,0.0,0.0)
zone history stress quantity xx position (-0.496,0.0,19.5)
zone history stress quantity yy position (-0.496,0.0,19.5)
zone history stress quantity xx position (-0.09,0.0,0.01)
fish history load
fish history sigma_t
fish history loading_ramp
model large-strain off
model step 14000
[braz_analytical]
[braz_num]
model save 'case1'
model step 1200
model save 'case1f'

case2.dat

;------------------------------------------------------------------------------
;The Brazilian test is used to estimate the tensile strength of rock and 
;concrete. A disk or cylinder of the material is loaded diametrically between
;the platens of a testing machine.The boundary over which the pressure is 
;applied is selected to correspond to the loading area defined by 2α.
;Two cases of loading area are studied: 

;Case 2 corresponds to 2α ≈ 5 degree 
;------------------------------------------------------------------------------

model new
model large-strain off
model configure
; Create zones
program call 'grid.dat'
zone generate from-sketch
; Assign constitutive model and properties 
zone cmodel assign strain-softening
zone property bulk 3.e9 shear 1.e9 density 2500 ...
              friction 45 cohesion 3.e6 tension 1.e6 dilation 5
zone property table-cohesion '1' table-tension '2'
table '1' add (0.0,3.e6),(1.e-6,0),(1.0,0.0)
table '2' add (0.0,1.0e6),(1.e-6,0),(1.0,0.0)
zone face skin
; Boundary Conditions
zone gridpoint fix velocity-z range group 'Bottom'
zone gridpoint fix velocity-y
[pnt = list(gp.list)(gp.isgroup(::gp.list,"Bottom"))]

;define angle
fish define parm_case2
    global alfa=math.atan(0.87239/19.981)
    global ang_factor=math.sin(2.0*alfa)/alfa-1.0
end
[parm_case2]

;define load
fish define load
    local sum = -1.0*list.sum(gp.force.unbal(::pnt)->z)
    load = sum
    global sigma_t=sum*ang_factor/(20.0*math.pi)
end

; Analytic solution
fish define braz_analytical
    local rad0 = 20.0
    local app_str = float(global.step) * 1000.0
    local app_for = 2.0 * app_str * rad0 * alfa        
    loop local jj (1,40)
        local rad = 0.25 + (float(jj-1) * 0.5)
        local radrat = rad / rad0
        local for_den = math.pi * rad0 * alfa
        local t1_t = (1.0 - (radrat)^2) * math.sin (2.0 * alfa)
        local t1_b = 1.0 - (2.0 * (radrat)^2 * math.cos(2.0*alfa)) + (radrat)^4
        local t2_t = (1.0 + (radrat)^2) / (1.0 - (radrat)^2)
        local t2_b =  math.tan(alfa)
        local t2_tb = t2_t * t2_b
        local t2   = math.atan(t2_tb)
        local sigma_t =   (app_for / for_den) * ((t1_t / t1_b) - t2)
        local sigma_r = - (app_for / for_den) * ((t1_t / t1_b) + t2)
        table.x('11',jj) = rad
        table.y('11',jj) = sigma_t
        table.x('12',jj) = rad
        table.y('12',jj) = sigma_r
    end_loop
end

;Numerical results from FLAC2D
fish define braz_num
    zone.field.name = 'stress-xx'
    zone.field.method.name = 'poly'
    zone.field.init
    loop local jj (1,40)
        local rad = 0.25 + (float(jj-1) * 0.5)
        table.x('21',jj) = rad
        table.y('21',jj) = zone.field.get(0,0.1,rad)
    end_loop
    
    zone.field.name = 'stress-zz'
    zone.field.method.name = 'poly'
    zone.field.init
    loop jj (1,40)
        rad = 0.25 + (float(jj-1) * 0.5)
        table.x('22',jj) = rad
        table.y('22',jj) = zone.field.get(0,0.1,rad)
    end_loop
end

;define loading ramp
fish define loading_ramp
    loading_ramp= global.step
end

zone face apply stress-normal -1.0e3 fish loading_ramp ...
                range position-z 19.981 20
history interval 10
model history mechanical unbalanced-maximum
zone history stress quantity xx position (-0.496,0.0,0.0)
zone history stress quantity yy position (-0.496,0.0,0.0)
zone history stress quantity xx position (-0.496,0.0,19.5)
zone history stress quantity yy position (-0.496,0.0,19.5)
zone history stress quantity xx position (-0.09,0.0,0.01)
fish history load
fish history sigma_t
fish history loading_ramp
model large-strain off
model step 20000
[braz_analytical]
[braz_num]
model save 'case2'
model step 2000
model save 'case2f'