在程序开始时进行系统计算/初始化的正确方法

时间:2015-05-06 10:11:54

标签: fortran

我正在编写一个程序,我将在两个主要情况下使用:1D和2D。维度ndim是通过read外部文件加载的,我想在模块read中执行param

我有各种矢量声明,其大小取决于尺寸。显然我必须在主程序的开头计算这些大小。这样做的正确方法是什么?我想使用模块,但我失败了。

module dimensions
  use prec
  use param
  implicit none
  integer ( int32 ), parameter :: nip = 49   ! Number of interior points
contains
subroutine calc_neqn ( )
  use prec
  implicit none
  integer ( int32 ) :: nup                   ! Number of unknown points
  integer ( int32 ) :: neqn                  ! Number of equations

! compute number of unknown points
  nup = (nip+2)**ndim
! compute number of equations
  neqn = 2*nup

end subroutine calc_neqn
! systematic computations
  call calc_neqn ( )
end module dimensions

我得到以下内容 - 非常明确 - 错误消息:

Error: Unexpected CALL statement in CONTAINS section at (1)

换句话说,模块可以调用子程序吗?什么是正确的语法?

2 个答案:

答案 0 :(得分:4)

不,模块本身无法执行任何可执行代码。有些编程语言在使用模块时允许默认初始化,但Fortran不是其中之一。

您应该将初始化代码放在子程序中,并且必须记住从主程序或其他程序调用此子程序。

面向对象的方法是使用对象而不是模块,并在对象初始化程序中使用初始化代码。

如果ndim是参数,则可以在编译时评估常量精度。如果不是,则必须在自己获得calc_neqn时致电ndim。然后你可以根据需要分配你的矢量(你没有显示)。

答案 1 :(得分:2)

模块不能自己执行代码

您可能想要做的是这样的事情:

ndim

这将为模块和主程序提供my_data变量以及initialize数组。只要确保你不在子程序中再次定义,因为这只会在Select Replace(textct, Special_char, ' ') from mytable 范围内创建新变量。