第10章 Fortran程序单元
第10章目标程序运行时的存储组织

p3活动记录 存取链(静态链) 控制链(动态链)
p3活动记录 存取链(静态链) 控制链(动态链)
main活动记录
2、用Display表
Display表---嵌套层次显示表 当前激活过程的层次为K,它的Display表含有K+1个
单元,依次存放着现行层,直接外层…直至最外层的每 一过程的最新活动记录的基地址。 说明:1、由于过程的层数可以静态确定,因此每个过程 的Display表的体积在编译时即可以确定。
Q的 活动记录
P的 活动记录 主程序的 活动记录
DISPLAY表பைடு நூலகம்维护和建立
为便于组织存储区,将display作为活动记录的一 部分,其相对地址在编译时是完全可以确定的。
假设过程P1可调用P2,为了能在P2中建立P2的 display,在P1调用P2时设法把P1的display地址 作为连接数据之一(全局display地址)传送给P2, 因此连接数据包括: 老SP值(动态链) 返回地址 全局display地址
嵌套过程的栈式分配方案
分程序结构的存储分配方案
3、过程活动:一个过程的活动指的是该过程的一次执行。
4、活动记录:一个过程的一次执行所需要的信息使用一个连 续的存储区来管理,这个区(块)叫做一个活动记录。
活动记录一般包含:
(1)连接数据
返回地址—调用过程指令的下一条指令的地址。
动态链(控制链)—指向调用该过程活动记录地址的指针。用 于当调用返回时,将当前栈顶正确切换到调用者的活动记录
2、某过程p是在层次为i的过程q内定义的,并且q是 包围p的直接外层,那么p的过程层数为i+1。
例: program main(i,0);
fortran

或OPERATOR(运算符)
或ASSIGNMENT(=) 其中,类属子程序名用于定义类属子程序、 OPERATOR用于超载运算符、ASSIGNMENT用 于超载赋值运算,具体内容我们下一节介绍。
关于接口定义的几点说明:
⑶ 接口内的语句称为接口体。 接口体的一般形式为: FUNCTION语句 [说明部分] END [FUNCTION语句] 或 SUBROUTINE语句 [说明部分] END [SUBROUTINE语句]
方法: 定义一个新的运算符与超载一个已有的运算符的方式 基本相似,可以在INTERFACE语句中含有这个运算 符的名字,定义运算的函数子程序应该有一个或两个 INTENT属性为IN的变量,函数子程序名应包含在 MODULE PROCEDURE语句中。 INTERFACE OPERATOR (.PRIME.) MODULE PROCEDURE PRIME END INTERFACE 现在这个运算符就可以和其它一元运算符一样使用, 例如下面的IF语句: IF(.PRIME. B .AND. B > 100)THEN… 一个自定义二元运算符的优先级总低于其他运算符, 而一个自定义一元运算符的优先级总高于其他运算符。
一个例子:
PROGRAM USE_MODULE USE MY_MODULE IMPLICIT NONE 注意:USE语句出现 REAL::A, B 的位置,在IMPLICIT NONE语句前面 READ *, A B=PI CALL SWAP (A, B) PRINT *, A, B END PROGRAM USE_MODULE
10.4.2 超载赋值号
在执行赋值语句时,赋值号“=”右边表达式的 数据类型将会转换为左边变量的数据类型并赋 值。例如,当I是整型变量而R是实型变量时, 下列赋值语句将把I的整型值转换为实型并赋 予R: R = I 如果我们希望延伸这种功能,使得一个逻辑型 的值能够赋予一个整型变量。如在执行赋值语 句:I = L时(其中L是逻辑型,而I是整型), 使.FALSE.相当于0,使.TRUE.相当于1。为此, 我们需要编写一个子程序完成此功能并用一个 接口块来指明完成转换的子程序名。
FORTRAN知识点总结

F O R T R A N第2章FORTRAN90基础知识:程序单元的概念:fortran90程序是一种分块形式的程序,整个程序由若干程序单元块组成。
每个程序只有一个主程序单元。
各单元体的程序体形式上相同。
程序单元可以是主程序、子程序(外部过程或内部过程)、模块MODULE (供其他程序单元引用即把该程序单元内的全部语句复制到程序单元中)或块数据程序单元BLOCK 。
语言元素:指在程序设计中用到的基本成分,如字符集、常量、变量、记号(标号、关键字、名字、常数、运算符和定界符)以及其他的基本结构等。
字符集:英文字母、阿拉伯数字、下划线、21个特殊字符($和?没有规定用法)。
数据结构:整型INTEGER (34-2下划线后面是种别参数),n 位字长的计算机的数据表示范围一般为12~211-+---n n ,种别参数由内在询问函数KIND 送回,种别值提供的最小范围由内在函数SELECTED-INT-KIND 送回,表示十进制幂的范围由内在函数RANGE 送回;实型REAL ,小数形式和指数形式;复型COMPLEX (种别类型参数值取实部与虚部中较大者);字符型CHARACTER,由一对单撇号或双撇号之间的字符序列组成;逻辑型LOGICAL。
派生数据类型TYPE;数组INTEGER,DIMENSION(1,50)::A,可直接对数组元素进行运算如3*A,SQRT(A);字符子串,在字符串CHARACTER(LEN=80)::ROW中,ROW(1:3)就表示字符串ROW中第1到第3个元素组成的子串。
变量名的命名规则:不能超过31个字符;组成成分是字母、数字、下划线;第一个字符必须是字母。
第3章基本语句:类型说明语句:类型说明(种别说明),属性说明::变量名表尽量避免把两个实数作相等或不相等的比较。
淘汰隐式说明IMPLICIT NONE种别说明:种别参数即对可移植数据精度和范围进行选择的机制KIND(X) 返回变元X的种别参数值SELECTED-REAL-KIND(n,m) 产生一个种别值,它表示某一精度和范围。
Fortran 程序基础

