計算科学

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

6
OpenFOAM for CFDの使用を開始する方法
CFDの基本的な内部フローを解決するためにOpenFOAMを使用することを検討しています。始めるための最良の方法は何ですか?また、誰かが私が飛び込んだ後に私が持っているかもしれない質問で行くために良いオンライン参照を私に指し示すことができますか?今のところそれはかなりニッチであり、多くのソルバー関数はそれほど文書化されていないと聞いています。パッケージ自体に付属しているドキュメントは明らかに出発点ですが、サードパーティのリファレンス(OpenFOAM wikiのようなもの)はありますか?

6
独自のライブラリが必要な場合、再現可能な研究を行う最良の方法は何ですか?
計算の再現可能な研究は、他の研究者が結果を生成するために必要なコードを他の研究者が利用できるようにすることを目的としています。カップルの論文は、私が使用上の社内自動微分パッケージ(と呼ばれる働いています:私は、私の研究の再現性のすべてをしたいのですが、私は思わぬ障害のビットに実行しているDAEPACKを(独自のライブラリに)CHEMKIN- II ;ライセンス条項は不明)。 これらのソフトウェアコンポーネントをオープンソースバージョンに置き換えるのは非常に時間がかかります。CHEMKIN-IIのオープンソースの代替物はCanteraと呼ばれますが、CanteraはC ++ですが、CHEMKIN-IIはFortran 77にあります。十分なCanteraコードを変更して自動処理できるようにするには、多大な労力が必要です。 C ++の差別化ツール。 これらの専用パッケージが必要な場合、研究者がCHEMKIN-IIにアクセスできないと仮定して、研究を可能な限り再現可能にする最良の方法は何ですか?DAEPACKはソースからソースへのトランスレーターなので、必ずしもDAEPACKを配布する必要はありません。出力を含めることができるかもしれません。これは、微分を計算するFortranソースファイルです。 より一般的には、あなたの作品にプロプライエタリなソフトウェアが必要であり、そのプロプライエタリなソフトウェアが広く利用できない場合(つまり、MATLAB、Mathematicaなどではない場合)、どのように仕事を再現可能にしますか?

6
次元に依存しないコードを作成するにはどうすればよいですか?
特定の操作/アルゴリズムの1次元、2次元、3次元のバージョンについて、非常によく似たコードを書くことがよくあります。これらのバージョンをすべて維持するのは面倒です。単純なコード生成はかなりうまく機能しますが、より良い方法が必要だと考えられているようです。 一度操作を記述し、それを高次元または低次元に一般化する比較的簡単な方法はありますか? 具体例の1つ​​は次のとおりです。スペクトル空間で速度場の勾配を計算する必要があるとします。3次元では、Fortranループは次のようになります。 do k = 1, n do j = 1, n do i = 1, n phi(i,j,k) = ddx(i)*u(i,j,k) + ddx(j)*v(i,j,k) + ddx(k)*w(i,j,k) end do end do end do ここで、ddx配列は適切に定義されています。(マトリックス乗算でもこれを行うことができます。)2次元フローのコードはほぼ同じですが、3番目の次元がループ、インデックス、およびコンポーネントの数から削除されます。これを表現するより良い方法はありますか? 別の例は次のとおりです。3次元グリッド上で点ごとに定義された流体速度があるとします。速度を任意の位置(つまり、グリッドポイントに対応しない)に補間するには、3次元すべてにわたって連続して1次元ネビルアルゴリズムを使用します(つまり、次元削減)。単純なアルゴリズムの1次元の実装を前提として、次元削減を行う簡単な方法はありますか?

1
対称正定行列の対角更新
AAAは対称正定値(SPD)スパース行列です。は、スパース対角行列です。は大きく( > 10000)、の非ゼロの数は通常100〜1000です。G n n Gn × nn×nn \times nGGGnnnnnnGGG AAAはコレスキー形式でとして因数分解されています。L D LTLDLTLDL^T がときにと効率的に更新する方法は?D A A + GLLLDDDAAAA + GA+GA+G

3
特定の問題に対する適切な事前調整方法を検索するとき、どのガイドラインを使用する必要がありますか?
大型線形システムの解の反復法を使用して、それが前処理導入することがしばしば重要である、例えば、代わりに解決、ここで左前処理システムのために使用され。通常、必要であり、元のシステムのソリューションと比較して(はるかに)効率的なソリューションまたは計算リソース(メモリストレージなど)の削減の基礎を提供する必要があります(すなわち、場合)。ただし、前提条件を選択するには、どのガイドラインを使用する必要がありますか?特定の問題に対して、実務家はどのようにこれを行いますか?Ax=bAx=bAx=bM−1(Ax=b)M−1(Ax=b)M^{-1}(Ax=b)MMMM−1≈A−1M−1≈A−1M^{-1}\approx A^{-1}M=AM=AM=A

