Создайте уровень 2 S-функции Фортрана

О создании уровня 2 S-функции Фортрана

Чтобы использовать функции S-функции Уровня 2 с кодом Фортран, необходимо написать скелетную S-функцию в C, который имеет код для взаимодействия через интерфейс к программному обеспечению Simulink® и также вызывает код Фортран.

Используя S-функцию MEX C, когда шлюз довольно прост, если вы пишете код Фортран с нуля. Если вместо этого у вас есть устаревший код Фортран, который существует как автономная симуляция, существует, некоторые работают, чтобы быть сделанными, чтобы идентифицировать части кода, который должен быть указан с программным обеспечением Simulink, таким как идентификация непрерывных состояний, если вы используете решатели переменного шага или избавляетесь от статических переменных, если вы хотите иметь несколько копий S-функции в модели Simulink (см. Унаследованный код Порта).

Обработайте файл по шаблону

sfuntmpl_gate_fortran.c файла содержит шаблон для создания S-функции файла MEX на C, которая вызывает стандартную подпрограмму Fortran в ее методе mdlOutputs. Это работает с простой стандартной подпрограммой Фортрана, если вы изменяете имя стандартной подпрограммы Фортрана в коде. Шаблон выделяет векторы DWork, чтобы хранить данные, которые связываются со стандартной подпрограммой Фортрана. Смотрите, Как Использовать Векторы DWork для получения информации о подготовке векторов DWork.

C/Fortran Взаимодействующие через интерфейс Советы

Следующее является некоторыми советами для создания S-функции шлюза C-Фортрана.

Среда MEX

mex -setup должен найти MATLAB®, C, и компиляторы Фортрана, но это может работать с только одним из этих компиляторов за один раз. Если вы изменяете компиляторы, необходимо запустить mex -setup между другими командами mex.

Протестируйте установку и настройку с помощью демонстрационных файлов MEX из MATLAB, C, и примеров Фортрана MEX в (открытой) папке matlabroot/extern/examples/mex, а также примеров S-функции.

При использовании компилятора C на платформе Microsoft® Windows® протестируйте настройку mex с помощью следующих команд и примера C файл исходного кода, yprime.c, в matlabroot/extern/examples/mex.

cd(fullfile(matlabroot,'\extern\examples\mex'))
mex yprime.c

При использовании компилятора Фортрана протестируйте настройку mex с помощью следующих команд и примера файлы исходного кода Фортрана, yprime.F и yprimefg.F, в matlabroot/extern/examples/mex.

cd(fullfile(matlabroot,'\extern\examples\mex'))
mex yprimef.f yprimefg.f

Для получения дополнительной информации смотрите файл MEX Сборки (MATLAB).

Совместимость компилятора

Ваши компиляторы C и Фортрана должны использовать тот же объектный формат. Если вы используете компиляторы, явным образом поддержанные mex, управляют, чтобы это не было проблемой. Когда вы используете шлюз C для Фортрана, возможно использовать компиляторы Фортрана, не поддержанные командой mex, но только если формат объектных файлов совместим с форматом компилятора C. Общие объектные форматы включают ELF и COFF.

Компилятор должен также быть конфигурируемым так, чтобы вызывающая сторона очистила стек вместо вызываемого. Intel® Visual Fortran (замена для Compaq® Visual Fortran) имеет очистку стека по умолчанию как вызывающую сторону.

Художественные оформления символа

Художественные оформления символа могут вызвать ошибки времени выполнения. Например, g77 украшает имена стандартной подпрограммы запаздывающим подчеркиванием когда в его настройке по умолчанию. Можно или распознать это и настроить прототипа функции C или изменить политику художественного оформления имени компилятора Фортрана через переключатели командной строки, если компилятор поддерживает это. См. руководство компилятора Фортрана об изменяющихся политиках художественного оформления символа.

Если все остальное перестало работать, используйте утилиты, такие как od (восьмеричный дамп), чтобы отобразить имена символа. Например, команда

od -s 2 <file>

векторы символов списков и символы в двоичном файле (.obj) файлы.

Эти бинарные утилиты могут быть получены для платформы Windows также. Компания MKS, Inc. обеспечивает коммерческие версии мощных утилит для платформ Open Group UNIX®. Дополнительные утилиты могут также быть получены свободные в сети. hexdump является другой общей программой для просмотра двоичных файлов. Как пример, вот вывод

od -s 2 sfun_atmos_for.o