2021/7/1
26
数组操作
PROGRAM TEST IMPLICIT NONE ! 变量定义 REAL :: A1, A2,A3,A4,A5,B(5,5) READ(*, *)A1,A2,A3,A4,A5 ! 数组片断的引用 B(1,1:5) = A1 B(2,1:5) = A2 B(3,1:5) = A3 B(4,1:5) = A4 B(5,1:5) = A5
数组可用DIMENSION语句定义 DIMENSION runoff(365) Real runoff ※使用数组必须先定义
2021/7/1
25
数组操作
数组引用
(1)引用数组元素 数组名(下标),如 runoff(15),rain(3,5)
(2)引用全部数组 数组名,如: real B(10),A(10) B=A
2021/7/1
8
数据类型及I/0格式
变量的定义及类型说明:
(1)类型说明语句
integer year, month, day
real runoff
character*10 station
(2)隐含约定
I~N 规则
2021/7/1
9
数据类型及I/0格式
输入、输出语句
READ(设备号, 格式说明或格式说明语句标号) [变量列表] WRITE (设备号, 格式说明或格式说明语句标号) [变量列表]
其他程序控制语句 End Pause stop
2021/7/1
22
Fortran程序流程控制
实例分析
(1)1~100求和 (2)输入5个数,按大小排序
2021/7/1
23
数组操作
fortran子程序【精选】

1. 变量作虚参
(1)对应实参可以是同一类型的常量、变量、数组元 素和表达式。
(2)如果实参是常量或表 达式时,对应的虚参 变量值不应当改变。
3. 调用不一样。函数子程序一般在表达式中调用,子例 行程序通过call调用。
4. 用途不一样。只需得到一个计算值,一般采用函数子 程序的形式;希望通过子程序的运算得到一批数据, 应采用子例行程序。另外,使用子例行程序来完成一 些特定的操作。
10
三、 虚参实参数据传递
子程序中的虚参可以是变量名、数组名、函数名、 子例行程序名以及星号。
一行打印20个 “*”号,打两行。
8
subroutine opp(a,s1,s2) real a(5,5) s1=0
求矩阵两对角 线元素之和
do 10 i=1,5 s1=s1+a(i,i) 10 continue s2=0 do 20 i=1,5 j=5-i+1 s2=s2+a(i,j)
subroutine readin(a) real a(5,5) do 10 i=1,5 read(*,*) (a(i,j),j=1,5) 10 continue end
3
4
5
call sum(5,y3) call sum(6,y4) call sum(7,y5)
i i i
y i1
i1
i1
6
7
y=(y1+y2+y3)/(y4+y5)
i i
write(*,100) 'y=',y
i1
i1
format(1x,a,e13.6)
end
subroutine sum(n,s) integer n
第10章 Fortran程序单元

• 一个Fortran程序中通常不是只由一个主程序组成, 而是由几个按某种方式划分的不同程序单元来共 同组成。尽管Fortran程序中允许只有主程序而没 有子程序,但绝不允许只有子程序而没有主程序。 在Fortran中,程序的执行总是从主程序开始的。 • Fortran中的程序单元可以大体划分为主程序、子 程序两种,其中子程序又可以进一步划分为函数 子程序、子例行子程序和数据块子程序。数据块 子程序通常用于实现变量的初始化赋值,函数子 程序和子例行子程序在用途上基本是一致的,但 是也有许多不同之处。本章将详细介绍Fortran中 的程序单元和它们的基本用法。
10.4 子例行子程序
• 同函数子程序相比,子例行子程序通常用于完成 更为复杂的任务。子例行子程序接受外界传入的 参数并对其进行处理,子例行程序名不会用来返 回处理结果。形象一点来说,函数子程序像检验 机,它不改变参数的值但会告诉外界一个检测结 果;而子例行子程序更像一个加工机器,外界来 的参数经过它的加工会以新的形象出现。本节主 要介绍子例行子程序的相关知识。
10.5 子程序的多入口点和多折返点
• 尽管子程序中不允许直接定义其他的子程序,但 是在Fortran 77时代,可以通过特殊的方式在同 一个子程序中定义多个不同的过程入口。通过调 用不同的过程定义来实现调用同一个子程序中的 不同执行段。除了提供多入口点外,Fortran 77 时代也提供特殊的多折返点来实现特定条件的子 程序调用返回方式。
10.6 Fortran 90/95中的特殊子程序类型
• 在Fortran 90/95标准中,除了继续对前述的一般 子程序类型提供支持外,还新增了三种特殊的子 程序类型。这三种子程序类型就是前述章节中曾 经提到过的RECURSIVE、PURE和ELEMENTAL三种属 性。RECURSIVE属性允许过程进行自身调用,也就 是常说的递归调用;PURE和ELEMENTAL属性都用于 数组的并行处理。
fortran第10章

