在求解有限元模型中会碰到这种情况:
1. 一个模型有多种单元类型(比如同时存在2维单元和3维单元,2维单元又同时存在三角单元和四边形,3维单元同时存在四面体和六面体)
2. 仿真流程有多种工况,每种工况又有多个步骤,每个步骤对应的有限元模型不同
3. 一个模型有多个相同或者类似的子结构,而且子结构存在嵌套情况。
对于第一种情况,一般的做法就是将所有单元循环,判断单元类型,根据单元类型做相应处理。如果单元类型少该方法有可行性,但是当单元类型不确定,而且数量过多,使用该方法代码不仅结构累赘,难以扩展而且层次不清,封装性差。
利用Composite模式可以很好解决这个问题:
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。(Composite使得用户对单个单元和组合单元的使用具有一致性)。
单元结构图:
假设FE模型中同时存在4种单元:梁,杆,四面体Shell,MPC单元
创建过程如下:
按照如上建立结构后,代码实现了如下的树形结构:
使用Composite模式后,对于调用者来说可以很清楚的看到单元类型的层次结构,由于所有单元类型接口相同,建立好此结构后,调用者可以很方便的添加,删除,查询,组合,管理任意多种类型的单元(比如添加新的类型单元,调用者只需准确定义好单元类型,实现新单元类型的接口,而不用理会有限元模型object的操作)
针对第三个问题,以集束炸弹FE模型建模为例:
假设一个集束炸弹有三个炸弹,每个炸弹有若干子炸弹,每个子炸弹又有多个子炸弹
对于使用者来说,即可以把三个炸弹看做一个炸弹,也可以把任意一个炸弹的子多个子炸弹看做一个炸弹组合。利用Composite在建模的时候解决了子炸弹之间的递归组合问题。
(1)Composite(组合)模式的目的
组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。
实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。
(2)对象树
通常,组合模式会组合出树形结构来,组成这个树形结构所使用的多个组件对象,就自然的形成了对象树。
这也意味着凡是可以使用对象树来描述或操作的功能,都可以考虑使用组合模式,比如读取XML文件,或是对语句进行语法解析等。
---------------------------------------------------------------------------------------------
版权声明:
原创文章,来源多物理场仿真技术,本文已经授权,欢迎分享,如需转载请联系作者。