Hi @cheng, I was trying to model isotropic (drained) compression using norsand in FLAC3D, and have two questions:
(1) The value of OCR does not seem to have any effect after a value > ~2.
(2) The resulting compression curves are different since version FLAC3D 7.00.155, including FLAC3D 9. See results below: the first from “FLAC3D 7.00.155”, and the second from latest “FLAC3D 9”. It seems to me the results are not correct after version 155.
I have enclosed the code below (“fishfunctions” is from the FLAC3D’s example):
model new
model large-strain off
fish automatic-create off
model title “Isotropic compression test”
zone create brick size 1 1 1
; — model properties —
zone cmodel assign norsand
;
[global psi = 0.1]
;
zone property density 0.01
zone property shear-reference 20.97e3 exponent 0.47 poisson 0.15
zone property c-s-1 1.2 c-s-2 0.06 c-s-3 0.0
zone property ratio-critical 1.47 hardening-0 75.0 hardening-y 400.0
zone property factor-dilatancy 3.2 factor-coupling 0.5
zone property state-parameter-initial [psi] o-c-r 1.01
;
[global p0 = -20.0]
[global K0 = 1.0]
zone initialize stress xx [K0p0] yy [K0p0] zz [p0]
;
program call ‘fishfunctions’
[ini_stress(::zone.list, “norsand”)]
;
; — histories —
history interval 100
fish history G
fish history K
fish history name ‘11’ p
fish history lnp
fish history name ‘12’ e
fish history psi_cur
zone history displacement-z position 0 0 1
fish history q
fish history eps_a1
;
; — boundary and initial conditions —
zone gridpoint fix velocity
; — loading ----
zone gridpoint ini velocity-x -1e-6 range position-x 1.0
zone gridpoint ini velocity-y -1e-6 range position-y 1.0
zone gridpoint ini velocity-z -1e-6 range position-z 1.0
model cycle 40000
history export ‘12’ vs ‘11’ table “Simulation, e-p’”
Sorry. My bad. Please see the codes below:
; — fish functions to spefici initial mean effective pressure and preconsolidation pressure
fish operator ini_stress(zp, modelName)
if zone.model(zp) = modelName then
local pp = zone.pp(zp)
zone.prop(zp,‘stress-xx-initial’) = zone.stress.xx(zp) + pp
zone.prop(zp,‘stress-yy-initial’) = zone.stress.yy(zp) + pp
zone.prop(zp,‘stress-zz-initial’) = zone.stress.zz(zp) + pp
zone.prop(zp,‘stress-xy-initial’) = zone.stress.xy(zp)
zone.prop(zp,‘stress-yz-initial’) = zone.stress.yz(zp)
zone.prop(zp,‘stress-xz-initial’) = zone.stress.xz(zp)
endif
end
;
fish define G
local p_z = zone.head
global p = -(zone.stress.xx(p_z) + zone.stress.yy(p_z) + zone.stress.zz(p_z))/3.0
global q = zone.stress.xx(p_z) - zone.stress.zz(p_z)
global lnp = math.log(p)
global e = zone.prop(p_z,‘void’)
global K = zone.prop(p_z,‘bulk’)
global G = zone.prop(p_z,‘shear’)
global psi_cur = zone.prop(p_z,‘state-parameter’)
global eps_a1 = -gp.disp.z(gp.near(1,1,1))*100. ; axial strain (%)
end
Periodically, we receive update requests either from the original developer or from clients. Regarding (1), on OCR, the model aims to keep the initial stress within the inner cap as well as the outer cap, limiting the OCR value from being too large. Regarding (2), unfortunately, there may be inconsistent results between versions due to an update that introduced upper and lower bounds to prevent unrealistically small or large state parameters. Sorry for the inconvenience. However, we have addressed this issue and have committed a fix to ensure consistent results in the upcoming update release.
Thank you, Cheng, for your quick investigation!
On OCR, I understand the theoretical reason for the limit. I think the VBA has the same, but the UDM from Shuttle did not implement this limit. I am not sure whether it is always necessary to have this limit. Or is it useful to have a switch for this function?
On (2), I am not sure whether more flexible definition of H is part of the reason. I would really like to have better control of how H varies with state parameter (or other parameters), but understand it is difficult to implement in a commercial built-in model.