我正在尝试编写一个使用绿色函数来解决热方程的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
答案 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)
我在你的程序中看到两个问题。
主子程序不知道x()是什么。它是真正的函数,整数函数等吗?您可以将以下内容添加到主程序中 real,external :: x 或者(正如其他人建议的那样)将函数X()移动到您的模块中。 为此,请在模块末尾附近添加“包含”语句 把功能放在“包含”和“结束模块”之间。
您的参数不匹配。在主程序中,N1被明确声明为实变量。在函数X()中,N1被声明为实数。你需要解决这个问题。
我强烈建议您在主程序中添加“隐式无”语句, 模块和功能。这将强制您隐式键入每个变量和函数。