суббота, 10 сентября 2011 г.

Переносим численную лабораторию на Linux

Все время хотел перенести свою научную деятельность в Linux окружение, но никак не хватало времени. Теперь этот золотой момент пришел и некоторые результаты я опишу в этой заметке.

Основными задачами была замена среды разработки на С/C++ и инструмента визуализации полученных данных - т.е. поиск аналогов VS2010 & Tecplot.

С ide особых проблем, естественно, не возникло - благо для Linux их существует великое множество. Единственным ограничением было мое личное пожелание в некоторой похожести новой среды на студию. В итоге я решил остановиться на MonoDevelop - достаточно легкая ide, которая к тому же близка к VS2010.

А вот с визуализацией было по сложнее. Хотелось иметь достаточно простой и в тоже время гибкий инструмент. На предмет исследования я выбрал GnuPlot, Paraview и OpenDX. Но в итоге больше всего внимания уделил именно GnuPlot'у, с чьей помощью и смог визуализировать результаты расчетов.
Сами данные представляли собой набор слоев, отображавших движение волны в заданной области - так что требовалась визуализация трехмерной анимации с данными во внешнем файле. Для этого был создан следующий скрипт на bash:
#!/bin/bash
MAX=1000
echo "clear" >> $1
echo "reset" >> $1
echo "set terminal gif animate delay 10" >> $1
echo "set output \""$2"\"" >> $1
echo "set isosample 40" >> $1
echo "set hidden3d" >> $1
for i in `seq 0 ${MAX}`
do
echo "splot \""$3"\" index $i using 1:2:3" >> $1
done
Этот скрипт генерирует файл с расширением *.gpi, который поставляется на вход gnuplot. Теперь немного о коде. В переменной MAX указано количество слоев, которые находятся в файле с данными (замечу, что каждый слой должен быть отделен двумя пустыми строками).
Затем указывается, что вывод всех слоев будет направлен в gif. Команда splot снабжена некоторыми важными ключами - index указывает слой, который выводится в данный момент, using - столбцы, которые используются для визуализации.
Теперь об аргументах - первый из них отвечает за название выходного файла. Второй указывает имя  результирующего gif файла, а третий говорит скрипту, где искать данные для визуализации.
Пример использования:
~/gnuplot$ ./create_animation.sh some.gpi some.gif some.dat
Затем необходимо загрузить полученный файл в gnuplot
~/gnuplot$ gnuplot

 G N U P L O T
 Version 4.4 patchlevel 2
 last modified Wed Sep 22 12:10:34 PDT 2010
 System: Linux 2.6.38-11-generic

 Copyright (C) 1986-1993, 1998, 2004, 2007-2010
 Thomas Williams, Colin Kelley and many others

 gnuplot home:     http://www.gnuplot.info
 faq, bugs, etc:   type "help seeking-assistance"
 immediate help:   type "help"
 plot window:      hit 'h'

gnuplot> load 'some.gpi'
В результате начнется вывод анимации в указанный файл (придется немного подождать).
Для того, чтобы придать делу завершенность, можно сконвертировать полученный gif в avi с помощью программы mencoder
#!/bin/bash
mencoder $1 -mf fps=25 -o $2 -ovc lavc -lavcopts vcodec=mpeg4
На первом этапе меня это вполне устроило - достаточно простой, но легко расширяемый и настраиваемый способ визуализации численных расчетов. И я абсолютно уверен, что это того стоит)


0коммент.:

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