拉格朗日模型里是如何加入或删除粒子的?||为什么遍历粒子时粒子的属性会出现随机的情况?
-
以下问题基于OF7,OF9以上版本不确定具体模型是怎么回事,但是OF8以下的大概差不多,希望各位大佬们给点拨以下!
核心问题:拉格朗日模型在添加或删除粒子的时候是基于什么list或者是什么序列存储的粒子的信息?
我发现不同子模型在添加粒子时候都是通过addParticle函数实现的template<class ParticleType> void Foam::Cloud<ParticleType>::addParticle(ParticleType* pPtr) { this->append(pPtr); } // 用injectionModel举例,先new一个指针作为粒子,再通过指针赋予粒子各种属性 parcelType* pPtr = new parcelType(mesh, pos, celli); // 然后调用addParticle函数将有属性的粒子加入场内 cloud.addParticle(pPtr);
删除粒子的时候调用deleteParticle函数
template<class ParticleType> void Foam::Cloud<ParticleType>::deleteParticle(ParticleType& p) { delete(this->remove(&p)); } // 用StochasticCollisionModel里的程序举例 if (mass < this->owner().constProps().minParcelMass()) { this->owner().deleteParticle(p); }
那么在对指针(也就是粒子)进行append和remove的时候,OF是创建了一个指针的list吗还是什么,因为每个粒子指针都是new出来的,单纯new出来的指针是用二叉树的形式存储在堆里,应该不会出现指针的信息是随机生成的情况(为什么这么说见后面,我想象到的能让系统赋值随机数的可能性就是有一个list,本来list的各个位置都是有值的,然后人为把某个信息删掉,这样那个位置的信息就会是随机的?)。
核心问题的来源(希望有耐心的大佬帮忙解答一下下面的问题!!!感激不尽!!!):
最近测试喷雾算例时候会遇到一个问题,就是在计算的时候算着算着就会发散,大概像下面这样,CompostieCollision是我自己建的类,在这个模型里会有粒子的删除和添加功能(单就粒子的删除和添加功能来说,是仿照OF里自己的程序写的,不会有什么问题),但是问题应该是出现在这个类里了
仔细检查,多次测试输出了寻找到的粒子碰撞对p1,p2的各种属性时发现:p1的ID和各种属性是不会出现问题的,p2的ID会出现0、极大数或极小数,p2的粒径也不对,有时粒径很大,有时粒径为0(这里的ID是通过origID函数返回的,返回值是const类型,所以不会变)。如图
感觉这里的问题可能是系统遍历到粒子的时候随机生成了一些信息,导致粒子的ID是随机数,出问题的粒子的属性也不对(见下面报的错)。
为了更好的计算,找到更多错误的规律,随后限制了遍历碰撞对的条件,限制了粒子的ID应该在计算域内的粒子数范围内,随后发现:p2的ID会是一个比较小的整数,粒径信息不正确,位置信息压根就没有,报错也报的是位置信息的错
但是上述问题只是在有几十万粒子的喷雾算例里才会出现,在只有两个粒子的binary collision里计算时不会出现这些问题,ID一切正常,各种属性信息也一切正常。
请问各种大佬能不能麻烦给点建议?
-
你的这种问题我并没有遇到过,我是根据breakupmodel里面的addparticle,在需要生成子parcel的时候,先copy一个父parcel,然后对需要的变量进行重新赋值
像你这种概率的报错的话,个人想法完全可以加一个if判断一下是否出现极大或者极小值,给过滤掉,不会影响你统计学的对错的
-
@星星星星晴 在 拉格朗日模型里是如何加入或删除粒子的?||为什么遍历粒子时粒子的属性会出现随机的情况? 中说:
响
是的 我现在是加了限制极大值极小值,但是后来就会出现ID=1,或者=2的情况,粒径和位置信息啥的也都不对,有点疑惑
-
又检查了一下p1, p2这对碰撞对粒子所在的网格,发现p1,p2并没有在一个网格内,这和程序设计的逻辑不一致,我的compositeCollisionModel是在ORourke基础上改的,两个粒子本应该在是在同一个网格内才可能发生碰撞
结果显示p1在ID为154862的网格内,p2在ID为159677的网格内,那么问题来了,为什么程序会跑出这种结果?p2到底是哪来的?
-
@jqbu 试着输出一下看看这两个是不是相邻cell
你用的是GAMG?
仅仅是猜想,会不会是GAMG的问题?