Что означает " % " / do в Fortran?

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

это в строку:

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

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

3 ответов


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

от 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

это идентификатор детали для производного типа. Проверить это. http://www.lahey.com/lookat90.htm


% как токен имеет ряд тесно связанных применений. По мере того как 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, является объектом назначение. Можно увидеть довольно ужасающий счет %s в одной ссылке, но ссылки на детали всегда разрешаются слева направо.

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

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

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

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

объект a имеет один параметр типа length и процедуру с привязкой к типу. В выражении типа

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