软件版本: 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
以下答案由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函数。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!