umat自学整理

更新时间:2024-05-06 23:50:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

什么是UMAT?v. l4 W* F9 T% r

UMAT:[user defined material mechanical behavior]用户材料子程序,是ABAQUS提供给用户自定义材料属性的FORTRAN程序接口;注意是接口程序,真正的定义材料的力学行为即属性,是用户自己编译的FORTRAN程序来实现的UMAT通过与ABAQUS主求解程序的接口实现与ABAQUS的数据交流+ ^7 P' Z1 ?.

UMAT功能简介![摘自庄茁老师的书]

UMAT子程序具有强大的功能,使用UMAT子程序:

(1)可以定义材料的本构关系,使用ABAQUS材料库中没有包含的材料进行计算,扩充程序功能。ABAQUS软件2003年度用户年会论文集, I* A: (2)几乎可以用于力学行为分析的任何分析过程,几乎可以把用户材料属性赋予ABAQUS中的任何单元;1 K\/ X2 \\

(3)必须在UMAT中提供材料本构模型的雅可比(Jacobian)矩阵,即应力增量对应变增量的变化率。) z: w# Q. H/ W0 d+ M* J; f

(4)可以和用户子程序“USDFLD”联合使用,通过“USDFLD”重新定义单元每一物质点上传递到UMAT中场变量的数值。

UMAT开始的变量声明6 p4 q/ a\

由于主程序与UMAT之间存在数据传递,甚至共用一些变量,因此必须遵守有关书写格式,UMAT中常用的变量在文件开头予以定义,通常格式为:& Q9 ?+ o6 Y- w3 Q4 i: h) C

SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD, 1 RPL,DDSDDT,DRPLDE,DRPLDT,\ w/ X+ {$ C; M

2STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME3 u. _1 T' v5 y7 J0 y' Y) z8 K

3

NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,

4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC) E1 o' B4 H! Y- y6 R1 F1 w C

INCLUDE'ABA_PARAM.INC'-----此处是将ABAQUS本身自带的参量精度定义的文件包含进来[后面详说]

C

CHARACTER*80 CMNAME

DIMENSION STRESS(NTENS),STATEV(NSTATV),

1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS), 2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1), 3 PROPS(NPROPS),COORDS(3),DROT(3,3),DFGRD0(3,3),DFGRD1(3,3) -------------------------------以上是变量声明吧!

user coding to define DDSDDE,STRESS,STATEV,SSE,SPD,SCD

and,if necessary,RPL,DDSDDT,DRPLDE,DRPLDT,PNEWDT( j9 l W( I' n& u -------------------------------此处,看来是将用户定义材料属性的fortran程序编入

' J. O* d0 B! O

RETURN------------------这是返回值 END------------------------结束

UMAT中各个变量的详细解释[凡是-注明david的,都是我自己猜的,仅供参考]

DDSDDE (NTENS ,NTENS)

是一个NTENS[Number of the Tensions----david]维的方阵,称作雅可比矩阵,应力增量/应变增量的偏导数,DDSDDE (I ,J)表示增量步结束时第J个应变分量的改变引起的第I个应力增量的变化!雅可比是一个对称矩阵,除非在“*USER MATERIAL”语句中加\参数+ z) D0 \\/ c$ N, E+ f

2 x2 N) O' Q. ` ~# S

STRESS (NTENS)1 t5 A, q- R, @* N4 K

