haitang 发表于 2007-2-1 18:42:24

利用Sufer和FISH进行复杂地形建模

应斑竹君之枫的邀请,偶也来班门弄斧,谈谈复杂地形建模的一些方法。今天,仔细看了starsmoon大牛的《FLAC中关于曲面的生成》,很受启发,用Sufer来建模,是一个比较容易的方法。由于Sufer生成的是规则的网格,所以用程序实现是比较方便的。鉴于利用FISH进行二次开发是很好的主意,我就在starsmoon编的fish程序的基础上,稍微改进一下,让其可以支持多个地层的建模(程序中只考虑两个地层soil和rock,多个地层可以修改程序加入),在FLAC3D中把四棱柱改成了三棱柱。同时也加入了ANSYS 和 3DEC的建模模块。ANSYS中采用六面体,3DEC中采用三棱柱体。
       仿真论坛上有不少大牛在建模上都很有一套,比如starsmoon,君之枫,SCH等等。在三维地质建模计算机辅助系统板块上就更多了。我这里只是介绍一些简单实用的方法,供大家参考吧。程序中应用了starsmoon的程序和例子,在此表示感谢。

starsmoon的链接地址:http://www.simwe.com/forum/viewthread.php?tid=395448&extra=page%3D2%26filter%3Ddigest

本例子采用starsmoon的例子,并分为两层,第一层为地表面,第二层为soil和rock的分界面(可以是曲面,用sufer插值生成,但是注意网格要对应。)。FLAC3d中在z方向剖分为2个单元,x,y方向剖分为1个单元。这些在command.txt中可以修改。详细设置见命令流。下面贴出生成的模型的图片。

haitang 发表于 2007-2-1 18:45:13

sufer的使用

sufer的使用,读入数据,生成图形。
这个系统挺麻烦的,我想在回复中贴图片,还得等2分钟阿。

haitang 发表于 2007-2-1 18:49:45

用kriging法建出的地表模型。

用kriging法建出的地表模型。如下所示。
第二个为Nod.grd。存储了插值后网格点的高程信息。

haitang 发表于 2007-2-1 18:53:41

再贴grd图形

呵呵。仿真对字数有限制,不达到字数还不给回复。
下一张为生成的flac3d模型

haitang 发表于 2007-2-1 18:56:16

再贴两张

再贴两张ansys和3dec的模型效果图。详细可以用flac3d执行命令流command.txt,即可生成flac3d,ansys和3dec的模型的命令流。:victory:

[ 本帖最后由 haitang 于 2007-2-1 18:58 编辑 ]

benjackxu 发表于 2007-2-1 19:24:46

haitang (海棠) ,you are knight-errant and a strong man here:victory::D.

benjackxu 发表于 2007-2-1 19:27:14

原帖由 haitang 于 2007-2-1 18:42 发表
应斑竹君之枫的邀请,偶也来班门弄斧,谈谈复杂地形建模的一些方法。今天,仔细看了starsmoon大牛的《FLAC中关于曲面的生成》,很受启发,用Sufer来建模,是一个比较容易的方法。由于Sufer生成的是规则的网格,所 ...

三棱柱代替四棱柱,好想法,我以前研究top.fis时,没想到这个,呵呵,学习了:D。

sch 发表于 2007-2-1 22:35:14

海棠写fish很强啊!生成楔形体单元不错!
如何在建好的地形上建一个建筑物例如拱坝,还请海棠fish高手设计一下如何解决。如果能够解决这个问题,那么就不用再通过ansys进行建模了,生成网格单元计算精度也就提高了!

haitang 发表于 2007-2-2 09:37:10

呵呵。双曲拱坝用fish实现比较难,用ansys比较方便。
多个地层的曲面插值数据放在Sufer_Data.dat中。
X,Y, Z1, Z2, ... Zn
0,0,5.2109784409276,2.210978441
2,0,5.2530368758511,2.253036876
4,0,5.2963541616273,2.296354162
6,0,5.3423741282441,2.342374128
8,0,5.3926157829582,2.392615783
10,0,5.4485340056776,2.448534006
我这里只是简单把第一层减去3m。其实也可以用单独的曲面。但是用对应相同的x,y来插值。

flywing140 发表于 2007-2-2 11:52:52

用surfer导到flac3d里面的模型好像不能进行划分group的操作,导入flac后就是一个整体,请教诸位,可有办法解决啊?

haitang 发表于 2007-2-2 12:12:44

命令流中考虑到了,不同的地层划分为不同的group,这个例子中分成两个group。soil和rock。详细请看命令流。

flywing140 发表于 2007-2-2 12:56:37

请教haitang (海棠)老师,您是在命令流中控制了地层的划分,可是若该层面很复杂,或者层面起伏很大,该怎么做啊?还有就是断层,以及开挖面应该怎样做进去啊?

haitang 发表于 2007-2-2 13:24:26

由于用三棱柱生成单元,所以在复杂的地层都可以模拟的很好,只是增加了单元数。我觉得可以将三棱柱和四棱柱结合起来,用四个顶点的相差容许度来判断是否生成四棱柱。如果地形扭曲较大,则拆分成两个三棱柱。
对于断层和开挖面的模拟。程序中生成了ANSYS模型的命令流,这一步可以在ansys中处理。利用工作平面切割。是一个好办法,可参鉴君之枫。如果用3dec,开挖和断层处理就更方便了,详细看3dec的帮助文件。

