搜档网
当前位置:搜档网 › FORTRAN学习中的一些小心得

FORTRAN学习中的一些小心得

FORTRAN学习中的一些小心得
FORTRAN学习中的一些小心得

FORTRAN 心得

第一部分:一些小心得

1 Fortran不区分大小写

2 Fortran有5种基本数据类型,integer,real, character, logical, complex

3 fortran fixed format格式中的变量赋初值一般用DATA,因为它不能用::

4 real(kind=8) a这种格式只使用于Fortran90,Fortran77中要使用real*8或real(8)

5 FORTRAN中FREE与FIXED两种格式do循环的区别:

Fortran 95使用end do来结束循环。

Fortran 77使用DO循环要麻烦一点,它不使用END DO来结束循环,而是使用行号来结束循环,程序代码要在DO的后面写清楚这个循环到哪一行程序代码结束。

Fortran 77中,经常会使用CONTINUE这个命令来结束循环。因为CONTINUE这个命令没有实际的用途,刚好可以拿来做封装使用。

6 循环的流程控制:

循环中的cycle命令相当于c++里的continue命令,用于结束一次循环

循环中的exit命令好比c里面的break,用于结束循环

7 不使用do循环,单纯用GOTO语句也能设计循环程序,但不推荐使用GOTO语句

7 fortran有等价声明:即用equivalence(a,b),这样使得a,b使用同一块内存,这样可以节省内存,有时可精简代码。

8 fortran77中只能用单引号。(还有疑问,因为fixed format能用双引号)

9 逻辑运算符

== /= > >= < <= !Fortran90用法

.EQ. .NE. .GT. GE. .LT. .LE. !Fortran77用法

9 PAUSE,CONTINUE,STOP

pause 暂停程序执行,按enter可继续执行

continue 貌似没什么用处,可用作封装程序的标志

%

STOP 命令用来结束程序,要谨慎使用

10 数组元素之间要用逗号分隔,而不能像matlab一样既可以用逗号也可以用空格,fortran 的数组元素之间不能用空格。

11 数组的声明:

Fortran 77中数组的声明,必须使用DIMENSION命令

Integer a; !先声明a是整型

Dimension a(10) !再声明a是大小为10的数组

Fortran 95中可以用简单的方法:

