当前位置:文档之家› Fortran实习-子程序调用

Fortran实习-子程序调用

Fortran实习-子程序调用
Fortran实习-子程序调用

实习二 区域水汽压计算

实习目的:熟悉水汽压物理量的计算方法,掌握子程序的循环调用。 实习内容:

已知有区域(25oN-50oN ,100°E-140oE ),水平分辨为5纬度×10经度的露点温度(oC )如下,请利用下面公式(1),计算各个格点的水汽压值(hPa )。

区域露点温度资料 7.5()237.36.1110

d d t t

e ?+=? (1)

资料输入提示:可用以下Fortran 语句对资料进行输入。 data td/17.8,17.9,18.1,18.2,18.3,18.2, & 17.9,18.0,18.1,18.3,18.4,18.3, & 18.1,18.2,18.2,18.4,18.5,18.4, & 18.2,18.3,18.3,18.2,18.4,18.2, & 18.1,18.2,18.3,18.2,18.2,17.9/

实习要求:

根据实习内容和资料,以调用子程序形式计算水汽压,撰写Fortran 程序,并运行检查。

program main

implicit none

external e

real td(30)

real es(30)

data td/17.8,17.9,18.1,18.2,18.3,18.2, &

17.9,18.0,18.1,18.3,18.4,18.3, &

18.1,18.2,18.2,18.4,18.5,18.4, &

18.2,18.3,18.3,18.2,18.4,18.2, &

18.1,18.2,18.3,18.2,18.2,17.9/

call e(td,es)

print '(1x,5f10.5)',es

end program

subroutine e(b,p)

real b(30)

real p(30)

integer ::i=0

do i=1,30

p(i)=6.11*10**((7.5*b(i))/(237.3+b(i)))

enddo

end subroutine

心得体会:此次实习我们主要训练了子程序的运用,子程序使编程的规范性可读性更强,使其更简洁的服务于人类需要。个人感觉插入子程序不是难点,语法上并不复杂,而逻辑上很符合人类思维方式,难点在于怎样把实际问题转化成所需的子程序。

这个实习内容并不是很难,但有很多细节需要注意。比如数组的逻辑结构和存储结构不一样,存储是按列进行的,所以最好使用循环才能按照指定格式输出结果。

今后我应该多多复习细节上的问题,多阅读良好的程序培养自己的编程能力。

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 90 程序编程规范

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 ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

fortran程序案例题汇编(14道)

