模块为节点内部独立的算法单元,由输入数据、输出数据和控制变量构成。模块与节点最大的差别在于输入输出类型。模块只接受Field类型的数据。
实现一个模块功能的步骤如下:
定义输入数据(通常至少要求一个):
与节点中定义类似,采用DEF_{*}_IN的宏定义完成。
定义输出数据(可选):
与节点中定义类似,采用DEF_{*}_OUT的宏定义完成。
定义控制变量:
与节点中定义类似,采用DEF_VAR的宏定义完成。
控制变量必须在模块执行之前完成初始化。
重载模块函数:
重载接口有特定模块类型决定,详情参加Module相应模块。
/**
* @brief The standard summation density
*
* @tparam TDataType
*/
template<typename TDataType>
class SummationDensity : public virtual ParticleApproximation<TDataType>
{
DECLARE_TCLASS(SummationDensity, TDataType)
public:
typedef typename TDataType::Real Real;
typedef typename TDataType::Coord Coord;
SummationDensity();
~SummationDensity() override {};
void compute() override;
public:
void compute(
DArray<Real>& rho,
DArray<Coord>& pos,
DArrayList<int>& neighbors,
Real smoothingLength,
Real mass);
void compute(
DArray<Real>& rho,
DArray<Coord>& pos,
DArray<Coord>& posQueried,
DArrayList<int>& neighbors,
Real smoothingLength,
Real mass);
public:
DEF_VAR(Real, RestDensity, 1000, "Rest Density");
///Define inputs
/**
* @brief Particle positions
*/
DEF_ARRAY_IN(Coord, Position, DeviceType::GPU, "Particle position");
/**
* @brief Particle positions
*/
DEF_ARRAY_IN(Coord, Other, DeviceType::GPU, "Particle position");
/**
* @brief Neighboring particles
*
*/
DEF_ARRAYLIST_IN(int, NeighborIds, DeviceType::GPU, "Neighboring particles' ids");
///Define outputs
/**
* @brief Particle densities
*/
DEF_ARRAY_OUT(Real, Density, DeviceType::GPU, "Return the particle density");
private:
void calculateParticleMass();
Real m_particle_mass;
Real m_factor;
};
IMPLEMENT_TCLASS(SummationDensity, TDataType)
鼠标双击Node Editor窗口中的节点,会出现该节点的详细属性信息。例如,双击ParticleFluid节点后,其详细的属性信息如下图所示: