由非内在函数给出的常数值

时间:2016-01-14 05:17:40

标签: function fortran

在Fortran中,有没有办法在编译时使用除内部函数之外的其他常量函数初始化我的命名常量?

我想使用自己的函数计算一个值,然后使用此值来声明数组的大小,例如我在下面的尝试中。

integer function factorial(n)
    implicit none
    integer, intent(in) :: n
    integer :: i, ans
    ans=1
    do i=1,n
        ans=ans*i
    end do
    factorial = ans
end function Factorial

integer function binomial(n,k)
    implicit none
    integer, intent(in) :: n, k
    integer :: factorial
    binomial = Factorial(n)/factorial(n-k)/factorial(k)
end function binomial

program main
    implicit none
    integer, parameter :: m=10, n=3
    integer :: binomial
    integer, parameter :: sz=binomial(m,n)
    complex, dimension(sz) :: hamiltonian
    ...
end program main

或者我是否必须自己计算这个值并在代码中明确写出来?

1 个答案:

答案 0 :(得分:3)

正如您所知,Fortran标准禁止在编译时计算超出内部例程的能力。如果你真的必须在编译时进行这些计算,那么像这样的黑客可能会吸引你:

  INTEGER, DIMENSION(20), PARAMETER :: ints = [1,2,3,4,5,6,7,8,9,10, &
       11,12,13,14,15,16,17,18,19,20]
  INTEGER, PARAMETER :: m=10, n=3
  INTEGER, PARAMETER :: sz = PRODUCT(ints(1:m))/PRODUCT(ints(1:m-n))/&
       PRODUCT(ints(1:n))
  COMPLEX, DIMENSION(sz) :: hamiltonian

这正确地编译和执行。如果你将自己局限于64位整数,则数组ints不需要大于20。

哦,顺便说一句,不要使用size作为参数的名称,它已经是一个有用的内在函数的名称。

然后,您可以自己计算因子并写下:

  INTEGER, DIMENSION(20), PARAMETER :: factorial = [1,2,6,24,...]
  INTEGER, PARAMETER :: m=10, n=3
  INTEGER, PARAMETER :: sz = factorial(m)/factorial(m-n)/factorial(n)
  COMPLEX, DIMENSION(sz) :: hamiltonian

并完成它。