Что означает "%" в Фортране?

Я пытаюсь прочитать некоторый код Fortran, но не могу определить, что делает % (знак процента).

Он находится в строке, подобной:

   x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))

Что он делает?

Ответ 1

В Fortran 90 они позволяют создавать такие структуры, как на С++. Он в основном действует как оператор точки (.).

Из http://www.lahey.com/lookat90.htm:

Структуры (производные типы)

Вы можете группировать свои данные с использованием производных типов. Это позволяет пользователям объединять внутренние типы (включая массивы и указатели) в новые типы, к которым можно получить доступ к отдельным компонентам, используя знак процента в качестве разделителя. (Производные типы известны как записи в VAX Fortran.) ! Пример использования производных типов и модулей.

module pipedef
   type pipe                          ! Define new type 'pipe', which
     real diameter                    ! is made up of two reals, an
     real flowrate                    ! integer, and a character.
     integer length
     character(len=10) :: flowtype
   end type pipe
end module pipedef

program main
   use pipedef                ! Associate module pipedef with main.
   type(pipe) water1, gas1    ! Declare two variables of type 'pipe'.
   water1 = pipe(4.5,44.8,1200,"turbulent") ! Assign value to water1.
   gas1%diameter = 14.9                     ! Assign value to parts
   gas1%flowrate = 91.284                   ! of gas1.
   gas1%length = 2550
   gas1%flowtype = 'laminar'
   .
   .
   .
end program

Ответ 3

%, поскольку токен имеет ряд тесно связанных целей. По мере развития Fortran эти виды использования увеличились в расчете.

Возвращаясь к Fortran 90, и использование, рассматриваемое в вопросе, % используется для доступа к компонентам производного типа. Рассмотрим производный тип a_t с объектом a этого типа:

type a_t
  real rho, sigma
end type
type(a_t) a

К элементам rho и sigma of a можно получить доступ с помощью a%rho и a%sigma. Как можно видеть в вопросе, эти компоненты могут использоваться в выражениях (например, a%rho * g), или они могут быть левой частью назначения (a%rho=1.).

Компонент производного типа сам по себе может быть объектом производного типа:

type b_t
  type(a_t) a
end type
type(b_t) b

и поэтому может быть несколько проявлений % в одной ссылке:

b%a%rho = ...

Здесь компонент rho объекта производного типа a, который сам является компонентом b, является целью назначения. В одной ссылке можно увидеть довольно ужасающее количество %, но ссылки на части всегда разрешаются слева направо.

Приступая к Fortran 2003, вы затем видите %, относящуюся к производным типам несколькими способами:

  • ссылка на привязку объекта;
  • запрос параметров параметризованного типа.

Рассмотрим производный тип

type a_t(n)
  integer, len :: n=1
  real x(n)
 contains
  procedure f
end type
type(a_t(2)) a

Объект a имеет параметр одиночного типа длины и процедуру привязки типа. В выражении типа

x = a%f()

связывается f объекта производного типа.

Параметр n of a может быть указан как

print *, a%n, SIZE(a%x)

так как можно ссылаться на компонент x.

Наконец, из Fortran 2008 % может использоваться для доступа к реальной и мнимой части сложного объекта:

complex x, y(3)
x%im = 1.
x%re = 0.
y = (2., 1.)
print *, y(2)%im+y(3)%re