采用CAD、surfer、FLAC3D多软件联合生成高仿真地形.doc
9页采用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文件)2t3* 扌二品盟覧嘉掘覧掘需嚣-S瑞…….* 驚席亞韻益怎熬lt=器髭益11:1舅壮需讣嚮徒筈i 缺盘盟盅益HUM爱=====■==盂品 益益嚣噩翳嘉盟詈益誌豈薛詈头 込鑫覘唸噩S监竄|>1.监陰监壮益鬣矍 站- -— 1■•IHll:5I3lfcllll!rllllJlnHllAa口工4au3UAull 这一步主要是为了对模型有个直观的感受,看生成的模型与实际情况是否吻合, 否则应进行修改结果如下图:这样,一个漂亮的曲面模型就生成了下面最终的步骤终于来临了,这是重点,也是难点, 就是导入到FLAC3D中,这样才可以进行有限差分计算第六步,采用已有的surfer 2 FLAC3D程序,导入到FLAC3D里面具体做法是将第三步 生成的*.dat重命名为surfnd.dat, FLAC3D读入main.dat文件,分别调用网格节点、面节 点、模型剖分fish子程序,生成最终的模型结果如下图所示8. FLAC3D中所生成的模型.jpg (199 KB,下载次数:7) 下载附件保存到相册2012-6-7 15:35 上传我的模型非常大,有节点778688个,网格753571个,我的计算机开了两夜,大概至少花 了 30多个小时才得到最后结果结语:由于研究区域比较庞大(x=995m, y=1000m, z=400m),此次建模之前,没有估计到 细化的网格会造成多么庞大的数据量,结果导致单单模型文件就有408MB之巨,后续如果 采用这个模型来计算的话,那么工作量将是无法想象的本次二维模型的建立,只是进行一次尝试,未考虑地下水,未考虑复杂的岩层界线。 关于地下水,如果浸润线不规则的话,可以在FLAC3D中考虑采用''容重法〃指定水面;对于 复杂的岩层界线,可以指定不同高程(ex. group Q4 range z 499.26 720.05),也可以根据 不同的岩性界线,从surfer中生成几个曲面,然后分别导入FLAC3D中,具体待后试,欢迎 探讨ma in .dat及其调用的fish子程序文件如下:new def preoo=out(' mesh====== oo=out('== = = = = ')oo=out('')')In dex_x=i n('I ndex_x=') oo=out('========')In dex_y=i n('I ndex_y=') oo=out('========')In dex_z=i n('I ndex_z=') oo=out('========Please in put theatte ntio nIn dex_x:Gridpo intsIn dex_y:Gridpo intsIn dex_z:Gridpo intsHb_surf:z_cordi nateparameter ofalo ngalo ngalo ngof thethethethebelowtheX-AXEY-AXEZ-AXEsurf')Hb_surf=i n( 'Hb_surf=') end precall SURFER.fiscall NODEGEN.fiscall MESHGEN.fis save mesh.sav def setupn d_size=In dex_x* In dex_yIo_read=0I0_ascll=1file name='surf nd.dat' end setup def snd_readarray surf_ nd (n d_size)f_io=ope n( file name,Io_read,IO_ascll) status=read(surf_ nd,n d_size)caseof abs(status)case 1oo=out('Fatal error: Un except en d-of-file,you shoult rebuild the surf nd.dat!') key=1exitcase 000=out('Reading is well done!')loopid=n d_sizeendcaseif abs(status) > 1oo=out('Fatal error:surf_ nd deme nsions are too large!')key=1exiten diff_close=closeendsnd_readdef ndgenif key=1 exiten difarray no de_cor (loopid,3, In dex_z);z_depth=float(Hb_surf)/(I ndex_z-1)loop i (1,In dex_z)loop ii (1,loopid)no de_cor(ii,1,i)=parse(surf_ nd(ii), 1)no de_cor(ii,2,i)=parse(surf_ nd(ii), 2)Height=(I ndex_z-i)*(parse(surf_nd(ii), 3)-float(Hb_surf))/(I ndex_z-1) no de_cor(ii,3,i)=parse(surf_ nd(ii), 3)-Heighten dloopen dloopendndge ndef mshge nif key=1 exiten difarray p1loc (3) p2loc (3) p3loc (3) p4loc (3)array p5loc (3) p6loc (3) p7loc (3) p8loc (3)array gpid (4)loop i (1,I ndex_z-1)loop ii (1, In dex_x-1)loop iii (1,I ndex_y-1)gpid(1)=(iii-1)* In dex_x+iigpid (2)=gpid(1)+1 gpid(3)=gpid(1)+I ndex_x+1 gpid(4)=gpid (3)-1 loop mshid (1,3)plloc(mshid)=no de_cor(gpid(1),mshid,i)p2loc(mshid)=no de_cor(gpid(2),mshid,i) p3loc(mshid)=no de_cor(gpid(3),mshid,i) p4loc(mshid)=no de_cor(gpid(4),mshid,i) p5loc(mshid)=no de_cor(gpid(1),mshid,i+1) p6loc(mshid)=no de_cor(gpid(2),mshid,i+1) p7loc(mshid)=no de_cor(gpid(3),mshid,i+1) p8loc(mshid)=no de_cor(gpid(4),mshid,i+1) en dloopp0x=p1loc(1) p0x pOy pOzp0y=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) comma ndgen 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 p7zen dcomma nden dloopen dloopen dloopendplo bio gromshge n需要说明的是,这个不是我的首创,而是论坛内的大牛们早在几年前就搞了,我只不过是基 本应用而已。





