个人觉得没必要考虑吧
OItoCFD
帖子
-
-
@Rachel0096 就加在你的所用的求解器的c文件更新粒子附近的地方吧,我只是写了个大概的,具体的你得看你用的求解器里面的具体内容
-
@Rachel0096 ```
label particleNumber;
particleNumber = 0;
forAllIter( basicKinematicCloud , kinematicCloud, iter)
{
parcelType& p = iter();
// 判断颗粒位置是否在你的slice附近范围内,如果是:
particleNumber+= p.nParticle();
//否则不计数
}
reduce(particleNumber, sumOp<label>()); -
@李东岳 我在使用过程中,一个网格里多个ib点基本上没问题,问题都出在如果只是固体边界布置一圈浸入边界点,内部是虚拟流体,这样容易透水,但是这方法我算出来的力很光滑。对于很多复杂界面,我为了防止透水,固体表面包络的所有内部流体网格里我也全都每个网格中心布置一个浸入边界点,这样可以避免大部分透水问题,但是这样有时候算出来的力会有小震荡,应该是还是对内部的插值做些特殊判断我没做
-
@eason 理论上来说是的,用外在的导出得到的散点不一定满足ib点条件,在这种情况下,我会把散点包络的所有内部虚拟流体网格也全部作为浸入边界点了,这样能有效避免透水问题。我原本的方法是只是边界布置点内部虚拟流体,但是确实稍有不慎就透水
-
@eason 就建模软件建好,导出stl或其它格式,把其中散点数据单独复制出来,然后再openfoam读入进行后续操作
-
@Rachel0096 r如果只是边界布置进入边界点的IBM,内部是有流场的,他这个应该是有的我好像看过这篇,他只是后处理额外画个圆柱盖住内部虚拟流体
-
@jasper-0 我觉得不需要
-
@jasper-0 我的话我是没考虑你说的这个 主要还是先看你问题吧 你的颗粒属于哪类型的 一般需要什么力 你甚至可以不用他自带的力 全关掉 自己循环颗粒自己算你所有应该有的力 加在一起给U方程
-
@李东岳 他这里应该是自己用其他不带LPT的求解器额外连接openfoam的LPT包,在U方程里直接加比较简单
-
@rachel0096 我没看过他这个 但基本都大同小异 其实 写一个ibm在openfoam就用不了多少代码 我也就看了几篇文章 找准一篇你觉得好实现的对着做 你可以先用最简单的方法 比如在pimplefoam里 对于2d圆柱绕流 写一个函数检测小于半径r范围内的cell 这样就检测出一个圆柱范围内的流体cell 标记为1 其他流体的cell标记为0 然后在压力方程那里 根据固体cell和desired velocity的速度差算出体积力 加给phi那里 进入压力迭代 这就是一个最简单的ibm 这个弄对了再加上二阶插值分布函数那些来考虑更高精度的界面识别
-
@rachel0096 您好 我也在持续学习中 可以在这个帖子里有啥问题直接问我 如果我知道的话肯定就解答一下
-
@小狗狗 是的 openfoam里这种颗粒,算力是拖曳力系数用类似莫里森方程来算,算是概化模型吧,运动那些都是当为一个支点,不是grid-resolved。如果是精细考虑颗粒,每个颗粒表面也要画网格,受力是根据颗粒表面附近流体节点压力积分来算,再算总的这个颗粒平动转动。
-
@李东岳 老师,我自己觉得是可以,只是我没想好具体的实际方法,这也是为什么我选择在均匀的网格下弄。 我对于我现在均匀网格的就这么搞得 我自定义了我的固体活动范围里的网格编号和关系 均匀网格的连接关系很简单 我甚至连数组都不用开个去记录 我只是为了并行 预处理了固体活动范围内每个网格所在核心的编号和所处分块区域内我自定义编号的cell在对应核心对应分解域内的真实编号 计算时候根据连接关系,o(1)的运算时间取出临近网格的自定义标号 然后根据预处理记录的它在所属分块内的真实编号来计算 。
只是对于非结构网格,不均匀,有变形这种,我具体不太知道openfoam里编号的规律,也不知道老师您这里具体的应用场景是什么。我个人觉得,也是在进入时间步循环前,搞个预处理,把非结构网格的cell中心坐标提前循环一遍预处理,映射给自己自定义的一套均匀网格,然后一个数组记录,数组下标是自定义映射均匀网格的编号,该数组下标里数组对应内容是落在这个自定义网格内的非结构网格的真实编号,均匀网格的关系很简单,可以简单查找临近关系。而且这个映射网格的作用纯粹就是,映射个大致的位置关系。但是这个映射的均匀网格的尺寸要小于实际非结构最小cell的尺寸,大致我是这么想的。但是这样我不知道提前记录的内存开销有多大,我觉得甚至还不如,自己知道每个非结构网格要查找的周围感兴趣网格范围,每个模拟开始进入时间步前,提前预处理输出给文件打个表 (因为是预处理,所以无所谓,各种findcell也花不太久,因为只需要执行一次并记录),然后运算时候,对于某个非结构网格,直接读取预处理打表的那个文件,再取出周围符合关系的网格编号。这里读取文件,和字符串处理花一点运算时间。
-
@李东岳 老师这个我就没仔细看extend的代码了,我是看他们还有压力震荡我就直接自己重写IBM了。我在写类似方法时候是按照网格的固体填充度算一个梯度得个方向矢量,然后沿着矢量方向findcell,速度极慢。现在是直接固体表面拉格朗日点,背景流体网格全用均匀的正四面体,这样随便给一个粒子坐标,o(1)的时间就知道它位于哪个流体网格。前后左右上下的临近网格也都是o(1)就能算。不用findcell了。但是就丢掉了非结构网格的优势。
-
@马乔 谢谢指导,foam-Extended那个ibm的方法我不喜欢,我之前看的别人用的好像还是压力震荡的问题,我自己写的ibm没压力震荡,而且因为是自己写的,我结合其他有限元的方法更方便写的速度更快。问题只是出在并行写法上,用到并行其实就是ib点的速度插值,和体积力分散给流体这里,用二阶函数要用到周围两个格子距离内所有网格,会跨区域,但是一直findcell再合并,对于移动物体没法预处理打表的是真的慢。
-
@李东岳 谢谢!
-
@李东岳 好的谢谢老师,那我添加紊流模型,直接nu用nuEff()代替可以吗,我就调用下LES,不用RANS。
-
各位老师和同学,
我用Admas-bashforth格式写了一个新的求解器,用的两步映射法,没用PISO或pimple,简要代码如下:fvVectorMatrix UEqn ( fvm::ddt(U) + 1.5*fvc::div(phi, U) - 0.5*fvc::div(phi.oldTime(), U.oldTime()) == 1.5*fvm::laplacian(nu, U) - 0.5*fvc::laplacian(nu, U) + 0.5*fvc::grad(p) ); fvScalarMatrix pEqn ( fvm::laplacian(p) == 2.0/3.0*fvc::div(phi)/dt );
请问,
- 如何添加紊流模型?
直接按照原始求解器,建立紊流模型的指针后,获取nuEff(), 把nu替换成nuEff(),这样是正确的吗? - 如何添加VOF?
我还没尝试,不知道直接仿照interFoam,把该包括的子文件包括进去,Ueqn加上重建的那一部分,是不是可行,有没有什么误区。
谢谢各位!
- 如何添加紊流模型?
-
@马乔 您好,想请教一下,对于流固耦合,我现在用的浸入边界法,按照您的经验,并行时候我需要把固体节点也分割给不同decomposed流体区域吗,还是每个流体区域都享有同样的完整的固体数据免得固体信息还要传来传去。但是就算如此,固体和流体之间插值时候,我用二阶插值,还是免不了外部循环总固体节点,内循环是在每个固体节点处查找邻近的两个网格间距内所有流体cell,会用findCell,效率奇低。不知您有什么建议吗?谢谢
-
@李东岳 老师,我解决这个问题了,现在还是只需要边界一圈点就行了,结果正确。运动物体也验证了。固体内部的虚拟流体在ns中正常计算,只是在边界处和外部流体方向相反,保证刚好边界处满足无滑移。
我自己测试,这种虚拟流体的方法,和固体内部也算作固体cell满足无滑移相比,后者数值上更稳定,不会出现我题目里出现的问题。但前者,在处理运动物体时候,杂散力震荡会比较小,杂散力震荡是ibm的老问题了。Extended版本的我看了,是ghost cell的方法,我也写了个类似的版本,出现了极大的杂散力震荡。所以我又用直接应力法,然后只在边界布置ib点但固体内部虚拟流体正常计算的方法。本来内部流体就不应该影响外部流体,布置一圈点满足边界上的无滑移即可,之前的错误应该是中间速度更新体积力时候导致的数值上的误差,因为我在体积力的更新那里加入了一篇文章里用的一个小小的亚迭代,问题就解决了。
-
各位同学老师好,我最近用openfoam写了几个版本的IBM方法。但是遇到一个很疑惑的问题,请各位老师同学指点一下。 就是对于直接应力法的IBM,比如对于一个圆柱绕流问题,生成一圈ib点, 然后流速插值到ib点上,满足无滑移边界条件,能算出体积力,加到ns里,就是这个ibm方法的基本原理。但是,按理说,只需要圆柱边界处一圈布置ib点就可以了,然后圆柱内部相当于虚拟流体来计算,但是我写完代码这样计算得出的cd,cl不对。必须把圆柱内部占据的流体cell也按照无滑移边界条件算体积力加回刀ns方程才能算出正确结果,这样的话,如果对于静止圆柱绕流,那么圆柱内部的流场就是静止的了,不存在虚拟流体的计算了。但是原理上来说,应该没必要这样的。只需要外边一层节点,而且很多文章也写了在圆柱处布置一圈ib点就可以。请问有没有熟悉这方面的老师和同学呢?谢谢。
-
@tens 要自己写代码给固体画网格 然后浸入边界法积分网格受力 然后把反作用力以源项形式加回动量方程 如果颗粒还考虑变形的话 还要写个有限元的求解器
-
@cresendo 哇 我还不知道 但是我在用v2106 那我去查查吧看这个版本有没有类似的 感谢感谢~
-
需要记录波高数据来验证,但是不想算完后用matlab读取数据处理,不知道openfoam自带的后处理工具或命令有没有合适的方法,谢谢各位
-
请问自带的造波不好吗?
-
@李子橙 我的困难还不是很细节的 局限于 我不懂他的整体结构,哪一步在干什么,我该怎么把他跟OpenfoamV2106的流体求解器连起来,openfoam的这种求解器太过复杂,我想搞明白需要很久的时间,所以我干脆去看理论直接自己在OpenFOAMv2106里自己定义固体算法的类自己重新写了,毕竟本身fsifoam我还是得修改成我需要的固体求解,因为算法还是有不同。而且我需要对它很明白才能实现,权衡再三,我是觉得自己写反而更快
-
@李子橙 建议不折腾 再想想其他替代方法 或者换软件 因我我一开始也想折腾fsifoam 发现甚至 不如自己新写一个固体求解器加到openfoam流体solver更简单
-
@tidedrinker 好的谢谢 明白
-
@tidedrinker 好的谢谢 请问另外几个RANS模型下的话都有小问题吗?
-
@tidedrinker 谢谢这些有用的信息 那目前为止 开紊流模型 还会有影响吗?还是说还是得直接层流模型来算?
-
@tidedrinker 朋友 这里这个设置会有用吗 https://www.openfoam.com/news/main-news/openfoam-v20-12/solver-and-physics
- Incompressible non-uniform density turbulent model for VOF
写的是减少相界面处湍流粘度过度而导致的波阻尼
-
@tidedrinker 同问 不过我用的是v2106
-
各位老师同学,我是自带的拉格朗日库不想用,因为需要的很多功能不一样,不如自己另写,但是并行上,自己写的只是在反复的reduce,效率很低,不知道并行上该怎么写比较正规,对于类似颗粒追踪的并行算法,应该参考openfoam拉格朗日库里具体哪个代码合适呢?谢谢
-
@tong 好的好的 感谢感谢
-
老师openfoam自带的造波不好用吗?我看都装waves2foam, 但是这个在超算上不好操作呀
-
@卡洛 您好 您说是网格质量问题 是指的of自带的造波网格加密后就没事了吗?过阵子我也得用造波,想用自带的,不知道有问题没。
-
@是嘿嘿牛啊 感觉是网格太粗 你的数据采点更密 一个间距里采到两个一样的值 不太清楚
-
-
@马乔 您好,算是吧 就是每个时间步 我要知道我每个拉格朗日点在哪个cell,然后把力按照cell距离的远近按照delta函数分布到周围所有cell里 我的固体是拉格朗日点代表的 固体可变形 所以每个时间步都要所有点来一次findCell
-
不清楚 过几天准备写个弹簧试试看能不能准
-
@chaoscfd 我用了 但还是mesh.findcell最快
-
我最近也在纠结类似的,我需要大量的findCell,挺慢的
-
@马乔 您好,这么讲的话,也许是可能是截断误差影响。然后我之所以用findCell,是因为我用到一个delta function,做一个点的物理量分布到周围网格范围内流体网格的distribution的操作,和点周围流体网格物理量插值到点的interpolation操作。就是grid to point and point to grid。需要找到点所在cell及其周围一圈两倍网格间距范围内的cell,不知道想实现这种插值分布函数,还有没有其他更简单的方法吗?请问您有什么看法吗?谢谢!
-
@李东岳 在 OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致 中说:
另外你没用过primitiveMesh的findCell()试试么,这种
point a(1,2,3); mesh.findCell(a);
我几年前记得在某个SCI里面看到过说meshSearch好像效率低,不过具体细节我忘了
老师,mesh search和mesh的findCell我都是用了的,一样的结果,都是循环外单独找那两个点是对的,循环内就不对,是重复的CellID
-
@李东岳 在 OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致 中说:
代码上看起来是没问题。
label cellId = searchEngine_.findCell(tmpOffSetPoint);
这句话之前赋值为0然后再赋值呢?
老师,这样做也是一样的结果,还是重复的CellID
-
我把代码和测试算例精简后打包发在了网盘,如果有兴趣的老师和朋友可以帮忙看一下,谢谢!blockMesh后运行
链接:https://pan.baidu.com/s/1HEy6w8MgbeXu9EsMcayung
提取码:1111
--来自百度网盘超级会员V4的分享 -
各位老师同学好,最近写的一个代码的一个小部分用到了findcell去找点所在的cell,但是发现了一个奇怪的问题。对于两个点,我单独findcell出来结果是对的,但是在循环里面算出来这两个点后再findcell,结果不对。首先,代码我已经把无用的都删了后如下:
#include "fvCFD.H" #include "meshSearch.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { argList::addBoolOption ( "noOverwrite", "increment time to avoid overwriting initial fields" ); #include "setRootCase.H" #include "createTime.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #include "createMesh.H" IOdictionary blockMeshDict ( IOobject ( "blockMeshDict", runTime.system(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) ); IOdictionary NetProperties ( IOobject ( "NetProperties", runTime.constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) ); const dictionary& NetDict(NetProperties.subDict("deltaFunction")); const label nx(blockMeshDict.lookup<scalar>("nx")); const label ny(blockMeshDict.lookup<scalar>("ny")); const label nz(blockMeshDict.lookup<scalar>("nz")); const scalar lx(blockMeshDict.lookup<scalar>("lx")); const scalar ly(blockMeshDict.lookup<scalar>("ly")); const scalar lz(blockMeshDict.lookup<scalar>("lz")); const scalar dx = lx/nx; const scalar dy = ly/ny; const scalar dz = lz/nz; const List<label> offSet_ ( NetDict.lookup("a") ); meshSearch searchEngine_(mesh); vector tmpKnotPoint(1.5,0.72,1.359); vector point1(1.47727,0.694583,1.30181); vector point2(1.5,0.694583,1.30181); Pout << "point1 (1.47727 0.694583 1.30181) should be inside cell " << searchEngine_.findCell(point1) << endl; Pout << "point2(1.5 0.694583 1.30181) should be inside cell " << searchEngine_.findCell(point2) << endl; vector tmpOffSetPoint; label num = 0; forAll(offSet_, zi) { tmpOffSetPoint.z() = tmpKnotPoint.z() + offSet_[zi]*dz; forAll(offSet_, yi) { tmpOffSetPoint.y() = tmpKnotPoint.y() + offSet_[yi]*dy; forAll(offSet_, xi) { tmpOffSetPoint.x() = tmpKnotPoint.x() + offSet_[xi]*dx; label cellId = searchEngine_.findCell(tmpOffSetPoint); Pout << num << " " << cellId << " " << tmpOffSetPoint << endl; } } } return 0; }
输出如下:
point1 (1.47727 0.694583 1.30181) should be inside cell 423586 point2(1.5 0.694583 1.30181) should be inside cell 423587 0 423587 (1.47727 0.694583 1.30181) 0 423587 (1.5 0.694583 1.30181) 0 423785 (1.47727 0.72 1.30181) 0 423785 (1.5 0.72 1.30181) 0 442595 (1.47727 0.694583 1.359) 0 442595 (1.5 0.694583 1.359) 0 442793 (1.47727 0.72 1.359) 0 442793 (1.5 0.72 1.359)
循环里输出的Cell 的Id对于这两个点(1.47727 0.694583 1.30181)和(1.5 0.694583 1.30181)都是423587,但是上面的输出直接输出这两个坐标findcell的结果,那就是一个423586,另一个是423587.
难道是findcell用的方法不对,还是什么其他原因呢?请各位同学老师帮下忙。
-
@anubis 那就用位压缩,只需要建立一个m大小的一维数组。每个位置只存储一个该网格对应的粒子有无信息。比如一共十个粒子,网格23对应的状态就是0000100011,转换成十进制为35,只需要把35存进数组位置,因为一个整数35就代表了1,2,6三个位置处状态为1也就是这三个编号粒子存在。下次需要该网格23的粒子编号信息时候,取出35,再写个小程序转换进制判断一下,时间复杂度很低的,一般就是一点简单的位运算,就能知道换成二进制后第1,2,6个位置处是1.
【求教】OpenFoam模拟波浪的壁面函数设置
如何对拉格朗日粒子进行统计?
如何对拉格朗日粒子进行统计?
请教关于浸入边界法的问题,IBM方法的问题
请教关于浸入边界法的问题,IBM方法的问题
请教关于浸入边界法的问题,IBM方法的问题
请教关于浸入边界法的问题,IBM方法的问题
植入拉格朗日粒子的Ueqn中需不需要加phicForces?
植入拉格朗日粒子的Ueqn中需不需要加phicForces?
植入拉格朗日粒子的Ueqn中需不需要加phicForces?
OpenFOAM+IBM
OpenFOAM+IBM
气液固三项流,耦合interFoam和DPMFoam可以实现吗?
globalNumbering_的作用是怎么发挥的?(OF中的全局索引和局部索引)
globalNumbering_的作用是怎么发挥的?(OF中的全局索引和局部索引)
globalNumbering_的作用是怎么发挥的?(OF中的全局索引和局部索引)
如何给时间空间二阶精度两步映射法的求解器添加紊流模型和VOF?
如何给时间空间二阶精度两步映射法的求解器添加紊流模型和VOF?
如何给时间空间二阶精度两步映射法的求解器添加紊流模型和VOF?
globalNumbering_的作用是怎么发挥的?(OF中的全局索引和局部索引)
OpenFOAM+IBM
OpenFOAM+IBM
OpenFOAM+IBM
OpenFOAM有对单个固体颗粒在流场中的全解析计算的求解器吗
OpenFOAM的波浪case有什么简单的方法检测波高数据嘛
OpenFOAM的波浪case有什么简单的方法检测波高数据嘛
OpenFOAM7 安装 waves2Foam & interFoam 生成自由页面视频
fsiFoam 在 OpenFoam 2106 版本上编译的问题
fsiFoam 在 OpenFoam 2106 版本上编译的问题
OpenFOAM 8中的波浪边界是否支持纯波浪?
OpenFOAM 8中的波浪边界是否支持纯波浪?
OpenFOAM 8中的波浪边界是否支持纯波浪?
OpenFOAM 8中的波浪边界是否支持纯波浪?
OpenFOAM 8中的波浪边界是否支持纯波浪?
自己建立的list存储拉格朗日点写一些小算法,怎么并行合适呢
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
OpenFOAM第三方造波包waves2Foam安装
使用olaFlow与ofv1906自带造波应用重叠网格模拟浮体运动
求助:为什么openfoam测出的垂向力会出现这种阶梯状
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
请问做浮体的大佬都是怎样在OpenFOAM中实现锚链的
findCell()可不可以在指定的区域内找到cell label,而不是在整个计算域寻找?
findCell()可不可以在指定的区域内找到cell label,而不是在整个计算域寻找?
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
OpenFOAM编程findCell的诡异问题,对同一坐标寻找cell结果不一致
粒子与网格归属问题