说说关于dpm系统的半透膜的问题
-
我来说说关于dpm系统半透的事情
一般dpm的碰撞判断基本是BC宏 这个不多说
碰撞算法fluent未透露 但是在ANSYS博客中间有一部分提及了 是采用了颗粒轨迹线与面是否相交的办法 这个办法是属于碰撞检测算法 line-surface 这个方法非常的复杂 同时在CFD-ONLINE中间 也有人讨论过这个问题 从我的看法来说 这点Fluent的保密不可能是采用最原始的intersection算法 如果是的话 那么巨量的颗粒沉降计算很明显没有fluent这样的高效
好了 这是说了题外话 但是也跟接下来的相关
也就是当你不利用BC宏的时候 你需要写这样一个算法来判断 dpm 的截留 而这显然是在半透上是简单的 因为这样的话 你只要一个在某一个面上 甚至是一个解析几何的决定上 就可以构造你的半透面 只要颗粒符合你的条件 当然这种复杂在于你的颗粒将在第几步碰撞 那么一个更加显示的 他能够在途中的每个网格的步数是多少(假设颗粒在第一次进入一个cell内被捕获,这一般是现实的,因为你基本上只要处理碰撞表面网格的数据) 那么又一个很关键的 你需要重新一个颗粒更新步的计算 假设你是最简单的欧拉蛙跳(那么很显然你需要了解一个parcel的合外力,所以你必须了解整个dpm.h和其他几个.h的头文件,并且你具备常年的猜测调试和积累,显然就手册那点玩意还是太浅薄了)那么 你将可以直接解决这个半透的问题
而如果你不写trap算法 那么很明显 你需要使用fluent所谓的DPM体系的BC宏。这个宏在颗粒碰撞你挂载的壁面的时候执行,记住这个宏执行将中断颗粒时间步 而他本身是不出网格的 因为出网格需要赋值新的P0值,p0值决定于particle结构体而p属于tracked particle 。也就是说 当颗粒碰到这个面的时候 碰撞数据被计算 碰撞点被获取 颗粒必须更新他的v0值。而这个v0依然是在当前的cell 而颗粒的fate 只有active end abort escape 你的trap会使用abort 但是他决于与p->gvtp 如果要他在head中显示正常 你还得做一番处理
这些都不是问题 颗粒将在当前cell被分割 但是这个这个新的p0值依然是在当前cell内 那么就是说 这些颗粒继续会被这个BC执行 最终的结果是所有颗粒都被在封闭在这个cell内来回碰壁 截留 最后造成完全的incomplete
那么如何半透? 你设想的一个简单的问题 现在已经演变成了一个真正可以实现的问题设想一个现实的条件 颗粒一部分会被反弹(他的vo重新被设置) 一部分被捕获(path_abort) 一部分透过(记住你的时间步已经被分割, 而透过是不分割时间步的)
那么请提供我一个办法 如果处理 你所想的半透?欢迎讨论 真理从来都是越辩越明的
-
因为时间比较紧,叙述不是很明了,现在按照李老师的建议,加上标点。
一般dpm的碰撞判断基本是BC宏,这个不多说。
碰撞算法fluent未透露,但是在ANSYS博客中间有一部分提及了,是采用了颗粒轨迹线与面相交的办法。这个办法是属于碰撞检测算法 line-surface。 这个方法非常的复杂。同时在CFD-ONLINE中间,也有人讨论过这个问题。 从我观点,这点Fluent的保密算法不可能是采用最原始的intersection算法;如果是的话,那么巨量的颗粒沉降计算很明显没有fluent这样的高效。
好了,这是说了题外话,但是也跟接下来的相关。
也就是当你不利用BC宏的时候,你需要写这样一个算法(line-surface)来判断 dpm 的截留。而这显然是在半透处理上是较为简单的。因为这样的话,你只要一个在某一个面上,甚至是一个解析几何的构成虚拟面上,就可以构造你的半透面。只要颗粒符合你的条件。 当然这种复杂在于你的颗粒将在第几步碰撞? 他能够在途中的每个网格的步数是多少?(假设颗粒在第一次进入一个cell内被捕获,这一般是现实的,因为你基本上只要处理碰撞表面网格的数据)。 那么又有一个很关键的问题: 你需要重新编制一个颗粒更新步的计算。 假设你是最简单的欧拉蛙跳,也显然你需要了解一个parcel的合外力,所以你必须了解整个dpm.h和其他几个.h的头文件。 那么,你将可以直接解决这个半透的问题。
而如果你不写trap算法。那么很明显,你需要使用fluent所谓的DPM体系的BC宏。这个宏在颗粒碰撞你挂载的壁面的时候执行,记住这个宏执行将中断颗粒时间步。 而他本身是不出网格的。 因为出网格需要赋值新的P0值。(P0属于particle结构体而p属于tracked particle )。也就是说,当颗粒碰到这个面的时候,碰撞数据被计算,碰撞点被获取,颗粒必须更新他的P_v0值,而particle依然是在当前cell,且颗粒的fate只有active, end, abort, escape 四种。 你的trap可以使用abort,但是他的显示数值决于于p->gvtp, 如果要他在head中显示正常, 你还得做一番处理。
最要的问题是,颗粒将在当前cell被分割,但是这个这个新的P0值依然是在当前cell内。 那么就是说,这些颗粒继续会被这个BC执行。 最终的结果是所有颗粒都被在封闭在这个cell内来回碰壁, 截留, 最后造成完全的incomplete。
那么如何半透? 现在已经说明了在fluent实现这个半透可能的方法。设想一个现实的条件。颗粒一部分会被反弹(他的vo重新被设置) 一部分被捕获(path_abort) 一部分透过(记住你的时间步已经被分割, 而透过是不分割时间步的)。但就是这样最简单的日常物理现象,因为时间步被分割,碰撞算法被黑盒子,依然是十分困难的。(并且fluent的更新过程并不是属于经典的更新过程,时间步的更新会被更小的切分,根据你的设定,并且每一个切分步,你的UPDATA_SCALAR宏都会被执行。也就是说一个理论上的碰撞算法,很可能并不具备真正的可实现性。)