众所周知,当我们在进行并行计算的时候,需要把网格进行剖分,OF中可以使用第三方库进行区域分解,可是我们知道,OF中的区域分解是不带重叠层的(或者说没有halo单元),也就是,同一个网格仅可能属于一个处理器。
那么问题来了,我现在想实现带有halo层的重叠型的区域分解,我该怎么实现呢?或者说,有没有那位大佬做过类似的工作或者相应的资料吗?跪谢了!
Micro
帖子
-
-
@samuel-tu =等号类似的操作都需要correctBoundaryConditions()
@李东岳 请问岳哥,为啥 = 号等类似的操作都需要显式更新下边条呢?能不能稍微解释下,感谢! -
@一二 为啥网格增加会增加求解的不稳定性呢?这是您测试得出的结果吧?请问有没有什么理论上的证明呢?谢谢!
-
@一二 好的啊,谢谢回复!我照您说的尝试下!
-
@bestucan 太感谢了,非常有针对性的网址,谢谢!
-
@micro 自挖自填。
大家可以参考东岳老师关于icoFoam解析的文章,说的很正确的,一个时间步骤动量方程的系数是不变的,因为动量方程每个时间步中仅被组建了一次。但是每个时间步中,U可是被更新了好几次(在压力泊松循环中),两者并不矛盾!另外,我们同样可知,一个时间步中,我们反复求解压力泊松方程(一般是3次),压力泊松方程的系数同样是不变的,变化的是右端项(因为右端项是用速度组建的)。 -
@xpqiu 收到,还是非常感谢!!解释的已经很清晰了!
-
@李东岳 好的,谢谢李老师回复。“扩散项两个对角的元素是因为边界条件的作用”确实是这样!不过中间三个元素也满足对角占优啊
-
@xpqiu 好的!非常感激xpqiu教授的精彩细致的回复,那我可不可以根据您的回答总结这样一句话:单纯含有扩散项的方程离散后得到的矩阵性质并不好(因为不是严格对角占优的)。可是为什么下面的图片好像不太支持这样的结论呢?
您看,如果所示,这是一个一维对流扩散方程离散后的结果,其中,对流项对应的矩阵性质很不好(对角不占优且不对称),而扩散项离散后得到的矩阵确实严格对角占优的,具体网站:https://marinecfd.xyz/post/from-geometricfield-to-fvmatrix
请问为什么会出现相反的结果呢?希望您有时间能再稍微回复下!万分感谢!
-
对于泊松方程,由拉普拉斯算子离散而来,有两个特性,一个是离散后形成的矩阵对阵,另一个是非对角占优,正常来说,我们希望矩阵对称,并且对角占优,有利于在应用迭代法求解线性方程组过程中的收敛,此时称为矩阵的性质好?我想请教下,大佬们,有没有什么数学上或理论上的证明,或者说,什么条件下离散后的矩阵才具有对角占优的性质?为什么压力泊松方程是非对角占有的啊?谢谢!
附录:常见的求解变量的对上述两个条件满足状况如下压力方程 p(不可压缩非稳态流动) :对称矩阵,但对角相等,非对角占优,因此计算量较大。速度方程 U(不可压缩非稳态流动) :非对称矩阵,对角占优,计算量通常较 p 小。一般标量方程 k,epsilon,T 等(非稳态流动):非对称矩阵,对角占优,计算量较小。非稳态纯扩散方程(比如纯导热问题):对称矩阵,对角占优,计算量最小;因此,在计算过程中,可以对压力方程 p 选择“共轭梯度求解器+代数多重网格预条件器”而速度 U 和其他标量方程选择一般的共轭梯度求解器。
-
很实用的提问,mark下!
-
这里稍微自挖自填下吧,我感觉OpenFOAM中ldu的矩阵存储格式只能支持 对称矩阵的存储和寻址(对称指的是非零元的位置对称,大小可以不相等)。当然,还没有经过验证。对于(非零元)不对称的情况,我实在想不出来怎么用LDU去存储,难道说,OF就不只是一些高阶迎风格式吗?可是我看OF中好像也支持二阶格式啊,咋回事啊。。。。要是有大佬清楚麻烦稍微告知下!谢谢!
-
@bestucan 好的好的,非常合理的推断,我后面好好验证下。您关注过将PETSc继承到OpenFOAM中的工作吗,在那个工作中,就是涉及到要把每个进程上的矩阵矩阵(ldu格式)转换成PETSc所需要的全局CSR格式的矩阵,此时,就需要每个元素的全局索引,恩恩!
-
自挖自填,首先非常感谢 @bestucan 版主大佬 在另一篇帖子下的回答,答案在https://www.cfd-online.com/Forums/openfoam-programming-development/161366-global-index-cells-facess-parallel-computation.html网址下,其中九楼 解释了我的问题中 各个文件夹的用途,具体如下:
- boundaryProcAddresing - each element contains global index of patch that is present on current process, for "processor" boundaries this index is -1. Size of this array is equal to number of patches in global mesh plus number of "processor" patches in current processorj folder or processor.
- cellProcAddressing - each element contains global index of given local process cell. Size of this array is equal to number of cells in current processor
- faceProcAddressing - each element contains global index of given local process face. Size of this array is equal to number of face in current processor
- pointProcAddressing - each element contains global index of given local process point. Size of this array is equal to number of points in current processor
这样的话我在问题中展示的图片的含义就可以解释了。数组(0 1 2 -1 -1)的含义就是, 0 1 2代表全局网格中的3个patch。-1 -1 代表本地进程上有两个通信边界(interface)存在。
不过另一个问题来了,这样看来,这几个文件夹都是本地进程上的实体对应的全局索引,也就是说区域分解后的求解过程中,是需要利用上这些全局索引(信息)的,那么究竟要这些全局索引有什么用呢?或者说全局索引是怎么在通信中发挥作用的?有没有相关大佬能够解释下,或者指出对应的(拿着全局索引做事情的)代码也可以,谢谢大家!
-
@bestucan 好的哈!谢谢版主!我仔细看看您发的网址
-
@bestucan 聪明的办法!谢谢版主!顺便请教下
1。boundaryProcAddressing
2。cellProcAddressing
3。faceProcAddressing
4。pointProcAddressing
上面这几个文件夹中好像是不是也有一些全局信息啊? -
@bestucan 好的哈,谢谢教授回复!不过您说“但是经过相邻面的速度也反了”,速度的方向是(绝对)唯一的吧,就是说该是多少就是多少。感觉还是从高斯定理出发,法向量永远取外侧为正
-
@Yongbo 你说的两种方式是对的,我验证均通过编译了。东岳老师应该是笔误了
-
如题,当我们执行decomposePar后,在constant/polyMesh文件下新产生了如下四个文件 1。boundaryProcAddressing
2。cellProcAddressing
3。faceProcAddressing
4。pointProcAddressing
其中,想请教一下大佬们,boundaryProcAddressing文件的含义是什么?
以cavity算例为例,分区数目为4,方法为simple,对网格进行均分,我发现每个处理器上的boundaryProcAddressing文件内容均相同,为下图
有没有大佬,解释下文件内容(也即 (0 1 2 -1 -1))的含义啊?谢谢! -
@李东岳 好的!谢谢老师
-
@李东岳 李老师要是有时间希望能稍微解释一下
-
@李东岳 不好意思啊 东岳老师,我表述的不是很清楚,我说的exe想说的是编译成application.就是下图中的EXE。谢谢老师回复!
-
@Yongbo 还没有,我按照您说的试一下,你尝试后有结果了吗?
-
大佬们,如题。如果在OpenFOAM中想利用wmake编译一个静态库,或者想在编译上层应用(exe文件)的时候链接一个静态库,我应该如果配置option文件呢?有没有有类似经验的老师,可以指点下!感恩!
-
好的,谢谢东岳老师,想多问一句,可压问题(OF针对不可压问题)中也是一般采用您说的这种方式 (如下图)吗?另外您说“大部分”CFD算法采用这种线化方法,也就是还有其他方式?嗯嗯谢谢!
-
目前我们知道,当我们并行计算进行区域分解的时候,每个进程获得部分网格,然后针对部分网格进行局部标号(对单元,面,点都进行局部编号)。可是在计算过程中,需要进行通信(包括相邻进程通信和全局通信),我想问一下大佬们,进程间通信的时候,需不需要借助实体(单元,面,点)的全局索引?怎么看出来的?谢谢大家!
-
说一下新发现,经过globalindex后输出的全局坐标和一开始串行划分的全局坐标不一致。新的问题,OF中什么时候会调用这个globalindex函数呢?进程间通信需要全局信息吗?谢谢!
-
又看了几个帖子,更加晕了
https://www.cfd-china.com/topic/1314/压力方程和压力修正方程/5
大家看看下面几张图:
所以说,时间步内组建出来的矩阵到底发生变化吗?还是说只要U更新,UEqu.A()和UEqu.H()就会发生变化呢?唉。。。
-
@李东岳 好的明白了,谢谢东岳老师!
-
众所周知,牛顿法是非线性问题转化为线性问题的方法之一,但是OF中显然采用的不是这种线化方法(因为这种方法要求雅可比矩阵。。弱弱问一句,这里的jacobi矩阵和可压缩流体中常提的通量Jacobi矩阵是一个概念吗,感觉好像不太一样)
在之前lusgs的帖子下面,@chengdi 老师给出了下面的解释
OF中采用的是picard的线化方法,就是直接把非线性项中的其中一个未知量用上一个时间步的已知量替代。按照这种说法,不应该在同一个时间步中进行多次循环(一个非线性问题转化为一系列线性问题)来降低线性化带来的延迟效应吗?可是在OF中没有看到这种操作啊?难道说 参数nCorrectors
对应的循环同时起到了处理非线性的效果?好疑惑啊!有没有大佬指点下!万分感谢!
换句话说,simple算法中 -
问题来了,有没有大佬能解释下,东岳老师在上面提到的几个问题之一,就是“为什么时间步要加自循环”呢?老师在这里提到的自循环指的是下图nCorrectors参数对应的循环吗?
谢谢各位老师! -
想请教一下老师们,公式中 通量这个符号,也就是 F,如下图这个符号
对于通量F,相邻两个单元,交界面上的F在公式中(在A_{N}的系数中) 应该取相反数吧,毕竟面法矢Sf的方向永远是owner指向neighbour,可是根据高斯定理,体积分转化为面积分的时候要要指向单元外侧,所以对于owner单元,面法矢的方向是正确的,对于邻居单元,应该取一个负号,不知道我这么理解对不对?谢谢大家!
-
@李东岳 芜湖!谢谢岳哥!
-
@wangfei9088 十分感谢,您追踪代码的执行力太强了。我也按照您的搜索路径走了一遍,发现果然如此。您最后最终到的 Foam::solve函数看来应该是个全局函数,并且由这个全局函数来调用fvMatrix中的成员函数solve.请问这么理解对吗?谢谢!
另外您提到如下图所示的
,
编译没有问题,但是运行报错。我重复了您的步骤,发现确实如此,原因应该是这种变动并不是等价变动,因为更改了UEqn的值(此后UEqn作为单独整体出现并参与计算了)。所以我做了如下的等价变动
讲道理这样应该可以获得正确结果,可以居然连编译都编译不过了。。。好奇怪啊
-
自挖自填,大家可以看下这个网站https://develop.openfoam.com/Development/OpenFOAM-plus/-/issues/1412。
不过还有一个疑问,就是每个进程中重新调用globalNumbering_函数获得的global index,和一开始串行blockMesh得到的全局索引,是一致的吗?有没有大师指点下迷津
-
@wangfei9088 谢谢大佬回复啊,我明白在c++ 中也可以设置全局函数,用面向过程的方式来编写。可是在此处,solve函数作为fvMatrix类的成员函数,真的可以 直接以 “函数名加实参”的方式调用吗?谢谢!
-
自挖自填。再次感谢@浪迹天大 和@马乔 两位大佬的解释,原来这是一种c++ 特性——递归模板模式,也就是 派生类继承自模板类,同时把自己作为参数传递给模板类。这样做的目的其实很明确,从基类对象的角度来看,派生类对象其实就是本身,这样的话只需要用一个static_cast就可以把基类转化成派生类,从而实现基类对象对派生对象的访问。
-
@浪迹天大 我去,可以的,谢谢大佬!感谢感谢
-
图片的内容是icoFoam.C。想请教下,solve函数不是fvMatrix的成员函数吗,调用成员函数不是应该用对象去访问吗?为什么可以直接用函数名调用呢。就算是静态成员函数,不也应该用类的名字调用吗,请问这里是什么用法?谢谢!
-
@马乔 好的,谢谢!
-
@xpqiu 感谢老师!我的邮箱是974747783@qq.com,谢谢!
-
大佬们,如上图(此图出自PETSc4FOAM,一个把PETSc集成到OF中的工作),在声明petscLinearSolverContexts类的时候,可以看到他继承自MeshObject类,奇怪的是MeshOject这个类模板在实例化的时候居然用了petscLinearSolverContexts来实例化模板参数,很奇怪,这是啥用法?这也也可以吗?(感觉这是循环定义啊)有c++大佬指教下吗。不胜感激! -
老师们好,在OF并行计算的过程中,涉及到区域分解,目前我了解的知识有:在每个进程上,所有的实体(单元,节点,面)都会有自己的局部编号(从0开始编起)。但是进程之间通信的时候,需要借助全局编号(此处我不知道自己的理解对不对,或是不需要??请指正!)总之,有用到全局编号的时候,那么这个时候就需要调用globalNumbering_函数(该函数在globalindex类中)。请问大家有没有解读过这个函数的功能呢?或者诸位能否提供一下关于全局索引和局部索引转化的说明呢?谢谢!感恩!
-
自挖自填,确实两者是不一样的,因为通信边界的值是相邻进程发送过来的格心值,并不是我理解的格心插值到面心。
-
@李东岳 李老师, 又测试了好几个算例,都发现有这个问题,就是两个处理器边界的值对应不上。而且讲道理,处理器边界上的值不就是相邻两个格心值插到face上的值吗?为什么会出现不同处理器上值不一样的情况呢?另外,我感觉,处理器边界的值和物理边界的值不一样,因为物理边界上是一定要给值的,因为我们是根据物理边条算出内场格心未知量,而处理器边界上的值是被内场格心未知量算出的,对未知量的求解没有影响(一句话总结,物理边条决定内场,内场决定处理器边条),从这个角度说,处理器边界上的值不给也行,不影响求解 ,不知道我这么理解对不对?谢谢!
-
@Tong 好的,真知灼见。大概理解了下,您强调的是充分利用物理性质来构造预条件。。确实偏数学。。“针对体系结构和并行的优化可能不同”,的确如此。感觉如果是做优化的话,还是要针对特定的硬件架构去做实现层面的优化,想要在数学(算法)层面优化太难了。。。
-
@Tong 好的谢谢。我好好看一下你提到的foam-extend,您提到:“对于全耦合求解的矩阵(foam-extend里的coupledMatrix)的确需要针对物理问题的新预条件器来加速收敛”,您的意思是预处理(相比分离求解器来讲)对于耦合求解器来说更加重要吗?
-
@Tong 好的!谢谢,您说的文章我也看过,不过涉及到具体细节他没有将,OF2006中已经实现了petsc2foam了。我正在看源码,在这个网址上:https://develop.openfoam.com/modules/external-solver/-/blob/develop/src/petsc4Foam/utils/petscLinearSolverContext.H
我最终的想法是实现一个自己的预处理器或者矩阵求解器然后继承到OF中。 -
@李东岳 奥奥好的,谢谢岳哥!
-
@李东岳 好的谢谢东岳老师!不过我想说的其实是,如果控制方程中没有时间项,那么对于空间项,不就没有选择当前步和未知步这种说法了吗。或者说对于只有空间项的方程,我们还能说对空间项使用当前步或者未知步吗?谢谢!
如果在OpenFOAM中进行重叠型区域分解?
并行计算更新边界的问题?
关于OpenFOAM矩阵求解器
关于OpenFOAM矩阵求解器
请问高阶格式的矩阵还能用LDU格式存储吗?
OF中是怎么处理非线性的?
为什么压力泊松方程离散后的矩阵是非对角占优的啊?
为什么压力泊松方程离散后的矩阵是非对角占优的啊?
为什么压力泊松方程离散后的矩阵是非对角占优的啊?
为什么压力泊松方程离散后的矩阵是非对角占优的啊?
提取log文件中的一些信息
请问高阶格式的矩阵还能用LDU格式存储吗?
区域分解后polyMesh文件夹下的boundaryProcAddressing文件是什么含义?
区域分解后polyMesh文件夹下的boundaryProcAddressing文件是什么含义?
进程间通信需要全局索引这类信息吗?
进程间通信需要全局索引这类信息吗?
交界面上的通量F在公式中(在A_{N}的系数中) 是不是应该取相反数?
solve函数为啥不需要用对象去访问调用?
区域分解后polyMesh文件夹下的boundaryProcAddressing文件是什么含义?
OpenFOAM教程 初级入门建议
OpenFOAM教程 初级入门建议
如何通过wmake编译或链接静态库?
solve函数为啥不需要用对象去访问调用?
如何通过wmake编译或链接静态库?
OF中是怎么处理非线性的?
进程间通信需要全局索引这类信息吗?
globalNumbering_的作用是怎么发挥的?(OF中的全局索引和局部索引)
OF中是怎么处理非线性的?
OF中是怎么处理非线性的?
OF中是怎么处理非线性的?
OpenFOAM教程 初级入门建议
交界面上的通量F在公式中(在A_{N}的系数中) 是不是应该取相反数?
solve函数为啥不需要用对象去访问调用?
solve函数为啥不需要用对象去访问调用?
globalNumbering_的作用是怎么发挥的?(OF中的全局索引和局部索引)
solve函数为啥不需要用对象去访问调用?
一个关于OF中C++模板实例化的问题,请大佬们看下!
一个关于OF中C++模板实例化的问题,请大佬们看下!
solve函数为啥不需要用对象去访问调用?
一个关于OF中C++模板实例化的问题,请大佬们看下!
turbulence->divdDevReff(U)
一个关于OF中C++模板实例化的问题,请大佬们看下!
globalNumbering_的作用是怎么发挥的?(OF中的全局索引和局部索引)
为什么两个对接的处理器边界处的值不一样?
为什么两个对接的处理器边界处的值不一样?
openfoam中cyclic周期性边界的问题
openfoam中cyclic周期性边界的问题
openfoam中cyclic周期性边界的问题
老师们,为什么稳态问题也有显隐式的区分呢?
老师们,为什么稳态问题也有显隐式的区分呢?