《FORTRAN 95程序设计》学习笔记 下载本文

内容发布更新时间 : 2024/4/25 21:12:10星期一 下面是文章的全部内容请认真阅读。

《Fortran95 程序设计》学习笔记 by 柳柳

一行一行,iostat那个/=0就over了。(Ruby : readline)

? 直接访问文件的操作(还是分行的操作):open的时候设置recl的大小,然后类似:

? read(id , fmt , rec = 编号, ..)XX读编号内容即可。注意:recl=6则1行为4个

字符内容(有两个是”\\n”)

? 二进制文件的操作,与上面相比,改用form = “unformatted”

★ 【重要功能】内部文件与字符串,数字转换:把unit改为 = 字符串,读入数字即可做

到数字转字符串;反之亦可。

★ 【语法】namelist:namelist /na/ a,b,c 输入输出如下 (没用的功能)

? &na ? A=1 ? B=2 ? /

指针(指向变量、数组、函数)

★ 【语法与范例】指针指到变量

? integer, target :: a=1 ?声明一个可以当成目标的变量 ? integer, pointer :: p=1 ?声明一个可以指向整数的指针

? p => a ?设置指向(也可以不指,allocate(p)即可开地址,deallocate(p)干掉

地址。用起来像是个可释放的变量) ? p = 3 ?设置P位置的内存数据

★ 【语法】设置空指针:p => null() 或

? integer , pointer :: p ? nullify(p)

★ 【语法】判断指针是否已经设置内容:associated(pointer,[target]) 。这里如果有target可

以判断指针是否指向target内容。 ★ 【语法与例子】指针数组

? integer , pointer :: a( : ) 声明一维指针数组 ? integer , target :: b(5) = (/1,2,3,4,5/) ? a => b 即 a(1-5) = b(1-5)

第 11 页 共 16 页

《Fortran95 程序设计》学习笔记 by 柳柳

? a => b(1:5:2) 即a(1,2,3) = b(1,3,5)

? 同理,allocate(a(5)); a=(/1,2,3,4,5/) 注意这种和allocate的数组不同,必须手动

释放子程序霸占的内存。 ? 同理2,integer,pointer :: a( : , : )

★ 【语法】指针函数 :

? interface ?注:如果用了module就不用interface了 ? function getmin(p)

? integer, pointer :: p( : ) 输入一个指针 ? integer, pointer :: getmin 返回一个指针 ? end function ? end interface

★ 【数据结构】队列与堆寨(试误法)。举例:队列

? 定义类型

? type :: datalink ? integer :: I

? type(datalink) , pointer :: prev,next ?两个指针,可以指向datalink的type对象 ? end type datalink ? 使用

? type(datalink),target::node1,node2 ?声明两个新的类型,需要声明可做target ? node1 = datalink(1,null(),node2) ?初始化node1这个type对象,这个地方很有

特色,记住。

Visual Fortran 编译器(DLL,VB调用)

★ DEBUG & RELEASE:Build > Set Active Configuration选择编译模式。Release和Debug

的执行效率有几倍的差距。所以发布的版本最好要用Release格式。

★ 静态链接库:选择Fortran Static Library格式的new Project,这种东西编译后生成*.lib (只

有函数没有program) ?使用这种lib的时候:Fortran Concole Application里面加入*.lib即可。

★ 常用目录 / 文件设置

第 12 页 共 16 页

《Fortran95 程序设计》学习笔记 by 柳柳

? tool > options 选择Directories标签。Library files(*.lib) / include Files(*.mod,即

module)

? Project > Settings | Link标签,设置常用.lib,这里的|Debug可以设置output的.exe

相对位置

★ DLL动态链接库(Project : Fortran Dynamic Link Library)

? 这个.dll可以拿给别的程序用,无需重新编译。 ? 设置可被外界调用的程序

? subroutine sub()

? !DEC$ ATTRIBUTES DLLEXPORT :: SUB ?这个是注释,是给fortran看的

注释,用于被外界用的dll函数

? 编译后生成XXX.dll和XXX.lib

? 使用时,把XXX.lib加入自己的project并把xxx.dll放到最终的.exe同目录下。(注:

有时会出现要求手动设置)

★ 执行时间分析: Build > Profile

★ 优化程序的观念:加减快于乘除,乘法快于乘幂

★ Visual Basic和DELPHI中调用Fortran的程序(★重要★):

? Fortran:某函数中:

? !DEC$ ATTRIBUTES DLLEXPORT :: CIRCLE_AREA ,函数名编译后会变成

全部大写。

