計算科学

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


3
Ubuntuからビルド済みパッケージをインストールするよりも、ソースからLAPACKをコンパイルする利点はありますか?
ATLASはコンパイル対象のマシンに合わせて最適化できることを知っているため、ソースからコンパイルすることで最大のメリットが得られます。ソースからLAPACKをコンパイルすることに利点はありますか?ビルド済みのパッケージをインストールする方がはるかに簡単です。

4
MPIを使用するコード/ライブラリと互換性のある単体テストフレームワークに関する推奨事項はありますか?
通常、シリアルコードを記述し、その際に、xUnitスタイルのテストフレームワーク(MATLAB xUnit、PyUnit / nose、またはGoogleのC ++テストフレームワーク)を使用してユニットテストを記述します。 Googleの大まかな検索に基づいて、実務家がMPIを使用するコードを単体テストする方法についてはあまり見ていません。そのためのベストプラクティスはありますか? ユニットテストとテスト駆動開発の戦略と比較して、テストフレームワークに使用するソフトウェアに関する答えを探しています(存在する場合-答えは「独自のコードをロール」することができます)カスタムテストコードの事例が参考になります)。 私がテストしようとしているもののほとんどは、右側の関数評価と半離散化PDEを統合するタイムステッパーのヤコビ行列アセンブリルーチンです。私はPETScを使用するので、PETSc固有のものがあれば、より一般的なテストフレームワークに加えて役立ちます。 明確化の編集: 例はにあり${PETSC_DIR}/src/ts/examples/tutorials/ex2.c、ここでRHSFunction(右側の関数評価)などのテストを行います。RHSJacobian(ヤコビ行列の評価)。私は、組み立てられた右側と組み立てられたヤコビ行列の既知の値に対してテストします。いくつかの単純な問題の場合、これらの値を分析的に取得できます。これらの関数は、他のアプリケーションレベルの関数を実行しないアプリケーション固有の関数ですが、関数内でベクトルまたは行列のアセンブリが実行されると、MPIを呼び出すことができます(上記のリンクされたPETScの例のように)。プロセッサにローカルなベクトルまたは行列の一部のみを計算する関数を作成する場合、可能な場合はグローバルなアセンブルバージョンに対してテストする必要があります。これは、パラレルプログラミングが初めてなので、グローバルなベクトルとグローバルについて考える方が直感的だからです。マトリックス。これらのテストは、小さな問題サイズと少数のプロセッサーで実行されます。 これを行うためのいくつかの戦略を考えることができます。 このトピックで行ったGoogleの検索に基づいて、おそらくうまく機能しない戦略は、既知の出力を構築し、相対/絶対エラーを並行して見つけ、単純な比較を行うことです。MPIを使用して「Hello、world」プログラムを作成した人なら誰でも、出力が文字化けする可能性があります。これは、単体テストの実行の有用性を制限します。(これが質問をするきっかけになりました。)単体テストフレームワークの呼び出しには、潜在的なトリッキーさもあるようです。 出力をファイルに書き込み(たとえば、PETScでVecViewand を使用してMatView)、ndiffまたはのような既知の出力と比較しnumdiffます。ファイル比較を使用して単体テストを行った以前の経験から得たこのメソッドの直感は、細心の注意が必要であり、フィルタリングが必要になるということです。ただし、上記のユーティリティをプレーンdiffに置き換えることができ、テキスト形式の一致を心配する必要がないため、この方法は回帰テストに優れているようです。この戦略は、WolfgangBangerthとandybauerが提案しているものと多かれ少なかれだと思いました。また、PETScは、一部のテストで同様のアプローチを使用しているようです。 単体テストフレームワークを使用して、MPIランク0のプロセッサにすべてを収集し、プロセッサランクが0の場合にのみ単体テストを実行するように依頼します。標準で同様のことができます(おそらく、その方が簡単です)返されたエラーは、計算に問題があることを示しますが、どの要素にエラーがあるかはわかりません。そうすれば、ユニットテストの出力が文字化けすることを心配する必要はありません。単体テストフレームワークを正しく呼び出すことだけを心配する必要があります。PETScは、正確なソリューションが利用可能な場合、サンプルプログラム内で標準的な比較を使用するように見えますが、それらの比較を行うときにユニットテストフレームワークを使用しません(必ずしもそうする必要はありません)。

