DomainFunctionalXD本质是一种数据处理器,是作用域函数类。用来对设计某个特别的域,并可以根据这个作用域函数类来对这个特别的域进行动态赋予。

1 定义

来看看DomainFunctional2D

1
2
3
4
5
structDomainFunctional2D {
virtual ‪~DomainFunctional2D() { }
virtual booloperator() (‪plint iX, ‪plint iY) const =0;
virtual ‪DomainFunctional2D* ‪clone() const =0;
};

里面最关键的就是重载的运算符‪()。operator重载了函数调用运算符()。输入是iXiY。这两个是cell的索引。根据cell的索引来决定返回的是true还是false。重载了()之后,在调用构造函数DomainFunctional2D时就可以实现重载后的功能。

关于重载运算符operator在对函数调用运算符()的重载有一个例子,在[菜鸟教程里][https://www.runoob.com/cplusplus/function-call-operator-overloading.html]。

2 举例

来自文档)中的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename T>
class CylinderShapeDomain2D : public DomainFunctional2D {
public:
CylinderShapeDomain2D(plint cx_, plint cy_, plint radius)
: cx(cx_),
cy(cy_),
radiusSqr(util::sqr(radius))
{ }
// The function-call operator is overridden to specify the location
// of bounce-back nodes.
virtual bool operator() (plint iX, plint iY) const {
return util::sqr(iX-cx) + util::sqr(iY-cy) <= radiussqr;< span>
}
virtual CylinderShapeDomain2D* clone() const {
return new CylinderShapeDomain2D(*this);
}
private:
plint cx, cy;
plint radiusSqr;
};

上述定义了一个CylinderShapeDomain2D的形域类。主要看看他的重载的函数调用运算符()

1
return util::sqr(iX-cx) + util::sqr(iY-cy) <= radiussqr;< span>

根据iXiY来判断,cell其是否在圆内。如果是,则返回真,不然返回假。

根据这个CylinderShapeDomain2D来设定动态对象:

1
2
3
defineDynamics( lattice, lattice.getBoundingBox(),
new CylinderShapeDomain2D(cx, cy, radius),
new BounceBack );

new CylinderShapeDomain2D(cx, cy, radius)直接通过重载的运算符()实现了对cell是否在圆内的判断。可以看到,在对圆内的单元defineDynamics时,使用起来非常简单。

根据DomainFunctionalXD,我们可以很方便的自行设计域处理器。为选定的域来进行设定动态范围。