Я чрезвычайно новичок в работе с Linux и Fortran, поэтому извиняюсь, если это основной вопрос.
Я пытаюсь сначала использовать fwrite для сохранения массива 60x150, который я создал в MATLABкак двоичный файл, который я затем пытаюсь загрузить и прочитать в Fortran как массив 60x150 снова.
В Matlab я использовал следующий код для сохранения массива.В этом случае имя массива в рабочей области - VP, и я сохраняю его в файл, который также называется «VP»:
>> fileID = fopen('VP','w');
>> fwrite(fileID,VP,'real*8');
>> fclose(fileID)
Затем я копирую файл из Windows вLinux-сервер SSH (я не уверен, что это актуально, но подумал, что стоит включить все, что может помочь).
Теперь, в моем коде на Фортране, у меня есть:
REAL(KIND=kind(1.0D0)), DIMENSION(60,150) :: VP
...
open(unit, file="LOCATION/VP", access = "stream", form = "unformatted", iostat = stat)
if(stat /= 0) labort("Failed to open input file")
print *, wl
DO inx2=1,60
DO inx=1,150
print *,inx
READ(unit,*) VP(inx2,inx)
ENDDO
ENDDO
print *,VP(1:10,1)
Теперь, когда я компилирую это, ошибок нет.Тем не менее, когда я запускаю его, он доходит точно до первого «READ (unit, *) VP (inx2, inx)» до сбоя (вы можете узнать по печати непосредственно перед ним).
Я получаюошибка:
forrtl: severe (257): formatted I/O to unit open for unformatted transfers, unit 111, file LOCATION/VP
Очевидно, я бы хотел, чтобы моим фактическим результатом была функция, выполняющаяся и заканчивающаяся теми же значениями в массиве.
Теперь я уже видел вопрос, особенноза это сообщение об ошибке, но на него ответили включением access="stream"
, который у меня уже есть.По сути, я не уверен, в какой момент я получаю что-то не так в этом процессе, любая помощь будет признательна.
Обратите внимание, что я попытался изменить точность в fwrite и поменять местами значения inx2 и inx(но это не сработало на первом, поэтому я не верю, что это ошибка).
Опять же, это может быть просто фундаментальной проблемой с моим пониманием Фортрана, потому что я был немного погружен в глубокий конецс проектом, над которым я работаю (большая часть кода, который я выполняю, была написана кем-то другим, я просто пытаюсь отредактировать небольшую его часть).
Редактировать:
Хорошо, спасибо большое, Франческа!Он обнаружил, что решение состоит в том, чтобы отредактировать строку в READ (unit) VP (inx2, inx), чтобы запустить ее.Однако значения, которые я получаю, запустив следующую строку кода:
print *,VP(1:10,1)
Только первое значение соответствует первому значению в моем исходном массиве matlab.При отображении VP (1: 5,1: 5) массива matlab других подходящих значений нет.Я мог бы понять это самостоятельно, но поскольку я уже здесь, я мог бы также спросить, поскольку я не полностью закончил оригинальный вопрос (хотя преодолел большое препятствие!).
Правка 2:
Хорошо, следующий бит, который мне удалось выяснить для себя.Если кто-то ищет, хотя это был просто случай обмена циклами DO.т.е.
DO inx=1,150
DO inx2=1,60
print *,inx
READ(unit,*) VP(inx2,inx)
ENDDO
ENDDO
Спасибо за помощь.