涛声依旧2015 发表于 2015-10-6 20:29:35

分享自编 城市交叠隧道 实例 (基于FLAC3D 5.0)

基本信息:
   模型分三层土,从上往下依次是:土,风化岩,软岩,,所建立的模型长150 m,宽 90m,高79 m。开挖4个隧道,上面 两个,下面两个;
   隧道断面均为三心圆模型;
   支护方式:初支采用 预应力锚杆 和壳单元模拟,用实体单元模拟二衬砌永久支护;
   上面的两个隧道每次开挖均为5m,分30次开挖,下面的两个隧道每次开挖也均为5m,分18次开挖,上下隧道的锚杆均为每隔2m设置锚杆,上面两个隧道断面每次设置9根锚杆,下面隧道每次设置11根锚杆支护。
具体图如下:
整体模型:


隧道:


隧道衬砌:


隧道加衬砌:


锚杆和壳单元:


z方向位移:


衬砌z方向位移:


结构单元应力:


问题:
      本次模型计算的工作量较大,大部分时间都耗在锚杆与liner单元建立链接的~~以前网上分享的自动建立链接的程序原理主要是两个足够相近结构单元节点之间建立起链接,每次循环建立链接的时候都要把所有的节点都要遍历一遍建立链接,都会把以前建立过的链接删去再重新重头开始建立链接,这样到后面就越浪费时间,以至于在分析开挖第三和第四个隧道时候花费的时间越来越多,中间做了好多无用功!!比如开挖第四个隧道的时候,每次建立链接都要重新从第一个隧道开始循环到第四个隧道~~~想要问的问题就是 :能否控制遍历的范围,比如开挖第三个隧道的时候就只让其遍历第三个隧道范围内的结构单元,只在第三个隧道范围内循环建立链接,如果可以实现,这样就可以节约大量的时间,预计以上四个隧道开挖计算估计3~4个小时就可以搞定,而实际我用FLAC3D 5.0算的时候用了近两天的时间~~求各位大侠能提出自己的建议,能在白忙之中给予交流指点,不胜感激!!!





echowasd 发表于 2015-10-6 22:41:24

用 in_range 、id 或 location 缩减 node_arr 的长度:
    node_arr = get_array(node_num)
    node_num = 0
    node_pnt0 = nd_head
    loop while node_pnt0 # null
      node_num = node_num + 1
      node_arr(node_num) = node_pnt0
      node_pnt0 = nd_next(node_pnt0)
    endloop

涛声依旧2015 发表于 2015-10-7 10:25:55

echowasd 发表于 2015-10-6 22:41
用 in_range 、id 或 location 缩减 node_arr 的长度:
    node_arr = get_array(node_num)
    node_num...

      看过尝试了一下, 还是不大会,感觉这个挺好,可不可以把 in_range 、id 或 location 缩减 node_arr 的长度的具体命令的方法给我发下让我学习学习呀,在邮箱或这上面发下都行,谢谢呀!

echowasd 发表于 2015-10-7 13:57:39

涛声依旧2015 发表于 2015-10-7 10:25
看过尝试了一下, 还是不大会,感觉这个挺好,可不可以把 in_range 、id 或 location 缩减 node_ar ...

随机应变,根据你的模型来的,比如你只考虑y=范围内的单元重新链接,那你先判断单元的ypos,在此范围内的话放入array。

牛掰的网络世界 发表于 2015-10-7 15:51:40

顶一下。。

涛声依旧2015 发表于 2015-10-7 17:41:47

echowasd 发表于 2015-10-7 13:57
随机应变,根据你的模型来的,比如你只考虑y=范围内的单元重新链接,那你先判断单元的ypos,在此范 ...

    我根据以前编的大致编写了一个,但是运行的时候提示   *** Fish: Integer must be between 1 and 2147483647.感觉有问题,想让你在百忙之中帮我看看;谢谢!!

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;fenquyujianlilianjie;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

