首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran 2003中的非标准类型声明

Fortran 2003中的非标准类型声明
EN

Stack Overflow用户
提问于 2015-03-04 12:39:38
回答 3查看 2K关注 0票数 1

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

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

在某些部分,关于reals的类型声明,我得到了错误。例如,当我在模块中声明变量时:

代码语言:javascript
复制
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”的消息。

有人知道发生了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-04 13:14:22

kind说明符是该走的路.

如果仅限于Fortran2003Standard,则需要首先使用kind()selected_real_kind()函数来确定相应的类型:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-03-04 13:14:14

real*8不是、也从来不是Fortran标准类型声明.现在,声明64位实值的最简单方法可能是从内部模块real64导入命名常量iso_fortan_env,如下所示:

代码语言:javascript
复制
use, intrinsic :: iso_fortran_env
...
real(real64) :: my_var

还有其他方法,包括selected_real_kind和其他机制,但是如果您想使用IEEE浮点类型进行编程,那么real64real32是一个很好的选择。

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-04 13:25:25

我已经找到答案了。

在变量声明中使用以下内容,它似乎运行良好:

代码语言:javascript
复制
integer, parameter :: dp = selected_real_kind(15, 307)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28854757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档