JANKIE4U 发表于 2014-11-6 15:10:12

在fish命令中如何遍历部分节点?

遇到了这个问题,在循环中如何只遍历需要的那部分节点?

龙biscuit 发表于 2016-3-14 03:13:36

可以用range限定啊,比如两平面夹逼限定范围内:
    range name Lay2 plane nor 0 0 1 ori 0 0 47below;根据自己模型选定夹逼上表面
    range name Lay1 plane nor 0 0 1 ori 0 0 43.8 above;根据自己模型选定夹逼下表面
    ran name tec_range Lay2 Lay1 ;上下表面之间夹逼要输出节点位置并命名夹逼空间

若需要限定平面内某一列x从30到31范围内:
    range name Lay2 plane nor 0 0 1 ori 0 0 47below;根据自己模型选定夹逼上表面
    range name Lay1 plane nor 0 0 1 ori 0 0 43.8 above;根据自己模型选定夹逼下表面
    ran name tec_range Lay2 Lay1 x 30 31 ;上下表面之间夹逼要输出节点位置并命名夹逼空间

forest.chang 发表于 2014-12-17 14:58:15

楼主知道了吗?我也想问啊

rosilynn 发表于 2015-1-10 13:17:02

楼主找到了么 我也想知道呀

sunlang 发表于 2016-1-3 23:17:27

rosilynn 发表于 2015-1-10 13:17
楼主找到了么 我也想知道呀

楼主找到了么 ?

芜子 发表于 2016-9-11 15:53:04

龙biscuit 发表于 2016-3-14 03:13
可以用range限定啊,比如两平面夹逼限定范围内:

若需要限定平面内某一列x从30到31范围内:


如果只想遍历模型一个表面上的节点呢?比如地形面

3Dgeosciences 发表于 2017-10-3 21:05:59

龙biscuit 发表于 2016-3-14 03:13
可以用range限定啊,比如两平面夹逼限定范围内:

若需要限定平面内某一列x从30到31范围内:


:hug::hug::hug::hug::hug::hug:

龙biscuit 发表于 2018-7-15 11:24:42

芜子 发表于 2016-9-11 15:53
如果只想遍历模型一个表面上的节点呢?比如地形面

可以通过在地形面加nstress(就是给起伏面加垂直于面的应力),这样就起伏面上有应力了,然后判定哪些节点力不为零就提取哪些节点的编号和坐标就可以了啊
5.2.2 搜索临空面
临空面是指岩土体滑动时自由空间的边界面,如斜坡的坡面,硐室的边墙、坝基下游河床面等。在FLAC3D建模中一般的水平或竖直的边界面很容易通过range限定,但对于起伏不规则的边界面比如山地、不规则斜坡的坡面就要通过FLAC3D内置FISH语言搜寻。寻找临空面的目的有三:
(1)、检查网格、判断模型的对错。
(2)、在临空面上施加载荷。
(3)、便于前后处理。
一般搜寻的方法也有三个:
(1)、寻找面在单元体遍历中出现的次数,边界面只能出现一次,超过一次即为岩体内部单元表面而非临空面。
(2)、利用interface接触面单元或shell、liner结构单元会自动捕捉临空面的特性搜寻临空面。
(3)、给模型施加静水压力的apply nstress命令也可以自动搜寻临空面,施加的静水压力除以单元体表面积的应力被平均分配到单元体节点上,通过只在所需的临空面施加静水压力,然后寻找应力不为零的节点即找到临空面所有节点编号,临空面也就找到了。
上面三种方法中,第一种适用于比较麻烦,需要比较清楚FLAC3D模型网格信息组成规律。第二种和第三种方法都比较适合于寻找底面和四周侧面全是平面而上表面为曲面的上临空面搜寻。第二种方法有时在边界处有些单元体节点因为命令不熟悉原因可能没有包括进来,建立好interface后仍需要fish函数提取相应的节点编号。
第三种方法具体代码如下,由于静水压力是被平均分配到节点上的,只要靠近边界处单元表面被施加了静水压力那么边界处单元节点就会被分配到应力,通过检测应力不为零的节点即可找到临空面所有节点编号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
                ;//////////////////////nstress_search_free_face.txt///////////////////////////////
;/目的:搜寻不规则上临空面                                                       /
;/方法:搜寻通过nstress施加到临空面并分配到应力的节点编号                        /
;/条件:一般适用于模型底面和四周侧面为平面而只有一面为不规则临空面的模型         /
;/////////////////////////////////////////////////////////////////////////////////
new
plot block gr
gen zone brick size 15 15 10 p0 0,0,0 edge=100.0
def mountain
    gp = gp_head
    loop while gp # null
      zz = sqrt(gp_xpos(gp)^2 + gp_ypos(gp)^2)
      dz = 0.06 * sin(0.2 * zz + 100.0) ; Sum Fourier terms for
      dz = dz + 0.06 * sin(0.22 * zz - 20.3) ; quasi-random surface
      dz = dz - 0.04 * sin(0.33 * zz + 33.3) ; topology.
      gp_zpos(gp) = 0.5 * gp_zpos(gp) * (1.0 + dz)
      gp = gp_next(gp)
    end_loop
end
mountain
save mountain.sav
new
rest mountain.sav
plot block gr
range name 四周 x -0.1 0.1 any x 99.9 100.1 any y -0.1 0.1 any y 99.9 100.1 any z -0.1 0.1 any
model mohr
prop dens 2550 bul 2.2e9 shea 1e9 cohesion 0.2e6 friction 20 tension 0
step 1
apply nstress 0.05e6 range 四周 not
step 1
plot block gr
plot add fap
plot add axes
;下面自定义函数提取上临空界面节点号
def _ini
    array buf1(1)
      file1='1_freeface_gridpoint_idNum_output.dat'
end
_ini
def _search_free_face
status=open(file1,1,1)
    buf1(1)=' idNum'
    status=write(buf1,1)
    p_gp = gp_head
    loop while p_gp # null
    buf1(1) = ' '
    if gp_zfapp(p_gp)#0
    buf1(1) = buf1(1) + string(gp_id(p_gp)) +' '
    status=write(buf1,1)
endif
    p_gp = gp_next(p_gp)
    end_loop
    status=close
ii = out('Successfully Write point Data Into Suffer Format File: '+ file1 )
end
_search_free_face

海子来袭 发表于 2019-7-17 15:27:25

龙biscuit 发表于 2018-7-15 11:24
可以通过在地形面加nstress(就是给起伏面加垂直于面的应力),这样就起伏面上有应力了,然后判定哪些节 ...

大神,你好

ahd0904 发表于 2022-3-24 20:20:18

牛人啊,那一刻楼的大哥
页: [1]
查看完整版本: 在fish命令中如何遍历部分节点?