среда, 14 декабря 2011 г.

Самостоятельная сборка Gmsh. Unix. Часть 1

Ранее мы рассмотрели способ сборки исполняемого файла и библиотеки Gmsh'а из исходных файлов под ОС Windows. Сегодня остановимся на особенностях этой сборки под системами из семейства Unix. Несмотря на то, что таких систем довольно много, процедура сборки для них идентична. По крайней мере, все, что будет приводится далее, проверялось мной на двух платформах: 32-битная Ubuntu 10.04 Lucid Lynx (с графикой) и 64-битная SUSE Linux Enterprise Server 11 (без графики).

Вначале мы рассмотрим поэтапно процесс сборки Gmsh'а под Ubuntu, которая будет выступать в роли домашней ОС, в которой вы имеете права суперпользователя.

1. CMake
Начиная с версии 2.4.1, Gmsh использует программу CMake для конфигурирования своего Makefile. При этом необходимо, чтобы CMake имел версию не ниже, чем 2.6. Если у вас в системе установлен CMake необходимой версии, переходите ко второму этапу. Проверить это просто. Запустите терминал (Приложения -> Стандартные -> Терминал) и наберите в командной строке

~$ which cmake

Если система выдала путь, где установлен CMake, проверьте его версию, набрав

~$ cmake --version

Если же система ничего не выдала, значит CMake у вас не установлен. Идем дальше.
Способов установки CMake как минимум 3:
  1. установить CMake из репозитория Ubuntu (используя команду 'sudo apt-get install cmake' или через менеджер пакетов Synaptic (в меню Система -> Администрирование))
  2. скачать установочный файл с сайта CMake
  3. собрать CMake из исходников, скачанных с сайта CMake
Конечно, самый простой вариант - первый. Однако он имеет ряд недостатков. Первый из них - не все пакеты есть в репозитории, а если и есть, то уж точно не самых свежих версий. Второй - установка из репозитория невозможна, если у вас нет прав суперпользователя. На момент написания данного поста, в репозитории имелась версия CMake 2.8.0, что для наших целей вполне подходит. А поскольку Ubuntu - наша домашняя ОС, то с правами тоже вопросов нет.
Установка из репозитория проходит в автоматическом режиме без нашего участия. Результаты установки проверяем теми же командами, что и раньше

~$ which cmake
/usr/bin/cmake
~$ cmake --version
cmake version 2.8.0

Кроме программы cmake, для конфигурирования Makefile'ов Gmsh'а может понадобиться утилита ccmake. Ее также можно установить из репозитория (она числится под именем cmake-curses-gui).

2. BLAS, LAPACK
Прежде, чем приступить к сборке Gmsh'а, необходимо отметить, что он зависит от большого количество сторонних пакетов, которые также необходимо установить (если, конечно, вам нужны соответствующие опции Gmsh'а). Приведу пример. Допустим, вы хотите, чтобы Gmsh имел графический интерфейс (а поскольку Ubuntu имеет графическую оболочку, это желание вполне естественно). Для этого вам нужно будет установить библиотеку FLTK, на которой построен интерфейс Gmsh'а. Если же вам нужна только библиотека Gmsh (или исполняемый файл без графического интерфейса), FLTK можно не устанавливать. Gmsh прекрасно работает и без нее. Однако, на чистеньких системах, вроде моей, не установлены даже библиотеки BLAS и LAPACK. Gmsh сконфигурируется и без этих опций, но вот только работать не будет. А именно - не построит сетку. Поэтому описание сборки Gmsh'а далее организуем так: установим BLAS и LAPACK, сконфигурируем Gmsh, соберем и установим его, а затем опишем те пакеты и соответствующие им опции, которые можно установить дополнительно.

BLAS и LAPACK - это довольно старые и проверенные библиотеки для линейной алгебры, поэтому, конечно, устанавливаем их также из репозитория. Для этого заходим в менеджер пакетов Synaptic (Система -> Администрирование) и ищем 'libblas' и 'liblapack'. После установки можете проверить, что библиотеки на месте:

~$ find /usr -name "libblas*"
~$ find /usr -name "liblapack*"

3. Gmsh
Итак, приступаем к самому интересному. Скачиваем отсюда архив с исходниками той версии Gmsh'а, которую вы хотите установить. Распаковываем архив и в полученной директории создаем каталог build