5
計算
関数の近くに有する特異点X = 0。以下のため:かかわらず、その特異性は、持ち上げることができる、X = 1、一つは持つべきであるF (X )= 1をので、 E 、X = Σ K = 0 のx Kf:x↦(ex−1)/xf:x↦(ex−1)/xf \colon x \mapsto (e^x-1)/xx=0x=0x = 0x=1x=1x = 1f(x)=1f(x)=1f(x) = 1 したがって (ex−1)/x=∑k=1x k − 1ex=∑k=0xkk!ex=∑k=0xkk! e^x = \sum_{k=0} \frac{x^k}{k!} ただし、形式(ex−1)/xはx=0で定義されていないだけでなく、その点の近くで数値的に不安定です。非常に小さいxのf(x)を評価するため(ex−1)/x=∑k=1xk−1k!(ex−1)/x=∑k=1xk−1k! (e^x - 1)/x = \sum_{k=1} \frac{x^{k-1}}{k!} (ex−1)/x(ex−1)/x(e^x-1)/xx=0x=0x = 0f(x)f(x)f(x)xxx数値的するには、Taylor展開、つまり前述のべき級数の切り捨てを使用できます。 Q:関数には名前がありますか?つまり、これは一般的な問題ですか?fff Q:この状況をうまく処理するC / C …
13 c++  c 

2
行列を反転するための「補因子技術」には実用的な意味がありますか?
タイトルは質問です。この手法は、「コファクターの行列」または「補助行列」の使用を含み、正方行列の逆の成分の明示的な公式を提供します。たとえばよりも大きい行列を手作業で行うのは簡単ではありません。以下のためマトリックスは、マトリックス自体の行列式を計算し、計算する必要の決定行列を。だから、私はそれがアプリケーションにとってそれほど有用ではないと推測しています。しかし、確認をお願いします。3×33×33\times 3n×nn×nn\times nn2n2n^2(n−1)×(n−1)(n−1)×(n−1)(n-1)\times(n-1) 私は、行列に関する定理を証明する上での手法の理論的意義については質問していません。

4
C ++の数値アプリケーションのテストスイートですか?
最近、私は自分のグループにコードを書く際により多くのテストを含めるよう促しています。適切なテスト体制が整っていなかったため、おそらく話すのに必要な時間よりもはるかに長い時間がかかる、いくつかの大きなバグがありました。 ただし、プロセスを自動化(または合理化)するための適切なツールがあれば、きっと役に立つと思います。一方、C ++テストスイートのさまざまなオプションがわからず、それらをどのように決定するのですか? 何を探すべきかについてのガイドラインはありますか?また、数値アプリケーションに特化したものはありますか?
13 testing 

