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

[前后处理] 采用CAD、surfer、FLAC3D多软件联合生成高仿真地形

[复制链接]
发表于 2012-6-7 15:53:17 | 显示全部楼层 |阅读模式 来自 安徽马鞍山
本帖最后由 accbd 于 2012-6-7 16:42 编辑

采用CAD、surfer、FLAC3D多软件联合生成高仿真地形
                                                                 ——————我的三维建模初探

————————————————————————————————————————————————————————————————
我之前曾将ANSYS建立三维模型,并成功导入到FLAC3D中,但使用ansys建模有个缺点,就是得一行行输入命令,先生成关键点key point,然后得把关键点连成线spline,再把线生成面,之后再将面生成体,很是麻烦。最近在使用surfer软件生成地形的时候,发现该软件功能非常强大,而且生成的地形面仿真度较高,而且论坛中也有成功的先例,因此考虑能否使用AutoCAD、surfer、FLAC3D等多软件联合,建立起三维模型,这样可以大大降低工作强度,而且难度较低,模型的仿真度更高。下面简要介绍一下我的工作步骤:


首先,第一步,对CAD图进行修整,去除不必要的图元,这里需要说明的是,由于原图中等高线不对,所以我干脆把等高线全部都删除了,只留下台阶边坡。附图如下:

a. 原图


b. 修整后,带高程的台阶边坡图



第二步,将修整后的图另存为dxf格式,读出坐标点,存为数据格式。这里读坐标点,可以仁者见仁智者见智了,我使用的是DXF2XYZ小软件,直接读取,存为*.xyz格式文件。软件工作界面如下图所示:



第三步,将前面生成的*.xyz文件用excel打开,处理一下,删除重复的数据和其他不必要的数据,原因是:考虑到图中有很多单独测量的高程点,以及一些未删除的钻孔数据,防止CAD图未修整干净,导致数据文件中有点坐标重复,生成的图不好看,而且对后续的模型网格剖分造成影响。(这也是为何我不直接将dxf文件导入surfer,而多从这两步“绕一下”的原因。如果你的图很干净整洁,可以考虑直接用surfer读入dxf文件)

这一步中,我用excel删除了1936个重复数据,剩下15460个点,果然证明了前面的猜想,即:图元没有删除干净。
excel处理完数据以后,将其另存为*.xyz或者*.dat格式,后缀名无所谓,因为后面另有他用。


第四步,打开surfer,导入数据文件。具体做法是:Grid--Data,读入第二次生成的*.dat文件,surfer软件将会进行自动插值计算,插值方法有很多中,可以根据自己的需要选择其中一种。数据导入成功后,将会有Griding report,同时生成*.grd文件。



第五步,surfer中菜单栏:Map---New----3D  wireframe...,读入刚刚生成的*.grd文件,生成曲面模型。这一步主要是为了对模型有个直观的感受,看生成的模型与实际情况是否吻合,否则应进行修改。结果如下图:





这样,一个漂亮的曲面模型就生成了。下面最终的步骤终于来临了,这是重点,也是难点,就是导入到FLAC3D中,这样才可以进行有限差分计算。


第六步, 采用已有的surfer 2 FLAC3D程序,导入到FLAC3D里面。具体做法是将第三步生成的*.dat重命名为surfnd.dat,FLAC3D读入main.dat文件,分别调用网格节点、面节点、模型剖分fish子程序,生成最终的模型。结果如下图所示。




我的模型非常大,有节点778688个,网格753571个,我的计算机开了两夜,大概至少花了30多个小时才得到最后结果。

结语:
       由于研究区域比较庞大(x=995m, y=1000m, z=400m),此次建模之前,没有估计到细化的网格会造成多么庞大的数据量,结果导致单单模型文件就有408MB之巨,后续如果采用这个模型来计算的话,那么工作量将是无法想象的。
       本次三维模型的建立,只是进行一次尝试,未考虑地下水,未考虑复杂的岩层界线。关于地下水,如果浸润线不规则的话,可以在FLAC3D中考虑采用“容重法”指定水面;对于复杂的岩层界线,可以指定不同高程(ex. group Q4 range z 499.26 720.05),也可以根据不同的岩性界线,从surfer中生成几个曲面,然后分别导入FLAC3D中,具体待后试,欢迎探讨。
      



本帖子中包含更多资源

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

×

评分

1

查看全部评分