3
GPUでの制約のない非線形最適化問題の解決
GPU(CUDA)で制約のない非線形最適化問題を解決しようとしています。 目的関数は滑らかな非線形関数であり、その勾配は分析的に計算するのに比較的安価であるため、数値近似に煩わされる必要はありません。 ほとんどの場合、さまざまな理由でfp32数学演算を使用してこの問題を解決したいので、どの非線形最適化方法が丸め誤差に対してより堅牢であり、パフォーマンスが優れていますか?(共役共役/準ニュートン/信頼領域など)、GPUでBFGSを試して良い結果を得た人はいますか ところで、必要に応じてヘッセ行列は、私の場合は比較的小さい(通常は64x64未満)が、これらの小規模な最適化問題の数千を同時に解決する必要がある。

2
擬似時間ステップとは何ですか?
PDEソルバーに関するいくつかの文献を読んでいると、今日疑似時間ステップという用語に出会いました。これは一般的な用語のようですが、そのための適切な定義や紹介記事を見つけることができませんでした。 したがって:擬似時間ステップとは何ですか?通常どのように使用されますか?

1
Octreesが多極空間分解に使用されるのはなぜですか?
Fast Multipole Method(FMM)のほとんど(すべて?)の実装では、関連するドメインを分解するために八分木が使用されます。理論的には、octreeは単純な体積境界を提供します。これは、FMMのO(n)ランタイムを証明するのに役立ちます。この理論的根拠を超えて、他のツリーまたはトライデータ構造よりもOctreeを使用する利点はありますか? セルは直接の隣接セルを知っているため、八分木を使用すると、相互作用リストの決定が容易になる場合があります。ただし、Dual Tree Traversalのような、より動的なツリートラバーサルを使用する相互作用リストは不要です。 代替手段はkdツリーです。考えられる理論的な欠点の1つは、建設には高価な中央値検出操作が必要になることです。ただし、スペースパーティショニングの効率は劣りますが、構築中に中央値を検出する必要のないバージョンのkdツリーがあります。実装面では、kdツリーは非常に単純です。 さらに急進的な代替案はRツリーです。 だから、私の質問は次のとおりです。FMMに最適な選択肢となるOctreesについてはどうですか?
18 algorithms 

1
ウェーブレットをPDEに適用するにはどうすればよいですか?
ウェーブレットメソッドをPDEに適用する方法を学びたいのですが、残念ながら、このトピックについて学ぶのに役立つリソースがわかりません。 ウェーブレットの多くの紹介は、補間理論に焦点を当てているようです。たとえば、できれば少数のウェーブレットの重ね合わせによって信号を組み立てます。PDEへの応用については、その主題に深く入ることなく言及されることがあります。私は、WFTを見たことがあるが、そのトピックについてこれ以上知識を持っていない人々のための良い要約記事に興味があります。もちろん、あなたがそれを行うことができると思うなら、良い要約も興味深いでしょう。 私は、どの種類の質問が典型的に現れるかという印象を得ることに特に興味があります。たとえば、リプシッツ境界を持つ有界領域のPDEに有限要素が通常適用されることを知っています。これは、定理空間(適合、不適合、幾何学、組み合わせ)を選択する際の典型的な質問であり、収束理論の確立方法(実際には、Galerkin理論はWaveletでそれほど違わないはずです)、実装では数学的事柄が実行可能であるという直観があります。このようなPDEのウェーブレットに関する鳥瞰的な視点は、私にとって非常に役立ちます。
18 pde  wavelet 

4
構造化グリッドアダプティブメッシュリファインメント用の汎用ライブラリはありますか?
この投稿を改善したいですか?引用や回答が正しい理由の説明など、この質問に対する詳細な回答を提供します。十分な詳細のない回答は、編集または削除できます。 アダプティブメッシュリファインメント(AMR)は、PDEの数値解法で大きく変化する空間スケールの問題に対処するための一般的な手法です。構造化グリッド上のAMRにはどのような汎用ライブラリが存在しますか?理想的には、ライブラリがアダプティブメッシュのみを処理し、物理学と離散化(有限差分/ボリューム/要素)を提供する、PETScの精神にあるものが欲しいです。 理想的なライブラリは モジュラー:コードの記述方法やデータ構造の量が多すぎる 一般:私が使用している離散化の種類は気にしません 効率的:オーバーヘッドがかかりすぎない 並列で拡張性の高い これらの基準のサブセットのみに適合するライブラリは、引き続き関心の対象となります。 補遺:Donna CalhounのAMRパッケージの広範なリストは知っていますが、上記の基準に適合するパッケージはどれか(もしあれば)わかりません。だから、私は主に、それらの用語でどのように評価するかについて、1つまたは(より良い)さらに多くのパッケージで実際の経験を持っている人々から聞くことに興味があります。

