Tag: fortran90

编写健壮的“现代”Fortran代码

在一些科学环境中,由于大多数开发人员只知道习惯用法,并且有很多遗留代码和相关经验,所以经常不能没有FORTRAN。 坦率地说, 高性能编程没有太多其他的跨平台选项(C ++可以完成这个任务,但是语法,零开始数组和指针与某些人不兼容)。 因此,我们假设一个新的项目必须使用Fortran 90,但是我想用最新的编译器(Intel ifort,还包括Sun / HP / IBM编译器)来兼容最新的软件架构, 所以我正在考虑强加一些广为人知的常识,但在我的环境中还不是一个标准: 全局variables被禁止,没有gotos,没有跳转标签, implicit none ,等等。 “面向对象的编程”(具有数据types和相关子程序的模块) 模块化/可重用的function,有据可查的可重用的库 断言/先决条件/不变式(使用预处理器语句实现) 所有(大多数)子程序和“对象”的unit testing 一个强烈的“debugging模式”( #ifdef DEBUG )与更多的检查和所有可能的英特尔编译器检查可能(数组边界,子程序接口等) 统一并强制执行易读的编码风格,使用代码处理工具助手。 所有的目标都是要有值得信赖,可维护和模块化的代码。 而在大量的遗留代码中,可重用性并不是一个重要的目标。 我search了关于面向对象的Fortran,合同编程(断言/前置条件/​​等等)的参考资料,并且find了没有大型项目参与的人员所做的丑陋和过时的文档,语法和论文以及死了的项目。 任何有关此主题的良好url,build议,参考文献/书籍?

如何将可分配数组传递给Fortran中的子例程

下面的代码是返回一个分段错误,因为我试图通过的可分配数组没有被正确识别(大小返回1,当它应该是3)。 在这个页面(http://www.eng-tips.com/viewthread.cfm?qid=170599)一个类似的例子似乎表明它应该在F95中正常工作; 我的代码文件有一个.F90扩展名,但我试图将其更改为F95,我正在使用gfortran进行编译。 我的猜测是,问题应该以我将可分配数组传递给子例程的方式进行; 我究竟做错了什么? !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! PROGRAM test !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! IMPLICIT NONE DOUBLE PRECISION,ALLOCATABLE :: Array(:,:) INTEGER :: iii,jjj ALLOCATE(Array(3,3)) DO iii=1,3 DO jjj=1,3 Array(iii,jjj)=iii+jjj PRINT*,Array(iii,jjj) ENDDO ENDDO CALL Subtest(Array) END PROGRAM !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! SUBROUTINE Subtest(Array) DOUBLE PRECISION,ALLOCATABLE,INTENT(IN) :: Array(:,:) INTEGER :: iii,jjj PRINT*,SIZE(Array,1),SIZE(Array,2) DO iii=1,SIZE(Array,1) DO jjj=1,SIZE(Array,2) PRINT*,Array(iii,jjj) ENDDO ENDDO END SUBROUTINE !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!

在Fortran中正确使用模块,子例程和函数

我最近在向我的FORTRAN程序添加函数时了解了interface block 。 一切工作很好,整齐,但现在我想添加第二个function到interface block 。 这是我的接口块: interface function correctNeighLabel (A,i,j,k) integer :: correctNeighLabel integer, intent(in) :: i,j,k integer,dimension(:,:,:),intent(inout) :: A end function function correctNeighArray (B,d,e,f) character :: correctNeighArray integer, intent(in) :: d,e,f character, dimension(:,:,:),intent(inout) :: B end function end interface 在我看来,这可能不是最好的select。 我已经研究过子程序,但我不是很确信这是正确的解决scheme。 我所做的是相对简单的,我需要将parameter passing给子例程,但是我所看到的所有子例程都是复杂的(即对于函数来说太复杂),并且b)不采取参数performance得像操纵variables而不传递给它们。 我没有真正地查看模块,但从我所看到的是不正确的使用。 任何build议什么时候使用,以及如何去做最好的将非常感激。