計算科学

科学的問題を解決するためにコンピュータを使用する科学者のためのQ&A

5
不適切な積分をどのように近似できますか?
が有限であるような関数があり、この積分を近似したいです。 ∫ R 3、F (X 、Y 、Z )のD Vf(x,y,z)f(x,y,z)f(x,y,z) ∫R3f(x,y,z)dV∫R3f(x,y,z)dV\int_{R^3} f(x,y,z)dV 私は求積規則と積分のモンテカルロ近似に精通していますが、無限領域でそれらを実装するのは困難です。モンテカルロの場合、無限の領域をサンプリングするにはどうすればよいですか(特に積分に大きく寄与する領域が不明な場合)。直角位相の場合、どのようにして最適なポイントを見つけるのですか?原点を中心とする任意の大きな領域を単純に修正し、スパース直交ルールを適用する必要がありますか?この積分をどのように近似できますか?

3
階層シミュレーションデータを保存するためのベストプラクティス
TL、DR 大量の階層構造データを保存するための科学コンピューティング界で受け入れられているベストプラクティスは何ですか?たとえば、SQLは大きなスパース行列ではうまく機能しません。この種のデータを構造化し、保管し、分析するための優れたツールはありますか?LHCのスタッフは何を使用していますか? ユースケースの詳細 次の階層に従ってタンパク質シミュレーションのデータを保存します。 protein |__simulation conditions |____|__residues |____|____|__conformers |____|____|____|__atoms すべてのタンパク質はその各残基を認識している必要があり、すべての原子はそのシミュレーションなどに使用される条件を知っている必要があります。 もともと、このアプリケーションにはリレーショナルデータベースが最適であると考えたため、pythonとsqlalchemeyを使用して、SQLデータベースにデータを保存するプログラムを作成しました。ただし、実際には、このプログラムはあまりうまく機能していません。 最大の問題は、配座異性体データレベルにN x N行列があり、配座異性体のすべての可能なペア間のペアワイズ相互作用によるポテンシャルエネルギーを格納するという事実に関連しています。マトリックス内のエントリのほとんどはゼロです。そのため、データベース内の別のテーブルに、エントリごとに1行、一種のスパース形式でマトリックスを格納しています。残念ながら、数千の配座異性体を含むシミュレーションの場合、ペアワイズテーブルは依然として数十万行になり、次のようになります。 a)構築とクエリが非常に遅い(時間) b)非スパースマトリックスとしてのデータの同等のプレーンテキスト表現よりもハードドライブ上のスペースを1桁多く 消費するc)10ギガバイト以上のメモリを消費するテーブルはメモリに読み込まれます 私の最終的な目標は、データベースに数万の実行(数十のシミュレーション条件下での数千のタンパク質から派生)を保存して、それらをすべて一緒に分析できるようにすることです。これは、ペアワイズ行列を表すテーブルが約10億行になる可能性が高いことを意味します。現在、このデータベースで単一のクエリを実行するためにも、Crayまたはその他の共有メモリモンスターが必要になるようです。 ここにはより良いオプションがありますか?LHCのスタッフは何を使用していますか?

