本文摘要(由AI生成):
这篇文章主要介绍了二手交易平台上一个关于边坡稳定性计算的题目解析,文章针对题目中存在的疑问提出了六个假定,并提供了详细的计算思路和代码。解析过程中先定义了岩石的力学参数和初始条件,然后进行了五个部分的开挖。在每个开挖部分,将开挖区域分配为空模型,计算应力卸载和参数降低。获得每个区域在开挖前后的最小应力值,计算 lambda 值。最后,求解开挖后的模型,根据 lambda 值调整每个区域的杨氏模量、内聚力和摩擦角。
1.问题来源
问题来源自某二手交易平台,价格500元,令人不禁感叹新手的钱真好赚。
图1-1 问题来源
代码思路如下所示:
图1-2 计算思路
这个题目实现起来很简单,但单就这一张图我还是有以下六个疑问:
(1)应力卸荷量lambda是否应该取绝对值?
(2)应力卸荷量lambda应该取哪个应力分量来进行计算?
(3)多次开挖计算时,初始应力值是自重下的应力分类还是上一开挖步的应力分量?
(4)开挖卸荷影响区划分标准是否有统一准则?
(5)材料参数降低百分比在什么时候取界限值?
(6)应对哪些材料参数进行折减?
由于我对边坡知之甚少,故上述六个问题留待相关研究方向的读者解决。针对以上六个疑问,本文采取以下六个假定以演示思路:
(1)对应力卸荷量lambda取绝对值;
(2)选取最大压应力进行计算;
(3)初始应力值取自重条件下的最大压应力值;
(4)开挖卸荷影响区依照图中标准进行划分;
(5)材料参数折减值取中位数;
(6)对弹性模量、粘聚力、内摩擦角进行折减。
3.代码
建立长×宽×高=30m×1m×15m的模型,分组为rock和cut,模型如下所示。
图3-1 计算模型
计算思路为:对cut分组进行5次开挖,每次开挖后计算其相对于未开挖前的应力卸荷量,判定卸荷程度并进行相应参数折减,而后开挖下一步。逐步开挖代码如下:
model new
model largestrain off
;mechnical parameters of rock
[ ] ;density
[ ] ;young
[ ] ; poisson
[ ] ;friction
[ ] ;cohesion
;Classification criteria
[ ];strong unloading area
[ ];slight unloading area
;reduction coefficient
[ ]
[ ]
[ ]
;modelling
zone create brick size 30 1 15 group 'rock'
zone group 'cut' range position-x 10 20 position-z 10 15
;cmodel & parameters
zone cmodel assign mohr-coulomb
zone property young [E] poisson [v] cohesion [c] friction [f] density [dens]
;boundary conditions
zone face skin
zone face apply velocity-normal 0 range group 'west' or 'east'
zone face apply velocity-normal 0 range group 'south' or 'north'
zone face apply velocity-normal 0 range group 'bottom'
;settings
model gravity 9.81
zone initialize-stresses
;solve
model solve
;clear all displacement & velocity
zone gridpoint initialize displacement-x 0
zone gridpoint initialize displacement-y 0
zone gridpoint initialize displacement-z 0
zone gridpoint initialize velocity-x 0
zone gridpoint initialize velocity-y 0
zone gridpoint initialize velocity-z 0
model save '1-ini'
;get initial maximum compressive stress
model restore '1-ini.sav'
fish def _getPrin0
count = 0
loop foreach z zone.list
count += 1
table.x(1,count) = zone.id(z)
table.y(1,count) = zone.stress.min(z)
endloop
end
@_getPrin0
;excavation 1st section
zone cmodel assign null range group 'cut' position-z 14 15
model solve
model save 'cut-1'
;get lambda & reduction mechanical parameters
fish def _getLambda
count = 0
loop foreach z zone.list
count += 1
if table.x(1,count) = zone.id(z)
;lambda = (table.y(1,count) - zone.stress.min(z))/table.y(1,count)
lambda = math.abs((table.y(1,count) - zone.stress.min(z))/table.y(1,count))
if zone.model(z)
if lambda > C1
zone.prop(z,'young') = E*(1-coe_1)
zone.prop(z,'cohesion') = c*(1-coe_1)
zone.prop(z,'friction') = f*(1-coe_1)
else if lambda < C3
zone.prop(z,'young') = E*(1-coe_3)
zone.prop(z,'cohesion') = c*(1-coe_3)
zone.prop(z,'friction') = f*(1-coe_3)
else
zone.prop(z,'young') = E*(1-coe_2)
zone.prop(z,'cohesion') = c*(1-coe_2)
zone.prop(z,'friction') = f*(1-coe_2)
endif
zone.extra(z,1) = lambda
endif
endif
endloop
end
@_getLambda
;excavation 2nd section
zone cmodel assign null range group 'cut' position-z 13 14
model solve
model save 'cut-2'
;get lambda & reduction mechanical parameters
fish def _getLambda
count = 0
loop foreach z zone.list
count += 1
if table.x(1,count) = zone.id(z)
;lambda = (table.y(1,count) - zone.stress.min(z))/table.y(1,count)
lambda = math.abs((table.y(1,count) - zone.stress.min(z))/table.y(1,count))
if zone.model(z)
if lambda > C1
zone.prop(z,'young') = E*(1-coe_1)
zone.prop(z,'cohesion') = c*(1-coe_1)
zone.prop(z,'friction') = f*(1-coe_1)
else if lambda < C3
zone.prop(z,'young') = E*(1-coe_3)
zone.prop(z,'cohesion') = c*(1-coe_3)
zone.prop(z,'friction') = f*(1-coe_3)
else
zone.prop(z,'young') = E*(1-coe_2)
zone.prop(z,'cohesion') = c*(1-coe_2)
zone.prop(z,'friction') = f*(1-coe_2)
endif
zone.extra(z,1) = lambda
endif
endif
endloop
end
@_getLambda
;excavation 3rd section
zone cmodel assign null range group 'cut' position-z 12 13
model solve
model save 'cut-3'
;get lambda & reduction mechanical parameters
fish def _getLambda
count = 0
loop foreach z zone.list
count += 1
if table.x(1,count) = zone.id(z)
;lambda = (table.y(1,count) - zone.stress.min(z))/table.y(1,count)
lambda = math.abs((table.y(1,count) - zone.stress.min(z))/table.y(1,count))
if zone.model(z)
if lambda > C1
zone.prop(z,'young') = E*(1-coe_1)
zone.prop(z,'cohesion') = c*(1-coe_1)
zone.prop(z,'friction') = f*(1-coe_1)
else if lambda < C3
zone.prop(z,'young') = E*(1-coe_3)
zone.prop(z,'cohesion') = c*(1-coe_3)
zone.prop(z,'friction') = f*(1-coe_3)
else
zone.prop(z,'young') = E*(1-coe_2)
zone.prop(z,'cohesion') = c*(1-coe_2)
zone.prop(z,'friction') = f*(1-coe_2)
endif
zone.extra(z,1) = lambda
endif
endif
endloop
end
@_getLambda
;excavation 4th section
zone cmodel assign null range group 'cut' position-z 11 12
model solve
model save 'cut-4'
;get lambda & reduction mechanical parameters
fish def _getLambda
count = 0
loop foreach z zone.list
count += 1
if table.x(1,count) = zone.id(z)
;lambda = (table.y(1,count) - zone.stress.min(z))/table.y(1,count)
lambda = math.abs((table.y(1,count) - zone.stress.min(z))/table.y(1,count))
if zone.model(z)
if lambda > C1
zone.prop(z,'young') = E*(1-coe_1)
zone.prop(z,'cohesion') = c*(1-coe_1)
zone.prop(z,'friction') = f*(1-coe_1)
else if lambda < C3
zone.prop(z,'young') = E*(1-coe_3)
zone.prop(z,'cohesion') = c*(1-coe_3)
zone.prop(z,'friction') = f*(1-coe_3)
else
zone.prop(z,'young') = E*(1-coe_2)
zone.prop(z,'cohesion') = c*(1-coe_2)
zone.prop(z,'friction') = f*(1-coe_2)
endif
zone.extra(z,1) = lambda
endif
endif
endloop
end
@_getLambda
;excavation 5th section
zone cmodel assign null range group 'cut' position-z 10 11
model solve
model save 'cut-5'
计算结果如下:
上述过程也可在fish函数中用loop循环实现自动卸荷计算并折减参数后开挖,从而节省代码量。运行结果如下:
图3-4 应力卸荷量(绝对值,自动折减开挖)
图3-4~图3-5与图3-2~图3-3完全一致。验证了以下自动折减开挖代码的正确性: