我想创建一个这个问题的MVCE ......我真的不能。我正在使用一个名为Palabos的开源流体流动求解器,它的开发指南也可用。它基于通用结构和mpi。可能是同类中最好的开源解算器
那里的开发人员使用Box处理器循环遍历数组(一般来说......可以是张量,格子是其他对象)。这是他们将处理器用于单个网格情况的方法
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;
全局
答案 0 :(得分:0)
process()
的签名是
virtual void process (Box2D domain, ScalarField2D< T1 > &field1, ScalarField2D< T2 > &field2)=0
但是您传递的是MultiScalarField2D<T>&
,似乎没有可用的转化为ScalareField2d<T>&
。所以你已经定义了一个新的虚函数,并没有覆盖基类中的函数。在这些情况下,使用override
关键字会有所帮助。