Fortran 2003 中的非标准类型声明
Nonstandard type declaration in Fortran 2003
我在没有使用任何特定 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
我在所有实变量中收到消息 "Nonstandard type declaration REAL*8"。
有人知道发生了什么事吗?
real*8
不是,也从来不是 Fortran 标准类型声明。如今,声明 64 位实数的最简单方法可能是从内部模块 iso_fortan_env
导入 named-constant real64
,如下所示:
use, intrinsic :: iso_fortran_env
...
real(real64) :: my_var
还有其他方法,涉及 selected_real_kind
和其他机制,但如果您想使用 IEEE 浮点类型进行编程,那么 real64
和 real32
是一个不错的选择.
正如@AlexanderVogt 在评论中指出的那样,这些标准命名常量已添加到 2008 年标准的语言中。我使用过的最新编译器版本已经实现了它们。
kind
说明符是要走的路...
如果你限制自己使用Fortran 2003 Standard,那么你需要先使用kind()
或selected_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
如果允许 to/your 编译器支持 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
我已经找到答案了。
在变量声明中使用以下内容,似乎工作正常:
integer, parameter :: dp = selected_real_kind(15, 307)
我在没有使用任何特定 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
我在所有实变量中收到消息 "Nonstandard type declaration REAL*8"。
有人知道发生了什么事吗?
real*8
不是,也从来不是 Fortran 标准类型声明。如今,声明 64 位实数的最简单方法可能是从内部模块 iso_fortan_env
导入 named-constant real64
,如下所示:
use, intrinsic :: iso_fortran_env
...
real(real64) :: my_var
还有其他方法,涉及 selected_real_kind
和其他机制,但如果您想使用 IEEE 浮点类型进行编程,那么 real64
和 real32
是一个不错的选择.
正如@AlexanderVogt 在评论中指出的那样,这些标准命名常量已添加到 2008 年标准的语言中。我使用过的最新编译器版本已经实现了它们。
kind
说明符是要走的路...
如果你限制自己使用Fortran 2003 Standard,那么你需要先使用kind()
或selected_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
如果允许 to/your 编译器支持 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
我已经找到答案了。
在变量声明中使用以下内容,似乎工作正常:
integer, parameter :: dp = selected_real_kind(15, 307)