Fortran 90
先输入,不能放在 其它单位的底部
模块和子程序之间的区别: (1)模块应先定义。 (2)模块中无可执行语句 (3)模块不给其它单位调用, 而用USE语句引用
非执行单位 编译时完成 可执行语句只能在内部子程序内
Fortran 90
10.2 USE语句
各单位用USE语句共享模块中的信息
1、接口块的位置 2、接口块的组成
有接口块无需说明函 数名类型,否则错误
Fortran 90 补充:下例情形必须使用接口块
1、实元用关键字变元
2、实元对应缺省的可选变元。
3、用一个类属名调用过程。 4、外部过程扩展了赋值号的使用范围(超载赋值)。 5、一个外部函数使系统中的内在操作符扩展了原有的 功能(超载运算)。 6、一个外部函数使系统中的内在函数扩展了原有的功 能(超载函数)。 7、调用的外部过程是一个函数,且函数结果是一个数 组;或被调用过程中的虚元是一个假定形状数组、一 个指针变量、一个目标变量。
各独立程序单位分开 编译 内部子程序无接口
Fortran 90 最简接口块结构形式
INTERFACE 被调程序的单位定义语句 说明语句 单位结束语句 END INTERFACE
接口块的位置
写在主调程序的类型说明语句之前,IMPLICIT语句 之后
Fortran 90
有关接口块的说明 1、功能简单的程序,不必写接口块。 2、如有接口,主调程序不必再说明外部 函数名的类型。
Fortran 90
例: MODULE MY_ MODULE REAL,PARAMETER::PI=3.1415926 CONTAINS
SUBROUTINE SWAP(X,Y)
REAL::TEMP,X,Y TEMP=X; X=Y; Y=TEMP END SUBROUTINE SWAP END MODULE MY_ MODULE
编译原理第十章目标程序运行时的存储组织

编译原理第十章目标程序运行时的存储组织课前索引【课前思考】◇回顾通常的编译过程,能否找到本章所讲内容在哪个过程?◇为什么编译程序要考虑目标程序运行时存储区的管理与组织?◇请归纳C语言与PASCAL语言的程序结构与数据类型的不一致点【学习目标】全面熟悉目标程序运行时存储区的整体布局;每种存储区的组织方式与管理方法;并通过实例着重掌握,对同意过程嵌套定义的情况,栈式动态存储分配的组织方式与运行时进栈退栈的活动实现方法。
【学习指南】在代码生成前,编译程序务必进行目标程序运行环境的配置与数据空间的分配。
通常来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码与目标代码运行时的数据空间。
我们这里所说的运行时的存储区组织,是指目标程序运行时的数据空间的管理与组织。
【难重点】◇目标程序运行时,存储区域的整体布局,与各区域的作用。
◇各类不一致类型的数据表示。
◇同意过程嵌套定义的情况,栈式动态分配的组织管理。
◇对过程的调用,进入与退出时,栈式动态分配的工作原理。
◇过程活动纪录的各项内容与它们的作用,与活动纪录的组织方式。
◇过程参数传递的不一致方式。
【知识结构】从逻辑上看,在代码生成前,编译程序务必进行目标程序运行环境的配置与数据空间的分配。
通常来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码与目标代码运行时的数据空间。
数据空间应包含:用户定义的各类类型的数据对象(变量与常数)所需的存储空间,作为保留中间结果与传递参数的临时工作单元,调用过程时所需的连接单元,与组织输入/输出所需的缓冲区。
目标代码所占用空间的大小在编译时能确定。
有些数据对象所占用的空间也能在编译时确定,其地址能够编译进目标代码中。
而有些数据对象具有可变体积与待分配性质,无法在编译时确定存储空间的位置。
因此运行时的存储区常常划分成:目标区、静态数据区、栈区与堆区,如图10.1就是一种典型划分,代码(code)区用以存放目标代码,这是固定长度的,即编译时能确定的;静态数据区(static data)用以存放编译时能确定所占用空间的数据;堆栈区(stack and heap)用于可变数据与管理过程活动的操纵信息。
FORTRAN语言程序设计

