1 引言
在许多实际问题的计算过程中,我们需要监测模型内某一个特定块体或网格点的应力/位移变化,首先必须获得块体或网格点的指针。这个笔记讨论了如何使用block.near函数寻找一个特定位置的块体及其应用。
2 block.near函数解析
UDEC和3DEC都有这个函数,其目的是获取最接近一个点的块体指针或称作索引值,例如:
_iab = block.near(5.0,3.0)
b_i = block.near(0.0,0.0,-0.31)
在3DEC中,还可以输入一个可选的布尔值b。如果b=true,只搜索可见的块体;默认情况下b=false,搜索所有的块体。用鼠标滑动到拟选择的块体,Inforamtion栏会显示该点的ID,Face以及最接近的网格点值,读取光标所在点的位置即可,不一定完全相同,只要这个点在块体内即可,如下图所示。
fish define f_b
local b_i = block.near(0,0, 0.5)
local ii=io.out("Block: "+string(b_i))
end
[ ]
在Python中,可以使用pos方法确认其位置。例如:
b = it.block.near((0,0,0.5))
b.pos()
在extrude对象中,使用extrude.set.block.near(sp,v<,f>)函数获得一个点最近的块体,如果没找到块体则返回空值Null,其中sp是extrude set指针,v是2D矢量即点的(x,y)值,f是一个可选项,可以指定搜索半径。这个函数目前还没有测试过。
3 block.near函数应用
由于内置的应力和位移只是单元和网格点上的,因此要获得模型内任意一点的应力和位移必须近似地平均该点周围单元或节点的值,这种方法在小试件的强度试验中经常使用。具体做法是:首先使用block.near函数获取块体的指针,然后使用block.zonelist函数对块体内所有单元分量进行叠加,最后取其平均值。下面所示的是一个通用的求某一点Sxx的函数,其它分量的求解方法与之类似。
fish define sxx(x,y,z)
local sxxt = 0
local count = 0
local bi = block.near(x,y,z)
loop foreach zi block.zonelist(bi)
sxxt = sxxt + block.zone.stress.xx(zi)
count = count + 1
endloop
sxx = sxxt / count
end
4 结束语
与block.near相似的一个函数是block.zone.near, 这个函数用来获取一个特定位置的单元,当计算上述提及的应力Sxx时,由于块体最后都分解到单元上,因此从理论上来说使用block.zone.near函数计算出来的平均应力可能比使用block.near函数计算出来的平均应力更准确一些,有待进行测试对比和验证。很多情况下,也需要计算特定点的位移,使用block.gp.near获得网格点指针,操作流程与应力计算相同。
下图所示的是一个楔形体在重力作用下的滑落过程。通过监测楔形体内某一点的位移,来判断其是否出现滑动,其中block.near用于证实块体选取的坐标,block.gp.near用于获取网格点指针进而计算网格点的位移(block.gp.dis.z)。