几个fortran程序
fortran
第一章 程序设计概述
1. 2. 3. 4. 5.
程序设计语言 程序与程序设计 算法的基本概念和特征 程序设计方法 习题一
5
《FORTRAN90程序设计》课多媒体课件
1.1 程序设计语言
概述 分类
目前,程序设计语言种类很多,各有特色,但本质相同。
程序设计语言属于人工语言、形式语言、非自然语言。 程序设计语言分:低级语言(机器语言、汇编语言)、高级语言。
概念
描述 示例
源程序、目标程序、汇编程序、编译程序之关系。
程 高级语言源程序 序 设 计 语 言
低级语言 编译程序 汇编语言程序
MOV ADD CPL INC ADD CPL INC OUTL
A,2H A,3H A A A,4H A A BUS,A
-----将2送累加器A -----将3与累加器相加,结果在累加器 -----将累加器数取反,求反码 -----将累加器数加1,求补码,结果为-5 -----将4与累加器相加,结果-1在累加器 -----将累加器数取反,求反码 -----将累加器数加1,求补码,结果为1 -----将累加器数1从总线输出
概述 分类
概念
描述 示例
任何一个计算机系统都是按照人们用某种程序设计语言编写的程序 进行工作,人们通过程序设计语言编写的程序来指挥和控制计算机运行。 程序设计语言是人与计算机进行交流的有效工具,伴随计算机诞生而诞 生,伴随计算机发展而发展,在计算机科学技术的发展过程中,发挥了巨 大作用。 对于计算机来说,如果说CPU是计算机心脏,那么程序设计语言及 其程序就是其灵魂。了解和掌握程序设计语言和程序设计方法是驾驭和 运用计算机系统的重要一环。
第六讲 Fortran中的子程序
一、子例行程序的定义
子例行程序是以Subroutine 语句开头,并以End语句结束的一 个程序段,其定义的一般格式为:
Subroutine 子例行程序名(虚参表)
子例行程序体 end
2015/12/20 12
注意: (1)子例行程序的命名方法与变量相同。虚参由变量、数组 名(不能是数组元素,常数、表达式)充当,当有多个虚参 时,之间用“ ,” 分隔,没有虚参时子例行程序名后面的一对 括号可以省略; (2)子例行程序的设计方法与函数子程序相同,但不能有对 子例行程序名的赋值语句(因为其名字没有值)。
第六讲 Fortran中的子程序
实际中的程序由若干个程序单元组成,但是有且只有一个主 程序( Program main ),其它的都是子程序。子程序是构造 大型实用程序的有效工具,设计程序要善于利用子程序,因 此,本讲学习Fortran中的子程序:函数子程序和子例行程序。 此外,在Fortran中还有一种类似与函数子程序的语句函数。
2015/12/20 15
分析:牛顿迭代公式为:
program newton f(x)=7*x**4+6*x**3-5*x**2+4*x+3 f ( xn ) df(x)=28*x**3+18*x**2-10*x+4 xn 1 xn ' f ( xn ) read*,x0,e !x0=-1.0,e=0.0001 x1=x0 首先要给个迭代初值 x0 , x2=x1-f(x1)/df(x1) 代入公式的右边计算 x1 , do while(abs(x1-x2)>e) 再把 x1 代入计算出 x2 , … , x1=x2 x2=x1-f(x1)/df(x1) 当第n次和第(n+1)次计算 end do 结果差不多时(在规定的 print*,x1,f(x1) 精度内),则计算结果就 end
Fortran 百科
FORTRAN,亦译为福传,是英文“FORmula TRANslator”的缩写,译为“公式翻译器”,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。
FORTRAN 语言以其特有的功能在数值、科学和工程计算领域发挥着重要作用。
目录FORTRAN开发历史Fortran的版本Fortran的特性Fortran语言的Hello World程序Fortran编译器Fortran程序包Fortran的将来FORTRAN开发历史早在1951年,美国IBM公司约翰·贝克斯(John Backus)针对汇编语言的缺点着手研究开发FORTRAN语言,并于1954年在纽约正式对外发布。
称约翰·贝克斯提出的FORTRAN语言为FORTRANⅠ,FORTRANⅠ虽然功能简单,但它的开创性工作,在社会上引起了极大的反响。
到1957年第一个FORTRAN编译器在IBM704计算机上实现,并首次成功运行了FORTRAN程序。
在1958年,对FORTRANⅠ进行了扩充和完善,引进了子函数等概念,推出了商业化的FORTRANⅡ版本。
之后,FORTRAN语言发展迅速,多种版本相继在其它计算机上实现。
在1962年,推出了FORTRAN Ⅳ。
FORTRAN Ⅳ没有充分考虑兼容性,导致FORTRANⅡ程序不能在FORTRAN Ⅳ系统中运行,使其应用受到了很大限制,这时语言不兼容性问题和影响被突出表现出来。
此前也出现过FORTRAN Ⅲ,但由于存在严重缺陷,没有在计算机上实现。
随着FORTRAN语言版本的不断更新和变化,语言不兼容性问题日益突出,语言标准化工作被提上了日程。
1962年5月,美国标准化协会(简称ANSI)成立相关机构着手进行FORTRAN语言标准化的研究工作,并于1966年正式公布了两个标准文本:美国国家标准FORTRAN(ANSI X3.9-1966)和美国国家标准基本FORTRAN(ANSIX3.10-1966),前者相当于FORTRAN Ⅳ,后者相当于FORTRANⅡ。
2.Fortran简介01
数学运算 变量
• 变量区分为整型变量INTEGER、实型变量 REAL、双精度变量DOUBLE PRECISION、 复型变量COMPLEX、逻辑型变量 LOGICAL、字符型变量CHARACTER。
数学运算 变量
• 隐含约定:Fortran规定,凡以字母I,J, K,L,M,N六个字母开头的变量名,如无 另外说明则为整型变量。以其它字母开头 的变量为实型变量。可以将这个隐含约定 称为“I—N规则” ,表示用I到N之间的字 母开头的变量为整型。例如:I,J,IMAX, NUMBER,LINE,JOB,Kl为整型变量, 而A,Bl,COUNT,AMOUNT,TOTAL, BOOK为实型变量。
数学运算 内在函数
• • • • • ABS EXP SIN COS ASIN ACOS TAN ATAN LOG LOG10 INT MOD SIGN REAL MAX MIN 注意三角函数中的自变量单位为弧度!
数学运算 算术表达式
• FORTRAN规定可以使用五种算术运算符号。 它们是: • + 表示“加”(或正号); - 表示“减”(或 负号) • * 表示“乘”; / 表示“除” • ** 表示“乘方” • 两个运算符不能紧邻,如A*-B是不合法的, 应写成A*(-B)。 • 优先次序为: 括号 >函数 > ** > * / > + -
数学运算 变量
• 类型指定:如果想改变“I—N规则”,可 以用类型说明语句专门指定某些变量的类 型。 • (1)INTEGER语句(整型说明语句) • (2)REAL语句(实型说明语句) • (3)DOUBLE PRECISION语句(双精度) • (4)COMPLEX语句(复型说明语句) • (5)LOGICAL语句(逻辑型说明语句) • (6)CHARACTER语句(字符型说明语句)
我编的FORTRAN程序
write(*,*) "猜错了"
end if
stop
end program
program main
implicit none
integer, parameter :: length = 79
character(len=length) :: input, output
integer,parameter :: players=5
type(player) :: people(players)=(/player(30.0,25.0,0.0),player(45.0,20.0,0.0),player(35.0,21.0,0.0),player(50.0,27.0,0.0),player(40.0,22.0,0.0)/)
select case(day)
case(1,4)
tv = "新闻"
case(2,5)
tv = "电视剧"
case(3,6)
tv = "卡通"
case(7)
tv = "电影"
case default
write(*,*) "错误的输入"
real function angle_to_rad(angle)
use constant
implicit none
real angle
angle_to_rad=angle*Pi/180.0
return
end
subroutine Get_distance(person)
use constant
use typedef
fortran子程序【精选】
parameter (n1=3,n2=3,n3=3)
dimension a(n1,n2)
dimension b(n2,n3),c(n1,n3)
open(5,file='input.dat')
call getmat(a,n1,n2)
call getmat(b,n2,n3)
call matpro(a,n1,n2,b,n3,c)
20 continue end
real w(5,5) call readin(w)
输入矩阵 1,2,3,4,5 2,3,4,5,1
call opp(w,x1,x2) write(*,100) x1,x2 100 format(1x,'The two sum of',
3,4,5,1,2
$ ' oppusite angles elements:',
subroutine sub(ch) charact...er*(*) ch end
11
(4)如果实参是变量或数组元素,在调用子程序时, 对应的虚实参数实际上将共用同一存储单元。
program main
subroutine sub(x,a)
integer a,c(3)
integer x,a
data c/3*0/
4,5,1,2,3 5,1,2,3,4
$ /1x,'x1=',f8.2,' x2=',f8.2) end
9
主要区别:
1. 形式不一样(function、subroutine、call),无虚参 时括号使用不一样。
2. 子程序名的意义不一样。函数子程序名代表函数值, 通过其传递数据,需要类型说明;而子例行程序名仅 为了调用使用,通过虚实参传递数据。
第3章 Fortran程序设计初步-1(fortran77)
在FORTRAN77的基础上添
加了很多内容,FOR95只 能视为FOR90的修正版, 加强了并行运算方面的 支持功能.
5/116
NEXT
3.2 简单程序分析
10 20 30 40 50 60 70 80 01234567890123456789012345678901234567890123456789012345678901234567890123456789
3/116
3.1 FORTRAN语言发展概况
FORTRAN-Formula Translation (公式翻译) 是世界上第一个被正式推广使用的高级语言 (于1954年提出; 1956年正式使用) Fortran是数值计算领域里使用的主要语言; 发展(有代表性的几个版本): 早期的版本不是 Fortran Ⅱ 1958 结构化语言,没 Fortran Ⅳ 1962 (Fortran 66) 有直接实现三种 基本结构的语句 Fortran 77 1978 (使用goto实现 Fortran 90 1990 特定操作).F77
35/116
FORTRAN编译系统—连接装配
36/116
FORTRAN编译系统—开始运行
37/116
FORTRAN编译系统—显示结果
38/116
FORTRAN编译系统—开始运行
FORTRAN90编译系统界面简介 FORTRAN90编译系统操作步骤 FORTRAN90编译系统基本设置等
3.3 Fortran书写格式
Fixed Format(固定格式)
第1个字符
当为字母c、C或*,这一行文本会当成说明 或批注,不会被编译。 当为数字,就是用来给这一行程序代码取 个代号,不然只能是空格。
fortran常用算法程序集
fortran常用算法程序集Fortran是一种广泛用于科学和工程计算的编程语言。
由于其强大的数值计算能力,Fortran在许多领域,如物理、数学、工程和生物信息学中,仍然被广泛使用。
在Fortran中,有许多常用的算法可以用来解决各种计算问题。
下面是一些常用的Fortran算法程序集的示例。
1.冒泡排序算法```fortranPROGRAMBubbleSortIMPLICITNONEINTEGER,DIMENSION(:),ALLOCATABLE::arrINTEGER::i,j,tempALLOCATE(arr(10))!分配数组空间!填充数组数据arr=[9,8,7,6,5,4,3,2,1,0]DOi=1,SIZE(arr)-1DOj=i+1,SIZE(arr)IF(arr(j)>arr(j-1))THEN!交换相邻元素temp=arr(j)arr(j)=arr(j-1)arr(j-1)=tempENDIFENDDOENDDOPRINT*,"排序后的数组:"PRINT*,arr(:)ENDPROGRAMBubbleSort```这个程序使用冒泡排序算法对一个整数数组进行排序。
冒泡排序是一种简单的排序算法,通过重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2.二分查找算法```fortranPROGRAMBinarySearchIMPLICITNONEINTEGER::arr(10),low,high,found=0INTEGER::mid=0PRINT*,"请输入要查找的元素:"INPUT(INTEGER)::xlow=0high=SIZE(arr)-1DOWHILE(found==0)!直到找到元素或数组遍历完为止mid=(low+high)/2!计算中间位置IF(arr(mid)==x)THEN!如果中间元素等于要查找的元素,则找到found=1!设置found标志为1,表示找到元素ELSEIF(arr(mid)>x)THEN!如果中间元素大于要查找的元素,则在左半部分查找high=mid-1!将high指向中间元素的左边的位置ELSE!如果中间元素小于要查找的元素,则在右半部分查找low=mid+1!将low指向中间元素的右边的位置ENDIFENDDOIF(found==0)PRINT*,"元素未找到。
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. 数组:数组类型用于表示多个相同类型的数据。
fortran
上机流程之STEP2:编译源程序
具体操作:单击菜单项 Build→Compile 文件名.扩展名或单击
编辑窗口上方的相应工具栏图标即可。 注:如若还未建立项目(或工程)区,则会出现一提示对话框, 询问是否生成项目(工程)工作区,单击“是”,则开始进行编译; 如若已经建立并打开了项目(或工程)区,则直接开始编译源程序。
• 使用上下文相关的帮助 F1 • 其它帮助途径
上机流程之STEP1:编辑源程序
创建Fortran程序:
1、建立新文件:选择菜单项 File→New,进入文件 类型Files选 择对话框,选择固定格式(Fortran Fixed Format Source File)文 件,然后单击“Ok”按钮就可生成一个新的文件,并进入文件编辑 窗口。 2、打开文件:选择菜单项 File→Open 或单击工具栏中的图标, 进入打开文件对话框,在文件名对话框中输入要打开的文件的名 称,或单击浏览窗口中所列出的要编辑的文件,然后单击“打开” 按钮就可进入文件编辑窗口。
在Windows下直接运行 Compaq Fortran V6.5光盘 中的Setup.exe文件,然后按照提示一步一步安装即 可。
3.2 工作方式: 1、可视化开发工作台(Windows) 2、命令行(DF命令)
3.3 启动Compaq Fortran V6.5
•单击开始→程序→ Compaq Visual Fortran6 →Developer Studio
POWER STATION 1.0 到FORTRAN POWER STATION4.0编译器后 将其卖给了DEC公司。
DEC随即推出了DVF5.0(Digital Visual FORTRAN 5.0),
其工作环境与MFC5.0完全一致。接着又推出了DVF 6.0(Digital Visual FORTRAN 6.0,其工作环境与MFC6.0完 全一致。后来,DEC又将其卖给了COMPAQ。
fortran程序汇总
计算圆周率REAL R,R1,R2,PIISEED=RTC()N0=0N=300000DO I=1,NR1=RAN(ISEED)R2=RAN(ISEED)R=SQRT(R1*R1+R2*R2)IF(R<1.0)N0=N0+1END DOPI=4.0*N0/NWRITE(*,*)PIEND一)蒙特卡洛计算生日问题假设有N个人在一起,各自的生日为365天之一,根据概率理论,与很多人的直觉相反,只需23个人便有大于50%的几率人群中至少有2个人生日相同。
INTEGER M(1:10000), NUMBER1(0:364), NUMBER2REAL X,YISEED=RTC()DO J=1, 10000NUMBER1=0X=RAN(ISEED)NUMBER1(0)=INT(365*X+1)JJJ=1DO I=1,364Y=RAN(ISEED)NUMBER2=INT(365*Y+1)ETR=COUNT(NUMBER1.EQ.NUMBER2)IF (ETR= =1) THENEXITELSEJJJ=JJJ+1M(J)=JJJNUMBER1(I)=NUMBER2END IFEND DOEND DODO I=1,10000IF(M(I).LE.23) SUM=SUM+1END DOPRINT *,SUM/10000END二)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 XXWRITE(*,*) "实验天数JMAX,实验次数IMAX"READ(*,*) JMAX,IMAXISEED=RTC()DO J=1,JMAX !第几天实验X=0 !!!DO I=1,IMAX !第几步跳跃RN=RAN(ISEED)IF(RN<0.5)THENX=X+1ELSEX=X-1END IFXX(J,I)=X*XEND DOEND DOOPEN(1,FILE="C:\DIF1.DAT")DO I=1,IMAXXXM=0.0XXM(I)=1.0*SUM(XX(1:JMAX,I))/JMAX !!WRITE(1,*) I, XXM(I)END DOCLOSE(1)END三维的!三)通过该程序了解FORTRAN语言如何画图(通过像素画图)USE MSFLIBINTEGER XR,YR !在的区域中画一个圆PARAMETER XR=400,YR=400INTEGER R, S(1:XR,1:YR)X0=XR/2 ! 圆心位置X0,YOY0=YR/2R=MIN(X0-10,Y0-10) !圆半径S=0 !像素的初始状态(颜色)DO I=1,XRDO J=1,YRIF((I-X0)**2+(J-Y0)**2<=R**2)S(I,J)=10IER=SETCOLOR(S(I,J))IER=SETPIXEL(I,J)END DOEND DOEND四)画一个圆(1、如何选出晶界区域;2、进一步加深对画图的理解)USE MSFLIBINTEGER XR,YR !在的区域中画一个圆PARAMETER XR=400,YR=400INTEGER R, S(0:XR+1,0:YR+1), XN(1:4), YN(1:4), SNSXN=(/0,0,-1,1/)YN=(/-1,1,0,0/)X0=XR/2 ! 圆心位置X0,Y0Y0=YR/2R=MIN(X0-10,Y0-10) !圆半径S=0 !像素的初始状态(颜色)DO I=1,XRDO J=1,YRIF((I-X0)**2+(J-Y0)**2<=R**2)S(I,J)=10IER=SETCOLOR(S(I,J))IER=SETPIXEL(I,J)END DOEND DODO I=1,XR !画晶界DO J=1,YRNDS=0DO K=1,4IF(S(I,J).NE.S(I+XN(K),J+YN(K)))NDS=NDS+1END DOIF(NDS>0)THENIER=SETCOLOR(9)ELSEIER=SETCOLOR(8)END IFIER=SETPIXEL(I,J)END DOEND DOEND五)MC模拟一个晶粒的缩小USE MSFLIBPARAMETER IR=400,JR=400INTEGER IS(0:IR+1,0:JR+1),TMAX,ISN(1:8),NSTATE,T,NR,IX,IY WRITE(*,*)"PLEASE INPUT THE TIME STEP "READ(*,*)TMAXISEED=RTC()! 定义圆心和半径IRC=IR/2JRC=IR/2R=MIN(IRC,JRC)-10! 定义基体和圆晶粒分别为状态1、状态2IS=1DO I=1,IRDO J=1,JRDISTANCE=SQRT(1.0*(I-IRC)**2+1.0*(J-JRC)**2)IF(DISTANCE.LT.R)IS(I,J)=2ISE=SETCOLOR(IS(I,J))ISE=SETPIXEL(I,J)END DOEND DOOPEN(1,FILE="E:\LUKE.DAT")! 寻找晶粒边界,计算能量,改变状态。
fortran常用算法程序集
Fortran常用算法程序集简介Fortran是一种面向科学和工程计算的编程语言,通常用于数值计算和数据分析。
它有着强大的数学计算能力和高性能,被广泛应用于科学计算、工程仿真、天气预报等领域。
本文将介绍一些常用的Fortran算法程序集,包括数值积分、矩阵运算、排序算法等。
数值积分数值积分是求解定积分的一种方法,用于计算曲线下面积、求解微分方程等。
Fortran提供了一些常用的数值积分算法,如梯形法则、辛普森法则等。
梯形法则梯形法则是数值积分中最简单的算法之一,基本思想是将曲线下面积近似为一系列梯形的和。
下面是使用Fortran编写的梯形法则算法示例:! 梯形法则real function trapezoidal_rule(f, a, b, n)real, external:: freal:: a, b, n, hreal:: x, suminteger:: ih = (b - a) / nsum= f(a) + f(b)do i =1, n-1x = a + i * hsum=sum+2* f(x)end dotrapezoidal_rule = (h/2) *sumend function trapezoidal_rule辛普森法则辛普森法则是一种更精确的数值积分算法,基于多项式插值的思想。
它将曲线分成若干小段,每段近似为一个二次函数,然后对每个二次函数进行积分。
下面是使用Fortran编写的辛普森法则算法示例:! 辛普森法则real function simpsons_rule(f, a, b, n)real, external:: freal:: a, b, n, hreal:: x, sum1, sum2integer:: ih = (b - a) / nsum1 = f(a) + f(b)sum2 =0do i =1, n-1, 2x = a + i * hsum2 = sum2 +4* f(x)end dodo i =2, n-2, 2x = a + i * hsum2 = sum2 +2* f(x)end dosimpsons_rule = (h/3) * (sum1 + sum2)end function simpsons_rule矩阵运算矩阵运算是科学计算中常用的一个重要环节,Fortran提供了丰富的矩阵运算库,包括矩阵乘法、矩阵转置、矩阵求逆等。
fortran 教程
fortran 教程Fortran是一种古老而强大的编程语言,最初在1957年开发。
它被广泛用于科学和工程计算,特别是对大型和复杂的计算任务。
Fortran之所以如此受欢迎,是因为它在数学计算领域表现出色。
它拥有丰富的数学函数和运算符,并且支持高精度计算。
此外,Fortran还具有强大的数组处理能力,可以轻松处理大规模数据。
Fortran的语法相对简单,易于学习和使用。
它使用英语类似的语法,语句以换行符结束。
Fortran中的语句通常以关键字开始,例如"PROGRAM","SUBROUTINE"和"DO"等。
Fortran具有自己的变量类型,包括整数(INTEGER)、实数(REAL)和字符(CHARACTER)等。
变量必须在使用之前先声明,并且可以指定其大小和精度。
Fortran还支持过程式编程,包括子程序和函数的定义。
子程序可以接受输入参数,并返回结果。
这种模块化的编程方法可以提高代码的可读性和可维护性。
Fortran程序通常由一个主程序(PROGRAM)和若干个子程序(SUBROUTINE)组成。
主程序是程序的入口点,而子程序则可以被主程序或其他子程序调用。
Fortran还提供了许多控制结构,包括条件语句(IF-THEN-ELSE)和循环语句(DO)等。
这些结构可以帮助程序在不同的情况下做出不同的决策和重复执行特定的代码块。
在写Fortran程序时,编码风格非常重要。
良好的编码风格可以使程序更易于阅读和理解,减少错误的发生。
在Fortran中,常用的编码风格包括正确缩进、适当的变量命名和注释的使用等。
总结起来,Fortran是一种强大而易于学习的编程语言,特别适用于数学计算和科学工程领域。
通过掌握Fortran的基本语法和编码风格,您将能够编写高效且可靠的程序。
FORTRAN经典入门程序20例
对于FORTRAN的初学者。
这些例子可作为小练习。
1.例题:计算工资问题。
每小时工资为RATE,如果工作超过40小时,加班呢部分工资是正常时间工资的1.5倍。
C Payroll with overtimeprogram payrollreal rate, hours, payread (*,*) rate, hoursif (hours>40) thenpay=40*rate+(hours-40)*1.5*rateelsepay=hours*rateEND IFprint *,"rate=", rateprint *, "hours=", hoursprint *,"pay=",payend2.学生成绩问题。
大于80为A级。
大于60小于80为B级。
小于60为C级。
IF的嵌套。
注意空格可以看清楚else if ,end if,print的内容.PROGRAM GRADESTUDENTREAD *,GRADEIF (GRADE .GE. 80) THENPRINT *,GRADE,"GRADE=>A"ELSEIF (GRADE.LT.60) THENPRINT*,GRADE,"GRADE=>C"ELSEPRINT*,GRADE,"GRADE=>B"END IFEND IFEND3.三个数按从小到大排序。
PROGRAM MAXMINREAL A,B,C,TREAD *,A,B,CIF (A.GT.B) THENT=AA=BB=TELSEEND IFIF (B.GT.C) THENT=BB=CELSEEND IFIF (A.GT.B) THENT=A A=B B=TEND IFPRINT *,A,B,CEND 4.运用EISE IF 语句。
重做例子2PROGRAM ex2READ (*,*) GRADE IF (GRADE .GE. 80.0) THENPRINT *, GRADE,"=>A" ELSE IF (GRADE .GE. 70.0)THEN PRINT *, GRADE,"=>B" ELSE IF (GARDE .GE. 60.0)THEN PRINT *, GRADE,"=>C"ELSE PRINT *, GARDE,"=>D"END IF END5. 计算236,x 0y 28,0x x x x +≥=-+-<PROGRAM EQUATIONREAD (*,*) XIF (X .GE. 0.0) Y=3*X+6IF (X .LT. 0.0) Y=-X**2+2*X-8PRINT *,"X=",X, "Y=",YEND6.CONTINUE 语句。
Fortran学习过程中写的一些小程序
Fortran学习过程中写的一些小程序1,多重循环的判断program ex19implicit noneinteger scorecharacter gradewrite(*,*) "score:"read(*,*) scoreif (score>100) thengrade="?"else if (score>=90) thengrade="A"else if (score>=80) thengrade='B'else if (score>=70) thengrade='C'else if (score>=60) thengrade='D'elsegrade="?"end ifwrite(*,*) gradestopendprogram ex19implicit noneinteger scorecharacter gradewrite(*,*) "score:"read(*,*) scoreif (score>=90.and.score<=100) thengrade="A"else if (score>=80.and.score<90) thengrade="B"else if (score>=70.and.score<90) thengrade='C'else if (score>=60.and.score<70) then grade='D'else if (score>=50.and.score<60) then grade='E'elsegrade="F"end ifwrite(*,*) gradestopendprogram ex19implicit nonereal xreal yinteger answrite(*,*) "请输入坐标:(x,y)" read(*,*) x,yif (x>0) thenif (y>0) thenans=1else if (y<0) thenans=4elseans=0end ifelse if (x<0) thenif (y>0) thenans=2else if (y<0) thenans=3elseans=0end ifelseans=0end ifif (ans/=0) thenwrite(*,"('第',I1,'象限')") anselsewrite(*,*) "在坐标轴上"end ifstopendprogram ex11implicit nonecharacter::str1,str2character relationwrite(*,*) "string1="read(*,*) str1write(*,*) "string2="read(*,*) str2if (str1>str2) thenrelation=">"else if (str1==str2) thenrelation="="elserelation="<"end ifwrite(*,"('string1',A1,'string2')") relationstopendprogram ex11implicit noneinteger ywrite(*,*) "y="read(*,*) yif(mod(y,4)==0.and.mod(y,100)/=0.and.mod(y,400)==0) then write(*,*) "闰年"elsewrite(*,*) "不是闰年"end ifstopendprogram mainimplicit noneinteger,parameter::dest=9 integer floordo floor=1,destif (floor==4) cyclewrite(*,*) floorend dostopendprogram mainimplicit nonereal,parameter::weight=45.0 real,parameter::error=0.001real gaussdo while(abs(gauss-weight)>error) write(*,*) "weight="read(*,*) gaussend dowrite(*,*) "weight=",gaussstopendprogram mainimplicit noneinteger i,jloop1:do i=1,3loop2:do j=1,3if(i==3) exit loop1if(j==2) cycle loop2write(*,"('(',i2,',',i2,')')") i,jend do loop2end do loop1stopendprogram mainimplicit noneinteger::fn2=0integer::fn1=1integer::fn=0integer counterwrite(*,*) fn2write(*,*) fn1do counter=2,9fn=fn2+fn1write(*,"(I3)") fnfn2=fn1fn1=fnend dostopendprogram mainimplicit noneinteger iinteger,parameter::key=2integer lenstrcharacter(len=20)::stringwrite(*,*) "string:"read(*,*) stringlenstr=len(trim(string))do i=1,lenstrstring(i:i)=char(ichar(string(i:i))+key) end dowrite(*,*) stringstopendprogram mainimplicit nonereal i,j,ki=1j=1k=0do i=1,3j=j/i !计算每个的阶乘k=k+j !计算阶乘的和end dowrite(*,*) kstopendprogram mainimplicit noneinteger,parameter::classes=5integer,parameter::students=5integer::student(classes,students)integer c,sdo c=1,classesdo s=1,studentswrite(*,"('number',I2'of classes',I2)") c,s read(*,*) student(c,s)end doend dodo while(.true.)write(*,*) "classes:"read(*,*) cif(c<=0.or.c>classes) exitwrite(*,*) "student:"read(*,*) sif(s<=0.or.s>students) exitwrite(*,*) student(c,s)end dostopend数组program mainimplicit noneinteger,parameter::row=2integer,parameter::col=2integer::m(row,col)integer r,cdata((m(r,c),r=1,2),c=1,2)/1,2,3,4/write(*,"(I3,I3/I3,I3)") ((m(r,c),r=1,2),c=1,2)stopendprogram mainimplicit noneinteger::i,jinteger,parameter::size=10 integer::a(size)=(/1,10,5,4,3,6,9,8,7,2/) integer::tdo i=1,size-1do j=i+1,sizeif (a(i)<a(j)) thent=a(i)a(i)=a(j)a(j)=tend ifend doend dowrite(*,*) astopendprogram mainimplicit noneinteger::a(4)integer binteger i,jread(*,*) ado i=1,3do j=i+1,4if (a(i)<a(j)) thenb=a(i)a(i)=a(j)a(j)=bend ifend doend dowrite(*,*) astopendprogram mainimplicit noneinteger::iinteger,parameter::players=5real::angle(players)=(/45,50,55,40,35/) real::speed(players)=(/25,20,21,22,27/) real::distance(players)do i=1,playerscall get_distance(angle(i),speed(i),distance(i)) write(*,"('player',I2,'=',F8.2)") I,distance(i) end dostopendsubroutine angle_to_rad(angle,rad)implicit nonereal,parameter::pi=3.14159real::angle,radrad=angle*pi/180.0endsubroutine get_distance(angle,speed,distance) implicit nonereal speed,angle,distancereal t,Vx,radreal,parameter::G=9.8call angle_to_rad(angle,rad)t=2*speed*sin(rad)/GVx=speed*cos(rad)distance=t*Vxendprogram mainimplicit noneinteger,parameter::players=5real::angle(players)=(/30.0,45.0,35.0,50.0,40.0/) real::speed(players)=(/25.0,20.0,21.0,27.0,22.0/) real::distance(players)real,external::get_distanceinteger::ido i=1,playersdistance(i)=get_distance(angle(i),speed(i))write(*,"('player',I2,'='F8.2)") i, distance(i) end dostopendreal function angle_to_rad(angle)implicit nonereal anglereal,parameter::pi=3.14159angle_to_rad=angle*pi/180.0returnendreal function get_distance(speed,angle) implicit nonereal speedreal anglereal timereal Vxreal radreal,parameter::g=9.81real,external::angle_to_radrad=angle_to_rad(angle)time=2*speed*sin(rad)/gVx=speed*cos(rad)get_distance=Vx*timereturnendprogram mainimplicit noneinteger i,ninteger::left=0integer rightwrite(*,*) "n="read(*,*) ndo i=1,nleft=left+i**2end doright=n*(n+1)*(2*n+1)/6if (left==right) thenwrite(*,*) "正确"elsewrite(*,*) "不正确"end ifstopendprogram mainimplicit noneinteger a,binteger tmp,tmp1,tmp2 integer gcd,lcmwrite(*,*) "请输入a,b的值" read(*,*) a,bif (a<b) thentmp=aa=bb=tmpend iftmp1=atmp2=btmp=mod(a,b)do while (.true.)if (tmp==0) exittmp1=tmp2tmp2=tmptmp=mod(tmp1,tmp2)end dogcd=tmp2lcm=a*b/gcdwrite(*,*) gcd,lcmstopendprogram mainimplicit noneinteger ireal numinteger::num1=0integer::num2=0integer::num3=0real::score,meanscorereal::sumscore=0.0write(*,*) "请输入学生人数:" read(*,*) numdo i=1,numwrite(*,"('第',I2,'个同学的成绩:')") i read(*,*) scoresumscore=sumscore+scoreif (score>60) thennum1=num1+1else if(score==60) thennum2=num2+1elsenum3=num3+1end ifend domeanscore=sumscore/numwrite(*,*) "及格以上人数:",num1write(*,*) "刚好及格人数:",num2write(*,*) "不及格的人数:",num3write(*,*) "平均分为:",meanscorestopendprogram mainimplicit noneinteger ninteger,external::factwrite(*,*) "N="read(*,*) nwrite(*,"(I2,'!=',I8)") n,fact(n)stopendrecursive integer function fact(n) result(ans) implicit noneinteger,intent(in)::nif (n<0) thenans=-1returnelse if (n<=1) thenans=1returnend ifans=n*fact(n-1)returnendprogram mainimplicit noneinterfacefunction random10(lbound,ubound)real::lbound,uboundreal::random10(10)end functionend interfacereal::a(10)call random_seed()a=random10(1.0,10.0)write(*,*) aendfunction random10(lbound,ubound) implicit nonereal::lbound,uboundreal::lenreal::random10(10)real tinteger ilen=ubound-lbounddo i=1,10call random_number(t)random10(i)=lbound+len*t end doreturnendmodule constantimplicit nonereal,parameter::pi=3.14159real,parameter::g=9.81end modulemodule typedefimplicit nonetype playerreal::anglereal::speedreal::distanceend typeend moduleprogram mainuse typedefimplicit noneinteger,parameter::players=5type(player)::people(players)=(/player(30.0,25.0,0.0),&player(45.0,20.0,0.0),&player(35.0,21.0,0.0),&player(50.0,27.0,0.0),&player(40.0,22.0,0.0)&/)real,external::get_distanceinteger ido i=1,playerscall get_distance(people(i))write(*,"('player',I1,'=',F8.2)") i,people(i)%distanceend dostopendreal function angle_to_rad(angle)use constantimplicit nonereal angleangle_to_rad=angle*pi/180returnendsubroutine get_distance(person)use constantuse typedefimplicit nonetype(player)::personreal rad,Vx,timereal,external::angle_to_radrad=angle_to_rad(person%angle)Vx=person%speed*cos(rad)time=2*person%speed*sin(rad)/gperson%distance=Vx*timereturnend。
fortran可用的FFT代码
快速傅立叶变换(FFT)的FORTRAN程序代码虽然现在网上的FFT程序很多,但是有的结果是错误的,比如说,经过一次正反变换后,不能得到原来的数列,所以,本人测试了多个程序,提供几个能用的,给大家,希望大家支持!SUBROUTINE FOUR1(DATA,NN,ISIGN)! ISIGN: -1:反变换1:正变换REAL*8 WR, WI, WPR, WPI, WTEMP, THETADIMENSION DATA(2*NN)N = 2*NNJ = 1DO 11 I = 1, N, 2IF(J.GT.I) THENTEMPR = DATA(J)TEMPI = DATA(J+1)DATA(J) = DATA(I)DATA(J+1) = DATA(I+1)DATA(I) = TEMPRDATA(I+1) = TEMPIEND IFM = N / 21 IF((M.GE.2).AND.(J.GT.M)) THENJ = J - MM = M / 2GO TO 1END IFJ = J + M11 CONTINUEMMAX = 22 IF(N.GT.MMAX) THENISTEP = 2 * MMAXTHETA = 6.28318530717959D0 / (ISIGN*MMAX)WPR = -2.D0 * DSIN(0.5D0*THETA)**2WPI = DSIN(THETA)WR = 1.D0WI = 0.D0DO 13 M = 1, MMAX, 2DO 12 I = M, N, ISTEPJ = I + MMAXTEMPR = SNGL(WR) * DATA(J) - SNGL(WI) * DATA(J+1)TEMPI = SNGL(WR) * DATA(J+1) + SNGL(WI) * DATA(J)DATA(J) = DATA(I) - TEMPRDATA(J+1) = DATA(I+1) - TEMPIDATA(I) = DATA(I) + TEMPRDATA(I+1) = DATA(I+1) + TEMPI12 CONTINUEWTEMP = WRWR = WR * WPR - WI * WPI + WRWI = WI * WPR + WTEMP * WPI + WI13 CONTINUEMMAX = ISTEPGO TO 2END IFRETURNEND这个程序也很不错!c-------------------------------------------------------------cc cc Subroutine sffteu( x, y, n, m, itype ) cc cc This routine is a slight modification of a complex split cc radix FFT routine presented by C.S. Burrus. The original cc program header is shown below. cc cc Arguments: cc x - real array containing real parts of transform cc sequence (in/out) cc y - real array containing imag parts of transform cc sequence (in/out) cc n - integer length of transform (in) cc m - integer such that n = 2**m (in) cc itype - integer job specifier (in) cc itype .ne. -1 --> foward transform cc itype .eq. -1 --> backward transform cc cc The forward transform computes cc X(k) = sum_{j=0}^{N-1} x(j)*exp(-2ijk*pi/N) cc cc The backward transform computes cc x(j) = (1/N) * sum_{k=0}^{N-1} X(k)*exp(2ijk*pi/N) cc cc cc Requires standard FORTRAN functions - sin, cos c c cc Steve Kifowit, 9 July 1997 cc cC-------------------------------------------------------------CC A Duhamel-Hollman Split-Radix DIF FFT C C Reference: Electronics Letters, January 5, 1984 C C Complex input and output in data arrays X and Y C C Length is N = 2**M CC CC C.S. Burrus Rice University Dec 1984 C C-------------------------------------------------------------CcSUBROUTINE SFFTEU( X, Y, N, M, ITYPE )INTEGER N, M, ITYPEREAL X(*), Y(*)INTEGER I, J, K, N1, N2, N4, IS, ID, I0, I1, I2, I3REAL TWOPI, E, A, A3, CC1, SS1, CC3, SS3REAL R1, R2, S1, S2, S3, XTINTRINSIC SIN, COSPARAMETER ( TWOPI = 6.2831853071795864769 ) cIF ( N .EQ. 1 ) RETURNcIF ( ITYPE .EQ. -1 ) THENDO 1, I = 1, NY(I) = - Y(I)1 CONTINUEENDIFcN2 = 2 * NDO 10, K = 1, M-1N2 = N2 / 2N4 = N2 / 4E = TWOPI / N2A = 0.0DO 20, J = 1, N4A3 = 3 * ACC1 = COS( A )SS1 = SIN( A )CC3 = COS( A3 )SS3 = SIN( A3 )A = J * EIS = JID = 2 * N240 DO 30, I0 = IS, N-1, IDI1 = I0 + N4I2 = I1 + N4I3 = I2 + N4R1 = X(I0) - X(I2)X(I0) = X(I0) + X(I2)R2 = X(I1) - X(I3)X(I1) = X(I1) + X(I3)S1 = Y(I0) - Y(I2)Y(I0) = Y(I0) + Y(I2)S2 = Y(I1) - Y(I3)Y(I1) = Y(I1) + Y(I3)S3 = R1 - S2R1 = R1 + S2S2 = R2 - S1R2 = R2 + S1X(I2) = R1 * CC1 - S2 * SS1Y(I2) = - S2 * CC1 - R1 * SS1X(I3) = S3 * CC3 + R2 * SS3Y(I3) = R2 * CC3 - S3 * SS330 CONTINUEIS = 2 * ID - N2 + JID = 4 * IDIF ( IS .LT. N ) GOTO 4020 CONTINUE10 CONTINUEcC--------LAST STAGE, LENGTH-2 BUTTERFLY ----------------------C cIS = 1ID = 450 DO 60, I0 = IS, N, IDI1 = I0 + 1R1 = X(I0)X(I0) = R1 + X(I1)X(I1) = R1 - X(I1)R1 = Y(I0)Y(I0) = R1 + Y(I1)Y(I1) = R1 - Y(I1)60 CONTINUEIS = 2 * ID - 1ID = 4 * IDIF ( IS .LT. N ) GOTO 50cC-------BIT REVERSE COUNTER-----------------------------------C c100 J = 1N1 = N - 1DO 104, I = 1, N1IF ( I .GE. J ) GOTO 101XT = X(J)X(J) = X(I)X(I) = XTXT = Y(J)Y(J) = Y(I)Y(I) = XT101 K = N / 2102 IF ( K .GE. J ) GOTO 103J = J - KK = K / 2GOTO 102103 J = J + K104 CONTINUEcIF ( ITYPE .EQ. -1 ) THENDO 2, I = 1, NX(I) = X(I) / NY(I) = - Y(I) / N2 CONTINUEENDIFcRETURNcc ... End of subroutine SFFTEU ...cEND!------------------------------------------------------------------。
fortran常用算法程序集
fortran常用算法程序集
Fortran是一种高级编程语言,用于科学计算和数值分析。
下面是一些常见的Fortran算法程序集:
1. 插值算法:包括线性插值、拉格朗日插值和样条插值。
这些算法用于在给定一组已知数据点的情况下,估计在这些数据点之间的未知数据点的值。
2. 数值积分算法:例如,辛普森规则和龙格-库塔法(Runge-Kutta methods),用于计算函数的定积分。
3. 线性代数算法:例如求解线性方程组(高斯消元法),计算矩阵的特征值和特征向量。
4. 数值优化算法:例如牛顿法和梯度下降法,用于求解非线性优化问题。
5. 快速傅里叶变换(FFT):用于计算离散傅里叶变换(DFT)的高效算法,常用于信号处理和图像处理。
6. 数值微分和微分方程求解算法:例如欧拉法和龙格-库塔法,用于求解常微分方程。
7. 随机数生成算法:例如梅森旋转算法(Mersenne Twister)和伪随机数生成器。
8. 图论算法:例如最短路径算法(迪杰斯特拉算法和贝尔曼-福特算法)和最小生成树算法(普林斯顿算法)。
这只是一些Fortran中的常见算法,实际上还有许多其他算法可以使用Fortran实现。
这些程序集可在各种Fortran 编程参考资料和库中找到。
FORTRAN语言第8章(共8章)
8.2 函数子程序(外部函数)
语句函数只能用一个语句定义,而且只 能在定义它的程序段中使用。
分析:函数f(X)是用两个表达式定义的,不 能用简单的语句函数来表示。怎么办? FORTRAN提供了一种方法,就是把函数的 计算部份从程序中独立出来,并按一定的格 式编成一个单独的子程序段,称为外部函数 或函数子程序。
2、如果f(x)与f(x1)同号,则用x作为新 的x1,这就舍去了原来的(x1,x)区间。
x2 x
如果f(x1)与f(x2)异号,则它们之间的连线必然交x轴于x点 有x=x2-(x2-x1)*f(x2)/(f(x2)-f(x1)) 3、再根据新的x1,x2,找到与x轴的交点x,重复上述步骤。
LOGICAL S F(X)=X**3-2.0*X**2-7.0*X+4.0 S(A,B)=SIGN(A,B).EQ.A 10 READ(*,*)X1,X2 F1=F(X1) F2=F(X2) IF(S(F1,F2))GOTO 10
一、语句函数的概念 引例:计算W=0.2P(X)+0.3P(Y)+0.5P(Z) 其中P(T)=0.812T3+1.256T2-3.378T+0.689
WRITE(*,*)’请输入X,Y,Z的值:‘
READ(*,*)X,Y,Z
P1= 0.812*X**3+1.256*X**2-3.378*X+0.689 P2= 0.812*Y**3+1.256*Y**2-3.378*Y+0.689
语句函数小结: 在语句函数定义的语句中,也可出现其他的语句 函数引用,但被引用的语句函和须在它前面已定义。 不允许引用自身或在它后面定义的语句函数。 例:S(A, B, C) = (A+B+C) / 2.0
fortran常用算法程序集
fortran常用算法程序集Fortran是一种高级编程语言,广泛应用于科学计算和数值分析领域。
它的强大之处在于它提供了丰富的算法库,使程序开发人员能够快速实现各种常见算法。
本文将介绍一些Fortran常用的算法程序集,帮助读者更好地理解和应用这些算法。
一、线性代数算法线性代数是科学计算和数值分析的基础,Fortran提供了许多用于求解线性方程组、矩阵分解和矩阵运算的算法。
其中一些常用的算法包括:1. 高斯消元法高斯消元法是一种求解线性方程组的方法,可以将线性方程组转化为上三角或下三角矩阵,并进一步求解。
Fortran提供了多种高斯消元法的实现,如LU分解法和托伯利兹矩阵法。
2. 特征值与特征向量计算特征值与特征向量计算是矩阵分解的一种重要问题。
Fortran提供了多种算法来计算矩阵的特征值与特征向量,如幂法、反幂法、QR算法等。
3. 矩阵乘法和矩阵求逆矩阵乘法和矩阵求逆是线性代数中常见的操作。
Fortran提供了多种高效的算法来实现矩阵乘法和矩阵求逆,如Strassen算法、LU分解法等。
二、数值计算算法数值计算算法广泛应用于科学计算、数值模拟和数据分析等领域。
Fortran提供了多种数值计算算法的实现,如数值积分、函数逼近、插值算法等。
以下是一些常用的数值计算算法:1. 数值积分数值积分可以用来对函数进行近似求积,求解曲线下面积或计算定积分。
Fortran提供了多种数值积分方法的实现,如梯形法则、辛普森法则和龙贝格方法等。
2. 函数逼近函数逼近是将多项式或其他数学函数与给定函数进行拟合,用于简化函数计算或数据分析。
Fortran提供了多种函数逼近的方法,如最小二乘逼近、最大误差逼近等。
3. 插值算法插值算法用于根据已知的离散数据点估计未知点的值。
Fortran提供了多种插值算法的实现,如拉格朗日插值法、牛顿插值法和样条插值法等。
三、优化算法优化算法用于求解最优化问题,如寻找函数最大值或最小值的点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算圆周率REAL R,R1,R2,PIISEED=RTC()N0=0N=300000DO I=1,NR1=RAN(ISEED)R2=RAN(ISEED)R=SQRT(R1*R1+R2*R2)IF(R<1.0)N0=N0+1END DOPI=4.0*N0/NWRITE(*,*)PIEND一)蒙特卡洛计算生日问题假设有N个人在一起,各自的生日为365天之一,根据概率理论,与很多人的直觉相反,只需23个人便有大于50%的几率人群中至少有2个人生日相同。
INTEGER M(1:10000), NUMBER1(0:364), NUMBER2REAL X,YISEED=RTC()DO J=1, 10000NUMBER1=0X=RAN(ISEED)NUMBER1(0)=INT(365*X+1)JJJ=1DO I=1,364Y=RAN(ISEED)NUMBER2=INT(365*Y+1)ETR=COUNT(NUMBER1.EQ.NUMBER2)IF (ETR= =1) THENEXITELSEJJJ=JJJ+1M(J)=JJJNUMBER1(I)=NUMBER2END IFEND DOEND DODO I=1,10000IF(M(I).LE.23) SUM=SUM+1END DOPRINT *,SUM/10000END二)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 XXWRITE(*,*) "实验天数JMAX,实验次数IMAX"READ(*,*) JMAX,IMAXISEED=RTC()DO J=1,JMAX !第几天实验X=0 !!!DO I=1,IMAX !第几步跳跃RN=RAN(ISEED)IF(RN<0.5)THENX=X+1ELSEX=X-1END IFXX(J,I)=X*XEND DOEND DOOPEN(1,FILE="C:\DIF1.DAT")DO I=1,IMAXXXM=0.0XXM(I)=1.0*SUM(XX(1:JMAX,I))/JMAX !!WRITE(1,*) I, XXM(I)END DOCLOSE(1)END三维的!三)通过该程序了解FORTRAN语言如何画图(通过像素画图)USE MSFLIBINTEGER XR,YR !在的区域中画一个圆PARAMETER XR=400,YR=400INTEGER R, S(1:XR,1:YR)X0=XR/2 ! 圆心位置X0,YOY0=YR/2R=MIN(X0-10,Y0-10) !圆半径S=0 !像素的初始状态(颜色)DO I=1,XRDO J=1,YRIF((I-X0)**2+(J-Y0)**2<=R**2)S(I,J)=10IER=SETCOLOR(S(I,J))IER=SETPIXEL(I,J)END DOEND DOEND四)画一个圆(1、如何选出晶界区域;2、进一步加深对画图的理解)USE MSFLIBINTEGER XR,YR !在的区域中画一个圆PARAMETER XR=400,YR=400INTEGER R, S(0:XR+1,0:YR+1), XN(1:4), YN(1:4), SNSXN=(/0,0,-1,1/)YN=(/-1,1,0,0/)X0=XR/2 ! 圆心位置X0,Y0Y0=YR/2R=MIN(X0-10,Y0-10) !圆半径S=0 !像素的初始状态(颜色)DO I=1,XRDO J=1,YRIF((I-X0)**2+(J-Y0)**2<=R**2)S(I,J)=10IER=SETCOLOR(S(I,J))IER=SETPIXEL(I,J)END DOEND DODO I=1,XR !画晶界DO J=1,YRNDS=0DO K=1,4IF(S(I,J).NE.S(I+XN(K),J+YN(K)))NDS=NDS+1END DOIF(NDS>0)THENIER=SETCOLOR(9)ELSEIER=SETCOLOR(8)END IFIER=SETPIXEL(I,J)END DOEND DOEND五)MC模拟一个晶粒的缩小USE MSFLIBPARAMETER IR=400,JR=400INTEGER IS(0:IR+1,0:JR+1),TMAX,ISN(1:8),NSTATE,T,NR,IX,IY WRITE(*,*)"PLEASE INPUT THE TIME STEP "READ(*,*)TMAXISEED=RTC()! 定义圆心和半径IRC=IR/2JRC=IR/2R=MIN(IRC,JRC)-10! 定义基体和圆晶粒分别为状态1、状态2IS=1DO I=1,IRDO J=1,JRDISTANCE=SQRT(1.0*(I-IRC)**2+1.0*(J-JRC)**2)IF(DISTANCE.LT.R)IS(I,J)=2ISE=SETCOLOR(IS(I,J))ISE=SETPIXEL(I,J)END DOEND DOOPEN(1,FILE="E:\LUKE.DAT")! 寻找晶粒边界,计算能量,改变状态。
DO T=1,TMAXDO X=1,IRDO Y=1,JRIX=IR*RAN(ISEED)+1JY=JR*RAN(ISEED)+1ISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1) ,IS(IX,JY+1) ,IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/)E0=COUNT(ISN.NE.IS(IX,JY))! 如果不是圆晶粒边界,则跳出,重新循环IF(E0.EQ.0)CYCLE! 随机寻找一个相邻点NR=8*RAN(ISEED)+1NSTATE=ISN(NR)! 判断与相邻点的能量差,并决定是否改变状态E=COUNT(ISN.NE.NSTATE)RD=RAN(ISEED)DE=E-E0+NSTATE-IS(IX,JY)+2.5*RD-1.25IF(DE.LT.0.0)IS(IX,JY)=NSTATEISRE=SETCOLOR(IS(IX,JY))ISRE=SETPIXEL(IX,JY)ENDDOENDDOWRITE(1,*)T,COUNT(IS.EQ.2)ENDDOCLOSE(1)END六)蒙特卡罗模拟基体上单晶粒形核长大USE MSFLIBPARAMETER IR=400,JR=400INTEGER IS(0:IR+1,0:JR+1),TMAX,ISN(1:8),NSTATE,T,NR,IX,IY WRITE(*,*)"PLEASE INPUT THE TIME STEP "READ(*,*)TMAXISEED=RTC()! 定义圆心和半径IRC=IR/2JRC=IR/2! 定义基体和圆晶粒分别为状态10、状态2IS=10IS(IRC,JRC)=2OPEN(1,FILE="E:\LUKE.DAT")! 寻找晶粒边界,计算能量,改变状态。
DO T=1,TMAXDO X=1,IRDO Y=1,JRIX=IR*RAN(ISEED)+1JY=JR*RAN(ISEED)+1ISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1),IS(IX,JY+1),IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/)E0=COUNT(ISN.NE.IS(IX,JY))! 如果不是圆晶粒边界,则跳出,重新循环IF(E0.EQ.0)CYCLE! 随机寻找一个相邻点NR=8*RAN(ISEED)+1NSTATE=ISN(NR)! 判断与相邻点的能量差,并决定是否改变状态E=COUNT(ISN.NE.NSTATE)RD=RAN(ISEED)DE=E-E0+NSTATE-IS(IX,JY)+2.5*RD-1.25IF(DE.LT.0.0)IS(IX,JY)=NSTATEISRE=SETCOLOR(IS(IX,JY))ISRE=SETPIXEL(IX,JY)ENDDOENDDOWRITE(1,*)T,SQRT(1.0*COUNT(IS.EQ.2))ENDDOCLOSE(1)END七)蒙特卡洛模拟基体上多晶粒形核长大,USE MSFLIB!定义常数名PARAMETER IR=400,JR=400,NMAX=100!定义变量:体积能变量(一维数组);基体各像素点变量(二维数组),邻居的取向号(一维数组)等;INTEGER IS(0:IR+1,0:JR+1),TMAX,ISN(1:8),NSTATE,T,NR,IX0,IY0,IX,IY INTEGER IGV(0:NMAX)!读取晶粒生长步长;WRITE(*,*)"PLEASE INPUT THE TIME STEP "READ(*,*)TMAXISEED=RTC()! 定义基体体积能为10,所有晶粒体积能为1IGV=1IGV(0)=10! 定义晶粒长大位置(100个形核点初始形核位置),并附已不同的取向号DO I=1, NMAXIX0=IR*RAN(ISEED)+1JY0=JR*RAN(ISEED)+1IS(IX0,JY0)=IEND DO! 边界条件IS(0,1:JMAX)=IS(IMAX,1:JMAX)IS(IMAX+1,1:JMAX)=IS(1,1:JMAX)IS(0:IMAX+1,0)=IS(0:IMAX+1,JMAX)IS(0:IMAX+1,JMAX+1)=IS(0:IMAX+1,1)OPEN(1,FILE="E:\LUKE.DAT")! 寻找晶粒边界。
DO T=1,TMAXDO X=1,IRDO Y=1,JRIX=IR*RAN(ISEED)+1JY=JR*RAN(ISEED)+1ISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1) & ,IS(IX,JY+1),IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/) E0=COUNT(ISN.NE.IS(IX,JY))! 如果不是晶粒边界,则跳出,重新循环IF(E0.EQ.0)CYCLE! 随机寻找一个相邻点NR=8*RAN(ISEED)+1NSTATE=ISN(NR)! 判断与相邻点的能量差,并决定是否改变状态RD=RAN(ISEED)E=COUNT(ISN.NE.NSTATE)IG=IGV(NSTATE)-IGV(IS(IX,JY))DE=E-E0+IG+2.5*RD-1.25IF(DE.LT.0.0)IS(IX,JY)=NSTATEISRE=SETCOLOR(MOD(IS(IX,JY),15))ISRE=SETPIXEL(IX,JY)ENDDOENDDOWRITE(1,*)T,1.0*COUNT(IS.NE.0)ENDDOCLOSE(1)END八)元胞自动机模拟生命游戏程序(生命永不停止)USE MSFLIBPARAMETER IR=400,JR=400,NMAX=40000 !NMAX-随机产生的生命种子INTEGER IS(0:1001,0:1001),IS1(0:1001,0:1001),ISN(1:8), TMAX, NUM!IS-基体的二维数组PRINT*,'PLEASE INPUT LOOP(TMAX)'READ*, TMAXISEED=RTC()IS=15 !“死”的状态,基体为白色!赋予生命的种子,“活”的状态1DO I=1, NMAXIX0=IR*RAN(ISEED)+1JY0=JR*RAN(ISEED)+1IS(IX0,JY0)=1END DO!EXECUTE THE RULEDO T=1,TMAXIS1=IS!边界条件IS(0,1:JMAX)=IS(IMAX,1:JMAX)IS(IMAX+1,1:JMAX)=IS(1,1:JMAX)IS(0:IMAX+1,0)=IS(0:IMAX+1,JMAX)IS(0:IMAX+1,JMAX+1)=IS(0:IMAX+1,1)!搜索生命存在的位置DO IX=1,IRDO JY=1,JR!判断邻居状态ISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1)& ,IS(IX,JY+1),IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/)NUM=COUNT(ISN.EQ.1)!赋予生存的条件IF((IS(IX,JY)==15.AND.NUM==3).OR.(IS(IX,JY)==1.AND.(NUM==3.OR.NUM==2))) THENIS1(IX,JY)=1ELSEIS1(IX,JY)=15END IF!画图ISRE=SETCOLOR(IS1(IX,JY))ISRE=SETPIXEL(IX,JY)END DOEND DOIS=IS1END DO九)元胞自动机模拟单晶长大USE MSFLIBPARAMETER IR=400,JR=400INTEGER IS(0:IR+1,0:JR+1),TMAX,ISN(1:8),NSTATE,T,NR,IX0,IY0,IX,JY !! 根据过去状态IS,定义现在状态为IS1;为了突出边界,特别定义ISN1 INTEGER IS1(0:IR+1,0:JR+1),ISN1(1:8)WRITE(*,*)"PLEASE INPUT THE TIME STEP "READ(*,*)TMAXISEED=RTC()IRC=IR/2 !=IR*ran(iseed)+1JRC=JR/2! 定义基体体积能为10,晶粒体积能为1IS=8IS(IRC,JRC)=1!! 在循环前定义现在状态数组IS1的初始值IS1=ISOPEN(1,FILE="E:\LUKE.DAT")DO T=1,TMAX!! 每次循环前重新定义过去状态数组ISIS=IS1! 边界条件IS(0,0:JR+1)=IS(IR,0:JR+1)IS(IR+1,0:JR+1)=IS(1,0:JR+1)IS(0:IR+1,0)=IS(0:IR+1,JR)IS(0:IR+1,JR+1)=IS(0:IR+1,1)!! 整个基体上,各个点上的状态都要根据规则改变,而非随机取点改变DO IX=1,IRDO JY=1,JRISN=(/IS(IX-1,JY-1),IS(IX-1,JY),IS(IX-1,JY+1),IS(IX,JY-1) & ,IS(IX,JY+1),IS(IX+1,JY-1),IS(IX+1,JY),IS(IX+1,JY+1)/)E0=COUNT(ISN.NE.IS(IX,JY))! 如果不是晶粒边界,则跳出,重新循环IF(E0.EQ.0)CYCLE! 随机寻找一个相邻点NR=8*RAN(ISEED)+1NSTATE=ISN(NR)! 判断与相邻点的能量差,并决定是否改变状态E=COUNT(ISN.NE.NSTATE)RD=RAN(ISEED)IG=NSTATE-IS(IX,JY)DE=E-E0+IG+2.5*RD-1.25!! 用现在状态数组IS1记录边界状态的改变IF(DE.LT.0.0)IS1(IX,JY)=NSTATEENDDOEND DO!! 每循环20次在显示屏幕上刷新状态(颜色)DO IX=1,IRDO JY=1,JR! IF(MOD(T,20).EQ.0)THENISN1=(/IS1(IX-1,JY-1),IS1(IX-1,JY),IS1(IX-1,JY+1),IS1(IX,JY-1)& ,IS1(IX,JY+1),IS1(IX+1,JY-1),IS1(IX+1,JY),IS1(IX+1,JY+1)/)ISRE=SETCOLOR(IS(IX,JY))! 如果是边界,定义特别颜色15,加以区分IF(COUNT(ISN1.NE.IS1(IX,JY)).GT.0) ISRE=SETCOLOR(15)ISRE=SETPIXEL(IX,JY)! END IFENDDOENDDO!!! 记录循环次数和对应的晶粒面积WRITE(1,*)T, SQRT(1.0*COUNT(IS.EQ.1))ENDDOCLOSE(1)END十)元胞自动机模拟多晶长大1.介绍蒙特卡罗和元胞自动机的区别。