fvMatrixにおける境界条件の取り扱い
fvMatrixの係数行列とソース項に境界条件が反映されるのはsolverの実行中に限られる.
lduMatrix::solverを継承せずに,lduMatrix.Amulを利用したソルバを書こうとして,はまった自分への戒めとして赤字で記載しました.
百聞は一見にしかずということで,実験結果を示します.
x, y方向に3分割,z方向に1分割した領域で,Vに関するlaplace方程式を解くことを考えます.
境界条件は,y=0の面をV=0,y=1の面をV=1,それ以外の面は絶縁条件としました.
main関数
1 2 3 4 5 6 7 8 9 |
fvScalarMatrix VEqn ( fvm::laplacian(kappa, V) ); Info << "source@BEFORE" << endl; Info << VEqn.source() << endl; VEqn.solve(); Info << "source@AFTER" << endl; Info << VEqn.source() << endl; |
ソルバコード (PCG.*をkPCG.*としてコピーして,kPCG.C内のsolve関数内に以下の2行を追記しました)
1 2 |
Info << "source@solve" << endl; Info << source << endl; |
実行結果
source@BEFORE
9(0 0 0 0 -2.77556e-16 0 -3.33067e-15 1.94289e-15 1.66533e-15)source@solve
9(0 0 0 0 -2.77556e-16 0 -10 -10 -10)
DICkPCG: Solving for V, Initial residual = 1, Final residual = 2.17915e-07, No Iterations 5source@AFTER
9(0 0 0 0 -2.77556e-16 0 -3.33067e-15 1.94289e-15 1.66533e-15)
この結果から次のことが分かります.
・fvm::laplacianでfvMatrixを生成しただけでは,境界条件は反映されない.
・solverを実行中に,source項に境界条件が反映される.
・solverを抜けると,source項に境界条件が反映されなくなる.
ソースコードを追っていくともう少し具体的に分かりますが,それは,次の機会に.