Создайте Level-2 S-функции ФОРТРАН

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

Чтобы использовать функции 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.

Советы по интерфейсам C/Фортран

Ниже приведены некоторые советы по созданию S-функции шлюза C-to-Фортран.

Окружение MEX

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

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

При использовании компилятора 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, чтобы создать интерфейс. 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 методы при необходимости.

Setup

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

СТАНДАРТНАЯ ПОДПРОГРАММА В ЗАВИСИМОСТИ ОТ ПРОГРАММЫ

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

  1. Измените линию PROGRAM на SUBROUTINE subName.

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

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

    Принято перечеркивать все жестко закодированные кейсы и выходные отвалы. В окружение Simulink вы хотите преобразовать входы и выходы в блоки ввода-вывода.

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

Аргументы в СТАНДАРТНУЮ ПОДПРОГРАММУ

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

PROGRAM ...

становится

SUBROUTINE somename( U, X, Y )

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

Аргументы в FUNCTION

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

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

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

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

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

Пример С MEX S-Function Calling Код на языке Фортран

Пример 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

Создание шлюза С MEX S-Functions в системе Windows

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

  1. Выполняйте cd(matlabroot) чтобы перейти к корню MATLAB.

  2. Выполняйте mex -setup 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 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

Создание шлюза С MEX S-Functions в системе 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