5
クラスを使用して数値アルゴリズムをカプセル化することに固有の利点と欠点は何ですか?
科学計算で使用される多くのアルゴリズムは、ソフトウェア工学のあまり数学集約型ではないと一般的に考えられているアルゴリズムとは異なる固有の構造を持っています。特に、個々の数学アルゴリズムは非常に複雑になる傾向があり、多くの場合、数百行または数千行のコードが含まれますが、状態は含まれません(つまり、複雑なデータ構造に作用しません)。インターフェイス-配列(または2つ)に作用する単一の関数へ。 このことは、クラスではなく、関数が科学計算で遭遇するほとんどのアルゴリズムへの自然なインターフェースであることを示唆しています。しかし、この議論は、複雑なマルチパートアルゴリズムの実装がどのように処理されるべきかについてほとんど洞察を提供しません。 従来のアプローチは、他の多くの関数を呼び出す1つの関数を使用して、関連する引数を途中で渡すだけでしたが、OOPはアルゴリズムをクラスとしてカプセル化できる別のアプローチを提供します。明確にするために、アルゴリズムをクラスにカプセル化するということは、アルゴリズム入力がクラスコンストラクターに入力され、パブリックメソッドが呼び出されて実際にアルゴリズムを呼び出すクラスを作成することを意味します。このようなC ++ psuedocodeでのマルチグリッドの実装は次のようになります。 class multigrid { private: x_, b_ [grid structure] restrict(...) interpolate(...) relax(...) public: multigrid(x,b) : x_(x), b_(b) { } run() } multigrid::run() { [call restrict, interpolate, relax, etc.] } 私の質問は次のとおりです。クラスを使用しない従来のアプローチと比較して、この種のプラクティスの利点と欠点は何ですか?拡張性や保守性の問題はありますか?明確にするために、私は意見を求めるつもりはありませんが、そのようなコーディング手法を採用することのダウンストリーム効果(つまり、コードベースが非常に大きくなるまで生じない効果)をよりよく理解するつもりです。
13 algorithms 

