FORTRAN 90 程序编程规范

合集下载

FORTRAN90第6章子程序

FORTRAN90第6章子程序
INTENT(IN):作为子程序的输入(不得再改变其值) INTENT(OUT):子程序的输出(对应的实元不能是表 达式) INTENT(INOUT):子程序的输入输出 例:REAL,INTENT(IN)::X,Y
Fortran 90
子程序程序体的写法
分为说明部分和执行部分。 1、说明部分应对程序体内一切变量、数组等实体 (包括虚元)作出说明,同时还要说明函数结果 变量名,但不可说明函数名。 2、执行部分中必须对函数结果名至少赋值一次。
例2.计算y=f(x)+g(x)值。
其中
f(x)=x+sin30° x+1,f(x)>0 g(x)= 0, f(x)=0 x-1, f(x)<0 要求用外部函数求g(x)的值。
Fortran 90
PROGRAM MAIN IMPLICIT NONE REAL::X,Y,F,G,GF READ*,X F=X+SIN(30*3.1415926/180) G=GF(X,F) Y=F+G G,GF不能同名 PRINT*,Y END
Fortran 90
最简单的源程序的结构
主程序: 单位定义 说明部分 子程序: 计算或处理
输入
调用子程序 输出 END
Fortran 90
子程序分类
用于完成复杂的计算
1、函数子程序
分为内部函数子程序 外部函数子程序 2、子例行子程序 分为内部子例行子程序 外部子例行子程序
返回 一个或多个值
用于完成复杂计算 ,返回一个或多个 值,或用于其它数 据处理
247.0
4.0
Fortran 90
6.3 完成复杂 计算任务,返回一个或多个值,或用于其它数 据处理

笫十五章 FORTRAN 90

笫十五章  FORTRAN 90
(三) 数组赋值 a(1:9,1:9) a(2:4,5:8)=a(3:5,1:4) 有效 a(1:4,1:3)=a(1:3,1:4) 无效 因形状不同 a(k+1:n,k)=0 给多个元素赋标量,有效 (四) where语句和where结构 where语句可用于为数组赋值,如a和b是两个形状相同的数组,将b中与 a的负元素对应位置上的元素置0,可写成 where(a<0) b=0 where结构 where(c/=0) a=b/c elsewhere a=0 c=1 end where
笫十五章 FORTRAN 90
FORTRAN 90 与FORTRAN 77 不同之处
一、说明语句
(一)固有数据类型 整型、实型、复型,其后都可以接一个下划线_和另一个 整型常量或有名整型常量用来指明种别参数。如 42_2 42_long 0.3_double (3.14_double,_7) ascii_’john Q.public’ 种别参数(kind parameter):当它是一个整数1,2,3…时, 可能表示单精度双精度和四精度,在不同的系统中可能是 4,8,16。 (二)变量 integer (kind=2):: x,y character (len=20,kind=kanji) ::name kinji为一整型常量 real ::a=1.2,b=2.3, 初始化变量的值在执行过程中可变
六、数组
(六) 列表检索 1. 对无序列表的顺序检索 subroutine search_1(lost_card,card_number,found) integer,dimension(:),intent(in) :: lost_card integer,intent(in) ::card_number logcal,intent(out) ::found integer ::I found=.false. do I=1,size(lost_card) if(card_number==lost_card(I)) then found=.trun. exit end if end do end

FORTRAN90第2章

FORTRAN90第2章
字母大小写等价 变量名中字符与字符之间不能有空格 取名时尽量“见名知意”,不使用关键字
2.3 变量
3.变量的类型 变量类型说明一般形式: 变量说明符[ [,属性] … :: ] 变量列表 类型说明符可以是固有的或派生的,基本类型变 量说明符: INTEGER REAL、DOUBLE PRECISION COMPLEX LOGICAL CHARACTER 通常要求::不省略
2.2 常量
主要了解: • 常量的概念 • 固有数据类型及其常量表示
2.2.1 固有数据类型
• 固有数据类型有五种:
– – – – – 整型( INTEGER) 实型(REAL) 复型(COMPLEX) 字符型(CHARACTER) 逻辑型(LOGICAL)
1、整型数据
• – – – – 整型表示: INTEGER INTEGER INTEGER INTEGER
2、实型数据
• 实型表示: – REAL或REAL ( 4 ) 表示单精度实数 – REAL ( 8 ) 或 DOUBLE PRECISION 表示双精度实数
2、实型数据
• 每种实型数据所占的字节和范围:
数据类型 REAL (4 ) REAL (8 ) 或
DOUBLE
字 节
精 度
范 围
负数: -3.40282347E+38~-1.17549435E-38 正数: +1.17549435E-38~+3.40282347E+38 负数: -1.7976931348623158D+308 ~ -2.2250738585072013D-308 正数: +2.2250738585072013D-308 ~+1.7976931348623158D+308

