熱方程式の境界値問題の解と、その解に依存する熱係数を得る。
固定小数点の反復アプローチ [Amos10] を使用し、oneMKL PARDISO によって各外部反復の線形問題を解きます。
CSR (Compressed Sparse Rows: 圧縮スパース行) 形式でマトリックス構造を設定します。
残差のノルムが許容差未満になるまで固定小数点の反復を行います。
pardiso ルーチンを使用して現在の反復の線形化されたシステムを解きます。
dcopy ルーチンを使用して、システムの解を主方程式の次の近似に設定します。
新しい近似に基づいて、行列の新しい要素を計算します。
mkl_sparse_d_mv ルーチンを使用して現在の解の残差を計算します。
dnrm2 ルーチンを使用して残差のノルムを計算し、許容差と比較します。
ソルバーの内部メモリーを解放します。
ソースコード: サンプル (https://www.intel.com/content/dam/develop/external/us/en/documents/mkl-cookbook-samples-120115.zip (英語)) の sparse フォルダーを参照してください。
CONSTRUCT_MATRIX_STRUCTURE (nx, ny, nz, &ia, &ja, &a, &error);
CONSTRUCT_MATRIX_VALUES (nx, ny, nz, us, ia, ja, a, &error);
mkl_sparse_d_create_csr(&A, SPARSE_INDEX_BASE_ZERO, n, n, ia, ia+1, ja, a);
while ( res > tolerance) {
phase = 13;
PARDISO (pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &idum, &nrhs, iparm, &msglvl, f, u, &error);
dcopy (&n, u, &one, u_next, &one);
construct_matrix_values (nx, ny, nz, u_next, ia, ja, a, &error);
mkl_sparse_d_mv ( SPARSE_OPERATION_NON_TRANSPOSE, 1.0, A, descr, u, 0.0, temp);
daxpy (&n, &minus_one, f, &one, temp, &one); res = dnrm2 (&n, temp, &one);
}
mkl_sparse_destroy(A); phase = -1;
PARDISO ( pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &idum, &nrhs, iparm, &msglvl, f, u, &error );
タスク |
ルーチン |
説明 |
---|---|---|
現在の反復の線形化されたシステムを解き、ソルバーの内部メモリーを解放する |
PARDISO |
複数の右辺を備えた 1 セットのスパース線形方程式の解を計算します。 |
見つかった解を主方程式の次の近似として設定する |
DCOPY |
ベクトルを別のベクトルにコピーします。 |
MKL_SPARSE_D_CREATE_CSR |
CSR 入力から行列ハンドルを作成します。 |
|
現在の非線形反復の残差を計算します。 |
MKL_SPARSE_D_MV |
疎行列の行列-ベクトル積を計算します。 |
MKL_SPARSE_DESTROY |
行列ハンドルを破棄し、内部メモリーを解放します。 |
|
|
DAXPY |
ベクトル-スカラー積を計算して結果をベクトルに追加します。 |
残差のノルムを計算し、停止条件と比較する |
DNRM2 |
ベクトルのユークリッド・ノルムを計算します。 |
定常非線形熱伝導方程式は、非線形偏微分方程式の境界値問題として説明できます。
ここで、領域 D は立方体であると仮定します。、および
は温度の未知関数です。
デモ目的のため、問題は解の熱係数の線形従属性に制限されています。
数の解を得るため、領域 D でグリッドステップ h の等距離のグリッドが選択され、偏微分方程式は差分を使用して近似されます。このプロシージャーから [Smith86] 非線形代数方程式のシステムが得られます。
各方程式は、7 つのグリッドポイントで、未知グリッド関数 u の値とそれぞれの右辺の値を関連付けます。方程式の左辺は、解に依存するグリッド関数値と係数の線形の組み合わせとして表せます。これらの係数から構成される行列を利用すると、方程式をベクトル-行列形式で書き直すことができます。
係数行列 A は疎である (各行に非ゼロ要素が 7 つしかない) ため、この反復アルゴリズムで解くために、行列を CSR 形式の配列に格納して (『インテル® oneAPI マス・カーネル・ライブラリー・デベロッパー・リファレンス』のスパース行列格納形式を参照)、PARDISO* ソルバーを使用することは適切です。
u を初期値 u0 に設定します。
残差 r = A(u)u - g を計算します。
||r|| < 許容差の場合:
方程式 A(u)w = g を w について解きます。
u = w を設定します。
残差 r = A(u)u - g を計算します。