Fortran子程序


函数与子程序
子程序和主程序之间最大不同在于:主程序的程序代码,在程序一开始 就自动被执行,而子程序的代码只有在被‚调用‛才会执行。
一个包含子程序的Fortran程序在结构上大致如下:
program main ← 主程序 „„ „„ ←主程序代码 „„ end program main ←主程序结束 subroutine sub1() ←第1个子程序 „„ „„ ←子程序码 „„ end subroutine sub1 ←第1个子程序结束 subroutine sub2() ←第2个子程序 „„ „„ ←子程序码 „„ end subroutine sub2 ← 第2个子程序结束
函数与子程序
使用common还有一些技巧,见下面实例。主程序中有全局变量a,b, 子程序中有大小为2的数组a(2),根据使用相同内存空间的策略,a等于 a(1),而b等于a(2)。
program ex0814 implicit none real :: a,b common a,b ! 把浮点数a,b放在全局变量中 a = 1.0 b = 2.0 call ShowCommon() stop end subroutine ShowCommon() implicit none real :: a(2) common a ! 把数组a放在全局变量中 write(*,*) a(1), a(2) return end
传递参数与使用全局变量都可以在 不同程序之间共享数据,简单的说,当 需要共享的变量不多,而且只由少数几 个程序需要使用这些数据时,就使用参 数;当共享大笔数据,或是有很多个不 同程序都要使用这些数据时,就使用全 局变量。
函数与子程序
2、BLOCK DATA 的使用 关于common设臵初值的方法,common变量不能直接在子 程序或主程序中使用DATA来设臵初值,要在BLOCK DATA程序模块中使用DATA命令来设臵初值,看一个程序:
函数与子程序
主程序不一定要放在开头,可在程序中任何位臵,如下图 所示。
subroutine sub1() „„ „„ „„ end subroutine sub1 program main „„ „„ „„ end program main subroutine sub2() „„ „„ „„ end subroutine sub2
函数与子程序
自定义函数示例:
program ex0807 implicit none real :: a=1 real :: b=2 real, external :: add
语句函数:
program ex0808 implicit none real :: a = 1 real :: b real :: add !自定义函数的声明 add(a,b) = a+b ! 直接把函数写在里面 write(*,*) add(a,3.0) !自定义函数的调用 stop end
write(*,*) add(a,b) stop end function add(a,b) implicit none real :: a,b ! 传入的参数 real :: add add = a+b return end function
函数与子程序
三、全局变量(COMMON) 不同的程序之间,也就是在不同函数之间,主程序与 函数之间,除了通过传递参数的方法来共享内存,还可以 通过‚全局变量‛来让不同程序中声明出来的变量使用相 同的内存位臵。这是另一种在不同程序间传递数据的方法。
函数与子程序
Fortran 在传递参数时使用的是传址调用
program ex0805 implicit none integer :: a = 1 integer :: b = 2 write(*,*) a,b call add(a) call add(b) write(*,*) a,b stop end subroutine add(num) implicit none integer :: num num = num+1 return end
program ex0812 implicit none integer :: a,b common a,b ! a,b放在不署名(无名)的全局变量空间中 integer :: c,d common /group1/ c,d ! c,d放在group1的全局变量空间中 integer :: e,f common /group2/ e,f ! e,f放在group2的全局变量空间中 write(*,"(6I4)") a,b,c,d,e,f 1. Block data类似于子程序,是一 stop 段独立的程序模块,拥有自己的 end 变量声明,不过它不需被调用就 能执行,它会在主程序前生效。 block data 2. 不过它仅限于设置全局变量初值, implicit none 不能有其他执行命令出现。全局 integer :: a,b 变量不能是常量,所以Block common a,b ! a,b放在不署名的全局变量空间中 data中无parameter. data a,b /1,2/ ! 同样使用data设定a,b的初值 integer :: c,d common /group1/ c,d ! c,d放在group1的全局变量空间中 data c,d /3,4/ ! 设定c,d的初值 integer :: e,f common /group2/ e,f ! e,f放在group2的全局变量空间中 data e,f /5,6/ ! 设定e,f的初值 end block data
函数与子程序
二、自定义函数(FUNCTION) Fortran编译系统自带有一些常用函数,例如:SIN(x), COS(X), MOD(a,b)等。我们使用的函数不再函数库中时, 需要自己创造一个。 自定义函数的运行和子程序大致相同,也是需要经过调用 才能执行,可以独立声明变量,参数的传递方法也和子程 序一样,二者只有两点不同: 1.调用自定义函数前要先声明。 2.自定义函数执行后会返回一个数值。
函数与子程序
(教材的第8章)
‚函数‛是自定义函数和子程序的总称。子程序可以用来独
立出某一段具有特定功能的程序代码,供其它地方调用。自
定义函数可以用来自由扩充出Fortran库函数中原来不存在 的函数。
函数与子程序
一、子程序(SUBROUTINE)的使用 写程序时,可以把某一段经常被使用,具有特定功能的程 序代码独立出来,封装成子程序,以后只要经过调用的 CALL命令就可以执行这一段程序代码。先来看一个使用 子程使用‚地址对应‛的方法共享数据,所以 在程序设计时常出现下面麻烦,如下图所示。
program main implicit none integer a,b,c,d,e,f common a,b,c,d,e,f …… …… end
这里使用了6个全域变量
subroutine sub() implicit none integer n1,n2,n3,n4,n5,f common n1,n2,n3,n4,n5,f …… …… end
函数与子程序
子程序除了可以让主程序调用之外,子程序之间也可以相互 调用(见实例)。
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. program ex0802 implicit none call sub1() call sub2() stop end program ex0802 subroutine sub1() implicit none write(*,*) "This is sub1" call sub2() return end subroutine sub1 subroutine sub2() implicit none write(*,*) "This is sub2" return end subroutine sub2
函数与子程序
1、COMMON的使用
program ex0810 implicit none integer :: a,b common a,b ! 定义a,b是全局变量中的第1及第2个变量 a=1 b=2 call ShowCommon() stop end subroutine ShowCommon() implicit none integer :: num1, num2 common num1, num2 ! 定义a,b是全局变量中的第1及第2个变量 write(*,*) num1, num2 return end
program ex0801 implicit none call message() ! 调用子程序message call message() ! 再调用一次 stop end program ex0801 ! 子程序message subroutine message() implicit none write(*,*) "Hello." return end subroutine message
函数与子程序
3、注意事项 使用COMMON时注意两点: 1)变量的类型 program ex0813 2)变量的位臵 implicit none
real :: a common a ! 把浮点数a放在全局变量中 a = 1.0 call ShowCommon() stop end subroutine ShowCommon() implicit none integer :: a common a ! 把整数a放在全局变量中 write(*,*) a return end
假设子程序只要使用第6个 全域变量,它仍要宣告出前 5个垫着,才能使用第6个。
函数与子程序
这种麻烦在全局变量多的情况 下更为惊人,把变量归类、放在彼 此独立的COMMON区间中可以解决 此问题,示例见右边代码:
合集下载

