error: cannot allocate an object of abstract type
error: cannot allocate an object of abstract type
虽然我很想为这个问题创建一个 MVCE...但我真的做不到。我正在使用一个名为 Palabos 的开源流体流动求解器,它的开发指南也可用。它基于通用结构和 mpi。可能是同类中最好的开源求解器
那里的开发人员使用 Box Processors 循环遍历数组(一般来说..它可以是张量,格子是其他对象)。这是他们将处理器用于单个格子案例的一种方式
struct IniTemperatureRayleighBenardProcessor2D :
public BoxProcessingFunctional2D_L<T,adDescriptor>
{
IniTemperatureRayleighBenardProcessor2D(RayleighBenardFlowParam<T,nsDescriptor,adDescriptor> parameters_)
: parameters(parameters_)
{ }
virtual void process(Box2D domain, BlockLattice2D<T,adDescriptor>& adLattice)
{
Dot2D absoluteOffset = adLattice.getLocation();
Array<T,adDescriptor<T>::d> jEq(0.0, 0.0);
for (plint iX=domain.x0; iX<=domain.x1; ++iX) {
for (plint iY=domain.y0; iY<=domain.y1; ++iY) {
//some operations...............
}
}
}
virtual IniTemperatureRayleighBenardProcessor2D<T,nsDescriptor,adDescriptor>* clone() const
{
return new IniTemperatureRayleighBenardProcessor2D<T,nsDescriptor,adDescriptor>(*this);
}
virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
modified[0] = modif::staticVariables;
}
virtual BlockDomain::DomainT appliesTo() const {
return BlockDomain::bulkAndEnvelope;
}
private :
RayleighBenardFlowParam<T,nsDescriptor,adDescriptor> parameters;
};
这是他们的称呼
applyProcessingFunctional (
new IniTemperatureRayleighBenardProcessor2D<T,NSDESCRIPTOR,ADESCRIPTOR>(parameters), adLattice.getBoundingBox(),
adLattice );
整个过程的详细信息在 (http://www.palabos.org/documentation/userguide/data-processors.html)
相关源代码位于 (http://www.palabos.org/documentation/develguide/dataProcessingFunctional2D_8h_source.html)
现在,这是我的问题。
我正在使用类似的数据处理器对两个标量数组执行操作。试图尽可能多地了解源代码
template<typename T1, typename T2>
//template<typename T, template<typename NSU> class nsDescriptor,
// template<typename ADU> class adDescriptor, typename T1, typename T2>
struct IniFluxMultiplier2D :
public BoxProcessingFunctional2D_SS<T,T>
{
IniFluxMultiplier2D(RayleighBenardFlowParam<T,NSDESCRIPTOR,ADESCRIPTOR> parameters_)
: parameters(parameters_)
{ }
virtual void process(Box2D domain,
MultiScalarField2D<bool>& boolMask,
MultiScalarField2D<T> &FluxMultiplier)
{
//Dot2D absoluteOffset = adLattice.getLocation();
//Array<T,adDescriptor<T>::d> jEq(0.0, 0.0);
for (plint iX=domain.x0; iX<=domain.x1; ++iX) {
for (plint iY=domain.y0; iY<=domain.y1; ++iY) {
//plint absoluteX = absoluteOffset.x + iX;
//plint absoluteY = absoluteOffset.y + iY;
bool solidblock = boolMask.get(iX,iY);
if(solidblock== true){
FluxMultiplier.get(iX,iY)=(parameters.getTemperatureTau()-(T)0.5)/parameters.getTemperatureTau();}
else{
FluxMultiplier.get(iX,iY)=(parameters.getSolventTau()-(T)0.5)/parameters.getSolventTau();}
}
}
}
virtual IniFluxMultiplier2D<T1,T2>* clone() const
{
return new IniFluxMultiplier2D<T1,T2>(*this);
}
virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
modified[0] = modif::staticVariables;
}
virtual BlockDomain::DomainT appliesTo() const {
return BlockDomain::bulkAndEnvelope;
}
private :
RayleighBenardFlowParam<T,NSDESCRIPTOR,ADESCRIPTOR> parameters;
};
我是这样称呼它的
applyProcessingFunctional (
new IniFluxMultiplier2D<T,T>(parameters), boolMask.getBoundingBox(), boolMask,FluxMultiplier);
我遇到错误
error: cannot allocate an object of abstract type ‘IniFluxMultiplier2D<double, double>’|
尝试调试它,但我卡住了,真的想不出出路。我真的不希望任何人 运行 这个,但我知道我在结构的开头犯了一个概念错误,我无法真正弄清楚。
T 被声明为
typedef double T;
全球
process()
的签名是
virtual void process (Box2D domain, ScalarField2D< T1 > &field1, ScalarField2D< T2 > &field2)=0
但是您传递的是 MultiScalarField2D<T>&
,并且似乎没有可用的转换为 ScalareField2d<T>&
。所以你已经定义了一个新的虚函数并且没有覆盖基础中的函数。在这些情况下使用 override
关键字会有所帮助。
虽然我很想为这个问题创建一个 MVCE...但我真的做不到。我正在使用一个名为 Palabos 的开源流体流动求解器,它的开发指南也可用。它基于通用结构和 mpi。可能是同类中最好的开源求解器
那里的开发人员使用 Box Processors 循环遍历数组(一般来说..它可以是张量,格子是其他对象)。这是他们将处理器用于单个格子案例的一种方式
struct IniTemperatureRayleighBenardProcessor2D :
public BoxProcessingFunctional2D_L<T,adDescriptor>
{
IniTemperatureRayleighBenardProcessor2D(RayleighBenardFlowParam<T,nsDescriptor,adDescriptor> parameters_)
: parameters(parameters_)
{ }
virtual void process(Box2D domain, BlockLattice2D<T,adDescriptor>& adLattice)
{
Dot2D absoluteOffset = adLattice.getLocation();
Array<T,adDescriptor<T>::d> jEq(0.0, 0.0);
for (plint iX=domain.x0; iX<=domain.x1; ++iX) {
for (plint iY=domain.y0; iY<=domain.y1; ++iY) {
//some operations...............
}
}
}
virtual IniTemperatureRayleighBenardProcessor2D<T,nsDescriptor,adDescriptor>* clone() const
{
return new IniTemperatureRayleighBenardProcessor2D<T,nsDescriptor,adDescriptor>(*this);
}
virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
modified[0] = modif::staticVariables;
}
virtual BlockDomain::DomainT appliesTo() const {
return BlockDomain::bulkAndEnvelope;
}
private :
RayleighBenardFlowParam<T,nsDescriptor,adDescriptor> parameters;
};
这是他们的称呼
applyProcessingFunctional (
new IniTemperatureRayleighBenardProcessor2D<T,NSDESCRIPTOR,ADESCRIPTOR>(parameters), adLattice.getBoundingBox(),
adLattice );
整个过程的详细信息在 (http://www.palabos.org/documentation/userguide/data-processors.html)
相关源代码位于 (http://www.palabos.org/documentation/develguide/dataProcessingFunctional2D_8h_source.html)
现在,这是我的问题。 我正在使用类似的数据处理器对两个标量数组执行操作。试图尽可能多地了解源代码
template<typename T1, typename T2>
//template<typename T, template<typename NSU> class nsDescriptor,
// template<typename ADU> class adDescriptor, typename T1, typename T2>
struct IniFluxMultiplier2D :
public BoxProcessingFunctional2D_SS<T,T>
{
IniFluxMultiplier2D(RayleighBenardFlowParam<T,NSDESCRIPTOR,ADESCRIPTOR> parameters_)
: parameters(parameters_)
{ }
virtual void process(Box2D domain,
MultiScalarField2D<bool>& boolMask,
MultiScalarField2D<T> &FluxMultiplier)
{
//Dot2D absoluteOffset = adLattice.getLocation();
//Array<T,adDescriptor<T>::d> jEq(0.0, 0.0);
for (plint iX=domain.x0; iX<=domain.x1; ++iX) {
for (plint iY=domain.y0; iY<=domain.y1; ++iY) {
//plint absoluteX = absoluteOffset.x + iX;
//plint absoluteY = absoluteOffset.y + iY;
bool solidblock = boolMask.get(iX,iY);
if(solidblock== true){
FluxMultiplier.get(iX,iY)=(parameters.getTemperatureTau()-(T)0.5)/parameters.getTemperatureTau();}
else{
FluxMultiplier.get(iX,iY)=(parameters.getSolventTau()-(T)0.5)/parameters.getSolventTau();}
}
}
}
virtual IniFluxMultiplier2D<T1,T2>* clone() const
{
return new IniFluxMultiplier2D<T1,T2>(*this);
}
virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
modified[0] = modif::staticVariables;
}
virtual BlockDomain::DomainT appliesTo() const {
return BlockDomain::bulkAndEnvelope;
}
private :
RayleighBenardFlowParam<T,NSDESCRIPTOR,ADESCRIPTOR> parameters;
};
我是这样称呼它的
applyProcessingFunctional (
new IniFluxMultiplier2D<T,T>(parameters), boolMask.getBoundingBox(), boolMask,FluxMultiplier);
我遇到错误
error: cannot allocate an object of abstract type ‘IniFluxMultiplier2D<double, double>’|
尝试调试它,但我卡住了,真的想不出出路。我真的不希望任何人 运行 这个,但我知道我在结构的开头犯了一个概念错误,我无法真正弄清楚。
T 被声明为
typedef double T;
全球
process()
的签名是
virtual void process (Box2D domain, ScalarField2D< T1 > &field1, ScalarField2D< T2 > &field2)=0
但是您传递的是 MultiScalarField2D<T>&
,并且似乎没有可用的转换为 ScalareField2d<T>&
。所以你已经定义了一个新的虚函数并且没有覆盖基础中的函数。在这些情况下使用 override
关键字会有所帮助。