在③群中,有小伙伴提出了如下问题:
图1-1 问题来源
基于以上背景,本文对FLAC3D计算结果的对称复 制进行了讨论,其中计算案例来自《厚壁圆筒问题径向、切向应力求解及Extra云图显示》。
案例背景
厚壁圆筒问题径向、切向应力求解及Extra云图显示
2.1 初始计算
在《厚壁圆筒问题径向、切向应力求解及Extra云图显示》一文中,我采取建立完整圆筒模型进行计算。在本文中,我仅建立1/4圆环进行计算,并将结算结果对称复 制为整个圆环。
图2-1 计算模型
计算模型位移、径向应力、切向应力代码如下:
import itasca as it
false")
# 模型参数
r1 = 50 # 内半径/mm
r2 = 100 # 外半径/mm
th = 5 # 轴向厚度/mm
s_r = 30 # 径向网格数量
s_th = 1 # 轴向网格数量
s_t = 30 # 环向网格数量
E = 2e5 # 弹性模量/MPa
v = 0.3 # 泊松比
p = -10 # 内孔压力/MPa
# 建模计算
it.command("""
model new
model largestrain off
zone create cylindrical-shell point 0(0,0,0) point 1({0},0,0) point 2(0,{1},0) point 3(0,0,{0}) ...
point 4({0},{1},0) point 5(0,{1},{0}) point 8({2},0,0) ...
point 9(0,0,{2}) point 10({2},{1},0) point 11(0,{1},{2}) size {3} {4} {5}
zone group 'zone1'
zone cmodel assign elastic
zone property young {6} poisson {7}
zone face skin
zone face apply velocity-normal 0 range group 'west2' or 'bottom'
zone face apply stress-normal {8} range group 'west1'
model solve
th, r1, s_r, s_th, s_t, E, v, p))
# 圆心坐标
xc = 0.0
zc = 0.0
# 遍历求解各单元径向、切向应力
for z in it.zone.list():
xz = z.pos_x()
zz = z.pos_z()
r = math.sqrt((xz-xc)**2+(zz-zc)**2)
sin = zz/r
cos = xz/r
sxx = z.stress()[0][0]
szz = z.stress()[2][2]
sxz = z.stress()[2][0]
sig_r = sxx*cos**2+szz*sin**2+2*sxz*cos*sin
sig_t = sxx*sin**2+szz*cos**2-2*sxz*cos*sin
sig_r)
sig_t)
z.stress()[0][0])
模型位移、径向应力、切向应力计算结果如下所示。与上文计算结果对比可知:采用1/4模型进行计算,其结果与采用完整模型计算几乎无差别。
2.2 单元(zone)计算结果的对称复 制
全模型
图2-5 XX应变云图结果对比
1/4模型-对称复 制单元
在我查看Extra云图时,发现定义的Extra云图均随着模型的对称复 制而自动复 制,数值仅有细微偏差(个人猜测是由于对称前后的单元插值环境不同以及边界条件不同导致的)。
图2-7 径向应力云图(1/4模型-对称复 制单元)
图2-8 切向应力云图(1/4模型-对称复 制单元)
于是,我有了如下猜测:只需要把想要复 制的单元计算结果转移到Extra云图,即可实现单元计算结果的对称复 制。以图2-6~图2-7为例,在计算完成后,将XX应变与XX应力写入到Extra云图后再对模型进行对称复 制,代码如下:
# 遍历求解各单元xx单元应变、应力
for z in it.zone.list():
z.set_extra(3,z.strain()[0][0])
z.set_extra(4, z.stress()[0][0])
运行上述代码并对称复 制模型后,得到的xx单元应变、应力云图如下所示:
图2-9 XX应变云图(1/4模型-对称复 制单元-Extra云图)
图2-9 XX应变云图(1/4模型-对称复 制单元-Extra云图)
由图2-8~图2-9可以看出,采用将单元计算结果导入Extra云图的方式可以实现单元计算结果的对称复 制。
说明1:为了方便,本文代码以Python编写,但也可以采用fish进行实现,相关函数框架可查询往期发布,包括但不限于:
遍历及其框架教学
FLAC3D 6.0新手向——遍历详解
指针获取教学
FLAC3D6.0各类指针获取详解
说明2:云图标题可通过Legend中的Title进行修改,如下所示:
图2-10 修改Extra云图标题
2.3 网格点(gridpoint)计算结果的对称复 制
对于网格点(gridpoint),在计算完成后对模型进行对称复 制,其结算结果和Extra均不会随着单元的复 制而自动复 制,以位移为例,结果见下图。
1/4模型-Extra云图
1/4模型-合位移云图
图2-11 合位移云图
因此,为了实现网格点计算结果的对称复 制,就需要人为赋值。要实现这个功能,就需要我们回忆一下一点点高中知识:如何求解一个点关于一个面的对称点坐标。
对于绝大多数情况而言,对称平面都是YOZ/XOY/XOZ面或与其平行的平面。如左右对称复 制模型时,对称平面为YOZ平面,此时假设原模型中的一点P(x1,y1,z1),显然其关于YOZ平面(X=x0)的对称点P'为(x1-2*x0,y1,z1)。
图2-12 对称点坐标关系示意图
因此,我们只需要计算出对称点坐标,并将原模型各个网格点的计算结果赋给对称点即可。效果如下所示。两种计算方式下位移值有所不同,初步考虑是全模型、1/4模型的边界条件不同导致的。
1/4模型-对称复 制单元-Extra云图
图2-13 合位移云图
为了使上述代码更具普适性,考虑模型关于非YOZ/XOY/XOZ平面对称的情况(比如本例建立1/8模型进行计算)。此时,同样仅需要采用Python求取原网格点关于对称平面的对称点坐标然后赋值即可。