OpenFOAM v1812 编程细节问题

软件版本: OpenFOAM - v1812
以下存在2个问题,应当如何修改?

   // 出现问题的代码片段1
            forAll(mesh_.nCells(),celli)
            {
                const scalar cellVol = mesh_.cellVolumes()[celli];
                if(T[celli]>Tv.value())                         // 此处已经被改正  2023-4-24 第一次提问后
                {   
                      // 此处对T中的元素逐个操作
                }
            }   
      // 另一个错误信息如下:
      phaseSystem/phaseSystem.C: In member function ‘Foam::tmp<Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> > Foam::phaseSystem::surfaceTensionForce() const’:
/home/alphav2/OpenFOAM/OpenFOAM-v1812/src/OpenFOAM/lnInclude/stdFoam.H:285:36: error: request for member ‘size’ in ‘(&((const Foam::phaseSystem*)this)->Foam::phaseSystem::mesh_)->Foam::fvMesh::<anonymous>.Foam::polyMesh::<anonymous>.Foam::primitiveMesh::nCells()’, which is of non-class type ‘Foam::label {aka int}’
     for (Foam::label i=0; i<(list).size(); ++i)
                                    ^
phaseSystem/phaseSystem.C:1040:13: note: in expansion of macro ‘forAll’
             forAll(mesh_.nCells(),celli  
      //  A的类型为const dimensionedScalar 
      //  这里的T是已经实例化的对象,类型为volScalarField,物理意义为温度场,并非模板T(template)
   // 出现问题的代码片段3  ,尝试./phaseSystem/phaseSystems/ E.H 失败,存在大量对象未定义,原因未知
   // 尝试在主文件的主函数前添加全局变量,主文件位于工程文件夹的根目录  
   // 调用之一位于./phaseSystem/phaseSystems/phaseSystem.C,仍然出现报错
#include "fvCFD.H"
#include "subCycle.H"
#include "multiphaseSystem.H"
#include "turbulentFluidThermoModel.H"
#include "pimpleControl.H"
#include "fvOptions.H"
#include "fixedFluxPressureFvPatchScalarField.H"
#include "radiationModel.H"
#include "HashPtrTable.H"
#include "fvcDDt.H"
#include "zeroField.H"
 extern volScalarField E
    (
        IOobject
        (
            "E",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        mesh
    );
// 报错: phaseSystem/phaseSystem.C:1045:21: error: ‘E’ was not declared in this scope

基于Monster 组和GPT的调写:

  • 对于代码片段1中的问题,从错误信息来看,T[celli]的类型是const double,而const double并没有名为first的成员变量,因此编译器会报错。由于你没有给出T的定义,无法判断其类型。如果T是一个名为pair的结构体,则可以使用T[celli].first来访问其第一个元素,使用T[celli].second来访问其第二个元素。如果你确认T是pair类型,则需要修改代码为if(T[celli]>A)或者if(T[celli].second>A),这取决于你要比较pair的哪个元素。
  • 对于代码片段2中的问题,根据错误信息来看,mesh没有被声明或定义。你需要确认mesh在作用域中是否可见,如果不可见,则需要在代码片段2的前面添加#include语句,将声明或定义mesh的头文件包含进来。如果你已经确认在根目录的createFields.H中定义了mesh,则需要确保该头文件已经正确地被包含进来,且定义mesh的语句不在作用域之外。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
第一个问题中,T[celli]应该是一个double类型的数值,而非一个pair类型的对象。因此,T[celli].first是不合法的操作。如果要将T[celli]视为一个长度为2的元组(tuple),可以使用std::tie的方法进行解决,具体的代码如下:

forAll(mesh_.nCells(),celli)
{
    const scalar cellVol = mesh_.cellVolumes()[celli];
    double Tc = T[celli];
    if(std::tie(Tc,std::ignore) > std::tie(A,std::ignore))
    {   
          // 对T中的元素逐个操作
    }
}

在这里,std::tie(Tc,std::ignore)会返回一个由Tc和一个特殊类型std::ignore构成的元组,第二个元素std::ignore表示我们不关心其值。这样,我们便可以通过std::tie()方法比较Tc和A的大小,而无需将T[celli]视为一个pair类型的对象。

第二个问题中,出现了mesh未定义的错误。可能是因为在代码片段中,mesh变量没有被定义。可以考虑将代码片段中的mesh替换为已定义的mesh变量,或者将mesh定义在代码片段中。具体的代码如下:

#include "fvCFD.H"
#include "subCycle.H"
#include "multiphaseSystem.H"
#include "turbulentFluidThermoModel.H"
#include "pimpleControl.H"
#include "fvOptions.H"
#include "fixedFluxPressureFvPatchScalarField.H"
#include "HashPtrTable.H"
#include "fvcDDt.H"
#include "zeroField.H"

// 定义mesh变量
const auto& mesh = mesh_;
 
volScalarField  E
(
    IOobject
    (
        "E",
        //runTime.timeName(),
        mesh,
        IOobject::NO_READ,
        IOobject::NO_WRITE
    ),
    mesh
);

在这里,我们将mesh定义为程序中已经定义过的mesh_对象,并用auto关键字进行推导。再将这个已定义的mesh作为参数传递给IOobject构造函数,即可构造出E变量。
如果我的回答解决了您的问题,请采纳!

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

针对您提出的两个问题,分别给出修改方案和完整的代码实现。

1、 第一个问题:关于 volScalarField 类型 T 的使用问题

根据您所提供的信息,我们可以看出,这里的 T 是一个 volScalarField 类型的对象,表示的是温度场。在代码片段中,您尝试使用 T[celli].first 访问 T 中的一个元素的 first 成员,但是编译器提示该成员不存在,因为 T 的元素类型是 double,不是 pair 类型。

解决方案是,需要修改代码中的 if 语句,将 T[celli].first 改成 T[celli],表示直接访问 T 中的一个元素。修改后的代码如下:

forAll(mesh_.nCells(), celli)
{
    const scalar cellVol = mesh_.cellVolumes()[celli];
    if (T[celli] > A)
    {
        // 对 T 中的元素逐个操作
    }
}

2、 第二个问题:关于 mesh 变量未定义的问题

在第二个代码片段中,您创建了一个名为 E 的 volScalarField 类型的对象,但是在 IOobject 的构造函数中,使用了一个未定义的变量 mesh。

解决方案是,在 IOobject 的构造函数中,使用正确的 mesh 变量,即代码片段中定义的 mesh_ 变量。修改后的代码如下:

volScalarField E(
    IOobject(
        "E",
        mesh_.time().timeName(),
        mesh_,
        IOobject::NO_READ,
        IOobject::NO_WRITE
    ),
    mesh_
);

完整代码如下:

#include "fvCFD.H"
#include "subCycle.H"
#include "multiphaseSystem.H"
#include "turbulentFluidThermoModel.H"
#include "pimpleControl.H"
#include "fvOptions.H"
#include "fixedFluxPressureFvPatchScalarField.H"
#include "HashPtrTable.H"
#include "fvcDDt.H"
#include "zeroField.H"

void phaseSystem::solveEnergyEquation()
{
    const dimensionedScalar A("A", dimless, 0.5);
    forAll(mesh_.nCells(), celli)
    {
        const scalar cellVol = mesh_.cellVolumes()[celli];
        if (T[celli] > A)
        {
            // 对 T 中的元素逐个操作
        }
    }

    volScalarField E(
        IOobject(
            "E",
            mesh_.time().timeName(),
            mesh_,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        mesh_
    );
    // 对 E 进行操作
}

int main(int argc, char* argv[])
{
    #include "setRootCase.H"
    #include "createTime.H"
    #include "createMesh.H"
    #include "createFields.H"

    phaseSystem myPhaseSystem(mesh, runTime);

    myPhaseSystem.solveEnergyEquation();

    return 0;
}

希望这些信息对您有所帮助,如有任何疑问,请随时提出。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

引用chatGPT作答,对于代码片段1中的问题,报错信息表明您尝试访问类型为double的元素的成员变量first,但是double类型没有成员变量first。根据您提供的信息,可以确定T是一个volScalarField类型的对象,而不是一个pair类型的对象。因此,您需要修改代码,以便正确访问T中的元素。可以尝试使用T[celli]来访问T中的double类型元素,并将其与A进行比较。

修改后的代码如下:

forAll(mesh_.nCells(),celli)
{
    const scalar cellVol = mesh_.cellVolumes()[celli];
    if(T[celli] > A.value())
    {
          // 对T中的元素逐个操作
    }
}  

对于代码片段2中的问题,错误信息表明在此处mesh未被声明。您需要在使用mesh之前将其声明和初始化。可以在代码片段顶部声明和初始化mesh,如下所示:

const auto& mesh = fvMesh::NewIOobject
(
    "mesh",
    runTime.constant(),
    runTime,
    fvMesh::noOldCheck
);

然后将此处的mesh替换为上述代码片段中声明的mesh即可。修改后的代码片段2如下所示:

#include "fvCFD.H"
#include "subCycle.H"
#include "multiphaseSystem.H"
#include "turbulentFluidThermoModel.H"
#include "pimpleControl.H"
#include "fvOptions.H"
#include "fixedFluxPressureFvPatchScalarField.H"
#include "HashPtrTable.H"
#include "fvcDDt.H"
#include "zeroField.H"

const auto& mesh = fvMesh::NewIOobject
(
    "mesh",
    runTime.constant(),
    runTime,
    fvMesh::noOldCheck
);

volScalarField  E
(
    IOobject
    (
        "E",
        //runTime.timeName(),
        mesh,
        IOobject::NO_READ,
        IOobject::NO_WRITE
    ),
    mesh
);

请注意,此处的runTime是您应该定义的时间管理器对象。如果您还没有定义它,您需要在代码中定义它并传递给fvMesh::NewIOobject函数。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632