介绍
我想就一个我将自己开始的新编程项目征求很多建议。我将非常精确地说明我想要完成的工作以及我的基本要求。因此,这将是一个很长的问题。请多多包涵。
我将把问题分成五个部分:
- 现实世界的问题
- 模拟问题
- 要求和偏好
- 附加信息
- 建议请求列表
1.现实世界的问题
摩天大楼和大型桥梁受到动态风荷载的影响。这意味着,如果设计不正确,它们可能会由于风引起的振动而倒塌(这实际上发生在 1940 年:http ://www.youtube.com/watch?v=3mclp9QmCGs )。为了正确设计此类结构,需要高效的数字运算软件进行分析和仿真。
2.模拟问题
存在大量能够模拟流体流动或结构力学的软件。许多已经开发了 30 多年,并且是经过验证的成熟技术。因此,编写一个能够从头开始同时模拟流体流动和结构力学的多物理程序是不明智的。首先,您需要多年的发展才能达到成熟,并且很难进入一个依赖特定软件超过 30 年的世界。但更重要的是......当你可以重复使用时,为什么要重新创建?与其追求单一的方法,我更喜欢一种可以重用现有仿真软件的分区方法。
在分区方法中,我将使用软件 X 来模拟流动,我将使用软件 Y 来模拟结构。然后我将编写自己的耦合算法,建立 X 和 Y 之间的通信并使用它们来模拟多物理问题(例如摩天大楼或桥梁的风致振动)。我使用 X 和 Y 而不是实际的软件名称的原因是因为 X 和 Y 应该是黑盒。我的耦合算法决不依赖于 X 和 Y 的实现。该算法将仅依赖于 X 和 Y 的输出。这样,最终用户可以选择他们可以使用哪个 X 或 Y 或者哪个任何时候 X 或 Y 都能够完成最终用户想要实现的目标。
因为我想使用黑盒分区方法,所以软件 X 对 Y 一无所知,反之亦然。但是,如何在不了解周围气流的情况下模拟桥梁的变形,以及如何在不了解其变形的情况下知道周围气流以何种方式受到结构的扰动?答案很简单:从猜测开始,使用迭代方法收敛到正确的解决方案。然而,这种方法在计算上非常昂贵。为了降低计算成本,可以使用非常有效的技术以巧妙的方式编写耦合算法,此处不再讨论。我想说的是,需要一些繁重的线性代数数字运算。
3. 要求和偏好
我需要做的是:
- 在第三方开源或专有软件之间建立通信
- 执行一些繁重的数字运算(线性代数)
- 可视化结果(2D / 3D 绘图和动画)
- 提供交互式分析和开发环境
- 创建直观的图形用户界面
我希望我的软件是什么:
- 开源的
- 跨平台
- 可通过脚本和/或共享库扩展
我要使用什么:
- 用于繁重数字运算的 C++
- 用于编程逻辑的 CPython
- NumPy / SciPy 用于 CPython 中的一些数字运算
- Matplotlib 用于 CPython 中的结果可视化
4. 附加信息
事实:
- 开始一个人的项目,如果成功就成长为公司
- 主操作系统是基于 KDE 的 Linux 发行版
商业模式:
- 免费软件和基本文档。
- 付费服务和详尽的文件。
5. 建议请求列表
我想通过编写许多单独执行一项小任务的函数来完成 C++ 中的所有数字运算。程序逻辑将包含在一个 CPython 包中,该包执行整个模拟,同时依靠 C++ 函数来执行数字运算。C++ / CPython 算法将使用用 CPython 编写的脚本(使用 NumPy、SciPy、SymPy 和 Matplotlib)进行扩展,以从原始数值数据生成和可视化结果。我希望能够进行并行计算,并且需要与几个第三方开源和专有软件进行通信。
为了完成这一切,我需要一大堆现有的库/包/技术等。对于所有相关问题,我知道我可以使用什么,但我不知道我应该使用什么。最好的解决方案是一如既往地尝试一切,看看什么最有效。但是,如果任何有经验的用户可以淘汰一些不太可能的候选人,我很乐意收到他或她的建议、建议、赞成/反对名单:
- 粘合 C++ 和 CPython(例如 CTypes、SIP、SWIG 等)
- C++ 线性代数数字运算库(例如 Armadillo、Eigen、PETSc 等)
- 图形界面开发库(如Qt、GTK、wxWidgets等)
- 软件通信和并行计算(例如 MPICH、OpenMPI、OpenMP 等)
- CPython 2.7.x 或 CPython 3.x
注意:我在上面总结了一些选项,但这些只是示例性的,并非限制。只要它是用 C、C++、Fortran 或 Python 编写的,我对一切都是开放的。此外,我不希望一个人在上面列出的所有五个类别中都给出答案。让社区的集体知识来解决这个问题。
我感谢所有贡献者,并祝您在自己的努力中一切顺利。