~$ tar xfz gmsh-source.tgz
~$ mkdir gmsh-source/build
~$ cd gmsh-source/build

Для того, чтобы сконфигурировать Gmsh по умолчанию, введите просто

~/gmsh-source/build$ cmake ..

То, что в результате этой команды появится на экране, нужно внимательно просмотреть. У меня, например, было выдано сообщение об ошибке в связи с тем, что не был установлен компилятор Фортрана. Если ошибок нет, посмотрите на список опций, с которыми Gmsh будет собираться:

Gmsh has been configured for Linux with the following options: Ann Bamg Blas Chaco DIntegration Dlopen Gmm Kbipack Lapack MathEx Mesh Metis Mpeg Netgen Parser Plugins Post Solver Tetgen

Хорошенько посмотрите, есть ли у вас в опциях Blas и Lapack. Если нет, возможно, CMake не видит их библиотеки. В этом случае проверьте системную переменную LD_LIBRARY_PATH

~$ echo $LD_LIBRARY_PATH

Если эта переменная пуста, добавьте в нее путь до библиотек Blas и Lapack

~$ export LD_LIBRARY_PATH="/usr/lib"

Чтобы при каждом новом запуске терминала не инициализировать эту переменную, добавьте приведенную выше строку в файл .bashrc, который находится в домашней директории.
При необходимости, можно явно указать, что мы хотим включить опции Blas и Lapack:

~/gmsh-source/build$ cmake -DENABLE_BLAS_LAPACK=1 ..

или, используя утилиту ccmake

~/gmsh-source/build$ ccmake ..

Найдите строку ENABLE_BLAS_LAPACK и убедитесь, что ее значение ON (в противном случае переключите значение, нажав Enter).
После того, как вы с этим разобрались, обратите внимание на следующие строки:

C compiler: /usr/bin/gcc
C++ compiler: /usr/bin/c++
Build type: RelWithDebInfo
Install prefix: /usr/local


Если вы хотите изменить тип сборки или директорию установки, то вам необходимо изменить переменные CMAKE_BUILD_TYPE и CMAKE_INSTALL_PREFIX с помощью утилиты ccmake или через аргументы команды cmake.
Следующий шаг - сборка исполняемого файла

~/gmsh-source/build$ make

статической библиотеки

~/gmsh-source/build$ make lib

или динамической библиотеки

~/gmsh-source/build$ make shared

Если вы имеете многоядерный процессор, вы можете ускорить этот этап, набрав

~/gmsh-source/build$ make { | lib | shared } -j4

Здесь число 4 означает количество инструкций, которые будут исполняться одновременно. Лучше всего, если оно равняется количеству ядер. Поэтому, если у вас двухядерный процессор, наберите make -j2
Последний шаг - установка в соотвествующие директории

~/gmsh-source/build$ sudo make { | lib | shared} install

Теперь можно убедиться, что Gmsh установлен как надо, заодно проверив его версию

~$ gmsh -version

Можно также проверить все опции, с которыми был собран Gmsh, а также другую полезную информацию

~$ gmsh -info

Чтобы протестировать Gmsh, создадим небольшой файл simple.geo:

Point(1) = {0, 0, 0};
Point(2) = {1, 0, 0};
Point(3) = {0, 1, 0};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 1};
Line Loop(4) = {1, 2, 3};
Plane Surface(1) = {4};
Physical Surface(100) = {1};

Построим сетку

~$ gmsh -2 simple.geo

В процессе построения сетки Gmsh выдает кучу служебной информации. Чтобы информация не выводилась, введите

~$ gmsh -2 simple.geo -v 0

Теперь, как в предыдущем посте, запустим простенькую программу, чтобы проверить работоспособность библиотеки Gmsh. Как и ранее воспользуемся файлом mainSimple.cpp из директории gmsh-source/utils/api-demos.
Компилируем командой

~/../api-demos$ g++ -c mainSimple.cpp -I /usr/local/include/gmsh

Линкуем командой

~/../api-demos$ g++ -L /usr/local/lib -lGmsh mainSimple.o -o mainSimple

Запускаем так

~/../api-demos$ ./mainSimple

После этого я получил ошибку "./mainSimple: error while loading shared libraries: libGmsh.so: cannot open shared object file: No such file or directory". Если с вами произошло то же самое, запустите команду ldconfig, которая создает необходимые привязки и кэш для динамических библиотек. Конечно, запускать ее нужно от имени суперпользователя