1.Fibonacci数列定义如下: F1=1 F2=1 F n=F n-1+F n-2 (n>2) 求Fibonacci数列的前30项。 integer f(30),i f(1)=1 f(2)=2 do i=3,30 f(i)=f(i-1)+f(i-2) enddo print*,f end 2.输入10个学生的总分,求每个学生的名次integer s(10),a(10),i,j do i=1,10 read*,s(i) enddo do i=1,10 a(i)=1 do j=1,10 if(s(i)

3.给定一组数,按照从小到大的顺序输出。integer a(10) integer p do i=1,10 read *,a(i) enddo do j=1,9 p=j do i=j+1,10 if (a(i)

4.输入若干名学生的学号和三门课程(语数英)的成绩,要求从键盘输入一个学生的学号,能打印出该学生的三门功课成绩和总分。 character*6,dimension(:),allocatable::xue integer,dimension(:,:),allocatable::g integer,dimension(:),allocatable::zong integer i,j,n character*6,xh print *,"请输入学生的个数" read *,n allocate(xue(n)) allocate(g(n,3)) allocate(zong(n)) do i=1,n read *,xue(i),(g(i,j),j=1,3) enddo do i=1,n zong(i)=0 do j=1,3 zong(i)=zong(i)+g(i,j) enddo enddo print *,"请输入你要打印的学生的学号" read *,xh do i=1,n if(xue(i)==xh)then print *,(g(i,j),j=1,3),zong(i) exit endif enddo end

FORTRAN程序设计复习题及答案

FORTRAN程序设计复习题 一、选择题 B (1)下列各FORTRAN表达式中合法的是 A) S+T*2P >= B) .NOT. (A*B+C) C) A2+B2/(C+D) <= D) (A+B).NOT.A*B.GT.(.NOT.只跟一个表达式) C (2)数学式(3/5)ex+y的FORTRAN表达式是 A) 3*EXP(X+Y)/5 B) 3*E* *(X+Y)/ C) (3/5)*EXP(X+Y)D) EXP(X+Y) D (3)下列FORTRAN77表达式中不合法的是 A) A.GT.B.EQV.C.GT.D B) A.AND.B.AND.C.AND.D C) .NOT.(X.LE.D) A.LT.B.LT.C.LT.D D(4)下列叙述中不正确的是 A) FORTRAN子程序可以单独编译 B) 对一个FORTRAN源程序进行编译和连接无误后可生成可执行文件 C) 即使编译和连接都正确无误,FORTRAN程序运行时仍可能出错 D) FORTRAN连接的主要任务是把函数库中的函数翻译成机器指令(正确描述:主要任务为连接目标文件) B (5)在下列FORTRAN77运算符中,优先级最高的是 A) .AND. B) .NOT. C) .OR. D) .EQ. B (6)FORTRAN表达式"6/5+9/2**3/2"的值为 A) 33 B) 1 C) 5 D) 3 A (7)下列FORTRAN77表达式中,合法的是: A) .AND.. B) 10.0 C) D) 提示:A)相当于 .AND.(.NOT.()) D (8)关于编译一个FORTRAN源程序文件,下列说法中错误的是 A) 允许编译只有一个主程序而没有子程序的源文件 B) 允许编译有多个子程序的源文件 C) 允许编译只有一个子程序而没有主程序的源文件 D) 允许编译有多个主程序的源文件 C (9)在FORTRAN77源程序中,续行标志符必须放在 A) 第1列 B) 第1-6列C) 第6列D) 第5列 D (10)下列关于"SUBROUTIN E MAP(X,Y)"语句行的叙述中,不正确的是 A) 这是子程序的第一个语句 B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参D) 子程序执行后,MAP将返回整型数据 提示:子程序无返回值,自定义函数才有) A (11)FORTRAN表达式"2/4+"的值是 A) B) 1 C) D) 0 提示:2/4默认等于整型,=》 D (12)FORTRAN表达式"MOD,"的值是 A) B)0.0 C) D) A (13下列FORTRAN运算符中,优先级最低的是 A)逻辑运算符.AND. B)算术运算符*

fortran程序实例

1)实例3—求多个半径下的圆周长 ! z3.f90 --Fortran95 ! FUNCTIONS: ! z3 - Entry point of console application. !************************************************************************* ! PROGRAM: z3 ! PURPOSE: Entry point for the console application. !************************************************************************ program z3 ! 求多个半径下的圆周长 ! 主程序 ! PROGRAM Z3 PRINT *, 'R=',1.2,'C=',C(1.2) PRINT *, 'R=',3.4,'C=',C(3.4) PRINT *, 'R=',15.6,'C=',C(15.6) PRINT *, 'R=',567.3,'C=',C(567.3) END program z3 !子程序 FUNCTION C(R) PI=3.1415926 C=2*PI*R RETURN ! Body of z3 end

2)实例4—键盘与显示器输入/输出 a)Fortran 基本操作 b)程序指令 ! ZXZ_I_O.f90 ! FUNCTIONS: ! ZXZ_I_O - Entry point of console application. ! PROGRAM: ZXZ_I_O ! PURPOSE: Entry point for the console application. !***************输入、输出样式种种************************** program ZXZ_I_O implicit none !变量声明的位置 INTEGER(2) i; INTEGER(4) j; INTEGER(4) m; REAL n INTEGER A,B ! Variables PRINT*,'输入整数A'; READ*, A PRINT*,'输入整数B'; READ*, B B=A+B PRINT*,'B=A+B=',B WRITE(*,*) 'A*B=',A*B PRINT* ,'以上为计算机的计算结果,注意B的值'

中国海洋大学Fortran程序考试典型题

1、找出100-150之间和400-450之间能被9整除的数 2、找出100-999之间的回文数 3、找出水仙花数

4、输出“*”图形 5、输入n个数,找出大于平均值的数和最小数