на платформе Linux®.

     0000115 E¨
     0000136 E¨
     0000271 E¨"
     0000467 ˙E¨@
     0000530 ˙E¨ 
     0000575 E¨ E 5@
     0001267 CfƒVC- :C
     0001323 :|.-:8˘#8 Kw6
     0001353 ?333@
     0001364 333
     0001414 01.01
     0001425 GCC: (GNU) egcs-2.91.66 19990314/
     0001522 .symtab
     0001532 .strtab
     0001542 .shstrtab
     0001554 .text
     0001562 .rel.text
     0001574 .data
     0001602 .bss
     0001607 .note
     0001615 .comment
     0003071 sfun_atmos_for.for
     0003101 gcc2_compiled.
     0003120 rearth.0
     0003131 gmr.1
     0003137 htab.2
     0003146 ttab.3
     0003155 ptab.4
     0003164 gtab.5
     0003173 atmos_
     0003207 exp
     0003213 pow_d

Обратите внимание на то, что Atmos был изменен на atmos_, который программа C должна вызвать, чтобы быть успешной.

С Визуальным Фортраном на 32-битных машинах Windows подавлен символ, так, чтобы Atmos стал ATMOS (никакое подчеркивание).

Математическая библиотека Фортрана

Математические символы библиотеки Фортрана не могут совпадать с математическими символами библиотеки C. Например, A^B на Фортране вызывает библиотечную функцию pow_dd, который не находится в математической библиотеке C. В этих случаях необходимо сказать mex соединяться в математической библиотеке Фортрана. Для сред gcc эти стандартные программы обычно находятся в /usr/local/lib/libf2c.a, /usr/lib/libf2c.a, или эквивалентными.

Команда mex становится

mex -L/usr/local/lib -lf2c cmex_c_file fortran_object_file

Примечание

В системе UNIX опция -lf2c следует за обычной библиотекой UNIX, соединяющей синтаксис, где -l является самой опцией библиотеки, и f2c является уникальной частью имени файла библиотеки, libf2c.a. Обязательно используйте опцию -L для пути поиска файлов библиотеки, потому что -I только сопровождается, в то время как поиск включает файлы.

Пакет f2c может быть получен для Windows и сред UNIX из Интернета. Файл libf2c.a обычно является частью дистрибутивов g77 или иначе файлом, не нужен, когда символы соответствуют. В неясных случаях это должно быть установлено отдельно, но даже это не трудно, если потребность в нем идентифицирована.

На 32-битных машинах Windows, с помощью Microsoft Visual C ++® и Intel Визуальный Фортран 10.1, этот пример может быть скомпилирован с помощью следующих двух команд mex. Введите каждую команду в одну строку. Команда mex -setup C должна быть запущена, чтобы возвратиться к компилятору C прежде, чем выполнить вторую команду. Во второй команде замените переменную IFORT_COMPILER10 на имя переменной окружения системы, указывающей на Визуальный Фортран 10,1 корневых папок в вашей системе.

mex -v  -c fullfile(matlabroot,'toolbox','simulink','simdemos','simfeatures',
'srcFortran','sfun_atmos_sub.F'), -f fullfile(matlabroot,'bin','win32',
'mexopts','intelf10msvs2005opts.bat'))

!mex -v -L"%IFORT_COMPILER10%\IA32\LIB" -llibifcoremd -lifconsol 
-lifportmd -llibmmd -llibirc sfun_atmos.c sfun_atmos_sub.obj

На 64-битных машинах Windows, с помощью Visual C++ и Визуального Фортрана 10.1, этот пример может быть скомпилирован с помощью следующих двух команд mex (каждая команда находится на одной строке). Команда mex -setup C должна быть запущена, чтобы возвратиться к компилятору C прежде, чем выполнить вторую команду. Переменная IFORT_COMPILER10 является именем переменной окружения системы, указывающей на Визуальный Фортран 10,1 корневых папок, и может отличаться в вашей системе. Замените matlabroot на путь к вашей корневой папке MATLAB.

mex -v  -c fullfile(matlabroot,'toolbox','simulink','simdemos','simfeatures',
'srcFortran','sfun_atmos_sub.F'), -f fullfile(matlabroot,'bin','win64','mexopts',
'intelf10msvs2005opts.bat'))

!mex -v -L"%IFORT_COMPILER10%\EM64T\LIB" -llibifcoremd -lifconsol 
-lifportmd -llibmmd -llibirc sfun_atmos.c sfun_atmos_sub.obj

