有限ボリュームコードのデータ構造:配列とクラス


11

磁気流体力学(MHD)の有限ボリュームコードを記述する必要があります。以前に数値コードを書いたことがありますが、この規模ではありません。クラスでデータ構造(オブジェクト指向アプローチ)を使用するか、速度、スケーラビリティなどの点で異なるプロパティに複数の配列を使用するか、どちらが良い選択かを尋ねたかっただけです。Pythonでコードを記述し、数値的に集中的な部分にはfortranを使用します。

Pythonのクラスの例は次のようになります

class Cell:
   def __init__(self, x, y, z, U):

配列は単純に次のように定義できます

x[nx][ny][nz]
y[nx][ny][nz]
z[nx][ny][nz]
U[nx][ny][nz]

回答:


9

簡単な答え:現代のpythonでは、すべてのデータ型がクラスであるため、正式に提案した2つのソリューションに違いはありません。(新しいスタイルのクラスを使用することを忘れないでください:古典的なクラスは廃止されました!http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classesを参照してください)

質問は次のとおりです:pythonで効率的なデータ構造をどのように整理するのですか?配列として細胞を組織の非常にアイデアことは間違いありませんclass Cellインスタンスがあるあまりにも非効率的で。複雑なリンクリストのように整理されたポインタと不連続なデータが大量にあります。もちろん、リストに新しいセルを簡単に挿入できますが、この機能が必要ですか?それどころか、連続していないデータストレージがあり、異なるレベルのインダイレクションによってすべてのセルにアクセスする必要があります。

numpy.ndarrayデータをメモリとして連続的に整理すると、データはメモリに連続し、異なるセルへのアクセスはメモリブロックを簡単にたどります:スペース効率(ポインタにメモリが無駄になりません)と高速

Ethanが指摘したように、OOの概念を使用する必要がありますが、高レベルでは、通常はを通じて、効率的な低レベルのデータ構造が実装されnumpy.ndarrayます。

オブジェクト指向プログラミングとは、データをより高い抽象化レベルで動作するメソッドにデータをバインドすることです。(例:スパーススーパーノードコレスキー分解のメソッドを使用して、剛性マトリックスがクラスとして定義されたFEMコードを実装しました。最初の実装はインコアでした。アウトオブコア実装が必要な場合、これは継承および下線データストレージへの最小限の調整によって取得されました。スーパーノードコレスキーコードのほぼ100%が再利用されました。)

最後のコメントですが、重要:効率的な数値手順は、アルゴリズムとデータ構造をターゲットコンピューティングアーキテクチャにスマートにマッピングした結果です。間違ったデータ構造から始めると、完全に書き直さなければ効率を回復する方法はありません


@EthanCoon他の答えにコメントしてくれてありがとう。それで私は自分の答えを書いた。
ステファノM

10

私はこれを数日前に熟考していました(Pythonでも)。個人的には、オブジェクト指向プログラミングが常に数値プログラミングに適しているとは思いません。方程式を解くだけでなく、クラスの設計に気を取られてしまいます。私は単純な関数にとどまることを好み、numpyでは方程式をベクトル化できるため、必要な行数は非常に少なくなります。Numpyは、実際の計算がC(またはFORTRAN?)バックエンドで実行されるため、非常に高速です。

あなたがお勧めすること、

  1. numpyを使用した関数型アプローチを使用して、問題の最も単純なバージョンを解決するPythonスクリプトを作成します。たとえば、すべてを任意の単位にして、1D(または2D)のみを試してください。コードが乱雑であれば、この段階で完全に問題ありません。重要なことは、プロジェクトを進めることです。
  2. 動作するものができたら。コードが冗長で屈折している場所を特定します。この段階で、コードを簡素化する方法についてさまざまなアイデアを試すことができます。あなたが自分自身を繰り返していることに気付く機能を導入するかもしれません。元のバージョンと比較して、バグを導入していないことを確認できます。
  3. オブジェクト指向のアプローチがコードの複雑さをさらに軽減するかどうかを決定します。

主なメッセージは、できるだけ簡単な方法で問題を解決するまで、クラスの作成を開始しないことです。問題解決の経験を積むだけで、オブジェクト指向インターフェースを定義する方法がわかります。事前にこれを行うと、邪魔になる可能性があります。


3
オブジェクト指向は数値プログラミングには適していませんが、それが適しているのははるかに高いレベルであるという声明には強く反対します。オブジェクト指向は、物理モデル、メッシュ、ソルバーなどに非常に役立ちますが、ほとんどの場合、セルのレベルでは不適切です。
イーサンクーン

投稿では、数値コードの「時期尚早な客観化」の潜在的な落とし穴について警告したかった。私はオブジェクトの使用に不利ではありません。3番目のポイントを参照してください。オブジェクトが複雑さを軽減できる場合、それらは良いアイデアです。あなたが引用する例は良い使用法であることに同意しますが、その点に到達するには経験が必要です。
-boyfarrell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.