CFDライブラリの開発用のC ++またはPython


13

Computational Continuum Mechanicsの一般的な(有限ボリューム、フェム、dg)ライブラリをコーディングする2つのアプローチの利点/欠点は何でしょうか?これは私が今物を見る方法ですので、あなた自身の経験を提供してください、そして、私のために私を炎上させないでください:):

1)C ++:

  • ジェネリックプログラミング、仮想関数、オーバーロード、速度...:あらゆるものを構築するために利用できるすべてのジャンル+ OOPツール

  • 低レベルのライブラリのほとんどが利用可能(Python向けのような広範な科学技術ライブラリ開発はありません)

2)Python +並列コンピューティング用ラッパー(pyOpenCLなど)

  • さまざまな種類の膨大な量のサポートライブラリ

  • あなたが思うことをコーディングしてください:実装は本当に速く行われます

  • 遅い実行時間

さまざまな方法をサポートし、複雑なジオメトリと問題を処理するフレームワークをコーディングしたい場合、何を選択しますか?その理由は何ですか?


1
私はpyOpenCLにあまり馴染みがありませんが、一般的に言えば、Pythonは低レベル言語(Fortran、Cなど)で計算「カーネル」が実装されていない限り、2Dまたは3Dの中規模の問題でも非常に遅くなります。 )
デビッドケッチャソン

回答:


14

両方の長所を最大限に活用し、Pythonで「ユーザーインターフェイス」(つまり、ライブラリのユーザーが呼び出して、問題のジオメトリやその他のプロパティを記述する関数のフレームワーク)をコーディングすることを目指します。ターンアラウンドタイム、C ++でシミュレーションランタイムを記述します。

実際、私は恐らく最初にPythonでのシミュレーションランタイムをモックアップし、次にそれをC ++コードに置き換えます。最終的には、PythonコードでC ++ソースを生成し、オンラインでランタイムにコンパイルおよびリンクすることを検討できます。これにより、実際のシミュレーションでPythonを呼び出す必要はまったくなく、最後に結果を返すだけです。このセットアップの良いところは、本質的にアジャイルであるということです:最速で最も簡単な作業ソリューションから始めて、何が機能し、何が機能しないかをすぐに見つけ、好きなものを手に入れたらそれをスピードアップできます。

(これは、Pythonの代わりにMapleを使用することを除いて、MapleのODE / DAEソルバーが動作する方法です。完全な開示:私は彼らのために働きます。)


1
+1。Python の優れた点の 1つは、必要に応じて「Pure Python」から離れることができることです。
フォマイト

3

Cythonをアルゴリズムに使用することもできます。「高速」である必要があるいくつかの変数の型情報が追加されたPythonです。PythonコードをCコードに変換し、その後、お気に入りのCコンパイラでコンパイルできます。このタイプの情報を慎重に追加すると、コードが単純なPythonコードよりも最大150倍高速になります。


2

この質問には他にもあると思います。開発者は、何よりもまず、重要な利点(生産性、開発時間、ツールなど)がない限り、慣れ親しんだものを好むでしょう。個人的に、私は生産的であることを優先します(通常、時間は最も少ないリソースです!)、これは私の経験ベースに近い選択肢を支持します。

おそらく考慮に入れることも重要です

3)開発時間

  • 開発のためにどれだけの時間を確保していますか
  • 作業結果はいつ配信されますか?そしてどうやって?
  • 仕事をすることができるコードがすでに存在しますか?(一意性?)

4)メンテナンス

  • いくつの(人)リソースがメンテナンスに充てられていますか?
  • コードに取り組む人は何人ですか?
  • コードはいつかリリースされる予定ですか?(基準?)
  • コードはサードパーティのライブラリに依存しますか?

5)ライセンスの問題

  • 研究のためのコードは何ですか?
  • 商用アプリケーションのコードは何ですか?

6)生産性と楽しい要素(しばしば見落とされます!)

  • 最も生産性の高い場所はどこですか?
  • どこで最も楽しい開発ができますか?
  • (ソーシャル)ネットワークに参加する機会はありますか?

2

これは、コードを次のように記述できるかどうかによって異なります。

some_library_specific_type grid;

for t=0 to T do
    library_function_1(grid,...);
    library_function_2(grid,...);
end

というか、次のように書かなければなりません

some_home_made_mixture_of_native_types grid;

for t=0 to T do
    for all grid elements as g do
        some_function(g,...);
        library_function(g,...);
    end
end

最初のケースでは、コード化するのに最も好きなものを選択します。2番目のケースでは、スクリプト言語を使用したり、実行時間に悩まされたりしないでください。


2

Allanの答えの帰結として(あなた自身の開発者の時間が最も価値のあるリソースであると):他の人がすでにやったことを使ってください。あなたは計算連続体力学のためのライブラリを開発したいと言いますが、すでにいくつかの非常に大きなものがすでにあり、それらはほとんど常に必要なものをすべて持っています。例えば、有限要素問題、流体力学のためのOpenFOAM、または双曲線問題のためのPyCLAW / CLAWPACKとして記述できるすべてのものについては、deal.IIをご覧ください。たとえば、deal.IIではC ++でプログラミングするように求められますが、実際にはプログラミングのレベルが非常に高いため、C ++構文を使用するFEMコードのドメイン固有の言語のように思えます。


2
私がしている決して、私は必要なすべてを持っていたライブラリ...遭遇しない
ジャックPoulson

さて、しかしあなたは私が推測するポイントを得る。一部のライブラリには、必要な「ほぼすべて」のものがあります。私が特によく知っている例を挙げると、deal.IIおよびPETSc 126行のコードを使用して10,000以上のプロセッサで実行される完全自己適応型3Dメッシュ上の有限要素ソルバーです。それは明らかにゼロ以上ですが、実際には内部にあるものの複雑さを考えると、非常に小さな数です。
ウルフギャングバンガース

悪魔の擁護者を演じるには、10,000コアでコードを実行するのは簡単ですが、スケーラブルにすることはまったく異なります。非楕円方程式の並列プリコンディショナーの多くは、300コアでも効率的に実行できません。
ジャックポールソン

承知しました。しかし、私は、引用例があるスケーラブル:math.tamu.edu/~bangerth/publications/2010-distributed.pdf
ウルフギャングバンガース

完全な開示のために:私は、上記の論文とコードの両方の著者であり、deal.IIライブラリーの著者でもあります。
ウルフギャングバンガース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.