CFortran

Или можно попытаться использовать CFortran, чтобы создать интерфейс. CFortran является инструментом для автоматизированной интерфейсной генерации между модулями C и Фортрана в любом направлении. Ищите в Интернете cfortran или посещение

http://www-zeus.desy.de/~burow/cfortran/

для загрузки.

Выбор компилятора Фортрана

На машине Windows, с помощью Visual C++ с Фортраном лучше всего сделан с Визуальным Фортраном 10.1.

Для актуального списка всех поддерживаемых компиляторов смотрите MathWorks поддерживаемый и совместимый список компиляторов в:

Построение шлюза

mdlInitializeSizes и методы mdlInitializeSampleTimes закодированы в C. Маловероятно, что необходимо будет вызвать стандартные программы Фортрана из этих методов S-функции. В самом простом случае Фортран называется только от mdlOutputs.

Простой случай

Код Фортран должен, по крайней мере, быть вызываемым за один шаг вид. Если код не имеет никаких состояний, он может быть назван от mdlOutputs и никакого mdlDerivatives, или метод mdlUpdate требуется.

Код с состояниями

Если код имеет состояния, необходимо решить, может ли код Фортран поддержать решатель переменного шага или нет. Поскольку решатель фиксированного шага только поддерживает, шлюз C состоит из вызова кода Фортран от mdlUpdate, и выходные параметры кэшируются в векторе S-function DWork так, чтобы последующие вызовы механизмом Simulink в mdlOutputs работали правильно, и код Фортран не будет назван до следующего вызова mdlUpdate. В этом случае состояния в коде могут храниться однако, вам нравится, обычно в векторе работы или как дискретные состояния.

Если вместо этого код должен иметь непрерывные состояния времени с поддержкой решателей переменного шага, состояния должны быть указаны и сохранены механизмом, как удваивается. Вы делаете это в mdlInitializeSizes (указывающий состояния), затем состояния получены и отправлены в код Фортран каждый раз, когда необходимо выполнить его. Кроме того, основная часть кода должна быть отделимой в форму вызова, которая может использоваться mdlDerivatives, чтобы получить производные для интегрирования состояния и также mdlOutputs и методами mdlUpdate как соответствующие.

Код Setup

Если существует долгое вычисление настройки, лучше делать эту часть кода отделимой от одного шага за один раз кодом и вызывать его от mdlStart. Это может или быть отдельным SUBROUTINE, названным от mdlStart, который связывается с остальной частью кода через блоки COMMON или аргумент I/O, или это может быть часть той же части кода Фортран, который изолируется построением IF-THEN-ELSE. Это построение может быть инициировано одним из входных параметров, который говорит код, если это должно выполнить или вычисления настройки или вычисления с одним шагом.

СТАНДАРТНАЯ ПОДПРОГРАММА по сравнению с ПРОГРАММОЙ

Чтобы смочь вызвать Фортран из программного обеспечения Simulink непосредственно, не имея необходимость запускать процессы, и т.д., необходимо преобразовать PROGRAM Фортрана в SUBROUTINE. Это состоит из трех шагов. Первое тривиально; второе и третье могут сдать немного экзамена.

  1. Измените строку PROGRAM на SUBROUTINE subName.

    Теперь можно вызвать его от C, использующего C синтаксис функций.

  2. Идентифицируйте переменные, которые должны быть вводами и выводами и поместить их в список аргументов SUBROUTINE или в блок COMMON.

    Это обычно, чтобы разделить все трудно закодированные случаи и вывести дампы. В окружении Simulink вы хотите преобразовать вводы и выводы в блок I/O.

  3. Если вы преобразовываете автономную симуляцию, чтобы работать в окружении Simulink, идентифицировать основной цикл интегрирования времени и удалить цикл и, если вы хотите, чтобы механизм Simulink интегрировал непрерывные состояния, удалите любой код интеграции времени. Оставьте интегрирования времени в коде, если вы намереваетесь сделать (выбранную) S-функцию дискретного времени.

Аргументы к СТАНДАРТНОЙ ПОДПРОГРАММЕ

Большинство компиляторов Фортрана генерирует код SUBROUTINE, который передает аргументы ссылкой. Это означает, что код С, вызывая код Фортран должен использовать только указатели в списке аргументов.

PROGRAM ...

становится

SUBROUTINE somename( U, X, Y )

SUBROUTINE никогда не имеет возвращаемое значение. Вы управляете вводом-выводом при помощи некоторых аргументов для входа, остальных для вывода.