紫水晶 发表于 2007-2-2 22:24:40

我想问一下楼主,我如果想借用一下你开发的fish程序建立三维模型,是不是把sufer里面的点坐标改成自己的就能用啊?

haitang 发表于 2007-2-3 10:05:58

FISH程序说明

new
def para_set
suferfile = 'Sufer_Data.dat'   ;File from Sufer which contains the layers' coords.
Tablefile = 'Table_data.dat'   ;File which contains the table.
AnsysFile = 'Ansys_Model.dat';AnsysModel
D3DECFile = 'D3dec_Model.dat';3dec   Model
FlacFile= 'Flac3D_Model.dat' ;Flac3D Model
Col_Num   = 36         ;Sufer中插值网格X方向上的插值点个数
Row_Num   = 26         ;Sufer中插值网格Y方向上的插值点个数
dx_size   = 2            ;X方向上的单元的大小(m)
dy_size   = 2            ;Y方向上的单元的大小(m)
z_base    = 0.0      ;模型z方向底座高程   
xor       = 0.0          ;模型左下角的x坐标
yor       = 0.0          ;模型左下角的y坐标
n_zon_col = Col_Num - 1      
n_zon_row = Row_Num - 1
xdiv      = 1            ;flac模型中每个单元在x方向上的剖分个数
ydiv      = 1             ;flac模型中每个单元在y方向上的剖分个数
zdiv      = 2            ;flac模型中每个单元在z方向上的剖分个数
end
para_set

构建的sufer插值数据文件如下:
-----------------------
x坐标,y坐标,第一层插值高程,第二层插值高程。
0,0,5.2109784409276,2.210978441
2,0,5.2530368758511,2.253036876
4,0,5.2963541616273,2.296354162
6,0,5.3423741282441,2.342374128
8,0,5.3926157829582,2.392615783
... .... ... ...
这个例子中,只有考虑两层,第一层为地貌,第二层为基岩分界面。如果要多考虑几个地层,可以构建sufer数据文件
x坐标,y坐标,第一层插值高程,第二层插值高程,第三层插值高程,... ... ...
相应的在程序中要加入第三层的fish模块,参照第二层的做法复制代码即可。

多层地层插值信息在flac中的table存储格式在Table_data.dat,请自行查看。

benjackxu 发表于 2007-2-3 12:41:21

其实这个方法与手册中FISH LIB中的那个TOPO.FIS的思路如出一辙:思路就是沿x、y向采用条柱不停的循环累加而成。手册中的只不过是只能考虑单一地层,haitang进行了进一步的开发,拓展到了能考虑两层、三层,甚好,学习一下。这个对编程基础好的朋友来说看懂不是难事,我由于编程能力太差,对于两层的问题没法解决,所以最后才转求ANSYS的。

ansys2007 发表于 2007-2-3 13:48:43

超级棒!!!!!狠顶!!!!!!!!
但想问一下就象这个图,那个Z=0平面以下如果是基岩,Z以上的隆起都是堆沙,想把他们分成两组,他们带自然休止角的过渡隆起的地方如果将那地方的柱体也分几个Z_size的话会造成单元十分紧密。。。。。请问这个问题有没有什么办法解决呀,十分头痛。。。
是不是要用IF一下,如果高度太下就让他一个,达到一定高度就可以多分,,,是这样吗?我编程太菜了,,,唉```````

benjackxu 发表于 2007-2-3 14:15:13

原帖由 ansys2007 于 2007-2-3 13:48 发表
超级棒!!!!!狠顶!!!!!!!!
但想问一下就象这个图,那个Z=0平面以下如果是基岩,Z以上的隆起都是堆沙,想把他们分成两组,他们带自然休止角的过渡隆起的地方如果将那地方的柱体也分几个Z_size的话会造 ...

你这个问题以前我建模的时候也有这个疑惑,由于在竖直方向上,模型等分为一样的份数,这样如果地形本身起伏比较大的话,会造成有些地方网格很密,虽然大多数情况下,这种网格密集地区与力学分析时应力集中地带相一致,满足网格细化加密的要求,但感觉不是很通用。因此,如果要有更好的网格,且相邻网格大小比较协调的话,这种问题还是在其它有限元软件里解决为好。如果FLAC3D的建模顺序是先建几何实体模型,然后再划分网格的话,相信他的应用领域和人群会扩大很多。估计这和FLAC3D初期研发的定位有关系,记得它早起版本是以隧道网格为图标的,可能先前是应用隧道等地下工程领域的吧。我也实在搞不明白,手册中出现的gen surface之类的用来建空间曲面的命令有什么用,想来是留待以后进一步开发的吧。

newbamor 发表于 2007-2-4 11:00:08

z_size    = 10 代表什么意思?具体修改程序对于初学者有点难度,楼主能不能修改一下程序,能应用于多个地层,这样更加具有通用性!

chunhuo420 发表于 2007-2-5 08:15:54

这么好的帖子加5分都不为过,嘎嘎。。。。。。。。。。。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 利用Sufer和FISH进行复杂地形建模