~/gmsh-source/utils/api-demos$ sudo ldconfig

После этого проблема с запуском у меня исчезла. Все работает.

4. FLTK
FLTK (Fast Light ToolKit) - это пакет библиотек для создания графических приложений, в том числе - пользовательских интерфейсов. Что-то вроде MFC от Microsoft или Qt от Nokia. Конечно, по сравнению с ними FLTK значительно беднее в ассортименте функций, зато он "быстрее и легче" (по крайней мере, так говорится в названии самого пакета). Поэтому он часто используется для создания графических интерфейсов наукоемких приложений, к которым Gmsh, безусловно, относится. Однако, как говорилось выше, наличие интерфейса для Gmsh'а опционально, т.е. непосредственно на генерацию сетки это не влияет. Тем не менее, иногда очень полезно посмотреть на сетку, построить сечения. А если рассматривать Gmsh еще и как визуализатор полученных результатов, то тут без FLTK никак не обойтись.
Поскольку в репозитории я нашел FLTK версии 1.1, предлагаю не усложнять себе жизнь и установить FLTK прямо оттуда. Я устанавливал пакеты libfltk1.1 и libfltk1.1-dev.
Теперь для того, чтобы Gmsh имел графический интерфейс, его нужно собрать с поддержкой FLTK. Для этого нужно просто переконфигурировать и пересобрать Gmsh из директории build

~/gmsh-source/build$ cmake ..
~/gmsh-source/build$ sudo make { | lib | shared } install

Gmsh автоматически подключит опцию FLTK (и другие, связанные с ней), если найдет соответствующие библиотеки. Чтобы изменить опцию принудительно, введите

~/gmsh-source/build$ cmake -DENABLE_FLTK=1 ..

или воспользуйтесь утилитой ccmake.
Несмотря на простоту указанных операций, вы можете столкнуться с неожиданными ошибками. Так на этапе конфигурирования Gmsh'а с поддержкой FLTK у меня вылезла ошибка о том, что отключена поддержка OpenGL. Чтобы эту поддержку включить, я установил пакет libglu1-mesa-dev, после чего Gmsh сконфигурировался как надо.
После сборки и установки, запускаем Gmsh

~$ gmsh simple.msh

Вот, что мы увидим
Кстати, теперь это скрин окон Gmsh'а версии 2.5.0, а не 2.4.2, которую я рассматривал в предыдущих постах.

5. OpenCASCADE
OpenCASCADE (OCC) или, что то же самое, OpenCASCADE Technology (OCCT) - это набор библиотек для моделирования геометрических фигур, визуализации и т.д. На OCCT построено большое количество CAD систем, некоторые из которых рассматривались в посте Триангуляция сложных моделей. Поскольку в подобных CAD системах удобно проектировать геометрию модели, было бы замечательно иметь возможность загрузить такую модель в Gmsh для построения сетки. И такая возможность имеется. Но для этого Gmsh должен быть собран с поддержкой OCCT. Все логично.
В репозитории имеется версия OpenCASCADE 6.3.0. которая, конечно, уже успела значительно устареть, но, я думаю, для наших целей подойдет. Устанавливаем пакет libopencascade-dev.
После этого по известной схеме переконфигурируем Gmsh. У меня CMake автоматически подцепил все библиотеки OpenCASCADE, поэтому поддержка OCC также включилась автоматически. Если у вас она отключена, то ее можно включить вручную аргументом -DENABLE_OCC=1, или, естественно, с помощью ccmake. Хотя здесь, конечно, главное, чтобы CMake увидел, где лежат библиотеки.
Процесс сборки и установки также прошел без приключений.
Чтобы проверить, что поддержка OCC теперь работает, загрузим какой-нибудь .BRep файл, взятый например, из галереи сайта opencascade.org. Как я писал ранее, заргузку геометрии в формате BRep можно осуществить, передав имя файла просто через командную строку

~$ gmsh 18_f1.brep

Вот, что, в результате, у меня получилось
Несмотря на несколько ошибок, которые Gmsh выдал в процессе загрузки модели и построения поверхностной сетки, мы видим, что, в общем и целом, все работает. И это не может не радовать.

Комментариев нет:

Отправить комментарий