Аргументы к ФУНКЦИОНАЛЬНОМУ

FUNCTION передало скалярное возвращаемое значение значение, таким образом, вызов C программа должен ожидать это. Список аргументов передается ссылкой (т.е. указатели) как в SUBROUTINE.

Если результатом вычисления является массив, то необходимо использовать стандартную подпрограмму, когда FUNCTION не может возвратить массив.

Взаимодействие через интерфейс к блокам COMMON

В то время как существует несколько путей к Фортрану блоки COMMON, чтобы быть видимыми к коду С, часто рекомендуется использовать список аргументов ввода/вывода для SUBROUTINE или FUNCTION. Если код Фортран был уже записан и использует блоки COMMON, это - простой вопрос, чтобы записать маленький SUBROUTINE, который имеет список аргументов ввода/вывода и копирует данные в и из блока COMMON.

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

Пример C S-функция MEX, вызывая код на языке Фортран

Пример S-функции sfcndemo_atmos содержит пример S-функции MEX C, вызывая стандартную подпрограмму Фортрана. Стандартная подпрограмма Фортрана Atmos находится в файле sfun_atmos_sub.F. Эта стандартная подпрограмма вычисляет стандартную атмосферу до 86 километров. Стандартная подпрограмма имеет четыре аргумента.

SUBROUTINE Atmos(alt, sigma, delta, theta)

Шлюз C S-функция MEX, sfun_atmos.c, объявляет стандартную подпрограмму Фортрана.

/* 
 * Windows uses upper case for Fortran external symbols 
 */
#ifdef _WIN32
#define atmos_ ATMOS
#endif

extern void atmos_(float *alt, 
                  float *sigma, 
                  float *delta, 
                  float *theta);

Вызовы метода mdlOutputs стандартная подпрограмма Фортрана с помощью передачи ссылкой для аргументов.

    /* call the Fortran routine using pass-by-reference */
    atmos_(&falt, &fsigma, &fdelta, &ftheta);

Чтобы видеть, что этот пример работает в демонстрационной модели sfcndemo_atmos, введите следующую команду в подсказке команды MATLAB.

sfcndemo_atmos

Создание шлюза C S-функции MEX на Windows System

На 64-битном системном использовании Windows Intel C++ 12.0 и Intel Визуальный Фортран 12, необходимо использовать отдельные команды, чтобы скомпилировать файл Фортрана и затем соединить его с файлом шлюза C. Каждая команда находится на одной строке.

  1. Запустите cd(matlabroot), чтобы перейти к вашему корню MATLAB.

  2. Запустите mex -setup Fortran, чтобы выбрать компилятор Fortran.

  3. Скомпилируйте файл Фортрана с помощью следующей команды. Введите команду в одну строку.

    mex -v -c toolbox/simulink/simdemos/simfeatures/srcFortran/sfun_atmos_sub.F ...
    -f bin/win64/mexopts/intelf12msvs2008opts.bat
    
  4. Запустите mex -setup C, чтобы выбрать компилятор C.

  5. Соедините скомпилированную стандартную подпрограмму Фортрана со шлюзом C S-функция MEX с помощью следующей команды. Переменная IFORT_COMPILER12 является именем переменной окружения системы, указывающей на Визуальный Фортран 12 корневых папок, и может отличаться в вашей системе.

    !mex -v -L"%IFORT_COMPILER12%\IA64\LIB" -llibifcoremd -lifconsol -lifportmd ...
    -llibmmd -llibirc
    toolbox\simulink\simdemos\simfeatures\srcFortran\sfun_atmos.c sfun_atmos_sub.obj
    mex -v  -c toolbox/simulink/simdemos/simfeatures/srcFortran/sfun_atmos_sub.F
    -f bin/win64/mexopts/intelf12msvs2008opts.bat

Создание шлюза C S-функции MEX в системе UNIX

Создайте шлюз в системе UNIX с помощью команды

mex sfun_atmos.c sfun_atmos_sub.o

В некоторых системах UNIX, где компиляторы C и Фортрана были установлены отдельно (или не знают друг о друге), вы можете должны быть сослаться на библиотеку libf2c.a. Для этого используйте флаг -lf2c.

Если библиотека libf2c.a не находится на пути к библиотеке, необходимо добавить путь к процессу mex явным образом с командой -L. Например:

mex -L/usr/local/lib/ -lf2c sfun_atmos.c sfun_atmos_sub.o