OpenFOAM插入输出程序出错

问题:
插入过程对象输出代码,编译时出现错误,未插入下列代码时程序可以正常运行,请问应当如何正确插入下列代码片段?
系统版本: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)};


如果问题仍然存在,请提供更多错误信息以便进一步排查。