我正在以保守形式求解二维轴对称欧拉方程:
使用有限差分WENO5方法。
如何正确施加离散轴对称边界条件? 一篇关于边界条件(对于全柱坐标)的论文只是提到对称条件应该用于轴对称流动,但没有任何细节。
当我使用 MacCormack 的方法(二阶,每个网格点在每个方向上需要一个相邻点)时,过程非常简单(C 语法):
//internal points
for (k = 1; k <= k_max - 1; k++)
{
for (l = 1; l <= l_max - 1; l++)
{
R[k][l] = ... (calculated by MacCormack's method);
U[k][l] = ...;
V[k][l] = ...;
P[k][l] = ...;
}
}
//boundary at r = 0
for (k = 0; k <= k_max; k++)
{
R[k][0] = R[k][1];
U[k][0] = U[k][1];
V[k][0] = 0;
P[k][0] = P[k][1];
}
//other boundaries...
其中 R,U,V,P 是数组, 第一个数组索引k是,第二个l是(均匀的方格)并l=0对应于. 这个边界条件似乎运作良好。
使用 WENO5,问题在于对于每个网格点,模板中在每个方向上多使用三个点,因此在 处指定一个点l=0是不够的。
我目前的想法是:
1.显式设置三个近轴点:
//internal points
for (k = 3; k <= k_max - 3; k++)
{
for (l = 3; l <= l_max - 3; l++)
{
R[k][l] = ... (calculated by WENO5 method);
U[k][l] = ...;
V[k][l] = ...;
P[k][l] = ...;
}
}
//boundary at r = 0
for (k = 0; k <= k_max; k++)
{
for (l = 0; l <= 2; l++)
{
R[k][l] = R[k][l];
U[k][l] = U[k][l];
V[k][l] = 0;
P[k][l] = P[k][l];
}
}
//other boundaries...
2.新增三个鬼点(所以l=3在) 并使用镜像值设置它们:
//internal points
for (k = 3; k <= k_max - 3; k++)
{
for (l = 3; l <= l_max - 3; l++)
{
R[k][l] = ... (calculated by WENO5 method);
U[k][l] = ...;
V[k][l] = ...;
P[k][l] = ...;
}
}
//boundary at r = 0
for (k = 0; k <= k_max; k++)
{
/values at r < 0
for (l = 0; l <= 2; l++)
{
R[k][l] = R[k][6 - l];
U[k][l] = U[k][6 - l];
V[k][l] = -V[k][6 - l];
P[k][l] = P[k][6 - l];
}
//values at r = 0
R[k][3] = R[k][4];
U[k][3] = U[k][4];
V[k][3] = 0;
P[k][3] = P[k][4];
}
//other boundaries...
或带有反转符号的镜像(因为鬼点处的值乘以负数在方程式中):
...
for (l = 0; l <= 2; l++)
{
R[k][l] = -R[k][6 - l];
U[k][l] = -U[k][6 - l];
V[k][l] = V[k][6 - l];
P[k][l] = -P[k][6 - l];
}
...
方法1和2在对称轴附近产生明显的伪影。
3.将网格移动半步,以便没有点正好位于并使用鬼点。但是,这种方法会导致计算不稳定。
正确的方法是什么?