发表于 2012-6-7 19:25:57 | 显示全部楼层 来自 上海
Simdroid开发平台
谢谢楼主的贡献,有个问题想请教一下:
第六步, 采用已有的surfer 2 FLAC3D程序,导入到FLAC3D里面。具体做法是将第三步生成的*.dat重命名为surfnd.dat,FLAC3D读入main.dat文件,分别调用网格节点、面节点、模型剖分fish子程序,生成最终的模型。

1.这里的“surfer 2 FLAC3D程序”是什么?楼主可否提供。
2.具体做法里“重命名surfnd.dat “说明后面用到了,但是用它干嘛了,不是应该读入surfer插值之后生成的数据吗?
3.读入main.dat文件,具体是怎么调用网格节点、面节点、模型剖分fish子程序的?网格划分是在Flac3D中实现的吗?
回复 1 不支持 0

使用道具 举报

发表于 2012-6-7 16:12:43 | 显示全部楼层 来自 辽宁沈阳
那个生成的三维地形图蛮漂亮,下次研究研究
回复 不支持

使用道具 举报

发表于 2012-6-7 16:56:14 | 显示全部楼层 来自 湖北武汉
不错 很好 谢谢
回复 不支持

使用道具 举报

发表于 2012-6-7 18:39:58 | 显示全部楼层 来自 山东济南
不错,很好的想法
回复 不支持

使用道具 举报

 楼主| 发表于 2012-6-8 09:01:31 | 显示全部楼层 来自 安徽马鞍山
wqq8889 发表于 2012-6-7 19:25
谢谢楼主的贡献,有个问题想请教一下:
第六步, 采用已有的surfer 2 FLAC3D程序,导入到FLAC3D里面。具体 ...

main.dat及其调用的fish子程序文件如下:

new
def pre
   oo=out('===============Please input the parameter of the mesh===============')
   oo=out('===============                attention             ===============')
   oo=out('===============   Index_x:Gridpoints along the X-AXE ===============')
   Index_x=in('Index_x=')
   oo=out('===============   Index_y:Gridpoints along the Y-AXE ===============')
   Index_y=in('Index_y=')
   oo=out('===============   Index_z:Gridpoints along the Z-AXE ===============')
   Index_z=in('Index_z=')
   oo=out('=============== Hb_surf:z_cordinate of the below surf ==============')
   Hb_surf=in('Hb_surf=')
end
pre
call SURFER.fis
call NODEGEN.fis
call MESHGEN.fis
save mesh.sav
def setup
   nd_size=Index_x*Index_y
   Io_read=0
   I0_ascll=1
   filename='surfnd.dat'
end
setup

def snd_read
   array surf_nd (nd_size)
   f_io=open(filename,Io_read,I0_ascll)
   status=read(surf_nd,nd_size)

   caseof abs(status)
   case 1
     oo=out('Fatal error:Unexcept end-of-file,you shoult rebuild the surfnd.dat!')
     key=1
     exit
   case 0
     00=out('Reading is well done!')
     loopid=nd_size
   endcase

   if abs(status) > 1
     oo=out('Fatal error:surf_nd demensions are too large!')
     key=1
     exit
   endif
   f_close=close
end
snd_read
def ndgen
   if key=1
     exit
   endif

   array  node_cor (loopid,3,Index_z)
   ;z_depth=float(Hb_surf)/(Index_z-1)  

   loop i (1,Index_z)
      loop ii (1,loopid)
         node_cor(ii,1,i)=parse(surf_nd(ii), 1)
         node_cor(ii,2,i)=parse(surf_nd(ii), 2)
         Height=(Index_z-i)*(parse(surf_nd(ii), 3)-float(Hb_surf))/(Index_z-1)
         node_cor(ii,3,i)=parse(surf_nd(ii), 3)-Height
      endloop
   endloop
end
ndgen