FORTRAN90程序设计1[1]

FORTRAN90程序设计1[1]

程序设计举例
算法

算法是计算机软件中的一个基本概念,它是对解决实际问题的方法和步
骤的描述。设计算法是程序设计的核心,也是编写程序的基础。

正确的算法有以下几个显著特点:
(1)有穷性(flniteness)。 (2)确定性(certainty)。 (3)有效性(effcctivencss)。 (4)有零个或多个输入(input)。 (5)有一个或多个输出(output)。
简单的FORTRAN90程序分析

(6)空格并不是随处都可以使用的,一个像关键字、变量和常量名以 及操作符等的字符,其内部是不能使用空格的,空格会使字符失去其原 有的含义。 (7)FORTRAN90的注释语句是以感叹号为标志的,一行中感叹号后的 所有字符都被编译器作为注释语句而忽略。注释语句可以单独占一行, 也可在程序的其他语句后面出现。在FORTRAN90中,空行被作为注释 语句。 (8)如果遇到一条语句的长度超过了FORTRAN90所允许的行最大长度, 需要写成几行,FORTRAN90提供了一个续行符 ( & ) ,通过在语句末尾 添加续行符,编译器就会把下一行作为续行来处理。如果是把一个如关 键字这样的字符分成两行,那么需要在下行语句的开头再加一个续行符。
CHARACTER ( LEN = 10 ) :: STRING 子字符串是字符串中的若干个连续字符的集合。子字符
CHARACTER (LEN = 5 ) :: SUBSTRING 串的表示方法如下: CHARACTER (LEN = 1 ) :: CHAR STRING=’JANEJORDE’ 字符串变量名([FIRST-POSITION] : [END-POSITION]) ! SUBSTRING的值为“JANE” SUBSTRING=STRING ( :5 ) 缺省的开始位置是1,缺省的结束位置是字符串的长度。 SUBSTRING=STRING ( 5:6 ) ! SUBSTRING的值为“J” 如果开始位置大于结束位置则子字符串为空,即它的长 SUBSTRING=STRING ( 3:7 ) ! SUBSTRING的值为“NEJO” N=7 度为0。 CHAR=’ABCDEFGHIJK’ ( N:N ) ! CHAR的值为“G”

Fortran90编程

Fortran90编程

字。以关键词end type结束。
派生类型的声明和使用
n 声明: n 赋值: n 引用结构成员:
例一:派生数据类型
模块(Module)
n 是一种不能直接执行的程序单元,但可以包含
数据声明和过程
n
使不同的过程实现过程和数据的共享 n 可以实现对自定义数据类型的封装
n 相对于program,function,subroutine,是一种特
例三:数据类型的范围
定义符号常量
n 符号常量在程序中不可以改变其值 n 定义符号常量可以增强程序的可读性和可维护
性 n 定义方法:加上parameter属性
real (8) ,parameter :: pi=3.1415926535_8
例四:定义符号常量
三、控制结构
n if语句:if then elseif else endif
n
在Compaq Visual Fortran中调用 CXML
n 第一种方法:在工程中加入cxml.lib
n 第二种方法:使用include
PROGRAM example INCLUDE 'CXML_INCLUDE.F90’
在Compaq Visual Fortran中调用 Intel MKL
n 添加库函数路径 n 在工程中加入mkl_s.lib
总结:Fortran90的新特性
n n n n n n n n
高级的表达能力:数组运算 (例如, X(1:N)=R(1:N)*COS(A(1:N))) 动态存储分配 (ALLOCATE, DEALLOCATE, ...) 导出类型(derived types)与操作符重载(operator overloading) 更好的变量声明方式(parameterized types),提高移植性 模块 更多的现代控制结构 (SELECT CASE,END SELECT,DO, END DO,EXIT...) 更多的内部函数 (date, precision, arrays, ...) 新的源程序书写格式-自由格式(free format) 指针

fortran90整理

fortran90整理

fortran90整理1语句编译1.Build—Compile:编译;Build—Build:连接;Build—Exetuce:运⾏;或单击⼯具栏相应按钮。

注意:a、保存⽂件时将⾃动创建同名的project⽂件,形成*.dsp⽂件;b、同时还将⾃动创建同名的workspace,形成*.opt和*.dsw⽂件;c、编译连接后⾃动形成Debug⽬录,该⽬录中存放编译连接后⽂件。

