Чтобы использовать функции S-функции Уровня 2 с кодом Фортран, необходимо написать скелетную S-функцию в C, который имеет код для взаимодействия через интерфейс к программному обеспечению Simulink® и также вызывает код Фортран.
Используя S-функцию MEX C, когда шлюз довольно прост, если вы пишете код Фортран с нуля. Если вместо этого у вас есть устаревший код Фортран, который существует как автономная симуляция, существует, некоторые работают, чтобы быть сделанными, чтобы идентифицировать части кода, который должен быть указан с программным обеспечением Simulink, таким как идентификация непрерывных состояний, если вы используете решатели переменного шага или избавляетесь от статических переменных, если вы хотите иметь несколько копий S-функции в модели Simulink (см. Унаследованный код Порта).
sfuntmpl_gate_fortran.c
файла содержит шаблон для создания S-функции файла MEX на C, которая вызывает стандартную подпрограмму Fortran в ее методе mdlOutputs
. Это работает с простой стандартной подпрограммой Фортрана, если вы изменяете имя стандартной подпрограммы Фортрана в коде. Шаблон выделяет векторы DWork, чтобы хранить данные, которые связываются со стандартной подпрограммой Фортрана. Смотрите, Как Использовать Векторы DWork для получения информации о подготовке векторов DWork.
Следующее является некоторыми советами для создания S-функции шлюза C-Фортрана.
mex -setup
должен найти MATLAB®, C, и компиляторы Фортрана, но это может работать с только одним из этих компиляторов за один раз. Если вы изменяете компиляторы, необходимо запустить mex -setup
между другими командами mex
.
Протестируйте установку и настройку с помощью демонстрационных файлов MEX из MATLAB, C, и примеров Фортрана MEX в (открытой)
папке
, а также примеров S-функции.matlabroot/extern/examples/mex
При использовании компилятора 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 является инструментом для автоматизированной интерфейсной генерации между модулями 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
как соответствующие.
Если существует долгое вычисление настройки, лучше делать эту часть кода отделимой от одного шага за один раз кодом и вызывать его от mdlStart
. Это может или быть отдельным SUBROUTINE
, названным от mdlStart
, который связывается с остальной частью кода через блоки COMMON
или аргумент I/O, или это может быть часть той же части кода Фортран, который изолируется построением IF-THEN-ELSE
. Это построение может быть инициировано одним из входных параметров, который говорит код, если это должно выполнить или вычисления настройки или вычисления с одним шагом.
Чтобы смочь вызвать Фортран из программного обеспечения Simulink непосредственно, не имея необходимость запускать процессы, и т.д., необходимо преобразовать PROGRAM
Фортрана в SUBROUTINE
. Это состоит из трех шагов. Первое тривиально; второе и третье могут сдать немного экзамена.
Измените строку PROGRAM
на SUBROUTINE subName
.
Теперь можно вызвать его от C, использующего C синтаксис функций.
Идентифицируйте переменные, которые должны быть вводами и выводами и поместить их в список аргументов SUBROUTINE
или в блок COMMON
.
Это обычно, чтобы разделить все трудно закодированные случаи и вывести дампы. В окружении Simulink вы хотите преобразовать вводы и выводы в блок I/O.
Если вы преобразовываете автономную симуляцию, чтобы работать в окружении Simulink, идентифицировать основной цикл интегрирования времени и удалить цикл и, если вы хотите, чтобы механизм Simulink интегрировал непрерывные состояния, удалите любой код интеграции времени. Оставьте интегрирования времени в коде, если вы намереваетесь сделать (выбранную) S-функцию дискретного времени.
Большинство компиляторов Фортрана генерирует код SUBROUTINE
, который передает аргументы ссылкой. Это означает, что код С, вызывая код Фортран должен использовать только указатели в списке аргументов.
PROGRAM ...
становится
SUBROUTINE somename( U, X, Y )
SUBROUTINE
никогда не имеет возвращаемое значение. Вы управляете вводом-выводом при помощи некоторых аргументов для входа, остальных для вывода.
FUNCTION
передало скалярное возвращаемое значение значение, таким образом, вызов C программа должен ожидать это. Список аргументов передается ссылкой (т.е. указатели) как в SUBROUTINE
.
Если результатом вычисления является массив, то необходимо использовать стандартную подпрограмму, когда FUNCTION
не может возвратить массив.
В то время как существует несколько путей к Фортрану блоки COMMON
, чтобы быть видимыми к коду С, часто рекомендуется использовать список аргументов ввода/вывода для SUBROUTINE
или FUNCTION
. Если код Фортран был уже записан и использует блоки COMMON
, это - простой вопрос, чтобы записать маленький SUBROUTINE
, который имеет список аргументов ввода/вывода и копирует данные в и из блока COMMON
.
Процедура для копирования в и из блока COMMON
начинается с записи входных параметров к блоку COMMON
прежде, чем вызвать существующий SUBROUTINE
. SUBROUTINE
называется, затем выходные значения читаются из блока COMMON
и копируются в выходные переменные непосредственно перед возвратом.
Пример 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
На 64-битном системном использовании Windows Intel C++ 12.0 и Intel Визуальный Фортран 12, необходимо использовать отдельные команды, чтобы скомпилировать файл Фортрана и затем соединить его с файлом шлюза C. Каждая команда находится на одной строке.
Запустите cd(matlabroot)
, чтобы перейти к вашему корню MATLAB.
Запустите mex -setup Fortran
, чтобы выбрать компилятор Fortran.
Скомпилируйте файл Фортрана с помощью следующей команды. Введите команду в одну строку.
mex -v -c toolbox/simulink/simdemos/simfeatures/srcFortran/sfun_atmos_sub.F ... -f bin/win64/mexopts/intelf12msvs2008opts.bat
Запустите mex -setup C
, чтобы выбрать компилятор C.
Соедините скомпилированную стандартную подпрограмму Фортрана со шлюзом 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
Создайте шлюз в системе 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