我编写了一个科学的fortran代码,没有使用任何特定的fortran标准。但我现在必须声明我使用的是哪种fortran标准。
我说我使用fortran 2003,因为我需要get_command_argument和command_argument_count内在函数。但是,当使用标志-std=f2003检查代码标准时,编译失败。
在某些部分,关于reals的类型声明,我得到了错误。例如,当我在模块中声明变量时:
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我在所有实变量中得到“非标准类型声明实*8”的消息。
有人知道发生了什么吗?
发布于 2015-03-04 13:14:22
kind说明符是该走的路.
如果仅限于Fortran2003Standard,则需要首先使用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如果允许您/您的编译器支持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-04 13:14:14
real*8不是、也从来不是Fortran标准类型声明.现在,声明64位实值的最简单方法可能是从内部模块real64导入命名常量iso_fortan_env,如下所示:
use, intrinsic :: iso_fortran_env
...
real(real64) :: my_var还有其他方法,包括selected_real_kind和其他机制,但是如果您想使用IEEE浮点类型进行编程,那么real64和real32是一个很好的选择。
正如@AlexanderVogt在一条评论中指出的那样,这些名为常量的标准被添加到2008年标准的语言中。最近我已经使用过的编译器版本已经实现了它们。
发布于 2015-03-04 13:25:25
我已经找到答案了。
在变量声明中使用以下内容,它似乎运行良好:
integer, parameter :: dp = selected_real_kind(15, 307)来自http://fortranwiki.org/fortran/show/Real+precision
https://stackoverflow.com/questions/28854757
复制相似问题