如:*.obj,*.lnk,*.exe等2.Free Format(⾃由格式)1.!感叹号后⾯的⽂本都是注释。

2.每⾏可以编写132个字符。

3.⾏号放在每⾏程序的最前⾯。

4.⼀⾏程序代码的最后如果是符号&,代表下⼀⾏程序会和这⼀⾏连接。

如果⼀⾏程序代码的开头是符号&,代表它会和上⼀⾏程序连接。

3.书写格式⾏的书写(⾏的长度、分⾏、续⾏)1⼀⾏可以是0~132个字符,空格有意义,2语句最长不超过2640个字符3⼀⾏可以有多个语句,⽤“;”分隔4⼀个语句可分⾏写,读⾏标记为&(放在尾部),但如为关键字,⾸尾均加&。

5最多可有511个续⾏。

4.语句的分类注释语句:!后的所有字符都被编译器忽略1.可独占⼀⾏,可在其它语句之后,a)空⾏为注释⾏(固定格式⽤C和*)2.说明语句:⽤于说明变量的类型、属性等3.可执⾏语句:输⼊、赋值、输出……5.语句有位置规定:说明语句必须出现在可执⾏语句之前,格式说明语句(FORMAT语句)除外。

6.标志符⼩结注释标志符:1⾃由格式:!固定格式:C *2语句分隔符:分号;(仅⾃由格式可以使⽤)3续⾏符:⾃由格式:&4申明标号:1到5位⽆符号整数5空格:关键字、变量、常量内部不能⽤空格,但相邻两者之间须⽤空格6.FORTRA90源程序基本结构1、FORTRAN90程序是⼀种分块结构,由若⼲个程序单元块组成:主程序、外部⼦程序、模块、块数据单元⽆论是主程序单元,还是⼦程序单元,都是独⽴的程序单位,应该独⽴编写,它们的形式相似。

FORTRAN90指导

FORTRAN90指导

FORTRAN90学习指导一、FORTRAN90基础知识1.源程序及其构成书写格式:主程序定义语句、结束语句注意:在没有程序名称的时候,程序开头的PROGRAM也不要出现。

如果使用了程序名称且在END语句中出现,则END语句中的PROGRAM不能省略。

语句行可以是0~132个字符;除赋值语句外,每个语句都要使用关键字开头。

如果希望一行中出现多个语句,语句一定要用分号隔开。

空格不能随便使用,关键字、变量和常量名以及操作符中的空格会使字符失去其原有的含义。

但它们之间一定要加空格。

注释行:以感叹号为标记,或“C”、“*”(FORTRAN90中不提倡此用法)续行标记:在句末尾添加续行符&,如果将关键字分成两行,则下一行开头也要加续行标记。

如果续行符出现在注释语句中,则失去了续行的功能。

2.FORTRAN90字符集126个英文字母(大小写字母等价)210个阿拉伯数字3下划线421个特殊字符:空格= + - * / (), . ‘: !“% & ;< > ? $5其他字符(只可以出现在字符常量、字符串编辑描述符、注释和输入输出记录中)3.基本数据类型1 整型KIND值可以为1、2、4类型说明关键字:INTEGERKIND值决定数据的范围。

对于整数没有误差。

I=3/2=1;I=1/2=0INTEGER(KIND=4)::AINTEGER*4::AINTEGER(4)::A2 实型KIND值可以为4(单精度7位有效数字)、8(双精度15~17位有效数字)类型说明关键字:REAL小数表示形式、指数表示形式(规格化的指数形式)错误表示形式:E34、.E34、0.14E2.38开3次方:8.0**(1.0/3.0)3 复型KIND值为4、8是实数的有序对,将两个实数中间用逗号分隔,然后放在一对括号中类型说明关键字:COMPLEX复数的运算:+、—、*、/4 字符型KIND值为国家语言种类由一对单撇号或一对双撇号之间的字符序列组成。

FORTRAN90程序设计1、2、3

FORTRAN90程序设计1、2、3

