CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    求助:如何在边界a上索引边界b的值,且可以并行(包含多种边界值获取方式)

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

      为了实现一些特殊需求,所以需要两个边界相互交互。但是修改后的边界条件仅在串行条件下可以运行。

      下述代码为例:

      //~in patch
      label patchi = this->patch().boundaryMesh().findPatchID(patchName_);
      const volScalarField& paraGet = this->db().objectRegistry::lookupObject<volScalarField>("paraA");//这一步可以正常运行
      const scalarField& para = paraGet.boundaryField()[patchi];//这一步OK
      Info << para << endl;//这一步在并行条件下会报错,也就是引用的对象在使用的时候会报错
      

      在此基础上,我修改了代码,发现如果不是引用,直接取值,也会报错,因此可以断定是取边界值的函数在并行条件下有问题。

      报错代码

      //~in patch
      label patchi = this->patch().boundaryMesh().findPatchID(patchName_);
      const volScalarField& paraGet = this->db().objectRegistry::lookupObject<volScalarField>("paraA");//这一步可以正常运行
      const scalarField para = paraGet.boundaryField()[patchi];////这一步在并行条件下会报错
      

      最后,也尝试过从网格转移获取边界值,但是并行时也会在取值时报错。

      //~in patch
      label patchi = this->patch().boundaryMesh().findPatchID(patchName_);
      const volScalarField& paraGet = this->db().objectRegistry::lookupObject<volScalarField>("paraA");//这一步可以正常运行
      const fvMesh& mesh = patch().boundaryMesh().mesh();//正常运行
      const fvPatchField<scalar>& para = mesh.boundary()[patchi].lookupPatchField<volScalarField, scalar>("paraA");//这一步可以正常运行
      Info << para << endl;//这一步在并行条件下会报错,也就是引用的对象在使用的时候会报错
      

      所以想向各位老师和同僚请教下怎么处理这种问题

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

        Info改成Pout试试?

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

        四 1 条回复 最后回复 回复 引用
        • 四
          四季之中的隐星 @李东岳 最后由 编辑

          @李东岳 谢谢李老师的回复,这个问题我最后发现是一个很简单的错误导致的。因为decompsePar没有把边界场进行拆分:136: ,导致各个处理器文件夹下的场定义缺失所以发生了错误

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