FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
卷首语
要学好 FLAC3D,必须学好 FISH,FISH 身为 FLAC3D 的内嵌语言,也就是是一种
嵌入式编程语言,其编写短小精干实时,同时兼顾大家操作习惯,不但可以嵌入命令流
文件里工作,而且还可以引用 FLAC3D 本身的任何命令,突破了一般标准程序代码的限
制,实现了读者对 FLAC3D 软件的完美控制。
类似于 ANSYS 的 APDL 语言,FISH 主要是用来处理现有命令程序难以实现(较难或
较烦)的一些问题,对于没有编程经验的用户,可以编一些简单的 FISH 函数,最好是
修改 3DSHOP 中的一些比较现成的函数以便使用;当然,既然是一门编程语言,也可以
编复杂程序。
写这一卷的主要目的就是使大家对 FISH 有个较为充分的认识和理解,因为相关资
料甚少,故卷中的有些资料是作者在 Simwe,Yantubbs 等论坛上收集后整理所得,在此表
示感谢。本卷分为 4 章,第一章为关于 FISH 语言法则、变量、函数等得一个综述,主
要是想让大家从全局认识 FISH 编程语言;第二章介绍了 FISH 语句的类别和各自特点
和用法;第三章则较为细致的向大家介绍了各变量,函数的具体含义,部分配合了用法
实例;第四章补充了一些比较不错的 FISH 应用实例。
希望大家读后会有所收获,也欢迎大家批评指正,共同提高!
Sunshine
ssw1216@163.com
QQ 6192525
2007-9-20
于铁道科学研究院
北京·中国
1
FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
第一章 Fish 的语言法则
一、四个概念
函数与变量—Fish 函数由 define 定义,end 结束定义。如下例为定义一个名叫 abc
的函数。
上述函数中 hh 即为“变量”。函数和变量是 FISH 语言中非常基本和重要的两个对
象,区别如下:
当我们调用一个 FISH 对象 XXX 时,如果 XXX 是函数,系统就会执行该函数;而如
果 XXX 不是函数而是变量,系统则会简简单单的调用其当前置。大家注意继续输以下命
令行,注意输出结果,便可对这两个有个较为清晰的认识。
语句—在不少实际问题中有许多具有指示说明性的、控制性的、重复性操作,程序
中需要执行他们,诸如 Array, Define, end, Case, endcase, If ,else, endif 等即为语句。我们
举例来说明选择语句 if..else 的用法,如下:
昨天晚上俺和俺老婆在床上就商量,我俩掰腕子,我赢了我老婆亲我一下,我老婆
赢了,我亲我老婆一下。
这个就是选择语句,如果(if)我赢了(表达式)我老婆亲我一下(语句 1),如
果我输了(else),我亲我老婆一下(语句 2)。
代码行—FISH 语言中的代码行,含义类似于命令流中的“命令行”。只是他们的写
法规则有很大的不同,如下节所述。
二、两个法则
1.FISH 语言中的代码行的写法
FISH 语言中的代码行,其写法要求严格,必须是以下格式之一:
Ⅰ 代码行由语句打头,如 DEFINE,IF 等。
Ⅱ 代码行为 FISH 中定义的函数,需要说明的是多个函数间要用空格隔开。
2
FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
比较好的一点是,FISH 代码中的函数名不用提前定义,只用在执行前定义即可。
Ⅲ 代码行由赋值语句组成。
Ⅳ COMMAND-ENDCOMMAND 语句中间的 FLAC3D 命令行。
Ⅴ 空行。
Ⅵ 分号 “;”打头的行。
需注意的是 FISH 中的变量名、函数名以及语句,都要写全,不能象 FLAC3D 命令中
那样缩写。此外,代码行不能续行,不过可以通过引入新变量解决此问题。还有一点,
FISH 不区分大小写。
2 FISH 中函数名、变量名的取法
FISH 中的函数名或变量名必须以非 0 开始,并且名字中不能含有以下字符:
一般而言,除此要求外,用户可以随意取名,但应该避开 FISH 中预定义的变量和
函数名,最好也避开 FLAC3D 中的命令以及其缩写形式。
还要注意一点,如果变量名没有被赋值,则默认为 0。
三、四种格式
这里所的是,FISH 中变量以及函数的四种数据类型:
1.整型数据(介于-2147483648 和+2147483648 之间的整数)。
2.浮点型数据(精确到小数点后 15 位,介于 10-300 到 10300 之间)。
3.字符型数据(也就是字符串,可以是任意长度,FLAC3D 中,其表示通常为加上
单引号的一串字符)
4.指示字(扫描单元、网格点等清单时的机器编址)。
通过赋值可以动态的改变 FISH 中变量的数据类型,这一点与 FORTRON,C 语言相比,
更加便于新手理解和掌握。
四、两点说明
1.FISH 语言中的变量和函数名的时效
与 Basic 语言类似,FISH 语言中的变量名以及函数名在整个程序中都有效,不管
你是在 FISH 代码中还是在 FLAC3D 命令行中。
2.变量和函数名的调用格式
3
FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
函数是 FISH 语言执行的唯一对象,它没有自变量,仅仅在调用时通过提前设置变
量的值来传递变量。函数 XXX 可以通过以下方式来调用:
Ⅰ FISH 代码行直接引用函数名 XXX
Ⅱ FISH 公式中被用到,如
Ⅲ FLAC3D 命令行中直接引用
Ⅳ 在代码输入行中,作为替换对象
Ⅴ 作为 SET,PRINT,HISTORY 等命令的参数。
五、一点补充
我们可以删除或重新定义 FISH 函数,方法是用同名的新代码取而代之,如果在
DEFINE 后直接跟 END 行,那么也就删除了原定义的函数。需补充的是:
Ⅰ 本构模型不能删除或重新定义。
Ⅱ 当函数被删除了,但原有变量依然存在,因为变量是全局性的,如同在其他位
置一样。
Ⅲ 替换后,对原函数的调用会自动为新函数所取代。
4
FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
第二章 Fish 语句用法精讲
FISH 语言中的语句不多,可以分为几类:指示说明语句;控制语句;FLAC3D 的命
令执行语句。本章重点介绍语句的用法。
一、两条指示语句
1.
在这个语句中,Var1 是任意有效的变量名,n1,n2…可以是整数,也可以是标量变
量(维数)或 ARRAY 执行过程中为整型数值的单个变量。同一代码行也可以定义多个
矩阵(如 Var 2)。每个矩阵可以有不同的维数。
ARRAY 语句是一个指示说明语句,它只在汇编过程中起作用,在执行过程中被忽
略。使用时,需要注意以下几点:
1.矩阵名可以是一个存在的单个变量,这样一来,变量便转化为一个矩阵并且原
变量值会丢失。如果是一个不存在的变量名,就会新建。
2.矩阵名不能是一个函数名或已经存在的矩阵名(也就是所,矩阵不能被重新定
义)。
3.矩阵维数(n1,n2…)一定要是正整数。
4.矩阵的维数和元素个数没有限制。
矩阵变量的使用很类似于单个变量,不同的是,其后常常接自变量清单(带圆括
号)。FLAC3D 命令行中对矩阵名的使用也有一定的限制,如 Print XXX (XXX 为一 FISH
矩阵名),只会打印出最大的矩阵指数;SET grav=XXX 是不允许的。接下来介绍几个关
于此条语句的实例,虽然很简单,但希望大家小心输入,注意输入后的变化。
实例 1:定义一个一维矩阵,并进行赋值。
实例 2:定义一个用 FISH 定义奇数和偶数组的例子。
5
FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
语句
2.
在一个用户自定义函数中,只要出现 whilestepping 语句,在每一个 FLAC3D 计算
步开始时,函数都会自动执行。该语句的属性可以通过 SET fishcall 0 remove 命令修改
失效。FISHCALL 语句可以提供更为自由的计算控制,所以该语句应该不多,此处不作
详细介绍。
二、五对控制性语句
控制语句在 FISH 中十分重要,如下进行一一介绍。
1.函数语句
2.条件语句
6
FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
该语句的语法结构为:
在这个结构中,CASEOF 后的 Expr 对象可以是任何有效的数学表达式,经过计算
后转化为整型数据;而词条 i1,i2…..等则必须是 0~255 中间的整型,不能为符号。如
果 Expr 等于 i1,系统会自动跳到 CASE i1 后语句执行,直到碰到下一条 CASE 语句,
系统才会到 ENDCASE 完成执行任务,类似 i2,i3,i4…..时原理完全一样,只是要说
明一点,如果 Expr 不等于 iN 中的任何一个,系统会执行第 1 个 CASE,如果 N 小于 0
或大于 255,系统就会出错停止执行。i1,i2….并不要求一定是连续或相邻整数。
下例为含有该句型用法的部分 FISH 流:
。。。。。。。。。。。
7
FLAC3D 玩家宝典之 FISH 卷 作者 Sunshie (QQ 6192525)
3.条件语句
条件语句 IF 是所有计算机语言中较为常用的语句,在该对语句中,通常 ELSE 为
可选项,THEN 可以省略不写。该语应用较为普遍,本节只简单介绍 FISH 语言中几个
需要注意的问题:
Ⅰ TEST 词条常常由以下符号组成:
Ⅱ EXPR1 和 EXPR2 可以是任意的有效代数式,可以包括函数,FLAC3D 变量
其中,#号意为≠。
等等。
Ⅲ 如果 TEST 结果为真,IF 后语句就会执行,直到执行下一条 ELSE 或者 ENDIF;
但如果测试结果为假,系统就会执行 ELSE 和 ENDIF 之间的语句,当然了,前提是存
在 ELSE 语句,呵呵。另外,ENDIF 执行后,系统自动跳回第一行。
Ⅳ 当 EXPR1 和 EXPR2 为字符串时,测试附后只能时两种,即
,对字符串
而言,其他的操作时无效的,必须很精确的对等;指示字也一样。
Ⅴ 该语句可以嵌套到任何路径。
举个简单的实例,以理解其用法:
4.循环结构语句
FISH 中采用的循环结构语句只有 LOOP 语句,没有 FOR-NEXT 等语句,其结构
为
8