[例2-1]
PROGRAM H_TO_C !Given the F temprature,to calculate the Centigrade REAL::TC,TH READ *,TH TC=5*(TH-32)/9 PRINT *,TH,TC END PROGRAM H_TO_C
[例2-2] PROGRAM CAL_M_SUM IMPLICIT NONE INTEGER::N,M REAL::T,A N=0;T=0 PRINT *,'Input number of data:' READ *,M DO READ *,A T=T+A ;N=N+1 IF(N>=M)EXIT END DO PRINT *,T END PROGRAM CAL_M_SUM
输出结果S
[例1-1]N-S图
FORTRAN 语言的发展 源程序及其构成
语言元素
程序单元概念
FORTRAN 是 FORmula TRANslation 的缩写 1954年 1978年 第一个FORTRAN文本的提出 推出FORTRAN77
1991年
FORTRAN90问世
几个简单的FORTRAN90程序 FORTRAN90程序的构成
PROGRAM CAL_FACTOR IMPLICIT NONE INTEGER::FACTOR,S=0,I DO I=4,8 S=S+FACTOR(I) END DO PRINT *,'S=',S END PROGRAM CAL_FACTOR
FORTRAN90程序的构成
1.FORTRAN90是分块形式的程序,一个程序含有 多个程序单元,每个程序有且仅有一个主程序单元。 2.各程序单元由若干行构成。程序行主要有: 说明语句行 可执行语句行 注释行(用!开始)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FORTRAN 90 程序编程规范Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。

使编出的程序更易懂、易于维护。

1 语言选择数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。

选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。

Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。

2 Fortran 90 的新特性2.1.1 建议使用的Fortran 90 新特性建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。

尽量使用数组下标三元组,这样可优化并减少所需的代码行数。

为提高可读性,要在括号内表明数组的维数,例如:1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:)2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。

例如:2dArray(: , 2:len2) = scalar *( &Another2dArray(:, 1:len2 -1) &- Another2dArray(:, 2:len2) &)对程序单元(program units )命名,并使用End program ,Endsubroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。

在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。

新的表示方法更接近标准的数学符号在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

从效率的角度考虑,除递归定义的数据结构外,应尽量避免使用递归程序(它在使用内存和cpu 上会降低效率)。

建议定义新的操作符,而不要重载已有的操作符,这样可以清晰地表明功能,避免降低代码的可读性和可维护性。

2.1.2 关于Interface使用Interface 接口块。

在FORTRAN 语言中,主调程序与被调程序是分别编译的。

由于Fortran 90 对过程的许多功能做了扩充,有些功能单靠简单的调用语句已无法反映,因而系统也就无法进行正确的编译。

这时需要在主调程序中加入interface 接口块,通过它为主调程序与被调程序指明一个显式的接口。

如果被调用程序中哑元含有假定形状(assumed-shape )数组,或含可选变元,或含键盘输入的参数,就需要interface 接口块说明。

一般来讲,在Fortran 90 程序之间需要提供的interface 块,建议将interface 接口块明确写入调用程序,并复制被调用程序的参数列表。

这种方法简单易用,但也相应增加了维护代码的工作量,因为只要被调用程序的参数列表发生变化就必须相应改变interface 接口块和调用(call )语句。

2.1.3 关于动态内存的使用并行程序中存在着动态内存使用不充分的情况,合理使用动态内存可提高效率。

在Fortran90 中常采用下列方法获取动态内存。

自动数组(automatic arrays):这种数组的大小在子程序中指定,其大小取决于运行时的变量,例如,可通过参数列表向子程序传递实元变量。

使用自动数组优先于其它形式的动态内存分配方法。

可分配数组(allocatable arrays):声明为ALLOCATABLE 属性的数组变量可在运行时通过ALLOCATE 命令分配空间。

与指针不同的是ALLOCATABLE 属性不能用于派生数据类型中。

这种方法申请的空间要使用DEALLOCATE 命令释放。

在一个程序中,不要重复进行“ALLOCATE—DEALLOCATE-然后再ALLOCATE 一个更大的空间”这样的操作,这样会导致大量不可利用的碎片空间产生。

应在程序中对要开辟的动态数组空间进行连续分配,或连续释放。

在使用ALLOCATE 和DEALLOCATE 命令之后,要利用ALLOCATE 和DEALLOCATE 命令参数中的返回值来判断操作是否成功;不建议使用指针数组。

2.2 Fortran 90 中不建议使用的过时的特性不要使用固定书写格式,采用Fortran 90 的自由书写格式。

不要使用旧式的DO 循环和CONTINUE 语句。

在以前的DO 循环中,关键字之后大多有一个标号,循环在该标号处结束,如:DO 10 I = 1, 10DO 20 j= 1, 20A(i,j)=0.20 CONTINUE˜10 CONTINUE˜建议采用统一的DO 结构,如:DO i = 1, 10DO j = 1, 20A(i, j) = 0.END DOEND DO不能使用实循环变量˜在DO 循环中若用实数作循环变量,由于截断误差的存在,会导致得不到预期的循环次数,如应将下面的DO 循环DO r = 0.1 ,0.9 ,0.1...END DO改写为:DO i = 1 , 9r = i * 0.1...END DO不要使用DO WHILE 语句,可用不带循环变量的DO 语句配合exit 替代,如:不要使用选择性返回。

