Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何使用数组在fortran中定义n变量函数_Function_Variables_Fortran_User Defined Functions - Fatal编程技术网

Function 如何使用数组在fortran中定义n变量函数

Function 如何使用数组在fortran中定义n变量函数,function,variables,fortran,user-defined-functions,Function,Variables,Fortran,User Defined Functions,我实际上想解一个n变量的哈密尔顿方程组。在fortran中,为了定义函数,我们通常执行以下操作 function H(x,p) result(s) real::x,p,s s=x**2+p**2 end function H 现在,如果我想解一个n变量的哈密尔顿方程,我需要定义一个n变量H(x(I),p(I)),其中我从1到n。假设p(i)是变量,H是p(i)^2,在i上从1到n求和 使用数组作为输入定义函数的可能方式有哪些?不可能每次手动写入H(x1,x2…x100…) module aa

我实际上想解一个n变量的哈密尔顿方程组。在fortran中,为了定义函数,我们通常执行以下操作

function H(x,p) result(s)
real::x,p,s
s=x**2+p**2
end function H
现在,如果我想解一个n变量的哈密尔顿方程,我需要定义一个n变量H(x(I),p(I)),其中我从1到n。假设p(i)是变量,H是p(i)^2,在i上从1到n求和

使用数组作为输入定义函数的可能方式有哪些?不可能每次手动写入H(x1,x2…x100…)

module aa
  implicit none

  public :: H

contains
  function H(x,p) result(s)
    real, dimension(:), intent(in) :: x,p
    real, dimension(:), allocatable :: s
    integer :: i, n

    n = size(x, 1)
    allocate(s(n))

    do i=1, n
       s(i) = x(i)**2 + p(i)**2
    enddo
  end function H
end module aa

program test
  use aa

  real, dimension(10) :: x, p
  real, dimension(:), allocatable :: s
  integer :: n

  x(:) = 1.
  p(:) = 1.

  n = size(x, 1)
  allocate(s(n))
  s(:) = 0.

  s = H(x,p)

  print*, s
end program test
使用GNU Fortran(Ubuntu 7.4.0-1ubuntu1~18.04.1)7.4.0编译并测试

这不是一个真实的程序示例,因为如果您知道
x
p
的维度,那么您也知道
s
的维度,因此您可以定义它而不是分配。但是,一旦模块中没有任何维度的引用,它就可以用来泛化模块


要使其起作用,您会注意到,
s
必须是可分配的,并且必须在调用函数之前已分配。

非常快,只需编写
real,dimension(:)::x,p,s
您能给出一个明确的示例吗?在fortran中,要定义函数,我们通常会执行以下操作。。。。s=x^2+p^2没有我们没有的那些有趣的小帽子符号。@kvantour也许
elemental
会是一个更好的选择?但是很难说。@HighPerformanceMark如果
H(x,p)
真的那么简单,
elemental
也是我当时的想法。你需要一段时间才能了解阵列功能、副作用等。你测试过这个吗?请参阅高性能马克的评论,其中有一个问题。已修复。我没有编译,只是背诵,因为我已经做了很多这种特殊的函数,但是我把数学部分和其他语言混合了起来。谢谢更改为可开箱即用编译的版本。