- 积分
- 1
- 注册时间
- 2008-11-7
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2010-11-26 23:42:22
|
显示全部楼层
来自 四川成都
本方法与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关键词,省得麻烦。谢谢大家! |
|