n 是一个十进制数字(0~9)序列。
Kind值为:1、2、4、8之一。分别表示1、2、4、8个字节个数。
FORTRAN 90/95标准中整型常量的范围没有明确规定。
例如:122、0、-36、559_2
均为合法的整型常量
100.0、100,000、100 0、1002 均为非法的整型常量
5.6.2.2 实型常量
5.5 程序的书写格式 (1)固定格式:将一个语句行分为若干个区域,如下图所示
:
5.6 数据类型
5.6.1 基本概念 1.内部数据类型 FORTRAN语言将内部数据划分为以下类型: 整型 实型 算术型 数据类型 复型 逻辑型 字符型 2.种别 一个数据在内存中均占有一定字节个数的存储单元。上述每类数据都有 其不同的种别(即Kind)特性,即上述每类数据根据其种别特性(即 Kind值)的不同分别拥有不同字节个数的存储单元。 3.数据对象 1)常量:程序运行时,其值不能改变的量,称为常量。如:5,3等等。 2)变量:程序运行时,其值可以改变的量,如:变量a, a是一个存储单元
第四章 FORTRAN语言开发环境
详见教材:3.3 FORTRAN语言 开发环境
第五章 FORTRAN 语言基础知识
5.1 字符集
FORTRAN语言允许使用的字符集为:
fortran知识点总结

fortran知识点总结一、语法结构Fortran语言的语法结构遵循一套严格的规则。
下面是一些常见的语法结构:1. 程序单元:Fortran程序由一个或多个程序单元组成。
每个程序单元由一个或多个声明和执行语句组成。
2. 注释:在Fortran中,注释可以用来提高代码的可读性。
注释以感叹号(!)开头,直到行末为止。
3. 标识符:Fortran中的标识符由字母、数字和下划线组成,且区分大小写。
标识符用于表示变量、函数、子程序等。
4. 变量声明:在Fortran中,变量声明使用关键字“REAL”、“INTEGER”、“LOGICAL”等来指定变量的数据类型。
例如,REAL :: x 表示声明了一个实数类型的变量x。
5. 程序控制结构:Fortran提供了多种控制结构,包括顺序结构、条件结构和循环结构。
这些结构提供了程序的流程控制和逻辑控制。
6. 函数和子程序:Fortran支持函数和子程序的定义和调用。
函数和子程序可以帮助程序员组织和重用代码。
7. 模块和接口:Fortran中的模块和接口提供了一种组织代码的方式。
模块可以包含多个子程序和全局变量,接口可以用来定义子程序的接口。
二、数据类型在Fortran中,数据类型用于表示数据的类型和大小。
Fortran提供了多种数据类型,包括整数、实数、逻辑值、字符、复数等。
下面是一些常见的数据类型:1. 整数:整数类型用于表示整数值。
在Fortran中,整数类型包括“INTEGER”、“LOGICAL” 和“CHARACTER”类型。
2. 实数:实数类型用于表示实数值。
在Fortran中,实数类型包括“REAL”和“COMPLEX”类型。
REAL类型用于表示实数,COMPLEX类型用于表示复数。
3. 字符:字符类型用于表示字符值。
在Fortran中,字符类型使用CHARACTER关键字进行声明。
字符类型可以表示单个字符或者字符数组。
4. 数组:数组类型用于表示多个相同类型的数据。
第10章 文件-FORTRAN语言程序设计-王丽娟-清华大学出版社

直接存取,又称随机存取。它是指将文件记录 由程序指定的某一位置直接存取。
顺序存取的文件中所有的记录长度可以完全不 同,而直接存取的文件中的记录的长度由 OPEN语句中的说明项“RECL=”指定,每个记 录长度相同。
OPEN(10,FILE="A.TXT",FORM="FORMATTED",& ACCESS="SEQUENTIAL") WRITE(10,100)911 WRITE(10,200) "WELCOME" OPEN(11,FILE="B.TXT",FORM="FORMATTED" , & ACCESS="DIRECT",RECL=10) WRITE(11,100,REC=1)911 WRITE(11,200,REC=2) "WELCOME" 100 FORMAT(1X,I5) 200 FORMAT(1X,A15) END
与说明项FILE=file共存,它只能用于由系统指定的
文件名,使该文件作为程序运行过程磁盘上和指定文件名同名 的文件。如果不存在这样的文件,则创建一个新文 件。
·UNKNOWN: 表示由计算机来规定文件的状态。
ACCESS=access。access是一个字符串表达式,此
文件的概念 文件的打开与关闭 文件的读写 其他文件操作
文件与记录 所有的数据来源和数据发送目标都被认为是文件。 文件有外部文件和内部文件之分。
记录是作为逻辑单位顺序排列的一组相关数据项 (又称字段)的集合,是构成文件的基本单位。 文件系统是负责存取和管理文件的公共信息管理机 构。
FORTRAN知识点总结

