среда, 29 июня 2011 г.

Использование модулей (module) в фортране. Введение

Задача: научиться использовать модули в Фортране
Методы решения: module

N.B. Модули в фортране появились с выходом стандарта Fortran 90. Таким образом, для их использования необходим компилятор фортрана поддерживающий этот стандарт.

Модуль используется для задания глобальных данных и модульных процедур. Он имеет вид:

MODULE имя модуля
    [раздел описаний]
[CONTAINS
    модульные процедуры]
END [MODULE [имя модуля]]

Пример:

module one
integer z
end module

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

Следующие за оператором CONTAINS модульные процедуры должны завершаться END SUBROUTINE [имя подпрограммы] или END FUNCTION [имя функции]. Модульные процедуры, в свою очередь, после оператора CONTAINS могут содержать внутренние процедуры. Имя модуля, если оно следует за END MODULE, должно совпадать с именем в заголовке модуля.

Доступ к модулю в программной единице осуществляется посредством оператора USE, который предваряет раздел объявлений программной единицы. Объявленные в операторах описания модуля имена доступны:

• в модульных процедурах;
• во внутренних процедурах модуля;
• в использующих модуль программных единицах (если имена не объявлены PRIVATE).

Модульные процедуры доступны:
• в других модульных процедурах модуля;
• в использующей модуль программной единице (если они не объявлены PRIVATE).
 Объявленные в раздел описаний модуля переменные и модульные
процедур, не защищенные атрибутом PRIVATE, называются глобальными
объектами модуля.
На модуль, используя оператор USE, можно сослаться:
• в главной программе;
• во внешней процедуре;
• в другом модуле.
При ссылке на модуль в другом модуле следует следить, чтобы модуль
не ссылался сам на себя ни прямо, ни косвенно через другие модули.

(О. В. Бартеньев. Современный ФОРТРАН, стр. 223)

Таким образом, модуль есть уникальная именованная программная единица, в котором могут содержаться как выполняемые, так и не выполняемые операторы (каждый в своём разделе соответственно). Среди не выполняемых операторов можно задавать  операторы описания переменных, присваивать им значения. Причём эти переменные будут глобальными, т.е. любая другая программная единица (основная программа, подпрограмма или модуль), где с помощью оператора USE происходит вызов этого модуля,  будет "видеть" и "знать" описания и значения описанных в модуле переменных.

N.B. Описание модуля как программной единицы должно быть проведено ранее, чем модуль будет вызван с помощью USE в основной программе!!!

Покажем на примере использование module:

      module one
          integer :: z = 10
      end module
 
     PROGRAM SUBTEST
           use one   ! Вызываем модуль, где задано значение z
           print*, 'PROGRAM z : ', z ! Выводим на экран заданное в модуле значение z
           CALL NEW  ! Вызываем подпрограмму, в которой z не определено
           print*, 'SUBROUTINE z : ', z ! Выводим преобразованное в подпрограмме значение z
      END PROGRAM

      SUBROUTINE NEW
      use one ! Вызываем модуль, где задано значение z
         integer x,y
          x = 2
          y = 5
          z = z + x + y
      END


В результате у нас получится следующее:

PROGRAM z : 10
SUBROUTINE z :  17

Стоит отметить, что ни в основной, ни в подпрограмме переменная z явно не описана.

Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?

 Всё просто.  def uv2dir(u, v):     '''     Источник:     https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calc...