当前位置:首页 > FLAC3D中一些问题的讨论
4.也谈采用FLAC3D对地下采矿的模拟
以下转自中尉发到SIMWE论坛FLAC\\FLAC3D版面的帖子
地下采矿,以层状的煤层开采为例,目前很多都是采用全部垮落法,煤层开采后,采空区岩层从弯曲下沉到出现裂隙并最终垮落,按开采沉陷“上三带”的说法,就是采空区上覆岩层形成了垮落带、裂隙带和弯曲下沉带。对于这样一个会出现完整岩层垮落成松散矸石的过程,采用基于连续介质的FLAC来模拟,本身就并不十分恰当!因为采空区上覆岩层垮落后,已经不再是连续介质。如果采用FLAC模拟,在大范围的开采(长壁开采一般范围都很大)后,绝大多数情况下是算不到平衡状态的,但有可能出现稳定的塑性流动状态,从计算原理上来说,这是非常正常的,而不是什么参数选取的问题。采矿工程不同于其他地下岩土工程之处就在于,它不对采空区进行任何支护处理,而其他工程不论是地下厂房,隧道开挖等都会进行及时支护,保持了围岩的完整性和稳定性。虽然从开采沉陷角度来说,岩层移动最终会有个稳定过程,但由于FLAC本身不能模拟岩层垮落后形成的散体对上覆岩层起到一定的支撑作用,因此如果不对采空区进行另外的处理,一般是不会计算到系统默认的平衡状态(最大不平衡力比率达到1×10-5)的,除非开采范围很小。于是,论坛里出现了很多关于用FLAC模拟地下开采后对采空区进行处理方法的讨论,如对采空区进行弹性充填等。对于这些方法,本人也曾做过一些试验,效果并不好,毕竟采空区垮落不是充填,这样做有一种“亡羊补牢”的感觉。
如果非要用FLAC来模拟地下开采,本人建议研究重点放在裂隙带及以上的弯曲下沉带到地表这段范围,因为这部分岩层还比较完整、连续,对于涉及到采场覆岩破坏结构方面的研究,建议还是采用离散元进行。
以上观点,是。己应用FLAC做开采沉陷两年来的体会,如有不妥,欢迎各位指正并交流!
5.FLAC3D本构模型开发
FLAC3D基于显式有限差分格式,计算过程首先调用运动方程,由初始应力和边界条件计算出新的速度和位移,然后,由速度计算出应变率,进而根据本构方程获得新的应力或力。显式有限差分法计算流程如图。
FLAC3D本构模型的主要功能就是根据应变增量(应变率)返回新的应力张量。 FLAC3D采用面向对象的语言C++编写。C++语言的特点是采用面向对象方法,使用类来代表对象进行编程。与对象有关的信息被封装在类中,这些信息在类的外部是不可见的。与对象的通信通过成员函数操作封装数据来完成。一个新的对象类型可以从基类派生而来,基类的成员函数也可被派生类的同名函数覆盖。这种方式便于程序的模块化设计。 FLAC3D中的所有本构模型都是以动态链接库文件(.dll文件)的形式提供,自定义本构模型也不例外。
8
动态链接库文件必须采用VC++6.0(SP4)或更高版本编译得到。用VC++编写自定义FLAC3D本构模型的过程主要包括:基类、成员函数的定义,模型注册,模型与FLAC3D间的数据传递以及模型状态指示。 基类的描述
基类提供了实际本构模型的框架,用户自定义模型类都继承于该类。基类命名为ConstitutiveModel,由于它定义了一系列“虚”(语法上以0为标志)的成员函数,因此又被称为“抽象”类。这也是说不能创建该类的任何对象,而其它继承自该类的类的对象必须给出实际的成员函数来代替基类的“虚”函数。基类的头文件(.h文件)中定义了这些“虚”的成员函数。
模型成员函数
ConstitutiveModel类有很多成员函数,主要有: const char *Keyword() 返回一个指向包括模型名称的字符数组的指针,以便用户在FLAC3D中使用MODEL命令时,C++能够识别。 const char *Name() 返回一个指向包含模型名称的字符数组的指针,以识别用户使用如PRINT Zone等命令。 const char **Properties() 返回一个指向包含模型力学参数名称的字符串数组的指针,并用一个空指针代表字符串数组的结束。这样程序能识别用户输入的PROPERTY命令。 const char *States() 返回一个包含单元状态名称的字符串数组的指针,并用一个空指针代表字符串数组的结束。这样程序就能输出或显示用户自定义的模型内部状态(如:塑性流动、屈服、受拉)。 const char *Run(unsigned uDim, State *ps) 该函数在FLAC3D计算循环的每一步对每一个子单元使用。模型根据应变增量对应力张量进行更新。这个函数是本构模型的核心,不同的本构模型通过不同的Run()函数得到不同的应力张量。所有本构模型的Run()函数都继承自ConstitutiveModel类的Run()函数。 模型注册
每一个用户自定义本构模型有其自己的模型名称、力学参数名称和状态指示器。FLAC3D通过调用模型对象的静态全局实例获得用户定义模型的信息并使用结构子(constructor)将新模型注册到模型列表中。一个特定模型只有一个静态注册产生,方便将其放到模型的C++源码中,这样当相应的.dll文件被装载时,模型被注册。 数据传递
在FLAC3D和用户自定义模型间的最重要的连接就是成员函数Run(unsigned nDim, State *ps),它在模型的计算循环时计算其力学响应。State结构被用来传输信息和生成模型。同时,在非线性模型中,Run()函数也用来传递模型的内部状态。 状态指示
FLAC3D中的单元是由四面体子单元所组成,每一个四面体有记录其当前状态的成员变量。该成员变量共有16位,能够代表最多15种不同的状态。对于用户定义本构模型,用户可以命名一种状态并为其分配特定的位。 头文件和源文件
在C++中,主要有头文件(.h)和C++源文件(.cpp)两种文件类型,头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),是用户应用程序和函数库之间的桥梁和纽带。而源文件(.cpp)用于保存程序的实现(implementation),是具体实现代码。先在VC++6.0环境中建立一个工程(project)文件jdmohr.dsw,工程文件中包含了空的头文件和源文件。 FLAC3D的本构模型需要用到如表所示的一些头文件和源文件: FLAC3D本构模型的C++头文件和源文件名称 功能
CONMODEL.h 声明与本构模型交换数据的变量数据类型State,保存结果的数据类型ModelSaveObject和本构模型基类ConstitutiveModel
STENSOR.h 声明存储对称张量(应力或应变张量)STensor类
9
AXES.h 声明一个与坐标轴变换有关的数据类型Axes和相关函数
CONTABLE.h 声明了一个ConTableList类,该类为本构模型提供了一张表,该表用来存储模型单元或节点ID号 USERMODEL.h 用户自定义本构模型派生类的声明 USERMODEL.cpp 用户自定义本构模型的由应变增量获得应力增量的实现
在编写自定义本构模型的C++文件时,需要在FLAC3D自带的莫尔-库仑模型基础上增加新的材料参数变量。如中尉编写的节理岩体损伤莫尔-库仑模型增加如图所示的材料参数。
FLAC3D本构模型的主要功能就是根据应变增量得到新的应力增量,应力应变关系表达式很可能为矩阵表达式,在计算时,可能需要对矩阵求逆。对于逆矩阵的求取,可根据逆矩阵定义或矩阵的初等行变换来进行,建议采用一种在数值计算方法中常用的全主元高斯-约当(Gauss-Jordan)消去法。该方法具有数值稳定而且精度较高的特点。由于岩体的柔度张量矩阵元素都非常小(10的-7、-8次方级),在进行乘法计算时,将产生极大的舍入误差,而高斯-约当消去法的消去过程是在全矩阵中选主元(绝对值最大的元素)来进行,故可使舍入误差对结果的影响减小到最小。将编写好的头文件jdmohr.h和源文件jdmohr.cpp导入到工程文件(.dsw)中,通过编译(compile)和链接(link),形成了节理岩体损伤莫尔-库仑本构模型的动态链接库文件jdmohr.dll,将其复制到FLAC3D的安装目录下,如图
程序的调试是编程过程中不可缺少的重要步骤,尤其是对于数值计算,需要实时监控计算流程和各种变量,以防出现死循环和结果严重失真。在VC++中可设置将FLAC3D中的
10
EXE文件路径加入到程序的调试范围中,并将自定义的FLAC3D的.dll文件加入到附加动态链接库(Additional DLLs)中,然后在.cpp文件里的Initialize()或Run()函数中设置断点,进行调试。使用自定义模型时,首先在命令流中使用命令CONFIG cppudm对FLAC3D进行配置,使其能接收动态链接库文件,然后通过MODEL load命令将自定义本构模型(即动态链接库文件)加载到FLAC3D中,这样,FLAC3D就可以识别出新的模型名和属性名。同样,在恢复(命令:RESTORE)一个使用自定义模型的文件时,也必须使用CONFIG cppudm命令和MODEL load命令。 如图
6.FLAC3D自定义本构模型
对应manual之Optional Features中最后关于自定义本构模型的部分,给出以下翻译。 FLAC3D中可以用C++编写动态链接库文件(.dll文件)来自定义本构模型,其主要功能是根据应变增量返回新的应力张量。
C++语言的特点是采用面向对象方法,使用类来代表对象进行编程。与对象有关的信息被封装在类中,这些信息在类的外部是不可见的。与对象的通信通过成员函数操作封装数据来完成。一个新的对象类型可以从基类派生而来,基类的成员函数也可被派生类的同名函数覆盖。这种方式便于程序的模块化设计。
用C++自定义FLAC3D本构模型的过程主要包括:基类、成员函数的定义,模型注册,模型与FLAC3D间的数据传递以及模型状态指示。 本构模型的基类
基类提供了实际本构模型的框架,其它类都来源于该类。基类命名为ConstitutiveModel,由于它定义了一系列“虚”(语法上以0为标志)的成员函数,因此又被成为“抽象”类。这也是说不能创建该类的任何对象,而其它继承自该类的类的对象必须给出实际的成员函数来代替基类的“虚”函数。基类的头文件(.h)中定义了这些“虚”的成员函数。 成员函数
ConstitutiveModel类的成员函数及功能如下:
const char *Keywork() 返回一个指向包括模型名称的字符数组的指针,以便用户在FLAC3D中使用MODEL命令时,C++能够识别。
const char *Name() 返回一个指向包含模型名称的字符数组的指针,以识别用户使用如PRINT Zone等命令。
const char **Properties() 返回一个指向包含模型力学指标名称的字符串数组的指针,并用一个空指针代表字符串数组的结束。这样程序能识别用户输入的PROPERTY命令。
11
共分享92篇相关文档