Фортран 90: Как использовать модуль в функции - PullRequest
0 голосов
/ 08 января 2011

Я пытаюсь написать программу на фортране, которая использует функции Грина для решения уравнения теплопроводности.Я использую фортран 90, а не 77, частично потому, что у меня сложилось впечатление, что это в значительной степени копия фортрана 77, но с добавлением нескольких очень полезных функций. Хотя основная причина заключается в кодировании в свободной форме.У меня есть некоторые «полезные» константы и переменные в модуле под названием «полезно».Я хочу включить эти переменные и константы в большинство моих программ, подпрограмм, функций и т. Д. Я просто изучаю фортран.Я программировал на Perl, C ++, Java, Matlab и Mathematica.Я нахожу это очень трудным.Я не понимаю разницы между программой и подпрограммой.Я определенно не имею четкого представления о том, что такое модуль.Последние 12 часов я потратил на изучение этих терминов, и мне еще предстоит получить четкие различия и определения.Я получаю ассортимент образцов, которые показывают, как объявлять эти вещи, но очень мало того, что фактически описывает, для чего они должны использоваться.

Я был бы очень признателен за объяснение того, почему моя функция, "х"не может "использовать" мой "полезный" модуль.

Кроме того, было бы очень полезно разъяснить ранее упомянутые функции Fortran.

module useful

  integer, parameter :: N=2
  double precision, parameter :: xmin=1, xmax=10, pi=3.1415926535898
  double complex :: green(N,N), solution(N), k=(2.0,0.0)

end module useful

program main

  use useful

  !real*8 :: delta = 2**-7
  do n1 = 1, N
    do n2 = 1, N
      green(n1,n2) = exp((0,1)*k*abs(x(n2)-x(n1)))/(4*pi*abs(x(n2)-x(n1)))
      print *, x(n2)
    end do 
  end do

end program main

function x(n1)

  use useful

  real :: n1, x
  x=n1*(xmax-xmin)/N

end function x

Ответы [ 3 ]

5 голосов
/ 08 января 2011

Давайте начнем с некоторых определений.

Программы на Фортране состоят из программных модулей.В так называемом Fortran 2008 (текущий стандарт) существует пять типов программных модулей:

  • основная программа;
  • внешняя подпрограмма;
  • модуль;
  • субмодуль;
  • блок программных данных блока.

Позвольте мне сосредоточить ваше внимание напервые три.

Основная программа
Как стандартная заявка, это

программный блок, который не является подпрограммой, модулем, субмодулем или программой данных блокаед.

Не очень полезное определение.=) Что вы должны знать, так это то, что основной программный модуль начинается с ключевого слова PROGRAM, это точка входа в приложение, и, очевидно, программа должна состоять ровно из одной основной программы.

Программа также может состоять из любого числа(включая ноль) других видов программных единиц.

Внешняя подпрограмма
Подпрограмма определяет процедуру.Существует два типа процедур и, конечно, два типа подпрограмм для их определения:

  • подпрограммы функций для определения функций;
  • подпрограммы подпрограмм для определения подпрограмм.

Подпрограмма функции - это подпрограмма, в качестве первого оператора которой используется оператор FUNCTION.Подпрограмма подпрограмма - это подпрограмма, в которой в качестве первого оператора используется оператор SUBROUTINE.

Кроме того, процедуры и подпрограммы различаются по месту своего появления в программе.Вы можете использовать:

  • внешние подпрограммы для определения внешних процедур;
  • внутренние подпрограммы для определения внутренних процедур;
  • подпрограммы модуля для определения процедур модуля.

внешняя подпрограмма
подпрограмма, которая не содержится в основной программе, модуле, субмодуле или другой подпрограмме

внутренняя подпрограмма
подпрограмма, которая содержится в основной программе или другой подпрограмме

подпрограмма модуля
подпрограмма, которая содержится в модуле или подпрограмме, но не является внутренней подпрограммой

Модуль
Это просто контейнер с определениями (определениями типов, процедурами и т. Д.).

Теперь небольшой пример.

main.f90

! Main program unit.
PROGRAM main

  USE foo

  IMPLICIT NONE

  CALL external_bar
  CALL internal_bar
  CALL module_bar

  CONTAINS

    ! Internal subprogram defines internal procedure.
    SUBROUTINE internal_bar
      PRINT *, "inside internal procedure"
    END SUBROUTINE internal_bar

END PROGRAM main

foo.f90

! Module program unit.
MODULE foo

  IMPLICIT NONE

  CONTAINS

    ! Module subprogram defines module procedure.
    SUBROUTINE module_bar
      PRINT *, "inside module procedure"
    END SUBROUTINE module_bar

END MODULE foo

bar.f90

! External subprogram program unit.
! External subprogram defines external procedure.
SUBROUTINE external_bar
  PRINT *, "inside external procedure"
END SUBROUTINE external_bar
1 голос
/ 08 января 2011

Модуль - это более высокий уровень организации, чем подпрограмма или функция.

Функция "x" должна быть полезной для использования модуля.Я думаю, что более вероятно, что программе «main» трудно правильно получить доступ к «x».Лучше было бы также поместить функцию «x» в модуль после оператора «Содержит».В этом случае удалите выражение «использовать полезное» из «х».Тогда основная программа будет иметь полное представление об интерфейсе ... в номенклатуре Fortran интерфейс является явным.Это гарантирует, что передача аргументов является последовательной.

Было бы полезно, если бы вы отображали сообщения об ошибках от компилятора.

Fortran 95/2003 - это намного больше, чем FORTRAN 77 с несколькими дополнительными полезными функциями.Изменения намного больше.Попытка выучить это из Интернета - не очень хорошая идея.Я предлагаю вам найти книгу Меткалфа, Рейда и Коэна "Объяснение Фортрана 95/2003".

0 голосов
/ 12 января 2011

Я вижу две проблемы в вашей программе.

  1. Основная подпрограмма не знает, что такое x (). Это реальная функция, целочисленная функция и т. Д.? Вы можете добавить следующее в свою основную программу реальный, внешний :: x Или (как предложили другие) переместите функцию X () в ваш модуль. Чтобы сделать это, добавьте оператор «Содержит» в конце модуля и Поместите функцию между «содержит» и «конечный модуль».

  2. У вас несоответствие аргумента. В основной программе N1 явно объявлен как реальная переменная. В функции X () N1 объявляется как вещественное. Вам нужно это исправить.

Я бы настоятельно рекомендовал добавить в основную программу операторы "implicit none", модуль и функции. Это заставит вас неявно вводить каждую переменную и функцию.

...