Чтобы использовать функции Level-2 S-функции с код Фортраном, необходимо записать скелетную S-функцию на C, которая имеет код для взаимодействия с Simulink® программное обеспечение, а также вызывает ваш код Фортран.
Использовать функцию C MEX S в качестве шлюза довольно просто, если вы пишете код Фортран с нуля. Если вместо этого у вас есть устаревший код Фортрана, который существует как автономная симуляция, предстоит проделать определенную работу по идентификации частей кода, которые необходимо зарегистрировать в программном обеспечении Simulink, например, идентификация непрерывных состояний, если вы используете решатели с переменным шагом или избавление от статических переменных, если вы хотите иметь несколько копий S-функции в модели Simulink (см. Port Legacy Code).
Файл sfuntmpl_gate_fortran.c
содержит шаблон для создания S-функции MEX-файла C, которая вызывает стандартную подпрограмму Фортран в своей mdlOutputs
способ. Он работает с простой стандартной подпрограммой Фортрана, если вы измените имя стандартной подпрограммы Фортран в коде. Шаблон назначает векторы DWork для хранения данных, которые взаимодействуют с стандартной подпрограммой Фортран. Смотрите «Как использовать векторы DWork» для получения информации о настройке векторов DWork.
Ниже приведены некоторые советы по созданию S-функции шлюза C-to-Фортран.
mex -setup
необходимо найти MATLAB®, C и компиляторы Фортран, но он может работать только с одним из этих компиляторов за раз. Если вы меняете компиляторы, необходимо запустить mex -setup
между другими mex
команды.
Протестируйте установку и настройку с помощью примера файлов MEX из примеров MATLAB, C и Фортран MEX в папке
(open), а также примеры S-функций.matlabroot
/ extern/examples/mex
При использовании компилятора C в Microsoft® Windows® platform, тестируйте 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
Для получения дополнительной информации смотрите Build C MEX Function.
Ваши компиляторы C и Фортран должны использовать один и тот же формат объекта. Если вы используете компиляторы, явно поддерживаемые mex
команда это не проблема. Когда вы используете шлюз C в Фортран, можно использовать компиляторы Фортран, не поддерживаемые mex
команда, но только если формат файла объекта совместим с форматом компилятора C. Общие форматы объектов включают ELF и COFF.
Компилятор также должен быть конфигурируемым таким образом, чтобы вызывающий абонент очищал стек вместо тележки. Intel® Visual Фортран (замена на Compaq® Visual Fortran) имеет очистку стека по умолчанию в качестве вызывающего абонента.
Оформление символов может привести к ошибкам времени выполнения. Для примера, g77
украшает имена стандартной подпрограммы конечным подчеркиванием, когда это строение по умолчанию. Можно либо распознать это и настроить прототип функции C, либо изменить политику оформления имен компилятора Фортран с помощью переключателей командной строки, если компилятор поддерживает это. См. руководство компилятора Фортран об изменении политик оформления символов.
Если все остальное не удается, используйте утилиты, такие как od
(восьмеричный дамп) для отображения имен символов. Для примера используйте команду
od -s 2 <file>
перечисляет векторы символов и символы в двоичном формате (.obj
) файлы.
Эти двоичные утилиты можно получить и для платформы Windows. Компания MKS, Inc. предоставляет коммерческие версии мощных утилит для The 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 должна вызвать, чтобы быть успешной.
С помощью Visual Fortran на 32-разрядных компьютерах Windows символ подавляется, так что Atmos
становится ATMOS
(без подчеркивания).
Символы математической библиотеки ФОРТРАН могут не совпадать с символами математической библиотеки С. Для примера, A^B
на языке Фортран вызывает функцию библиотеки pow_dd
, который не находится в математической библиотеке C. В этих случаях вы должны сказать mex
для ссылки в математическую библиотеку Фортран. Для gcc
окружения, эти стандартные программы обычно встречаются в /usr/local/lib/libf2c.a
, /usr/lib/libf2c.a
, или эквивалентный.
The mex
команда становится
mex -L/usr/local/lib -lf2c cmex_c_file fortran_object_file
Примечание
В системе UNIX -lf2c
опция соответствует обычному синтаксису связывания библиотек UNIX, где -l
- это сама опция библиотеки и f2c
является уникальной частью имени файла библиотеки, libf2c.a
. Обязательно используйте -L
опция для пути поиска файлов по библиотеке, потому что -I
выполняется только при поиске файлов включения.
The f2c
пакет можно получить для окружений Windows и UNIX из Интернета. Файл libf2c.a
обычно является частью g77
распределения или файл не нужен, так как символы совпадают. В неясных случаях его необходимо устанавливать отдельно, но даже это не составляет труда после выявления необходимости в нем.
На 32-разрядных компьютерах Windows, с использованием Microsoft Visual C++® и Intel Visual Fortran 10.1, этот пример можно скомпилировать с помощью следующих двух mex
команды. Введите каждую команду в одной линии. The mex -setup C
чтобы вернуться к компилятору C перед выполнением второй команды, необходимо выполнить команду. Во второй команде замените переменную IFORT_COMPILER10
с именем переменного окружения системы, указывающей на корневую папку Visual Fortran 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++ и Visual Fortran 10.1, этот пример можно скомпилировать с помощью следующих двух mex
команды (каждая команда находится в одной линии). The mex -setup C
чтобы вернуться к компилятору C перед выполнением второй команды, необходимо выполнить команду. Переменная IFORT_COMPILER10
- имя переменного окружения системы, указывающее на корневую папку Visual Fortran 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++ с Фортраном лучше всего выполнять с помощью Visual Fortran 10.1.
Обновленный список всех поддерживаемых компиляторов см. в поддерживаемом MathWorks и совместимом списке компиляторов по адресу:
The mdlInitializeSizes
и mdlInitializeSampleTimes
методы закодированы в C. Маловероятно, что вам потребуется вызвать стандартные программы Фортран из этих методов S-функций. В самом простом случае Фортран вызывается только из mdlOutputs
.
Код Фортран должен быть вызываемым по крайней мере в один шаг в раз. Если код не имеет никаких состояний, его можно вызвать из mdlOutputs
и нет mdlDerivatives
или mdlUpdate
требуется метод.
Если код имеет состояния, вы должны решить, может ли код Фортран поддержать решатель с переменным шагом или нет Для поддержки только решателя с фиксированным шагом, шлюз C состоит из вызова кода Фортран из mdlUpdate
, и выходы кэшируются в векторе DWork S-функции, так что последующие вызовы движком Simulink в mdlOutputs
будет работать правильно, и код Фортран не будет вызываться до следующего вызова mdlUpdate
. В этом случае состояния в коде могут сохраняться, как вам нравится, обычно в рабочем векторе или как дискретные состояния.
Если вместо этого код должен иметь непрерывные состояния времени с поддержкой решателей с переменным шагом, состояния должны быть зарегистрированы и сохранены в движке как двойные. Вы делаете это в mdlInitializeSizes
(регистрация состояний), затем состояния извлекаются и отправляются в код Фортран всякий раз, когда вам нужно выполнить его. В сложение основная часть кода должна быть разделена на форму вызова, которую можно использовать mdlDerivatives
получить производные для государственного интегрирования, а также по mdlOutputs
и mdlUpdate
методы при необходимости.
Если существует длительное вычисление настройки, лучше всего сделать эту часть кода отделимой от одношагового кода и вызвать его из mdlStart
. Это может быть или отдельная SUBROUTINE
вызывается из mdlStart
который взаимодействует с остальной частью кода посредством COMMON
блоки или аргументы ввода-вывода, или это может быть часть той же части код Фортрана, которая изолирована IF-THEN-ELSE
конструировать. Эта конструкция может быть инициирована одним из входных параметров, который сообщает коду, должен ли он выполнить вычисления настройки или одноэтапные вычисления.
Чтобы иметь возможность вызвать Фортран из программного обеспечения Simulink непосредственно без необходимости запуска процессов и т.д., необходимо преобразовать PROGRAM
Фортран в
SUBROUTINE
. Это состоит из трех шагов. Первый - тривиальный; второй и третий могут взять немного обследования.
Измените линию PROGRAM
на SUBROUTINE subName
.
Теперь вы можете вызвать его с C, используя синтаксис функции C.
Идентифицируйте переменные, которые должны быть входами и выходами, и поместите их в SUBROUTINE
список аргументов или в COMMON
блок.
Принято перечеркивать все жестко закодированные кейсы и выходные отвалы. В окружение Simulink вы хотите преобразовать входы и выходы в блоки ввода-вывода.
Если вы преобразуете автономную симуляцию для работы в окружение Simulink, идентифицируйте основной цикл интегрирования времени и удалите цикл и, если вы хотите, чтобы механизм Simulink интегрировал непрерывные состояния, удалите любой временной код интегрирования. Оставьте интегрирования времени в коде, если вы намерены сделать дискретное время (выборочную) S-функцию.
Большинство компиляторов Фортран генерируют SUBROUTINE
код, который передает аргументы по ссылке. Это означает, что код С, вызывающий код Фортран, должен использовать только указатели в списке аргументов.
PROGRAM ...
становится
SUBROUTINE somename( U, X, Y )
A SUBROUTINE
никогда не имеет возврат значения. Вы управляете вводом-выводом, используя некоторые аргументы для входа, остальные для выхода.
A FUNCTION
скалярный возврат, переданное значением, поэтому вызывающая программа C должна ожидать этого. Список аргументов передается по ссылкам (т.е. указателям) как в SUBROUTINE
.
Если результатом вычисления является массив, то следует использовать стандартную подпрограмму, как FUNCTION
не удается вернуть массив.
В то время как существует несколько способов для Фортран COMMON
блоки, чтобы быть видимыми для кода С, часто рекомендуется использовать список аргументов ввода/вывода для SUBROUTINE
или FUNCTION
. Если код Фортран уже написан и использует COMMON
блоки, это простое дело, чтобы написать небольшой SUBROUTINE
который имеет список входных/выходных аргументов и копирует данные в и из COMMON
блок.
Процедура копирования из и в COMMON
блок начинается с записи входов в COMMON
блокируйте перед вызовом существующей SUBROUTINE
. The SUBROUTINE
вызывается, затем выходные значения считываются из COMMON
блокируйте и копируйте в выходные переменные непосредственно перед возвращением.
Пример S-функции sfcndemo_atmos
содержит пример S-функции MEX на C, вызывающей стандартную подпрограмму Фортрана. Модель ФОРТРАН стандартной подпрограммы Atmos
находится в файле sfun_atmos_sub.F
. Эта стандартная подпрограмма вычисляет стандартную атмосферу до 86 километров. У стандартной подпрограммы четыре аргумента.
SUBROUTINE Atmos(alt, sigma, delta, theta)
Шлюз С MEX S-функции, 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);
The mdlOutputs
метод вызывает стандартную подпрограмму Фортрана, используя pass-by-reference для аргументов.
/* 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 Visual Fortran 12, необходимо использовать отдельные команды для компиляции файла Фортран, а затем связать его с файлом шлюза С. Каждая команда находится в одной линии.
Выполняйте cd(matlabroot)
чтобы перейти к корню MATLAB.
Выполняйте mex -setup Fortran
для выбора компилятора ФОРТРАН.
Скомпилируйте файл Фортран с помощью следующей команды. Введите команду в одной линии.
mex -v -c toolbox/simulink/simdemos/simfeatures/srcFortran/sfun_atmos_sub.F ... -f bin/win64/mexopts/intelf12msvs2008opts.bat
Выполняйте mex -setup C
для выбора компилятора C.
Соедините скомпилированный стандартной подпрограммой Фортран со шлюзом C MEX S-функцией с помощью следующей команды. Переменная IFORT_COMPILER12
- имя переменного окружения системы, указывающее на корневую папку Visual Fortran 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