定义一个必须声明为常量的变量,但循环中的变化

时间:2014-08-27 18:09:24

标签: fortran

我正在测试函数selected_real_kind的值范围(-1:34仅用于踢),以确定它返回的kind参数以及a使用的实际精度位数使用此kind定义的变量。但是,由于转换变量RPxualpha例如)的函数,我对如何在下面定义变量real(x,RP)感到困惑。要求RP(种类型)保持不变。

如果我将RP定义为parameter,即在顶部写integer, parameter :: RP我必须立即对其进行初始化,然后我显然无法更改它,因为它是{{1} 1}},所以这不起作用。

这就是我所拥有的:

parameter

3 个答案:

答案 0 :(得分:1)

Fortran提供了许多内在函数来查询它处理的数字的特征。有关digitsprecisionradix等功能,请参阅您的文档。所有这些(包括我没有提到但你的文档将列出的那些)是通用的(足够的)来处理编译器支持的所有数字类型的输入。

使用这些功能比使用自己的功能更快。正如您所发现的那样,编写自己的通用例程并不是一件简单的事情,因为Fortran希望在编译时知道(或可知)类似的选择器。您还将扩展您对Fortran的了解。

您还可以在内在模块IEEE_ARITHMETIC中找到感兴趣的功能。

答案 1 :(得分:1)

详细说明我的评论,这是一个python示例:

 fortrancode = """
       implicit none
       integer, parameter :: n=%i
       integer,parameter :: rp=selected_real_kind(n)      
       write(*,*)n,rp
       end
 """
 from subprocess import call
 for n in range(-1,33):
  f=open('test.f','w')
  f.write(fortrancode%(n))  ! <- n here gets string substituted
                            !for the '%i' in fortrancode
  f.close()
   ! optional check  call(['grep','n=','test.f'])
  call(['gfortran','test.f','-o','test.exe'])
  call(['./test.exe'])
  

python test.py

 -1 4
  0 4
  1 4
...
  7 8
...
 18 10
 19 -1
...
 32 -1

答案 2 :(得分:1)

george's answer类似,但在Fortran中。我们注意到种类本质上必须在编译时才能知道。为此,我们向编译器询问它可以为我们提供哪些类型,并为每个类型创建一小块代码进行编译。然后编译并运行它。 [这最后一步肯定因系统而异。]

! Rather than looping over a range with SELECTED_REAL_KIND, just see which
! real kinds are available to the compiler.  We can later match up real kinds
! for a requested precision with those here.
  use, intrinsic :: iso_fortran_env, only : real_kinds
  implicit none

  integer output
  integer i

  open(newunit=output, file='gosh.f90', action='write', position='rewind')

! Here we could instead do n=-1, 34 etc.
  do i=1, SIZE(real_kinds)
     write(output, 1) real_kinds(i)
  end do

  write(output, '("end")')
  close(output)

! A compile/execute line - do whatever is required.
  call execute_command_line('compile gosh.f90 && ./a.out')

1 FORMAT ("block",/,"real(",I0,") x",/,"include 'domystuffz'"/,"end block")

end

其中&#34; domystuffz&#34;是一个包含所需分析的文件。与High Performance Mark's answer一样,内在函数会很好,如果需要,include可以用一些简单的代码替换。