2022年面向对象的动力有限元程序设计 .pdf
面向对象的动力有限元程序设计张渊( 北京交通大学土木建筑学院,北京 100044) 赵海艳 (天津城建学院土木工程系,天津 300384) 摘要:本文将面向对象的程序设计方法引入到有限元程序设计当中 . 并且通过动力有限元程序设计当中两个类的实现,阐明了面向对象方法在动力有限元程序设计中的运用 . 关键词:动力有限元;面向对象程序设计方法,类; C+ Object-oriented Dynamical Finite Element Programming Zhang Yuan(College of Civil Engineering and Architecture, Beijing Jiaotong University,Beijing,100044,China) Zhao Hai-yan(Department of Civil Engineering, Tianjin Urban Construction Institute.Tianjin,300384,China) Abstract: The object-oriented programming method was introduced in the development of finite element method software in this paper. Through implement of two class in the dynamical finite element programming, the paper illustrate the application of object-oriented programming method in the designing of dynamical finite element method software. Key words: dynamical finite element method; object-oriented programming method; class; C+ 引言 : 面向对象编程( Object Oriented Programming )在有限元程序设计中的应用,已经在国内外引起了关注,并且已经取得一定的研究成果。传统的有限元程序设计采取了结构化的程序设计方法。结构化程序设计存在着不易调试和维护的弊端。由于在结构化语言中,数据分作全局数据( global data )和局部数据 (local data) 两种。在使用结构化程序进行有限元程序设计时,不难发现,几乎所有重要的数据都是全局数据。假设有一个新的程序员,受命为一个大型有限元程序编写一个小函数,则此程序员在设计程序前,首先必须了解整个计划所使用的全局数据,这将花费很多的时间。如果此程序员在访问全局数据时发生错误,这将会影响到原先程序中所有用到此全局数据的函数或过程,这将会造成调试上的困难。而且结构化语言还有一个缺点,这就是如果修改了某个数据,即使对数据作了较小的修改,但还是会使得整个程序中所有用到此数据的函数需要修改,不利于后期的维护 1 。另外,在进行大型有限元分析时,在进行数组处理时,由于数据量巨大,一般的结构化语言,没有指针功能,使得编译的时候内存消耗巨大。总之,结构化程序设计,程序代码的重用率低,程序可移植性差,使得进行二次开发无法实现或者很困难,而面向对象编程技术可以克服以上的弊端。面向对象程序设计特性 : 面向对象程序设计的本质是把数据和处理数据的过程(函数)当成一个整体 - 对象。面向对象程序设计的实现需要封装和数据隐藏技术,以及继承和多态性技术。而 C+ 语言充分支持面向对象程序设计 1 。 (1) 封装和数据隐藏。 C+ 通过建立类支持封装性和数据隐藏。类一旦建立,就可以看成是完全封装的实体,可以作为一个整体单元使用。类的封装就是数据和算法(操作)结合,构成一个不可分割的整体(对象),其次是,在这个整体中一些成员是保护的,它们被有效地屏蔽,以防外界的干扰和误操作。另外一些成员是公共的,它们作为接口提供给外界使用。这些正体现了程序的可靠性。 (2) 继承和重用。 C+ 采用继承支持重用的思想,程序可以在扩展现有类型的基础上声明新类型。从基类(父类)派生出它的派生类(子类),使派生类中成员可以访问基类的成员,进而实现程序代码的重用。我们在进行有限元程序设计时,非线性单元可以由相应的线性单元派生。 (3) 多态性。如果编程语言不支持多态,则不能够成为面向对象的。如果只支持类而不支持多态,我们只能够称这种语言是基于对象的。通过继承的方法构造类,采用多态性为每个类指定表现行为。其实,人与人之间的思想交流,只是不是做同一件事情,一般总是在更高的抽象层面,这样有利于更直接和精确地把握思考的事物。这就是人的思考问题的方式,也是自然的多态方式。沿着这种思路设计的程序,可以有限元程序模型更加准确的描述人们所思考的问题。多态性让类的设计者去考虑工作的细节,使得有限元程序代码极大地简化。我们在进行有限元程序设计的时候,每一个结点类都需要进行打印载荷数据和完成所有载荷的处理,这是侯,我们就可以将这两个函数设置成为虚函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - 以上面向对象的特性,使得程序的设计具有可靠性,灵活性和高效性。另外,面向对象高效性的另外一个重要体现就是可以进行动态的堆内存分配。而正是动态内存分配,才使得大型有限元程序计算效率得到了提高。传统的结构化程序中的变量和函数在编译的阶段都被保存在堆栈中,属于静态联编,使得内存的消耗巨大。而 C+ 动态内存分配可由程序员自由控制,程序员可以从堆内存中申请内存分配,并且随时释放无用数据占用的内存空间,这一过程发生在程序运行阶段,属于动态联编。在编制动力分析程序时候,我们经常会遇到对称矩阵(特殊矩阵)和时间函数。在面向对象的有限元程序方法的研究中,不少研究者已经提出了不同形式的对称矩阵(特殊矩阵)和时间函数类。以下,作者也给出这两个类的具体实现。对称矩阵(特殊矩阵)类 CSpecial_Matrix 2 若 n阶矩阵 A 中的元满足下述性质则称为 n 阶对称矩阵(特殊矩阵)。在动力分析时,刚度和阻尼矩阵一般都是对称矩阵(特殊矩阵)。对于对称矩阵,我们可以为每一队对称矩元分配一个存储空间,则可以将n 2 个元压缩存储到n(n+1)/2个元的空间中。假设以一维数组san(n+1)/2作为 n 阶对称矩阵A 的存储结构,则sak 和矩阵元a ij 之间存着一一对应的关系:对于任意给定一组下标(i,j),均可以在sa 中找到矩形元a ij 。根据以描述,CSpecial_Matrix 可以描述为:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - class CSpecial_Matrix public: CSpecial_Matrix(int); / 构造函数 CSpecial_Matrix(CSpecial_Matrix& ma); / 拷贝构造函数 CSpecial_Matrix()deletesa; / 析构函数 int Size ()return iRow; / 返回行数 double& Elem(int,int); / 引用返回的目的是返回值可以作左值 protected: double* sa; int iRow; ; 下面给出特殊矩阵类的构造函数和 Elem() 函数: CSpecial_Matrix:CSpecial_Matrix(int i) if (i=0) cerr=j)return sai*(i-1)/2+j-1; else return saj*(j-1)/2+i-1; 时间函数类 CtimeFun 时间函数在有限元静,动力分析当中扮演着重要的角色。尤其在动力程序的设计中,更是不可缺少。在动力分析中,时间函数具有真实的时间意义。它描述了载荷的时程曲线。在有限元分析中一般采取分段插值的时间函数,例如地震加速度的时程曲线就是典型的该类函数下面就构造了时间函数它能够计算时间函数在指定时间的函数值。 class CTimeFun int m_TimeNum; / 插值点的总个数 double m_TMax; / 时间的最大值 int m_Nex; / 时程曲线的转折点的个数 double *m_pNexTime; / 转折点处的时间 double *m_pNexValue; / 转折点处对应加速度值 double *m_pTimeValue; / 给定时间的函数值 public: double m_TimeStep; / 设定的时间步长 CTimeFun(int); / 构造函数 CTimeFun(); / 析够函数 double& ElemNexTime(int); / 引用返回的目的是返回值可以作左值名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - double& ElemNexValue(int); void ComputerValue(); / 根据时程曲线进行函数值的计算 double GetValue(int time); / 获得对应时间的函数值 void Display(); ; CTimeFun:CTimeFun(int i) m_Nex=i; m_pNexTime=new doublei; m_pNexValue=new doublei; CTimeFun:CTimeFun() delete m_pNexTime; delete m_pNexValue; double& CTimeFun:ElemNexTime(int i) return m_pNexTimei; double& CTimeFun:ElemNexValue(int i) return m_pNexValuei; void CTimeFun:Display() int i; cout 这些值是 :; for(i=0;im_TimeNum;i+) coutm_pTimeValuei ; 结语 : 随着大型有限元程序的出现 , 传统的面向过程的结构化语言 , 例如 , 工程中常用的 Fortran 语言 , 已经不能满足要求 . 而面向对象的方法采取了动态分配内存的技术 , 一般只是储存质量和刚度矩阵中的非零元素 , 从而降低了机器的要求 , 加快了分析的速度 . 最为重要的是 , 面向对象技术的引入 , 使得编程变得简单 , 大大提高了代码的重用率 . 另外面向对象编程技术的多态性和重载机制使得整个问题域的信息响应变得越来越简单 3 . 1 钱能 .C+ 程序设计教程 M. 清华大学出版社 ,1999. 2 严蔚敏 . 数据结构 M. 清华大学出版社 ,2000 3 王伟 , 刘德富 . 有限元编程中应用面向对象编程技术的探讨. 三峡大学学报 ,2001年第 4 期 124-128. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -