exponenta event banner

Создание Level-2 S-функций Fortran

Сведения о создании Level-2 S-функций Fortran

Для использования функций Level-2 S-функции с кодом Fortran необходимо записать скелетную S-функцию на языке C, которая имеет код для взаимодействия с программным обеспечением Simulink ®, а также вызывает код Fortran.

Использование C MEX S-функции в качестве шлюза довольно просто, если вы пишете код Fortran с нуля. Если вместо этого используется устаревший код Fortran, который существует как автономное моделирование, предстоит проделать определенную работу для определения частей кода, которые необходимо зарегистрировать в программном обеспечении Simulink, например, определение непрерывных состояний при использовании решателей с переменными шагами или устранение статических переменных при необходимости иметь несколько копий S-функции в модели Simulink (см. раздел Код устаревшего кода порта).

Файл шаблона

Файл sfuntmpl_gate_fortran.c содержит шаблон для создания S-функции файла C MEX, которая вызывает подпрограмму Fortran в своей mdlOutputs способ. Он работает с простой подпрограммой Fortran, если изменить имя подпрограммы Fortran в коде. Шаблон назначает векторы DWork для хранения данных, которые взаимодействуют с подпрограммой Fortran. Сведения о настройке векторов DWork см. в разделе Использование векторов DWork.

Советы по интерфейсу C/Fortran

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

Среда MEX

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

Протестируйте установку и установку с использованием примеров MEX-файлов из примеров MATLAB, C и Fortran 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

При использовании компилятора Fortran проверьте mex настройка с использованием следующих команд и примеров файлов исходного кода Fortran, yprime.F и yprimefg.F, в matlabroot/extern/examples/mex.

cd(fullfile(matlabroot,'\extern\examples\mex'))
mex yprimef.f yprimefg.f

Дополнительные сведения см. в разделе Создание функции C MEX.

Совместимость компилятора

Компиляторы C и Fortran должны использовать один и тот же формат объекта. Если используются компиляторы, явно поддерживаемые mex команда это не проблема. При использовании шлюза C для Fortran можно использовать компиляторы Fortran, не поддерживаемые mex , но только если формат файла объекта совместим с форматом компилятора C. Общие форматы объектов включают ELF и COFF.

Компилятор также должен быть настраиваемым для очистки стека вызывающим абонентом, а не вызываемым абонентом. Intel ® Visual Fortran (замена Compaq ® Visual Fortran) имеет очистку стека по умолчанию в качестве вызывающего.

Украшения символов

Оформление символов может привести к ошибкам во время выполнения. Например, g77 декорирует имена подпрограмм с завершающим подчеркиванием в конфигурации по умолчанию. Можно либо распознать это и настроить прототип функции C, либо изменить политику оформления имени компилятора Fortran с помощью параметров командной строки, если компилятор поддерживает это. См. руководство компилятора Fortran об изменении политик оформления символов.

Если все остальные ошибки, используйте утилиты, такие как 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 (без подчеркивания).

Математическая библиотека Фортрана

Символы библиотеки формул Fortran могут не совпадать с символами библиотеки формул C. Например, A^B в функции библиотеки вызовов Fortran 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 Visual Fortran 10.1, этот пример можно скомпилировать с помощью следующих двухmex команды. Введите каждую команду в одной строке. 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 команды (каждая команда находится в одной строке). 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 и Fortran в любом направлении. Поиск в Интернете cfortran или посетить

http://www-zeus.desy.de/~burow/cfortran/

для загрузки.

Выбор компилятора Fortran

На компьютере Windows использование Visual C++ с Fortran лучше всего выполнять с Visual Fortran 10.1.

Обновленный список всех поддерживаемых компиляторов см. в списке поддерживаемых и совместимых компиляторов MathWorks по адресу:

Создание шлюза

mdlInitializeSizes и mdlInitializeSampleTimes методы кодируются в C. Маловероятно, что вам потребуется вызывать подпрограммы Fortran из этих методов S-функций. В простейшем случае Фортран называется только от mdlOutputs.

