【问题标题】:How to define a n variable function in fortran using array如何使用数组在fortran中定义n变量函数
【发布时间】:2020-01-19 09:16:21
【问题描述】:

我实际上想求解一个 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)),其中 i 从 1 运行到 n。假设 p(i) 是变量,H 是 p(i)^2,对 i 从 1 到 n 求和。

用数组作为输入定义函数的可能方法是什么?不可能每次都手动写 H(x1,x2....x100...)。

【问题讨论】:

  • 很快,写real, dimension(:) :: x,p,s
  • 你能举一个明确的例子吗?
  • 在fortran中,要定义一个函数,我们一般做如下操作。 .... s=x^2+p^2不是那些我们没有的有趣的小帽子符号。
  • @kvantour 也许elemental 会是更好的选择?但这很难说。
  • @HighPerformanceMark 如果H(x,p) 真的那么简单,那么elemental 也是我的直接想法。花费一些时间来理解数组函数、副作用等。

标签: function variables fortran user-defined-functions


【解决方案1】:
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 编译和测试

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

为此,您会注意到s 必须是可分配的,并且必须在调用函数之前分配。

【讨论】:

  • 你测试过这个吗?请参阅高性能标记对问题的评论。
  • 已修复。我还没有编译,是用心写的,因为我已经做了很多这种特定的功能,但是我将数学部分与其他语言混合在一起。谢谢!
  • 更改为可以开箱即用编译的版本。
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多