python - 更快的多重网格泊位方程求解器?
问题描述
我正在尝试制作自己的 CFD 求解器,而计算成本最高的部分之一是求解压力项。一种更快求解泊松微分方程的方法是使用多重网格方法。基本的递归算法是:
function phi = V_Cycle(phi,f,h)
% Recursive V-Cycle Multigrid for solving the Poisson equation (\nabla^2 phi = f) on a uniform grid of spacing h
% Pre-Smoothing
phi = smoothing(phi,f,h);
% Compute Residual Errors
r = residual(phi,f,h);
% Restriction
rhs = restriction(r);
eps = zeros(size(rhs));
% stop recursion at smallest grid size, otherwise continue recursion
if smallest_grid_size_is_achieved
eps = smoothing(eps,rhs,2*h);
else
eps = V_Cycle(eps,rhs,2*h);
end
% Prolongation and Correction
phi = phi + prolongation(eps);
% Post-Smoothing
phi = smoothing(phi,f,h);
end
我试图自己实现这个算法,但是它非常慢并且没有给出好的结果,所以很明显它做错了。我一直试图找出原因太久了,我认为值得看看是否有人可以帮助我。
如果我使用 2^5 x 2^5 点的网格大小,那么它可以解决它并给出合理的结果。然而,一旦我超过这个,无论执行多少 V-Loop,它都需要成倍地更长的时间来解决并且基本上会陷入某种程度的不准确性。在 2^7 x 2^7 点处,代码花费的时间太长而无法使用。
我认为我的主要问题是我对雅可比迭代的实现是使用线性代数来计算每一步的更新。一般来说,这应该很快,但是更新矩阵 A 是一个 n*m 大小的矩阵,计算 2^7 * 2^7 大小的矩阵的点积是昂贵的。由于大多数单元格只是零,我应该使用不同的方法计算结果吗?
如果有人对多重网格方法有任何经验,我将不胜感激!
谢谢
解决方案
推荐阅读
- python - 为什么根据文档使用 get_pinned_message() 方法时会中断?
- react-native - 如何将一个组件动画到另一个组件?
- reactjs - 根据 React 中的条件更改表格行颜色
- deep-learning - Yolov3的热图/特征图
- node.js - 无法使用 Firestore 中的规则访问文档内的集合
- c# - 当我在 C# 中的同一 winForm 中单击其他 datagridview 中的单元格时,在 datagridview 中的 Datagridviewcomboboxcell 中设置一个值
- python - python中的调试模式唯一异常
- javascript - 为什么我的 js 代码可以将值设置为未定义的数组索引?
- django - Django 模型:外键的唯一值
- c++ - SFML 中的重力和碰撞检测