子程序的定义及使用

子程序的定义及使用
不但浪费了宝贵的时间和精力,而且也容易出错。任何数学
表达式实际上都可表示成一元、二元或多元函数关系,即 F(x1,x2,…,xn),这些函数关系如果没有对应的标准函数,则 需要用户设法定义新的函数来实现它们。
FORTRAN 90提供了语句函数定义功能来定义一些简单的 函数,用于实现有关的函数关系。用户自定义语句函数其使 用方法与标准函数相同,可以作为操作数在表达式中调用。
DB=F(x,y,z,y) DG=F(x,y,z,z) WRITE(*,*) DA,DB,DG
END program
9.3 外部函数子程序
无法用一条语句来定义的函数,可以用一个单独的 程序单位定义,它不属于调用函数语句所在的程序 单位,因此称之为外部函数。
是用户自定义的函数子程序。所在程序的其他程序 单位都可以调用它。
SUBROUTINE add(m,n,s) INTEGER m,n,s s=m+n m=m+1
END SUBROUTINE add
外部子例行程序,简称外部子程序,也称外部过程,是 独立的程序单元。
外部子例行程序可产生多个结果,由参数返回。 外部子例行程序定义一般格式:
<外部子例行程序定义>→
函数引用、外部函数引用以及外部函数名和子程序名等。 如果定义外部函数无形式参数,其引用形式为:F( )。 外部函数执行过程:
若实在参数为表达式,则先对表达式求值。 实在参数与相应的形式参数结合,将实参值传递给对应形参。 经过形实结合,形式参数获得了所需要的值,然后,立即执
行内部函数体。 在 执 行 函 数 体 的 过 程 中 , 若 遇 到 RETURN 语 句 或 END
F(x1,x2,x3)=3.14159*(x1+x2/60.0+x3/3600.0)/180.0 A=F(36.0,43.0,27.0) B=F(15.0,24.0,0.0) C=F(8.0,16.0,54.0) S=COS(A)**2-4*SIN(B)*TAN(C) WRITE (*,*) A,B,C,S

