云霄一羽

V1

2022/07/11阅读:9主题:自定义主题1

工程结构分析的底层原理(3):开源项目StructEngPy简介

StructEngPy简介

这个项目名字没什么想象力,StructEngPy,就是Python实现的结构工程工具。代码托管在github(GitHub - zhuoju36/StructEngPy: 基于Python的建筑结构有限元分析程序),会边写边更新。

严格来说我更愿意称这个为结构分析程序,而不是有限元分析程序,因为它的领域非常单一:建筑结构工程,这意味着这个项目中只打算实现一些建筑结构工程中可能用到的力学单元,而并不打算实现其他流体、电磁、热等通用意义上的有限元法分析,更不能包含有限元的本义:对偏微分方程的方程的一种离散数值求解方法。所以加上建筑结构的限定词还是必须的。

编程语言

为什么要用Python来做这个项目?

Python最大的优点是极端简洁,简洁到与算法描述中的伪代码也相差无几,一行可以等同C/C++等传统语言的十倍,而且由于是动态语言,不需要考虑各种类型的约束和转换,写起来非常简单,极其容易上手学习,是当今最流行的编程语言之一,据说也是现在很多学弟学妹的必修课,群众基础广,自然也方便更多人读懂这个项目。

Python有非常活跃的社区,开源社区贡献的工具非常多,可以在开源社区上面找到开发这个项目需要的一切底层工具,从科学计算到可视化,都是成熟且免费的,这意味着所有人都可以平等合法地获得并运行这个项目的代码,这将使得项目能帮到更多希望一起学习的同好。

但另一方面,Python毕竟是动态语言,数据类型需要在运行时判定并解释,与Matlab等多数动态语言一样,会比C/C++等静态类型的语言慢很多。这个属于鱼与熊掌不可兼得(Julia:不,我全都要),那毕竟不是做商业软件,主要是学习研究,当然是越简单易读越好。

这个专栏不打算细说Python基础,默认读者有基本的编程能力,但有些稍微高级一点的编程技巧会稍微多解释一点。

系统架构

总体来说,StructEngPy组织为基本的几个提供具体功能的包:

  • fe_model:有限元模型,用于直接产生矩阵、向量以进行求解的模型、包含本构模型、结点、单元等基础数学力学概念,对应通用有限元分析的前处理过程
  • fe_solver:对有限元模型的进行静力和动力分析的求解器,对应通用有限元分析的求解过程
  • fe_post:对有限元模型分析结果进行处理,对应通用有限元分析的后处理过程

fe_model、fe_solver、fe_post三者对应有限元分析的底层,就是我们通常说的软件的内核,这个层次实际上决定了各种基本计算假定,也决定了各种计算速度、容量、精确度、稳定性、收敛性等软件特性,是最关键的底层技术,统一放在structengpy.core内。

  • app:各种内核层之上的应用,是有限元模型的进一步封装,反映材料特性、构件截面、节点构造、单位制、工程规范等工程领域的高级概念,通过网格化过程转化为有限元模型后,通过操作内核层进行计算求解,并提供一些对终端用户的操作接口。
  • 其他辅助模块:提供坐标系计算的csys.py; 提供日志功能的logger.py等

实际上,内核层上面可以添加各种高级模块,由此就可以构建更多专门分析的领域程序、如多高层结构、桥梁结构等。也可以通过相关接口与其他软件交互,如与rhino、grasshopper等联合建模、分析、优化、或是与sap2000、ansys、yjk等互相交互计算等,由于程序是开源的,可以自由发挥。

架构设计上各个包是职责分明的,但前面也说了,这只是个Toy,并没有为各个包和它们的模块们编写单元测试,也没有更多进一步的集成测试,因此并不是一个可靠性很高,不排除有bug。当然如果有人愿意贡献力量编写测试就更好了。

编程范式

各种编程范式本质上是对代码和数据结构的组织方式,不论是面向过程还是面向对象的设计方法都不影响计算的结果。但StructEngPy的目标主要是学习和探讨,而不是高性能计算,因此突出概念,清晰易读非常重要。

因此与很多教材用Fortran、C之类的早期语言实现不同,StructEngPy从底层开始的编写就选用了面向对象的编程范式,所有的坐标系、结点、单元等概念,都按对象的方式组织。这样的好处是,概念非常清晰,操作简单,代码维护性、扩展性、复用性都比较好。

当然弊端也非常明显,对象化的处理在Python语言的层面产生了大量的打包、拆包的过程,这进一步降低了程序运行的速度,这个项目并不追求计算效率,适当舍弃也是可以的。当然,具体代码上会尽量用一些设计和技巧以尽量提升一点速度。

基于这些宏观的概念,后面我们就可以逐一讨论每个技术细节的实现了。

分类:

数学

标签:

数学编程

作者介绍

云霄一羽
V1