Как определить переменную функцию в Фортран, используя массив - PullRequest
1 голос
/ 19 января 2020

Я на самом деле хочу решить n уравнений переменной Гамильтона. В Фортране, чтобы определить функцию, мы, как правило, делаем следующее:

function H(x,p) result(s)
real::x,p,s
s=x**2+p**2
end function H

Теперь, если я буду sh, чтобы решить уравнение Гамильтона с n переменными, мне нужно определить переменную n H (x (i), p (i)) где i работает от 1 до n. Предположим, что p (i) - переменные, а H - это p (i) ^ 2, сумма которых i от 1 до n.

Каковы возможные способы определения функции с массивом в качестве входных данных? Невозможно каждый раз писать H (x1, x2 .... x100 ...) вручную.

1 Ответ

2 голосов
/ 19 января 2020
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 должно быть allocatable и должно иметь было выделено перед вызовом функции.

...