Чтобы использовать функции 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
Для получения дополнительной информации смотрите Сборку C MEX-функция.
Ваши компиляторы 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