问题:
插入过程对象输出代码,编译时出现错误,未插入下列代码时程序可以正常运行,请问应当如何正确插入下列代码片段?
系统版本:Ubuntu 18.04 软件版本:OpenFOAM - v1812
错误显示如下:
/home/alphav2/OpenFOAM/OpenFOAM-v1812/src/OpenFOAM/lnInclude/DimensionedFieldFunctions.C:642:1: note: in expansion of macro ‘PRODUCT_OPERATOR’
PRODUCT_OPERATOR(typeOfSum, +, add)
^~~~~~~~~~~~~~~~
phaseSystem/phaseSystem.C:1157:165: note: ‘const volVectorField {aka const Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh>}’ is not derived from ‘const Foam::tmp<Foam::DimensionedField<TypeR, GeoMesh> >’
/home/alphav2/OpenFOAM/OpenFOAM-v1812/src/OpenFOAM/lnInclude/DimensionedFieldFunctions.C:485:1: note: candidate: template<class Form, class Type, class GeoMesh> Foam::tmp<Foam::DimensionedField<typename Foam::typeOfSum<Type, Form>::type, GeoMesh> > Foam::operator+(const Foam::DimensionedField<Type1, GeoMesh>&, const Foam::dimensioned<Type>&)
operator op \
^
/home/alphav2/OpenFOAM/OpenFOAM-v1812/src/OpenFOAM/lnInclude/DimensionedFieldFunctions.C:642:1: note: in expansion of macro ‘PRODUCT_OPERATOR’
PRODUCT_OPERATOR(typeOfSum, +, add)
^~~~~~~~~~~~~~~~
/home/alphav2/OpenFOAM/OpenFOAM-v1812/src/OpenFOAM/lnInclude/DimensionedFieldFunctions.C:485:1: note: template argument deduction/substitution failed:
operator op \
^
/home/alphav2/OpenFOAM/OpenFOAM-v1812/src/OpenFOAM/lnInclude/DimensionedFieldFunctions.C:642:1: note: in expansion of macro ‘PRODUCT_OPERATOR’
PRODUCT_OPERATOR(typeOfSum, +, add)
^~~~~~~~~~~~~~~~
phaseSystem/phaseSystem.C:1157:165: note: ‘Foam::tmp<Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> >’ is not derived from ‘const Foam::dimensioned<Type>’
nHatfM(alpha1, alpha2) & fvc::grad(T))) & SfHat)*magGradAlphaf(alpha1, alpha2);
插入代码如下:
变量声明,属于类对象PhaseSystem的Protected成员
// Debug Params - surface tension force
volVectorField ContinueInterfaceForce;
volVectorField BackFlushPressure;
volVectorField Marangonini;
变量实例化,位于对象Foam::phaseSystem::surfaceTensionForce实例化
// Debug Params
ContinueInterfaceForce
{
IOobject
(
"ContinueInterfaceForce",
mesh_.time().timeName(),
mesh_,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
mesh_,
dimensionedScalar(dimensionSet(1, -2, -2, 0, 0), Zero)
};
BackFlushPressure
{
IOobject
(
"BackFlushPressure",
mesh_.time().timeName(),
mesh_,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
mesh_,
dimensionedScalar(dimensionSet(1, -2, -2, 0, 0), Zero)
};
Marangonini
{
IOobject
(
"Marangonini",
mesh_.time().timeName(),
mesh_,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
mesh_,
dimensionedScalar(dimensionSet(1, -2, -2, 0, 0), Zero)
};
位于对象Foam::phaseSystem::surfaceTensionForce实例化:
BackFlushPressure = BackFlushPressure + fvc::interpolate
(
surfaceTensionCoeff
(
phasePairKey(iter1()->name(), iter2()->name())
)/
(surfaceTensionCoeff(phasePairKey(iter1()->name(), iter2()->name())) + deltaM)
)*
0.54*P0*fvc::interpolate
(
Foam::exp(Lv*M*(T-Tv)/R/(T+deltaN)/Tv)
)*
(
fvc::interpolate(alpha2)*fvc::snGrad(alpha1)
- fvc::interpolate(alpha1)*fvc::snGrad(alpha2)
);
Marangonini = Marangonini + fvc::interpolate
(
surfaceTensionCoeff
(
phasePairKey(iter1()->name(), iter2()->name())
)/
(surfaceTensionCoeff(phasePairKey(iter1()->name(), iter2()->name())) + deltaM)
)*
dsigma*(fvc::interpolate(fvc::grad(T)- nHatfM(alpha1, alpha2) * (nHatfM(alpha1, alpha2) & fvc::grad(T))) & SfHat)*magGradAlphaf(alpha1, alpha2);
ContinueInterfaceForce = ContinueInterfaceForce +
fvc::interpolate
(
surfaceTensionCoeff
(
phasePairKey(iter1()->name(), iter2()->name())
)
)
* fvc::interpolate(K(alpha1, alpha2))*
(
fvc::interpolate(alpha2)*fvc::snGrad(alpha1)
- fvc::interpolate(alpha1)*fvc::snGrad(alpha2)
);
phaseSystem/phaseSystem.C:1157:165: note: ‘const volVectorField {aka const Foam::GeometricField<Foam::Vector, Foam::fvPatchField, Foam::volMesh>}’ is not derived from ‘const Foam::tmp<Foam::DimensionedField<TypeR, GeoMesh> >’
这里代码错误,可能是参数类型问题。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据错误提示信息,可以看出问题是发生在PRODUCT_OPERATOR宏展开后的代码中,该宏定义在lnInclude/DimensionedFieldFunctions.C中,因此需要检查该宏定义的参数类型是否正确。从错误信息中可以看出,编译器在执行模板参数推导时出现了问题,因此需要仔细检查代码中的类型匹配问题。
另外,在给成员变量初始化时,可以使用成员初始化列表的方式,这样会更加清晰。
下面是修改后的代码:
// Debug Params - surface tension force
volVectorField ContinueInterfaceForce{IOobject("ContinueInterfaceForce", mesh_.time().timeName(), mesh_, IOobject::NO_READ, IOobject::AUTO_WRITE), mesh_, dimensionedVector("continueInterfaceForce", dimensionSet(1, -2, -2, 0, 0), Zero)};
volVectorField BackFlushPressure{IOobject("BackFlushPressure", mesh_.time().timeName(), mesh_, IOobject::NO_READ, IOobject::AUTO_WRITE), mesh_, dimensionedVector("backFlushPressure", dimensionSet(1, -2, -2, 0, 0), Zero)};
volVectorField Marangonini{IOobject("Marangonini", mesh_.time().timeName(), mesh_, IOobject::NO_READ, IOobject::AUTO_WRITE), mesh_, dimensionedVector("marangonini", dimensionSet(1, -2, -2, 0, 0), Zero)};
如果问题仍然存在,请提供更多错误信息以便进一步排查。