第十章GradsGrADS 描述语言及编程.docx
- 文档编号:6328461
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:18
- 大小:1.03MB
第十章GradsGrADS 描述语言及编程.docx
《第十章GradsGrADS 描述语言及编程.docx》由会员分享,可在线阅读,更多相关《第十章GradsGrADS 描述语言及编程.docx(18页珍藏版)》请在冰豆网上搜索。
第十章GradsGrADS描述语言及编程
GRADS(GridAnalysisandDisplaySystem)
讲义(10)
GrADS描述语言及编程
一、描述语言概述
描述语言是GrADS软件包中自带的高级语言,可以用于GrADS的高级操作,更方便地使用GrADS的功能。
通过描述语言可以编写具有复杂功能的命令集(即gs文件)。
二、gs文件中的两类型语句
1)描述语句:
不用引号,需要经过编译的。
2)指令性语句:
GrADS命令,需用引号括起来。
通过描述语句来控制指令
描述语言用到指令性语句中要用引号,即,
i=1
‘sett‘i’’(或者‘sett’i)
三、描述语言程序特点
1、程序通过GrADS的run命令来编译执行;
runfile-nameoptions
2、可以有变量、流程控制也可以执行GrADS的命令。
3、描述语言可以
1)编写函数子程序,
2)制作屏幕菜单,
3)可以显示动画图形,
4)可以使用从GrADS的query命令中得到的信息作注释等。
3、描述语言的所有变量都是字符串型的,描述变量可以进行计算。
流程控制是通过if/else/endif和while/endwhile语句块实现。
循环过程可以用continue或break命令改变。
变量中包含的或者由表达式结果产生的字符串可以作为GrADS命令项使用。
而由GrADS命令执行后产生的文字结果可以读入变量并在描述语言程序中使用。
描述语言也支持函数子程序功能。
四、描述语言的组成
1、一个描述语言程序是由许多语句组成,每个语句之间由换行号或分号分隔。
2、下面是GrADS描述语言中语句的类型:
赋值语句
If/Else/Endif
while/endwhile
break/continue
functionheader/return
say/pull
3、描述表达式
描述表达式是由运算对象和运算符组成。
运算对象:
描述变量、子程序函数或常数;
运算符:
数学、逻辑或连结运算符。
下面分别介绍变量、运算符、表达式
4、描述语言变量
1)构成
变量名是由1至8个字符组成,以字母开头,仅可以包含字母和数字,变量名区分大小写。
2)变量内容性质
内容总是一个字符串,
在有些运算中,字符串将被解释为数字。
如果一个变量没有被赋值,那么它的值就是它的名字。
如果一个变量或字符串常数是一个具有正确格式的数字,可以进行某些数学运算,所得结果也是一个数字字符串。
在GrAD描述语言中,有两个变量名由其内部使用:
'result'和'rc'。
尽量避免使用这两个变量名。
3)复合描述变量
描述语言现在支持复合变量,利用它可以在描述语言程序中构造数组。
复合变量名可以是一个由“·”分隔的多个变量名的复合体。
例如:
varname.i.j
这时,当变量内容被调用时,如果i和j也是变量,那么i和j的内容将会被i和j的字符串值所替代。
例如:
i=10
j=3
varname.i.j=343
在这个例子中,赋值语句相当于:
varname.10.3=343
注意:
i和j的字符串值可以是任何字符,但varname必须遵循描述变量名的规则,即:
由字母和数字组成,须字母打头。
因此复合变量名被替代后可以是任何字符串:
i='a#$xx'
varname.i=343
以上表示是允许的,但不能直接将变量名写为:
varname.a#$xx=343
在i、j变量被替代前后,
**复合变量名的整个长度不能超过16个字符。
**在GrADS描述语言中不能设置过多的变量,因此,不能利用复合变量产生一个大的数组,例如:
i=1
while(i<10000)
var.i=i
i=i+1
endwhile
上面的循环将产生10000个不同的变量名。
如果设置了以上这样较大数目的变量,将影响描述语言的执行。
5、运算
在GrADS描述语言中使用了下列运算符:
|逻辑变量:
或
&逻辑变量:
和
=等于
!
=不等于
>大于
>=大于等于
<小于
<=小于等于
%连结符
+加
-减
*乘
/除
!
一元否
-一元负
注意:
1)如果是数值运算对象,下列运算符可以用于数值运算:
=,!
=,>,>=,<,<=,+,-,*,/
2)如果是非数值运算对象,下列运算符在运算时将出错:
+,-,*,/
3)算术运算是以浮点形式进行的,如果结果是整数,那么结果字符串也是整数。
在逻辑运算中,如果结果为真,给出一个字符1,如果为假,给出一个字符0。
6、表达式
描述语言的表达式包含运算对象、运算符和括号,在运算过程中各种运算符的先后顺序为:
-,!
/,*
+,-
%
=,!
=,>,>=,<,<=
&
|
如果运算符在同一优先级上,则从左向右计算。
运算对象可以是变量、字符串常数或子程序函数调用。
注意:
1)字符型常数用单或双引号括起来。
而数值型常数可以不用引号括起来,但GrADS仍然认为是字符串常数。
下面是一个字符串常数的例子:
'Thisisastring'
2)有些情况下,连结运算符是隐含的,当两个运算对象并列靠在一起,中间没有任何运算符时(中间可以有空格),隐含着中间是一个连结符。
例如:
下列两个表达式是等价的。
var1%var2%'String'
var1var2'String'
2)括号可以改变运算的先后顺序。
7、IF语句块****
程序执行流程可以通过if/else/endif语句控制,形式为:
IF(表达式)
描述语言语句
描述语言语句
…
…
else(可不用)
描述语言语句
描述语言语句
…
…
endif(必须使用)
注意,下列语句是错误的:
if(i=10)j=20
你必须写三个语句:
if(i=10)
j=20
endif
你也可以在同一行上写这三个语句:
if(i=10);j=20;endif;
if语句块的执行依赖于表达式的结果,如果表达式的结果是一个0字符(结果为假),则’else’部分就被执行,如果表达式的结果是不为0的其它字符,则执行’if’部分。
8、WHILE语句块
while语句块的格式为:
while(表达式)
描述语言语句
描述语言语句
…
…
endwhile
当表达式结果为真,即:
是一个不为0的字符,循环就继续执行。
另外两个描述语言命令可以改变循环的执行,break可以立即中断循环,continue可以立即跳到循环体的开头,并重新计算表达式的结果。
例如:
t=1
while(t<10)
'sett't
'displayz'
if(rc!
=0);break;endif;
t=t+1
endwhile
9、函数及函数子程序
用户可以自己编制函数子程序,也可以使用描述语言的内部函数。
在一般情况下,函数作为描述语言的表达式运算对象被调用。
描述语言函数子程序总是得到一个单一的字符串结果,但可以有一个或多个字符串自变量,它的调用格式为:
name(arg,arg,arg...)
注意:
1)函数名遵循变量名的规则,自变量可以是表达式。
2)如果函数子程序没有自变量,你仍然需要写上一对括号:
name()
3)在其它文件中的函数子程序不能调用。
(其它文件中的描述语言程序可以通过GrADS的run命令执行)
4)可以通过函数子程序的定义语句在描述语言程序中构造自己的函数:
functionname(variable,variable,...)
要回到调用处,使用return语句:
return表达式
这里表达式可以省略,如果省略表达式,就返还一个空字符串(空字符串是‘’)。
函数的结果是return语句中表达式的结果。
5)调用过程
当一个函数子程序被调用时,首先计算自变量,然后执行函数子程序,作为函数自变量的变量的值初始取为传输给自变量的值。
如果传输给自变量的值的个数太少,则其余的变量初始没有值,如太多,则多余的被舍弃。
你可以从函数子程序定义语句中改变自变量而不改变调用方式。
变量的调用仅仅在函数子程序内部有效,但全域变量可以在整个程序中有效。
当一个描述语言程序文件被调用时(通过run命令),从这个文件的开头开始执行。
一个函数子程序定义语句也可以放在文件的开头,如果这样,必须定义一个变量名,这个变量将被任何’run’命令选项初始赋值,如果没有’run’命令选项,这个变量将初始赋为空字符串。
10、赋值语句
赋值语句的格式为:
变量名=表达式
表达式进行运算后,将结果赋予所指定的变量。
11、人机对话语句
'say'语句的语法为:
say表达式
这样,表达式的结果就写在屏幕上:
‘pull’语句的语法为:
pull变量名
程序运行到pull语句时,执行暂停等待用户键盘输入,按回车后,输入的内容就赋值给所指定的变量。
14、在描述语言程序中执行GrADS命令
指令语句仅仅包含一个表达式:
表达式:
在描述语言程序中执行GrADS命令是首先运算表达式,然后将结果字符串作为命令提交给GrADS。
注意:
1)当语句被执行后,GrADS命令的结果将输入到描述变量’result’(这时,’result’的字符串是GrADS命令执行后显示在屏幕上的内容)。
2)描述变量’rc’中则是GrADS命令的返还码。
’result’变量中,可能包含几行GrADS结果字符串,这可以利用’sublin’函数分离。
可以在描述语言环境中执行任何GrADS命令,包括run命令。
由执行run命令而产生的结果字符串将通过’return’命令从“低层”的描述语言程序传递回“高一层”的程序中。
你可以一层一层地调用多个描述语言程序,但要能控制不出现死循环而返还主调程序。
五、内部函数
目前描述语言中有几个内部函数:
1、substr(string,start,length)
这个函数可以从字符串’string’中从位置’start’开始截取长度为’length’的子字符串。
如果字符串’string’太短,结果字符串就短于’length’或得到一个空字符串。
这里,'start'和'length'必须是整的字符数目。
2、subwrd(string,word)
这个函数可以从字符串’string’中截取第’word’个词(词与词之间由空格分隔),如果字符串’string’太短,结果是一个空字符串。
'word'必须是整数。
3、sublin(string,line)
这个函数可以从字符串’string’中截取第’line’行的字符串,如果字符串’string’行数太少,结果是一个空字符串。
'line'必须是整数。
4、read(name)
读函数,可以读取文件’name’中的一个记录(一行),重复调用同一文件的’read’函数,将依次读取文件中的下一个记录。
所得结果有两行,第一行是返还码,第二行是所读记录。
每个记录的长度不能超过80个字符,可以使用'sublin'函数分离结果。
当第一次调用’read’函数读取一个指定文件时,这个文件就被打开,当描述语言程序执行终结时文件被关闭。
而在文件被多次调用过程中,始终保持打开状态。
返还码是:
0-正常
1-打开文件错误
2-文件结束
8-打开的文件用于写入
9-输入、输出错误
5、write(name,record<,append>)
写函数,当第一次调用’write’函数时,会生成一个文件名为’name’的文件,并处于打开的写入状态。
如果这个文件早已存在,这个文件会损坏。
如果使用’append’选项,写入的内容就会接到原来文件的后面。
返还码是:
0-正常
1-打开文件错误
8-打开的文件用于读取。
6、close(name)
关闭文件名为’name’的文件。
如果你想从一个刚写的文件中读取记录,那么首先要调用’close’函数关闭该文件。
返还码是:
0-正常
1-文件没有打开
六、全域描述变量
描述变量通常仅在所在的函数子程序中有效,全域描述变量可以在整个程序中都有效。
它们是通过文件名的格式来定义是否全域描述变量。
任何变量名前加上一个下划线(_)就假设为全域描述变量,就使它的值在整个程序中都有效(类似于FORTRAN程序中由公用语句块定义的变量)。
注意:
全域变量不能用于函数子程序的函数自变量。
如:
下面的用法是不允许的。
functiondostuff(_var)
七、描述语言程序的自动执行
你可以让每个display命令前自动执行一个简单的描述语言程序:
setimprunscript-name
这个命令通常用于每次执行display命令后都要重新设置的命令,如:
'setgradsoff'
你可以从这个程序中执行任何GrADS命令,但有时会遇到一些问题,例如:
在这个程序中出现一个display命令,这时将会无限制地显示图形。
程序举例
1)‘opendata.ctl’
‘setlev300’
‘enableprintstream.gmf’
i=1
while(i<=120)
‘sett‘I’’
‘du;v’
‘drawtitle300hPastreamfieldNo.’I’’
‘c’
i=i+1
endwhile
2)'reinit'
'openk:
\baoxue\uwndbdp.ctl'
file='k:
\baoxue\g.txt'
'setgxoutprint'
'setprnopts%g93u'
'duwnd'
rc=write(file,result)
rc=close(file)
;
3)
‘
6)自定义函数子程序
自定义函数子程序是GrADS编程中的重点也是难点。
函数子程序的定义形式为
Functionname(args)
…
Return(expr)
其调用形式有两种[2],
1、一种是明举式参数传递,
如isen.gs,这种函数子程序要和主程序放在一个文件中,主程序调用形式为
1)‘d’isen(w,t,pp,320)
2)rc=isen(u,t,pp,320)
3)‘definexs’=isen(w,t,pp,320)
其中,isen.gs定义内容略。
2、另一种是隐式参数传递,
如cbarn.gs,主程序的调用方式也有两种,若独立保存为一个cbarn.gs,其调用方式为
‘runcbarn.gs(0.815.50.5)’
若拷贝到主程序所在文件,其调用方式为
rc=colorbar(‘0.815.50.5’)
注意:
'cbarn0.81.55.50.5'中,
0.8指定了标尺宽度,0.5指定了距离横轴的距离
下面以绘黑白阴影图型为例,简单介绍如何定义和调用函数子程序,通过该例也可学习如何定义和使用新的颜色(图2)。
‘reinit’
‘opend:
\llp\data.ctl’
‘setgxoutshaded’
pp()*调用自定义的函数子程序
ss()*调用自定义的函数子程序
‘dsmth9(olr)’
‘cbarn’*调用已存在的gs文件形式的函数子程序,用于绘阴影图标
‘setgxoutcontour’
‘setclevs-0.06-0.0300.030.06’
‘dsmth9(olr)’
‘dsst’
Functionpp()
*设置新的颜色,颜色号为16-18
‘setrgb16505050’
‘setrgb17100100100’
‘setrgb18150150150’
return
Functionss()
*设置阴影图的等值线和所填的颜色
‘setclevs-0.06-0.0300.030.06’
‘setccols1716001617’
return
图2使用新定义的黑白颜色绘图
例2
'reinit'
'openk:
\rt\sy.ctl'
'enableprintk:
\rt\sy.gmf'
****SouthChina
**Decprep
'setxlopts140.15'
'setylopts140.15'
'setclopts140.10'
'setxlaboff'
'setaxlim-2050'
'setyaxis-205010'
'setxaxis195120074'
'setgridoff'
'sett157'
'a1=34.63'
'b1=-34.63'
'setcthick10'
'setcstyle1'
'setccolor1'
'setcmark1'
'setgradsoff'
'drs12'
'setcmark2'
'setcstyle2'
'setcthick10'
'setccolor2'
'drs1'
'cbar_line-c12-m12-l12-t"line1""line2"-p'(作图前在屏幕上点击)
'print'
'disableprint'
pulldummy
return
小结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十章GradsGrADS 描述语言及编程 第十 GradsGrADS 描述 语言 编程