施加外力
在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_的值清零。GravityForce在update的时候会调用:
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?