понедельник, 23 апреля 2012 г.

Особенности формата ввода/вывода в gfortran

Цель: Использовать выражения в дескрипторах преобразований <> в gfortran
Средства: gfortran

"Если в строке формата дескриптор преобразований использует целочисленную константу, то она может быть заменена заключенным в угловые скобки (< >) целочисленным выражением:"

integer :: m, k
k = 10
do m = 3, 5
  k = k*10 
  write(*, '(2x, i<m>)') k ! 100
  end do                         ! 1000
end                                ! 10000
О.В. Бартеньев, "Современный Фортран", стр. 294

Такой синтаксис позволяет создавать динамически корректируемый формат для ввода/вывода данных. Однако, компилятор gfortran для приведенного выше кода выдаст ошибку. Как же воспользоваться дескрипторами преобразований <> в gfortran?



Как написано в справочнике по gfortran-у (GFortran manuals): 

"6.2.3 Variable FORMAT expressions

A variable FORMAT expression is format statement which includes angle brackets enclosing a Fortran expression: FORMAT(I<N>). GNU Fortran does not support this legacy extension. The effect of variable format expressions can be reproduced by using the more powerful (and standard) combination of internal output and string formats."

В качестве замены конструкции i<N> предлагается воспользоваться символьной переменной, в которую будет записан необходимый формат. Например, так:

integer :: m, k
character(20) fmt1
k = 10
do m = 3, 5
  k = k*10 
  write(fmt1,*) m ! Записываем в символьную переменную fmt1 целое значение m без формата
!  write(*, '(2x, i<m>)') k ! 100 ! Запись для другого компилятора фортана. Например, CVF.
  write(*,'(i' // trim(fmt1) // ')') k ! Запись для gfortran. Функцией trim "обрезаем" лишние символы
end do                             ! 1000
end                                  ! 10000

Комментариев нет:

Отправить комментарий

Как перевести 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...