F O R T R A N第2章FORTRAN90基础知识:程序单元的概念:fortran90程序是一种分块形式的程序,整个程序由若干程序单元块组成。
每个程序只有一个主程序单元。
各单元体的程序体形式上相同。
程序单元可以是主程序、子程序(外部过程或内部过程)、模块MODULE (供其他程序单元引用即把该程序单元内的全部语句复制到程序单元中)或块数据程序单元BLOCK 。
语言元素:指在程序设计中用到的基本成分,如字符集、常量、变量、记号(标号、关键字、名字、常数、运算符和定界符)以及其他的基本结构等。
字符集:英文字母、阿拉伯数字、下划线、21个特殊字符($和?没有规定用法)。
数据结构:整型INTEGER (34-2下划线后面是种别参数),n 位字长的计算机的数据表示范围一般为12~211-+---n n ,种别参数由内在询问函数KIND 送回,种别值提供的最小范围由内在函数SELECTED-INT-KIND 送回,表示十进制幂的范围由内在函数RANGE 送回;实型REAL ,小数形式和指数形式;复型COMPLEX (种别类型参数值取实部与虚部中较大者);字符型CHARACTER,由一对单撇号或双撇号之间的字符序列组成;逻辑型LOGICAL。
派生数据类型TYPE;数组INTEGER,DIMENSION(1,50)::A,可直接对数组元素进行运算如3*A,SQRT(A);字符子串,在字符串CHARACTER(LEN=80)::ROW中,ROW(1:3)就表示字符串ROW中第1到第3个元素组成的子串。
变量名的命名规则:不能超过31个字符;组成成分是字母、数字、下划线;第一个字符必须是字母。
第3章基本语句:类型说明语句:类型说明(种别说明),属性说明::变量名表尽量避免把两个实数作相等或不相等的比较。
淘汰隐式说明IMPLICIT NONE种别说明:种别参数即对可移植数据精度和范围进行选择的机制KIND(X) 返回变元X的种别参数值SELECTED-REAL-KIND(n,m) 产生一个种别值,它表示某一精度和范围。
FORTRAN简明教程

《FORTRAN》程序设计原理1、程序结构及书写规则一个程序由不同的程序单元组成,每一程序单元均以end结束,一般情况下,主程序的结构为:Program程序单元名说明语句可执行语句……STOPEND子程序的结构为:SUBROUTINE 程序单元名(哑元名表)说明语句可执行语句………RETURNEND以及FUNCTION 程序单元名(哑元名表)说明语句可执行语句………RETURNEND程序单元名由字母和数字组成,各程序单元中的变量独立编译,同名变量相互不影响。
1-5列为行号,可以是1-99999之间的任意数,6列为续行号,可以是任何字符,正文从第8列写到72列。
当第1列为字符C时,此行为注释行。
2、说明语句说明语句分为二类,一类必须放在程序单元的开头,另一类可以放在任何地方。
2.1 变量说明语句这一类说明语句,必须放在程序单元的开头,以表明变量的性质。
若不加以说明,以I-N开头的变量均为整型,其余变量均为实型,称之为I-N规则。
同一变量经下列显式说明语句说明后,I-N规则失效,没有经显式说明的变量,I-N规则仍然有效。
PARAMETER(变量名=const,……)REAL 变量名表INTEGER变量名表CHARACTER变量名表LOGICAL变量名表COMPLEX 变量名表IMPLICIT 变量基本类型(字符名表)DOUBLE PRECISION变量名表DIMENSION变量名表COMMON 变量名表COMMON /公共区名/ 变量名表DATA 变量名表/数值名表/一个变量可由多个语句说明,其中类型说明语句的级别最高,例如:Implicit real (a-c,e) 由a,b,c,e开头的变量均为实型Dimension ax(100) 定义一个100个元系的实型数组Integer bx, ax 重新定义bx, ax为整型变量2.2 格式说明语句这一类语句可以放在程序单元内的任何地方,常用的有:FORMAT(nFw.d, nX, nAw, nIw, ‘…….’, \ ,nEw.d)这里,n是重复使用该格式码的次数,F表示实型,X表示空格,A表示字符,I表示整型,E科学记数法,w是输入/出的宽度,d是小数位数,引号‘’内的内容原样输出,斜线‘\’表示输入/出时换行。
Fortran程序总结

