1

我编写了一个科学的 fortran 代码,没有使用任何特定的 fortran 标准。但我现在必须声明我使用的是哪个 fortran 标准。

我说我使用的是 fortran 2003,因为我需要 get_command_argument 和 command_argument_count 内部函数。但是,当使用标志 -std=f2003 检查代码标准时,编译失败。

我在某些部分收到有关实数类型声明的错误。例如,当我在模块中声明变量时:

module innout
implicit none
real*8,parameter               :: nan=-1.
real*8,allocatable,save        :: windU(:),windV(:)
real*8,allocatable,save        :: input_param(:,:),input_rad(:,:)
real*8,allocatable,save        :: prein(:),input(:),ref_lev(:)
character(30),allocatable,save :: sceneclass(:)
end module innout

我在所有实变量中都收到消息“非标准类型声明 REAL*8”。

有谁知道发生了什么?

4

3 回答 3

2

real*8不是,也从来不是,Fortran 标准类型声明。如今,声明 64 位实数的最简单方法可能是从内部模块导入命名常量 ,如下所示:real64iso_fortan_env

use, intrinsic :: iso_fortran_env
...
real(real64) :: my_var

还有其他方法,涉及selected_real_kind和其他机制,但是如果您想使用 IEEE 浮点类型进行编程,那么real64real32是一个不错的方法。

正如@AlexanderVogt 在评论中指出的那样,这些标准命名常量已添加到 2008 年标准中的语言中。我使用过的最新编译器版本已经实现了它们。

于 2015-03-04T13:14:14.987 回答
1

说明kind符是要走的路...

如果你限制自己使用 Fortran 2003 Standard,那么你需要先使用kind()orselected_real_kind()函数来确定对应的种类:

module innout
  implicit none
  integer,parameter                  :: REAL64 = kind(1.d0)

  real(kind=REAL64),parameter        :: nan=-1._REAL64
  real(kind=REAL64),allocatable,save :: windU(:),windV(:)
  real(kind=REAL64),allocatable,save :: input_param(:,:),input_rad(:,:)
  real(kind=REAL64),allocatable,save :: prein(:),input(:),ref_lev(:)
  character(30),allocatable,save     :: sceneclass(:)
end module innout

如果您被允许/您的编译器支持 Fortran 2008,我会推荐该模块ISO_Fortran_env和预定义常量REAL64

module innout
  use,intrinsic :: ISO_Fortran_env, only: REAL64
  implicit none
  real(kind=REAL64),parameter         :: nan=-1._REAL64
  real(kind=REAL64),allocatable,save  :: windU(:),windV(:)
  real(kind=REAL64),allocatable,save  :: input_param(:,:),input_rad(:,:)
  real(kind=REAL64),allocatable,save  :: prein(:),input(:),ref_lev(:)
  character(30),allocatable,save      :: sceneclass(:)
end module innout
于 2015-03-04T13:14:22.247 回答
0

我已经找到了答案。

在变量声明中使用以下内容,它似乎工作正常:

integer, parameter :: dp = selected_real_kind(15, 307)

来自http://fortranwiki.org/fortran/show/Real+precision

于 2015-03-04T13:25:25.567 回答