! B) |3 C1 E3 @6 d( Z1 I\应力张量矩阵,对应NDI[Number of the Direct Components--david]个直接分量和NSHR[Number of the shear Components-david]个剪切分量.在增量步的开始,应力张量矩阵中的数值通过UMAT和主程序之间的接口传递到UMAT中,在增量步的结束,UMAT将对应力张量矩阵更新,即[return].对于包含刚体转动的有限应变问题,一个增量步条用UMAT之前就已经对应力张量进行了刚体转动,因此在UMAT中只需处理应力张量的共旋部分-------这部分我没看明白,敬请高手指点.UMAT中应力张量的度量为柯西(真实)应力/ _. {- m% e- H7 o9 [# H& `. a: {% Y 。

4 A$ x- H- w0 \\, _

STATEV (NSTATEV)[STATE VARIABLES (Number of the State Variables)]! A: J) a9 G0 V5 o: e3 J) B\

用于存储状态变量的矩阵,在增量步开始时将数值传递到UMAT中。也可在子程序USDFLD或UEXPAN中先更新数据,然后增量步开始时将更新后的数据传递到UMAT中。在增量步的结束必须更新状态变量矩阵中的数据。

和应力张量矩阵不同的是:对于有限应变问题,除了材料本构行为引起的数据更新以外,状态变量矩阵中的任何矢量或者张量都必须通过旋转来考虑材料的刚体运动。-----不懂,请高手指教9 N# V/ f4 Y- R$ u

状态变量矩阵的维数NATATEV,等于关键字“*DEPVAR”定义的数值。状态变量矩阵的维数通过ABAQUS输入文件中的关键字“*DEPVAR”定

义,关键字下面数据行的数值即为状态变量矩阵的维数。

材料常数的个数,等于关键字“*USER MATERIAL”中“CONSTANTS”常数设定的值。+ b9 h$ T s2 v# A4 @

PROPS (NPROPS); n3 y2 C8 d; d0 G: K( m# }& x

材料常数矩阵,矩阵中元素的数值对应于关键字“*USER MATERIAL”下面的数据行。# R' ~* h' _# H. E7 Y

) Y, w: t, @- F! C2 Z' o& }+ ]

4 `7 N# L* j G\

SSE,SPD,SCD

分别定义每一增量步的弹性应变能[Elastic Strain Energy],塑性耗散[Plastic Dissipation]和蠕变耗散[Creep Dissipation]。它们对计算结果没有影响,仅仅作为能量输出。

: S: e. n0 n! [3 `+ v+ Z$ ~* I/ B9 v7 b; X8 Y+ _; {

STRAN (NTENS):应变矩阵;. b3 u\

DSTRAN (NTENS):[D--大抵代表Deta,增量的意思-david]应变增量矩阵;

: ^2 E\3 D0 |% p& u- p, N& |

DTIME:增量步的时间增量;

. L: B2 z0 e+ W4 `0 S+ E4 Q) u

NDI:直接应力分量的个数;

2 c) o' K/ Z+ R# f' N# Q3 {: d3 m

NSHR:剪切应力分量的个数;3 J# L3 _ f\

NTENS:总应力分量的个数,NTENS =NDI +NSHR。 关于沙漏刚度控制和横向剪切刚度

9 E/ w; Q6 o8 ^: c

使用UMAT时需要注意单元的沙漏控制刚度和横向剪切刚度。通常减缩积分单元的沙漏控制刚度和板、壳、梁单元的横向剪切刚度是通过材料属性中的弹性性质定义的。这些刚度基于材料初始剪切模量的值,通常在材料定义中通过“*ELASTIC”选项定义。但是使用UMAT的时候,ABAQUS对程序输入文件进行预处理的时候得不到剪切模量的数值。所以这时候用户必须使用“*HOURGLASS STIFFNESS”选项来定义具有沙漏模式的单元的沙漏控制刚度,使用“*TRANSVERSE SHEAR STIFFNESS”选项来定义板、壳、梁单元的横向剪切刚度。- d0 m* E7 W# V1 s3 ^ m1 C

% ?0 o. ~0 e$ R8 N! I, h/ u

------------; n\, m

一个问题:得不到剪切模量的数值0 W: T: E, m9 E* j 和

解决方案:用户必须使用“*HOURGLASS STIFFNESS”选项来定义具有沙漏模式的单元的沙漏控制刚度,使用“*TRANSVERSE SHEAR STIFFNESS”选项来定义板、壳、梁单元的横向剪切刚度

关于UMAT的流程图和参数表格实例

0 h F0 b2 X) ]. U4 {% K$ x2 Y/ z

跟大家说说所谓的接口程序Interface--FORTRAN的知识( {. \\# K- }\, p* E M9 I

6 }0 X9 |+ `# `! m5 o' `* e: O0 C | : [* a+ d! l; B/ S9 F # [) H r9 o: B4 r

在Fortan语言中,主调程序和被调程序是分别编译的.由于Fortran90对过

程的许多功能做了扩充,有些功能单靠简单的调用语句已经无法反应,因而系统也就无法进行正确的编译,这时需要在主调程序中加入interface接口块,通过它为主调程序和被调程序指明一个显示的接口.如果被调用中哑元含有假定形状[assumed-shape]数组,或可选变元,或含键盘输入的参数,就需要interface接口块说明.一般来讲,在Fortran90程序之间需要提供interface块有三种方法:

1.将interface接口块直接写入调用程序,并复制被调用程序的参数列表这种方法简单易用,但也相应增加了维护代码的工作量,因为只要被调用程序的参数列表发生变化,就必须相应改变interface接口块和调用[call]语句.4 V& @& k g& m X

2.可以将一个软件包中所有程序的interface块写入一个模块中,该模块被软件包中的所有程序使用.这样做的优点是只需一个模块来检查interface定义,缺点是仍需对此模块和调用语句进行维护.0 e9 b5 |: I- \\7 s; M 3.Fortran90编译器可在contains语句后自动提供过程之间的interface块,这种interface块可用于使用模块的任何程序.

建议在同一个软件包中使用2\\3的形式,在调用软件包的入口程序时采用1\\2的形式!7 {8 @1 D, a. g

[是不是在UMAT中,我们所编译的带接口的Fortran程序为调用程序,原ABAQUS主程序为被调用程序,调用程序中的第一部分我们先复制被调入程序的参数列表????????似乎和ABAQUS主程序调用UMAT有些相反了???????不过个人认为interface作为一个接口块,在Fortran语法中应

该放在主调程序中,且复制被调程序的参数列表.而UMAT的参数变量的声明,只不过是为了和ABAQUS使用一致的变量格式,当Fortran程序处理完材料的本构定义之后再以这一致的形式将变量值返回到ABAQUS主程序中吧]

关于Fortran77的一些有用的简介[1]:+ z+ D9 l! b4 [

Fortran77的基本结构:: c0 m( m) a' f% u8 V

( U# ?; }3 y& h, Z9 F, a, X

1.

一个Fortran源程序由一个或者多个程序单位组成,每个独立的程序单位以'end'语句结束

2.

每个程序单位包括若干行[不能一行写多条语句,但是可以一个语句写成行];分为语句行[执行语句行和非执行语句]和非语句行[注释行]

7 Y( J/ p! C Z\

源程序的书写格式:7 S, W/ C\

d6 K! v d. ^& k( ~

1. 2. 3. 4.

不区分大小写:每行只能80列以内,并把80列分为四个区 1-5列:标号区[1-5位整数;第一列为'*'或者'C'时,为注释行] 第6列,续行标志区[非空格或非0;最多19个续行] 7-72列:语句区[书写语句:一行只能写一个语句]

5.

73-80列:语句注释区[一般做编号注释]

程序的编辑与运行:: ]! u: i5 F8 [\

创建源程序文件并编写源程序 编译并连接源文件

运行程序编译生成的可执行文件

1. 2. 3.

% A) V1 L\

常量:

; n! a+ ?6 Q& \\) A1 z# i

六种1 q$ a0 }% g a

\

1. 2. 3. 4. 5. 6.

整型常量[Integer]4位:正\\负整数和0 实型常量[Real]4位:小数和指数形式 双精度常量[Double precision]8位 复型常量[Complex]8位 逻辑性常量[Logical]4位 字符型常量[Character]1位

/ S( V1 }\

变量

6 x; |1 n; R f0 c5 B p, B3 w

?

变量名

1. 2. 3. 4. 5.

第一个字符是字母第一个字符后可跟1-5个字母或者数字 不区分大小写 空格不起作用

允许变量名与语言中具有特定含义的字同名,但尽量不适用 尽量\见名知义\

6 K X6 H$ V7 p6 f9 o

?

变量类型

) a# Q+ h' R [& C

不同的变量类型用来存放不同类型的常量数据.变量相应的也有六种;变量在使用前必须首先对其进行类型说明,三种说明方法:

; ^4 v( E+ O& q4 L$ f/ o# h$ H. b

按优先级别排列

1. 类型说明语句:类型 变量名列表,多个变量名之间用逗号隔开,如 REAL A,B,C

DOUBLE PRECISION X,Y,Z[或者REAL*8 X,Y,Z]

CHARACTER*5 [缺省字符长度5 ] STR1,STR2*8,STR3*19

[此处,STR1未指明长度,则默认使用缺省长度5;STR2的长度为 8;STR3的长度为19]

5 C! A+ D. Y( J- z5 h

2. IMPLCIT语句:IMPLICIT 类型[字母表],类型[字母表],....

如: IMPLICIT REAL(A-D),INTERGER(I-M),DOUBLE PRECISION (X,Z)

3. I-N规则:Fortran规定,不加说明的情况下,I-N为整型,其他都为实型' {/ |* | R- y* Q; {: _' _9 ?

8 s1 _7 M. U3 b8 e2 d. I

几点说明

类型语句说明位于所有可执行语句的前面;IMPLICIT语句位于最前面;1 g. ^1 r# ?6 q: ]+ q& h/ T% m0 }. ^

IMPLICIT NONE取消IMPLICIT说明和I-N规则,所有的变量必须显式说明;只在本程序单位有效.

关于Fortran77的一些有用的简介[2]:

算术表达式:9 W4 c7 z: S: R9 }& J# X

运算符: +, -, *, /, ** 优先级: ( ), ** , *\\ / , +\\- 书写问题

1. 2. 3. 4. 5. 6.

1. 2. 3.

* 不能省略

括号不分大小写,成对出现 多次乘方,按'先右边后左边'处理 运算符不能连续出现,要用小括号隔开 运算顺序

)---->函数---->**----->*,/----->+,-

运算中的类型问题:运算类型相同:结果仍为原类型;不同,则自动转换成同一类型

7.

误差问题:

1.

溢出:超出有效数字范围-------->解决:很大或者很小的数用实型的指数表示

2.

误差:由于有效数字的位数限制,实型数运算存在误差-------->解决:转换成双精度型或者避免因为书写不当造成有效数字的丢失

+ l1 e. C) Y7 {

简单输出\\输入语句:4 G+ S+ |/ b. t\

输入\\输出三要素:对象[哪些数据];格式;设备.

输出语句9 w% C; J P% o* |9 r6 W\

' m! r; ]% N1 P$ H, l

输出语句的分类:格式输出'表控格式输出[系统标准格式];无格式输出[二进制]

1.

表控输出语句:按计算机系统规定的格式输出:系统自动为每种类型的数据规定了列数

1.

整数的表控输出格式[与具体的计算机系统有关]:规定每个整数占13列,打印在右端,左补空格;

2.

实数的表控输出格式:规定每个实数占17列,打印在右端,左补空格,小数部分占7列;[当实数的绝对值>=10**7或<1时,按标准的指数格式输出,共占15列,指数4列,小数6列

2.

表控格式输出语句:

1. 2.

print*,<输出表列>: print*,56.8,125 write(*,*)<输出表列>

输入语句

2 i& M# C) O' Q X

输入\\输出三要素:对象;格式;设备. 分类:同上

1.

表控输入语句

1.

自由格式输入-->语句:read*,<输入表列>;read(*,*)<输入表列>

2. 3. 4.

输入数据以逗号或者空格作为间隔 变量名称为输入表

输入的数据应和输入表的变量个数\\类型\\次序严格地一一对应;少了,程序停止,等待继续输入;多了,程序继续进行,多余的不起作用;较多的数据可以几个一组,回车,再输入几个一组,回车...

5. 6.

重复数据,可以7*3---->7,7,7

每一个read(*,*)和write(*,*)语句从一个新的记录[以回车结束的一批输入\\输出数据]开始读数\\输出

1. 2.

例如:read(*,*) A,B,C read(*,*) D,I,J

3. 4. 5. 6. 7. 8.

输入: 2.3,-63.5[回车] 6.4,91.0[回车] 5,8[回车]

结果: A=2.3,B=-63.5,C=6.4, [从新记录开始读数] D=5.0,I=8,J未被赋值

PARAMETER语句

! b. q/ W9 X: ]# v% x, B9 y

作用:将程序中经常用到的参数或字符串定义成一个符号常量,其值不可改变.

语句:parameter(p1=c1,p2=c2,...,pn=cn) 注意:

1.

符号常量的命名规则与变量名相同,但在程序中其值不可改变,也不能赋值;

2. 3.

符号变量也有类型,可用前面的三种类型说明方法说明类型; 参数语句是非执行语句,位于所有可执行语句的前面,单位与类型说明语句的后面;

4. 5.

一条语句可以定义多个符号常量; 优点:方便修改程序

C8 n+ x A\

END,STOP,PAUSE语句% N\

2 B2 w* @* d# E) B1 A+ o3 `

END语句:结束标志,有且仅有一条2 W2 U; M) [! Q9 X

PAUSE[n]语句:暂定执行;用于调试程序,n可以是一个字符串或不超过5位的数

STOP[n]语句:停止运行语句;用于调试程序,n可以是一个字符串或不超过5位的数) }+ n. j2 J. D6 ?

\

1.

关于Fortran77的一些有用的简介[3]:e0 e; C4 C7 K& d# g6 a

1 I. ?& Q+ @- E7 ]