1
ログサムの壊滅的なキャンセル
相対誤差の少ない倍精度浮動小数点で次の関数を実装しようとしています。 logsum(x,y)=log(exp(x)+exp(y))logsum(x,y)=log⁡(exp⁡(x)+exp⁡(y))\mathrm{logsum}(x,y) = \log(\exp(x) + \exp(y)) これは統計アプリケーションで広く使用され、ログスペースで表される確率または確率密度を追加します。もちろん、またはは簡単にオーバーフローまたはアンダーフローする可能性がありますが、そもそもログスペースがアンダーフローを回避するために使用されるため、これは悪いことです。これが典型的な解決策です。exp(x)exp⁡(x)\exp(x)exp(y)exp⁡(y)\exp(y) logsum(x,y)=x+log1p(exp(y−x))logsum(x,y)=x+log1p(exp⁡(y−x))\mathrm{logsum}(x,y) = x + \mathrm{log1p}(\exp(y - x)) からのキャンセルは発生しますが、によって軽減されます。さらに悪いのは、とが近い場合です。相対誤差プロットは次のとおりです。y−xy−xy-xexpexp\expxxxlog1p(exp(y−x))log1p(exp⁡(y−x))\mathrm{log1p}(\exp(y - x)) プロットはれ、キャンセルが発生する曲線の形状を強調します。最大までのエラーが表示されましたが、さらに悪化すると思われます。(FWIW、「グラウンドトゥルース」関数は、128ビット精度のMPFRの任意精度の浮動小数点を使用して実装されます。) l o g s u m(x 、y )= 0 10 − 1110−1410−1410^{-14}logsum(x,y)=0logsum(x,y)=0\mathrm{logsum}(x,y) = 010−1110−1110^{-11} 私は他の改革を試みましたが、すべて同じ結果になりました。外側の式と、同じエラーがで1近く何かのログを取ることによって発生外側の表現として、キャンセルは、内側の式で行わ。l o g 1 ploglog\loglog1plog1p\mathrm{log1p} 現在、絶対誤差は非常に小さいため、相対誤差は非常に小さくなっています(イプシロン内)。ユーザーは(ログ確率ではなく)確率に本当に関心があるので、このひどい相対誤差は問題ではないと主張するかもしれません。通常はそうではない可能性がありますが、私はライブラリ関数を書いています。そのクライアントは、丸め誤差よりもそれほど悪くない相対誤差を期待できるようにしたいと思います。l o g s u mexp(logsum(x,y))exp⁡(logsum(x,y))\exp(\mathrm{logsum}(x,y))logsumlogsum\mathrm{logsum} 新しいアプローチが必要なようです。何だろう?


2
行列値の連続分数のための効率的なアルゴリズムはありますか?
次のように再帰的に定義された行列方程式があるとします A[n] = inverse([1 - b[n]A[n+1]]) * a[n] その場合、A [1]の方程式は連続分数に似ており、退屈な再計算を回避する非常に効率的な方法がいくつかあります(いくつかの例については「数値レシピ」を参照)。 しかし、b [n] A [n + 1]が正方行列であるという唯一の制約により、係数b [n]およびa [n]を行列にすることができる類似の方法があるのだろうか 1 - b[n]A[n+1] 実際に可逆です。
18 algorithms 

2
割り当て可能な形状配列を使用したF2Py
f2py最新のFortranで使用したいと思います。特に、次の基本的な例を動作させようとしています。これは、私が生成できる最小の有用な例です。 ! alloc_test.f90 subroutine f(x, z) implicit none ! Argument Declarations ! real*8, intent(in) :: x(:) real*8, intent(out) :: z(:) ! Variable Declarations ! real*8, allocatable :: y(:) integer :: n ! Variable Initializations ! n = size(x) allocate(y(n)) ! Statements ! y(:) = 1.0 z = x + y …
18 python  fortran 

4
PDEシミュレーションを通して物理量を確実に維持できる方法はどれですか?
圧力、密度、エネルギー、温度、濃度などの物理量は常に正である必要がありますが、数値プロセスでは解法プロセス中に負の値が計算される場合があります。方程式は複雑な値または無限値を計算するため(通常はコードがクラッシュするため)、これは大丈夫ではありません。これらの量が正の値を維持することを保証するために、どの数値法を使用できますか?これらの方法のどれが最も効率的ですか?

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