CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    模型报错: `request for surfaceScalarField phi...failed`

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

      各位老师好,我最近在尝试定义一个新的边界条件,结合timeVaryingMappedFixedValue和inletOutelt边界。在每个时间步对边界插值赋值之后,再根据边界上的通量判断入流/出流,将出流的区域设置zeroGradient,而入流区域仍采用插值结果。

      下面是我参考inletOutlet边界文件修改的updateCoeffs()函数:

      template<class Type>
      void Foam::timeVaryingInletOutletFvPatchField<Type>::updateCoeffs()
      {
          if (this->updated())
          {
              return;
          }
         
          this->operator==(fieldMapper_.map());
      // 拷贝于‘inletOutlet’边界源文件,用于判断方向并对系数赋值
          const Field<scalar>& phip =
              this->patch().template lookupPatchField<surfaceScalarField, scalar>
              (
                  phiName_
              );
          this->valueFraction() = 1.0 - pos0(phip);
      //
          fixedValueFvPatchField<Type>::updateCoeffs();
      }
      

      新的边界条件能够成功编译。但在进行测试case(pimpleFoam)时,会在decomposePar分解并行区域步骤报错(直接进行单核计算也会出现相同错误):

      --> FOAM FATAL ERROR:
          request for surfaceScalarField phi from objectRegistry region0 failed
          available objects of type surfaceScalarField are 0()
          
          From function const Type& Foam::objectRegistry::lookupObject(const Foam::word&) const [with Type = Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh>] in file /home/gareth/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/objectRegistryTemplates.C at line 211.
      

      以下是objectRegistryTemplates.C文件的对应内容:

              FatalErrorInFunction
                  << nl
                  << "    request for " << Type::typeName
                  << " " << name << " from objectRegistry " << this->name()
                  << " failed\n    available objects of type " << Type::typeName
                  << " are" << nl
                  << names<Type>();
      
              if (cacheTemporaryObject(name))
              {
                  FatalErrorInFunction
                      << nl
                      << "    request for " << name << " from objectRegistry "
                      << this->name() << " to be cached failed" << nl
                      << "    available temporary objects are" << nl
                      << temporaryObjects_;
              }
              FatalErrorInFunction                 // line 211
                  << abort(FatalError);            // line 212
          }
          return NullObjectRef<Type>();
      

      根据错误信息,似乎是没有找到surfaceScalarField类型的对象phi,但我只是结合inletOutlet边界,对原始的timeVaryingMappedFixedValue边界代码进行修改,并未改变其他源代码部分。并且我检查了求解器createFields.H,包含对通量phi的创建。所以我很困惑这个问题是如何产生的?

      我是刚开始接触OpenFOAM的源代码,可能犯了一些愚蠢的错误。希望各位大佬能对该问题给出一些建议。 谢谢!

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