学术文化网:本站代理期刊可作为职称及学位评审依据;并代写(职称、本科、硕士、博士)论文,代写代发论文一条龙服务;保证原创,保证质量,100%通过,保密服务

学术文化网

重点推荐省级国家级期刊、北大中文核心、CSSCI、EI、SCI发表,稳妥操作,速度快,包发表。有意向联系客服咨询。
论文代写:十年专业服务品质,全部由期刊编辑、硕士、博士撰写;保证原创、版权归您;保证通过、否则全额退款。代写论文申请表
论文发表:与百家优秀期刊合作,代理审核组稿,论文发表涵盖所有专业领域,全部正刊,保证出刊,否则全额退款。代写代发论文申请表
业务合作:因业务发展需要,诚招优秀写手合作,要求硕士以上学历,不限专业,另诚征优秀期刊代理合作,具体详谈。QQ:415835425 代写论文写手申请表
当前位置: 主页 > 工科论文

面向对象结构分析程序设计方法浅谈

 
面向对象结构分析程序设计方法浅谈
李文雄1,邝俊斌2*
作者简介:李文雄,(1979-),男,讲师,主要研究方向:计算力学,结构优化设计. E-mail:
leewenxiong@scau.edu.cn
(1. 华南农业大学水利与土木工程学院,广州 510642;
5 2. 广州拓欧信息技术有限公司,广州 510663)
摘要:针对面向对象结构分析程序设计的基本思路和编程习惯问题进行了讨论,其中包括程
序框架中模型类与分析类的设计思路、成员变量的定义原则以及有限元模型数据存储原则等
问题,说明了基本的编程原则,这些基本原则能有效地增加程序的可读性和可扩展性。
关键词:结构分析;面向对象;程序设计
10 中图分类号:TB115
 
25 0 引言
当前,土木工程结构分析部分主要依靠计算机程序完成,一些大型商业有限元分析软件,
如ANSYS、ABAQUS、SAP2000 等,已经在工程中得到应用。然而,在结构分析算法研究
中,直接应用这些大型商业有限元软件将难以进一步分析有关有限元分析算法的具体流程,
因此,自主开发有限元程序是结构分析算法研究中不可缺少的部分。
30 面向对象方法在有限元程序设计中的应用已经进行了十多年的探索,该项研究的直接结
果是有限元程序可维护性增强,代码重用性和程序开发效率提高,为有限元程序的系统开发
注入了新的活力[1]。然而,在面向对象有限元程序实际设计中仍存在一些值得探讨的问题。
笔者将在本文中根据近期编制结构分析程序(C++语言)过程中的一些体会和经验作简要的
分析。
35 1 面向对象结构分析程序框架
面向对象有限元分析程序设计中,类的设计是关键一步。笔者在程序设计中根据有限元
分析的特点建立了节点类、单元类、材料类、截面类、荷载类、矩阵类、模型类、分析类等
基本类。
程序以最基本的控制台式程序为主,通过main 函数进入主程序,在该函数中编写程序
40 具体操作。main 函数中包括4 部分(见图1):(1)读取控制文件。程序运行前先创建一
个名为“control”的文件,在该文件中写好分析类型码、模型数据文件名、分析参数控制文
 
