首页/文章/ 详情

FISH: 使用MAP数组实现loop foreach

2年前浏览1584

1 引言

在《FISH: Loop语句的进化》一文中,曾经提到使用list.range产生一个列表进行foreach的循环,list.range是3DEC和FLAC3D的内置函数,UDEC没有list.range函数,不太清楚为什么UDEC不加入这个函数。在UDEC中,array产生的是指针,类似于 loop for (n = 1, n <= 10, n = n 1),不能用于foreach, 因此我们需要另一种产生列表的方法---MAP.


2 MAP数组

Map数组是从Python借用过来的,最早在PFC 5.0中引入(下面演示的代码均在PFC5.0中测试)。MAP数组与Array数组的功能类似,它们都是一种有序的方式存储FISH变量, 但是比Array数组要灵活得多。Map可以动态调整大小,而且用于从map中检索值的键可以是一个整数或者是一个字符串。Map是一个数据容器,下面的代码演示了对map容器内的数据进行求和,其中键为字符串, 如果某一项的值为字符串,那么这一项的值为0. 

此外, 我们也可以对容器内的部分值进行求和,下面的代码显示了这样的意图。在这段代码中,我们仅对第一项和第四项求和。

Map数组可以动态地增加,删除以及改变容器中的值。map.add方法增加一个值到map中;map.remove方法从map中删除一个值. 下面的代码演示了这种操作.

map.keys(MAP)获取map容器中的键值,返回值是map中所有键的个数。请注意,在获取具体的键值时,其排列顺序按照字典顺序而不是按照代码中的显示顺序。

i=map.size(MAP)获取MAP的尺寸,也就是获取map中存有多少对数据(key/value), 返回整形值。map函数总结如下:

 

3 在UDEC中使用map

下面的代码演示了在UDEC中使用map进行循环,其结果与3DEC的计算结果相同。


4 在PFC中使用map

Map在UDEC中的应用并不很多, 但在PFC中的应用更广泛一些, 很可能因为map最早是在PFC中引入进来的, 所以发展得更成熟一些.  

fish define replay(name,plot)
 rmap  = map(0,0)
 map.remove(rmap,0)
 command
   model results map @rmap
 endcommand
 local rsize = map.size(rmap)
 local rkeys = map.keys(rmap)
 loop foreach local k rkeys
   local iname = map.value(rmap,k)
   local oname = string.build('%1_t%2.png',name,k)
   command
     model result import @iname skip-fish
   endcommand
   if plot = true
     command
       plot bitmap plot 'the system' filename @oname
     endcommand
   endif
 endloop
end


本文相关文档:

FISH: Loop语句的进化

与外部数据交互: table命令与table FISH

FLAC3D 7.0 新特性简介(P2)---FISH的显著改进

增加和改进table: table add/insert | table.value

清理Itasca软件的冗余数据


来源:计算岩土力学
PFCFLAC3D3DEC
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-10-09
最近编辑:2年前
计算岩土力学
传播岩土工程教育理念、工程分析...
获赞 150粉丝 1102文章 1782课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