Cyclic Undrained DSS Tests with P2PSand Model


To view this project in FLAC3D, use the menu command Help ‣ Examples…. The main data files used are shown at the end of this example. The remaining data files can be found in the project.

One-zone numerical tests of undrained cyclic direct simple shear (DSS) loading responses are performed. All these tests are starting from an initial effective vertical stress (\(\sigma^{\prime}_{v0}\)) along z-axis at 100 kPa (around 1 atm), \(K_0=0.5\), and zero initial static shear stresses. All parameters are with the default parameters except the initial relative densities are different. Pore-pressure in the zone is allowed for building-up. The out-of-plane (alone y-axis) strains are restricted. The degrees-of freedom at the zone top are attached so that all grid points at the top have the same displacements to satisfy the DSS conditions. The gridpoints at the zone top are velocity-controlled. Once the shear stress (\(\tau\)) amplitude reaches a certain value (\(CSR \times \sigma^{\prime}_{v0}\)), the velocities of gridpoints at the zone top will be reverted. In this example, the parameter study is performed by a Python-based master file.

The numerical results of undrained cyclic DSS loading responses with the relative density at \(D_r\) = 0.3, 0.5 and 0.7, are illustrated in Figure 1, 2 and 3, to represent relative loose, median dense and dense sands, respectively. In each of the figures, the top sub-figure is plotting \(\sigma^{\prime}_v/\sigma^{\prime}_{v0}\) versus \(\tau_{xz}/\sigma^{\prime}_{v0}\), the center sub-figure is plotting \(\sigma^{\prime}_v/\sigma^{\prime}_{v0}\) versus \(\gamma\), and the bottom sub-figure is plotting \(R_u\) versus \(\gamma\). All illustrated responses reach about \(\gamma = 3\%\) (S.A.) shear strain with the fitted CSR values at approximately 15 cycles. The shear stress - shear strain responses illustrate shear strain progresses even after the excess pore pressure ratio (\(R_u\)) reaches 99%.

For relatively loose sands as shown in Figure 1, the shear strain increases to a very small value at the first several cycles. After dilatancy surface has been hit, the shear strain dramatically increases to around 3% \(\sigma^{\prime}_v\) is close to 0, and \(R_u\) is close to 1, merely after a couple of extra cycles. For relative dense sands as shown in Figure 3, the shear strain increases approximately in each cycle, rather than just the last few cycles as seen in the relatively loose sands. The median dense sands (Figure 2) presents intermediate behaviors as expected.


Figure 1: Undrained cyclic DSS loading response for \(D_r\) = 0.3.


Figure 2: Undrained cyclic DSS loading response for \(D_r\) = 0.5.


Figure 3: Undrained cyclic DSS loading response for \(D_r\) = 0.7.

The trend of the simulated results for sands from loose to dense state is consistent to the general observations: At the same other conditions, a denser sand have a higher CSR value. As the relative density is increasing, the deformation mode is transferring from liquefaction flow to cyclic mobility. Stress-strain loops for loose sands contain flat segments, a phenomenon term as “neutral phase”, where little or small shear stiffness develops during deformation; stress-strain loops for dense sands have no-zero sloping segments indicating significantly higher shear resistance.

The results by P2PSand model are compared with the empirical curves by Youd et al (2001) and Idriss and Bounlanger (2008) in Figure 4. The relation of \((N_1)_{60} = 46D_r^2\) is used.


Figure 4: CRR vs. \((N_1)_{60}\).

Data File


;model new
model large-strain off
model configure dynamic fluid
model fluid active off
zone dynamic active off
zone delete

program call 'input'
zone create brick size (1,1,1)
; assign constitutive model
zone cmodel assign p2psand

;;; initial conditions
zone initialize stress-zz [-Sv0]
zone initialize stress-xx [-Sv0*K0]
zone initialize stress-yy [-Sv0*K0]

;;; material properties
zone property density [rho_d] pressure-reference [Patm] factor-cut 0.01 
;;; input equivalent relative-density-initial corresponding to field condition
zone property relative-density-initial [dr0]
;;; or directly input (N1)60 in field condition
;zone property n-1-60 [46.0*dr0*dr0]
;;; initial stresses should be input as properties when p2psand model
;;; is first assigned
fish operator ini_stress(z, modelname)
    if zone.model(z) == modelname then
        local pp = zone.pp(z)
        zone.prop(z,'stress-xx-initial') = zone.stress.xx(z) + pp
        zone.prop(z,'stress-yy-initial') = zone.stress.yy(z) + pp
        zone.prop(z,'stress-zz-initial') = zone.stress.zz(z) + pp
        zone.prop(z,'stress-xy-initial') = zone.stress.xy(z)
        zone.prop(z,'stress-yz-initial') = zone.stress.yz(z)
        zone.prop(z,'stress-xz-initial') = zone.stress.xz(z)
[ini_stress(::zone.list, 'p2psand')]

;;; assign water constitutive model
zone fluid cmodel assign isotropic
zone fluid property porosity [poro]
zone initialize fluid-density [dw]
zone gridpoint initialize fluid-modulus 0.0

;;; boundary conditions
zone gridpoint fix velocity-y
zone gridpoint fix velocity range position-z 0
zone attach gridpointid 4 to-gridpointid 8 snap off
zone attach gridpointid 6 to-gridpointid 8 snap off
zone attach gridpointid 7 to-gridpointid 8 snap off

;;; apply conditions
zone face apply stress-zz [-Sv0] range position-z 1.0

zone dynamic active on
model dynamic time-total 0
zone gridpoint initialize fluid-modulus [Kw]
zone gridpoint initialize fluid-tension -1e20
[global zptr1 = zone.find(1)]
[global gptr1 = gp.near(1,1,1)]
fish define ssx
    local pp1 = zone.pp(zptr1)
    global sxx = zone.stress.xx(zptr1) + pp1
    global syy = zone.stress.yy(zptr1) + pp1
    global szz = zone.stress.zz(zptr1) + pp1
    global sxz = zone.stress.xz(zptr1)
    global rup = (p0 + (sxx+syy+szz)/3.0)/p0
    global ssx = gp.disp.x(gptr1)
zone dynamic damping rayleigh 0.002 1
model dynamic timestep fix 4.0e-5
history interval 25
model history dynamic time-total
fish history ssx
fish history sxz
fish history szz
fish history rup
zone gridpoint fix velocity-x [rate] range position-z 1
fish define toThisShearStrain
    if math.abs(ssx) < ssv
        tothisShearStrain = false
        toThisShearStrain = true
fish define cyclic
    if zone.stress.xz(zptr1) > csr*Sv0 then
            zone gridpoint fix velocity-x [-rate] range position-z 1
    else if zone.stress.xz(zptr1) < -csr*Sv0 then
            zone gridpoint fix velocity-x [ rate] range position-z 1
model solve dynamic time-total 2000 fish-halt toThisShearStrain
history export '1' '2' '3' '4' '5' file [txtfile] truncate
model save [savefile]