施加外力

在main函数中定义SimpleDynamics<GravityForce<Gravity>>对象,传入SPHBody对象和重力加速度矢量作为构造函数的参数。

调用时,只需在初始化之后执行一次constant_gravity.exec()即可。

    Gravity gravity(Vecd(0.0, -1.0));
    SimpleDynamics<GravityForce<Gravity>> constant_gravity(water_block, gravity);
	...
    /** initialize cell linked lists for all bodies. */
    sph_system.initializeSystemCellLinkedLists();
    /** initialize configurations for all bodies. */
    sph_system.initializeSystemConfigurations();
    constant_gravity.exec();

为什么只需要在初始化后执行一次就行了呢?这是因为在模拟过程中,不会在每一步开始时把force_prior_的值清零。GravityForceupdate的时候会调用:

template <class DynamicsIdentifier>
void BaseForcePrior<DynamicsIdentifier>::update(size_t index_i, Real dt)
{
    // current_force_是用m*g算出来的
    force_prior_[index_i] += current_force_[index_i] - previous_force_[index_i];
    previous_force_[index_i] = current_force_[index_i];
}

如果用户只在初始化时执行一次,后期不再调用,那么将永远执行force_prior_ += 0,也即force_prior_值不变。

只有当重力加速度是变的,才需要在模拟时反复调用constant_gravity.exec()

Last updated

Was this helpful?