在collidingCloud中添加一个体积分数的判定,怎么实现?



  • 如题目所示,由于不想在高浓度的粒子群中存在碰撞,所以添加了一个体积分数theta的判定。当theta>0.5时,修正粒子速度为0。当theta<=0.5时,正常发生碰撞。下面是添加后的code,编译是通过的,但是出来的结果完全不对。theta的定义是第二个code。希望有经验的朋友帮忙解惑,谢谢拉。

        label nSubCycles = collision().nSubCycles();
    
        if (nSubCycles > 1)
        {
           Info<< "    " << nSubCycles << " move-collide subCycles" << endl;
    
           volScalarField::Internal& thetaIn = theta().ref();
           forAll(thetaIn, celli)
           {
               if( thetaIn[celli] > 0.5 )  //if volume fraction > 0.5,
               {
                   nonMoveCollide(cloud, td, this->db().time().deltaTValue());
               }
               else
               {
                   subCycleTime moveCollideSubCycle
                   (
                       const_cast<Time&>(this->db().time()),
                       nSubCycles
                   );
    
                   while(!(++moveCollideSubCycle).end())
                   {
                       moveCollide(cloud, td, this->db().time().deltaTValue());
                   }
    
                   moveCollideSubCycle.endSubCycle();
               }
           } 
        }    
        else
        {
             moveCollide(cloud, td, this->db().time().deltaTValue());
        }
    }
    
    这是theta的定义:
    
    Foam::CollidingCloud<CloudType>::theta() const
    {
        tmp<volScalarField> ttheta
        (
            new volScalarField
            (
                IOobject
                (
                    this->name() + ":theta",
                    this->db().time().timeName(),
                    this->db(),
                    IOobject::NO_READ,
                    IOobject::NO_WRITE,
                    false
                ),
                mesh_,
                dimensionedScalar(dimless, Zero),
                extrapolatedCalculatedFvPatchScalarField::typeName
            )
        );
        volScalarField& theta = ttheta.ref();
        forAllConstIter(typename CollidingCloud<CloudType>, *this, iter)
        {
            const parcelType& p = iter();
            const label celli = p.cell();
    
            theta[celli] += p.nParticle()*p.volume();
        }
    
        theta.primitiveFieldRef() /= mesh_.V();
        theta.correctBoundaryConditions();
    
        return ttheta;
    }
    

  • 版主 副教授

    虽然不太看的懂代码,但是听你的描述,好像不能达到你想要的目标。

    修正粒子速度为零,应该不是一超过0.5就把全体粒子速度修正为零吧。那样都像绝对零度似的,再不会动了。如果只是修正当前判定的粒子速度为零。那它不动是不撞别人了,别人撞它啊。兴许被怼的更狠……就像在湍流中,随波逐流还不怎么被怼,定那不动被怼的厉害。当然看具体碰撞模型怎么实现的了。如果不是那种只依赖当前速度判定是否碰撞的,那设定为零出什么结果都不是很意外吧:143:


Log in to reply
 


CFD中文网 | 东岳流体学术 | 东岳流体商业 | 吉ICP备20003622号-1