件名、输出控制文件名,程序启动后即读取该文件,以获得分析类型以及相关的模型文件和
控制文件名称。模型数据文件、分析参数控制文件、输出控制文件中的具体数据应在程序运
行前分别定义好,程序一旦运行,即可顺利完成数据读入。(2)读入模型数据。根据模型
45 数据文件名打开文件并读取模型数据,由此实例化模型类,即得到一个具有全部模型特征数
据的对象IModel。(3)执行分析。根据第一步中读取的分析类型码,实例化一个分析对象
IAnalysis,并以IModel 作为分析对象Ianalysis 的参数执行分析操作(以下第一句建立分析对
象与模型对象的连接关系,第二句为执行分析操作)
Ianalysis->Model_Connection(IModel);
50 Ianalysis->AnalysisOperation();
通过计算得到对象IModel 的分析结果,将节点位移、单元内力等分析结果储存于对象
IModel 中,并将部分过程数据输出到相应的文档。(4)输出分析结果。根据输出控制文件
的内容执行输出操作。
笔者在程序开发中曾参考吴晓涵[2]的程序,在此基础上作修改。吴晓涵程序中构造了
55 CGlobalElement 类以进行全局控制,包括模型数据的读入及各对象(单元、节点、材料、荷
载等等)的构造、分析操作的执行以及结果的输出等。这种设计思路将分析操作作为
CGlobalElement 类的一个成员函数,由CGlobalElement 中的DataInput 函数读入模型数据后,
可根据具体需要执行相应的分析操作。但如果程序需要具备多种分析方法时,必须编写多个
不同的分析功能的CGlobalElement 类成员函数,将导致该类的定义变得复杂。笔者在程序
60 设计中单独建立用于反映模型特征的模型类以及用于反映分析过程分析类,从而使得程序的
层次结构更加合理。模型类的功能除了建立有限元模型(包括单元、节点、荷载、材料、截
面等数据,并保存于统一的模型对象)之外,还定义了各种模型特性的具体计算方法;而分
析类相当于分析模块,仅需定义分析操作的基本流程,而以模型对象作为分析操作的输入参
数。这种处理方法将分析类独立出来,相当于分析模块,在扩充分析方法时,仅需要对分析
65 类进行修改或派生,便可方便地开发分析模块。
Main
Control
IModel
Node
Element
Section
Material
Load
IAnalysiser
图1 程序运行基本框架
Fig.1 Basic Frame of Program
 
70 2 成员变量定义原则
在面向对象程序设计中,每个类中均包含若干成员变量和成员函数,而这些成员变量和
成员函数一般可分为public、protected、private 三种类型。这三种类型的访问权限是不同的,
public 类型允许类外部程序和该类的派生类直接访问,protected 类型仅允许该类的派生类直
接访问,而private 类型均不允许类外部程序和派生类直接访问。文[3]中强调,类的成员变
75 量均应以private 定义为宜,才能真正实现封装性。本文以单元类为例,讨论类成员变量的
定义。
笔者的程序在单元类设计中,以CBaseElement 类作为单元基类,其派生类包括CTruss
类(桁架单元)、CBeam 类(梁单元)和CPlane8NodeEle 类(面单元)。梁单元CBeam
类又派生出CBeam_Polynomial(多项式插值单元)、CBeam_Stabilityfunction(稳定函数单元)、
80 CBeam_Flexibility(柔度单元) ......。程序中根据不同的单元模式定义了CBeam 类的多个派生
类,这些派生的梁单元类在单元切线刚度矩阵阵和单元内力的计算方法上是不同的。那么,
一些共同的梁单元成员变量可直接在CBeam 类中定义,而且定义为private 类型。例如:
private:
double m_adN[2]; //单元轴力
85 double m_adQ[2]; //单元剪力
double m_adM[2]; //单元弯矩
不少设计人员在程序设计中将这些仅被派生类访问的变量定义为protected 类型,从而
实现对外部程序的封装。但protected 类型实际上并未实现真正意义的封装,如果在派生类
中存在大量直接访问基类成员变量的语句,一旦这些成员变量的名称需要更改,本类以及其
90 所有的派生类都需要修改,其工作量也是巨大的。因此,笔者在程序中对于成员变量均定义
为private 类型,并提供相应的接口,例如(与前面例子对应):
protected:
double GetN(int n) { return m_adN[n];}
double GetQ(int n) { return m_adQ[n];}
95 double GetM(int n) { return m_adM[n];}
void SetN(int n,double Value) { m_adN[n]=Value;}
void SetQ(int n,double Value) { m_adQ[n]=Value;}
void SetM(int n,double Value) { m_adM[n]=Value;}
此时,若该类的派生类需要访问这些成员变量时,均可采用GetN 和SetN 函数进行访
100 问。这样,虽然编程时工作量增大了,但类的封装性更好,成员变量名仅影响本类中的程序,
程序的修改或扩展将更加容易。
3 有限元数据的存储
对于面向对象结构分析程序设计关于数据储存的问题,笔者认为有限元模型及分析结果
的重要数据,均应有对应的唯一的变量储存。本文再以单元类为例,探讨这一问题。
105 在一些结构分析程序中,单元类中定义了材料弹性模量、材料泊松比等成员变量,而材
料类中也有材料弹性模量、材料泊松比等成员变量。程序读入模型数据并建立有限元模型时,
单元类和材料类中的弹性模量和泊松比等成员变量都获得了具体数值。确定单元刚度矩阵
时,直接访问单元类中的弹性模量、泊松比,编程显得十分方便。但是,由于程序中两处储
存相同的信息,将给修改的程序带来不便,特别是不熟悉该程序的程序员,需要花费相当时
110 间去确认这些材料特性的有效储存位置。因此,笔者建议将材料的弹性模量、泊松比等特性
仅存储在材料类中,而在单元类中,可添加指向对应材料的成员变量指针。计算过程中每当
 