逻辑运算和选择结构\

( ~4 l# t( N) | s% C- d

?

关系表达式

1. 2.

构成选择判断的基本式子 关系运算符:

1. 2. 3. 4. 5. 6.

.GT.[greater than] >

.GE.[greater than or equal to] >= .LT.[limiter than] <

.LE.[limiter than or equal to] <= .EQ.[equal to] = .NE.[not equal to] ≠

3.

一般形式:<算术量或者算术表达式><关系运算符><算术量或者算术表达式>

4. 5.

$ v2 G& C. q& x- N

运算结果:逻辑值:真[.TRUE.]\\假[.FALSE.] 运算顺序:算术运算>关系运算

?

逻辑表达式

1.

运算符:

1. 2. 3. 4. 5.

.and. .or. .not. .eqv.逻辑等 .neqv.逻辑不等

2.

一般形式:<逻辑变量\\逻辑常量\\关系表达式><逻辑运算符><逻辑变量\\逻辑常量\\关系表达式>

3. 4. 5.

结果:逻辑值:真[.TRUE.]\\假[.FALSE.]

运算顺序:算术运算--->关系运算--->逻辑运算 逻辑运算优先

级:.not.--->.and.--->.or.--->.eqv.--->.neqv.

?

? ?

关于Fortran77的一些有用的简介[4]:

- ^* Y4 h B$ L$ r

IF类选择结构. ]# A# o# F: L. l

