忘记了在哪儿看到的说, 面向对象有限元软件设计有两种思路。 一种是工程师的思路,从有限元方法所涉及的概念搭建:节点,单元,材料,边界条件,加数值算法。第二种思路是数学家的,从求解pde的库入手:向量,矩阵(运算对象)的运算,加有限元组集运算对象。
刚开始很容易从搭模块入手。但是从未来向大规模计算(强扩展性)方向发展来看,像 libmesh 这类典型的数学家级有限元项目(基于petsc),才是实际意义的。因为小规模的问题确实比较儿戏。而且毕竟数学才是一切学科的制高点,需要高瞻远瞩。也恍然,为什么这帮老外都喜欢从范函分析入手搞有限元项目,而且各个对计算库也很有研究。佩服!
周末看了另外一个开源库(oofem), c++写的有限元项目。这个框架设计思路比较符合工程师级别。当然,在具体有限元模块之下还有一个基础类(oofemlib), 提供所有有限元模块的接口(dof,单元,b.c.,gp积分,数值方法),然后每类可用有限元求解的问题,再实现基类中的所有接口。比如,想写个有限元解流体方程,或者解结构方程,就分别实现流体模块(fm),或结构模块(sm)。然后针对具体的流体问题,或者结构问题,就调用fm,或者sm计算。
oofem里有独立的材料模块,非常工程师的风格。相比,一般数学家设计的有限元项目对材料模块的考虑是比较少的。后期有想法作个有限元的流固耦合项目,哈哈,坚持写博客催进度了。