Fortran程序设计之子程序

Fortran程序设计之子程序

•
前者用双撇号作定界符,后者用单撇号作定界符, 而将字符串的单撇号用两个单撇号表示,系统会 自动将其处理为字符串的一个单撇号字符。
5
字符串中含有单引号或双引号的处理
•
当字符串中又含有单撇号时例如要将I'M A STUDENT作为一个字符串来处理,为了区分'是 字符串中的字符还是定界符,可采用两种方式表 示:
!
•
直接常量
•
用单引号或双引号(有的地方又称单撇号、 双撇号)括起来的字符串
4
字符常量
•
!
符号常量
program hello implicit none character(len=*), parameter :: & message = "Hello, I am a computer." print *, message end program
6
字符变量赋值
program test_sign implicit none real :: number character(len=8) :: number_sign read *, number if (number > 0) then number_sign = "positive" else if (number == 0) then number_sign = "zero" else number_sign = "negative" end if print *, number, "is ", number_sign end program

fortran子程序

fortran子程序

说明: 1. 函数名的取名方法与变量 名同,遵循I—N隐含约定, 否则需采用类型说明语句。
function myabs(x) real myabs 定义法二 .
2. 函数名后的虚参可以是变量名、数组名和子程序名。 如没有虚参,一对圆括号不能省。 3. 在函数子程序流程返回调用单位之前,必须把所求得 的函数值赋给函数名(不带括号和虚参)。 4. 函数子程序流程执行到return或end语句时,立即返回 到调用单位。return语句在子程序中可以有多处,如 果紧邻end 可以省去。
第 九 章 数组
第 十 章 语句函数
第十一章 子程序
第十二章 数据共用存储单元 和数据块子程序
第十三章 文件
1
Fortran程序往往由一个主程序和若干个子程序组成。 Fortran的子程序有函数子程序、子例行子程序和数 据块子程序三种。 子程序可以被主程序调用,也可以被其他子程序调 用。Fortran77中的子程序不能递归调用。
100
一行打印20个 “*”号,打两行。
8
subroutine opp(a,s1,s2) 求矩阵两对角 real a(5,5) 线元素之和 s1=0 do 10 i=1,5 subroutine readin(a) s1=s1+a(i,i) real a(5,5) 10 continue do 10 i=1,5 s2=0 read(*,*) (a(i,j),j=1,5) do 20 i=1,5 10 continue j=5-i+1 end s2=s2+a(i,j) 20 continue real w(5,5) end call readin(w) call opp(w,x1,x2) 输入矩阵 write(*,100) x1,x2 1,2,3,4,5 100 format(1x,'The two sum of', 2,3,4,5,1 3,4,5,1,2 $ ' oppusite angles elements:', 4,5,1,2,3 $ /1x,'x1=',f8.2,' x2=',f8.2) 5,1,2,3,4 end

第六讲 Fortran中的子程序

第六讲 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

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

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

第一种方法:在Job模块里,创建工作,在Edit Job对话框中选择General选项卡,在Usersubroutine 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_nameABAQUS会把用户的源程序编译成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,如果两者都没有,就会报错误信息。

fortran子程序【精选】

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. 子程序名的意义不一样。函数子程序名代表函数值, 通过其传递数据,需要类型说明;而子例行程序名仅 为了调用使用,通过虚实参传递数据。

fortran 子程序参数

fortran 子程序参数摘要:I.引言A.Fortran 子程序的概念B.Fortran 子程序的作用II.Fortran 子程序参数的定义与使用A.参数的定义1.内部参数2.外部参数B.参数的传递1.值传递2.引用传递C.参数的返回值1.返回值的概念2.返回值的类型III.Fortran 子程序的调用A.调用子程序的方式1.外部调用2.内部调用B.调用子程序的参数1.参数的传递方式2.参数的默认值IV.Fortran 子程序参数的实例分析A.实例介绍B.实例代码解析1.定义子程序2.调用子程序C.实例总结V.结论A.Fortran 子程序参数的重要性B.Fortran 子程序参数的应用场景C.展望Fortran 子程序参数的未来发展正文:I.引言Fortran(Formula Translation)是一种高级编程语言,广泛应用于数值计算、科学计算等领域。

