10.开始分析
10.1 概述
所有的计算程序都需要其数据输入文件。输入通常由符合 CADINP 语言语法格式的语句组成。
在一个项目中通常需要执行多个单独的模块。而一个完整的分析则要求模块间的交互。在 这种情况下,通常的步骤是程序在收集了一个或数个文件的全部数据后,通过数据内相应的记 录对相应的程序进行调用。
因此,一个完整的输入文件应当具备以下结构:
PROG AQUA
$ 材料和横截面定义 $
END
PROG S O F i M S H A
$ 有限元系统输入数据 $
END
PROG ASE
$ 程序STAR2中的输入数据, 第一荷载工况$
END
PROG ASE
$ 程序STAR2中的输入数据, 第二荷载工况 $
END
SYS COPY *. plb d : $ 复制报告文件$$ else ... $
PROG WING $ 模型及报告显示 $
END
输入文件的第一行应预留给 PROG。每个模块都可以被重复多次调用。程序中不同模块被执行的顺序则对应于这些模块的 PROG 顺序。如果用-PROG 输入代替+ PROG,相关联的模 块将在程序执行过程中被省略。因此,任意一个模块都可以被用户直接选择。
10.2 #DEFINE - 参数替换
SPS 还能够在输入文件中进行全局替换。关于文本块的说明必须在使用前定义。这需要通过使用#define text=name 来完成。文本块的名称可由最多 10 个不含$的字符组成,且首字符必须是字母。文本块的值可以是任意长度的文本。直到被替换之前,被赋值的参数都将不会被评估。用户可以对己赋值的参数进行重新定义。
在输入数据或块中的参数可以通过使用$(name)指定,在$与括号间不允许使用空格,括号中不区分大/小写字母。替换可以是递归的。如$(A$(INDEX))的定义是允许的。
例如:
$PROG (extension for TEDDY)
#define LENGTH=3.70
#define WIDTH=30
#define HEIGHT=50
#define PLATE=50 20 10 80
PROG AQUA CONC 1 B 25
STEE 1 BST 500
SREC 1 $(HEIGHT) $(WIDTH) SREC 2 $(PLATE) ASU 2.3 END
PROG SOFIMSHA SYST GIRD
NODE 1 0.0 0.0 FIX PP
NODE 2 $(LENGTH)/2 0.0
NODE 3 $(LENGTH)
BEAM 1 1 2 1
BEAM 2 2 3 1 END
与CADINP的 #()的变量,$() 变量被由字符串替换,所以用户可以插入文字或生成宏。
通常我们有两个默认的参数,即包含输出文件基本名称的$(NAME)和包含项目名称的$(PROJECT)。这些参数对 SYS 命令特别有帮助。
其中未在输入文件中定义的文本块可以使用下列 SET 语句来设置。 当给出命令(例如在环境中)时:
SET SIZE=LP O FORM ZTVK
SPS 可以通过适当的格式在任何文件中输入:
SIZE $(SIZE)
此外,可以在SOFISTIK.DEF文件中描述SPS的全局参数。 这导致三层的层次:
首先是输入数据中的定义
其次是SET的定义(要避免!)
最后是SOFISTIK.DEF的中定义
10.3 #INCLUDE - 块定义
通过使用块定义,多行数据可以在数据集中的任何位置重复使用。程序最多允许 256 个内部模块和无限个数的数据块以任意的顺序组合。在定义块时,块可以被递归调用 32 层。
#DEFINE name 块名称的起始 (最多八个字符)
#ENDDEF 块定义的终止
#UNDEF name 删除一个己定义的块
#INCLUDE name 从内存或文件名中插入一个的块名
使用块不仅省去了用户从复制重现输入行的繁琐,而且还允许使用子程序。
例如:
#define SECT
$PROG AQUA
$ TRAPEZOIDAL CROSS-SECTION PARAMETER BO,BU,H POLY UPZ
VERT 1 #1/2 -#3/2 2 #2/2 #3/2
CURF 3
#enddef
PROG AQUA STEE 1 ST 37
SECT 1 ; LET#1 0.60,0.20,0.60
#include sect
SECT 2 ; LET#1 0.60,0.30,0.60
#include sect
SECT 3 ; LET#1 0.60,0.30,0.70
#include sect END
当在 UNIX 中插入文件时,用户需要特别注意文件名中的字母的大/小写。程序对旧格式$BLOCK BEG/ END/ SET 仍然支持,但不应再使用。
10.4 APPLY - 计算过程中数据的整合
使用APPLY命令,文件可以包含在输入数据集中的两个块之间的任何位置,但不包含在模块内。 该文件应包含一个或多个调用+ PROG的模块。
使用#INCLUDE(参见10.3节:#INCLUDE - 块定义),数据在计算之前会被插入到数据集中,在计算过程中执行APPLY命令,即可以在计算过程中生成数据,然后将其插入正确的位置。
另外APPLY用符号+/-来控制,即+ APPLY执行命令,其中-APPLY将被跳过。
CSM程序(施工阶段管理器)是使用APPLY的典型案例。 使用CSM创建一个文件$(NAME)_csm.dat。 该文件与APPLY一起插入到计算中。
+PROG CSM
... END
+APPLY $(NAME)_csm.dat $ contains at least one +PROG
+PROG ASE
... END
10.5 #IF - 条件输入
通过使用 IF THEN ELSE 语句,较大的输入块可以被插入和删除。该语句不但比 CADINP中的 IF 语句更为复杂,但一些程序的调用可以在一个块中进行。
相关的控制语句与 C 语言中控制语句较为类似。例如:
#if expression
任意语句,包括PROG和SYS
#else
任意语句,包括PROG和SYS
“expression”可以仅是块或变量的名称,如果定义不为空集且不等于零,则对其值为真。但它也可以是一个比较$(MODE)== EC或$(MODE)<> EC或$(MODE)> 3。 词法上而言,该比较是纯粹基于字符串的。例如,A<B, A<BA, 10<18, 10.0>12。
若“expression”不为真,将跳过第一个块,将使用#else后的块。如不需要,可省略第二个块。
该创建最多可以嵌套32层。一个无心的#else或#ENDIF指令不但会导致错误,也会使得 构建未完成。
例如:
#define DOAQB=0
#if DOAQB
PROG AQB
HEAD .....
LC .....
DESI ..... END
#endif
PROG STAR2 HEAD .....
#if DOAQB
$ Design with AQB
#else
DESI .....
#endif
..... END
缩进仅用于可读性。 在上面的例子中,STAR2用于设计。 如果DOAQB = 1,则AQB用于设计任务。
10.6 模板
一种特殊形式的输入文件称为模板。 这些文件的结构如下:
#DEFINE L1=10.0
#DEFINE L2=20.0
#DEFINE L3=30.0
#DEFINE P=12.0
PROG TEMPLATE (或者其他程序名)
LET#L1 $(L1)
LET#L2 $(L2) LET#L3 $(L3)
LET#L #L1+#L2+#L3
TXA Introduction
<TEXT>
如下为一个三跨连续梁的分析:
L1 = <EDIT:L1>$(L1)</EDIT>
L2 = <EDIT:L2>$(L2)</EDIT> L3 = <EDIT:L3>$(L3)</EDIT> SUM = #(L,10.2)
</TEXT>
<PICT>
....
</PICT>
PROG AQUA
紧接所有数据
在许多情况下,这如同一个只包括分析序言的普通数据集。它被总结在一个名为模板的特 殊程序下。模板的输入仅限于文本、图片以及数学表达式。 这个机制是普遍适用于所有程序的。
在报告浏览器中,用户可以更改选定的参数并重新分析给定的模块。其他用户则可以直接使用这些复杂的宏,从而仅需定义较少的参数。
10.7 多模块的迭代分析
对材料非线性的二阶理论都考虑在程序 STAR2/AQB 之中。然而,STAR2 程序中只有一种能计算配筋的方法。用不同方法的计算可以通过 AQB 和 STAR2 之间的迭代来实现。迭代过程由 PROG 命令下的参数 ITER 进行控制。
PROG STAR2 一阶理论中的第一步
CTRL I 工况的定义
LC .... END
PROG AQB ITER parm 由空格分开的参数
BEAM ....; LC.... 分析设计中所针对的第一组单元
ULTI ....; NSTR.... END
BEAM ....; LC.... 分析设计中所针对的第二组单元
ULTI ....; NSTR.... END
PROG STAR2 ITER parm HEAD ....
CTRL II 1 END
迭代的次数是由参数 ITER 控制(如 ITER 30),其默认值为 20 次。
对于其他组合的通用模块,该机制已经扩展到第23次。如要终止迭代,则需要使用 CADINP 中的 EXIT_ITERATION 指令。
PROG TEMPLATE
STO#TARGET 0 ; STO#PARAM 1.0 PROG AQUA ITER
RCL#PARAM
QNR .... 使用#PARAM定义段
PROG AQB ITER
BEME .... 设计并保存结果
ENDE
@KEY / LET# TARGET ... 计算目标函数为零
IF ABS(#TARGET) < 0.001 EXIT_ITERATION
ELSE
STO#PARAM 新目标值
ENDIF
10.8 操作系统指令
任何在 shell 中的命令都可以集成到分析当中。对参数的替换也可使用这些指令,例如字符串$(NAME)被输入或输出文件的基本名称所替代,而$(PROJECT)则被项目名称替换。
*SYS command 当末尾的PROG行被激活时,指令才会在批处理文件中被执行
+SYS command 在所有批处理文件中的指令都将被执行
-SYS command 指令不会被执行,尾随*SYS的指令不被激活
例如:
+SYS del $(PROJECT).$D1 删除刚度矩阵
+SYS wait name.exe parameter WPS 将使得其它模块的运行一直等待,直到采用”+SYS -等待的 name.exe”启动的程 序继续终止运行为止
10.9 工作记录
在使用多个独立程序进行一个时程分析时,重建将会变得非常重要。因此,SPS 为己生成的输入文件增加了一些辅助信息。该信息由一个环境变量控制:
SET PSJOBINFO=n
n = 0 无信息
n = 1 文件名和数据 (only in data echo)
n = 2 与1类似,包括工作序号 (only in data echo) n = 3 与 2 类似, 但额外生成题头
该变量的默认值为 2,工作序号需由 8 字母和 1 个数字组成并被保存在一个 PSJOBNR 文 件当中。在多用户环境下,如访问冲突的情况,PSJOBNR 则需存储在当前文件目录下。
PSJOBNR 例子:
PROG AQUA
$ Datafile: D:\STATIC\P00\DAT0.DAT (.#01) 14:48:48 25/05/95 HEAD .....
PROG AQUA
$ Datafile: D:\STATIC\P00\DAT0.DAT (.#01) 25/05/95
$ Jobnumber: PC-Nr:17/8700063 14:48:48
HEAD .....
当 PSJOBINFO= 2 或更高时,则需要 PSJOBNR 文件。其中前 8 列可包含任何想要的 文本。如果 SPS 未找到 PSJOBNR 文件,它将会在本地目录中创建一个。
10.10 启动单个程序
如果输入文件己经包含了所有的参数替换,用户则可以直接启动某项程序。如需从一个正常的输入文件创建一个解析文件,可以通过 WPS 使用以下方式:
#endif File > 保存解析文件...
如果要保存完整的解析文件或者通过
File > 保存解析模块:name ...
如仅有一个模块需要被解析时,对模板的选择可以通过 WPS-树。
图10.1: 启动单个程序
某单个程序的启动则通过以下:
program filename [ -parm] [ projekt]
"filename"既为输入文件的名称,也指定了输出文件的基本名称。如果一个名称中包含空 格,则必须用"符号结束。Porject 为数据库的名称。通常,在一般的相同参数用于 SPS 中使用 的参数。一些额外的参数,但补充说。例如在控制时,什么类型的图元文件是要创建和现有的 元文件是否被附加或删除。
如不使用任何参数而开始分析一个程序,该程序仅会显示其名称,版本号以及可能的参数 列表。用户会被要求指明输入文件的名称。一个空的输入文件(或 Return 键)将立即结束该 程序。该步骤可以用于测试程序的完整性。ERR 文件的版本以及许可都将进行检查。
10.11 特殊情况下的启动
特殊情况下,用户可以从一个 shell 命令、通过指定以下的参数行来启动程序: