6

序章

自分で始めようとしている新しいプログラミング プロジェクトについて、たくさんのアドバイスを求めたいと思います。何を達成したいのか、そして私の基本的な要件が何であるかについて、私は非常に正確になるつもりです. したがって、これは長い質問になります。我慢してください。

質問を 5 つのセクションに分割します。

  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 での数値計算用)
  • CPython で結果を視覚化するための Matplotlib

4. 追加情報

事実:

  • スタート時はワンマンプロジェクト、成功すれば会社へと成長
  • 主な OS は 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 で書かれている限り、私はすべてに対してオープンです。また、上記の 5 つのカテゴリすべてについて、1 人の個人から回答が得られるとは思っていません。コミュニティの集合知に任せましょう。

すべての貢献者に感謝するとともに、あなた自身の努力における幸運を祈っています。

4

4 に答える 4

1

あなたは並列性について言及していますが、このプロジェクトをどのように並列化するつもりなのかについては言及していません。これは、単にいくつかのライブラリを選択するよりもはるかに複雑な問題です。先に進む前に、いくつかの重要な考慮事項が必要です。

意図したプラットフォームについて簡単に言及しましたが、シミュレーションを単一のコンピューター/ノードで実行するか、複数で実行するかについても考慮する必要があります。建物の反復シミュレーションを行っていることを考えると、1 台のコンピューターが提供できるよりもはるかに多くの計算能力が必要になる可能性があります。これは、複数プロセス、複数スレッドのハイブリッド アプローチを使用しない限り、並列処理の複数プロセス モデルに限定されることを意味します。OpenCL と MPI は、実装のそれぞれのオプションです。(注: MPICH と OpenMPI はそれぞれ MPI の単なる実装であり、コードはこれらに依存しない必要があります) MPI を使用したメッセージ パッシングは、並列処理の優れた一般的なモデルですが、並列コードの操作に慣れていない人にとっては非常に難しい場合があります。

並列モデルの問題から生じる問題は、シミュレーション ソフトウェアに直接影響を与えることです。アルゴリズムをシミュレーションからどれだけ分離することを計画しているかは完全にはわかりません。シミュレーションを実行するためにコード フォークを別個のプロセスにする予定がある場合、この方法で任意のシミュレーションを実行できる余裕がないため、クロスプラットフォームのサポートに問題が生じる可能性があります。代わりに、ソフトウェア内でシミュレーションを実行する場合は、並列モデルが一貫している必要があります。これにより、ブラック ボックス戦略に制限が加えられますが、全体がより実現可能になる可能性があります。

適用可能なライブラリについては、すでに多くのことが述べられています。まだ述べられていない特定のライブラリについては、これ以上言うことはありません。シミュレーションを実行するときと同じ問題の多くは、これらで対処する必要があることに注意してください。

TLDR: 並列処理は見過ごされるべきではありません。ライブラリを決定する前に、使用する並列モデルを知る必要があります。

于 2013-05-26T03:15:21.143 に答える
1

グラフィカル インターフェイス開発ライブラリ (例: Qt、GTK、wxWidgets など)
。「プライマリ OS が KDE ベースの Linux ディストリビューション」である場合、QT がこれに勝ります。
この背後にあるロジック:-

  • KDE は QT で書かれています。KDE で実行される QT アプリは、空中のワシです! それはその要素にあります。KDE がターゲット番号 1 であるため、ユーザーが追加の gui ライブラリをダウンロードしなくても、QT GUI はそのまま使用できる可能性が高くなります。GUI も非常にネイティブに見えます。
  • QT は 3 つの中で最もポータブルです。(「プライマリOS」について言及しましたが、他のプラットフォームが続く可能性があることを示唆しています)。したがって、qt を使用すると、Windows、OSX、GNOME、Embeded Linux、Android、Symbian、HAIKU、Solaris などに移植できます。
  • QT には、上位 3 つのクロス プラットフォーム GUI ライブラリ (IMHO) の中で間違いなく最高の RAD ツールがあります。QTCreator と wxSmith と Anjuta/Glade を考えてみてください。
  • Linux 上の wxWidgets は、基本的に GTK+ (v1 から v3) + 追加ヘルパーのワッパーです。私はGTKよりも好きです。また、X11 とモチーフを包み込みますが、チーフを信頼してください。これらのポートは気に入らないでしょう。
  • wxWidgets の移植性は、思っているほどシームレスではありません。各ポートは完全に異なる実装であり、それぞれが完全に異なるバックエンドをラップしています! カスタム ツリー モデルで wxDataViewCtrl を使用する小さなアプリを移植したことがあります。SIGSEGV が主流になりました。そのため、最終的に汎用の wxDataViewCtrl (GTK+3 ではおかしいように見えます) を使用することにしました。私はまだwxWidgetsが好きです。

注: MVC (モデル ビュー コントローラー) の C&V 部分に最新の Web テクノロジを使用することも検討してください。
HTML5+CSS3+JS は、デスクトップ アプリの Web ビュー ウィジェットで実行できます。上記の 3 つの GUI ライブラリはすべて、このコントロールを備えています (wx の場合、wx2.9.3 以降です)。
ウェブ技術:-

  • (ほぼ間違いなく) 市場投入までの時間は、GUI ライブラリの中で最速です。
  • (ほぼ間違いなく) 現在、あらゆる GUI テクノロジの中で最も利用可能で手頃な価格の開発者がいます。
  • あらゆる GUI ライブラリの中で最も魅力的な UI を作成します。
  • 任意の GUI ライブラリの中で最も「剛性の低い」UI を生成します....任意の軸を中心に gui 要素 (例: HTML テーブル) を、マウスオーバーするだけでファンシーなアニメーションで回転させることができます。プログラミングのオーバーヘッドはありません!なだ!

CPython 2.7.x または CPython 3.x
- 主にグローバル インタープリター ロック (GIL) のボトルネックであるミューテックス モンスターのため、CPython はプロジェクトの要件に適していない可能性があります (私はそう思います)。
多分 PyPy はあなたのプロジェクトにとってより良い Python 実装になるでしょうか?

ちなみに、次のことも考慮しましたか?- V8 と Python の Javascript (PyPy、CPython など)? V8 で実行される Javascript は、Python を使用した Ctypes のような

この興味深いブログ(V8 と Py の JS) にも出会いました。

于 2013-05-26T01:54:35.443 に答える
0

時期尚早の最適化のように聞こえます。コードを大量に作成し、あらゆる場所に大量の出力を配置して統計を取得し、少なくとも 2 つの異なるアプローチを試してベンチマークを取得し、合理的な決定を下す必要があります。仕事をすることに代わるものはなく、それ以外はただ手を振るだけです。

于 2013-05-26T03:20:31.627 に答える