自定义本构模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4 自定义新的本构模型

介绍

FLAC3D自定义本构模型跟FLAC手册中讲到的用FISH来自定义本构模型一样。然而在FLAC3D中不支撑FISH语言来自定义本构模型,自定义本构模型开发必须用C++语言,且编译成DLL文件(动态链接库),动态链接库文件能在需要的时候随时加载上去。本构模型的主函数主要是返回新的应力,给出应变增量。然而自定义本构模型也必须给出一些其他的信息:比如模型名称和读入、写出保存文件等操作。

C++语言是一种面向对象的程序设计语言,使用类(classes)来代表对象(objects)。对象的数据被对象封装起来,在对象的外面数据是不可见的。通过成员函数来访问对象,而成员函数可以对封装的数据进行操作。另外C++语言强烈支持对象的等级结构,新的对象性质可以从一个基本对象产生,基本对象的成员函数可以被派生出来的对象的成员函数替代。这些特点使程序更加模块化。举个例子:主程序需要在程序代码的不同地方建立与派生类的不同变量之间的接口关系,但是这些仅仅只关系到基类,与派生类无关。运行时间系统自动的调用适当的派生类的成员函数。对C++比较好的介绍来自Stevens (1994);它假象读者有一定得编程语言知识,特别是对C语言的了解。

在部分将介绍怎么用C++语言开发自定义本构模型。这节主要包括基类、成员函数、本构模型编号、自定义本构模型与FLAC3D之间的传递信息,本构模型状态指示器。在节中将介绍怎样生成DLL本构模型。这一节主要包括自定义本构模型的支持函数,实例本构的源代码,FISH支持的用户自定义本构,和怎样生成和加载一个DLL文件。在这一节中所有的参考文件被包含在“\ITASCA\Models\UDM”文件夹下面的“”这个压缩包文件里面。

注意:FLAC3D 版本是用Microsoft Visual C++(VC++)版本编译的。用户自定义的DLL文件最好采用与其相当的编译器来编译,以使用户自定义的DLL文件能与FLAC3D兼容。

自定义本构的方法

自定义本构的基类

以上介绍的方法是FLAC3D自定义本构支持的方法。基类为从基类派生出来的实际的本构模型提供框架。这个基类叫ConstitutiveModel类,被称为“绝对”的类,因为他声明了许多完全虚有的成员函数(通过=0语法附加到函数原型)。这意味着这个基类不能产生任何对象,以及从这个基类派生出来的任何对象都必须提供真实的成员函数,以替代ConstitutiveModel类中的虚有成员函数。例子,提供了ConstitutiveModel(包含在文件“”中)这个类的部分代码,ConstitutiveModel类中的一些成员函数,像公共函数在例子中省略掉了。公有函数的使用(像YoungPoissonFromBulkShear)是不用证明的,有关他们使用的例子可以在提供的本构模型源程序中找到,FLAC3D使用其它的函数来操作和访问本构模型,用户可以毫无理由的使用和重新定义这些。

class ConstitutiveModel {

public:

EXPORT ConstitutiveModel(unsigned uTypeIn,bool bRegister=false);

EXPORT virtual ?ConstitutiveModel(void);

double ConfinedModulus(void)这个对象返回一个值,这个值可以更好的估计最大的受压模量。它应用在FLAC3D计算稳定时间步中,对于一个线性的弹性模型来说,这个受压模量是K + 4G/3。

double ShearModulus(void)这个对象返回一值,这个值可以更好的估计当前的正切剪切模量。这个使用在FLAC3D动力本构模型中粘滞静态边界系数。

double BulkModulus(void) FLAC3D目前还没有使用这个对象,但是这个对象可以很好的返

回对当前的正切体积模量的估计。

double SafetyFactor(void)这个对象目前也还没有使用,它必须返回一些值,像。unsigned Version(void)这个对象返回本构模型版本号。这个用来处理早期本构模型版本保存的结果文件,而这早期的本构模型可能忽略了一些变量。

ConstitutiveModel *Clone(void)创建一个新的对象,必须与当前类相同,返回一个ConstitutiveModel类指针。不管FLAC3D什么时候在一个单元中调用本构,它都被调用。const char *SaveRestore(ModelSaveObject *mso)当SAVE或是RESTORE命令给出时,这个被函数调用。本构模型必须首先调用基类的SaveRestore()这个函数。SaveRestore()允许本构模型保存或是恢复每个对象的数据。仅仅允许保存整数类型或是浮点数类型,其他的数据类型必须要转换成这两种类型。派生类函数必须首先调用mso->Initialize(nd,ni),这里nd表示双精度存取(或是恢复)数据字节数,ni表示整型存取(或是恢复)数据字节数。变量通过mso->Save(ns,var)这个函数识别,这里ns是变量的序号(从0到nd-1或是从0到

ni-1),而这主要取决于实际整型或是浮点型数据存取或恢复的位数,var是需要保存的变量。有单独的Save()去处理整型或是实型变量。这个结构体类ModelSaveObject是不怎么重要的,除了以上提到的函数。它被定义在“”这个头文件中。

重新定义的类也必须包含构造函数,而这个构造函数调用基类的构造函数。如果这个bRegister变量的值为true,基类的构造函数就被调用,然后派生出来的本构模型就被FLAC3D 注册登记过。一个与模型相关的数(uTypeIn)也必须通过;这使得当从一个文件中恢复出来的单元能够重新设置正确的本构模型。一般取一个比较的值来表示这个(比如100或是更大),以避免与从1开始的模型内置变量产生冲突。在其他的所有情况中,派生类构造函数在被调用时,应当不含任何参数,就像Clone这个成员函数一样。通过构造函数可以初始化成员数据,就像例所示。在这个例子中本构模型的特别号是整型变量mnUserMohrModel(具体看例),这些符号“dBulk”、“dShear”等等是派生类的数据成员。

Example Typical model constructor

UserMohrModel::UserMohrModel(bool bRegister)

:ConstitutiveModel(mnUserMohrModel,bRegister), dBulk,

dShear, dCohesion, dFriction, dDilation,

dTension, dYoung, dPoisson, dE1, dE2,

dG2, dNPH, dCSN, dSC1, dSC3,

dBISC, dE21 { }

本构模型的编号

每个用户自定义本构模型都包含它自己的名称,它的材料参数的名称,以及单元应力状态指示器。FLAC3D通过调用合适的成员函数来实现以上这些,就像在节中介绍的一样。FLAC3D通过一个静态的、全局的本构模型例子来调用构造函数,以识别用户自定义的本构模型(参见例子)。当FLAC3D被加载(主要是内置本构模型),或是当一个DLL文件被加载上(外置本构模型),这时这个构造函数被创建。这个参数的值为true时导致了基类构造函数对新本构模型的注册,然后把它加在本构模型列表中。只有一个静态的、注册的、特别的本构模型被定义,它是为了方便插入到C++本构模型源代码中,以至于当这个模型相关的DLL文件被加载时,它能够被注册。当FLAC3D需要本构模型的任何信息,或是需要去实例化一个模型时(使用Clone 函数)时,这个静态的实例化模型被调用。

Example Global instantiation of a model object

static ElasticModel modelInstance(true);

. forces a constructor call to the model registry

相关文档
最新文档