需要访问这些材料特性时,可通过材料类提供的接口访问其成员变量。这种方式虽然增加了
程序编写时的工作量,但程序的可读性将大大增加,在修改程序时将十分方便,也减小发生
错误的概率。
115 在单元刚度矩阵的存储问题上,一些有限元程序在CBeam 类中定义一个静态矩阵成员
变量来存储单元刚度矩阵,也就是说,当需要用到某个单元的刚度阵时,需要调用
GetStiffness() 函数重新计算该单元的刚度矩阵并保存于这个静态矩阵成员变量。这种做法
可以节约储存空间,但使其计算量有所增加。例如,线弹性分析中,组装整体结构刚度阵时
需要分别对各单元计算一次刚度矩阵,而计算单元杆端力时,又要依次对各单元计算一次单
120 元刚度阵,因此计算量较大,当进行弹性动力时程分析时问题将更突出。实际上,当前计算
机均具有较大的内存容量,因此计算量反而成为关键问题。因此,笔者认为,可以在单元类
中定义各自的用于存储单元刚度矩阵的成员变量,对于线弹性分析,仅需一次性地确定各单
元的刚度矩阵,即可在分析过程中多次访问,计算量将大大减少。
4 结语
125 随着有限元技术在结构分析中所处理问题的规模和复杂性的增大,传统的面向过程编程
在有限元分析中暴露出不少缺点和问题,面向对象编程技术表现出较大的优势,可有效解决
这些问题。本文从根据笔者在结构分析程序设计中的经验,就面向对象结构分析程序设计中
的基本框架、模型类和分析类的设计思路、成员变量定义原则以及数据存储原则等问题作了
简要的讨论。本文所强调的一些编程原则虽然增加了有限元程序开发时的工作量,但将增强
130 程序的可读性,有利于程序的修改、维护和扩展。
[参考文献] (References)
[1] 杨大伟,王宗林,金秀辉.面向对象有限元程序的若干问题[J].哈尔滨工业大学学报.2006,38(2):222-225
[2] 吴晓涵.面向对象结构分析程序设计[M].北京:科学出版社,2002
135 [3] Scott Meyers. Effective C++ 改善程序与设计的55 个具体做法[M].北京:电子工业出版社,2011
[4] 罗加成, 张亚栋, 还毅等. 面向对象有限元程序框架设计及其在VC++ 中的实现[J]. 工业建
筑.2011,41(s1):112-116
[5] 史贵才, 葛修润. 面向对象有限元程序设计及其VC++ 与Matlab 混合编程实现[J]. 岩土力
学.2005,26(12):2005-2009
140 [6] Stanley B L, Josee Lajoie. C++ Primer 中文版[M].北京:人民邮电出版社,2006
学术论文网Tag:
本站郑重声明:
  1、我们与数十所知名高校博士强强联手,保持常年稳定合作关系,论文质量更有保证;;
  2、写作领域涉及所有专业,实力操作,出稿更快,质量更高,通过率100%;
  3、所有代写文章,全部原创,包检测,保证质量,后续免费修改,保证通过;
  4、信誉实力服务,专业代写毕业论文,职称论文,硕博士论文,留学生论文,成熟操作;
------分隔线----------------------------
栏目列表
联系我们
服务承诺
推荐内容