CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    气固颗粒反应组分输运方程问题

    OpenFOAM
    1
    1
    148
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 书生kao
      书生kao 最后由 书生kao 编辑

      计算气固颗粒反应流动,稠密颗粒流动的基础上添加了气固反应,组分输运方程的代码如下:

      {
          combustion->correct();
          Qdot = combustion->Qdot();
          volScalarField Yt(0.0*Y[0]);
      
          const volScalarField muEff(turbulence->muEff());
      
          forAll(Y, i)
          {
              if (i != inertIndex && composition.active(i))
              {
                  volScalarField& Yi = Y[i];
      
                  fvScalarMatrix YiEqn
                  (
                      fvm::ddt(alphac, rhoc, Yi)
                    + mvConvection->fvmDiv(alphaRhoPhic, Yi)
                    - fvm::laplacian
                      (
                          fvc::interpolate(alphac)
                          *fvc::interpolate(muEff),
                          Yi
                      )
                    ==
                      vanadiumParcels.SYi(i, Yi)
                    + combustion->R(Yi)
                    + fvOptions(rhoc, Yi)
                  );
      
                  YiEqn.relax();
      
                  fvOptions.constrain(YiEqn);
      
                  YiEqn.solve("Yi");
      
                  fvOptions.correct(Yi);
      
                  Yi.max(0.0);
                  Yt += Yi;
              }
          }
      
          Y[inertIndex] = scalar(1) - Yt;
          Y[inertIndex].max(0.0);
      }
      

      编译是没有问题的,目前遇到的问题是各组分的质量分数不对。
      反应是生成Cl2,消耗O2,inertSpecie为N2,计算过程氯气的质量分数不断增加(未越界),而N2的质量分数减少。实际上即便完全反应,N2的质量分数下降应该不大,计算结果不符合实际现象。
      个人理解问题应该是vanadiumParcels.SYi(i, Yi),可以理解为组分输运方程的源项,其代码为

      template<class CloudType>
      inline Foam::tmp<Foam::fvScalarMatrix> Foam::ReactingCloud<CloudType>::SYi
      (
          const label i,
          volScalarField& Yi
      ) const
      {
          if (this->solution().coupled())
          {
              if (this->solution().semiImplicit("Yi"))
              {
                  tmp<volScalarField> trhoTrans
                  (
                      volScalarField::New
                      (
                          this->name() + ":rhoTrans",
                          this->mesh(),
                          dimensionedScalar(dimMass/dimTime/dimVolume, 0)
                      )
                  );
      
                  volScalarField& sourceField = trhoTrans.ref();
      
                  sourceField.primitiveFieldRef() =
                      rhoTrans_[i]/(this->db().time().deltaTValue()*this->mesh().V());
      
                  const dimensionedScalar Yismall("Yismall", dimless, small);
      
                  return
                      fvm::Sp(neg(sourceField)*sourceField/(Yi + Yismall), Yi)
                    + pos0(sourceField)*sourceField;
              }
              else
              {
                  tmp<fvScalarMatrix> tfvm(new fvScalarMatrix(Yi, dimMass/dimTime));
                  fvScalarMatrix& fvm = tfvm.ref();
      
                  fvm.source() = -rhoTrans_[i]/this->db().time().deltaTValue();
      
                  return tfvm;
              }
          }
      
          return tmp<fvScalarMatrix>(new fvScalarMatrix(Yi, dimMass/dimTime));
      }
      

      到目前为止,我也没看出来有啥问题。所以,想请教一下吧里的大佬,能否帮我解答一下疑惑?如何解决这个问题,请各位大佬不吝赐教!!!

      业精于勤荒于嬉,行成于思毁于随!

      1 条回复 最后回复 回复 引用
      • First post
        Last post