Fortran 90:如何在函数中使用模块

时间:2011-01-08 05:59:04

标签: function parameters module global-variables fortran

我正在尝试编写一个使用绿色函数来解决热方程的fortran程序。我使用的是fortran 90而不是77,部分原因是因为我的印象是它几乎是fortran 77的复制品,但有一些非常有用的功能。虽然主要原因是自由格式编码。我在一个名为“有用”的模块中有一些“有用的”常量和变量。我想在我的大多数程序,子程序,函数等中包含这些变量和常量。我只是在学习fortran。我已经在perl,C ++,java,matlab和mathematica中编写过程序。我觉得很难。我不明白程序和子程序之间的区别。我当然不清楚模块是什么。过去12个小时我一直在研究这些术语,但尚未得到简明扼要的区别和定义。我得到了各种各样的样本,展示了如何声明这些东西,但实际上很少描述它们应该用于什么。

我真的很感激为什么我的函数“x”无法“使用”我的“有用”模块的解释。

此外,澄清前面提到的fortran功能将非常有用。

module useful

  integer, parameter :: N=2
  double precision, parameter :: xmin=1, xmax=10, pi=3.1415926535898
  double complex :: green(N,N), solution(N), k=(2.0,0.0)

end module useful

program main

  use useful

  !real*8 :: delta = 2**-7
  do n1 = 1, N
    do n2 = 1, N
      green(n1,n2) = exp((0,1)*k*abs(x(n2)-x(n1)))/(4*pi*abs(x(n2)-x(n1)))
      print *, x(n2)
    end do 
  end do

end program main

function x(n1)

  use useful

  real :: n1, x
  x=n1*(xmax-xmin)/N

end function x

3 个答案:

答案 0 :(得分:5)

让我们从一些定义开始。

Fortran程序由程序单元组成。在所谓的Fortran 2008(现行标准)中,有五种类型的程序单元:

  • 主程序;
  • 外部子程序;
  • 模块;
  • 子模块;
  • 阻止数据程序单元。

让我把注意力集中在前三个。

主程序
作为标准声明,它是

  

程序单元不是子程序,   模块,子模块或块数据   计划单位。

不是很有用的定义。 =)你应该知道的是,主程序单元以关键字PROGRAM开头,它是应用程序的入口点,显然程序应该只包含一个主程序。

程序也可以包含任何数量(包括零)的其他类型的程序单元。

外部子程序
子程序定义了一个过程。有两种类型的程序,当然还有两种类型的子程序来定义它们:

  • 用于定义函数的函数子程序;
  • 子程序子程序,用于定义子程序。
  

函数子程序是一个子程序,它有一个FUNCTION语句作为它的第一个语句。   子程序子程序是一个子程序,它有一个SUBROUTINE语句作为它的第一个语句。

程序和子程序在程序中的出现也不同。您可以使用:

  • 用于定义外部程序的外部子程序;
  • 用于定义内部程序的内部子程序;
  • 模块子程序,用于定义模块程序。
  

外部子程序
  未包含在子程序中的子程序   主程序,模块,子模块或   另一个子程序

     

内部子程序
  主程序中包含的子程序或   另一个子程序

     

模块子程序
  包含在模块或子模块中的子程序   但不是内部子程序

<强>模块
它只是一个定义(类型定义,过程定义等)容器。

现在很小的例子。

main.f90时

! Main program unit.
PROGRAM main

  USE foo

  IMPLICIT NONE

  CALL external_bar
  CALL internal_bar
  CALL module_bar

  CONTAINS

    ! Internal subprogram defines internal procedure.
    SUBROUTINE internal_bar
      PRINT *, "inside internal procedure"
    END SUBROUTINE internal_bar

END PROGRAM main

foo.f90

! Module program unit.
MODULE foo

  IMPLICIT NONE

  CONTAINS

    ! Module subprogram defines module procedure.
    SUBROUTINE module_bar
      PRINT *, "inside module procedure"
    END SUBROUTINE module_bar

END MODULE foo

bar.f90

! External subprogram program unit.
! External subprogram defines external procedure.
SUBROUTINE external_bar
  PRINT *, "inside external procedure"
END SUBROUTINE external_bar

答案 1 :(得分:1)

模块是一个比子程序或函数更高级别的组织。

功能“x”应该能够使用有用的模块。我认为程序“main”更有可能难以正确访问“x”。在“包含”语句之后,最好还将函数“x”放入模块中。在这种情况下,从“x”中删除“use useful”语句。然后程序main将完全了解接口...在Fortran命名法中,接口是显式的。这可以确保参数的传递是一致的。

如果您显示编译器的错误消息,将会有所帮助。

Fortran 95/2003远远超过FORTRAN 77,还有一些额外的实用功能。变化要大得多。试图从网上学习它并不是一个好主意。我建议您找到Metcalf,Reid和Cohen所着的“Fortran 95/2003 Explained”一书。

答案 2 :(得分:0)

我在你的程序中看到两个问题。

  1. 主子程序不知道x()是什么。它是真正的函数,整数函数等吗?您可以将以下内容添加到主程序中 real,external :: x 或者(正如其他人建议的那样)将函数X()移动到您的模块中。 为此,请在模块末尾附近添加“包含”语句 把功能放在“包含”和“结束模块”之间。

  2. 您的参数不匹配。在主程序中,N1被明确声明为实变量。在函数X()中,N1被声明为实数。你需要解决这个问题。

  3. 我强烈建议您在主程序中添加“隐式无”语句, 模块和功能。这将强制您隐式键入每个变量和函数。