CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    编译新的湍流模型遇到no match for ‘operator<’

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

      我在编译一个新湍流模型,遇到了以下报错问题:

      no match for ‘operator<’ (operand types are ‘Foam::volScalarField {aka Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>}’ and ‘int’)
           if (p2 < 0) 
      

      源代码为:

      tmp<volScalarField> KEF::fMu2() const
      {
          const tmp<volTensorField> tgradU = fvc::grad(U_);
          const volTensorField& gradU = tgradU();
          volSymmTensorField sij(symm(gradU));
          volTensorField wij(skew(gradU));
          
          volScalarField Sij(mag(sij)*k_/epsilon_);//Sij*
          volScalarField Wij(mag(wij)*k_/epsilon_);//Wij*
          
          volScalarField S(sqrt(2*Sij*Sij));//S*
          volScalarField W(sqrt(2*Wij*Wij));//W*
      
          volScalarField Eta(fw_*S);//η
          volScalarField Kce(fw_*W);//ξ
       
          volScalarField As = sqr(alpha3_)*sqr(Kce) - sqr(alpha2_)*sqr(Eta)/3;
          volScalarField p1 = C0_*(C0_*C0_/27-(As+alpha1_*Eta*Eta)/6+0.5);
          volScalarField p2 = p1*p1 - (C0_*C0_/9-(As+alpha1_*Eta*Eta)/3);
          volScalarField g(As);
          if (p2 < 0) 
          {
      	g = C0_/3+2*pow(p1*p1-p2), 1/6)+cos(1/3*acos(p1/(sqrt(p1*p1-p2))));//p1,p2的类型导致错误
          }
          else 
          {
      	g = C0_/3+pow(p1+pow(p2, 0.5), 1/3)+sign(p1-pow(p2, 0.5))*pow(mag(p1-pow(p2, 0.5)), 1/3);
          }
      
          volScalarField fMu2_ = 5*(1+g)/(g*g+Cmu_*g*g*g+As);
      
          return fMu2_;
      }
      

      请问李老师和各位同学,这个地方应该怎么处理呢?找了很多源码,没有发现类似的问题,求解答!谢谢各位啦:xiexie:

      1 条回复 最后回复 回复 引用
      • strive_DUT
        strive_DUT 最后由 编辑

        @东岳 李老师,求指点:xinxin3:

        1 条回复 最后回复 回复 引用
        • 李东岳
          李东岳 管理员 最后由 编辑

          p2是一个volScalarField,不能写if (p2 < 0)

          线上CFD课程开始报名:http://www.dyfluid.com/class.html

          CFD高性能服务器 http://dyfluid.com/servers.html

          strive_DUT 1 条回复 最后回复 回复 引用
          • strive_DUT
            strive_DUT @李东岳 最后由 编辑

            @东岳 是的李老师,p2是一个体标量场,0是整型,那这个地方应该怎么处理呢,求指点

            C 1 条回复 最后回复 回复 引用
            • C
              chien @strive_DUT 最后由 编辑

              @strive_dut 解决了吗?老哥

              strive_DUT 2 条回复 最后回复 回复 引用
              • strive_DUT
                strive_DUT @chien 最后由 编辑

                @chien 你好!抱歉回复晚了。可以用最值替换来解决,例如p2 < 0,即体标量场p2的最大值小于0,这样可以编译通过,但是是否具体可行我没有做测试呢。

                1 条回复 最后回复 回复 引用
                • strive_DUT
                  strive_DUT @chien 最后由 编辑

                  @chien 还可将 volScalarField无量纲化

                  p2.dimensions().reset(dimless)
                  
                  C 流 2 条回复 最后回复 回复 引用
                  • C
                    chien @strive_DUT 最后由 编辑

                    @strive_dut 好的,谢谢老哥,我用了forAll,对每一个值比较。

                    strive_DUT 流 2 条回复 最后回复 回复 引用
                    • strive_DUT
                      strive_DUT @chien 最后由 编辑

                      @chien 解决了就好:ok:

                      1 条回复 最后回复 回复 引用
                      • 流
                        流体中二少年 @chien 最后由 编辑

                        @chien 请问用forall如何比较,能否提供下code,万分感谢:140:

                        C 1 条回复 最后回复 回复 引用
                        • 流
                          流体中二少年 @strive_DUT 最后由 编辑

                          @strive_dut 大哥,你最后是怎么解决的,我也遇到和你相同的问题

                          if (p<5 )               
                          			{
                                              	field[faceI] = vector(0,0,0);
                                          	}
                          		else
                                          	{
                                              	field[faceI] = vector(U_0*t,0,0);
                                          	}
                          		}
                          
                          strive_DUT 1 条回复 最后回复 回复 引用
                          • strive_DUT
                            strive_DUT @流体中二少年 最后由 编辑

                            @流体中二少年 上面回复中提到了,你可以取变量p的最大值,然后进行比较,即

                            scalar pmax = max(p2).value();
                            if ( pmax < scalar(5.0) )
                            

                            或者你将volScalarField无量纲化,应该也可以比较。

                            流 1 条回复 最后回复 回复 引用
                            • 流
                              流体中二少年 @strive_DUT 最后由 编辑

                              @strive_dut 非常感谢,我试试

                              1 条回复 最后回复 回复 引用
                              • C
                                chien @流体中二少年 最后由 编辑

                                @流体中二少年

                                forAll(crossDiff,i)
                                {
                                	if (crossDiff[i] > 0.0)
                                	{
                                		arg1[i] = 0.125;
                                	}
                                	else
                                	{
                                		arg1[i] = 0.0;
                                	}
                                }
                                
                                
                                1 条回复 最后回复 回复 引用
                                • First post
                                  Last post