6

介绍

我想就一个我将自己开始的新编程项目征求很多建议。我将非常精确地说明我想要完成的工作以及我的基本要求。因此,这将是一个很长的问题。请多多包涵。

我将把问题分成五个部分:

  1. 现实世界的问题
  2. 模拟问题
  3. 要求和偏好
  4. 附加信息
  5. 建议请求列表

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)进行扩展,以从原始数值数据生成和可视化结果。我希望能够进行并行计算,并且需要与几个第三方开源和专有软件进行通信。

为了完成这一切,我需要一大堆现有的库/包/技术等。对于所有相关问题,我知道我可以使用什么,但我不知道我应该使用什么。最好的解决方案是一如既往地尝试一切,看看什么最有效。但是,如果任何有经验的用户可以淘汰一些不太可能的候选人,我很乐意收到他或她的建议、建议、赞成/反对名单:

  1. 粘合 C++ 和 CPython(例如 CTypes、SIP、SWIG 等)
  2. C++ 线性代数数字运算库(例如 Armadillo、Eigen、PETSc 等)
  3. 图形界面开发库(如Qt、GTK、wxWidgets等)
  4. 软件通信和并行计算(例如 MPICH、OpenMPI、OpenMP 等)
  5. CPython 2.7.x 或 CPython 3.x

注意:我在上面总结了一些选项,但这些只是示例性的,并非限制。只要它是用 C、C++、Fortran 或 Python 编写的,我对一切都是开放的。此外,我不希望一个人在上面列出的所有五个类别中都给出答案。让社区的集体知识来解决这个问题。

我感谢所有贡献者,并祝您在自己的努力中一切顺利。

4

4 回答 4

1

图形界面开发库(例如 Qt、GTK、wxWidgets 等)
如果您的“主要操作系统是基于 KDE 的 Linux 发行版”,那么 QT 无疑会胜出。
这背后的逻辑:-

  • KDE 是用 QT 编写的。在 KDE 中运行的 QT 应用程序是空中的鹰!它在它的元素中。使用 KDE 作为第一目标,您的 QT GUI 很可能开箱即用,用户无需下载额外的 gui 库。您的 GUI 也将看起来超级原生。
  • QT 是三者中最便携的。(您提到“主要操作系统”,暗示其他平台可能会跟进)。因此,使用 qt 您可以移植到 Windows、OSX、GNOME、嵌入式 Linux、Android、Symbian、HAIKU、Solaris ..等
  • QT 可以说是前三个跨平台 GUI 库(恕我直言)中最好的 RAD 工具。想想 QTCreator vs wxSmith vs Anjuta/Glade。
  • linux 上的 wxWidgets 基本上是 GTK+(v1 到 v3)+ 附加助手的 wapper。我更喜欢它而不是 GTK。它还围绕 X11 和主题,但相信我,首席,你不会喜欢这些端口。
  • wxWidgets 的可移植性并不像人们想象的那样无缝。每个端口都是完全不同的实现,每个端口都包装完全不同的后端!我曾经移植了一个使用 wxDataViewCtrl 和自定义树模型的小应用程序。SIGSEGV 成为了当时的秩序。所以我最终决定使用通用的 wxDataViewCtrl(在 GTK+3 中看起来很有趣)。我仍然喜欢 wxWidgets。

注意:还可以考虑将最新的 Web 技术用于 MVC(模型视图控制器)的 C&V 部分。
HTML5+CSS3+JS 可以由桌面应用程序上的 Web 视图小部件运行。以上 3 个 GUI 库都支持这个控件(对于 wx,它是 wx2.9.3 及更高版本)。
网络技术:-

  • 拥有(可以说)所有 GUI 库中最快的上市时间。
  • 拥有(可以说)当今任何 GUI 技术中最可用且最实惠的开发人员。
  • 生成任何 GUI 库中最令人惊叹的 UI。
  • 生成任何 GUI 库中最少的“刚性”用户界面......您可以通过鼠标悬停在任何轴上旋转一个 gui 元素,例如一个带有精美动画的 html 表格,而无需任何编程开销!..没有 js..没有 c++。 .纳达!

CPython 2.7.x 或 CPython 3.x
- CPython 可能不太适合您的项目要求(我认为),主要是因为互斥怪物是全局解释器锁 (GIL) 瓶颈。
也许 PyPy 对你的项目来说会是一个更好的 python 实现?

顺便说一句,您是否还考虑过:- V8 上的 Javascript 与 Python(PyPy、CPython 等全部)? V8 运行的 Javascript 可以与 Native Code (c++) 交互,有点像 Ctypes 和 python

我也看到了这个有趣的博客(JS on V8 vs Py)。

于 2013-05-26T01:54:35.443 回答
1

你提到了并行性,但没有提到你打算如何使这个项目并行。这是一个比简单地选择几个库要复杂得多的问题。在继续前进之前,需要考虑几个主要因素。

您简要提到了预期的平台,但您还必须考虑模拟是在单个计算机/节点上运行还是在多个计算机/节点上运行。考虑到您正在对建筑物进行迭代模拟,您可能需要比任何一台计算机都提供的更多的计算能力。这意味着,除非您想采用混合多进程、多线程方法,否则您将受限于并行的多进程模型。OpenCL 和 MPI 是您实施的每个选项。(注意:MPICH 和 OpenMPI 都只是 MPI 的实现,您的代码应该与这些无关) 使用 MPI 进行消息传递是一个很好的通用并行模型,但是对于那些不习惯使用并行代码的人来说,这可能会非常困难。

并行模型问题带来的一个问题是它直接影响仿真软件。我不完全确定您计划将您的算法与模拟分开的程度。如果您计划让您的代码分叉单独的进程来运行模拟,您将遇到跨平台支持的问题,因为您可能无法以这种方式运行任意模拟。如果您打算在您的软件中运行模拟,则并行模型必须始终保持一致。尽管这对黑盒策略造成了限制,但它可能会使整个事情变得更加可行。

关于适用的库已经说了很多。对于尚未提及的特定库,我没有更多要说的了。请记住,在运行模拟时必须解决许多相同的问题。

TLDR:不应忽视并行性。在对库做出决定之前,您需要知道将使用哪种并行模型。

于 2013-05-26T03:15:21.143 回答
0

听起来像过早的优化。您需要编写代码,大量代码,到处打印以获取统计信息,然后尝试至少两种不同的方法来获得基准,然后做出合理的决定。做这项工作没有替代品,其他任何事情都只是挥手而已。

于 2013-05-26T03:20:31.627 回答
0

可能,gmp。您可以在此处找到更多详细信息:http: //gmplib.org/

于 2013-05-18T20:06:52.657 回答