Fortran程序总结1.⾏的书写(⾏的长度、分⾏、续⾏)⼀⾏可以是0~132个字符,空格有意义,语句最长不超过2640个字符⼀⾏可以有多个语句,⽤“;”分隔⼀个语句可分⾏写,读⾏标记为&(放在尾部),但如为关键字,⾸尾均加&。
最多可有511个续⾏。
2.说明语句必须出现在可执⾏语句之前,格式说明语句(FORMAT语句)除外。
3.注释标志符:⾃由格式:!固定格式:C *语句分隔符:分号;(仅⾃由格式可以使⽤)续⾏符:⾃由格式:&申明标号:1到5位⽆符号整数空格:关键字、变量、常量内部不能⽤空格,但相邻两者之间须⽤空格4.信息处理的分类:数值处理和信息处理现代计算机⼯作原理:程序存储和程序控制(冯·诺依曼)1、运算器——算术运算、逻辑运算2、控制器——根据指令控制计算机⼯作运算器、控制器和寄存器称为中央处理器CPU3、I/O设备——提供数据传输服务4、总线——数据传输的公共通道1.机器语⾔:⼆进制代码形式,可以被计算机直接执⾏,不可移植2.汇编语⾔:⽤助记符来代替机器指令,容易记忆,不可移植3.⾼级语⾔:接近⾃然语⾔(英语)的程序设计语⾔,⼜称算法语⾔,易学、易⽤、易维护,可移植性好例:FORTRAN、BASIC、PASCAL、C、LISP、PROLOG等5.FORTRAN90程序是⼀种分块结构,由若⼲个程序单元块组成:主程序、外部⼦程序、模块、块数据单元⽆论是主程序单元,还是⼦程序单元,都是独⽴的程序单位,应该独⽴编写,它们的形式相似。
⾮语句⾏:注释语句:!后的所有字符都被编译器忽略。
可独占⼀⾏,也可在其它语句之后,空⾏为注释⾏(固定格式⽤C和*)6.常量的定义:常量是程序执⾏过程中不能变化的量。
基本数据类型有五种:整型、实型、复型、字符型和逻辑型前三种属于数值类型,后两种为⾮数值类型,主要⽤于⽂字处理和控制。
FORTRAN 90通过KIND值确定整数的存储开销、最⼤位数和取值范围,如表所⽰。
有限元教材-第十章有限元程序设计

有限元教材-第十章有限元程序设计第十章有限元程序设计有限元方法作为一门系统的技术,仅学会了它的基本理论是远远不够的,只有形成完整的计算程序,问题才最终得到了解决。
完成这样的有限元程序设计是一项工作量很大的工程。
本章就是要结合简单的有限元教学程序FEMED,简要介绍有限元程序设计技术。
FEMED 是专为有限元程序设计教学编制的程序,它不包含复杂的前后处理功能,可进行平面问题及平面桁架的线弹性静力分析,在程序结构上与大型程序类似,具有计算单元的任意扩充功能,在方程的组集和求解上也采用了较为流行的变带宽存储方式。
有限元程序大致可分为两类,第一类是专用程序,主要用于研究或教学,一般这类程序规模较小,前后处理功能较弱。
用于研究的程序能够解一些特殊的问题,满足研究工作的需要。
而教学程序则是为了学生了解有限元的主要结构和设计方法设计的,程序比较简单,FEMED就属于这类程序。
第二类是大型通用程序,是大型结构分析的得力工具,目前国际上流行的大约有2000多种。
常用的有NASTRAN、MARC、ANSYS、ADINA和ABAQUS等。
这类程序一般前后处理功能比较强,有友好的界面,能进行大型计算,但往往无法完成具有特殊要求的计算。
通过本章的学习,使读者初步掌握有限元编程的基本方法,具有开发特殊功能的专用程序或为通用程序开发具有特殊功能的计算模块的能力。
§10.1有限元程序的基本结构有限元程序一般包括三项基本内容:前处理、结构分析和后处理。
早期有限元分析软件的研究重点在于推导新的高效率求解方法和高精度的单元,随着数值分析方法的逐步完善,尤其是计算机内存和运算速度的飞速发展,整个计算系统用于求解运算的时间越来越少,加之求解问题的日益大型化和复杂化,使得数据准备和运算结果的表现问题日益突出。
因此目前几乎所有的商业化有限元程序系统都有功能很强的前后处理模块,这直接关系到分析软件的可推广性。
它是商用有限元软件不可或缺的部分,但它不是有限元的中心部分,在本书中不作详细介绍。
ch10 fortran

