Содержание

Fortran-файлы типа Unformatted

Файлы типа Unformatted создаются программами и программными модулями, написанными на языке Fortran. Эти файлы являются бинарными (двоичными) и при этом имеют особую внутреннюю структуру, которая не позволяет считывать и записывать файлы такого типа напрямую (без учета этой структуры) из программ, написанных на других языках (например, C++).

В расчетном ядре и библиотеках пре- и постпроцессинга системы ФРУНД, написанных на языке Fortran, используется ряд файлов типа Unformatted:

Структура файлов типа Unformatted

Файлы типа Unformatted отличаются от обычных бинарных файлов наличием определенной внутренней структуры. Содержимое таких файлов разделено на ряд последовательных блоков. Один блок — это набор данных, образующийся в Unformatted-файле при вызове очередной функции записи. При чтении содержимое Unformatted-файла также считывается целыми блоками (даже если функция чтения пытается считать меньший объем данных, чем тот, который содержится в считываемом блоке).

Структура Unformatted-файлов GNU Fortran (GFortran)

В следующей таблице приведена структура Unformatted-файла формата GFortran.

Раздел Описание Тип Длина, байт Значение
Список
блоков
Блок 1 Начальный символ
блока
Открывающий символ блока Число 4 4+L_1+4=L_1+8 1<=L_1<=2*10^91)
Содержимое
блока
Данные, хранящиеся в блоке Массив
байт
L_1
Конечный символ
блока
Завершающий символ блока Число 4 1<=L_1<=2*10^9
Блок 2 Начальный символ
блока
4 L_2+8 L_2
Содержимое
блока
L_2
Конечный символ
блока
4 L_2
Блок n Начальный символ
блока
4 L_n+8 L_n
Содержимое
блока
L_n
Конечный символ
блока
4 L_n

Таким образом, длина Unformatted-файла формата GFortran равна:
L_{GNU}=sum{i=1}{n}{(L_i+8)}=sum{i=1}{n}{L_i}+8n,
где

Структура Unformatted-файлов Intel Fortran / Fortran PowerStation

Unformatted-файлы, создаваемые программами или программными модулями, скомпилированными с помощью компиляторов Microsoft Fortran PowerStation или Intel Fortran (с опцией Use PowerStation I/O Format, выставленной в Yes; соответствующий ключ компилятора — /fpscomp:ioformat), отличаются чуть более сложной структурой. В таких файлах содержимое каждого блока разбивается на ряд частей. Каждая часть содержит не более 128 байт данных.

В следующей таблице приведена структура Unformatted-файла формата PowerStation.

Раздел Описание Тип Длина, байт Значение
Начальный символ Открывающий символ файла Символ 1 K
(код2) 4B)
Список
блоков
Блок 1 Полная часть 1 Начальный символ
полной части
Открывающий символ полной части Символ 1 1+128+1=130 130m_1+l_1+2 код 81
Содержимое
полной части
Данные, хранящиеся в полной части Массив
байт
128
Конечный символ
полной части
Завершающий символ полной части Символ 1 код 81
Полная часть 2 130
Полная часть m_1 130
Неполная часть
(заключительная)
Начальный символ
неполной части
Открывающий символ неполной части Число 1 1+l_1+1=l_1+2 1<=l_1<=128
Содержимое
неполной части
Данные, хранящиеся в неполной части Массив
байт
l_1
Конечный символ
неполной части
Завершающий символ неполной части Число 1 1<=l_1<=128
Блок 2 Полная часть 1 130 130m_2+l_2+2
Полная часть 2 130
Полная часть m_2 130
Неполная часть
(заключительная)
l_2+2
Блок n Полная часть 1 130 130m_n+l_n+2
Полная часть 2 130
Полная часть m_n 130
Неполная часть
(заключительная)
l_n+2
Конечный символ Закрывающий символ файла Символ 1 ,
(код 82)

Таким образом, длина Unformatted-файла формата PowerStation равна:
L_{PS}=1+sum{i=1}{n}{(130m_i+l_i+2)}+1=130sum{i=1}{n}{m_i}+sum{i=1}{n}{l_i}+2(n+1),
где

Работа с файлами типа Unformatted в языке Fortran

С точки зрения программиста, пишущего программный код на языке Fortran, работа с файлами типа Unformatted практически ничем не отличается от работы с другими типами файлов (например, текстовыми).

Функции по работе с файлами языка Fortran обеспечивают поддержку блочной структуры Unformatted-файлов. Корректная обработка особенностей, связанных с блоками, в программах, написанных на языках, отличных от языка Fortran (например, на языке C++), ложится на плечи программиста.

Открытие и закрытие

Открытие

Открытие Unformatted-файла производится с помощью функции OPEN:

Здесь

Примечание.

При открытии для записи в Unformatted-файл формата PowerStation записывается открывающий символ.

Закрытие

Закрытие Unformatted-файла производится с помощью функции CLOSE:

 CLOSE(<Файловый идентификатор>) 

Примечание.

При закрытии записываемого Unformatted-файла формата PowerStation в него записывается закрывающий символ.

Запись и чтение

Запись

Запись очередной порции данных в файл типа Unformatted производится с помощью функции WRITE:

Примечания.

Чтение

Чтение данных из Unformatted-файла производится с помощью функции READ:

Примечания.

Вспомогательные процедуры навигации

При чтении файла типа Unformatted можно использовать ряд функций, облегчающих навигацию по такому файлу. Они обеспечивают передвижение позиции курсора чтения с учетом блочной структуры файла типа Unformatted.

Возврат к началу файла

Возврат началу файла производится с помощью функции REWIND:

 REWIND(<Файловый идентификатор>) 

Примечание.

При возврате к началу файла курсор чтения устанавливается на начало первого блока.

Возврат к началу предыдущего блока

Возврат началу предыдущего блока (т.е. перемещение курсора чтения к началу предыдущего блока) производится с помощью функции BACKSPACE:

 BACKSPACE(<Файловый идентификатор>) 

Замечания по конвертации Unformatted-файлов

Существующие средства просмотра файлов с графиками (*.bnf) величин, выбранных для замера при анализе, предполагают, что эти Unformatted-файлы имеют формат PowerStation. Таким образом, GFortran-версии библиотек ядра (прежде всего, libfviv.dll) формируют файлы с графиками неверного формата. Поэтому после этапа анализа и генерации файлов с графиками требуется конвертация их в формат PowerStation.

1) Точное значение максимальной длины блока неизвестно, в таблице приведено ориентировочное значение. Оценку сверху для нее можно получить, исходя из максимальной емкости 4-байтового целого числа со знаком. Она равна 2 147 483 647.
2) Под кодом здесь понимается битовое представление соответствующего символа, записанное в 16-ричной системе счисления.