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

[命令/FISH] 利用shell单元的cid生成任意形状的水面waterface

[复制链接]
发表于 2010-11-26 22:58:16 | 显示全部楼层 |阅读模式 来自 四川成都
以前看前辈们写的利用interface生成任意形状的水面的方法,然后自己就想是否能利用shell单元这么做呢? 后来终于实现了,特来跟大家分享一下,以前老是潜水,也算是学习,韬光养晦吧,感谢仿真论坛

本帖子中包含更多资源

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

×

评分

1

查看全部评分

 楼主| 发表于 2010-11-26 23:42:22 | 显示全部楼层 来自 四川成都
Simdroid开发平台
本方法与interface法的思想是相同的,我下面来述说一下我对此法的一些理解的历程,请各位大侠指教。
      原来我想着shell单元不像interface那样有 如同 “p_ie=i_elem_head(p_i) 
  loop while p_ie # null
;返回三个相邻界面单元的三个顶点的地址
    p_gp1=ie_vert(p_ie,1) 
    p_gp2=ie_vert(p_ie,2)
    p_gp3=ie_vert(p_ie,3)
;将顶点坐标赋予给网格节点
x1=in_pos(p_gp1,1) ” 的用法,引用前辈的。
      所以我就想着利用flac命令中的
set log on
pr sel shell con ;这条是关键,它可以输出每个shell的cid的节点,每个cid有3个node
set log off
于是我就想着自己编写一个自动化的程序读入这个log文件中的信息,然后利用程序写出
一个fish函数格式如下:
def water_node_info
   array cid_node_num(3,        3128 )
  cid_node_num(1,    1 )=    1
  cid_node_num(2,    1 )=    3
  cid_node_num(3,    1 )=    2
。。。。。。
end
利用此函数来存储每一个cid即三角形的node num,即每一列表示一个cid,这样我就花了一段时间编写了附件中的那个小程序,是用fortran写的,这个想法就实现了。然后在flac3d中调用此函数即可。既然知道了每个小三角形的node num,那么就很容易获得他们的坐标了,然后再利用
xx1 = nd_pos(_nd, 2, 1)
yy1 = nd_pos(_nd, 2, 2)
zz1 = nd_pos(_nd, 2, 3)
。。。
依次获得三点的坐标xxi,yyi,zzi(i=1,2,3),那么就可以利用
command
    water table face xx1,yy1,zz1  xx2,yy2,zz2  xx3,yy3,zz3
endcommand
然后经过循环便可以得到水面了。

具体的操作我就不多说了,大家有兴趣可以试试。


后来,我想这样可能真的事有点走弯路了,于是我就又反复的看了一下参考书和帮助文件,终于找到了类似于interface的方法,如下:
def shellcid                    
  sp=s_find(1)!找cid号为1的ptr  
  ;nn=s_numnd(sp)              
  nd1=s_node(sp,1)   !这里的1           
  xx1 = nd_pos(nd1, 2, 1)      
  yy1 = nd_pos(nd1, 2, 2)      
  zz1 = nd_pos(nd1, 2, 3)      
  num1=nd_id(nd1)               
                                
  nd2=s_node(sp,2)              
  num2=nd_id(nd2)               
  xx2 = nd_pos(nd2, 2, 1)      
  yy2 = nd_pos(nd2, 2, 2)      
  zz2 = nd_pos(nd2, 2, 3)      
                                
  nd3=s_node(sp,3)              
  num3=nd_id(nd3)               
  xx3 = nd_pos(nd3, 2, 1)      
  yy3 = nd_pos(nd3, 2, 2)      
  zz3 = nd_pos(nd3, 2, 3)      
                                
end                             

上面这个函数只是我介绍给大家的一个获取cid号为1的cid的三个node信息的一个函数,只要稍加修改,加上遍历循环即可实现对每个cid的信息的提取,如此,再利用
command
    water table face xx1,yy1,zz1  xx2,yy2,zz2  xx3,yy3,zz3
endcommand
然后经过循环便可以得到水面了。

我上传的附件中的例子没做完全,只是以精华帖interface或者说是陈育民老师编写的教程第15章的那个边坡的例子来作为练习背景的。
       操作方法跟interface基本相同,记得要在最后删除shell,另外,对于水面不够大,导致生成的孔隙水压有斑点的情况,我个人认为 或者加大辅助模型的边界范围,或者在利用interface或shell提取坐标的过程中,判断出属于边界的节点,然后将其坐标适当增大一个值即可解决问题。
      当然这个水面的建立方法前辈们已经做过了,晚辈只是借用你们的思想进一步发挥一下而已。
      这个方法的完整实例,我并未做完,给有兴趣的朋友们自己发挥一下吧。
      另外,我还有个问题想问一下前辈大侠,就是在flac3d中如果定义的数组过于庞大,会占用计算内存影响计算速度么? 如果影响不是很大的话,我觉得,就直接利用数组法,建立存储水面坐标的矩阵,这一步我想直接在第三方软件如ansys或其他通用有限元中实现,然后对面划分三节点三角形单元,然后编写小程序存储这些信息,然后读入flac3d中,就没必要建立什么接触面或shell单元了,我这么说是在不影响速度的情况下的一种提法。希望前辈们指正。

      另外要说明的一点是,建立shell时直接用sel shell id 1 range 。。。即可,不要加crossdiag关键词,省得麻烦。谢谢大家!
回复 不支持

使用道具 举报

发表于 2011-3-6 16:53:57 | 显示全部楼层 来自 湖北武汉
想法很不错,值得推荐!!!
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-9-29 03:11 , Processed in 0.038736 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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