回 帖 发 新 帖 刷新版面

主题:想写一本fortran书

国内好像还没有人写过fortran95 OOP编程,想填补一下空白。[em8]
顺便介绍一下常用的库:lapack3.1/95,以及openmp/mpi上手;
但是又怕fortran太冷门了,写出来很可能要滞销。

回复列表 (共53个回复)

21 楼

我根据自己的需要作了一点测试,一个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 楼

[quote]从f90到筹划中的f2008,J3委员会花了20多年时间出了4个标准提高Fortran各方面的能力。一个方向是提供更好的计算设施如动态数组之类。这些F77之后的“新特性”对帮助我们更好地数值计算绝对是有帮助的。因此一本集中解释新标准难点的书肯定收到欢迎。不仅应该向F77程序员解释这些新设施的使用方法,还要解释为什么需要它们。[/quote]

非常赞同以上观点!没有发现系统介绍标准的资料。不知道现在网上能不能找到关于F95 F2003标准的资料?楼主有没有?英文也行,可能更好,国内科技资料有的翻译的更让人难以理解

23 楼

[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 楼

[quote]这样操作还是不够完美。[/quote]

fortran 95的oop确实很初级,并不是真正的oop。我以前也一直使用Cpp,后来因为要做数值运算才转到fortran上,很难接受F77的风格。F95虽然不完善但了胜于无吧。期待F 2003

PS:支持楼主出书,到时一定支持正版。我觉得Fortran市场不大,但是也不是特别小,特别在工程领域工科院校。我的同学同事里面就有不少在用fortran,总是苦于资料太少,除了大家都推荐的那两本以外都是些老掉牙的77

25 楼

臭石头雪球、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 楼

[quote]f95 oop方面的缺陷不在数据隐藏而在其他。到F2003,过程可以绑定到类型,即type内部可以contains子过程,public/private控制更精准,还可以type extends来继承。[/quote]

你要是早点说 F2003 的 Type 可以 Contains 子过程的话,我不就早明白。
我的意思就是这样。

27 楼

支持楼主!

28 楼

我现在才是郁闷阿, 老板的一个fortran程序, 几百个子程序, 应该算比较大的了吧. 里面数据存放更绝, 所有类型的数据全在一个数据区, 看得我快要吐了.

29 楼

楼主有没有F2003标准的资料分享?语言不限

30 楼

目前还没有什么f2003好点的书,J3委员会的fortran2003国际标准算一本吧,其他都是介绍性的。那本f95/2003 explained怎么都下载不到,只有样本章节。

刚刚在google申请了一个网页,放了些书在上面,去看看吧,链接见本帖1楼。不过担心侵权,所以没有每本书都提供下载链接。

刚才给各位好评,但是“一个帖子最多给同一个人50分好评”,所以有些无法评价了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册