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
12
2. 数组作虚参
对应实参可以是同一类型的数组名或数组元素。 传递数据通过首地址传递。
(1)虚参数组是数值类型或逻辑类型 数组名 传递
dimension a(2,4) call sub(a) end subroutine sub(b) dimension b(6) . . . end
注意:在虚实结合时,允许维数不同,但应尽量避免。 子程序的数组元素个数要小于等于对应实参数组 元素个数。
3
5. 函数子程序中除虚参外的任何变量都不与其他程序单
位有关系,语句标号也是独立的。
6. 同一源程序文件中,主程序和子程序先后次序无关紧要。 7. 函数子程序的调用形式与语句函数完全相同。 必须在调用程序中使外部函数名与函数子程序定义中函 数名的类型完全一致。必须保证函数名的类型、虚参的类 型与调用处的函数名以及实参类型一一对应。
real function loa(x,y) loa=sqrt(x*x+y*y) end
15
$
$
20
$
30 10
$
logical function palin(str) character*(*) str integer r,L palin=.true. R=len(str)+1 L=0 do 10 while(palin .and.L.lt.R) L=L+1 do 20 while(str(L:L) $ .eq.' ') L=L+1 continue $ R=R-1 do 30 while(str(R:R) .eq.' ') R=R-1 continue if(str(L:L).ne.str(R:R)) palin=.false. continue end
一、 函数子程序
主程序
write(*,*) y(5.0),y(0.0),y(-6.0) end
类型说明 子程序标志 函数名(虚参) 函数子程序 (外部函数)
real function y(x) 1 ( x 0) if(x.gt.0.0) then y y=1.0 0 ( x 0) 1 ( x 0) else if(x.eq.0.0) then y=0.0 else y=-1.0 函数子程序必须以function end if 语句开头,end语句结束。 end 2
3. 子例行子程序也是独立的程序单位,return语句、
语句标号、变量的定义和使用与函数子程序相同。
4. 子例行子程序靠形参实参虚实结合传递数据,可返 回两个以上的数值。(优点)
7
5. 子例行子程序必须用独立的call语句调用。而函数子
程序的调用总是出现在表达式中,参与运算。
subroutine astar write(*,100) format(1x,20('*')) end call astar call astar end
character*80 str logical palin,yes write(*,*) 'Enter a STRing:' read(*,'(a)') str yes=palin(str) if(yes) then write(*,*) '***Is', ' Palindrome***' else write(*,*) '!!!Is''nt', ' Palindrome!!!' end if end
判断字串是否回文
16
10
subroutine matpro(a,m1,m2,b,m3,c) 矩阵相乘 dimension a(m1,m2) dimension b(m2,m3),c(m1,m3) do 10 k=1,m1 subroutine getmat(a,m1, do 10 j=1,m3 $ m2) c(k,j)=0.0 dimension a(m1,m2) do 10 i=1,m2 do 10 i=1,m1 c(k,j)=c(k,j)+a(k,i)*b(i,j) read(5,*) (a(i,j),j=1,m2) continue 10 continue end end subroutine putmat(c,m1,m2,str) character str parameter (n1=3,n2=3,n3=3) dimension c(m1,m2) dimension a(n1,n2) write(*,100) str dimension b(n2,n3),c(n1,n3) do 10 i=1,m1 open(5,file='input.dat') write(*,200) (c(i,j),j=1,m2) call getmat(a,n1,n2) continue call getmat(b,n2,n3) format(/5x,'Matrixes ',a) call matpro(a,n1,n2,b,n3,c) format(1x,10f6.2) call putmat(c,n1,n3,'c') end end 17
14
求立方体两顶角对角线长d real loa write(*,*) 'Enter cubic sides a,b,h:' read(*,*) a,b,h c loa:line of Opposite Angles c=loa(a,b) d=loa(c,h) write(*,100) d 100 format(1x,'Line of cubic opposite', $ ' angles:',f8.3) end
5
二、 子例行子程序
call sum(3,y1) call sum(4,y2) call sum(5,y3) call sum(6,y4) y call sum(7,y5) y=(y1+y2+y3)/(y4+y5) write(*,100) 'y=',y format(1x,a,e13.6) end subroutine sum(n,s) integer n real s s=0 do 10 i=1,n s=s+i continue end
i i i
i 1 i 1 i 1
3
4Hale Waihona Puke 5主程序i i
i 1 i 1
6
7
100
子例行 子程序标志 子例行子程序
子程序名只供调用, 不代表某个值。
10
子例行子程序必须以 subroutine语句开头, 以end语句结束。
6
说明:
1. 子例行子程序取名法则与变量名同。 2. 如果没有虚参,程序名后的一对括号必须省略不写。
11
(4)如果实参是变量或数组元素,在调用子程序时, 对应的虚实参数实际上将共用同一存储单元。 program main subroutine sub(x,a) integer a,c(3) integer x,a data c/3*0/ a=2*x a=100 x=2*a call sub(a,c(2)) end write(*,*)'a=',a,' c(2)=',c(2) end
4
function myexp(x) real myexp n=0 t=1 s=1 2 3 x x do 10 while(abs(t).gt.1e-5) x e 1 x n=n+1 2! 3! t=t*x/n s=s+t 10 continue myexp=s end real myexp write(*,*) 'Enter x:' read(*,*) x y=(myexp(x)-myexp(-x))/2.0 e x ex sinh(x) write(*,100) 'sinh(',x,')=',y 2 100 format(1x,a,f5.2,a,e13.6) end
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_nameABAQUS会把用户的源程序编译成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楼所说的藏了一些工作吧,大家不妨试一下。
子程序的定义及使用
表达式实际上都可表示成一元、二元或多元函数关系,即 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语言中entry用法
fortran语言中entry用法Fortran语言中entry用法1. 什么是Fortran语言中的entry?在Fortran语言中,entry是一种用于定义子程序的方式。
它可以在同一个程序中定义多个名称相同但参数不同的子程序,使得程序更加灵活和可扩展。
2. entry的基本语法entry语句的基本语法如下:entry entry_name[arg1, arg2, ...]! 子程序的代码块end entry_name其中,entry_name表示定义的entry的名称,可以根据需要自行定义。
arg1, arg2, ...表示entry的参数列表,每个参数都可以有自己的数据类型和属性。
3. entry的作用和优点使用entry语句可以实现以下几个方面的功能和优点:•重载子程序名称:通过使用不同参数列表的entry,可以实现对同一名称的子程序进行重载,提高代码的可读性和可维护性。
•灵活性:通过传递不同的参数和属性,可以实现对子程序的不同功能和行为。
•代码复用:可以重复使用相同的子程序名称,避免在不同的位置重复编写相似的代码。
•模块化:使用entry可以将一个复杂的程序分解为多个简单的子程序,便于调试和维护。
4. entry的示例下面是一个简单的示例,展示了如何使用entry语句定义一个求和子程序,并实现对不同数据类型的支持:program entry_demoimplicit noneinteger :: i1, i2, i3real :: r1, r2, r3i1 = 1i2 = 2r1 =r2 =call sum_entry(i1, i2, i3)call sum_entry(r1, r2, r3)print *, "Integer sum: ", i3print *, "Real sum: ", r3containsentry sum_entry(arg1, arg2, res)integer, intent(in) :: arg1, arg2integer, intent(out) :: resres = arg1 + arg2end entry sum_entryentry sum_entry(arg1, arg2, res)real, intent(in) :: arg1, arg2real, intent(out) :: resres = arg1 + arg2end entry sum_entryend program entry_demo在上述示例中,我们定义了一个sum_entry的entry,它分别支持两个整数参数和两个实数参数。
第六讲 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子程序【精选】
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程序在结构上大致如下:
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命令来设臵初值,看一个程序:
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"程序。
ABAQUS中Fortran子程序调用方法—自己总结
第一种方法:在Job模块里,创建工作,在Edit Job对话框中选择General选项卡,在User subroutine file中点击Select按钮,从弹出对话框中选择你要调用的子程序文件(后缀为.for 或.f)。
第二种方法:1. 建立工作目录2. 将Abaqus安装目录\\site下的或拷贝到工作目录,并改名为;3. 将编译的fortran程序拷贝到工作目录;4. 将.obj文件拷贝到工作目录;5. 建立好输入文件.inp;6. 运行abaqus job=inp_name user=fortran name即可。
以下是网上摘录的资料,供参考:用户进行二次开发时,要在命令行窗口执行下面的命令:abaqus job=job_name user=sub_nameABAQUS会把用户的源程序编译成obj文件,然后临时生成一个静态库和动态库,还有其它一些临时文件,而它的主程序(如和等)则没有任何改变,由此看来ABAQUS是通过加载上述2个库文件来实现对用户程序的连接,而一旦运行结束则删除所有的临时文件。
这种运行机制与ANSYS、LS-DYNA、marc等都不同。
这些生成的临时文件要到文件夹C:\Documents and Settings\Administrator\LocalSettings\Temp\中才能找到,这也是6楼所说的藏了一些工作吧,大家不妨试一下。
1 子程序格式(程序后缀是.f; .f90; .for;.obj)答:我试过,.for格是应该是不可以的,至少和版本应该是不行,其他的没用过,没有发言权。
在Abaqus中,运行abaqus j=jobname user=username时,默认的用户子程序后缀名是.for (.f,.f90应该都不行的,手册上也有讲过),只有在文件没有找到的情况下,才会去搜索,如果两者都没有,就会报错误信息。
如果username包括扩展名for或obj,那么就根据各自的扩展名ABAQUS会自动选择进行操作。
