Свободно распространяемый компилятор gfortran (http://ru.wikipedia.org/wiki/GFortran или http://www.gfortran.org/) имеет ряд "проблем" с функциями, которые спокойно работают в других компиляторах фортрана.
Одной из таких проблем является отсутствие возможности чтения до конца файла (EOF) в цикле условия (do while) в таком виде:
integer :: unit
real :: stud4
unit = 10
do while(.not. eof(unit)) ! Обработка данных файла
read(unit) stud4
***
end do
Как же заменить эту функцию в gfortran? Как один из вариантов - написать небольшую подпрограмму чтения файла до конца (до EOF), которая вычислит число строк в файле, и затем вернёт это целое значение n пользователю. Тогда вместо цикла "do while - enddo" ставим цикл "do i =1,n - enddo". Примером реализации такого алгоритма может служить такой вариант:
SUBROUTINE READ_EOF(n,nstrok)
INTEGER, INTENT(in) ::n ! Даётся явное описание входящих в подпрограмму параметров
INTEGER, INTENT(out) :: nstrok ! "-" исходящих из подпрограммы параметров
INTEGER :: nstrok_counter
CHARACTER(1) :: a
ioer=0
nstrok_counter=0
DO WHILE (ioer.eq. 0)
READ(n,*,iostat=ioer) a
nstrok_counter=nstrok_counter + 1
ENDDO
REWIND(n)
nstrok=nstrok_counter-1
RETURN
END
В подпрограмму передаётся номер канала n файла, который надо прочесть до конца (до EOF), и подпрограмма возвращает число строк, содержащихся в файле.
Показаны сообщения с ярлыком F Tricks. Показать все сообщения
Показаны сообщения с ярлыком F Tricks. Показать все сообщения
воскресенье, 10 апреля 2011 г.
четверг, 7 апреля 2011 г.
Время работы программы
Задача: узнать сколько точно требуется времени для выполнения программы
Решение: подпрограмма CPU_TIME
Иногда полезно знать сколько времени занимает выполнение всех операторов в программе. Для этого (и не только, конечно) в фортране есть встроенная подпрограмма CPU_TIME.
"Подпрограмма CPU_TIME(time) возвращает процессорное время time, тип которого - REAL(4). Единицы измерения времени - секунды; после десятичной точки time содержит две значащих цифры."
real(4) :: start_time, finish_time
call cpu_time(start_time)
<Вычисления>
call cpu_time(finish_time)
print *, 'Время вычислений = ', finish_time - start_time
end
Решение: подпрограмма CPU_TIME
Иногда полезно знать сколько времени занимает выполнение всех операторов в программе. Для этого (и не только, конечно) в фортране есть встроенная подпрограмма CPU_TIME.
"Подпрограмма CPU_TIME(time) возвращает процессорное время time, тип которого - REAL(4). Единицы измерения времени - секунды; после десятичной точки time содержит две значащих цифры."
О. В. Бартеньев, Современный ФОРТРАН, стр.202
Размещаем вызов подпрограммы в начале программы после блока неисполняемых операторов (блока объявления переменных) и в конце, перед end. Печатаем на экран (или в файл) разницу результатов вызовов подпрограмм, используя разные переменны. В коде выглядит примерно так:real(4) :: start_time, finish_time
call cpu_time(start_time)
<Вычисления>
call cpu_time(finish_time)
print *, 'Время вычислений = ', finish_time - start_time
end
О. В. Бартеньев, Современный ФОРТРАН, стр.202
среда, 6 апреля 2011 г.
Integer to character - Character to integer fortran
Задача: превратить переменную типа integer (целое число) в переменную типа character (символьного типа) и наоборот
Решение: символьные переменные как внутренние файлы
Допустим, мы подсчитали число случаев попадания наших данных в некий диапазон значений. Мы хотим отразить эту информацию в названии выходного (пост-обработки) файла. Значит необходимо преобразовать тип целых в символьный тип, ведь в названии файлов могут присутствовать только символьные переменные.
Чтобы решить такую задачу нужно воспользоваться символьными переменными как внутренними файлами, т.е. произвести запись не по канала файла (unit), а напрямую в символьную переменную по формату целого типа. В коде это выглядит примерно так:
Чтобы произвести обратное преобразование (из character в integer), нужно воспользоваться другой схемой:
CHARACTER(3) :: string ! Исходный символ - он нам известен
Решение: символьные переменные как внутренние файлы
Допустим, мы подсчитали число случаев попадания наших данных в некий диапазон значений. Мы хотим отразить эту информацию в названии выходного (пост-обработки) файла. Значит необходимо преобразовать тип целых в символьный тип, ведь в названии файлов могут присутствовать только символьные переменные.
Чтобы решить такую задачу нужно воспользоваться символьными переменными как внутренними файлами, т.е. произвести запись не по канала файла (unit), а напрямую в символьную переменную по формату целого типа. В коде это выглядит примерно так:
INTEGER :: data ! Исходное значение - оно нам известно
CHARACTER(3) :: string ! Символьная переменная - то, что хотим получить
WRITE (string, '(I3)' ) data ! Операция записи целого по формату в символьную переменную
CHARACTER(3) :: string ! Символьная переменная - то, что хотим получить
WRITE (string, '(I3)' ) data ! Операция записи целого по формату в символьную переменную
Чтобы произвести обратное преобразование (из character в integer), нужно воспользоваться другой схемой:
CHARACTER(3) :: string ! Исходный символ - он нам известен
INTEGER :: data ! Переменная целого типа - то, что хотим получить
READ (string, '(I3)' ) data ! Операция чтения символьной переменной по формату в целое
"Используя оператор WRITE, в строку можно передать данные любых типов. И наоборот, оператором READ из строки можно считать, например, числовые данные (если в строке есть числовые поля данных). Часто при помощи оператора WRITE числовые данные преобразовываются в символьные, например число 123 в строку '123', а также формируются
строки, состоящие из смеси числовых и символьных данных."
строки, состоящие из смеси числовых и символьных данных."
О. В. Бартеньев, Современный ФОРТРАН, стр.72
Подписаться на:
Сообщения (Atom)
Как перевести 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...
-
Цель: Есть файл в формате netCDF. Хочется получить карту какой-либо гидрометеорологической величины за какой-нибудь временной срез в Window...
-
Задача: Поставить компилятор fortran-а на компьютер/ноутбук с операционной системой Windows7 (на 64 разрядную) Методы решения: Geany, CVF...
-
Цель: Освоить новые возможности GrADS для анализа гидрометеорологической информации Средства: GrADS Рассмотрим GRIB-файл "model...