S-функция уровня 2 Fortran - Simulink: проблема со спецификатором STATUS = 'OLD' в операторе OPEN - PullRequest
1 голос
/ 18 февраля 2020

Я с любопытством пытаюсь использовать подпрограмму Fortran для тяжелой техники вычислений с Simulink. Эта подпрограмма Fortran представляет собой сложный расчет, который включает в себя открытие и редактирование .txt файлов. Мне удалось написать процедуру Fortran Gateway (на основе шаблона, предоставленного Matlab). Компиляция и соединение были успешными; Я мог передать матрицы, и мой Фортран подтвердил их, и их можно увидеть в одном из файлов .txt.

Это выдержка из кода Фортрана,

if (co%flg_resume) then
    !! Resume
    call readcp( cp, RESUME )
    call rand_load( SAVEMT )
    open( FID, file=OUTPUT, access='append', status='old' )
    if (co%flg_visualization) then
    open( VFID, file=OUTVIS, access='append', status='old' )
    endif
    if ( (co%maxiter .le. cp%iter) .or. (co%maxeval .le. cp%neval) ) then
    co%maxiter = co%maxiter + cp%iter
    co%maxeval = co%maxeval + cp%neval
    end if
    cp%iter = cp%iter + 1
    cp%neval = cp%neval + 1
else
    !! New Run
    call setseed( co%seed )
    popsize = co%initpopsize
    call initialize( cp, co%dim, co%lb, co%ub, init_mean, init_std, co%stairwidth, &
        co%flag_diagonal, popsize, co%flag_active, co%sigma_correction_factor )
    !! Open log files
    open( FID, file=OUTPUT, status='replace' )
    !write( FID, * ) '#Dim:', co%dim, 'lambda:', popsize, 'ub:', co%ub, 'lb:', co%lb
    write( FID, '(A100)' ) '#iter, minval(arffeas), minval(arf), df, dx, cp%sigma, cp%vecD, cp%xmean, cp%diagSqrtC'
    if (co%flg_visualization) then
    open( VFID, file=OUTVIS, status='replace' )
    write( VFID, '(A100)' ) '#arf, arffeas, arx, arxfeas, sigma, xmean, matC'        
    endif
end if

К сожалению, я получил Ошибка "forrtl Серьезный (104) неверный STATUS = значение спецификатора для подключенного файла" в этой конкретной строке.

open( FID, file=OUTPUT, access='append', status='old' )

Однако подпрограмма Fortran создала выходные файлы .txt, но вернула ошибку, когда "else" вызывается, т. е. «Новый прогон». Это выдержка из обсуждаемого файла .txt. Это остановилось на 200 итер, когда это должно было продолжаться. Остановлено на 200

Это то, что я хотел, чтобы .txt был (работает в Visual Studio, отлично) Из Visual Studio

Когда Я удалил спецификаторы для ACCESS и STATUS, ошибка исчезла, но файл .txt не был тем, что я хотел сделать. Это то, что произошло (2 временных шага). Повторяется, когда предполагается продолжение

...