指定物体运动或变形
SPHinXsys通过MotionConstraint类模板来实现对物体的(刚体)运动或(弹性体)变形控制。写法很简单,提供每个粒子的坐标、速度、加速度即可。坐标和速度是必需的,加速度非必需,但是有的动力学会用到加速度,最好一并提供。
MotionConstraint
/**
* @class MotionConstraint
* @brief Base class for constraining with prescribed motion.
* Exact motion function will be defined in derive class.
* Note that, we do not impose acceleration, so that this constraint
* must be imposed after updating particle velocity by forces
* and before updating particle position.
*/
template <class DynamicsIdentifier>
class MotionConstraint : public BaseLocalDynamics<DynamicsIdentifier>
{
public:
explicit MotionConstraint(DynamicsIdentifier &identifier)
: BaseLocalDynamics<DynamicsIdentifier>(identifier),
pos_(this->particles_->template getVariableDataByName<Vecd>("Position")),
pos0_(this->particles_->template registerStateVariableDataFrom<Vecd>("InitialPosition", "Position")),
vel_(this->particles_->template registerStateVariableData<Vecd>("Velocity")) {};
virtual ~MotionConstraint() {};
protected:
Vecd *pos_, *pos0_, *vel_;
};这是个比较简单的类模板。DynamicsIdentifier一般会设定为SPHBody或者BodyPartByParticle这些有LoopRange成员函数的类。BaseLocalDynamics<DynamicsIdentifier>是基类,提供粒子属性的访问接口。在构造时,会从body拿到所属粒子的当前位置pos_、初始位置pos0_和速度vel_。
如果DynamicsIdentifier是BodyPartByParticle,可以使用别名MotionConstraint<BodyPartByParticle>。
FixConstraint和FixedInAxisDirection是两个派生类。前者在所有方向上固定住指定的body或body part;后者在给定方向(x/y/z)上固定住指定的body或body part。
案例
这里提供两个案例,一个是2d_examples/test_2d_owsc案例对造波器的平动控制,另一个是我自己写的蠕动泵壁面变形控制。
造波器的平动
这里最重要的就是构造函数和update函数,其余都是辅助函数。因为造波器是wall_boundary的一部分,所以让WaveMaking继承于BodyPartMotionConstraint。额外指定了acc_和physical_time_两个属性,用于获取当前时间和指定加速度。update中,首先获取了当前的物理时间,然后为当前粒子赋予计算得到的坐标、速度和加速度。从辅助函数中,不难看出位移就是一个简单的正弦函数,速度和加速度分别是一阶和二阶导数。
按照以下方式使用。因为WaveMaking只需要update,所以使用SimpleDynamics即可。
蠕动泵的变形
主要参考了COMSOL的蠕动泵案例(只有单层壁面,没有流体):

公式差不多是照搬过来的,只不过我改了改参数:

参数:
壁面几何采用的是2d_examples/test_2d_channel_fluid_shell的壁面几何(参数改了):
变形控制类。因为蠕动泵这个变形函数太复杂了,难求导,所以我没有求解析的导数,而是用中心差分计算了近似导数。另外,我想控制整个壁面的变形,因此无需用body part,而是直接用SPHBody。所以这个类继承于MotionConstraint<SPHBody>。
当前案例只有固体变形,没有流体。如果有流体,并且没有实现薄壳动力学的话,还要在这里考虑加入对法线方向的指定;如果实现了薄壳动力学,可以用UpdateShellNormalDirection更新法线方向。
变形类的使用:
下图展示了两个时刻的壁面Y方向速度:

Last updated