def fenquyurelink
    global node_dist
    global dist_tol
    global _xloc
    global _yloc
    global _zloc
    global xx1
    global yy1
    global zz1
    global xx2
    global yy2
    global zz2
    global link_id1
    global link_id2
    global node_id1
    global node_id2
    global link_pnt1
    global link_pnt2
    global node_num_minus1
    local node_pnt0
    local node_pnt1
    local node_pnt2
    global ii_plus1
    global node_num=0
    global node_arr = get_array(node_num)
    node_pnt0=nd_head
    loop while node_pnt0 # null
         _xloc = nd_pos(node_pnt0,2,1)
         _yloc = nd_pos(node_pnt0,2,2)
         _zloc = nd_pos(node_pnt0,2,3)
         if _xloc > 0 then                        ;可以根据需要变动需要遍历的范围
            if _zloc > -7 then
               node_num = node_num + 1
               node_arr(node_num) = node_pnt0
               node_pnt0 = nd_next(node_pnt0)
            endif
          endif
   endloop
   node_num_minus1 = node_num-1
   ;link_id=30000
   loop ii (1,node_num_minus1)
         node_pnt1 = node_arr( ii )
         node_id1=nd_id(node_pnt1)
         xx1 = nd_pos(node_pnt1,2,1)
         yy1 = nd_pos(node_pnt1,2,2)
         zz1 = nd_pos(node_pnt1,2,3)
         ii_plus1 = ii+1
         loop jj (ii_plus1,node_num)
             node_pnt2 = node_arr( jj )
             node_id2=nd_id(node_pnt2)
             xx2 = nd_pos(node_pnt2,2,1)
             yy2 = nd_pos(node_pnt2,2,2)
             zz2 = nd_pos(node_pnt2,2,3)
             node_dist = sqrt((xx1-xx2)^2+(yy1-yy2)^2+(zz1-zz2)^2)
             dist_tol = 1e-3
             if node_dist < dist_tol then
                link_pnt1 = nd_link(node_pnt1)
                link_pnt2 = nd_link(node_pnt2)
                if link_pnt1 # null then
                   ;link_id = link_id + 1
                   link_id1 = lk_id(link_pnt1)
                   command
                      sel delete link range id @link_id1
                      ; sel set link node_tol=dist_tol
                      sel link id=@link_id1 @node_id1 target=node tgt_num=@node_id2
                      sel link attach xdir=rigid ydir=rigid zdir=rigid &
                      xrdir=rigid yrdir=rigid zrdir=rigid range id=@link_id1
                  end_command
                else
                if link_pnt2 # null then
                   ;link_id = link_id + 1
                   link_id2 = lk_id(link_pnt2)
                   command
                      sel delete link range id @link_id2
                      sel link id=@link_id2 @node_id2 target=node tgt_num=@node_id1
                      sel link attach xdir=rigid ydir=rigid zdir=rigid &
                      xrdir=rigid yrdir=rigid zrdir=rigid range id=@link_id2
                   end_command
                endif
                endif
             endif
         endloop
   endloop
end
@fenquyurelink
   

about7kk 发表于 2015-10-8 16:49:29

感谢楼主的分享

炫光光 发表于 2016-4-1 20:44:07

好牛啊。。。。太高端的我也学不会。。。我只想学习一下建模 和打锚杆在5.0中怎么实现的   楼主可以分型命令流吗不胜感激啊    1158202454@qq.com

还有我的模型在5.0中运行不了楼主可否帮忙看一下啊?

xiaohaizzz 发表于 2016-5-19 20:36:11

:):(:D:):):(:D:D:D:D

prosper9715 发表于 2016-9-12 20:47:07

确实是牛

zhs16668 发表于 2016-9-21 16:52:47

谢谢楼主分享啊

xsli2017 发表于 2016-12-9 10:45:15

谢谢楼主无私的分享

414133934 发表于 2017-11-26 21:33:39

感谢!!!!!!!!!!!!!!!!

3Dgeosciences 发表于 2018-4-22 00:11:08

做的真好~

boliwutoubang 发表于 2018-8-19 16:01:33


感谢楼主的分享

快乐 发表于 2018-8-20 21:20:51

做的真好,学习了

幽冥狼 发表于 2018-8-30 15:07:46

感谢楼主分享

w87233 发表于 2018-9-6 09:52:28

感谢楼主分享

j1381642 发表于 2018-10-19 08:34:18

sel shell id=1 range cyl end1 0 0 0 end2 0 4 0 rad 1

sskaishenbin 发表于 2020-1-4 13:58:49


非常感谢!
页: [1] 2
查看完整版本: 分享自编 城市交叠隧道 实例 (基于FLAC3D 5.0)