![]() |
|
![]() ![]() ![]() |
|
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Существуют какие-либо макросы?
|
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
А что такое "файл Fortran binary"?
|
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Может файл данных записанный из Фортран-программы c FORM = UNFORMATED или BINARY переписать в текстовый?
|
|||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Да. Какая программа для этого нужна? |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
ertttttt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.8.2010 Репутация: нет Всего: нет |
Фантом,
Программу написали. При чтении методом open не читает неформатированный файл. Не понятно как сконвертировать файл Fortran binary в ASCII текст. Как это можно сделать?
Это сообщение отредактировал(а) kemiisto - 31.8.2010, 11:34 |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: нет Всего: 160 |
ertttttt, а можно примерчик файла. Расширение у него до боли знакомое...
А с чего вообще взяли, что это
? -------------------- |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
Так ведь какой-то формат для чтения нужен, обойтись чтением под управлением списка в данном случае нельзя. Вам нужно знать формат, в котором эти данные записаны, в противном случае их можно интерпретировать как угодно (и в самом файле эта информация не содержится). |
|||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Файл прикрепил. Это файл линий тока в программе Schlumberger Eclipse. В мануале про него написано, что его можно перевести в ASCII text в Compact Visual Fortran методом open: Programmers using Compaq Visual Fortran, who wish to read 98A and later PC binary files will need to use CONVERT=’BIG_ENDIAN’ when they open an unformatted file, for example.: OPEN(UNIT=IUNIT,FILE=ZFILE,FORM=’UNFORMATTED’,CONVERT=’BIG_ENDIAN’) ... Output files may be formatted (ASCII text) or unformatted (Fortran binary). Это сообщение отредактировал(а) Mormishka - 31.8.2010, 15:39 Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: нет Всего: 160 |
Когда читаем из/пишем в unformatted файл, то, естественно, ни о каких форматах чтения/записи речи идти не может. А у Вас READ(12, *). А * эта, между прочим, специфицирует формат ввода/вывода. Фантом писал об этом.
Ну и (опять таки Фантом писал об этом), нужно знать что и в какой последовательности писалось в файл, чтобы считать. Это сообщение отредактировал(а) kemiisto - 31.8.2010, 16:20 -------------------- |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Наверное в мануале написано, в каком виде они там записывались - в виде массива конкретной формы (и типа) или в цикле отдельными записями, состоящими из строк массива и/или отдельных чисел определенных типов? Скорее всего второе, но, как уже отмечалось, нужно знать чего (т.е. какого типа и параметра разновидности ) и сколько чисел в записи - ведь один и тот же набор двоичой информации по-разному интерпретируется для разных типов. |
|||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
FCM,
Наверное вы это имеете ввиду? Output files are written in a general format which consists of data arrays, each headed by a data descriptor record. The header record consists of: • An 8-character keyword which identifies the data in the block. Valid keywords are described in the following chapters. Where appropriate, the keyword may be a property, region or solution name. Use of names containing embedded blanks is not recommended. • A 4-byte integer defining the number of elements in the block. • A 4-character keyword defining the type of data in the block. Possible types are: INTE standard (4 byte) integers REAL single precision (4 byte) floating point reals LOGI standard (4 byte) logicals DOUB double precision (8 byte) floating point reals CHAR characters (handled as 8-character words) C0nn CHARACTER*nn strings (e.g. C065 for 65-character strings) If the file is unformatted, the three header items are read as a single physical record. If the file is formatted, the following Fortran format is used: (1X, 1X, A8, 1X, 1X, I11, 1X, 1X, A4) In ECLIPSE formatted output files, the character strings are surrounded by single quotes for readability. The data contents follow the descriptor (starting on a new record). Numerical arrays are divided into blocks of up to 1000 items each. Character data are divided blocks of up to 105 8-character words each. For unformatted files, the physical record size is the same as the block size. Formatted files consist of 80-character physical records, read using the following Fortran formats: Integer 6(1X, I11) Real 4(1X, E16.8) Logical 25(1X, L2) Double Precision 3(1X, D22.14) Character 7(1X, 1X, A8, 1X) Character*nn (1X, 1X, Ann, 1X), repeated if possible within 80 characters In ECLIPSE formatted output files, the 8-character words are surrounded by single quotes for readability. Note that multidimensional arrays are ordered according to the Fortran convention, with the left-hand index increasing fastest. For example, in a full array of cell values for a grid with dimensions NX*NY*NZ, the position of cell (IX,IY,IZ) would be given by: ICELL = (IZ-1)*NX*NY + (IY-1)*NX + IX |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Навскидку, сделаем черновой прогон
В результате получим вывод (проверьте!) INTEHEAD 10 INTE ... GEOMETRY 26460 DOUB .... GEOMINDX 238 INTE ... ID_BEG 237 INTE ... ID_END 237 INTE ... ID_CELL 8583 INTE ... TIME_BEG 8820 DOUB ... SWAT 8583 DOUB ... Т.е. в чистовом прогоне нужно последовательно считывать chname,num,chtype (как единую запись) и следующие за ними массивы из num -чисел chtype-типа (скорее всего как единую запись). |
|||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Попробую. Вот образец другого файла в мануале в ASCII text
INTEHEAD 10 INTE 2 1 3 1 20 10 1997 23 50 41 GEOMETRY 42 DOUB 25. 24. 2000. 20. 23. 2000. 13. 20. 2000. 10. 17. 2000. 8. 14. 2000. 6. 10. 2000. 5. 5. 2000. 25. 24. 2000. 22. 20. 2000. 20. 15. 2000. 15. 10. 2000. 14. 9. 2000. 10. 7. 2000. 5. 5. 2000. GEOMINDX 3 INTE 1 22 43 ID_BEG 2 INTE 2 2 ID_END 2 INTE 1 1 ID_CELL 12 INTE 9 8 5 4 4 1 9 6 5 2 2 1 TIME_BEG 14 DOUB 4.2333 7.33 18.84 24.7 29.13 34.25 41. 4. 7. 17.84 20.7 23.3300 31.05 40. SWAT 12 DOUB 0.75 0.575 0.5 0.4 0.225 0.05 0.5 0.575 0.4 0.3 0.225 0.35 GEOMETRY 15 DOUB 30. 5. 2000. 20. 4. 2000. 26. 3. 2000. 10. 2. 2000. 5. 5. 2000. GEOMINDX 2 INTE 1 16 ID_BEG 1 INTE 3 ID_END 1 INTE 1 ID_CELL 4 INTE 3 2 2 1 TIME_BEG 5 DOUB 4.2333 7.3300 18.8400 24.7000 29.1300 SWAT 4 DOUB 0.7500 0.5750 0.5000 0.4000 |
|||
|
||||
ertttttt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.8.2010 Репутация: нет Всего: нет |
Первые три числа прочитал. Дальше не хочет читать. Здесь другой файл этого же типа. Я поменял название на «x.s». Для меня пока важно вывести на экран, что идет после ключевого слова GEOMETRY. В данном файле после GEOMETRY идет число 162, т.е. всего 162 числа должно быть.
program Convert implicit none integer i real(8) ::r1 real(8) ::r2 real(8) ::r3 character(8) :: chname integer(4) :: num character(4) :: chtype open(unit=777, file='x.s', form='unformatted',convert='big_endian', action='read') do read (777) chname, num, chtype write(*,*) chname, num, chtype if (chname=='GEOMETRY') then do i=1,num read (777) r1,r2,r3 write(*,*) r1,' ',r2,' ' ,r3,' ',i, ' ' ,num enddo end if enddo end program Convert На экране: INTEHEAD 10 INTE ☻ ☺ 3 ♥ GEOMETRY 162 DOUB 450.000000000000 450.000000000000 2025.00000000000 1 162 forrtl: severe (67): input statement requires too much data, unit 777, file C:\P rogram Files\Microsoft Visual Studio\MyProjects\Proect\Debug\x.s |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Я тут прикинул одну програмку (в gfortran) - первый массив считывается корректно, а потом некорректно.
По-видимому неверно считывается число элементов в массиве. Надо еще подумать. Может "местные жители" что подскажут.
В Visual Fortran цикл можно записать как DO WHILE( EOF(11) ) при iflag не равном нулю, получаем INTEHEAD 10 INTE 2 1 3 6 30 12 2005 0 0 0 GEOMETRY 26460 DOUB - далее некорректно (fortran run time error - end of record ) Видимо число 26460 не соответствует реальности (хотя размер файла достаточен для такого массива) или, скорее всего, программа пока не соответствует ![]() PS/ при iflag = 0 INTEHEAD 10 INTE ... GEOMETRY 26460 DOUB ... GEOMINDX 238 INTE ... ID_BEG 237 INTE ... ID_END 237 INTE ... ID_CELL 8583 INTE ... TIME_BEG 8820 DOUB ... SWAT 8583 DOUB ... далее fortran run time error - end of file Это сообщение отредактировал(а) FCM - 2.9.2010, 08:56 |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Кажется нашел - в доках написано, что массивы разбиваются на блоки (записи?) по 1000 элементов (Numerical arrays are divided into blocks of up to 1000 items each.).
Подправил - проверьте (no warranty - до конца не уверен, надо ли неполную тысячу рассматривать как неполную (что реализовано ниже) или, все-таки, надо как полную)
Это сообщение отредактировал(а) FCM - 2.9.2010, 11:26 |
|||
|
||||
ertttttt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.8.2010 Репутация: нет Всего: нет |
FCM,
Огромная благодарность! С кодом буду разбираться. Работает. Только в конце оборвался. Пишет severe (24): end-of-file during read, unit 11, |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Так и должно быть - это недостаток приведенной программы.
Если пользуешься Visual Fortran, попробуй в самом внешнем цикле вместо DO записать DO WHILE (.NOT.EOF(11)) Это сообщение отредактировал(а) FCM - 4.9.2010, 15:07 |
|||
|
||||
ertttttt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.8.2010 Репутация: нет Всего: нет |
Какой тип данных использовать для имени файла? Как сделать, чтоб можно вводить имя файла?
WRITE(*,*) 'ENTER FILENAME' READ(*,*) FNAME Это сообщение отредактировал(а) ertttttt - 2.9.2010, 12:38 |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Удобно вводить только изменяющуюся часть имени - см http://forum.vingrad.ru/forum/topic-278045...0%BB%D0%B0.html Это сообщение отредактировал(а) FCM - 2.9.2010, 13:01 |
|||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Разобрался с этим.
Не получается работать с динамическим массивом GEOMETRY. Пишет: X= 0.000000000000000E+000 Y= 0.000000000000000E+000 Z= 0.000000000000000E+000 forrtl: severe (161): Program Exception - array bounds exceeded Image PC Routine Line Source Convert_plus_spec 00402590 MAIN 62 Convert_plus_spec.f9 0
Это сообщение отредактировал(а) Mormishka - 4.9.2010, 14:30 |
|||
|
||||
FCM |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
В приведенной диагностике указано на line 62 твоего листинга
CUBE(I,J,K)=1 По видимому в программе заложена ошибка с определеним I,J, K В чем вообще идея с этим CUBE. Зачем он вводится? В связи с CUBE там еще вводятя NX, DX и т.п. - они должны быть одинаковыми для любого считываемого файла или привязаны к конкретному файлу? Можно чуть улучшить начало программы: В данном конкретном случае вместо
можно написать
Это сообщение отредактировал(а) FCM - 4.9.2010, 17:49 |
||||
|
|||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
FCM,
NX, DX и т.п должны считываться с другого файла. Но это думаю сделать можно потом. Есть прямоугольная область с ортогональными координатами. Последовательность чисел после ключевого слова GEOMETRY это координаты линий тока записанные в последовательности x1,y1,z1,x2,y2,z2...xn,yn,zn. Есть сетка, т.е. вся облать разбита на ячейки размером dx,dy,dz кол-вом Nx,Ny,Nz. Мне надо сделать куб, т.е. трехмерный массив в котором содержится информация о том есть ли в заданной ячейки с координатами i,j,k cube(i,j,k) (0 - нет, 1 -есть) линия тока или нет.(пока я хочу сделать так, потом мне нужно будет разделять линии тока идущие от одной скважины к другой). В файл куб(массив) нужно записать построчно в обычный текстовый файл, т.е. a(1,1,1) a(2,1,1) ... a(nx,1,1) a(1,2,1) a(2,2,1) ... a(nx,2,1) ... a(1,ny,1) a(2,ny,1) ... a(nx,ny,1) ... a(1,ny,1) a(2,ny,1) ... a(nx,ny,1) ... al(nx,ny,1) a(nx,ny,2) ... a(nx,ny,nz) Так написано в мануале: Grid blocks are ordered with the X axis index cycling fastest, followed by the Y and Z axis indices. Я не понимаю только как переходить на новую строку. Это сообщение отредактировал(а) Mormishka - 4.9.2010, 16:30 |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
||||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
FCM,
всего ячеек Nx*Ny*Nx. Т.е. cube(Nx,Ny,Nz). dx,dy,dz это размер каждой ячейки. Т.е. есть как бы две системы координат: 1) ортогональная (x,y,z), где x,y,z вещественные 2) сетка, ячейки размером dx,dy,dz, координы (i,j,k), i,j,k-натуральные числа Проверить можно так, GEOMETRY это массив который содержит координаты линий тока, который считали с файла
Это сообщение отредактировал(а) Mormishka - 4.9.2010, 16:59 |
|||
|
||||
FCM |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Добавь отладочную печать - посмотри согласуются ли значения I,J,K и заявленные размеры CUBE
Из английской цитаты следует ли делать вывод, что в записи (строке) по NX чисел? Есть какие-нибудь дополнительные сведения? В Grid blocks - под blocks что понимается? Если предположить, что надо записывать по NX чисел в строке (записи), то попробуй (после того, как разберешься с третьим измерением в CUBE) так
где UNIT номер "устройства" вывода Это сообщение отредактировал(а) FCM - 5.9.2010, 20:37 |
||||||
|
|||||||
ertttttt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.8.2010 Репутация: нет Всего: нет |
Выдало такой результат: 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 Почему он оставляет пробелы? Как сделать, чтоб был только один пробел между цифрами? |
|||
|
||||
FCM |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Пробелы оставляет потому, что используются правила форматировани по умолчанию. Можно задать явно для каждого элемента I2, где 2 - кол-во позиций (одна под однозначное число, другая под пробел)
или I0,1X - где I0 автоматически подстроится под кол-во знаков в целом числе, а 1X - не что иное как 1 пробел.
(100 - задано с запасом (главное, чтобы было >= NX). В принципе можно и точно указать по кол-ву элементов: (в Visual Fortran вместо него можно попробовать вставить <NX>, т.е.
в других Фортранах сформировав соответствующую строку с впечатыванием в нее NX), но результативно это ничего не изменит.) Это сообщение отредактировал(а) FCM - 6.9.2010, 09:11 |
||||
|
|||||
ertttttt |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.8.2010 Репутация: нет Всего: нет |
FCM,
Помогло. Теперь немного улучшаю алгоритм создания массива cube.
Жалуется на "<>". Как будет "не равно"?
|
||||
|
|||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: нет Всего: 160 |
-------------------- |
|||
|
||||
ertttttt |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.8.2010 Репутация: нет Всего: нет |
Не пойму на что жалуется. Если убрать ERR = 901 работает. Раньше и так работало.
Разобрался, строки не хватало 901 CLOSE(11); CLOSE(12); WRITE(*,*) 'FILES HAVE BEEN CLOSED!'
Это сообщение отредактировал(а) ertttttt - 10.9.2010, 11:30 |
||||
|
|||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Опять поднимаю тему, т.к. сейчас возникла необходимость написать программу на си. Не очень понимаю как устроена запись в определенном формате в Фортране. Что значит например запись integer в формате 6(1X,I11) ?
|
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Фантом,
Я вот начал на СИ считывать и в hex редакторе смотреть файл который в топике. Я понял, что фортрана свой какой формат записи в бинарном виде? Как можно на си прочитать что было записано на фортране? |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
Э... Вы сами поняли то, что написали? Я - не очень. "Своего какого формата" нет, и мы это уже обсуждали. |
|||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
В общем проблему почти решил. Оказывается при записи блока памяти на фортране записывается 4 байта в начале и в конце еще 4 байта.
Кому интересны подробности можете прочитать Fortran format c++ Это сообщение отредактировал(а) Mormishka - 2.11.2011, 17:24 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Fortran | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |