开发 C++ 固体力学程序

计算科学 有限元 C++ 芬尼克斯 交易.ii 固体力学
2021-12-26 01:39:07

我是计算科学和编程的初学者。我正在研究非线性固体力学分析并使用 C++ 进行编码。我一直在探索各种有限元开源程序,并看到了一些不错的作品,例如 Deal.ii、FEniCS、OOFEM、libmesh。但作为 C++ 编程和有限元的初学者,这些程序的文档超出了我的理解和困惑。我希望看到一些简单的面向对象的 C++ 代码来解决有限元问题。我的目标不是研究有限元分析,而是了解它背后的代数在 C++ 面向对象框架中的实现。

关于我的工作,我很清楚我脑海中的程序和概念。我在 MATLAB 中做了一个原型。由于 MATLAB 程序需要太多时间才能得到结果,考虑到以后工作的方便性,我决定改用 C++。但是 C++ 中的各种数据结构让我很难为节点、元素、约束和负载选择合适的存储和结构。在 MATLAB 中,我从电子表格导入准备好的数据(节点、元素连接、载荷和边界约束),并在内置函数中用于计算。在 C++ 实现中,我正在考虑使用文本文件(如在 Abaqus/Calculix 中)进行输入。我该如何实施?

我正在寻找一个注释良好的小型有限元程序源代码,用于解决平面应力问题,就像一些大学用于教学的那种程序。我阅读了 SD Rajan 的书,C++ 中的数值方法,并获得了一些关于 C++ 数据结构的见解,但我仍然需要阅读一些源代码来开发我自己的程序。在我研究的后期阶段,我可以利用现有的有限元库,如 Deal.ii 和 FEniCS。

2个回答

这个问题的具体答案可能是有时间限制的。但是,以下一般方法(来自伟大的 Eric S. Raymond)非常有效:

  1. 模块化规则:编写由干净接口连接的简单部分。
  2. 清晰法则:清晰胜于聪明。
  3. 组合规则:设计要连接到其他程序的程序。
  4. 分离规则:政策与机制分离;与引擎分离的接口。
  5. 简单法则:为简单而设计;只在必须的地方增加复杂性。
  6. 简约法则:只有在证明没有其他方法可以做的时候才编写一个大程序。
  7. 透明规则:设计可见性,使检查和调试更容易。
  8. 稳健性规则:稳健性是透明性和简单性的产物。
  9. 表示规则:将知识折叠成数据,使程序逻辑既愚蠢又健壮。
  10. 最小意外规则:在界面设计中,总是做最不意外的事情。
  11. 沉默法则:当一个程序没有什么令人惊讶的事情要说时,它应该什么也不说。
  12. 修复规则:当你必须失败时,尽快地大声失败。
  13. 经济法则:程序员的时间很昂贵;保存它而不是机器时间。
  14. 生成规则:避免手动破解;写程序尽可能写程序。
  15. 优化法则:先做原型再打磨。在优化之前让它工作。
  16. 多样性规则:不相信“一条真正的道路”的所有主张。
  17. 可扩展性规则:为未来而设计,因为它会比你想象的更早出现。

这不是一个真正的程序,而是一个大型代码库。佛罗里达州立大学的 John Burkardt 维护了丰富的 C++、Matlab 和 Fortran 脚本集合,用于解决大量问题。您可以查看FEM 2D 库或上一级查看那里列出的其他代码。这些对它们有很好的评论,您可以直接查看源代码。