6、把一个数值型数组的相同数删除到只剩一个 7、形成一个5*5矩阵,对角线元素为“i”,其余为“j”program juzhen implicit none integer I,J integer,parameter::size=5 integer::a(size,size) forall(I=1:size,J=1:size,I>J) a(I,J)=j forall(I=1:size,J=1:size,I==J) a(I,J)=i forall(I=1:size,J=1:size,I

integer,allocatable::c(:) write(*,*) "输入数组A的数据个数" read(*,*) n write(*,*) "输入数组B的数据个数" read(*,*) m l=m+n allocate (a(n)) allocate (b(m)) allocate (c(l)) write(*,*) "从小到大输入A的元素" do i=1,n read(*,*) a(i) end do write(*,*) "从小到大输入B的元素" do i=1,m read(*,*) b(i) end do do i=1,n c(i)=a(i) end do i=1 do while(i=c(n))then n=n+1 c(n)=b(i) goto 10 else if(b(i)>c(j).and.b(i)

几个fortran程序

计算圆周率 REAL R,R1,R2,PI ISEED=RTC() N0=0 N=300000 DO I=1,N R1=RAN(ISEED) R2=RAN(ISEED) R=SQRT(R1*R1+R2*R2) IF(R<1.0)N0=N0+1 END DO PI=4.0*N0/N WRITE(*,*)PI END 一)蒙特卡洛计算生日问题 假设有N个人在一起,各自的生日为365天之一,根据概率理论,与很多人的直觉相反,只需23个人便有大于50%的几率人群中至少有2个人生日相同。 INTEGER M(1:10000), NUMBER1(0:364), NUMBER2 REAL X,Y ISEED=RTC() DO J=1, 10000 NUMBER1=0 X=RAN(ISEED) NUMBER1(0)=INT(365*X+1) JJJ=1 DO I=1,364 Y=RAN(ISEED) NUMBER2=INT(365*Y+1) ETR=COUNT(NUMBER1.EQ.NUMBER2) IF (ETR= =1) THEN EXIT ELSE JJJ=JJJ+1 M(J)=JJJ NUMBER1(I)=NUMBER2 END IF END DO END DO DO I=1,10000 IF(M(I).LE.23) SUM=SUM+1 END DO PRINT *,SUM/10000 END 二)MONTE CARLO SIMULATION OF ONE DIMENSIONAL DIFFUSION 蒙特卡罗计算一维扩散问题

INTEGER X,XX(1:1000,1:1000) REAL XXM(1:1000) ! X:INSTANTANEOUS POSITION OF ATOM ! XX(J,I):X*X ,J:第几天实验,I:第几步跳跃 ! XXM(I): THE MEAN OF XX WRITE(*,*) "实验天数JMAX,实验次数IMAX" READ(*,*) JMAX,IMAX ISEED=RTC() DO J=1,JMAX !第几天实验 X=0 !!! DO I=1,IMAX !第几步跳跃 RN=RAN(ISEED) IF(RN<0.5)THEN X=X+1 ELSE X=X-1 END IF XX(J,I)=X*X END DO END DO OPEN(1,FILE="C:\DIF1.DAT") DO I=1,IMAX XXM=0.0 XXM(I)=1.0*SUM(XX(1:JMAX,I))/JMAX !! WRITE(1,*) I, XXM(I) END DO CLOSE(1) END 三维的! 三)通过该程序了解FORTRAN语言如何画图(通过像素画图)USE MSFLIB INTEGER XR,YR !在的区域中画一个圆 PARAMETER XR=400,YR=400 INTEGER R, S(1:XR,1:YR) X0=XR/2 ! 圆心位置X0,YO Y0=YR/2 R=MIN(X0-10,Y0-10) !圆半径 S=0 !像素的初始状态(颜色) DO I=1,XR DO J=1,YR IF((I-X0)**2+(J-Y0)**2<=R**2)S(I,J)=10 IER=SETCOLOR(S(I,J)) IER=SETPIXEL(I,J) END DO END DO END

fortran程序30个

