序章
自分で始めようとしている新しいプログラミング プロジェクトについて、たくさんのアドバイスを求めたいと思います。何を達成したいのか、そして私の基本的な要件が何であるかについて、私は非常に正確になるつもりです. したがって、これは長い質問になります。我慢してください。
質問を 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 での数値計算用)
- CPython で結果を視覚化するための Matplotlib
4. 追加情報
事実:
- スタート時はワンマンプロジェクト、成功すれば会社へと成長
- 主な OS は 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 で書かれている限り、私はすべてに対してオープンです。また、上記の 5 つのカテゴリすべてについて、1 人の個人から回答が得られるとは思っていません。コミュニティの集合知に任せましょう。
すべての貢献者に感謝するとともに、あなた自身の努力における幸運を祈っています。