1. 问题的提出
有同学报告说PFC2D不能使用itasca.dfn,会出现itasca模块没有dfn属性的错误信息。他使用的版本为PFC2D V7.00.159,为了验证这个错误信息,使用PFC2D V9.00.164进行了试验,结果发现确实会产生同样的错误信息,如下图所示。
2. 解决方法
起初以为这可能是PFC2D的一个bug或者是由于某种技术原因故意去掉了这个功能,实际情况是在PFC2D启动时没有自动加载这个模块,解决方法是通过菜单Tools>Plugins打开Plugins窗口,选择"Engine>module",加载module2ddfnpython009.dll即可。
[dfn_num = dfn.num]
然后,如果要在Python中使用这个变量,使用fish.get函数获得,例如:
total_dfn_number = it.fish.get('dfn_num')
在7.0版本中,DFN FISH共有22个函数;在9.0版本中去掉了与group相关的3个函数,这3个函数分别是dfn.group,dfn.group.remove和dfn.isgroup。此外UDEC没有如下三个函数:
dfn.contact.list(D_PNT<,INT>);
dfn.contact.list.all(D_PNT<,INT>);
dfn.prop(D_PNT,STR)
下面按照函数的功能以及传递的参数值对DFN FISH函数进行了分类。这样的分类比直接按照字典顺序给出更容易理解和掌握。当产生一个DFN后,便可以使用这些函数对DFN进行操作。
fracture generate dfn 'p1' fracture-count 100
(1) 寻找指针
UDEC和3DEC的数据都是以链表结构储存的,因此为了操作DFN中的数据,首先需要获得DFN的指针,指针通过dfn.find(ad)函数获取,ad为DFN的名称或者ID, ID的索引从1开始。
(2) 不需传递参数的断裂类型,ID和数量
有三个函数不需要任何传递参数,它们是:
[1] dfn.maxid 获得最大的DFN ID值。当模型有多个DFN组成时可以获取最大的ID值,如果只有一个DFN,那么返回值是1.
[2] dfn.num 获取模型中DFN断裂的总数量。在实际建模时,这个函数比较有用,可以用来查看模型的规模。
[3] dfn.typeid 获取DFN的类型号。类型ID可以用来唯一地识别DFN FISH的指针,并将其与任何其他类型的FISH指针区分开来。这个函数的返回值是整形。
(3) 不需传递参数的列表
还有一个不需要传递任何参数的函数是dfn.list,这个函数用来获取全局的DFN列表。使用loop foreach结构迭代该列表。
(4) 不需要指针的函数
有两个函数需要传递参数但不需要指针,第一个函数是上面提到的dfn.find,需要传递的参数或者是DFN名称,或者是DFN ID,第二个函数是dfn.create(<ID>,<s>),这个函数用来在FISH内创建一个DFN。这个DFN是空的,它的dominance值被设置为下一个可用的dominance(参见fracture contact-model命令和dfn.dominance)。这两个值都可以不填写,系统会赋默认值。如果不指定ID或s,则选择下一个可用的ID,名称设置为dfnXX,其中XX为ID。
(5) 仅使用指针的函数
下面这些函数必须并且唯一传递的参数是DFN指针。
[1] dfn.delete(D_PNT): 删除一个DFN, 使用这个命令后,所有的断裂和相应的交叉点都被删除。
[2] dfn.fracturelist(D_PNT): 获得指定的DFN的断裂列表。使用loop foreach结构迭代该列表。从架构上看,dfn.list处在这个函数的上层。
[3] dfn.dominance(D_PNT): 获取/设置DFN的dominance。参看(4)的说明以及(fracture contact-model)命令。这个函数是双向的,既可以获取也可以赋值。
[4] dfn.id(D_PNT): 获取指定的DFN ID, 如果只有一个DFN,那么ID=1.
[5] dfn.name(D_PNT): 获取DFN的名称。
[6] dfn.fracturenum(D_PNT): 获取指定DFN的断裂数量,dfn.num获取的是整个模型的断裂数量。
[7] dfn.template(D_PNT): 获取用于生成此DFN的断裂模板。如果在生成后有任何断裂被修改,返回值将是0。
(6) 使用指针和其它参数的函数
下面这些函数必须使用指针,但可以传递其它的参数。
[1] dfn.contactmap(D_PNT<,INT>): 获取与一个指定DFN相关的活动接触。可选择的接触类型ID用来过滤返回的接触。
[2] dfn.contactmap.all(D_PNT<,INT>):与上面的函数类似,获取与一个指定DFN相关的所有接触,包括那些不活动的接触。
[3] dfn.extra(D_PNT<,INT>):双向函数,获取或设置一个DFN的额外变量。
[4] dfn.group(D_PNT<,STR>): 双向函数,获取或设置DFN组名。返回值是字符串,如果没有设置组名,那么返回值是"Null"。
[5] dfn.group.remove(D_PNT,STR):移除DFN组, 指定的组名将从所有组槽中删除。
[6] dfn.isgroup(D_PNT,STR<,STR>):指出DFN组的状态。