Homework1 弹簧质点系统(交作业)

显式积分

隐式积分

展示图片中红色弹簧为拉伸,绿色为压缩。Origin能量为添加质点时的重力势能之和,为原始的能量。Current能量为现存的能量,包括重力势能,弹性势能和动能。Lost能量为撞击地面损失的能量。Damp
能量为阻尼损失的能量。Total能量为现在系统中的能量,即现存的加上损失的。Error能量为计算过程中不守恒的能量,即Origin能量减去Total能量。

代码链接

文章链接

初学者,实现了最简单的弹簧质点系统的显式积分,隐式积分。

使用了作业框架

对隐式积分公式进行详细的推导,详见文章链接,头都要秃了。最终的实现弹簧硬度100万都不会炸,成了!

在原始的代码框架中,对隐式积分做了很多的近似,这里我实现的隐式积分相对而言近似少了很多,也比较精确。

作者使用的电脑是MacBookPro,因此CPU要快一点,显式方法大概在60fps,隐式方法大概在40fps左右,显然隐式方法由于计算繁琐要慢一点,这里隐式方法我使用了10次雅克比迭代。

并且对能量守恒进行了实时的分析。

初始的能量为质点的重力势能,每次添加质点时会计算。

在渲染过程中的能量由两部分组成,一部分是现存的重力势能,弹性势能和动能,还有一部分是撞击地面损失的能量和阻尼损失的能量。(感谢评论,之前没有考虑阻尼损失的能量,现在能量已经比较守恒了)

注意的是,这里撞击地面并不会重置质点的位置,因为这样的话,如果弹簧被压缩会导致质点再次重复撞向地面,从而导致能量计算很不准确。(但是由于撞击地面的粗糙处理,能量的计算还是很不准确的)

在显式方法和隐式方法的比较中,可以看出都存在能量不守恒的现象。

但是在我的实验中,针对100个质点的情况,可以看出显式积分的能量不守恒现象比隐式积分更加严重,在上面展示图片的Error Energy可以看到。

后续太极更新了GUI直接导出gif的功能后,我会补上动图展示。

2 Likes

能量不守恒是不是因为damping导致的?

你这么一说,我有一种恍然大悟的感觉,damping掉的能量没加上去

代码中有一个未解之谜,还请大神解答。在framework.py的update_position内核函数中,有一个print()的debug代码,只要去掉这个print,隐式方法就会崩,至今未解之谜,我在代码中用注释表明了。

1 Like

在我这就不会崩诶?
删掉print后唯一的区别就是不会被输出刷屏了。。。

[Taichi] mode=release
[Taichi] version 0.6.24, llvm 10.0.0, commit 0dc7ed79, python 3.7.4
[Taichi] loading test module
[Taichi] Starting on arch=x64
[W 08/05/20 18:11:00.967] [type_check.cpp:visit@66] [$603] Atomic add (float32 to int32) may lose precision.
[W 08/05/20 18:11:00.968] [type_check.cpp:visit@66] [$682] Atomic add (float32 to int32) may lose precision.
[W 08/05/20 18:11:01.158] [type_check.cpp:visit@66] [$1564] Atomic add (float32 to int32) may lose precision.
[W 08/05/20 18:11:01.158] [type_check.cpp:visit@66] [$1568] Atomic add (float32 to int32) may lose precision.

python版本:Python 3.7.4 on Mac
taichi版本:

  • taichi 0.6.24
  • taichi-glsl 0.0.8
  • taichi-nightly 0.5.11
  • taichi-three 0.0.2
    pip版本:pip 19.2.3 from /usr/local/anaconda3/lib/python3.7/site-packages/pip (python 3.7)