? !DEC$ ATTRIBUTES ALIAS : ”ca” :: CIRCLE_AREA , 强制把函数

CIRCLE_AREA编译为ca这个名字。

? 这样就行了。注意,别的很多语言中(C,VB,DELPHI)传递字符串要传字符

串和长度,所以Fortran输入字符串只有一个,别人要用两个。

? 举例:

? Fortran中

? subroutine Makelower(string)

? !DEC$ ATTRIBUTES DLLEXPORT :: MAKELOWER ? .. end subroutine ? VB中

? Private Declare Sub MAKELOWER lib “forlib.dll”(ByVal s As String , ByVal

第 13 页 共 16 页

《Fortran95 程序设计》学习笔记 by 柳柳

I As Long)

? 使用:call MAKELOWER(“aBcDe”,len(“aBcDe”)) ? DELPHI中

? Implementation

? Function MAKELOWER(r:String ; I:Longint);stdcall;external ?forlib.dll? ? {$R , *.dfm}

? 使用:MAKELOWER(Edit2.text, length(Edit2.text))

★ 【超重要功能】全文件搜索:Edit > Find in Files (RMXP的ctrl+shift+F) ★ 【快捷键】ctrl+L :删除一行

数值算法与IMSL(数值算法插件)

★ 常用算法(需要的时候自己搜索):

? 求解非线性函数:二分法Bisection,割线法Secant,牛顿法 ? 积分:梯形积分法,SIMPSON辛普森积分

? 插值与曲线近似:拉格朗日插值,牛顿插值法(Forward Interpolation),Least Square,

曲线近似法(Cubic Spline)

? 排序方法:冒泡排序法,选择排序法,Shell排序法,快速排序法 ? 搜索:顺序搜索,二元搜索(先排序),哈希Hashing搜索思想 ? 树状结构:二叉树等

★ IMSL函数库:位置:\\Microsoft Visual Studio\\DF98\\IMSL (\\HELP),使用前先设置路径。

之后Use IMSL即可 ? 矩阵运算

? A .x. B 矩阵相乘 ? .i.A 矩阵求逆 ? .t.A 矩阵转置

? A .ix. B 矩阵A逆乘以B;类似还有A.xi.B,A.tx.B ? R = CHOL(A) A = RTR

? Q = ORTH(A , [R=R]) A=QR,QTQ=I ? F = DEF(A) 求行列式值

第 14 页 共 16 页

《Fortran95 程序设计》学习笔记 by 柳柳

? K = RANK(A) 求矩阵的rank值 ? Z = EYE(N) 得到N*N的单位阵 ? A = DIAG(X) 以X Vector设置对角阵 ? X = DIAGONALS(A) 把A的对角线取出

? Y = FFT(X,[WORK=W]) ; X = IFFT(Y,[WORK=W]) 傅立叶变换 ? A = RAND(A) 把矩阵设置为0~1随机数

? 高斯方程组:AX=B:call lin_sol_gen(A,B,X),要求二维数组。

? 多项式函数:ZPLRC,ZPORC,ZPOCC,DZPLRC,DZPORC,DZPOCC。都差

不多,自己查帮助,举例:ZPLRC(integer NDEG, real COEFF(NDEG+1) , complex ROOT(NDEG)),分别是次数,各项系数,解(复数数组) ? 任意函数:(D)ZANLY,(D)ZBREN,(D)ZREAL

? 非线性方程组:(D)NEQNF, (D)NEQNJ, (D)NEQBF , (D)NEQBF

? 微积分:积分(D)QDAGS,(D)QDAGP,(D)QDAGI;多重积分(D)TWODQ,(D)AND,

微分:(D)DERIV

? 微分方程:常微分方程:IVPRK,IVMRK,IVPRG;(D)BVPFD、(D)BVPMS(难

用)

? 插值与曲线近似:曲线近似:(D)CSIEZ、(D)CSINT、(D)CSVAL;最小方差:(D)RLINE

线性,(D)RCVRV多项式,(D)FNLSQ

常用库函数(数学、数组、零碎、子程序)

★ 数学:sin(x),cos(x),asin(x),acos(x),tan(x),atan(x),sinH(x)正切,cosH(x),tanH(x),

exp(x),log(x),log10(x) ★ 零七八碎:

? ABS(x) 绝对值

? AIMAG(x) 返回复数C的虚部 ? AINT( r ) 返回射去小数的参数值

? CEILING(a) 等于或大于a的最小整数;FLOOR(a)等于或小于a的最大整数 ? INT(a) 转成整型

? Max(a,b,c…) , Min(a,b,c…) 最大最小值

第 15 页 共 16 页