3
移動メッシュを生成する背後にある基本原則は何ですか?
移流拡散問題のための移動メッシュの実装に興味があります。アダプティブムービングメッシュメソッドは、有限差分を使用して1Dのバーガー方程式に対してこれを行う方法の良い例です。誰かが、移動するメッシュで有限差分を使用して1D移流拡散方程式を解くための実用的な例を提供できますか? たとえば、保守的な形式では、方程式は ut=(a(x)u+dux)xut=(a(x)u+dux)x u_t = (a(x)u + du_x)_x ここでは速度(空間の関数)です。初期条件u (0 、x )は、(たとえば)左から右へ(たとえば、パイプに沿って)移動するフロー種を指定できます。この場合、初期条件には急勾配があります。a(x)a(x)a(x)u(0,x)u(0,x)u(0,x) 移動メッシュの等分布問題をどのように解決する必要がありますか(おそらくDe Boorのアルゴリズムまたは他のアプローチを使用して)。これを自分でPythonで実装したいので、もしあなたの答えがすぐにコードに変換できればいいのです! バウンティ前の古い質問 システムのプロパティに基づいて適応メッシュを生成するための基本的なアプローチは何ですか?勾配が大きい場所の尺度としてフラックスを使用する必要がありますか? 反復(タイムスイープ)ソリューションを模索しているためです。古いグリッドから新しいグリッドに補間することが重要だと思いますが、通常のアプローチは何ですか? 単純な問題(移流方程式など)の有効な例を確認したいと思います。 問題の詳細についての少しの背景。私は方程式の1D結合システムをシミュレートしています、 ∂あなたは∂t= aあなたは∂2あなたは∂バツ2+ bあなたは∂あなたは∂バツ+ fあなたは(x 、u 、v 、w )∂v∂t= av∂2v∂バツ2+ bv∂v∂バツ+ fv(x 、u 、v 、w )∂w∂t= aあなたは∂あなたは∂バツ+ av∂v∂バツ+ fw(x 、u 、v 、w )∂あなたは∂t=aあなたは∂2あなたは∂バツ2+bあなたは∂あなたは∂バツ+fあなたは(バツ、あなたは、v、w)∂v∂t=av∂2v∂バツ2+bv∂v∂バツ+fv(バツ、あなたは、v、w)∂w∂t=aあなたは∂あなたは∂バツ+av∂v∂バツ+fw(バツ、あなたは、v、w) \frac{\partial u}{\partial t} = a_u\frac{\partial^2 u}{\partial x^2} + b_u\frac{\partial …

3
圧縮センシング問題に関する混乱
私はこれを含むいくつかの参考文献を読みました。 圧縮センシングがどの最適化問題を構築して解決しようとするのか、ちょっと混乱しています。それは...ですか minimizesubject to∥x∥1Ax=bminimize‖x‖1subject toAx=b\begin{array}{ll} \text{minimize} & \|x\|_1\\ \text{subject to} & Ax=b\end{array} または minimizesubject to∥x∥0Ax=bminimize‖x‖0subject toAx=b\begin{array}{ll} \text{minimize} & \|x\|_0\\ \text{subject to} & Ax=b\end{array} または/そして何か他のもの?

2
Armijoルールに関する混乱
行検索で使用されるArmijoルールについてこの混乱があります。追跡線の検索を読み返していましたが、このArmijoのルールが何であるかがわかりませんでした。誰もArmijoのルールを詳しく説明できますか?ウィキペディアはうまく説明していないようです。ありがとう

1
複雑な対称三重対角一般化固有値問題のための特別な方法
私は一般固有値問題を解決する必要がここで、A及びBが両方とも三重対角であり、Bは対称正定値と実であるが、Aは、唯一の複合対称(明確またはエルミートではない)です。さらに、完全な固有分解が必要です。私は現在、Lapackの一般化された固有値ソルバーを呼び出しているだけですが、この特定の高度に構造化された問題により良い方法があるかどうか疑問に思っています。特に、自由に利用可能なコード(C ++)を用意することが最善です。A X = λ B XAバツ=λBバツAx = \lambda BxAAABBBBBBAAAZGGEV

5
有限要素行列のスパース構造の計算
質問:有限要素行列のスパース構造を正確かつ効率的に計算するには、どのような方法が利用できますか? 情報:私はポアソン圧力方程式ソルバーに取り組んでおり、Cで記述された2次ラグランジュ基底を使用したGalerkinの方法を使用し、スパースマトリックスストレージとKSPルーチンにPETScを使用しています。PETScを効率的に使用するには、グローバル剛性マトリックスにメモリを事前に割り当てる必要があります。 現在、私は次のように行ごとの非ゼロの数を推定するために模擬アセンブリを行っています(擬似コード) int nnz[global_dim] for E=1 to NUM_ELTS for i=1 to 6 gi = global index of i if node gi is free for j=1 to 6 gj = global index of j if node gj is free nnz[i]++ ただし、ノード間相互作用が複数の要素で発生する可能性があるため、これはnnzを過大評価しています。 どのi、jインタラクションが見つかったかを追跡しようと考えましたが、多くのメモリを使用せずにこれを行う方法はわかりません。ノードをループして、そのノードを中心とした基底関数のサポートを見つけることもできますが、各ノードのすべての要素を検索する必要があり、非効率的です。 私が見つかりました。これは特に書いたステファノM、から、いくつかの有用な情報が含まれて最近の質問を、 私のアドバイスは、それをpythonまたはCで実装し、いくつかのグラフ理論概念を適用することです。つまり、マトリックスの要素をグラフのエッジと見なし、隣接マトリックスのスパース構造を計算します。キーのリストまたは辞書のリストは一般的な選択肢です。 これに関する詳細とリソースを探しています。私は確かに多くのグラフ理論を知らず、役に立つかもしれないすべてのCSトリックに精通していません(数学的な側面からこれに近づいています)。 ありがとう!

3
反復法の「収束率」を理解する
ウィキペディアによると、収束率はベクトルノルムの特定の比率として表されます。さまざまな時点(基本的に、反復の「開始時」と「終了時」)での「線形」レートと「2次」レートの違いを理解しようとしています。次のように言えますか? 線形収束の場合、反復の誤差ek+1ek+1e_{k+1}のノルムは区切られますxk+1xk+1x_{k+1}∥ek∥‖ek‖\|e_k\| 二次収束では、反復の誤差のノルムは区切られますek+1ek+1e_{k+1}xk+1xk+1x_{k+1}∥ek∥2‖ek‖2\|e_k\|^2 このような解釈は、線形収束アルゴリズムA1の少数(少数)の反復(ランダム初期化を想定)で、2次収束アルゴリズムA2の反復でより小さなエラーが達成されることを意味します。ただし、エラーは減少し、2乗するため、後で繰り返すと、A2のエラーが小さくなります。 上記の解釈は有効ですか?レート係数は無視されることに注意してください。λλ\lambda

3
ポインターで派生型の配列を使用する場合のfortranのメモリ使用量
このサンプルプログラムでは、2つの異なる方法で同じことを(少なくともそう思います)しています。Linux PCでこれを実行し、topでメモリ使用量を監視しています。gfortranを使用すると、最初の方法(「1」と「2」の間)で使用されるメモリは8.2GBであり、2番目の方法(「2」と「3」の間)でメモリ使用量は3.0GBです。Intelコンパイラーでは、違いはさらに大きくなります:10GB対3GB。これは、ポインターを使用することに対する過度のペナルティのようです。なぜこれが起こるのですか? program test implicit none type nodesType integer:: nnodes integer,dimension(:),pointer:: nodes end type nodesType type nodesType2 integer:: nnodes integer,dimension(4):: nodes end type nodesType2 type(nodesType),dimension(:),allocatable:: FaceList type(nodesType2),dimension(:),allocatable:: FaceList2 integer:: n,i n = 100000000 print *, '1' read(*,*) allocate(FaceList(n)) do i=1,n FaceList(i)%nnodes = 4 allocate(FaceList(i)%nodes(4)) FaceList(i)%nodes(1:4) = (/1,2,3,4/) end do print …

2
差分法のフォンノイマン安定性解析の代替
私は、結合された1次元多孔質弾性方程式(biotのモデル)の解決に取り組んでいます。 −(λ+2μ)∂2u∂x2+∂p∂x=0−(λ+2μ)∂2u∂x2+∂p∂x=0-(\lambda+ 2\mu) \frac{\partial^2 u}{\partial x^2} + \frac{\partial p}{\partial x} = 0 ドメイン上でΩ=(0、1)と境界条件: ∂∂t[ γp + ∂あなたは∂バツ] - κη[ ∂2p∂バツ2] =q(x 、t )∂∂t[γp+∂あなたは∂バツ]−κη[∂2p∂バツ2]=q(バツ、t)\frac{\partial}{\partial t} \left[ \gamma p + \frac{\partial u}{\partial x}\right] -\frac{\kappa}{\eta}\left[\frac{\partial^2 p}{\partial x^2}\right] =q(x,t)Ω = (0 、1 )Ω=(0、1)\Omega=(0,1) でのx=0とU=0、∂PP = 0 、(λ + 2 μ )∂あなたは∂バツ= − u0p=0、(λ+2μ)∂あなたは∂バツ=−あなたは0p=0, (\lambda …

4
浮動小数点演算で、小さな用語を大きな用語の差に追加すると、数値の不正確さが生じるのはなぜですか?
私は、アレンとティルデスリーによる「液体のコンピューターシミュレーション」という本を読んでいます。71ページ以降、著者は分子動力学(MD)シミュレーションでニュートンの運動方程式を統合するために使用されるさまざまなアルゴリズムについて説明します。78ページから、著者はVerletアルゴリズムについて議論します。これはおそらくMDの標準的な統合アルゴリズムです。彼らは述べています: おそらく、運動方程式を統合する最も広く使用されている方法は、Verlet(1967)によって最初に採用され、Stormer(Gear 1971)に起因するものです。この方法は、二次方程式の直接解であるmir¨i=fimir¨i=fim_i \ddot{\textbf{r}}_i = \textbf{f}_i。方法はpostionsに基づいてr(t)r(t)\textbf{r}(t)、加速度a (tで)、そして位置rを(T - δ T )前のステップから。位置を進める方程式は次のようになります。a(t)a(t)\textbf{a}(t)r(t−δt)r(t−δt)\textbf{r}(t - \delta t) r(t+δt)=2r(t)−r(t−δt)+δt2a(t).(3.14)(3.14)r(t+δt)=2r(t)−r(t−δt)+δt2a(t).\tag{3.14}\textbf{r}(t + \delta t) = 2\textbf{r}(t) - \textbf{r}(t - \delta t) + \delta t^2 \textbf{a}(t). eqn(3.14)について注意すべき点がいくつかあります。速度がまったく表示されないことがわかります。についてテイラー展開によって得られた方程式を追加することにより、それらは削除されました。r(t)r(t)\textbf{r}(t) r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...\textbf{r}(t + \delta t) = \textbf{r}(t) + \delta t \textbf{v}(t) + (1/2) \delta t^2 \textbf{a}(t) + ... r(t−δt)=r(t)−δtv(t)+(1/2)δt2a(t)−....(3.15)(3.15)r(t−δt)=r(t)−δtv(t)+(1/2)δt2a(t)−....\tag{3.15}\textbf{r}(t - \delta …

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