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软件的冗余数据