0 前言
岩土工程中常用的数值计算方法主要有有限元法、有限差分法和离散元法等,今天我们要用到的FLAC3D软件采用的就是有限差分法。有限差分法历史悠久,其最初的使用甚至可以追溯的第一台电子计算机出现之前。有限差分法并不是为了电脑编程而出现的,而是计算机使用者后来发现有限差分法易于编程实现,使得有限差分法在数值计算领域得到不断推广和进一步发展。
越是弥足珍贵的软件,外表看上去,往往越是平常无奇,仿真模拟给全身心带来的幸福,从来也是如此。 --指尖上的仿真
FLAC3D软件主要用于解决岩土工程问题,由美国的ITASCA公司开发。ITASCA是1981年由美国明尼苏达大学5位教师联合创办的岩石力学技术机构,这些创始人当初在北美首创了岩石力学学科,并组织创立了国际岩石力学学会,因此,在业界ITASCA被认为是世界岩石力学学科发源地之一。
接下来介绍一下我们要解决的问题,就是地下硐室或通道结构的锚网喷支护问题。地下硐室或者通道开挖后引起地层内应力的重新分布,面临稳定性风险,因此需要及时支护,而锚网喷就是常用的方法之一。锚网喷支护方法自上世纪60年代以来,已被广泛采用。锚杆和喷射混凝土与围岩共同形成一个承载结构,可有效地限制围岩变形的自由发展,调整围岩的应力分布,防止岩体松散坠落。它既可以用作施工过程中的临时支护,也可以在围岩稳定性较好情况下,代替永久支护或衬砌。该方法在煤矿巷道、地下硐室和公路隧道中都有广泛应用。锚网喷支护的实景照片和某设计图如图1、2所示。
由于支护结构数量多,支护构件间存在复杂的相互作用,对支护有效性的分析多借助数值仿真方法进行。目前绝大多数数值计算软件并没有直接的相应内置单元来模拟锚杆,而FLAC3D内置了cable单元用于模拟锚杆或锚索支护结构,同时其强大的Fish语言允许用户通过编程实现大量锚杆的自动创建、连接的建立、属性参数的设置等工作,代码一旦编写完成只需少量修改即可反复使用,可以分析不同支护参数下的支护效果以便进行参数优化。
本文作者之前在国内两家著名仿真论坛公布了锚网喷支护的部分代码,获得了大量的点击和关注,当时公布的代码已经进行了简化,并未公开其中锚杆与喷层混凝土间连接的相关操作。在本文中,将较详细的介绍该结构单元节点上的连接的自动删除和新建方法,并公开相应的核心计算代码,该部分内容对于在模拟中获得真实的支护效果非常重要。
本文在接下来的第1节将介绍FLAC3D中结构单元的部分基础知识,尤其是单元间连接建立的一般方法,然后介绍在需要建立大量连接时,如何利用内置函数实现连接的建立。在第二节将介绍一个实例,在实例中具体演示连接的自动建立。第三节将给出该实例对应的完整代码。有了前面各节的铺垫,读者将更容易理解和掌握第三节的代码。
1 FLAC3D中连接的建立
1.1基础介绍
FLAC3D中的结构单元主要包括:锚杆(锚索)单元(cable)、梁单元(beam)、壳体单元(shell)、衬砌单元(liner)和土工格栅(geogrid)。这些结构单元一般在普通实体单元(zone)表面(图3)或内部建立(图4),结构单元在创建时单元节点(node)会自动与邻近的实体单元建立连接(link)以实现与周围实体单元的相互作用。结构单元的单元与单元之间也通过节点(node)上的link实现共同作用。因此,link有两种类型,即:节点-实体单元(node-zone)(图4)、节点-节点(node-node)。默认情况下不同类型结构单元各自由度的link的类型,如表1所示:
其中,free和rigid分别表示该自由度上可以自由位移和刚性的,SY代表剪切屈服弹簧,NY代表法向屈服弹簧,PY代表桩屈服,PYDP代表依赖弹簧的桩屈服。
当有新的结构单元被创建时,会有新的节点出现在实体单元表面或内部,新的节点与实体单元间会按照表1中的默认属性自动建立node-zone连接,进而实现结构单元与实体单元间的相互作用。也就是说,结构单元与实体单元间的相互作用是通过node-zone连接实现的。
1.2 cable与liner的连接
在后面的建模中会利用cable单元模拟锚杆,用liner单元模拟含钢筋网片的混凝土喷层,因此,在此以cable和liner的连接,演示结构单元间node-node连接的建立方法。
如图6所示的cable和liner单元,图中紫色圆圈代表结构单元的node,圆圈内数字表示节点编号,这些编号是结构单元被创建时自动分配的。图中节点57和节点69被拉开了距离,主要是方便观察节点编号,实际建模时两个node是重合的。需要注意的是:结构单元在被创建时,其节点会自动与邻近的zone按表1的属性建立连接,两个结构单元的节点即使重合也不会自动建立连接。
因此,节点69和节点57都与liner后的实体单元(zone)自动建立了连接。在人为建立节点69和节点57间的连接前需要人为的删除节点与zone自动建立的连接。但连接的删除需要知道link的ID。命令清单提供了连接删除和建立的方法。
从上述代码可以看出两个node间的连接就需要多行代码才能完成,涉及两个link的删除,1个新link的建立以及属性的设置多个过程,尤其是当创建的连接很多时无法每个节点都通过print来人为的观察确定link的ID,这个过程过于繁琐。所以当需要删除和创建的link数量多时,必须利用FLAC3D内置的Fish语言,通过内置函数来完成相关操作。
一个成功的分析师,并不只依赖好的软件,更仰仗厚重的经验。
--指尖上的仿真
一个好的模拟分析,不是所有的操作都依靠鼠标,而更依赖于键盘。很多工作,写好代码就让它自己去算吧……
1.3通过Fish删除指定坐标处liner节点的link
采用如下代码完成与cable外端节点重合的节点的定位、link的确定以及link的删除。
代码片段2中,nd_near(_x0, _y0, _z0)获得指向位置(_x0, _y0, _z0)处的节点的指针(图7中指针1),nd_link(_ndLPTR)则是根据节点指针获得指向该节点的link的指针(图7中指针2),此处的link是liner与邻近的zone间自动建立的连接。lk_id(_lkPTR)则根据指针2获得link的ID。命令:seldeletelinkrangeid_linkID根据link的ID删除该link。nd_id(_ndLPTR)根据指向位置(_x0, _y0, _z0)处的节点的指针1获得该节点的ID。
删除锚杆最外侧靠近liner的节点上的link,Fish代码如下:
1.4删除靠近liner的锚杆节点的link
删除锚杆最外侧靠近liner的节点上的link,Fish代码如下:
在上述代码中,由s_near(_x1,_y1,_z1)获得指向指定坐标位置处的结构单元的指针,即获得指向cable单元的指针,再由该指针获得该结构单元的cid,然后按照FLAC3D生成cable单元的编号特征,获得靠近liner的一个节段的cable单元的cid号,再由该cid号通过s_find函数获得指向靠近liner处的cable单元的指针,由该指针通过s_node函数获得单元的第一个节点的指针,由该指针通过nd_id函数获得节点的ID。整个过程相对比较复杂,可以参考图8进行理解。从图8中围岩内最内侧的锚杆节点坐标(_x1, _y1, _z1)开始,沿着箭头的方向利用适当的fish函数,最终可以获得锚杆最外侧节点的id。之后删除这个节点创建时自动建立的link(对应命令:seldeletelinkrangeid_linkID)。
面的代码看得头晕,有木有?这个可以有。慢慢理解吧,话说我在写这个代码时也是牺牲了很多脑细胞的。为什么这么绕呢?是因为liner的node与cable的node在锚杆的最外侧节点(_x0, _y0, _z0)处重合了。通过nd_near(_x0,_y0,_z0)函数只能获得重合位置处一个节点的指针,无法同时获得另外一个节点的指针。nd_near()函数在重合的2个node处是返回哪个node的指针,主要根据node的创建顺序,同一位置处的多个node,哪个先创建的,nd_near()返回指向它的指针。在本文的分析中,liner始终先于cable创建,所以可以利用nd_near()获得处liner的节点的指针。而同一位置处cable节点的指针则需要如图8中那样,通过最内侧的锚杆结构单元利用fish函数向外找到最外侧的节点。
1.5建立cable节点与liner节点间的link
建立cable节点与liner节点间的link并设置link属性,代码如下:
到此,我们就完成了锚杆与衬砌结构单元间在重叠的节点处删除各自原有连接、新建node-node连接并设置相应属性这一最困难的工作。
2 应用实例
接下来将以一个煤矿巷道锚网喷支护的实例来演示上述结构单元link相应操作的实现。某煤矿巷道,其断面形式为直墙半圆拱型,混凝土喷层和锚杆的布置方式与图9中接近。锚杆加固的作用是提供局部抵抗岩块滑动及裂缝开展的刚度。锚杆借助于水泥浆或树脂药卷沿其长度方向提供了抗剪能力。锚杆及锚索采用cable单元进行模拟。
我是未完分割线
5 结语
真实的世界使我感兴趣,因为它是可塑的。——法国作家纪德
仿真世界是另一个有趣的世界,因为你能发挥自己的想象力和创造力把一些东西从无到有的在那个虚拟世界中创造出来,再赋予它们以属性,建立它们间的关联,观察它们的发展…… 那不是很有趣吗?
一去技术路,天涯若比邻。希望每一位CAE爱好者,都能从仿真中获得乐趣!
网友评论