Создайте уровень 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

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