|
|
发表于 2012-12-26 16:35:10
|
显示全部楼层
你说的应该是added mass force吧,问题应该集中在里面有个气流加速度与颗粒加速度的差,就是那个du/dt和dv/dt。加速度是没法直接取到的,但是可以用前后两个时刻的速度计算,按照一阶隐式差分的话
dv / dt =[ v(i) - v(i-1) ] / dt
如果是二阶的话
dv/dt = [ v(i)^2 + v(i-2)^2 - 2v(i-1) ]/ (dt^2)
这里有两个问题,一个是上一个时刻的速度,另一个是dt的选取。
先说简单的,dt,就是时间。颗粒计算的时间,有一个宏P_DT(p),这个是计算颗粒时用的时间步长,和fluent中设置的time step以及dpm里面设定的particle time step都不一样。用上面的宏取那个时间。
下面说一下那个速度的选取。建议你用P_REAL(p),就是那个particle scale存储颗粒在上个时刻的速度。注意,这个时刻是指的颗粒迭代时刻。我做过检验,及时在一个颗粒time step里面,dpm也要迭代很多小时间步长,这个小时间步长到底多长我还不清楚,只是知道它等于P_DT(p)的值。那么你先写一个DPM_TIMESTEP这个宏,宏里面存储P_VEL(p)的值到P_REAL(p),x方向和y方向分别用一个scalar,那么就呀2个scalar。在写体积力的时候,把这个速度调用出来,作为上一时刻的速度,就可以了。唯一要注意的是,DPM_TIMESTEP宏和DPM_BODYFORCE这两个宏的调用顺序,你自己测试一下吧。如果系统先调用DPM_BODYFORCE,后调用DPM_TIMESTEP的话,那么上面的方法是没有问题的。但是,如果DPM先调用的DPM_TIMESTEP的话,你再考虑一下这个scalar的更新位置。总之,就是把上一个时刻颗粒的运动速度存起来,再调出来。
此外,还涉及到流体的运动速度这个问题,这个比较麻烦。如果你是单边耦合的话,它就是0。如果是双边耦合的话,那你就把速度存到UDM里面,用的时候调出来吧。不过,估计也是0。因为,求解的时候,颗粒的计算步长太短了,流体速度基本没什么变化。
不知道,上面的东西,你看懂没。给你个小例子写体积力。
DEFINE_DPM_BODY_FORCE(particle_body_force,p,i)
{
real bforce;
if(P_TIME(p)>=TSTART)
{
if(i==0) bforce=function_x(*****); //x方向体积力,注意是单位质量上的,也就是说,算的时候实际是体积力加速度 F_body / mass_p
else if(i==1) bforce=-function_y(*****); //y方向体积力
}
else
bforce=0.0; //这个是假设初始时刻,体积力为0
/* an acceleration should be returned */
return (bforce/P_MASS(p));
} |
|