Function 如何使用数组在fortran中定义n变量函数
我实际上想解一个n变量的哈密尔顿方程组。在fortran中,为了定义函数,我们通常执行以下操作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
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
也是我当时的想法。你需要一段时间才能了解阵列功能、副作用等。你测试过这个吗?请参阅高性能马克的评论,其中有一个问题。已修复。我没有编译,只是背诵,因为我已经做了很多这种特殊的函数,但是我把数学部分和其他语言混合了起来。谢谢更改为可开箱即用编译的版本。