找回密码
 注册
Simdroid-非首页
查看: 81|回复: 4

[命令/FISH] 求各位大虾解释一下如下两个程序的区别,谢谢

[复制链接]
发表于 2015-8-23 15:22:35 | 显示全部楼层 |阅读模式 来自 北京
以下两个程序仅在字体颜色为红色的两个地方有区别,
问题一:自己理解中觉得程序2应该可以,但事实上运行了发现有错误,不知错在哪里。
问题二:程序一中的while_stepping具体是什么意思?书上说是每个时步执行一次apply_vel函数,但是依然不理解这句话的意思。
求各位大虾能在百忙之中指点,谢谢。


程序1:
new
gen zone brick size 10 5 5
mod el
prop shear 1e8 bulk 2e8
fix x y z range x -.1 .1 y 0 5 z 0 5
fix x y z range x 0 10 y 0 5 z -.1 .1
fix x y z range x 9.9 10.1 y 0 5 z 0 5
table 1
def find_add
    head=null
    p_gp =gp_head
loop while p_gp #null
   x_pos = gp_xpos (p_gp)
   if x_pos =width then
    new = get_mem(2)
    mem(new) =head
    mem(new+1) =p_gp
    head =new
  endif
  p_gp=gp_next (p_gp)
endloop
end
set width =10.0
find_add
def apply_vel
    while_stepping
    ad =head
    loop while ad #null
     p_gp =mem(ad+1)
     gp_xvel (p_gp)= vel_max * gp_zpos (p_gp)/height
     gp_zvel (p_gp)=-vel_max * (gp_xpos (p_gp)-width)/height
     ad =mem (ad)
   endloop
end
set large vel_max=1e-2 height =5.0
step 100
plot grid blue vel red
运行后的结果如下图:




程序2:
new
gen zone brick size 10 5 5
mod el
prop shear 1e8 bulk 2e8
fix x y z range x -.1 .1 y 0 5 z 0 5
fix x y z range x 0 10 y 0 5 z -.1 .1
fix x y z range x 9.9 10.1 y 0 5 z 0 5
table 1
def find_add
    head=null
    p_gp =gp_head
loop while p_gp #null
   x_pos = gp_xpos (p_gp)
   if x_pos =width then
    new = get_mem(2)
    mem(new) =head
    mem(new+1) =p_gp
    head =new
  endif
  p_gp=gp_next (p_gp)
endloop
end
set width =10.0
find_add
def apply_vel
    ;while_stepping
    ad =head
    loop while ad #null
     p_gp =mem(ad+1)
     gp_xvel (p_gp)= vel_max * gp_zpos (p_gp)/height
     gp_zvel (p_gp)=-vel_max * (gp_xpos (p_gp)-width)/height
     ad =mem (ad)
   endloop
end
apply_vel
set large vel_max=1e-2 height =5.0
step 100
plot grid blue vel red
运行后出现错误:



非常感谢!!!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2015-8-23 20:29:48 | 显示全部楼层 来自 浙江温州
Simdroid开发平台
这其实是程序语言上的一点点问题,学过c语言的话应该很好理解。
程序1:while_stepping关键词指定了每个循环都要执行一次这个fish函数,而且是在step的时候才执行,step 100就会执行100次。在step之前已经set large vel_max=1e-2 height =5.0,给了height 初始值了,所以程序没问题。
程序2:没有while_stepping,然后你手动执行了一次,程序运行过程中只执行这一次,但是你是在set large vel_max=1e-2 height =5.0之前执行的,这时候height还没有初始值,默认为0或者null,所以会报除数为0。把set large vel_max=1e-2 height =5.0放在apply_vel之前就没问题了。
回复 不支持

使用道具 举报

 楼主| 发表于 2015-8-23 20:47:08 | 显示全部楼层 来自 北京
wqq8889 发表于 2015-8-23 20:29
这其实是程序语言上的一点点问题,学过c语言的话应该很好理解。
程序1:while_stepping关键词指定了每个循 ...

非常感谢你如此详细,受益匪浅,谢谢~~我太大意了,set large vel_max=1e-2 height =5.0放在了apply_vel后面,竟然检查了好几遍都没发现~~另外我还想请教的是执行100步与手动执行一次有什么差别呢?刚运行了一下执行一次后的图如下,发现两种情况下速度的最大值都是1e-2,只是的矢量方向与执行100次略有不同,不知为什么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2015-8-24 13:54:32 | 显示全部楼层 来自 上海长宁区
不是很明白你这段程序是要干嘛,给右上角一排点一个固定的速度,要获取什么结果呢?而且感觉你没有把这段代码的逻辑搞明白。
执行一次:gp_xvel (p_gp)= vel_max * gp_zpos (p_gp)/height=vel_max=1e-2
gp_zvel (p_gp)=-vel_max * (gp_xpos (p_gp)-width)/height=0
所以最大值是1e-2,而且这个值是不会改变的,右上角那一排速度一直是1e-2,不会收敛。你可以继续算下去看看。
while_stepping是在每次运行的时候都会调整右上角节点速度
gp_xvel (p_gp)= vel_max * gp_zpos (p_gp)/height
gp_zvel (p_gp)=-vel_max * (gp_xpos (p_gp)-width)/height
两个方向都会有速度结果,但是合速度仍然是vel_max =1e-2,只不过是把它分解了。

回复 不支持

使用道具 举报

 楼主| 发表于 2015-8-24 16:42:45 | 显示全部楼层 来自 北京
wqq8889 发表于 2015-8-24 13:54
不是很明白你这段程序是要干嘛,给右上角一排点一个固定的速度,要获取什么结果呢?而且感觉你没有把这段代 ...

非常感谢,解释的很详细,,收获很多
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-23 20:24 , Processed in 0.034601 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表