?

用块IF实现选择结构:三种典型形式

1.

3 a) T# E' |, ?; L! W; H/ D

基本形式

1. 2. 3. 4. 5. 6.

IF(条件) THEN (块IF语句) 块1 (THEN块) ELSE (ELSE语句) 块2 (ELSE块) ENDIF (ENDIF语句)

说明:IF...THEN语句为块IF结构的入口语句;ENDIF语句为出口语句,必须一一对应,配对使用3 t0 k B\T4 T* O

2.

简单结构7 u3 o9 u, m0 q; T8 g, k7 A) y6 l

1. 2. 3. 4.

IF(条件) THEN 块 ENDIF

说明:没有else块7 P6 @3 a0 g* A. J

3.

嵌套结构\

1.

IF( ) THEN

2. 3. 4. 5. 6. 7. 8. 9.

块1

ELSE IF( ) THEN 块2 ...

ELSE IF( ) THEN 块n

[ELSE 块n+1] ENDIF

?

逻辑IF语句

只用一行表示一种选择结构,当且仅当条件成立时执行,并且只执行一条语句;

IF(条件) 语句8 v% e+ P; \\2 T

( W2 B, Q\

?

算术IF语句

IF<算术表达式> N1,N2,N3& b; P5 c+ U$ ]/ ^4 V 当算术表达式的值

<0执行标号为N1的语句;

=0执行标号为N2的语句; >0执行标号为N1的语句;

关于Fortran77的一些有用的简介[5]:

/ b: l7 }8 V1 _6 r- `$ H0 h& A( i9 N ) d) \\5 R! x1 x7 c' D8 c

循环结构

8 R0 ^9 g\

?

结构形式:循环体[由一些可执行的语句组成]+循环控制语句[控制循环的开始和结束]

?

分类:条件型循环和计数型循环[DO循环]

2 ^: |0 d5 p9 K3 O& L

GOTO语句实现循环

1 R/ K a K( P/ v; Q. v

? ?

一般形式:GOTO 其中:S1为语句标号

功能:程序执行到此语句时,无条件的转向标号为S1的语句

& P1 r8 j2 e9 F9 v/ Q

DO语句实现循环

8 S) m$ u9 i: V U; @8 p; ~( Q

? ? ?

当循环的初值\\终值\\循环次数都已知时,可用; 组成:一个DO语句和循环体组成 一般形式:

DO S1 I=E1,E2 [,E3] ...... S1 <终端语句> DO I=E1,E2 [,E3] ......ENDDO4 Z1 T* o8 Z A8 b

例如4 s% Y) X$ e1 z

DO 10 I=1,19,2 DO 10 I=E1,19 ,2 SUM=SUM+1& ]. y7 T7 f% |7 ~. g5 d. {; J 10 SUM=SUM+1 S1 CONTINUE DO I=1,19,2 SUM=SUM+1$ k3 p7 ^6 p\f3 V; f ENDDO& {. o, }) e! G4 `* K & D+ e# G% X( n3 z8 E: H $ R! v# t5 \\% V4 J! Y3 C8 A; i% K2 h! I! } ?

说明

1. I为循环变量,S1为语句标号,是本程序单位中另一可执行语句的标号;

