- PVSM.RU - https://www.pvsm.ru -
MPB (MIT Photonic Bands) [1] — бесплатная программа с открытым исходным кодом, которая была изначально разработана для расчёта дисперсионных диаграмм фотонных кристаллов [2].
MEEP [3] — такая же бесплатная программа с исходным кодом, которая используется для моделирования поведения электромагнитных волн в различных средах (фотонные кристаллы, волноводы, резонаторы и тому подобное).
Обе программы были разработаны в Массачусетском технологическом институте (MIT) и обе постоянно получают новые возможности. MPB была написана Стивеном Джонсоном (англ. Steven G. Johnson [4]) во время его аспирантской работы. MEEP была написана чуть позже с участием Стивена.
Обе программы рассчитывают распределения электрических и магнитных компонентов электромагнитного поля, используя комбинацию численных и аналитических методов решения системы уравнений Максвелла (в одно-, дву- или трёхмерных структурах), но каждая из них делает это по-своему. Если MPB рассчитана на применение в отношении периодических и квазипериодических структур и вычисления частот стоячих волн (мод) в этих структурах, то MEEP разработана для моделирования распространения электромагнитных волн через те же фотонные кристаллы [2], диэлектрические зеркала [5], по волноводам [6] и внутри резонаторов [7]. Она позволяет рассчитывать те же дисперсионные диаграммы фотонных кристаллов, частоты стоячих волн как в фотонных кристаллах, так и непериодических структурах, спектры пропускания и отражения различных структур, потери на сгибах волноводов и многое другое. Для этого MEEP использует целый арсенал различных источников излучения, граничных условий и поглотителей излучения (PML [8]).
Последние версии MPB и MEEP могут взаимодействовать друг с другом. Например, возможно написать программу для MEEP, которая запросит у MPB расчёт компонентов поля для основной моды волновода, а потом будет использовать эти компоненты для возбуждения этой моды в оптическом волноводном волокне. В результате можно будет промоделировать распространения основной моды по волноводу и отобразить результат расчётов в сторонних программах. Пример показан ниже, где виден результат расчёта компонентов волны, которая покидает оптическое волокно. Для отображения этого результата использовалась бесплатная программа Paraview [9].
Мне в работе приходится пользоваться этими программами, устанавливать и помогать в установке другим людям. В списках рассылки этих программ временами проскакивают вопросы об установке этих программ от русскоязычных пользователей. С удивлением для себя я не нашёл инструкций по установке в русскоязычной части Интернета и решил опубликовать их тут.
В мире коммерческих программных продуктов, у этих программ есть конкуренты. Аналогом программы MPB является BandSOLVE [10], аналог MEEP — FullWAVE [11]. BandSOLVE и FullWAVE имеют удобный графический интерфейс, но они стоят своих денег. MPB и MEEP, в отличие от BandSOLVE и FullWAVE, бесплатны, не имеют графического интерфейса, используют язык скриптов Guile [12] и распространяются по лицензии GNU [13] вместе со своими исходными кодами.
Можно установить MEEP и MPB из репозиториев, если вы пользуетесь Debian или Ubuntu. Это существенно облегчает жизнь тем пользователям, которые ещё не научились компилировать и устанавливать эти программы самостоятельно. Временами эти программы из репозиториев работают нормально, но, бывает и так, что некоторые функции не работают или версия программ в репозиториях просто старая. Поэтому лучший способ — установка программ из исходников.
Эти программы могут быть установлены на компьютеры с ОС Windows используя Cygwin [14]. Если кому интересно узнать как это сделать, то я могу дополнительно рассказать. Но это — трудоёмкое дело и оно было актуально 10-15 лет назад. Теперь проще поставить на свой компьютер один из дистрибутивов линукса и использовать эти программы в их родной среде. Какой из дистрибутивов линукса вы выберете для своей работы — дело Ваше.
В этой заметке, будет использоваться ОС CentOS 7 [15]. В репозиториях этого дистрибутива уже есть нужные для работы библиотеки HDF5 [16], откомпилированные с поддержкой параллельных вычислений. Это облегчит нашу задачу, так как часто именно эта библиотека служит источником проблем, если она не работает как положено. В репозиториях есть и другие необходимые библиотеки, например, fftw [17]. Но последняя, не поддерживает MPI [18]. Поэтому её нужно будет компилировать самостоятельно.
Основные источники информации для этой заметки инструкции по установке MPB [19] и MEEP [20], но в этой заметке многое будет упрощено. Установка всех программ будет произведена в директорию /usr/local/.
В окне терминала выполняем:
sudo yum install libtool* mpich-devel.* lapack* guile guile-devel readline-devel hdf5-* gcc-c++ scalapack-* paraview*
Подозреваю, что так будет установлены и ненужные пакеты, но этот метод просто работает. А самые внимательные из вас всегда подскажут что именно можно не устанавливать (подозреваю, что scalapack-* можно было не устанавливать).
Для этой цели, вы можете использовать любой любимый текстовый редактор. Но если использовать vim, то в окне терминала набираем:
vim .bashrc
После чего нажимаем клавишу i для того чтобы войти в режим редактирования, перемещаем курсором вниз файла и дописываем там:
LDFLAGS="-L/usr/local/lib -lm" export LDFLAGS
CPPFLAGS="-I/usr/local/include" export CPPFLAGS
LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH
PATH=/lib64/mpich/bin:$PATH export PATH
Нажимаем клавишу Esc, набираем на клавиатуре :wq и нажимаем Enter чтобы сохранить изменения в .bashrc и выйти из редактора. После этого создаём временный каталог t, в котором будут храниться временные файлы, и «входим» в него:
mkdir t
cd t
Для этого, в окне терминала выполняем:
wget http://www.fftw.org/fftw-3.3.4.tar.gz
tar -xf fftw-3.3.4.tar.gz
cd fftw-3.3.4
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure --enable-mpi --enable-openmp
make -j4
sudo make install
cd ..
Там же выполняем:
wget http://ab-initio.mit.edu/libctl/libctl-3.2.2.tar.gz
tar -xf libctl-3.2.2.tar.gz
cd libctl-3.2.2
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure
make -j4
sudo make install
cd ..
Компилируем и устанавливаем без поддержки MPI и OpenMP:
wget http://ab-initio.mit.edu/mpb/mpb-1.5.tar.gz
tar -xf mpb-1.5.tar.gz
cd mpb-1.5/
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure
make -j4
sudo make install
make distclean
С поддержкой MPI и OpenMP
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure --with-mpi --with-openmp
make -j4
sudo make install
cd ..
Выполняем:
wget http://ab-initio.mit.edu/harminv/harminv-1.4.tar.gz
tar -xf harminv-1.4.tar.gz
cd harminv-1.4/
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure
make
sudo make install
cd ..
Без поддержки MPI и OpenMP:
wget http://ab-initio.mit.edu/meep/meep-1.3.tar.gz
tar -xf meep-1.3.tar.gz
cd meep-1.3/
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure
make -j4
sudo make install
make distclean
С поддержкой MPI и OpenMP:
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure --with-mpi
make -j4
sudo make install
Программы MPB и MEEP сохраняют результаты вычислений в файлы с расширением .h5. Этот пакет (h5utils) содержит в себе набор программ для работы с h5-файлами, такие как h5topng (для преобразования h5-файлов в графический формат png), h5tovtk (преобразование в формат vtk, удобный для отображения при помощи программы Paraview) и h5totxt (преобразование в текстовый формат). Если не установить и не использовать эти программы, то многие результаты расчёта будут просто недоступны для просмотра.
wget http://ab-initio.mit.edu/h5utils/h5utils-1.12.1.tar.gz
tar -xf http://ab-initio.mit.edu/h5utils/h5utils-1.12.1.tar.gz
cd h5utils-1.12.1
CC=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure
make -j4
sudo make install
cd ..
Если случилось так, что выполнение команды «make -j4» прервалось c ошибкой "[writepng.o] Error 1", то вместо последних трёх команд выполняем:
make h5totxt
make h5tovtk
sudo mv h5tovtk /usr/local/bin/
sudo mv h5totxt /usr/local/bin/
cd ..
Перемещаемся в каталог с примерами:
cd meep-1.3/examples/
Cначала запустим один из примеров (модель кольцевого резонатора) без использования MPI:
meep ring.ctl
Если MEEP была установлена нормально, то после окончания расчётов, вы увидите вот такой текст в окне терминала:
creating output file "./ring-ez-000403.50.h5"... creating output file "./ring-ez-000403.85.h5"... creating output file "./ring-ez-000404.20.h5"... creating output file "./ring-ez-000404.55.h5"... creating output file "./ring-ez-000404.90.h5"... creating output file "./ring-ez-000405.25.h5"... creating output file "./ring-ez-000405.60.h5"... creating output file "./ring-ez-000405.95.h5"... creating output file "./ring-ez-000406.30.h5"... creating output file "./ring-ez-000406.65.h5"... run 1 finished at t = 406.70000000000005 (8134 timesteps) Elapsed run time = 4.02319 s
В последней строчке — время, портаченное на расчёт (в секундах).
Теперь можно протестировать насколько использование MPI может сократить время расчёта. Для этого запустим meep-mpi (MEEP с поддержкой MPI) на одном процессорном ядре:
mpirun -np 1 meep-mpi ring.ctl
После окончания расчётов видим:
creating output file "./ring-ez-000405.95.h5"... creating output file "./ring-ez-000406.30.h5"... creating output file "./ring-ez-000406.65.h5"... run 1 finished at t = 406.70000000000005 (8134 timesteps) Elapsed run time = 3.81012 s
С двумя ядрами:
mpirun -np 2 meep-mpi ring.ctl
После окончания расчётов видим:
creating output file "./ring-ez-000405.25.h5"... creating output file "./ring-ez-000405.60.h5"... creating output file "./ring-ez-000405.95.h5"... creating output file "./ring-ez-000406.30.h5"... creating output file "./ring-ez-000406.65.h5"... run 1 finished at t = 406.70000000000005 (8134 timesteps) Elapsed run time = 3.20775 s
С тремя ядрами:
mpirun -np 3 meep-mpi ring.ctl
После окончания расчётов видим:
creating output file "./ring-ez-000405.95.h5"... creating output file "./ring-ez-000406.30.h5"... creating output file "./ring-ez-000406.65.h5"... run 1 finished at t = 406.70000000000005 (8134 timesteps) Elapsed run time = 4.67524 s
То есть, при увеличении числа ядер до 2 наблюдается ускорение расчётов. Но при дальнейшем увеличении числа вовлечённых ядер, время расчёта увеличивается. Два — оптимальное число ядер для данного примера, которое даёт максимальный прирост скорости расчёта. Но в случае использования mpb-mpi (MPB с поддержкой MPI, которую мы так же установили), картина, обычно, отличается и удаётся достичь лучшего прироста скорости.
В случае использования вычислительных кластеров и суперкомпьютеров, оптимальное число процессоров будет другим — 8-12. Вы можете спросить: «Зачем использовать MPI и OpenMP, если достигаемый прирост скорости расчёта несущественен?» Прежде всего, прирост скорости зависит от самой модели и от того как выполняемые расчёты могут быть распараллелены. Дело ещё и в том, что у суперкомпьютеров и кластеров объём памяти привязывается к числу вовлечённых в расчёт нодов. Например, 2 GB на нод. Это значит, что вовлекая 2 нода в расчёт, программа получает доступ к 4GB памяти. Вовлекая 10 нодов, программа получает доступ к 20 GB. Таким образом, использование обоих MPI и OpenMP (это было включено выше ключами --with-mpi --with-openmp) позволяет немного ускорить расчёты и при этом использовать больше памяти для расчётов. И, если на вашем домашнем компьютере вы можете использовать только 4GB (например), а на вашем офисном компьютере не хватает разъёмов для установки планок памяти, то на суперкомпьютере вы можете получить доступ к 64GB (например) и более.
Теперь мы можем взглянуть на результаты расчёта. Для начала преобразуем все файлы с расширением .h5 в рабочем каталоге, которые были созданы в результате вычислений, в формат .vtk командой:
h5tovtk *.vtk
После этого можно запустить программу Paraview (выполнив paraview в командной строке), и открыть для просмотра результаты расчёта. Чтобы посмотреть на распределение диэлектрической проницаемости в моделируемой структуре кольцевого резонатора, нужно открыть файл ring-eps-000000.00.vtk. Распределения электрического поля сохранены в файлах вида ring-ez-000400.35.vtk.
#!/bin/bash
# 1. Build and install FFTW
wget http://www.fftw.org/fftw-3.3.4.tar.gz
tar -xf fftw-3.3.4.tar.gz
cd fftw-3.3.4
CC=mpicc CXX=mpicxx F77=mpif77 ./configure --enable-mpi --enable-openmp
make -j4
sudo make install
cd ..
# 2. Libctl
wget http://ab-initio.mit.edu/libctl/libctl-3.2.2.tar.gz
tar -xf libctl-3.2.2.tar.gz
cd libctl-3.2.2
CC=mpicc CXX=mpicxx F77=mpif77 ./configure
make -j4
sudo make install
cd ..
# 3. MPB
# 3.1 without MPI support
wget http://ab-initio.mit.edu/mpb/mpb-1.5.tar.gz
tar -xf mpb-1.5.tar.gz
cd mpb-1.5/
CC=mpicc CXX=mpicxx F77=mpif77 ./configure
make -j4
sudo make install
make distclean
# 3.2 with MPI support
CC=mpicc CXX=mpicxx F77=mpif77 ./configure --with-mpi --with-openmp
make -j4
sudo make install
cd ..
# 4. Harminv
wget http://ab-initio.mit.edu/harminv/harminv-1.4.tar.gz
tar -xf harminv-1.4.tar.gz
cd harminv-1.4/
CC=mpicc CXX=mpicxx F77=mpif77 ./configure
make
sudo make install
cd ..
# 5. Meep
# 5.1 without MPI
wget http://ab-initio.mit.edu/meep/meep-1.3.tar.gz
tar -xf meep-1.3.tar.gz
cd meep-1.3/
CC=mpicc CXX=mpicxx F77=mpif77 ./configure
make -j4
sudo make install
make distclean
# 5.2 with MPI
CC=mpicc CXX=mpicxx F77=mpif77 ./configure --with-mpi
make -j4
sudo make install
# 6. h5utils
wget http://ab-initio.mit.edu/h5utils/h5utils-1.12.1.tar.gz
tar -xf h5utils-1.12.1.tar.gz
cd h5utils-1.12.1
CC=mpicc CXX=mpicxx F77=mpif77 ./configure
make -j4
sudo make install
cd ..
Автор: piva
Источник [24]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/88028
Ссылки в тексте:
[1] MPB (MIT Photonic Bands): http://ab-initio.mit.edu/wiki/index.php/MIT_Photonic_Bands
[2] фотонных кристаллов: https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%82%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D1%80%D0%B8%D1%81%D1%82%D0%B0%D0%BB%D0%BB
[3] MEEP: http://ab-initio.mit.edu/wiki/index.php/Meep
[4] Steven G. Johnson: http://math.mit.edu/~stevenj/
[5] диэлектрические зеркала: https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B7%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D0%BE
[6] волноводам: https://ru.wikipedia.org/wiki/%D0%92%D0%BE%D0%BB%D0%BD%D0%BE%D0%B2%D0%BE%D0%B4
[7] резонаторов: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D1%91%D0%BC%D0%BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B7%D0%BE%D0%BD%D0%B0%D1%82%D0%BE%D1%80
[8] PML: http://en.wikipedia.org/wiki/Perfectly_matched_layer
[9] Paraview: http://www.paraview.org/
[10] BandSOLVE: http://optics.synopsys.com/rsoft/rsoft-passive-device-bandsolve.html
[11] FullWAVE: http://optics.synopsys.com/rsoft/rsoft-passive-device-fullwave.html
[12] Guile: http://www.gnu.org/software/guile/
[13] лицензии GNU: https://www.gnu.org/copyleft/gpl.html
[14] Cygwin: https://www.cygwin.com/
[15] CentOS 7: https://www.centos.org/
[16] HDF5: http://www.hdfgroup.org/HDF5/
[17] fftw: http://www.fftw.org/
[18] MPI: http://en.wikipedia.org/wiki/Message_Passing_Interface
[19] MPB: http://ab-initio.mit.edu/wiki/index.php/MPB_Installation
[20] MEEP: http://ab-initio.mit.edu/wiki/index.php/Meep_Installation
[21] Libctl: http://ab-initio.mit.edu/wiki/index.php/Libctl
[22] Harminv: http://ab-initio.mit.edu/wiki/index.php/Harminv
[23] h5utils: http://ab-initio.mit.edu/wiki/index.php/H5utils
[24] Источник: http://geektimes.ru/post/248514/
Нажмите здесь для печати.