def mshgen
   if key=1
     exit
   endif
   array p1loc (3) p2loc (3) p3loc (3) p4loc (3)
   array p5loc (3) p6loc (3) p7loc (3) p8loc (3)
   array gpid  (4)

   loop i (1,Index_z-1)
      loop ii (1,Index_x-1)
         loop iii (1,Index_y-1)
              gpid(1)=(iii-1)*Index_x+ii
              gpid(2)=gpid(1)+1
              gpid(3)=gpid(1)+Index_x+1
              gpid(4)=gpid(3)-1
              loop mshid (1,3)
                 p1loc(mshid)=node_cor(gpid(1),mshid,i)
                 p2loc(mshid)=node_cor(gpid(2),mshid,i)
                 p3loc(mshid)=node_cor(gpid(3),mshid,i)  
                 p4loc(mshid)=node_cor(gpid(4),mshid,i)
                 p5loc(mshid)=node_cor(gpid(1),mshid,i+1)
                 p6loc(mshid)=node_cor(gpid(2),mshid,i+1)
                 p7loc(mshid)=node_cor(gpid(3),mshid,i+1)
                 p8loc(mshid)=node_cor(gpid(4),mshid,i+1)
              endloop
              p0x=p1loc(1)  p0x p0y p0z
              p0y=p1loc(2)
              p0z=p1loc(3)
              p1x=p2loc(1)
              p1y=p2loc(2)
              p1z=p2loc(3)
              p2x=p4loc(1)
              p2y=p4loc(2)
              p2z=p4loc(3)
              p3x=p5loc(1)
              p3y=p5loc(2)
              p3z=p5loc(3)
              p4x=p3loc(1)
              p4y=p3loc(2)
              p4z=p3loc(3)
              p5x=p8loc(1)
              p5y=p8loc(2)
              p5z=p8loc(3)
              p6x=p6loc(1)
              p6y=p6loc(2)
              p6z=p6loc(3)
              p7x=p7loc(1)
              p7y=p7loc(2)
              p7z=p7loc(3)
              command
                 gen zone brick size 1 1 1 p0 p0x p0y p0z &
                      p1 p1x p1y p1z p2 p2x p2y p2z)      &
                      p3 p3x p3y p3z p4 p4x p4y p4z       &
                      p5 p5x p5y p5z p6 p6x p6y p6z       &
                      p7 p7x p7y p7z               
              endcommand
         endloop
      endloop
   endloop
end
plo blo gro
mshgen

需要说明的是,这个不是我的首创,而是论坛内的大牛们早在几年前就搞了,我只不过是基本应用而已。

回复 不支持

使用道具 举报

发表于 2012-6-8 11:17:32 | 显示全部楼层 来自 上海
accbd 发表于 2012-6-8 09:01
main.dat及其调用的fish子程序文件如下:

new

谢谢楼主,这个方法不错
回复 不支持

使用道具 举报

发表于 2012-6-8 19:25:11 | 显示全部楼层 来自 湖南长沙
以前也看到过用sufer来建模的,不过自己没做成功,这个去试一下
回复 不支持

使用道具 举报

发表于 2012-6-8 19:44:33 | 显示全部楼层 来自 江苏徐州
非常好,学习ing.....如果能附带上软件最好了。
回复 不支持

使用道具 举报

发表于 2012-6-10 10:12:28 | 显示全部楼层 来自 江苏南京
楼主能不能把等高线图传上来啊
回复 不支持

使用道具 举报

发表于 2012-6-11 15:13:16 | 显示全部楼层 来自 重庆沙坪坝区
学习了,虽然没怎么看懂……
回复 不支持

使用道具 举报

发表于 2012-6-13 08:45:49 | 显示全部楼层 来自 北京
挺好的,下次试试
回复 不支持

使用道具 举报

发表于 2012-6-13 09:21:19 | 显示全部楼层 来自 湖南长沙
长知识的
回复 不支持

使用道具 举报

发表于 2012-6-15 08:39:17 | 显示全部楼层 来自 辽宁大连
不错,很好,不过那个surfer是什么软件啊?哪里有下载的安装包?谢谢楼主
回复 不支持

使用道具 举报

发表于 2012-6-19 20:22:28 | 显示全部楼层 来自 山东青岛
很不错的帖子,给你加分鼓励!!欢迎以后经常参与本版的讨论,多为大家做些无私的贡献
回复 不支持

使用道具 举报

发表于 2012-6-20 11:49:05 | 显示全部楼层 来自 北京
楼主 你好 能不能把您的程序和等高线图发给我一下 我想照您的 来一遍  求指导!!! 谢了
回复 不支持

使用道具 举报

发表于 2012-6-20 11:49:47 | 显示全部楼层 来自 北京
andy20070001@126.com  我的邮箱  再次感谢
回复 不支持

使用道具 举报

发表于 2012-7-17 15:36:16 | 显示全部楼层 来自 北京
你好,能否传个surfer to flac3d软件呢?十分感谢!
回复 不支持

使用道具 举报

发表于 2012-10-16 10:09:55 | 显示全部楼层 来自 内蒙古包头
受益了。
回复 不支持

使用道具 举报

发表于 2012-10-16 10:19:54 | 显示全部楼层 来自 湖北武汉
已成功的例子可参考崔芳鹏博士2008年发表的《基于Surfer平台的FLAC3D 复杂三维地质建模研究》http://www.gcdz.org/CN/abstract/abstract8777.shtml
回复 不支持

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-6 10:01 , Processed in 0.050969 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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