2. 步长可以省略,缺省值=1;

3. 循环初值[E1],终值[E2]和步长[E3]都可以是常量\\变量\\表达式;

4. 由于实数在内存中存储的误差,I,E1,E2,E3尽可能用振型量 5. E1,E2,E3都可正可负,E1,E2,可为0,但是E3不能为0.

?

具体执行过程

1. 执行DO语句,首先计算表达式E1,E2,E3的值,若他们的类型

与循环变量I不一致,则自动转换成循环变量的类型 2. 将E1的值赋予循环变量I,及执行赋值语句:I=E1; 3. 计算循环次数:R=MAX0(E2-E1+E3)/E3,MAX0表示从多个整型变量中取最大的一个;

4. 检查循环次数:若R=0则不执行循环体内的语句,跳出循环;R≠0 则执行循环体内的语句

5. 执行循环终端语句:I=I+E3,即是循环变量获得一个新值,而循环次数R自动减1;

6. 返回步骤4,继续执行,直到R=0.

5 t5 B/ n% D, Y) _4 ]' v9 Y

CONTINUE语句 _% U9 A5 g4 J

?

循环终端语句必须是可执行语句;那么,这种作为循环终端的语句具有双重作用:一是作为循环终端的标志;而是要完成自身的功能.因此影响了程序的可读性.FORTRAN用一个专门的语句作为DO循环的终端语句,即CONTINUE语句.它自身没有任何功能.( B% P8 r9 I5 W9 Q

9 i# ~3 p6 Q. t& M: Y

9 J- P8 Y/ Q* w; o) e8 e9 R?

一些规定

1. 循环变量在循环体内只能被引用,不能被赋值;

2. 在执行DO循环体期间,E1,E2,E3的值不能被改变,因为他们决定了循环的次数

3. 离开DO循环后,循环变量可以在循环体外被引用,它的值为脱离循环时最后一次被赋的值;

4. 程序中用到转移语句,规定:只允许从循环体内----->体外;反之不行;

5. 循环终端语句必须是除GOTO,块IF,ENDIF,END和STOP语句外的任何可执行语句3 N3 L2 {8 g# v4 n\

) N5 ]9 A. U+ J/ g4 Q/ p/ z; ^

DO循环的嵌套

\?

在一个DO循环中还可以包含一个或者多个完整的DO循环,这就是DO循环的嵌套.

一般形式:& J) b8 u8 S\ DO 10 I=1,10

.9 M9 f9 r3 D; Q$ h- T; y .! I6 Q; n. o( u$ S2 o2 p .5 h/ J9 |# Z3 k( u- F' l. g DO 20 J=1,10 .9 S* X! R- T3 w5 R0 ]9 ` .9 N- l, K$ Q8 j, P1 b .# ^7 K9 @6 }+ N7 _7 O ~( }) p 20 CONTINUE, }1 {; Y. h4 H$ C0 h7 I . . .

10 CONTINUE( L/ w3 n8 h* k6 ~\ 说明:% I$ b' Z1 ^# U( g1 X\

嵌套要完整,不能交叉

循环变量的名字,规定:并列的循环:循环变量的名字可以相同;嵌套的循环:循环变量的名字不可以相同

?

? ?

若多层循环的结束语句在同一个地方,可以共用一条CONTINUE语句

?

控制转向语句的使用[体内----->体外]2 E' Y8 E6 T5 v1 ?9 y% e7 b

8 b- P3 i- ?4 r% j0 ]6 e

3 L8 J: V: o9 h% D5 J# j# ?当型循环的实现

在无法确定循环次数的情况下可以使用当型循环.当型循环是指执行循环体要依据实现给定的条件:当条件成立时执行循环,否则不执行.9 }% e5 K! N9 k5 E1 a# g

?

用DO-WHILE语句实现当型循环

一般形式:\ DO S1 [,] WHILE(条件) .... z/ ]& |& @5 q/ ^9 f7 {% s7 t# M S1 <终端语句>

用块IF和GOTO语句实现循环

?

一般形式:: L1 L. E1 d) f4 `2 C3 ` S1 IF(条件) THEN 块/ M' }4 Q& y( b% u8 Y3 e8 X% V GOTO S1

ENDIF3 T! a% H6 `8 v. `4 ^- _5 s% t% Z

$ h. M5 d9 V# @% p u4 Y

直到型循环的实现

所谓直到型循环,是指先执行循环体,再判断条件.如果条件为'假',继

续执行循环体,直到条件为'真'时终止循环.. i5 C+ Z! d7 r0 X5 g, I* j* a

用逻辑IF语句实现:

?

S1 循环体

IF(条件) GOTO S1

几种循环形式的关系和比较0 Z0 X) H3 Y' W

DO循环适用于已知循环次数的情况 几种循环可以互换

? ?

DO循环:条件型循环[可用次数作为条件]6 J/ u# N* P* N( w1 i/ j0 o4 U 当型循环:直到型循环9 J S+ F5 d5 g8 g- o! V9 T( e$ _ 当型:块IF语句(单边)+GOTO语句(先判断后执行)

直到型:逻辑IF语句+GOTO语句(先执行后判断)! d# t3 F3 W; G4 B

各种循环可以相互嵌套

?

5 N: F9 t4 \\+ o