程序1 PROGRAM chaper1272 INTEGER :: A(10)=(/5,7,4,8,12,2,10,3,9,11/) INTEGER :: sum=0,ave !打开一数据文件,设置一个有格式直接存取文件,将10个数分2个记录写入文件。 !数据文件生成2个记录,每个记录行长度相同,记录长度为25 OPEN(1,FILE='input21.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=25) WRITE(1,"(5I5)",REC=1)(A(I)+10,I=1,5) !按格式说明将头5个数写入第1个记录 WRITE(1,"(5I5)",REC=2)(A(I)+10,I=6,10)!按格式说明将后5个数写入第2个记录 READ(1,"(5I5)",REC=2)(A(I),I=6,10) !按格式说明从第2个记录中读取后5个数 READ(1,"(5I5)",REC=1)(A(I),I=1,5) !按格式说明从第1个记录中读取头5个数 DO I=1,10 sum=sum+A(I) ENDDO ave=sum/10 !打开一个最大记录长度为22的有格式顺序存取文件

OPEN(2,FILE='input22.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=22) WRITE(2,"('10个数之和为:',I5)",REC=1) sum !输出1记录行,记录长度为22 WRITE(2,"('10个数平均值为:',I5)",REC=2)ave !输出1记录行,记录长度为22 WRITE(2,"(A)",REC=3) '程序运行正常结束。' !输出一个记录行,记录长度为22 END 程序2 PROGRAM average REAL sum,ave INTEGER n OPEN(1,file='score.dat') PRINT*,'正在统计平均成绩,请等待。' sum=0.0;n=0 DO READ(1,*,END=100) S sum=sum+s n=n+1 ENDDO 100 ave=sum/n

aspenfortran子程序的编译、连接、运行

Aspen plus fortran 子程序的编译、连接与运行 Aspen Plus可以用来模拟反应精馏,但提供的动力学方程形式比较死板,很多类型的动力学方程都不能直接输入,不得不外接一个fortran 子程序。本来用到fortran 的机会就不多,所以会的人也不多。何况编写好fortran 子程序后,还要用fortran 编译器来编译生成obj 文件,而且每次运行的时候都得连接一次,比较麻烦。我的电脑以前是装了编译器这些软件 的,但最近出了问题,只能编译fortran 子程序,运行aspen外接fortran 子程序的时候就会出错。恰好这几天要帮师兄写个fortran 子程序,写完后需要调试,但又运行不了,重装 呢也没把握,想起网上有兄弟说过可以用asplink命令生成一个dll文件,这样就不用运行 aspen的时候每次都连接编译器了。于是找来资料学习学习,居然成功了,欣喜之余,分享给大家。第一步当然是编写动力学子程序了(此处省略若干字) 第二步编译写好的动力学子程序(以网友soaty的动力学子程序为例) 打开Aspen Plus Simulation Engine JS M... 打开后是这样的 接下来改变文件夹路径,转到存放动力学子程序的那个文件夹 比如我的文件路径是C:\ProgramData\Aspe nTech\Aspen Plus \IPP 于是输入cd C:\ProgramData\AspenTech\Aspen Plus \IPP

回车后就转到这个文件夹了,这时候就可以进行编译了:编译命令:aspcomp 输入命令aspcomp ,回车 到文件夹一看你会发现已经生成了obj文件了,

完整word版ABAQUS中Fortran子程序调用方法—自己总结

第一种方法:在Job模块里,创建工作,在Edit Job对话框中选择General选项卡,在User subroutine file中点击Select按钮,从弹出对话框中选择你要调用的子程序文件(后缀为.for或.f)。 第二种方法: 1. 建立工作目录?崠 2. 将Abaqus安装目录\6.4-pr11\site下的aba_param_dp.inc 或aba_param_sp.inc 拷贝到工作目录,并改名为aba_param.inc; 3. 将编译的fortran程序拷贝到工作目录; 4.将.obj文件拷贝到工作目录; 5. 建立好输入文件.inp; 6. 运行abaqus job=inp_name user=fortran name即可。 以下是网上摘录的资料,供参考: 用户进行二次开发时,要在命令行窗口执行下面的命令: abaqus job=job_name user=sub_name ABAQUS会把用户的源程序编译成obj文件,然后临时生成一个静态库standardU.lib和动态库standardU.dll,还有其它一些临时文件,而它的主程序(如standard.exe和explicit.exe等)则没有任何改变,由此看来ABAQUS是通过加载上述2个库文件来实现对用户程序的连接,而一旦运行结束则删除所有的临时文件。这种运行机制与ANSYS、LS-DYNA、marc等都不同。 这些生成的临时文件要到文件夹C:\Documents and Settings\Administrator\Local Settings\Temp\中才能找到,这也是6楼所说的藏了一些工作吧,大家不妨试一下。1子程序格式(程序后缀是.f; .f90; .for;.obj??) 答:我试过,.for格是应该是不可以的,至少6.2和6.3版本应该是不行,其他的没用过,没有发言权。 在Abaqus中,运行abaqus j=jobname user=username时,默认的用户子程序后缀名是.for(.f,.f90应该都不行的,手册上也有讲过),只有在username.for文件没有找到的情况下,才会去搜索username.obj,如果两者都没有,就会报错误信息。如果username包括扩展名for或obj,那么就根据各自的扩展名ABAQUS会自动选择进行操作。 2CAE中如何调用?Command下如何调用? 答:CAE中在creat job的job manager中的general中可以指定子程序;Command下用命令:abaqus j=jobname user=userfilename (无后缀); 3若有多个子程序同时存在,如何处理 答:将其写在一个文件中即可,然后用一个总的子程序调用(具体参见手册)++编写子程序?C,VC不是很熟,是否可以用VF我对4. A: 若要在vf中调试,那么应该根据需要把SITE文件夹中的 ABA_PARAM_DP.INC(双精度)或ABA_PARAM_SP.INC(单精度)拷到相应

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子程序源代码 SUBROUTINE UMA T(STRESS,STA TEV,DDSDDE,SSE,SPD,SCD, 1 RPL,DDSDDT,DRPLDE,DRPLDT,STRAN,DSTRAN, 2 TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,MA TERL,NDI,NSHR,NTENS, 3 NSTA TV,PROPS,NPROPS,COORDS,DROT,PNEWDT,CELENT, 4 DFGRD0,DFGRD1,NOEL,NPT,KSLAY,KSPT,KSTEP,KINC) C INCLUDE 'ABA_PARAM.INC' C CHARACTER*80 MA TERL DIMENSION STRESS(NTENS),STA TEV(NSTA TV), 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), 4 DFGRD0(3,3),DFGRD1(3,3) C DIMENSION PS(3),DSTRESS(NTENS),TDSTRESS(NTENS),TSTRESS(NTENS) PARAMETER (ONE=1.0D0,TWO=2.0D0,THREE=3.0D0,SIX=6.0D0) K=PROPS(1) N=PROPS(2) RF=PROPS(3) C=PROPS(4) FAI=PROPS(5)/180.0*3.1415926 G=PROPS(6) D=PROPS(7) F=PROPS(8) KUR=PROPS(9) PA=PROPS(10) DFAI=PROPS(11)/180.0*3.1415926 S1S3O=STA TEV(1) S3O=STA TEV(2) SSS=STA TEV(3) CALL GETPS(STRESS,PS,NTENS) FAI=FAI-DFAI*LOG10(S3O/PA) CALL GETEMOD(PS,K,N,RF,C,FAI,ENU,PA,KUR,EMOD,S,S3O,G,D,F 1 ,SSS,S1S3O) EBULK3=EMOD/(ONE-TWO*ENU) EG2=EMOD/(ONE+ENU) EG=EG2/TWO EG3=THREE*EG ELAM=(EBULK3-EG2)/THREE CALL GETDDSDDE(DDSDDE,NTENS,NDI,ELAM,EG2,EG)

FORTRAN经典入门程序20例

对于FORTRAN的初学者。这些例子可作为小练习。 1.例题:计算工资问题。每小时工资为RATE,如果工作超过40小时,加班呢部分工资是正常时间工资的1.5倍。 C Payroll with overtime program payroll real rate, hours, pay read (*,*) rate, hours if (hours>40) then pay=40*rate+(hours-40)*1.5*rate else pay=hours*rate END IF print *,"rate=", rate print *, "hours=", hours print *,"pay=",pay end 2.学生成绩问题。大于80为A级。大于60小于80为B级。小于60为C级。IF的嵌套。注意空格可以看清楚else if ,end if,print的内容. PROGRAM GRADESTUDENT READ *,GRADE IF (GRADE .GE. 80) THEN PRINT *,GRADE,"GRADE=>A" ELSE IF (GRADE.LT.60) THEN PRINT*,GRADE,"GRADE=>C" ELSE PRINT*,GRADE,"GRADE=>B" END IF END IF END 3.三个数按从小到大排序。 PROGRAM MAXMIN REAL A,B,C,T READ *,A,B,C IF (A.GT.B) THEN T=A A=B B=T ELSE END IF IF (B.GT.C) THEN T=B B=C

PROGRAM EQUATION READ (*,*) X IF (X .GE. 0.0) Y=3*X+6 IF (X .LT. 0.0) Y=-X**2+2*X-8 PRINT *,"X=",X, "Y=",Y END 6.CONTINUE语句。为了使循环的起止范围清晰,使用终端语句 例:求5! program ex1 FACT=1 do 10, N=1,5,1 ##DO 语句标号,循环不变量=初值,终值,步长FACT=FACT*N 10continue print*,FACT end 求1!+2!+3!+···+N! READ *,N FACT=1

Fortran求逆矩阵子程序

! 求逆矩阵 subroutine inverse(A,IA) implicit none real :: A(:,:), IA(:,:) real, allocatable :: B(:,:) integer :: i,j,N N = size(A,1) allocate(B(N,N)) ! 先把IA设定成单位矩阵 forall(i=1:N,j=1:N,i==j) IA(i,j)=1.0 forall(i=1:N,j=1:N,i/=j) IA(i,j)=0.0 ! 保存原先的矩阵A, 使用B来计算 B=A ! 把B化成对角线矩阵(除了对角线外,都为0) call Upper(B,IA,N) ! 先把B化成上三角矩阵call Lower(B,IA,N) ! 再把B化成下三角矩阵 ! 求解 forall(i=1:N) IA(i,:)=IA(i,:)/B(i,i) return end subroutine ! 求上三角矩阵的子程序 subroutine Upper(M,S,N) implicit none integer :: N

real :: M(N,N) real :: S(N,N) integer :: I,J real :: E do I=1,N-1 do J=I+1,N E=M(J,I)/M(I,I) M(J,I:N)=M(J,I:N)-M(I,I:N)*E S(J,:)=S(J,:)-S(I,:)*E end do end do return end subroutine Upper ! 求下三角矩阵的子程序subroutine Lower(M,S,N) implicit none integer :: N real :: M(N,N) real :: S(N,N) integer :: I,J real :: E do I=N,2,-1 do J=I-1,1,-1 E=M(J,I)/M(I,I)

优秀的fortran程序编程规范

Programming Guidelines for PARAMESH Software Development(NOTE: This document is heavily based upon the Introduction This document describes the programming guidelines to be used by software developers wishing to contribute software to the PARAMESH, parallel, adaptive mesh refinement software. We welcome people to contribute software and/or bug fixes to the PARAMESH AMR software. Software to be added to PARAMESH can come in 2 forms: ?Improvements to the basic PARAMESH kernal software found in the mpi_source, source and hearders directories. ?Software the addes additional functionality to PARAMESH. This type of software should be added as separate entities within the utilities directory. Complete applications should not be added as part of PARAMESH. PARAMESH is only meant to be a tool which supports parallel adaptive mesh applications and any software which supports this goal will be considered for acceptance into PARAMESH. For instance, a solver for the poisson equation that works with PARAMESH would be acceptable, but an application that solves the equation of gas dynamics would not. The PARAMESH software is slowly being evolved to be consistent with this document. Any new software which is contributed should follow these guidlines. If not, it will be rejected. This document deals mainly with Fortran 90, since most new PARAMESH software will probably be written in that language. [Throughout this document, the term "Fortran" should be understood to mean Fortran 90.] Since we expect C and C++ also to be used, a separate document dealing with them will be developed in the future. In the meantime, this document can serve as a general guideline for developing code to be used with PARAMESH in those programming languages. The guidlines in this document should be adhered to by ANY software which will be released as part of the PARAMESH package of source code. This includes software 'utilities' (stored in the paramesh/utilities directory) which add functionality to PARAMESH for different algorithms. It also should be applied to any new code developed and added to the main source code for PARAMESH in the paramesh/source, paramesh/mpi_source, or paramesh/headers directories.

相关主题
文本预览
相关文档 最新文档