实参和虚参占有相同的内存地址。 当实参是变量名、数组名、数组元素、函数名、子程 序名时采用地址传递方式。 对虚参的改变就意味着改变了实参。
值传递
是指在过程调用发生时,将实参的值传递给虚参。
当实参是一个常量或表达式时,采用值传递方式。 对虚参的改变不会影响到实参。
域。
分类:
无名公用区:一个程序只有一个无名公用区
有名公用区:可以定义多个
定义格式: 无名公用区 common 变量名表 common /公用区名1/变量名表1,/公用区名2/变 量名表2,… 有名公用区
Common的使用举例
program ex10_13 implicit none integer :: a,b common a,b ! 定义a,b是全局变量中的第1及第2个变量 a=1 b=2 call ShowCommon() end subroutine ShowCommon() implicit none integer :: num1, num2 common num1, num2 !定义a,b是全局变量中的第1及第2个变量 write(*,*) num1, num2 return end
二、数组作为虚参
虚参 —— 数组名 实参 —— 同一类型的数组名或数组元素 若虚参数组是数值型或逻辑型,且对应实参也是相同 类型的 虚实结合:将实参数组的第一个元素的地址送给子程 序作为虚参数组的第一个元素的地址,共用一个存储 单元。如: program main implicit none integer :: a(8) … call sub(a) … end program subroution sub(b) implicit none integer:: b(-1,5) … end subroutine sub
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.4.1 定义子例行子程序
• 子例行子程序同函数子程序非常相似,但是子例 行子程序不会有返回值。这种形式的子程序是以 SUBROURTINE语句开始,END语句结束的过程。其 一般语法形式如下: • [前缀] SUBROUTINE子程序名 [([哑元列表])] • „„ • END [SUBROUTINE[子程序名]] • 1.哑元列表 • 2.前缀 • 3.子程序名 • 4.END语句
10.3.2 调用函数子程序
• 函数子程序的调用与内在函数的调用形式一样。 在主调程序的任意位置,可以通过下面的语句形 式将函数子程序的计算结果赋值给变量: • V = 函数名(实元表) • 其中,V表示用于接收函数计算结果的变量;实元 表是程序中实际传入函数子程序的变量列表,除 非有特殊说明,变量列表中的实元个数以及类型 必须与函数子程序定义时的虚参在个数和类型上 一致。如果函数不包含哑元,则调用形式是在表 达式中直接写上函数名再跟空括号即可: • V = 函数名()
10.4.2 子例行子程序示例
• 下面直接来看一段例子,这段代码依次读入三个 实数,并按它们的大小重新开始排序。 • 程序的执行结果如下: • 请输入三个实数: • 1.345 2.71828 2.71827 • 三个实数的先后次序如下: • 2.718280 2.718270 1.345000 • 调用子例行子程序时的实元必须是与哑元类型相 同的变量、数组、数组元素和常数。当用CALL语 句进行调用时,哑元和实元才按哑元列表中的顺 序一一对应,取得同一数值。
10.5.1 ENTRY语句与多入口点
• Fortran语言中的子程序中可以通过ENTRY语句来提供多个 入口点。 • 程序的执行效果如下: • 请任意输入一个实数: • -30.0 • 这是一个负数 • 它的立方根为: -3.107233 • 在上面的代码中,子程序SIGN内部通过ENTRY语句为一段执 行代码定义为一个入口点Negative(A)。在主调程序中,可 以根据情况选择子程序SIGN中的不同执行段:直接调用 SIGN将会执行入口点Negative(A)前的执行代码,并在 ENTRY语句前的RETURN语句返回主调过程;如果调用 Negative将执行入口点Negative(A)后的执行代码,并在下 一个RETURN语句返回主调过程。
10.3.3 函数子程序示例——进制转换
• • • • • • • • • • • • • • • • • • • 下面来看一段函数子程序的实例,代码将一个4字节的整数用16进制的形式表示出来。 首先给出的是程序的函数子程序单元HEX。 FUNCTION HEX(n) IMPLICIT NONE CHARACTER(LEN=8) :: HEX CHARACTER(LEN=1) :: H(0:15)=(/'0','1','2','3','4','5','6', '7',& '8','9','A','B','C','D','E','F'/) INTEGER :: n, j, nn HEX= ' ' DO j=8,1,-1 nn = n/16 HEX(j:j) = H(n - 16*nn) IF(nn == 0) EXIT n = nn END DO END FUNCTION
10.2 语句函数
• 语句函数通过一句代码定义来实现某种特定的处 理功能,它是Fortran 77时代的遗留产物。严格 来说,语句函数不属于程序单元的范畴。但是在 实际应用中,语句函数以其灵活的应用、小巧的 结构在程序中发挥着重要的作用。 • 在实际的编程过程中,程序员往往会遇到这种情 况:一些简单的函数会在一个程序单元中的不同 地方重复用到,而Fortran系统并不提供这种内部 函数;如果采用函数子程序的形式来描述这些简 单的函数又会觉得没有这种必要。例如,要求解 函数的值,将其编写成函数子程序可以顺利解决。 但是,Fortran语言提供了一种更为简单的手段— —语句函数。
10.3.1 定义函数子程序
• • • • • • • • • • • 下面给出函数子程序的一般形式为: [prefix] FUNCTION name ([d-arg-list]) [RESULT (r-name)] ... END [FUNCTION name] 1.prefix说明项 prefix说明项是一个可选参数,可以使用如下两种形式来书写: type [keyword] 或 keyword [type] 2.d-arg-list d-arg-list表示函数的哑元列表。如果函数子程序不包含哑元, 则哑元列表可以省略,但是函数名后的括号不能省略。 • 3.RESULT关键字 • RESULT关键字用于声明将函数的返回值保存在其后的变量名中, 称为函数结果名。
10.6.1 RECURSIVE属性
• 在Fortran 90/95标准之前,Fortran中的子程序 是不允许进行自身调用的。在新标准中,Fortran 子程序开始允许进行自身调用,也就是经常在编 程中听到的“递归”。能够进行递归调用的一个 前提条件就是递归过程在被调用时,其中的局部 变量会使用不同的内存地址,以便在完成递归后 能够依次统计不同内存地址上的结果。 • 1.递归函数子程序 • 2.递归子例行子程序
•
• • • •
10.2.2 语句函数的引用
• 语句函数在完成定义后,就可以在程序单元中进 行引用了。实际上,在前一小节的例程中已经演 示了语句函数引用的一般方式。本小节将对语句 函数的引用方式进行具体的说明。 • 语句函数的引用方式与Fortran中内部函数的引用 方式完全一致,就是用程序中定义的实参替换掉 语句函数定义中的虚参。实参必须是与虚参类型 相同的常量、变量或表达式。
10.5.2 子程序的多折返点
• 一般来说,当子程序执行完成之后,通常会直接返回主调 程序的调用处继续进行执行。关于这一点,Fortran语言中 也提供了一种特殊的返回方式来改变子程序的折返点,将 子程序的返回点指定到主调程序的其他位置。 • 程序的执行结果如下: • 请输入一个正整数[负数-退出]:0 • 计算结果S = 0.0000000E+00 [=0] • 请输入一个正整数[负数-退出]:2 • 计算结果S = 0.9092974 [>0] • 请输入一个正整数[负数-退出]:5 • 计算结果S = -0.9589243 [<0] • 请输入一个正整数[负数-退出]:0 • 需要注意,能够实现多折返点的子程序仅限于子例行子程 序,不包括函数子程序,函数子程序通过RETURN语句只能 返回到主调程序中的调用点处。
1 主程序
• 顾名思义,主程序是一个实际程序中的主体,其 他类型的程序单元都是以某种方式来辅助主程序 的执行。在Fortran语言中,一个程序的执行始终 是从主程序的第一条可执行语句开始的,所以每 个完整的Fortran程序都必须有且只允许有一个主 程序。主程序定义的一般语法形式如下: • [PROGRAM [程序名]] • [说明部分] • [可执行部分] • [CONTAINS • 内部过程] • END [PROGRAM[程序名]]
10.6.2 PURE属性
• 在函数子程序或是子例行子程序的定义语句前添加PURE语句,将 使子程序具有PURE属性。一般来说,并不需要使用这种属性,它 通常适用于并行计算并在使用上有较多的限制。 具有PURE属性的子程序,其参数必须是只读的,即INTENT(IN)。 具有PURE属性的子程序,其参数都必须有赋值属性。 具有PURE属性的子程序,其中的变量不允许具有SAVE属性。 具有PURE属性的子程序,其包含的内部过程也必须具有PURE属性。 具有PURE属性的子程序,不能够使用STOP以及输入输出相关语句, 如READ、WRITE等。 具有PURE属性的子程序,只能够读取而不能改变全局变量的值。
10.4 子例行子程序
• 同函数子程序相比,子例行子程序通常用于完成 更为复杂的任务。子例行子程序接受外界传入的 参数并对其进行处理,子例行程序名不会用来返 回处理结果。形象一点来说,函数子程序像检验 机,它不改变参数的值但会告诉外界一个检测结 果;而子例行子程序更像一个加工机器,外界来 的参数经过它的加工会以新的形象出现。本节主 要介绍子例行子程序的相关知识。
10.3 函数子程序
• 函数子程序和子例行子程序是子程序的两种常用 基本形式。它们的共同特征就是作为数据处理过 程的集合。但是这两种子程序也不完全相同,函 数子程序会返回一个函数值,且通常不会改变哑 元的数值。因此,函数子程序更像是数学上的一 个函数。而子例行子程序通常用于完成一项更为 复杂的任务,通过哑元或者其他手段返回几个结 果,哑元的数值通常会在程序的执行过程中改变。
10.3.4 函数子程序示例——分形
• 在数学上有一个特殊的分支——分形(fractal),所谓分形是 Mandelbrot将自然界的一些特殊复杂图形(如海岸线、树叶外形、 雪花结晶类型等)进行数学理想化后提出的一种概念,其核心思 想是图形的任意细小部分都与图形的整体具有自相似性,这种图 形的维数不是整数,而是分数维。分形的一个典型例子就是Koch 曲线,它具有雪花的外形,可以通过对一段直线反复进行某一简 单的操作而得到。把这个过程用数学语言来描述,就是在复空间 内定义的一种简单迭代过程,它是一个图形的缩小映射,从而产 生自相似曲线。
10.6 Fortran 90/95中的特殊子程序类型
• 在Fortran 90/95标准中,除了继续对前述的一般 子程序类型提供支持外,还新增了三种特殊的子 程序类型。这三种子程序类型就是前述章节中曾 经提到过的RECURSIVE、PURE和ELEMENTAL三种属 性。RECURSIVE属性允许过程进行自身调用,也就 是常说的递归调用;PURE和ELEMENTAL属性都用于 数组的并行处理。