`

Integer a(10) !最简单的方法

Integer,dimension(10):: a !另一种方法

12 数组的赋值:

Fortran 77中数组的声明,可以使用DATA命令或隐含式循环来赋初值;

Fortran 95中可以直接设置初值;如:integer ::a(5)=(/1,2,3,4,5/);此时,括号和除号之间不能有空格;

13 与C不同,Fortran数组索引值默认从1开始,而且可以在声明时改变该规则,如

&

integer a(-3:1) !索引值为-3,-2,-1 ,0,1

13 数组在内存中的存放顺序也与C不同(正好相反),如a(2,2)在内存中的存放顺序为a(1,1),a(2,1),a(1,2),a(2,2);

原则是放低维的元素,再放高维的元素,此规则称为column major

矩阵输出时也是按列输出。。

14 Fortran的特色:隐含式循环

15 a,b都为数组,则可以这样用a=sin(b),(内部函数都可以这样用)

16 数组专用:

,

where命令形式上类似于if,但只用于设置数组where.....elsewhere...elsewhere...endwhere (没有then)

FORALL是Fortran95添加的功能,只能用于数组操作

forall可以嵌套使用,还可以在forall中使用where,但where中不能使用forall 15 Fortran中传递参数的原理与c++不同,Fortran中是传址调用,就是传递时用参数和子程序接受时用的参数使用一个地址,尽管命名可以不同。

16 调用自定义函数前需要做声明,调用子程序则不需要。

17 Module中有函数时必须在contains命令之后

18 全局变量(有的书上叫无名公用区、有名公用区)

全局变量用来定义一块共享的内存空间;

全局变量不能声明成常量

全局变量不能直接使用data命令赋初值,要在block data模块中使用data来设置初值。

COMMON语句是说明语句,因此它应该出现在相应程序单元中的所有可执行语句之前。

取用全局变量时,是根据它们的相对位置关系来作对应,而不是根据变量名称来对应。

19 传递参数与使用全局变量都可以在不同程序之间共享数据,那什么时候该使用参数,还有什么时候该使用全局变量呢

简单地说,当需要共享的变量不多,而且只有少数几个程序需要使用这些数据时,那就使用参数,

需要共享大笔数据,或是有很多不同程序都需要使用这些数据时,就使用全局变量。

20 INCLUDE命令

1 INCLUDE命令可以写在任何地方,它只是单纯地用来插入一个文件的内容。

2 有时候也会应用在声明全局变量,先把声明全局变量的程序代码编写在某个文件中,需

要使用全局变量的函数再去INCLUDE这个文件,这样可以减少程序代码。

第二部分:格式化输入输出

1 表控输入输出(即表控格式输入输出)

1 注意点:不同计算机系统对表控格式输出的规定不同,例如对一个整型数,有的系

统规定输出占13列,有的系统规定输出占10列,也有的系统不规定固定的列数而按照数据的实际长度输出,再用一个空格作分隔符。

,

2 如果在输入数据行中出现”/”号,表示对READ语句的输入到此结束,未被赋值的

变量将不予赋值。

2 FORMAT 语句

语句格式:

标号 FORMAT(格式描述符)

例如: write(*,100) i,j,k;

100 FORMAT(1X,I3,I5,I7),其中,1X是换行控制符(走纸控制),I3表示i变量的值输出占3列,I5表示j变量的值输出占5列

1格式描述符

主要介绍:I、F、E、X、纵向走纸、'(撇号)、r(重复系数)、/(斜杠)等(1)(

(2)

(3)X描述符

作用:用于输出空格

一般形式: nX

(4) I描述符

作用:用于整型数据的输出

一般形式: Iw 或

(5) F描述符

(

作用:用于实数的小数形式输出

一般形式:

(6)E描述符

作用:用于实数的指数形式输出

一般形式:

其中:E—实数的指数形式输出;

w—字段宽度;

|

d—数字部分的小数位数。

数值部分<1

(7)

(8)A描述符

作用:用于字符型数据的格式描述

一般形式: Aw或A ,其中w是字段宽度。

(9)‘号描述符

{

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

例如:write(*,100) i,j

100 format(1x,'i=',i3,' j=',i4)

(10)

(11)H描述符

作用:它的作用与撇号描述符类似,也可以输出字符型常量

一般形式: nH

建议:建议最好不要使用H描述符,而是使用撇号描述符,避免错误

]

例如: I=123

WTRITE(*,100),I

100 FORMAT(1X,2HI=,I3);

(12)

(13)斜杠描述符

反斜杠\描述符和美元$描述符的作用相同,都是在输出一个记录行后取消回车符,

常用于输出字符串与输入数据显示于屏幕同一行的情形。

?

例如:write(*,'("please enter your name",$)');

Read(*,*) My_age

(14)重复系数r

在format语句中,如果出现几个(或几组)相同的格式编辑符,则可以利用重复

系数而只写一个(或一组)编辑符。

r——可重复使用的次数。

}

例:

write(*,100) n1,n2,x,y1,y2,y3

100 format (1x, i10, i10, , , ,

Format (1x, 2i10, ,

第三部分:函数操作

!

1 语句函数

1 语句函数的定义

REAL(KIND=8) X, F

F(X)=X**2+X+1

2 语句函数的调用

语句函数一旦被定义后,就可以在本程序单元中被调用。调用的形式和调用内容函数形同,即:

语句函数名(实参)

2

3、

4说明

语句函数定义语句是非执行语句,它应该放在所有可执行语句之前和所有的说明语句之后。

语句函数只能在本程序单元中被使用。

2 函数子程序

1定义的一般形式:

类型说明符 FUNCTION 函数名(形参表)

函数主体

函数名=表达式;

END

或者:

FUNCTION 函数名(形参表)

函数主体

函数名=表达式;

END

3 子例行程序

子例行程序定义的一般形式:

SUBROUTINE 函数名(形参表)

。。。

end

子例行程序的调用:

-

CALL 子程序名(实参)

4 函数子程序与子例行程序的区别

1

2子例行程序的名称不用来返回函数的处理结果,因此是没有类型的。所以不能定义子例行程序的类型。

3子例行程序必须以SUBROUTINE语句开头,以END语句结束。

4能用函数子程序实现的功能,都能用子例行程序来实现,反之亦然。因此在程序设计时,要对具体问题选择哪种方式。

5由于不能给子例行程序名赋值,所以在将函数子程序转换为子例行程序时,应该增加一个变量用来带回在函数子程序中由函数名带出的子例行程序处理结果。

6子例行程序的调用需要专门的CALL语句。

-

5 数据块子程序(BLOCK DATA)

1 数据块子程序是非执行程序单元,因而在其中不能出现任何可执行语句,也不能被别的

程序调用。

2 它是专门用来给有名公用区中的项目赋初值的子程序。注意:COMMON变量不能直接在子

程序或主程序中使用DATA命令来设置初值,要在BLOCK DATA程序模块中使用DATA命令来设置初值。

3 数据块子程序是一个完整的程序单元。它由BLOCK DATA语句开始,END语句结束。

4 BLOCK DATA只能用来设置全局变量的初值,而且在主程序执行前,全局变量的初值内

容就会设置完毕,事实上这一段程序会在主程序执行前就会生效;

5 全局变量不能声明成常量,所以BLOCK DATA中不能出现PARAMETER。

6 MODULE

"

1 MODULE可以用来封装程序模块,通常是用来把程序中具备相关功能的函数及变量封装

在一起。例如需要使用全局变量时,可以把全局变量都声明在MODULE中,需要使用这些变量的函数只要USE这个MODULE就可以使用它们。

2 MODULE中的变量如果不是声明成全局变量,这些变量被函数使用时,只会是函数中的局部变量。

3 MODULE中还可以容纳函数,语法如下:

Module module_name

……… !先写声明相关程序代码

………

contains !从contains后开始写作函数

subroutine sub_name

………

end subroutine [sub_name] !subroutine不能省略

function function_name

…………..

end function [function_name] !function不能省略

end

这个做法比较符合模块化概念,编写大程序时,可以把程序中属于绘图功能的部分放在module Graphics中,把数值计算的部分放在module Numerical中。Visual Fortran中所提供的一些扩充函数库就用这个方法来归类,像是数值函数库IMSL就放在module IMSL,3D 绘图程序库OpenGL的函数就放在module OpengGL中。使用它们之前都要先use IMSL ,use OpenGL。

第四部分:FORTRAN的文件操作

1 记录结构(什么是记录结构)

一个数据文件在磁盘上的存放格式确定了文件的记录结构。例如,在DOS或windows下用现有的编辑器建立一个文件,其数据存放方式如下:

1,2,3,4,5

6,7,8,9,10

11,12,13,14,15

16,17,18,19,20

文件中存有4行数据,每行5个数据。在建立这些数据时,当每行最后一个数据输完后,打入了一个回车或换行标记(当然这是不可见标记)。以上文件有4行,每行末尾都有一个标记。因此,将每一行称为一个记录。可以这样说,一个记录包括多个数据,以回车或换行标记作为记录的结束。这就是记录的概念。

文件中的记录多少,每个记录的数据多少就是这个文件的记录方式—也称为记录结构。由多个数据记录按一定的结构形式存入磁盘,就组成了文件。

2 open语句的使用:

OPEN语句的功能是打开一个文件,其语句的基本格式为:(前后位置可以变化)

OPEN(UNIT=number,FILE=filename,STATUS=status,ACCESS=access,…)

其中,

1. UNIT=number

number必须是一个正整数,用来给后面的文件指定一个代码(这样方便使用write或read 等命令在文件上读写),它可以使用变量或是常量来赋值。Number值最好避开1、2、5、6。因为2、6是默认的输出位置,也就是屏幕。1、5则是默认的输入位置,也就是键盘。

2 FILE=filename

这个字段用来指定所要打开的文件名称,文件名要符合操作系统规定。最好不要使用中文名3 FORM=’FORMATTED’ OR ‘UNFORMATTED’

FORM字段只有两个值可以设置:’FORMATTED’或‘UNFORMATTED’

FORM=’FORMATTED’表示文件使用“文本文件”格式来保存

FORM= ‘UNFORMATTED’表示文件使用“二进制文件”格式来保存

这一栏不给定时,默认值为FORMATTED(潘师兄的程序大部分都没写这一栏)

4 STATUS=’NEW’或’OLD’或’SCRATCH’或’UNKNOWN’

STATUS=’NEW’一个存在的旧文件,如果文件存在,则打开。否则出现一个I/O错误STATUS=’OLD’文件决不能存在,否则出现一个I/O错误

STATUS=’SCRATCH’打开一个暂存文件,暂存文件是临时文件,当关闭或终止程序时,文件将被删除。这时不需要指定文件名称,也就是FILE这一栏可以省略,因为程序本身会自动取一个文件名。

STATUS=’ UNKNOWN’缺省时的默认值,文件存在则打开,不存在则创建,相当于NEW 与OLD的综合利用。

5 ACCESS=’SEQUENTIAL’或’DIRECT’

这个字段用来设置文件读写的方法

ACCESS=’SEQUENTIAL’读写文件的操作会以顺序的方法来做读写,这就是“顺序读取文件”

ACCESS=’DIRECT’读写文件的操作可以任意指定位置,这就是“直接读取文

件”

不赋值时,默认值为SEQUENTIAL’

6. RECL=length

7 ERR=LABEL

这个字段用来设置当文件打开发生错误时,程序会跳跃到LABEL所指的行代码处来继续执行程序。

3 直接读取文件的操作

在FORTRAN语言中,读取文件的操作可以有“顺序读取”及“直接读取”两种方法。

所谓的直接访问文件,即将文件事先分区成好几个同样大小的小模块,(即指定记录号,且在每条记录中的数据还是按顺序的),再来进行读写的工作。

~

4 读写命令WRITE与READ语句的运用

WRITE/READ

(UNIT=number,FMT=format,NML=namelist,REC=record,IOSTAT=stat,ERR=errlabel,END=E NDLABEL,ADVANCE=advance,SIZE=size)

1UNIT=number 指定文件代码

2

3FMT=format 指定输入输出格式,若为 *号则表示自由格式(为了读写数据的准确,建议使用*号)

4

5 REWIND的使用

Rewind语句将一个文件的操作位置重新定位在其第一条记录上。其语句格式为:

REWIND(u,ERR=LABEL,IOSTAT=iocheck)

u, 文件编号

ERR=LABEL 遇到错误转到LABEL语句

IOSTAT=iocheck 返回文件打开的状态,见OPEN语句。

6 BACKSPACE语句

Backspace语句用于在文件数据操作中,从当前数据位置回退到上一个数据位置。其语句

格式为:

BACKSPACE(UNIT=number,ERR=errlabel,IOSTAT=iostat)

7 ENDFILE语句

把当前的文件位置变成文件的结尾。

8 INQUIRE语句

查询文件状态命令

第五部分:使用QuickWin

1 使用QuickWin特性的程序必须显示地用语句USE DFLIB

访问QuickWin图形库;

2 必须把用户项目的类型选为

第六部分:FORTRAN内置函数学习

1DBLE

语法:result=DBLE(a)

作用:转换维双精度实数

参数类型:ALL

函数值类型:real(8)

fortran调试经验

FORTRAN调试程序的时候注意的问题 调试程序的时候注意的问题。 程序编好,能够直接运行而且完全正确,基本不可能,这就有调试程序的问题。主要有一下几个方面: 其一,在每个子程序被调用的时候留个心眼,写个输出语句,表示程序已经运行到了这里。这样一个小提示会给调试带来巨大的方便,如果程序运行出错,至少你可以知道它是在运行到哪里出的错,这样,直接去检查那个程序就可以了。不必重头开始检查。 其二,注意对中间计算结果的输出。有时候,而且是很多的时候,程序编译成功,运行也没有问题,就是结果不对,这肯定是计算原理有问题,此时,输入一些重要步骤的中间结果,往往可以检查出问题所在。同时,就算查出了问题所在,也可以不删除这段输出中间计算结果的代码,有可能后面还会有用处,此时,在每行输出语句前加一个感叹号,把代码变成注释的绿体字就可以了。等到再次需要输出的时候,直接删除一个“!”比再写一遍输出代码,当然要简单的多。 其三,对WATCH功能的应用,FORTRAN提供的这个功能很实用,可以查很多问题,尤其是程序中间计算值,这个和上述的中间结果的输出有点相似。但两者的不同是前者可以进行中间结果的输出控制,就是只有符合了某个条件的才能被输出,这样可以便捷程序的调试,同时对中间结果输出后可以直接用STOP停止程序的运行,这样对于大型程序来说,节省了很多后面继续计算的时间——因为前面的结果已经不对了,后面的算也是白算。 其四,对中间结算结果输出形式的控制,一般来说,FORTRAN计算结果可以输出到文件里面和计算界面两个地方。对较大的计算结果,可以输出到文件里面,反之较少的结果可以直接输出到屏幕上,为了增强数据的可读性,最好进行有格式的数据输出,以利于相同性质的数据的比较。输出到屏幕上的结果直接用WRITE(6,*)就可以(无格式),对于输出到文件里面的数据,可以省些事情,直接用WRITE(X,*)就可以,其中X是一个任意的正整数,最好大于10,也不用事先对这个X设备进行说明,程序会将结果输出到一个FORT.X的文件里面,例如10,就是FORT.10,此时,用NOTEPAD或者ULTRA-EDIT都可以把它打开——FORT.10实质上就是一个.DAT的文件,你可以把它重命名。 3.对数据计算时的误差控制。 以前觉得小数点后的误差不是那回事,没有太在意,可经过实战,终于明白了小小的误差完全可以改变整个计算的结果。因此,如果程序能够输入结果而不正确时,除了寻找算法的问题,不要忽略的误差。一般认为,FORTRAN的REAL变量小数点后8位数字误差定义已经足够,而事实上,这个精度可能在一些情况下不满足,这个时候,需要用更精确的变量类型——REAL(8),同理,当要判断两个数是否相等的时候,一定要慎用相等判断(.EQ.)这个比较运算符,因为任何数据,别看着在现实中它们一定相等,在程序中就不一定了。一旦经过了计算,就不可避免的产生了舍入误差,对于整数和有限几位循环的有理数都问题不大,可一旦是一个无理数或者无限循环的小数,只有在判断了小数点后的每一位都相等的时候,程序才判断为相等成立。这个相等的标准是非常苛刻的,所以一般情况下,可行的方法是将

ABAQUS中Fortran子程序调用方法

第一种方法: / o/ J5 @6 U/ ^- o$ 1. 建立工作目录/ ]" 2. 将Abaqus安装目录\6.4-pr11\site下的aba_param_dp.inc或aba_param_sp.inc拷贝到工作目录,并改名为aba_param.inc; # ~/ |0 I0 E6 {, @4 X3 q: W3. 将编译的fortran程序拷贝到工作目录; 4. 将.obj文件拷贝到工作目录; 5. 建立好输入文件.inp; 6. 运行abaqusjob=inp_name user=fortran name即可。 第二种方法: 在Job模块里,创建工作,在EditJob对话框中选择General选项卡,在Usersubroutine file中点击Select 按钮,从弹出对话框中选择你要调用的子程序文件(后缀为.for或.f)。 , D8 i7 d/r c6 @" | 以下是网上摘录的资料,供参考:. |$ t/ }$W7 Y6 m4 h6 D6 j 用户进行二次开发时,要在命令行窗口执行下面的命令: 4 O. R+ ^,@( ? abaqus job=job_name user=sub_name ABAQUS会把用户的源程序编译成obj文件,然后临时生成一个静态库standardU.lib和动态库standardU.dll,还有其它一些临时文件,而它的主程序(如standard.exe和explicit.exe等)则没有任何改变,由此看来ABAQUS是通过加载上述2个库文件来实现对用户程序的连接,而一旦运行结束则删除所有的临时文件。这种运行机制与ANSYS、LS-DYNA、marc等都不同。 : j6 g' R-o( {0 [* N2 J3 X这些生成的临时文件要到文件夹C:\Documentsand Settings\Administrator\Local Settings\Temp\中才能找到,这也是6楼所说的藏了一些工作吧,大家不妨试一下。 1子程序格式(程序后缀是.f; .f90; .for;.obj??) 答:我试过,.for格是应该是不可以的,至少6.2和6.3版本应该是不行,其他的没用过,没有发言权。在Abaqus中,运行abaqusj=jobname user=username时,默认的用户子程序后缀名是.for(.f,.f90应该都不行的,手册上也有讲过),只有在username.for文件没有找到的情况下,才会去搜索username.obj,如果两者都没有,就会报错误信息。 如果username包括扩展名for或obj,那么就根据各自的扩展名ABAQUS会自动选择进行操作。 2CAE中如何调用?Command下如何调用? 答:CAE中在creat job的jobmanager中的general中可以指定子程序; Command下用命令:abaqus j=jobnameuser=userfilename (无后缀); 3若有多个子程序同时存在,如何处理 答:将其写在一个文件中即可,然后用一个总的子程序调用(具体参见手册) 4我对VF不是很熟,是否可以用VC,C++编写子程序? A: 若要在vf中调试,那么应该根据需要把SITE文件夹中的ABA_PARAM_DP.INC(双精度)或ABA_PARAM_SP.INC(单精度)拷到相应的位置,并改名为ABA_PARAM.INC即可。 据说6.4的将可以,6.3的你可以尝试着将VC,C++程序编译为obj文件,没试过。在你的工作目录下应该已经存在ufield.obj和uvarm.obj这两个文件(这两个文件应该是你分别单独调试ufield.FOR和uvarm.FOR时自动编译生成的,你可以将他们删掉试试看),但是由于你的FOR文件中已经有了UV ARM 和UFIELD这两个subroutine,显然会造成重复定义,请查实。 用户子程序的使用 假设你的输入文件为:a.inp b.for 那么在ABAQUS Command 中的命令应该是这样的: abaqusjob=a user=b

fortran常见问题解决

楼主为了减少重复回答问题,特编此帖,并不定期添加和更新内容。 错误难免,欢迎讨论,仅供参考。 很多人问哪里可以找到Fortran编译器,有不少热心学友提供网址,特汇集在这里。虽然俺检验过这些链接,但是它们不一定总有效。 Fortran编译器下载: CVF? FTN95(License:Freeforpersonaluse) 以下操作,如无特别说明,都是以为例。 1.如何加大Stacksize? 选Project=>Settings=>Link=>Category:Output=>? Stackallocations Reserve:这里填新值(默认为1M,若需要10M,则填) 2.如何用Fortran批量生成文件? 设要生成4000个文件,文件名为AA1-AA4000,如何写循环生成文件,而不用写4000次write 命令呢? 用内部文件: character(len=80)::filename,form integer::i doi=1,4000 selectcase(i) case(1:9) write(form,'(i1)')i case(10:99) write(form,'(i2)')i case(100:999) write(form,'(i3)')i case(1000:9999) write(form,'(i4)')i endselect write(filename,*)"AA",trim(form),".TXT" open(10,file=filename) write(10,*)i close(10)

enddo? stop end 3.如何用Fortran动态生成输出格式? 设有一个数组data(100),输出时,希望每行输出num个数,而num由用户输入,如何实现? 用内部文件: character(len=80)::form real::data(100) integer::i,num data=(/(i,i=1,100)/)/ read(*,*)num write(form,*)"(",num,"" write(*,form)data stop end 4.MS是不是很垃圾? 是垃圾,其中Bug太多,多到不可用的地步! 在这个主题里,换了CVF后问题就没了的人已有相当的数目。 如果你用,遇到莫名其妙的错误,建议换,这是一个比较成熟的编译器。 5.如何用F90/95生成随机数? 注意: 现在计算机产生的随机数都是伪随机数。 random_number(x)产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。用了random_seed()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。 programrandom implicitnone real::x callrandom_seed()!系统根据日期和时间随机地提供种子 callrandom_number(x)!每次的随机数就都不一样了 write(*,*)x stop endprogramrandom 6.函数/子程序超载的例子

Fortran95程序设计课后习题答案(word版方便)

第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去write(*,*) rb/ra ! 输出1.5 5.p rogram main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/2.54 write(*,"(f8.3'米='f8.3'厘米='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五章 1.program main implicit none integer money real tax write(*,*) "请输入月收入" read(*,*) money if ( money<1000 ) then tax = 0.03 else if ( money<5000) then tax = 0.1 else tax = 0.15 end if write(*,"(' 税金为'I8)") nint(money*tax) end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几" read(*,*) day select case(day) case(1,4) tv = "新闻" case(2,5) tv = "电视剧" case(3,6) tv = "卡通" case(7) tv = "电影" case default write(*,*) "错误的输入" stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*) "请输入年龄" read(*,*) age write(*,*) "请输入月收入" read(*,*) money if ( age<50 ) then if ( money<1000 ) then tax = 0.03 else if ( money<5000 )then tax = 0.10 else tax = 0.15 end if else if ( money<1000 ) then tax = 0.5 else if ( money<5000 )then tax = 0.7 else tax = 0.10 end if end if write(*,"(' 税金为'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4, mod_100, mod_400 write(*,*) "请输入年份" read(*,*) year mod_4 = ( MOD(year,4) == 0 ) mod_100 = ( MOD(year,100) == 0 ) mod_400 = ( MOD(year,400) == 0 ) if ( (mod_4 .NEQV. mod_100) .or. mod_400 ) then days = 366 else days = 365 end if write(*,"('这一年有'I3'天')") days stop end program 第六章 1.program main implicit none integer i do i=1,5 write(*,*) "Fortran" end do stop end program 2.program main implicit none integer i,sum sum = 0 do i=1,99,2 sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer, parameter :: answer = 45 integer, parameter :: max = 5 integer weight, i do i=1,max write(*,*) "请输入体重" read(*,*) weight if ( weight==answer ) exit end do if ( i<=max ) then write(*,*) "猜对了" else write(*,*) "猜错了" end if stop end program 4.program main implicit none integer, parameter :: max=10 integer i real item real ans ans = 1.0 item = 1.0 do i=2,max item = item/real(i) ans = ans+item

fortran课后习题答案

第一章 FORTRAN程序设计基础第15页 1、2 1.简述程序设计的步骤。 “程序设计”:反映了利用计算机解决问题的全过程,通常要经过以下四个基本步骤:(1)分析问题,确定数学模型或方法;(2)设计算法,画出流程图;(3)选择编程工具,编写程序;(4)调试程序,分析输出结果。 2. 什么是算法?它有何特征?如何描述算法? 解决问题的方法和步骤称为算法。 算法的五个特征:(1) 有穷性。 (2) 确定性。 (3) 有效性。 (4) 要有数据输入。(5) 要有结果输出。 算法的描述有许多方法,常用的有:自然语言、一般流程图、N-S图等。 第二章顺序结构程序设计 第29页 1、2、3、4、5、6、7、8、9 1.简述符号常量与变量的区别? 符号常量在程序运行过程中其值不能改变。变量在程序运行过程中其值可以改变。 2. 下列符号中为合法的FORTRAN 90标识符的有哪些? (1) A123B (2) M%10 (3) X_C2 (4) 5YZ (5) X+Y (6) F(X) (7) COS(X) (8) A.2 (9) ‘A’ONE (10) U.S.S.R. (11) min*2 (12) PRINT 3. 下列数据中哪一些是合法的FORTRAN常量? (1) 9,87 (2) .0 (3) 25.82(4) -356231 (5) 3.57*E2 (6) 3.57E2.1 (7) 3.57E+2(8) 3,57E-2 4. 已知A=2,B=3,C=5(REAL);且I=2,J=3(INTEGER),求下列表达式的值: (1) A*B+C 表达式的值: 11 (2) A*(B+C) 表达式的值: 16 (3) B/C*A 表达式的值: 1.2 (4) B/(C*A) 表达式的值: 0.3 (5) A/I/J 表达式的值: 0.33 (6) I/J/A 表达式的值: 0 (7) A*B**I/A**J*2 表达式的值: 4.5 (8) C+(B/A)**3/B*2. 表达式的值: 7.25 (9) A**B**I 表达式的值: 512 5. 将下列数学表达式写成相应的FORTRAN表达式: (1) 1E-2 (2)(-B+SQRT(B*B-4*A*C)/(2*A) (3) 1+X+X*X/2+X**3/2/3 (4) COS(ATAN((A**3+B**3)**(1.0/3)/(C*C+1))) (5) EXP(A*X**2+B*X+C) (6) COS(X*Y/SQRT(X*X+Y*Y))**3 6. 用FORTRAN语句完成下列操作: (1) 将变量I的值增加1。I=I+1 (2) I的立方加上J,并将结果保存到I中。 I=I**3+J (3) 将E和F中大者存储到G中。G=Max(E,F) (4) 将两位自然数N的个位与十位互换,得到一个新的数存储到M中(不考虑个位为0的情况) M=MOD(N,10)*10+N/10 第三章选择结构程序设计第43页 1、2、3、5、6、7、9 1.分析下列程序运行结果 (1) LOGICAL P INTEGER I,I1,I2,I3 P=.FALSE. READ*,I I1=MOD(I,10) I2=MOD(I/10,10) I3=I/100

fortran常见错误

FAQ之常见错误 2014-02-02 13:45:35 来源:Fcode研讨团队评论:2点击:4419 本文从编译错误,链接错误,运行时错误,计算结果错误等四个方面介绍了常见的错误及解决思路。适合初学者阅读。 首先应该明确:错误有哪几种?我们当前遇到的是何种错误? 阐述这些问题前,我们先讨论一下常规的应用程序开发的过程: 1>>编写代码,使用一个或多个源代码文件。 2>>对第一步的每一个源代码文件执行编译操作。得到一个或若干个目标代码。 3>>将目标代码,运行时库(Run-time Library)和其他使用到的函数库链接起来。得到一个可执行文件(EXE 或其他) 4>>编写程序的说明书,必要的(输入)数据文件 5>>将上述得到的结果发布给用户。(发布的方式可以是刻录成光盘,销售,放在网站上供别人下载,或者其他) 6>>用户得到程序后,运行,输入数据,得到计算结果。 对于很多 Fortran 程序员来说,可能用户就是自己,也可能仅仅是自己教研室的同事同学。所以第4,5,6步骤很多时候不明显。而如果使用集成开发环境(IDE)进行开发,第1,2,3步骤又可以一键完成。因此,很多初学者就认为,写程序就是:输入代码,运行,得到结果。这样的理解太狭义。 不管我们面对什么使用者来写代码,程序开发应该是上述的过程。我们的编译器,编译环境,也是为这个过程而设计的。 于是,我们将错误分为四种: 一. 编译错误(发生在第2步) 编译错误,一般是源代码书写格式不正确,不符合语法要求。 二. 链接错误(发生在第3步) 链接错误,一般是源代码结构不完整,运行时库或函数库使用不合理。 三. 运行时错误(发生在第6步) 运行时错误,一般是执行代码时,遇到了事先未料及的错误。比如内存不足了,磁盘空间不够了,输入文件格式不对了,输出文件写入失败了等等。 四. 计算结果不符合预期(程序代码不规范,或不符合你的设想) 计算结果不符合预期,可能性就很多了。语法与你的想法不一致,超出函数库的适用范围,执行流程控制不当等等。 这四种错误,其排查难度依次增大。也就是,编译错误最容易排查和修改,而计算结果不正确,最让人头疼。

fortran中批处理实现

********************************************* fortran中批处理命令的实现函数: 利用systemqq命令(需要调用DFLIB 数据库) ********************************************* 例1: USE DFLIB character*100 CMD LOGICAL(4) res CMD="dir/a-d/b/s "//trim(fPath)//" >"//trim(outPut) res=SYSTEMQQ(CMD) 例2: USE DFLIB LOGICAL(4) result result = SYSTEMQQ('copy e:\dir.txt e:\test\dir.txt') !将e:\dir.txt 复制到e:\test\dir.txt文件中。!****************实例3:复制文件************************* 例3: programmain_pro USE DFLIB implicit none integer,parameter::sta_num=123 character(5),dimension(sta_num)::sta_ID character(500)::filein,fileout character(5000)::cmd logical(4)::judge

integer::status,is open(1,file='山东.txt',status='old',action='read',iostat=status) read(1,*) do is=1,sta_num read(1,*) sta_ID(is) filein='Z:\data\降水逐小时数据-戴至修\precip_data\'//sta_ID(is)//'_precip.txt' open(2,file= filein,status='old',action='read',iostat=status) if(status/=0) goto 1000 fileout='Z:\data\降水逐小时数据-戴至修\山东省-降水数据\'//sta_ID(is)//'_precip.txt' cmd='copy '//filein//' '//fileout judge=SYSTEMQQ( cmd) 1000 continue enddo end program

(完整版)Fortran之COMMON语句

Fortran之COMMON语句 FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,还可以通过建立公用区的方式来完成。公用区有两种,一种是无名公用区,任何一个程序中只可能有一个无名公用区;一种是有名公用区,一个程序中可以根据需要由程序员开辟任意多个有名公用区。建立无名和有名公用区都通过COMMON语句来进行。 按照结构化程序设计的指导思想,通常主张通过虚实结合的途径来传送数据而不主张使用公用区。因为前者使程序有较好的可读性,而且容易跟踪数据的流向,便于对程序进行调试和维护。但是虚实结合的传送方式速度较慢,特别是在各程序单位之间有大量的数据需要传送时速度问题就更为突出。不同程序单位利用公用区交换数据的速度却比虚实结合的方式传送速度快得多。所以在很多应用程序中如果各程序单位之间有大量数据需要传送时,程序员一般仍然采用开辟公用区的方式。 11.2.1 无名公用区 开辟无名公用区COMMON语句的一般形式如下: COMMON a1,a2,… 其中a1,a2,…允许是普通变量名、数组名和数组说明符(注意:不是数组元素),它们之间用逗号隔开。例如: 在主程序中写:COMMON X,Y,I,Z(3) 在子程序中写:COMMON A,B,J,T(3) 于是,在无名公用区中变量X和A,Y和B,I和J分别分配在同一个存储单元中,数组Z和T同占三个存储单元。占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。

FORTRAN编译程序在编译时为COMMON语句开辟一个无名公用区,当把不同的程序单位连接在一起的时候,不同程序单位在COMMON语句中的变量按其在语句中出现的先后顺序占用无名公用区连续的存储单元,也就是说每个程序单位中的COMMON语句总是给出现在语句中的第一个变量分配在无名公用区的第一个存储区单元。 COMMON语句开辟公用区的主要用途就是使不同程序单位的变量之间 进行数据传送,另一种用途是用来节省存储空间。下面的例子通过公用区进行交换数据: PROGRAM MAIN COMMON Z1,Z2 READ(*,*)A1,A2,A3 CALL QUAD(A1,A2,A3) WRITE(*,*)Z1,Z2 END SUBROUTINE QUAD(A,B,C) COMMON X1,X2 . . . END 或者: PROGRAM MAIN COMMON Z1,Z2,A1,A2,A3 READ(*,*)A1,A2,A3 CALL QUAD() WRITE(*,*)Z1,Z2 END

计算机程序设计语言(FORTRAN语言)

计算机程序设计语言(FORTRAN语言) 1. 编译程序能将高级语言编写的源程序转换成。 A.解释程序 B.汇编程序 C.映象程序 D.目标程序 答案:D 2. 一个完整的FORTRAN源程序。 A.至少包括一个主程序 B.至少包括一个主程序和一个子程序 C.由一个主程序与一个以上的子程序组成 D.由一个主程序与一个子程序组成 答案:A 3. 语句函数定义语句在程序内合法的位置是。 A.在程序块开头语句之后,END语句之前 B.在程序块开头语句之后,可执行语句之前 C.在说明语句之后,END语句之前 D.在说明语句之后,可执行语句之前 答案:D 4. 下列关于函数子程序虚实参数的错误说法是。 A.可以没有形参数 B.虚实结合的数组长度可以不同

C.实参表与虚参表类型可以不同 D.函数名可以作为虚参 答案:C 5. 下列叙述中正确的是。 A.FORTRAN程序块中,无名公用语句只能有一个 B.FORTRAN子程序中,至少应有一个RETURN语句 C.FORTRAN程序块中,最后一行必须是END语句 D.FORTRAN程序块中,必须有变量说明语句 答案:C 6. 运行下面的程序时得不到所需的结果,其主要原因是。 INTEGER X(11) DATA X/9,8,7,6,5,4,3,2,1,0,-1/ DO 10 1=1,X(1) ,-1 WRITE(*,*)1.0/SQRT(25.0-REAL(X(1) )* * 2) 10 CONTINUE END A.没有给X(11) 赋初值 B.发生除以零的情况 C.发生负数开平方的情况 D.循环参数设置错误 答案:D 7. 下列数据中,不符合FORTRAN常量表示法的是。 A.-25.6 B.2.758D3

fortran问题

imsl7.0中用use linear_operators这句话是会出错的,当时intel论坛上也有人问,后来intel 给出了个X64 imsl的补丁,但是32位的没有。 要使用包含在linear_operators这个库中的函数时,要用use+原函数 例如:上面那个例子把use linear_operators改成use operation_xt即可 另外,imsl7.0引用函数和以前版本不一样的 补充一点: linear_operators这个文件是这样子的(一看就知道原因了): modulelinear_operators usecond_int usedet_int usediag_int usediagonals_int usefft_int useifft_int useeye_int uselin_eig_self_int uselin_sol_self_int usenorm_int useoperation_i useoperation_ix useoperation_t useoperation_h useoperation_tx useoperation_hx useoperation_x useoperation_xi useoperation_xt useoperation_xh useorth_int userand_int userank_int usesvd_int useunit_int useeig_int usechol_int useisnan_int end module 1. 如何加大Stack size? 选Project => Settings => Link => Category: Output =>

Fortran进行批处理地方法

Fortran中批量处理文件的方法总结 —循环读取目录下的所有符合条件的文件===================== 一、简单的介绍 在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。 对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦! 这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。 我总结的批处理方法大概可以用下面这个示意图来说明: | | |将文件目录写入一个文本文件,供fortran循环读取 |————手动输入文件名 |————运行程序之前命令行工具导出文件名 |————程序运行后,未开始计算之前,生成文件名 | ————调用CMD命令生成 | ————GETFILEINFOQQ方法生成 | ————调用WIN32API生成 | |在程序运行时动态生成文件名 | | 对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。第二种方法主要是说明其思路。 二、方法的介绍 1、将文件目录写入一个文本文件,供fortran循环读取 1.1、手动输入文件名 这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。

Fortran 运行中给出的系统错误及解决方法

. Fortran 运行中给出的系统错误及解决方法 以下均为linker tools errors and warnings Linker Tools Error LNK1000 unknown error; consult documentation for technical support options Note the circumstances of the error, try to isolate the problem and create a reproducible test case, then contact technical support. Linker Tools Error LNK1101 incorrect MSPDBxx.DLL version; recheck installation of this product The version of MSPDBxx.DLL available on your system does not match the version required by this tool. Linker Tools Error LNK1102 out of memory There was not enough memory for the tool to run. Probably the paging file exceeded available disk space. If a shortage of disk space is not the cause, note the circumstances of the error, try to isolate the problem and create a reproducible test case, then request technical support. Linker Tools Error LNK1103 debugging information corrupt; recompile module Probably the compilation was terminated before a valid object file was created.Recompile the given object file. If recompiling does not correct the problem,note the circumstances of the error, try to isolate the problem and create a reproducible test case, then consult technical support. Linker Tools Error LNK1104 cannot open file "filename" The tool could not open the given file. One of the following may be a cause: l There was not enough disk space. l The file does not exist. l The filename or its path was incorrectly specified. l The specified drive is invalid. l The file does not have the appropriate permissions. l The path for filename expands to more than 260 characters. l If the given file is named LNKn, which is a filename generated by the linker for a temporary file, then the directory specified in the TMP environment variable may not exist, or more than one directory is specified for the TMP environment variable. (Only one directory path should be specified for the TMP environment variable.) l If the error occurs on the executable filename, an earlier version of the executable may still be running. You will need to terminate the executable before linking it. In Windows NT (including Windows 2000) or Windows 95,you can use the utility PVIEW to look for and kill instances of the application. l If the error message occurs for a library name, and you recently ported the .MAK file from a previous Microsoft Visual C++ development

fluent常见错误汇总 (1)

Fluent 计算错误汇总 1. .fluent 不能显示图像 在运行fluent 时,导入case 后,检查完grid ,在显示grid 时,总是出现这样的错误 Error message from graphics function Update_Display: Unable to Set OpenGL Rendering Context Error: FLUENT received a fatal signal (SEGMENTATION VIOLATION). Error Object: () 解决办法解决办法:: 右键单击快捷方式,把目标由x:fluent.incntbinntx86fluent.exe 改成: x:fluent.incntbinntx86fluent.exe 2d -driver msw 如果还有三维的,可以再建立一个快捷方式改成: x:fluent.incntbinntx86fluent.exe 3d -driver msw 这就可以直接调用了。如果不是以上原因引起的话,也有可能是和别的软件冲突,如MATLAB 等,这也会使fluent 无法显示图像。 Q1:GAMBIT 安装后无法运行,出错信息是“unable find Exceed X Server” A. GAMBIT 需要装EXCEED 才能用。 gambit 的运行:先运行命令提示符,输入gambit,回车 fluent 的运行:直接在开始-程序-Fluent Inc 里面 Q2:Fluent 安装后无法运行,出错信息是“unable find/open license.dat" A. FLUENT 和GAMBIT 需要把相应license.dat 文件拷贝到FLUENT.INC/license 目录下 Q3:出错信息:运行gambit 时提示找不到gambit 文件? A. FLUENT 和GAMBIT 推荐使用默认安装设置, 安装完GAMBIT 请设置环境变量, 设置办法“开始-程序-FLUENT INC-Set Environment" 另外设置完环境变量需要重启一下,否则仍会提示找不到环境变量。 Q4:使用Fluent 和Gambit 需要注意什么问题? A. 安装好FLUENT 和GAMBIT 最好设置一下用户默认路径 推荐设置办法,在非系统分区建一个目录,如d:\users a) win2k 用户在控制面板-用户和密码-高级-高级,在使用fluent 用户的配置文件 修改本地路径为d:\users,重起到该用户运行命令提示符,检查用户路径是否修改 b) xp 用户,把命令提示符发送到桌面快捷方式,右键单击命令提示符快捷方式 在快捷方式-起始位置加入D:\users,重起检查

Fortran95实验指导 实验八 子程序

实验八 函数与子例行程序 子程序是FORTRAN95提供的重要功能之一,FORTRAN95允许用户自己定义子程序,允许用户通过子程序设计和编写程序。在设计和编写一个复杂的程序时,通常需要使用科学的程序设计方法,如:结构化程序设计方法、模块化程序设计方法、面向对象程序设计方法等,子程序功能完全支持结构化和模块化程序设计方法,结构化和模块化程序设计方法可通过子程序得到应用。使用子程序可提高程序的可读性、可理解性、可维护性和可修改性,是编写高质量、高水平、高效率程序的有效手段。 子程序分内部子程序和外部子程序。内部子程序是包含在程序单元CONTAINS 结构中的子程序,只有定义它们的程序单元才能调用执行它们。内部子程序包括函数子程序和子例行程序两类,通常将函数子程序简称为函数,子例行程序简称为子程序。 本次实验是学习和掌握子程序的一次系统实验活动。通过本次实验,能够熟练使用语句函数、内部子程序、外部子程序设计和编写程序,求解比较复杂的实际问题。 一、实验目的 1. 了解函数的有关基本概念,如:函数名称、函数自变量、函数调用、函数表达式等。 2. 掌握语句函数定义、调用、参数的基本内容和使用规则。 3. 掌握使用语句函数设计和编写程序的方法。 4. 了解内部子程序的有关基本概念,如:定义、调用、形式参数、实在参数、参数传递关系等。 5. 掌握内部子程序定义、调用、形式参数、实在参数、参数传递的基本内容和使用规则。 6. 掌握结构化程序设计方法。 7. 掌握使用内部子程序设计和编写程序的方法。 8. 了解递归概念,掌握递归问题的求解方法。 9. 掌握递归子程序定义、调用、参数传递关系的基本内容和使用规则。 10. 了解外部子程序概念,掌握并行、协调、合作编写大型复杂程序的方法。 11. 掌握外部子程序定义、调用、参数传递关系的基本内容和使用规则。 12. 掌握使用递归和外部子程序设计和编写程序的方法 二、实验内容1 1、问题描述 在解决某工程计算问题时,遇到下列函数: 2()12y x x x =++ 2 ()f x = ()p x = ()q x =计算x=0.1,0.2,0.3时,上述函数的值,并输出。使用语句函数编写程序实现之。

相关主题