2
ストークス方程式に混合有限要素法の互換性条件を課す
\newcommand{\v}[1]{\boldsymbol{#1}} 次のストークスフローモデル方程式があるとします。 {−div(ν∇u)+∇pdivu=f=0{−div(ν∇u)+∇p=fdivu=0 \tag{1} \left\{ \begin{aligned} -\mathrm{div}(\nu \nabla \v{u}) + \nabla p &= \v{f} \\ \mathrm{div} \v{u} &= 0 \end{aligned} \right. ここで、粘度は関数であり、標準の混合有限要素では、安定ペアを使用するとします。速度\ v {u}および要素ごとの一定空間にCrouzeix-Raviart空間圧力のS_hV h u S h pν(x)ν(x)\nu(x)VhVh\v{V}_huu\v{u}ShShS_hpppは、次の変分形式があります。 L([u,p],[v,q])=∫Ων∇u:∇v−∫Ωqdivu−∫Ωpdivv=∫Ωf⋅v∀v×q∈Vh×ShL([u,p],[v、q])=∫Ων∇あなたは:∇v−∫Ωqd私vあなたは−∫Ωpd私vv=∫Ωf⋅v∀v×q∈Vh×Sh \mathcal{L}([\v{u},p],[\v{v},q]) = \int_{\Omega} \nu \nabla\v{u}:\nabla \v{v} -\int_{\Omega} q\mathrm{div} \v{u} -\int_{\Omega} p\mathrm{div} \v{v} =\int_{\Omega} \v{f}\cdot \v{v} \quad \forall \v{v}\times q\in \v{V}_h\times …

3
単精度と倍精度の浮動小数点精度
単精度の浮動小数点数はメモリの半分を占有し、最新のマシン(GPUの場合でも)では、倍精度に比べてほぼ2倍の速度で操作を実行できます。私が見つけた多くのFDTDコードは、単精度の算術演算とストレージのみを使用しています。大規模なスパース方程式を解くために単精度を使用することが許容される場合の経験則はありますか?マトリックス条件数に大きく依存する必要があると思います。 さらに、必要に応じて倍精度を使用し、倍精度を必要としない単一精度を使用する効果的な手法はありますか。たとえば、行列ベクトル乗算またはベクトルドット積の場合、結果を倍精度変数に蓄積して(キャンセルエラーを回避する)ことをお勧めしますが、個々のエントリは互いに乗算する必要があります単精度を使用して乗算できます。 最新のFPUでは、単精度(浮動)から倍精度(倍)へ、またはその逆にシームレスに変換できますか?または、これらの費用のかかる操作ですか?

3
50x50マトリックスの最大固有値を見つけるためのSVD —かなりの時間を無駄にしていますか?
すべての特異値分解を実行することにより、多くの実対称50x50行列の最大固有値を計算するプログラムがあります。SVDはプログラムのボトルネックです。 最大の固有値を見つけるのにはるかに速いアルゴリズムがありますか、またはこの部分を最適化しても投資収益率があまり高くないでしょうか?

3
NumpyがSVDを実行する方法を理解する
私は、行列のランクと行列方程式の解の両方を計算するために、さまざまな方法を使用しています。関数linalg.svdに出会いました。これを、Gaussian Eliminationでシステムを解くという私自身の努力と比較すると、より速く、より正確に見えるようです。私はこれがどのように可能かを理解しようとしています。 私の知る限り、linalg.svd関数はQRアルゴリズムを使用して、行列の固有値を計算します。私はこれが数学的にどのように機能するかを知っていますが、Numpyがどのようにそれを迅速かつあまり正確に失うことなく行うのかわかりません。 私の質問:numpy.svd関数はどのように機能し、より具体的には(ガウス消去と比較して)高速かつ正確にどのように処理するのですか?

4
スペクトルノルムシュートアウト(gcc、intel、その他のコンパイラーを使用)でCはFortranよりも遅いですか?
ここでの結論: Fortranコンパイラは本当にどれほど優れていますか? gfortranとgccは単純なコードと同じくらい速いということです。そこで、もっと複雑なものを試してみたかったのです。スペクトル標準の銃撃戦の例を取り上げました。最初に2DマトリックスA(:, :)を事前に計算してから、ノルムを計算します。(この解決策は銃撃戦では許可されていません。)FortranとCバージョンを実装しました。コードは次のとおりです。 https://github.com/certik/spectral_norm 最速のgfortranバージョンはspectrum_norm2.f90とspectrum_norm6.f90です(一方はFortranの組み込みmatmulとdot_productを使用し、他方はコードにこれら2つの関数を実装します-速度に違いはありません)。私が記述できた最速のC / C ++コードはspectrum_norm7.cppです。私のラップトップでのgitバージョン457d9d9のタイミングは次のとおりです。 $ time ./spectral_norm6 5500 1.274224153 real 0m2.675s user 0m2.520s sys 0m0.132s $ time ./spectral_norm7 5500 1.274224153 real 0m2.871s user 0m2.724s sys 0m0.124s そのため、gfortranのバージョンは少し高速です。何故ですか?より高速なC実装でプルリクエストを送信する(またはコードを貼り付ける)場合、リポジトリを更新します。 Fortranでは2D配列を渡しますが、CIでは1D配列を使用します。2D配列またはその他の適切な方法を自由に使用してください。 コンパイラについては、gccとgfortran、iccとifortなどを比較してみましょう。(ifortとgccを比較するシュートアウトページとは異なります。) 更新:バージョン179dae2を使用すると、Cバージョンのmatmul3()が改善され、同じように高速になりました。 $ time ./spectral_norm6 5500 1.274224153 real 0m2.669s user 0m2.500s sys 0m0.144s $ time ./spectral_norm7 5500 …
13 fortran  c 

4
植物の根の構造を表すランダムな3Dドメインを作成する方法は?
植物の根から茎までの層流をモデル化したいと思います。根元の一番端では、チューブの直径と長さはミリメートルからセンチメートルまでさまざまです。茎に近づくと、根の長さと直径が大きくなります。直径と長さが異なる根のネットワークを表すランダムな3Dドメインを作成したい。このジオメトリを作成する最良の方法は何でしょうか。

5
貢献するオープンソースプロジェクトの発見について
この質問はStackoverflowで10億回尋ねられましたが、焦点は常に非数値コーディングにありました。私は数値計算と高性能計算の範囲内で貢献するプロジェクトを探しています。私は理想的には小さなプロジェクトを好むでしょうが、それは必要ではありません。 SciCompに関連するオープンソースプロジェクトに参加する最良の方法は何でしょうか?どこからプロジェクトを探し始めますか?そのようなプロジェクトに参加する最良の方法は何でしょうか?機能のリクエスト/バグ/ドキュメントまたはその他? ATLASやNixのようなものを見て、N00Bからアクティブにどのように行きますか?
13 software 

1
Fortran(またはC)コードを解析して、Fortran(またはC)関数の間隔拡張を生成できるツールはありますか?
博士論文のケーススタディでは、CHEMKIN-IIの Fortranサブルーチンの間隔拡張が必要です(リンクの謝罪。SandiaNational Laboratoryによって配布されなくなったパッケージで見つけることができる最高のものです)。CHEMKIN-IIは、燃焼化学で使用される化学パッケージです。燃焼で使用される標準パッケージであるため、別のパッケージを使用することはできません(むしろ、実際には使用しないことを好みます)。 必要な間隔拡張を取得するために、社内で開発したDAEPACKというツールを使用しました。32ビットOS(gcc 2.95に対応するlibstdcのバージョン)で必要だったCHEMKIN-IIサブルーチンの必要な間隔拡張を生成できるようになっていた古いバイナリは、数年前に落ちました、そして使用するための途方もない試練になります(私が使用したソフトウェアの他のすべての部分の32ビットバージョンを見つける必要があるため)。このパッケージのソースコードもプロプライエタリですが、もともとMITで開発され、MITで働いているため、(かなりの努力を払って)DAEPACKのソースコードを取得できました。私が持っているソースコードを使用して、64ビットバージョンのLinuxおよびgcc 4.xxに対応するlibstdcのバージョンと互換性のあるDAEPACKのバージョンをコンパイルできました。しかし、このソースコードは古いと思われ、論文を完成するために必要な間隔拡張コードを正常に生成しない実行可能ファイルにコンパイルします。開発者に連絡してソースコードの修正を依頼しましたが、以前に開発者と連絡を取ったところ、彼がソースコードを修正したとしても、ソースコードを修正するには時間がかかることがわかりました。 ここに大きな問題があります。資金を使い果たしたため、卒業するまで6か月が残っています。開発者に頼ってDAEPACKをすばやく修正して、博士論文を正常に完成させることはできません。 次のことを行うパッケージが必要です。 区間拡張、テイラーモデル(区間演算を使用)、およびほぼ任意のFortran 77コードの導関数を生成します。DAEPACKによって解析されない構造は、DOループとIFステートメントだけだと思います。テイラーモデルが必要なので、コードには自動微分(AD)機能も必要です。 Fortran 77コードのソースからソースへの変換により、これらの区間拡張とテイラーモデルを生成します(つまり、コンパイラーのようにソースコードを解析して、区間拡張とテイラーモデルを計算するソースコードを生成します)。 ピンチでは、Fortran 77コードの代わりにCコードに上記の2つのことを行うソフトウェアを使用して、すべてを通過させることができf2cます。すべてを通過させることでうまくいくかどうかわからないので、私はこのようにしないことを本当に好みますf2cが、私はかなり必死です。 必死の博士課程の学生を助けることができますか? いくつかの可能な提案を予想するために、時間の制約を考えると、ここではうまくいかないアプローチがあります: DAEPACKを機能させるために一生懸命努力しています。信じて、試してみた。そして、私は頻繁に開発者を盗聴しています。 オブジェクト指向(またはオブジェクト指向のような)アプローチを使用して、区間拡張またはテイラーモデルを計算するツール。CHEMKIN-II(または他の同様に大きなライブラリ)を新しいタイプで再コーディングする時間がありません。大きすぎます。 Fortran 77/90またはC以外の言語を使用します。CHEMKIN-IIコードはFortranにあります。を使用してCに変換できf2cます。必要な場合は、TChemと呼ばれるCHEMKIN-IIのSandiaベースのクローンを使用します。私の以前の結果はCHEMKIN-IIを使用しています。私の新しい結果は私の古い結果を再現するはずであり、Canteraはケーススタディとユニットテストに基づいてCHEMKIN-IIが行うことを再現しないことをすでに知っています。さらに、私に先行した大学院生は、CHEMKIN-IIソースコードに黒魔術をかけて、区間演算を特にうまく機能させました。それを他のパッケージに複製するのは難しいでしょう。

5
科学ソフトウェアはどの程度最適化する必要がありますか?
大量の計算リソースを必要とするアプリケーションの場合、科学的結果の提供や合理的な時間での「ブレークスルー」の達成に関して、高性能は重要な要素となります。 ソフトウェア開発者は、アプリケーションの最適化にどれだけの時間と労力を投資すべきですか?使用される主要な基準は何ですか?
13 software  hpc 

2
双曲線PDEに使用すべき時間積分法はどれですか?
双曲線PDEの離散化(時間と空間の個別の離散化)に線の方法を使用する場合、お気に入りの数値法(fx。有限体積法)による空間的離散化の後に得られるのは、実際に時間的離散化に使用するODEソルバーです(TVD / SSP /など)? いくつかの追加情報が追加されました。精度の問題は、滑らかでない問題の問題になる可能性があります。初期解が滑らかであるにもかかわらず、非線形双曲線PDEが有限時間で衝撃を発生させる可能性があることは知られています。 ODE安定性解析は通常、線形化に基づいて行われ、q_t = J q(qa摂動ベクトル)の形式のODEの線形半離散システムを取得します。ここで、Jの固有値は、選択した時間の絶対安定領域ステッピング方法。代替戦略は、安定性解析のために擬似スペクトルまたはエネルギー法を使用することです。 TVD / SSPメソッドの動機は、非物理的な動作を引き起こす可能性のある時間ステップメソッドによって引き起こされるスプリアス振動を回避することです。問題は、たとえば、明示的なルンゲクッタ法などの古典的な作業馬と比較して、これらのタイプの時間ステップ法が優れていることを経験が示しているかどうかです。明らかに、ソリューションにはショックが現れる可能性のある問題のクラスに対して、より良いプロパティが必要です。したがって、時間積分にはこれらのタイプの方法のみを使用する必要があると主張できます。

1
圧縮性オイラー方程式を解くための可能な方法は何ですか
圧縮可能なオイラー方程式用の独自のソルバーを作成したいと思います。最も重要なことは、すべての状況でロバストに動作することです。FEベースにしたいと思います(DGは大丈夫です)。可能な方法は何ですか? 私は0次DG(有限量)を行うことを認識しており、非常に堅牢に動作するはずです。基本的なFVMソルバーを実装しましたが、うまく機能しますが、収束が非常に遅くなります。ただし、これは間違いなく1つのオプションです。 線形化されたオイラー方程式のFEソルバー(任意のメッシュと任意の要素の任意の多項式次数で動作します)を実装しましたが、スプリアス振動を取得しています(そして最終的には吹き飛ばされるので、使用できませんので問題を解決します)。私はそれを安定させる必要があることを文献で読みました。何らかの安定化を実装すると、すべての問題(境界条件と形状)に対して安定して機能しますか?収束率はいくらですか? それ以外に、オイラー方程式の他の堅牢な方法論がありますか(つまり、安定化を伴う高次DG)。 多くの人が自分の研究コードでさまざまなことを試したことを知っていますが、すべてのジオメトリと境界条件で機能する堅牢な方法に興味があります(編集:2Dおよび3D)。

5
CFDライブラリの開発用のC ++またはPython
Computational Continuum Mechanicsの一般的な(有限ボリューム、フェム、dg)ライブラリをコーディングする2つのアプローチの利点/欠点は何でしょうか?これは私が今物を見る方法ですので、あなた自身の経験を提供してください、そして、私のために私を炎上させないでください:): 1)C ++: ジェネリックプログラミング、仮想関数、オーバーロード、速度...:あらゆるものを構築するために利用できるすべてのジャンル+ OOPツール 低レベルのライブラリのほとんどが利用可能(Python向けのような広範な科学技術ライブラリ開発はありません) 2)Python +並列コンピューティング用ラッパー(pyOpenCLなど) さまざまな種類の膨大な量のサポートライブラリ あなたが思うことをコーディングしてください:実装は本当に速く行われます 遅い実行時間 さまざまな方法をサポートし、複雑なジオメトリと問題を処理するフレームワークをコーディングしたい場合、何を選択しますか?その理由は何ですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.