+ Z2 f5 H% \\& R1 V0 M B2 H3 n( k3 `! H

5 p, E\@. ^. v

关于Fortran77的一些有用的简介[6]:$ z1 }& d7 D& D'

数据的输入和输出5 @0 q$ g& {, N( }0 u

; \\ [0 c$ z$ U2 l; e

数据输入\\输出需要确定的三个基本要素: 输入\\输出的设备8 E3 ?- N1 V' G# d3 x, B) Q 输入\\输出的格式 输入\\输出的数据

系统中隐含的输入\\输出的设备为:键盘\\显示器和打印机

[说明:####(设备,格式)数据列表,当设备显示为*,为默认设备输出,好像是显示器\\或默认设备输入,键盘吧;格式为*,默认格式输出\\输入-david]6 [ c9 T7 @: }

有格式的输出

% p/ |& ~; b9 G& H

输出语句的一般形式:

WRITE (*,S1) <输出列表>3 b5 G; R1 N# a S1 FORMAT(格式说明)# u, |6 V3 z s+ q/ Z 或者4 H7 h5 k7 W$ J0 Z$ O PRINT S1,<输出列表> S1 FORMAT(格式说明)

' @. L' M) o- u5 t: e- w$ S! g

格式说明符: 主要介绍:I,F,E,D,G,L,A,'(撇号),H,X,r(重复系数),/(斜杠)

I 编辑符(Integer); Z% X& z S( ^2 ]

作用:用于整型数据的输出.一般形式:Iw或Iw.m + z* E. w7 M& n: M3 l\ 其中:I表示整型输出,w为字段宽度,m表示输出数据的最少数字位数

&D) ]( T9 P- P$ E7 j3 t

注意:数据输出时,在指定的区域内向右靠齐;如果数据的实际位数大于指定的字段宽度w,则不输出数据,而在该区域内充满\号;当m大于数据的实际位数时,前面添0,若小于数据实际位数,则不起作用$ P( j1 f% X9 j0 j) }: K5 ~ 6 T- a' y9 v( n( `

F 编辑符(Fixed point number)+ _* g$ ^3 ?! l8 |' f 作用:用于实数的小数形式输出,一般形式:Fw.d

其中:F表示实数的小数形式输出;w为字段宽度;d为输出数据的小数位数& C0 E* _# L! m( D\

' w* f\

E 编辑符(IExponent)* V: P3 X$ d* j

作用:用于实数的指数形式输出,一般形式:Ew.d

其中:E表示实数的指数形式输出;w为字段宽度;d为数字部分的小数位数% N! l8 C* B9 L( q# g* j. I

注意:指数部分占4列,负号占1列,小数点前为0.如123.45--->0.12345E+03

D 编辑符(Double precision); p\

作用:用于双精度的指数形式输出,用法和E 编辑符相仿.一般形式w.d

3 I5 O6 b. z3 g/ R: n4 l& k0 b

G 编辑符

作用:由系统根据实际数据的大小来决定使用F编辑符还是E编辑符.一般形式:Gw.d

L 编辑符

作用:用于逻辑型数据的输出,一般形式w

其中表示整型输出,w为字段宽度$ W! z1 f5 r% N% e% z7 g; E, R8 w

, n3 L$ a' J8 W5 U

9 w9 b0 y5 ^- D5 r% }; yA 编辑符

作用:用于字符型数据的输出,一般形式:Aw或A) v% a2 S* a- Y9 f$ ~+ j

其中:A表示整型输出,w为字段宽度;若不指定,则表示按实际长度输出

7 o! n! x7 w# F7 w5 r9 M( I% V. D& y0 `

' (撇号) 编辑符

作用:用于输出字符常量,即把撇号内的字符串原样输出.

注意:如果输出的字符中包含撇号,则用两个连续的撇号代表一个要输出的撇号1 V4 t1 B* e8 r

z$ O) {& d+ }; Q

H 编辑符: z% W9 m2 ?- }9 d8 y

作用:用于输出字符常量.一般形式:nH7 A9 `0 a7 Q& H& D

其中:H表示输出字符常量;n为输出字符个数;str为输出的字符串(较少使用)

X 编辑符: s: H. T9 F$ Y% L- h; E3 M5 Y

作用:用于输出空格.一般形式:nX% _9 F! X j @' e: f5 s$ E& [ 其中:X表示输出空格;n表示输出的空格数 v5 t, y2 y8 h& T, K

重复系数r' `* Z1 ^* |9 z H6 }1 u

在format语句中,如果出现几个(或者几组)相同的格式编辑符,则可以利用重复系数而只写一个(或者一组)编辑符.) B9 m; A% F1 k6 A% z* q& f1 D, g 如FORMAT('A=',/,4(5(1X,F4,0),/))' ]! ~. D$ M5 C' f/ _, M# `

+ D' w, B: d. ?) R

反斜杠/编辑符

作用:结束本记录的输出,开始下一个记录的输出,通常指换行.

WRITE语句和FORMAT语句的相互作用& i* Q8 B7 F; a\\

WRITE语句的输出变量个数与FORMAT语句的编辑符(不含撇号,H和X)个数可以相等,也可以不等;如果编辑符个数多,则剩余的编辑符不起作用;如果变量的个数多,则当编辑符用完后,重新使用该格式说明,当如果格式说明含带重复系数的编辑符组,则格式说明用完后,只有最右面一个带重复系数的编辑符组(包含重复系数)及其右面的编辑符被重复使用.

可以有空格式说明,如FORMAT(),用于输出一个空行.8 }- z+ I' k3 h V

