d9e5a92d

Функция MLInitialize



Любая программа должна начинать работу с ядром пакета Mathematica с вызова функции MLInitialize. При работоспособном ядре функция возвращает структура типа MLEnvironment, в противном случае результатом будет NULL:
Mlenvironment env;
Env = MLInitialize(NULL);
if(env == NULL) clean_up_and_exit(); //проверка работоспособности ядра
Работа с расчетным ядром начинается с создания соединения. MathLink позволяет при создании соединения указать, каким образом планируется осуществлять взаимодействие. В нашем случае каждый раз будет запускаться новый экземпляр ядра на том же компьютере, на котором функционирует Web-сервер. Для создания соединения используется функция MLOpen:
MLINK lp;
int argc=4;
Char *argv[5] = {“-linkname”, “c:\\Mathematica\math -mathlink”, “-linkmode”, “launch”, NULL);
lp = MLOpen(argc, argv);
После создания соединения можно передавать ядру выражения. Все данные между ядром и прикладной программой передаются посредством разнообразных пакетов. Каждый тип пакетов ориентирован на свою область использования. Например, можно передавать выражения для расчета с использованием функции MLPutFunction и указанием имени математической функции, скажем, «Plus».


Наиболее удобным для нас способом является передача выражений на внутреннем языке пакета Mathematica в виде текстовых строк:
char *expr;
expr = “Solve[x^3 + a x + b == 0, x]”;
MLPutFunction(MathLink, "EvaluatePacket", 1);
MLPutFunction(MathLink, "ToString", 1);
MLPutFunction(MathLink, "ToExpression", 1);
MLPutString (MathLink, expr);
MLEndPacket(MathLink);
Переданные ядру данные будут обработаны. Результатом обработки станут те или иные пакеты (с результатами, либо кодами ошибок), которые программа должна правильно интерпретировать. Для работы с пакетами, посылаемыми ядром необходимо создать цикл обработки полученных пакетов. Об окончании сеанса свидетельствует получение пакета ReturnPacket, при получении которого необходимо вызвать функцию, обрабатывающую результат – MLGetString:
while (MLNextPacket(MathLink)!=RETURNPKT) MLNewPacket(MathLink);
MLGetString(MathLink, &Result);
Финальной стадией является разрыв установленного соединения вызовом функции MLClose и завершение работы с расчетным ядром при помощи функции MLDeinitialize:
MLClose(MathLink);
MLDeinitialize(env);


Существенную сложность при разработке интерфейса вызвала необходимость использования команд вывода графики. Внутренний язык пакета Mathematica позволяет вывести результаты расчетов в графическом (двух- и трехмерном) виде. Для этого существует около десятка различных команд. Ядро Mathematica при использовании этих команд выдает изображения в формате PostScript, обработка которого сложна и в данный момент не применяется. Вместо этого используется преобразование средствами самого пакета Mathematica изображений в формат GIF. Этот формат является основным для графики в сети Интернет. Полученные графические файлы без дополнительных преобразований передаются пользователю.
Для получения изображений используется функция Export. Несмотря на то, что такой способ прост, он требует дополнительной обработки входных данных.
Описанная выше технология позволяет пользователям производить удаленные вычисления с использованием пакета Mathematica. При каждом обращении к CGI-модулю производится запуск нового экземпляра расчетного ядра Mathematica. Это обстоятельство обуславливает невозможность осуществить нормальный сеанс работы, возможно лишь проведение одноразовых вычислений. В то же время запуск отдельных экземпляров ядра позволяет осуществить независимую работу нескольких пользователей. Максимальное значение одновременно работающих пользователей ограничено вычислительной мощностью сервера.

Содержание раздела