在Fortran 程序设计中,子程序(Subprogram)是一种重要的程序组织方式,可以将程序划分为更小的、可重用的功能模块。

子程序参数是子程序与主程序之间进行数据交换的关键,正确理解和使用子程序参数对于编写高效的Fortran 程序具有重要意义。

II.Fortran 子程序参数的定义与使用A.参数的定义Fortran 子程序参数分为内部参数和外部参数。

1.内部参数:在子程序内部定义的参数,仅在子程序内部使用,与外部程序无关。

内部参数的定义格式如下:```fortraninteger :: a, b, sum```2.外部参数:在子程序外部定义的参数,可以在子程序内部和外部程序中使用。

外部参数的定义格式如下:```fortraninteger, external :: a, b, sum```B.参数的传递Fortran 子程序参数的传递方式有值传递和引用传递两种。

1.值传递:将参数的值传递给子程序,子程序中对参数的修改不会影响主程序中的参数值。

fortran 子程序参数

fortran 子程序参数(最新版)目录1.Fortran 子程序参数概述2.Fortran 子程序参数的定义与声明3.Fortran 子程序参数的传递与使用4.Fortran 子程序参数的优点与局限性正文1.Fortran 子程序参数概述在 Fortran 编程语言中,子程序是一种可以实现代码重用的模块化程序结构。

通过将一些功能相似的代码组织成一个子程序,可以提高代码的可读性、可维护性和可重用性。

为了实现子程序之间的数据交互,Fortran 提供了一种名为“子程序参数”的机制,用于在子程序之间传递数据。

2.Fortran 子程序参数的定义与声明Fortran 子程序参数的定义与声明主要包括以下几个步骤:(1)在主程序中定义子程序。

使用“subroutine”关键字定义一个子程序,并给子程序起一个名字。

例如:```fortransubroutine my_subroutine```(2)在子程序中声明参数。

在子程序内部,使用“implicit none”语句关闭隐式参数,然后通过“parameter”语句声明子程序参数。

例如:```fortranimplicit noneparameter :: x = 0, y = 0```(3)在主程序中声明子程序参数。

在主程序中,使用“interface”语句声明子程序参数,并指定参数的类型和名称。

例如:```fortraninterface my_subroutinesubroutine my_subroutine(real :: x, real :: y)end interface```3.Fortran 子程序参数的传递与使用Fortran 子程序参数的传递与使用主要包括以下几个步骤:(1)在主程序中调用子程序。

在主程序中,使用子程序名和括号内的参数列表调用子程序。

例如:```fortrancall my_subroutine(3.14, 2.71)```(2)在子程序中使用参数。

Fortran的主要版本及差别

、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。

现在在广泛使用的是Fortran 77和Fortran90。

Fortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。

鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看懂77程序。

以下是77和90的一些格式上的区别。

Fortran 77:固定格式(fixed format),程序代码扩展名:.f或.for (1)若某行以C,c或*开头,则该行被当成注释;(2)每行前六个字符不能写程序代码,可空着,或者1~5字符以数字表明行代码(用作格式化输入输出等);7~72为程序代码编写区;73往后被忽略;(3)太长的话可以续行,所续行的第六个字符必须是"0"以外的任何字符。

Fortran 90:自由格式(free format),扩展名:.f90(1)以"!"引导注释;(2)每行可132字符,行代码放在每行最前面;(3)以&续行,放在该行末或下行初。

以下都是讨论Fortran 90。

3、Fortran的一些特点,和C的一些不同其实很多,在下面涉及具体方面时可以看到。

这里只是大致提一些。

(1)不分大小写(2)每句末尾不必要写分号(3)程序代码命令间的空格没有意义(4)不像C,Fortran不使用{ }(5)数据类型多出了复数和逻辑判断类型。

比如复数类型complex :: a !声明复数的方法。

复数显然方便了科学计算,满足了工程方面的需求a=, ! a=1+i(6)多出了乘幂运算(**)。

乘幂除了整数还可以是实数形式。

如开方,开立方a=**,a=**。

(7)数组有一些整体操作的功能;可以方便的对部分元素进行操作(8)有些情况下可以声明大小待定的数组,很实用的功能4、Fortran的基本程序结构先看一看所谓的"Hello 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. 数组:数组类型用于表示多个相同类型的数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档