( }7 o$ _7 }. p0 s( D2 s! f7 e* h7 |2 K. n\

, A& Y5 W7 O k, a* w+ l( Z' D\有格式的输入& P2 ~% H0 F5 X2 c2 ?% b0 @8 Y) }$ u3 p0 ~

有格式的输入语句 一般形式:7 L8 P( H: N2 u8 C1 y7 k/ m READ(*,S1) <输入列表>

S1 FORMAT(格式说明[由各种格式编辑符构成])* r9 J6 X, h\, d 例如:

READ(*,100) A,B,C

100 FORMAT(F5.1,E12.2,F7.2)! _- F/ d! p, W2 O* r END

键盘输入:_15.7_2345.67E+04_705.83enter& K% n$ }5 e1 b6 f: p& ~! v

1 x. q/ ^* x7 w' e d

+ O% j5 S9 p2 O7 M. {9 G2 n在PRINT\\WRITE\\READ语句中包含格式说明

( Z7 t' ?\

例如: PRINT 100,K,Y& q% }; B' Z k0 q- _- C 100 FORMAT(18,F7.2)

也可以写成: PRINT'(18,F7.2)',K,Y5 K9 v1 q# N3 ~6 L9 @\ 注意写法: '(...)'

关于Fortran77的一些有用的简介[7]:' R; k% W- k f! V D

5 J/ d0 L3 d1 t9 k 2 S- p0 c\数组

' N; ]$ Y; n. b: Y( { 0 J8 h& W' E! S 使用原则:\先声明,后使用\

1 W0 K: _9 }8 ]2 e7 M1 c说明方法:- n# P1 x5 [9 ~( Y\

? ?

用类型说明语句(显式说明) 用DIMENSION语句(隐式说明)

' F\\

6 d: x, ^; u& l7 S$ @' Q

D, N5 V( V+ H' }% Z9 r数组的说明和数组元素的引用

! |8 u& G9 K3 v& @) v\0 Y6 y4 x& `. { \\

?

用类型语句说明数组

1.一般形式: 类型说明 数组说明符 2.其中:数组说明符的一般形式为:数组名(维数说明符,...)[维数说明符,由\下标下界:下标上界\组成

3.例如:REAL X(1:10),W(1:2,1:3),K(10:20)或者INTEGER B(1:100),PY(0:2,0:3,0:5) 用DIMENSION语句说明数组

1.一般形式:DIMENSION 数组说明符,... 说明:

1.在数组说明符中,维数说明符(下标)的个数成为数组的维数

2.维数说明符只能使用整型常量或者整型符号

?

?

常量表达式:如 PARANETER(I=1,J=10) REAL KX(I:J+5)

3.维数说明符的下标下界为1时,可以省略.如:REAL X(1:10)---->REAL X(10) 4.数组说明语句必须写在所有可执行的语句之前.[属于非执行语句]

?

数组元素的引用

1.一般形式:数组名(下标,...) 2.即要有确定的数组名和下标值,如XN(5),W(1,3),KW(1,2,3)

3.引用数组元素时,下标可用算术表达式,如果算术表达式的值为实行,则自动取整.

( ?* G. Y\

\i* d. e

/ o# ?- I2 B2 u) w# N5 Z数组的逻辑结构和存储结构

9 l5 {7 N9 t) |/ x& o

8 V* s5 x* x8 d( W\逻辑结构:数组所表示

的实际数据结构) ?4 U5 N# p5 E7 r0 m' @

存储结构:数组在机器内存储时的排列结构: N) z! w# s) a& y

0 i# k% b1 |) j& U6 p

?

一维数组

逻辑结构:依次排列的一串数据& ~ v! ^4 E4 T: W 存储结构:一组连续存放的一列数据块6 d* s\f$ ^3 {% ~

?

二维数组

逻辑结构:一张二维数据表+ y |7 K1 P8 y# n 存储结构:一组按列连续存放的数据块 ! @0 U$ o6 Y4 l0 y) f5 ~# B

?

三维数组

逻辑结构:若干张二维数据表

* H9 w6 e* z6 ] 存储结构:一组按页连续存放的数据块3 I$ x& P4 z8 q& @1 f+ N! a2 P

3 x0 L; ~2 b' L, V

4 W+ K: r\

# M\数组的输入和输出3 c, a' T9 K/ a; ~# Y/ M3 B

% }8 f+ e2 v6 L: K\三种方式:用DO循环\\用隐含DO循环\\用数组名: z6 F/ ^6 `$ @/ w* q

' u9 l8 f7 H4 |

?

用DO循环实现数组的输入输出 / U/ k- W- e' b- m

1.优点:数组元素的输入输出次序可由用户控制

2.缺点:做一次循环就换行输入或输出/ a0 d1 |- J- m

用隐含DO循环实现数组的输入输出 \

1.优点:既能控制数组元素的输入输出顺序,又能控制一行内输入输出数据的个数 2.例如:READ(*,*)

((G(I,J),J=1,3),I=1,2),由于是一个READ语句,所以既可以一行输入,也可以多行输

?

入,键盘输入如

下:86,75,72[enter]87,70,83[enter] 3.注意:一个READ语句可以多行输入;但是多个READ语句时,每一个READ语句必须从心的一行读数.8 Y O5 E- }- W\

' h, J( J, S\8 N- E2 c\用数据名进行数组的输入输出

4 h$ m5 l2 F4 y+ x' v- J3 O; J7 _, a% A7 u 使用时,其顺序要与数组元素在机器内的存储顺序一致

s) w6 c9 N8 W/ ^2 |% ^ 例如:

9 {9 p\- a2 n! |2 ~\对数组进行整体操纵

6 |9 X1 L' y. g5 z+ X0 t$ { W/ J$ { 等价于:READ*,K(1),K(2),K(3),K(4),K(5)

& D& Y( R% u4 }( ? 也等价于:READ*,(K(I),I=1,5)) A' r5 S% G\Z1 `& @+ D& h+ c

, M8 K\

! |: ^2 _1 U; [3 m) E4 |使用DATA语句给数组赋初值

3 A1 a, l% v8 r9 k\- i! W6 W' J7 D4 v! |+ h

?

一般形式: DATA 变量列表\\初值表\\,变量列表\\初值表......

功能:在程序编译期间给变量或者数组赋初值.其中,变量列表可以是变量名\\数组名\\数组元素\\隐DO循法;初值表只能是常量,不允许出现任何形式的表达式

例如: DATA A, B/7.85,9.1/[代表赋初值A=7.85,B=9.1--david], I,J, K /5,10,15/[代表赋初值I=5,J=10,K=15--david], 例如: DIMENSION K(2,3)

?

?

?

DATA((K(I,J),J=1,3),I=1,2)

/90,23,20,42,14,32/--------初值列表[2维3列, I=1: 90 23 208 x/ E3 A7 x0 e! }/ T* L I=2: 42 14 32

3 N! A; E- E5 [& _. w 或

5 [0 Y6 [+ R: C ?: X DATA K/90,42,23,14,20,32/----排列为按列排,排满一列之后,再排下一列; 90 23 20 --------david

4 C2 t; Y( n3 {- Q\A

?

例如:

DIMENSION A(10)6 D* L: I* _5 a6 w\DATA A/10*1.0/(表示'10个1.0')

$ y+ ?$ {: _. o2 O: ]注意:DATA语句属于说明语句,但是它可以放在END语句之前的任意行;当程序中有多个DATA语句给同一个变量赋初值时,以最后一条为准;程序在编译期间给变量赋予初值,在程序执行期间,DATA语句不起任何作用!

$ g2 F5 L( Z\@! `/ x: _2 z1 H' K; i' h y) a1 m( B/ A( ]/ }0 U

关于Fortran77的一些有用的简介[8]: j2 N9 I% j! v( i; c3 A\

5 s4 F0 [0 c3 L) M3 F- C5 ]9 y# }3 k

子程序' o4 J8 k6 c4 w o5 C% f

% w d. E! d' E6 l4 t 2 h) ]% ]% e5 P2 |

FORTRAN子程序:包括函数子程序,子例行程序,数据块子程序 执行:从主程序开始执行,遇到调用语句再执行相应的子程序.

不同类型的子程序,关键字不同,调用方法也不同7 |$ M% R6 Z9 T. i' b0 N

4 E( X3 a/ j2 Q4 f8 A9 q

?

函数子程序:一种可以作为函数来调用的子程序(\外部函数\6 H9 W6 N; l4 M

+ {+ ^8 L5 \\4 V/ ]4 S# s: w8 t2 O% D

1. 定义:一般形式,由FUNCTION语句和子程序体组成

FUNCTION 函数类型说明 FUNCTION 函数名([虚参表])# [1 G\x# e 名([虚参表])\f2 i! S: L: `& y5 G, X3 [ 类型说明 函数名3 q# e, c8 Z& ]( F5 d5 ~* { .........(子程序体)3 K7 U7 C\ ......(子程序体) END% E. u$ ^4 M7 N3 H5 T END8 X. J2 B; ?, a `9 S1 t 2. 1 a9 P; @- l% ?/ O

1.

FUNCTION语句:是函数子程序的第一条语句,标志着该函数子程序的开始. ], P, y6 O Y# r' c5 F. t3 _8 P

1.

类型说明 FUNCTION 函数名([虚参表]) 2.

注意:

1.

虚元也有类型,需在子程序体中说明4 ], N6 Y4 x\[9 V. w: C0 A8 w

1. 2.

2. 3.

例如:REAL FUNCTION INTEP(X1,X2,X3) INTEGER X1,X2,X36 O& g6 Y' M+ h

函数名的命名规则和类型都和变量相同 虚参可以是变量名\\数组名\\子程序名,但不允许用常量和数组元素,它表示了函数自变量的个数\\顺序和类型.- B0 V* i# [\

2. 3.

子程序体:完成一个具体任务的程序段 注意:

1. 2.

若无虚参时,括号不能省

函数子程序中所有变量和标号(除函数名和虚参外),与其他程序单位无任何关系

3.

函数体的说明部分包括对虚参和本函数体内所用变量和数组的说明

4.

函数体中可设置一条或者多条RETURN语句,表示执行到此语句时返回调用程序.( g3 t/ f# C. p% `# D! e

1.

当RETURN语句和END语句紧挨着的时候,可省略RETURN语句

2.

也可以不设RETURN语句,但需从中间返回时,必须设置RETURN语句

5.

函数名的作用:函数名在函数体中一定要被赋值,因为函数名把函数值带回调用程序.

5 I, x+ t% q$ i2 m. i

?

函数子程序的调用) S6 e' Y5 {) {1 I; j: f

) ~7 _; V# Y$ G$ C3 A; x: n3 c

1.

一般形式:调用方式和内部函数相似: 函数名(实参数) 或 函数名( )

2.

说明:

1.

调用程序中函数名必须与函数子程序中定义的函数名相同

2.

实参与虚参在个数\\类型\\位置上必须一一对应,但名字可以不同

3.

当虚参是变量名的时候,实参可以是常量\\变量\\数组元素或者表达式;但是当虚参要在函数体中被赋予初值的时候,则实参不可以是常量或者表达式[因为两者共用一个存储单元]

本文来源:https://www.bwwdw.com/article/d05g.html

Top