Простой случай

Код Фортрана должен быть, по крайней мере, вызываемым одномоментным способом. Если код не имеет состояний, его можно вызвать из mdlOutputs и нет mdlDerivatives или mdlUpdate требуется метод.

Код с состояниями

Если код имеет состояния, необходимо решить, может ли код Fortran поддерживать решатель с переменным шагом или нет. Для решателя с фиксированным шагом шлюз C состоит из вызова кода Fortran из mdlUpdateи выходы кэшируются в S-функциональном векторе DWork, так что последующие вызовы движком Simulink в mdlOutputs будет работать правильно, и код Fortran не будет вызван до следующего вызова mdlUpdate. В этом случае состояния в коде могут храниться, как правило, в рабочем векторе или в виде дискретных состояний.

Если вместо этого код должен иметь непрерывные временные состояния с поддержкой решателей с переменным шагом, эти состояния должны быть зарегистрированы и сохранены в движке как удвоенные. Вы делаете это в mdlInitializeSizes (регистрация состояний), затем состояния извлекаются и отправляются в код Fortran всякий раз, когда необходимо выполнить его. Кроме того, основная часть кода должна быть разделена на форму вызова, которая может использоваться mdlDerivatives получить производные для государственной интеграции, а также mdlOutputs и mdlUpdate соответствующие методы.

Код настройки

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

ПОДПРОГРАММА ПО СРАВНЕНИЮ С ПРОГРАММОЙ

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

  1. Изменение строки PROGRAM кому SUBROUTINE subName.

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

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

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

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

Аргументы для подпрограммы

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

PROGRAM ...

становится

SUBROUTINE somename( U, X, Y )

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

Аргументы ФУНКЦИИ

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

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

Сопряжение с блоками COMMON

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

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

Пример кода Fortran вызова S-функции C MEX

Пример S-функции sfcndemo_atmos содержит пример S-функции C MEX, вызывающей подпрограмму Fortran. Подпрограмма Фортрана Atmos находится в файле sfun_atmos_sub.F. Эта подпрограмма рассчитывает стандартную атмосферу до 86 километров. Подпрограмма имеет четыре аргумента.

SUBROUTINE Atmos(alt, sigma, delta, theta)

S-функция шлюза C MEX, sfun_atmos.c, объявляет подпрограмму Fortran.

/* 
 * 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 метод вызывает подпрограмму Fortran, используя pass-by-reference для аргументов.

    /* call the Fortran routine using pass-by-reference */
    atmos_(&falt, &fsigma, &fdelta, &ftheta);

Просмотр этого примера работы с образцом модели sfcndemo_atmosвведите следующую команду в командной строке MATLAB.

sfcndemo_atmos

Создание S-функций шлюза C MEX в системе Windows

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

  1. Управляемый cd(matlabroot) для перехода к корню MATLAB.

  2. Управляемый mex -setup Fortran для выбора компилятора Fortran.

  3. Скомпилировать файл Fortran с помощью следующей команды. Введите команду в одной строке.

    mex -v -c toolbox/simulink/simdemos/simfeatures/srcFortran/sfun_atmos_sub.F ...
    -f bin/win64/mexopts/intelf12msvs2008opts.bat
    
  4. Управляемый mex -setup C для выбора компилятора Си.

  5. Подключите скомпилированную подпрограмму Fortran к шлюзу C MEX S-function с помощью следующей команды. Переменная 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

Создание S-функций шлюза C MEX в системе UNIX

Создайте шлюз в системе UNIX с помощью команды

mex sfun_atmos.c sfun_atmos_sub.o

В некоторых UNIX-системах, где компиляторы C и Fortran были установлены отдельно (или не знают друг о друге), может потребоваться ссылка на библиотеку libf2c.a. Для этого используйте -lf2c флаг.

Если libf2c.a библиотека не находится в пути к библиотеке, необходимо добавить путь к mex явно с помощью -L команда. Например:

mex -L/usr/local/lib/ -lf2c sfun_atmos.c sfun_atmos_sub.o