1 引言
在【答复同学提问---如何在离散断裂网络DFN中计算RQD指标】中描述了在二维DFN中计算RQD的方法和步骤,当时由于时间仓促,没有仔细检查代码,回头验证时才发现这个代码不能正确计算出RQD值,出错原因不在那段代码的思路和算法,而是UDEC软件本身引起的数据问题。本文首先讨论了出现的这个百思不得其解的问题,然后给出了一种临时解决办法。
2 出现的问题
计算RQD的基本思路为:(1)求出钻孔线与DFN的交点;(2) 计算交点之间的长度,包括钻孔起点与终点;(3) 累加两点之间距离大于0.1m的长度, 然后除以钻孔线总长度即可得到RQD值。
按照这种思路,后一点的坐标顺序减去前一个点的坐标,就可得到两点之间的距离。然而问题就出现在这儿,交点坐标本应该按照从左到右的顺序依次排列,但在某些点不知什么原因出现了顺序颠倒,至今没有查找出出现这个问题的原因。开始以为是UDEC软件的问题,结果在PFC中测试发现存在同样的问题。具体问题表现在:
(1) 断裂数N=20时,有1个交点,钻孔坐标值域[-1,0.26,1],Ok;
(2) 断裂数N=30时,有3个交点,钻孔坐标值域[-1,-0.46,0.11,0.27,1], OK;
(3) 断裂数N=40时,有5个交点,钻孔坐标值域[-1,-0.54,-0.21,-0.46, 0.11,0.27,1]; 开始出现问题了,-0.46本来应该排在-0.21的前面,这样才能进行正确的顺序递减,但不清楚软件为啥把这个顺序颠倒了;
(4) 断裂数N=80时,有9个交点,钻孔坐标值域为
[-1,-0.82,-0.61,-0.53,
-0.21,-0.46,
0.11,0.26,
0.85,0.72,1]
可以看出,在这种情形下,出现了两处顺序排列颠倒的地方。先前的代码由于没有意识到这个问题,认为顺序自动由小到大排列,导致不能得出正确的结果。
3 解决方法
解决方法其实很简单,即在计算交点之间的长度之前,把程序自动求出的交点列表进行排序,由小到大顺序排列,然后再进行计算,为此对代码作了如下修正:
(1) 使用了Itasca Python模块(RQD-Calculation.py),尽管用FISH也能完成这个任务,但我使用Python更顺手一些;
(2) 用list函数代替了原代码的map函数,使得数据操作更方便;
(3) 代码改在PFC中运行,但在UDEC中运行应该也一样。
这是一个为了特定存在问题的解决方案,但究竟是软件本身引起的问题,还是使用的方法有误,至今我想不出原因。Anyway, 问题解决了。
4 代码验证
现在,经过修正的代码能够正确地计算出RQD的值。
5 主要函数
RQD-Calculation.py使用的主要函数包括:
(1) fracture.intersect.num
(2) fracture.intersect.find
(3) fracture.intersect.pos1
(4) comp.x
(5) list.seq
(6) list.append
(7) list.sort
(8) it.fish.get