例如:CALL Foo( x, y, *100, *200, *300 )在执行完该子程序后程序根据Foo 的返回语句后的表达式值选择从标号为100 、200 、300 处继续执行。

可将上述子程改写为结构化CASE 语句:CALL Foo(x, y, return_code)SELECT CASE(return_code)...不要使用算法IF 语句:使用块IF 结构来代替;不要使用计算GO TO 语句,如GO TO (10,20,30) i ;不要使用标号赋值语句,如ASSIGN 300 iGO TO i不要使用除IMPLICIT NONE 之外的任何implicit 语句,如IMPLICIT REAL(a-z)不要使用DATA 语句,对变量赋初值可在声明时进行,或在程序中进行。

DATA 语句是唯一可用于对变量赋二进制、八进制、十六进制初值的语句,但它很可能造成程序的不可移植,因此除非必须这样做,一般建议不要采用。

不要使用COMMON 公共块:使用Modules 参数列表代替公共块向子程序传递数据;不要使用EQUIVALENCE 等价语句:Fortran90 中,由于模块、动态存储、指针、数据结构以及固有函数transfer 的引用,没有必要继续使用EQUIVALENCE 语句;不要使用数据块程序单元DATABLOCK ,在FORTRAN 77 中它用于给公用块内数据赋初值。

不要使用FORMAT 语句。

不要使用err= ,end= 及eor= 等描述符。

在输入输出语句中,这些描述符后面跟语句标号,指示如果出现错误则程序转向执行标号所标识的语句。

我们可用检查iostat 来替代,如:READ ( * , ”(A)” , iostat=status ) line不要使用语句函数,如f(x) = x**2 - 1可用contain 内部函数子程序来代替。

不要使用假定大小数组它是作为哑元使用的,它的最后一维无上界,而用*代替,如DIMENSION a(100,*)。

在Fortran 90 中可用假定形状数组代替,它的每一维都是可调的,并用(:)来声明,如:REAL , DIMENSION( 100 , : ) :: a不要使用FORTRAN 的INCLUDE 行。

在多数情况下可用USE 来代替,有些则采用预处理#include 来代替。

不能使用双精度类型,采用Fortran 90 的种别参数。

不要使用PAUSE 语句;不要使用ENTRY 语句:一个子程序只能有一个入口点;Fortran90 中避免数组在子程序之间传递时维数的隐式改变。

尽量不要采用经销商扩充的功能。

2.3 在FORTRAN 90 中限制使用的功能GO TO 语句和语句标号只能在程序出现异常情况需要立即退出时才能使用,即允许使用GO TO 语句的唯一例外,是在出现错误时跳到程序的末尾处,这时用9999 作为Labels(这样可使所有人都知道GO TO 9999 的意思)。

2.4 关于预编译器(Precompilers )的使用建议在数值预报创新系统中使用预编译器,因为它提供了一种可有选择的对程序系统的某一部分程序进行编译的方法(条件编译);另外,为了提高程序的可移植性,同样也需要使用预编译器。

由于超级计算机都是用UNIX 操作系统,C 预编译器(cpp, C language pre-processor)可能是最好的选择。

2.4.1 文件的包含Fortran 90 提供了利用“INCLUDE ”语句引入文件的功能,但有时需要加入文件的目录结构信息,因此可以改用cpp 中的#include 功能,是程序更加清晰。

“include ”后的文件可以是用于变量定义、子程序注释或interface 接口块等的一段程序。

如,SUBROUTINE FooIMPLICIT NONE...INTERFACE#include <type_package1.int>#include <type_package2.int>#include <type_package3.int>...CALL TypePackageIni#endif...END SUBROUTINE Foo将视type_package_init 的定义调用子程序TypePackageIni 。

3可读性与可维护性本节将主要介绍如何使Fortran 90 程序更易读、更易维护。

3.1 空白的使用空白的使用可以使程序更易读、易维护。

加入空白的方法主要有空行、空格。

3.1.1 空行在程序“段落”之间加入空行,可以使程序的逻辑结构更加清楚,程序段落更加明白。

如PROGRAM FooUSE module_aUSE module_bIMPLICITE NONEREAL :: timeREAl :: valueINTEGER loopvalue = 3.1415926WRITE(*,*) valueEND PROGRAM Foo3.1.2 空格在一行中加入一些空格,可以使程序更易读,如在赋值号左右至少加一个空格,在逗号后加一个空格。

相关文档
最新文档