主题:想写一本fortran书
f2003
[专家分:7960] 发布于 2007-03-27 03:48:00
国内好像还没有人写过fortran95 OOP编程,想填补一下空白。[em8]
顺便介绍一下常用的库:lapack3.1/95,以及openmp/mpi上手;
但是又怕fortran太冷门了,写出来很可能要滞销。
最后更新于:2007-10-17 18:44:00
回复列表 (共53个回复)
21 楼
clmoonlight [专家分:80] 发布于 2007-04-19 12:09:00
我根据自己的需要作了一点测试,一个res module文件,一个test文件
[b]module RES[/b]
implicit none
type :: elemres
integer :: num
REAL, DIMENSION(:,:), allocatable :: ene
end type elemres
CONTAINS
SUBROUTINE Ini(er,num)
type(elemres) :: er
integer :: num
er%num=num
ALLOCATE (er%ene(er%num, 2))
er%ene(:,1)=num*2
er%ene(:,2)=num*3
END SUBROUTINE Ini
Subroutine Destructor(er)
implicit none
type(elemres) :: er
if (allocated(er%ene)) then
deallocate(er%ene)
end if
return
End Subroutine Destructor
END MODULE
[b]program Main [/b]
USE res
implicit none
integer(4) :: num=5, i
type(elemres), DIMENSION(:), allocatable :: er
ALLOCATE(er(num))
do i=1,num,1
call Ini(er(i),i)
enddo
do i=1,num,1
call Destructor(er(i))
enddo
end
type elemres可以生成多个对象er(:),但是对每个对象的操作要把er(i)作为参数传递到函数中。
这里多个对象以数组形式存放,因此也可以将er(:)声明放在module里面,作为module的变量。进行操作时指定对第i个er操作即可。
但是如果多个对象定义为不同名称,如era,erb,erc等,好像就只能把era,erb,erc作为参数传递到函数中
22 楼
clmoonlight [专家分:80] 发布于 2007-04-19 12:16:00
[quote]从f90到筹划中的f2008,J3委员会花了20多年时间出了4个标准提高Fortran各方面的能力。一个方向是提供更好的计算设施如动态数组之类。这些F77之后的“新特性”对帮助我们更好地数值计算绝对是有帮助的。因此一本集中解释新标准难点的书肯定收到欢迎。不仅应该向F77程序员解释这些新设施的使用方法,还要解释为什么需要它们。[/quote]
非常赞同以上观点!没有发现系统介绍标准的资料。不知道现在网上能不能找到关于F95 F2003标准的资料?楼主有没有?英文也行,可能更好,国内科技资料有的翻译的更让人难以理解
23 楼
臭石头雪球 [专家分:23030] 发布于 2007-04-19 13:10:00
[quote]我根据自己的需要作了一点测试,一个res module文件,一个test文件
[b]module RES[/b]
......
END MODULE
[b]program Main [/b]
USE res
......
end
type elemres可以生成多个对象er(:),但是对每个对象的操作要把er(i)作为参数传递到函数中。
这里多个对象以数组形式存放,因此也可以将er(:)声明放在module里面,作为module的变量。进行操作时指定对第i个er操作即可。
但是如果多个对象定义为不同名称,如era,erb,erc等,好像就只能把era,erb,erc作为参数传递到函数中
[/quote]
感谢你的测试。
你的代码中设定了一个子程序用来 初始化,一个子程序用来 结束使用。
这样的风格非常好。
我再多说两句,这样的做法是必须要把需要的“属性”,全部通过 Module 外部传递进来。不能封装机密数据。
另外,对于一些比较复杂的计算过程,很多中间数据都习惯用 Private 来规定。(否则的话 Use Module 的主程序中会有很多变量名称冲突。)
总不能把这么多的数据全部通过参数传递吧?
因此,这样操作还是不够完美。
24 楼
clmoonlight [专家分:80] 发布于 2007-04-19 14:47:00
[quote]这样操作还是不够完美。[/quote]
fortran 95的oop确实很初级,并不是真正的oop。我以前也一直使用Cpp,后来因为要做数值运算才转到fortran上,很难接受F77的风格。F95虽然不完善但了胜于无吧。期待F 2003
PS:支持楼主出书,到时一定支持正版。我觉得Fortran市场不大,但是也不是特别小,特别在工程领域工科院校。我的同学同事里面就有不少在用fortran,总是苦于资料太少,除了大家都推荐的那两本以外都是些老掉牙的77
25 楼
f2003 [专家分:7960] 发布于 2007-04-20 01:37:00
臭石头雪球、clmoonlight:
clmoonlight编的程序就是我所说的f95 oop编程。但是,必须这样:
public elemres
type :: elemres
private
integer :: num
real, pointer :: ene(:,:)=>null()
end type elemres
elemres是可以从模块外面访问的,但是其全部内部变量都是module外不可访问的。要访问其内部变量,只能通过module中的子程序,这些子程序是public属性,从而可以在主程序中call;与此同时,因为它是module子过程,所以可以访问elemres的内部变量。数据隐藏是oop的一个主要目的,必须这样做。
f95 oop方面的缺陷不在数据隐藏而在其他。到F2003,过程可以绑定到类型,即type内部可以contains子过程,public/private控制更精准,还可以type extends来继承。
以各位的能力,现在肯定知道f95 oop还是有点意思的,呵呵。稍晚我给上面诸位朋友好评,非常感谢。
26 楼
臭石头雪球 [专家分:23030] 发布于 2007-04-20 08:09:00
[quote]f95 oop方面的缺陷不在数据隐藏而在其他。到F2003,过程可以绑定到类型,即type内部可以contains子过程,public/private控制更精准,还可以type extends来继承。[/quote]
你要是早点说 F2003 的 Type 可以 Contains 子过程的话,我不就早明白。
我的意思就是这样。
28 楼
katucha [专家分:20] 发布于 2007-04-23 08:14:00
我现在才是郁闷阿, 老板的一个fortran程序, 几百个子程序, 应该算比较大的了吧. 里面数据存放更绝, 所有类型的数据全在一个数据区, 看得我快要吐了.
29 楼
clmoonlight [专家分:80] 发布于 2007-04-23 17:21:00
楼主有没有F2003标准的资料分享?语言不限
30 楼
f2003 [专家分:7960] 发布于 2007-04-23 17:31:00
目前还没有什么f2003好点的书,J3委员会的fortran2003国际标准算一本吧,其他都是介绍性的。那本f95/2003 explained怎么都下载不到,只有样本章节。
刚刚在google申请了一个网页,放了些书在上面,去看看吧,链接见本帖1楼。不过担心侵权,所以没有每本书都提供下载链接。
刚才给各位好评,但是“一个帖子最多给同一个人50分好评”,所以有些无法评价了。
我来回复