MPB (MIT Photonic Bands) — бесплатная программа с открытым исходным кодом, которая была изначально разработана для расчёта дисперсионных диаграмм фотонных кристаллов.

MEEP — такая же бесплатная программа с исходным кодом, которая используется для моделирования поведения электромагнитных волн в различных средах (фотонные кристаллы, волноводы, резонаторы и тому подобное).

Обе программы были разработаны в Массачусетском технологическом институте (MIT) и обе постоянно получают новые возможности. MPB была написана Стивеном Джонсоном (англ. Steven G. Johnson) во время его аспирантской работы. MEEP была написана чуть позже с участием Стивена.

Обе программы рассчитывают распределения электрических и магнитных компонентов электромагнитного поля, используя комбинацию численных и аналитических методов решения системы уравнений Максвелла (в одно-, дву- или трёхмерных структурах), но каждая из них делает это по-своему. Если MPB рассчитана на применение в отношении периодических и квазипериодических структур и вычисления частот стоячих волн (мод) в этих структурах, то MEEP разработана для моделирования распространения электромагнитных волн через те же фотонные кристаллы, диэлектрические зеркала, по волноводам и внутри резонаторов. Она позволяет рассчитывать те же дисперсионные диаграммы фотонных кристаллов, частоты стоячих волн как в фотонных кристаллах, так и непериодических структурах, спектры пропускания и отражения различных структур, потери на сгибах волноводов и многое другое. Для этого MEEP использует целый арсенал различных источников излучения, граничных условий и поглотителей излучения (PML).

Последние версии MPB и MEEP могут взаимодействовать друг с другом. Например, возможно написать программу для MEEP, которая запросит у MPB расчёт компонентов поля для основной моды волновода, а потом будет использовать эти компоненты для возбуждения этой моды в оптическом волноводном волокне. В результате можно будет промоделировать распространения основной моды по волноводу и отобразить результат расчётов в сторонних программах. Пример показан ниже, где виден результат расчёта компонентов волны, которая покидает оптическое волокно. Для отображения этого результата использовалась бесплатная программа Paraview.

Мне в работе приходится пользоваться этими программами, устанавливать и помогать в установке другим людям. В списках рассылки этих программ временами проскакивают вопросы об установке этих программ от русскоязычных пользователей. С удивлением для себя я не нашёл инструкций по установке в русскоязычной части Интернета и решил опубликовать их тут.


Общая информация


В мире коммерческих программных продуктов, у этих программ есть конкуренты. Аналогом программы MPB является BandSOLVE, аналог MEEP — FullWAVE. BandSOLVE и FullWAVE имеют удобный графический интерфейс, но они стоят своих денег. MPB и MEEP, в отличие от BandSOLVE и FullWAVE, бесплатны, не имеют графического интерфейса, используют язык скриптов Guile и распространяются по лицензии GNU вместе со своими исходными кодами.

Можно установить MEEP и MPB из репозиториев, если вы пользуетесь Debian или Ubuntu. Это существенно облегчает жизнь тем пользователям, которые ещё не научились компилировать и устанавливать эти программы самостоятельно. Временами эти программы из репозиториев работают нормально, но, бывает и так, что некоторые функции не работают или версия программ в репозиториях просто старая. Поэтому лучший способ — установка программ из исходников.

Эти программы могут быть установлены на компьютеры с ОС Windows используя Cygwin. Если кому интересно узнать как это сделать, то я могу дополнительно рассказать. Но это — трудоёмкое дело и оно было актуально 10-15 лет назад. Теперь проще поставить на свой компьютер один из дистрибутивов линукса и использовать эти программы в их родной среде. Какой из дистрибутивов линукса вы выберете для своей работы — дело Ваше.

В этой заметке, будет использоваться ОС CentOS 7. В репозиториях этого дистрибутива уже есть нужные для работы библиотеки HDF5, откомпилированные с поддержкой параллельных вычислений. Это облегчит нашу задачу, так как часто именно эта библиотека служит источником проблем, если она не работает как положено. В репозиториях есть и другие необходимые библиотеки, например, fftw. Но последняя, не поддерживает MPI. Поэтому её нужно будет компилировать самостоятельно.

Основные источники информации для этой заметки инструкции по установке MPB и MEEP, но в этой заметке многое будет упрощено. Установка всех программ будет произведена в директорию /usr/local/.

Шаг 1: устанавливаем компиляторы и библиотеки


В окне терминала выполняем:
sudo yum install libtool* mpich-devel.* lapack* guile guile-devel readline-devel hdf5-* gcc-c++ scalapack-* paraview*

Подозреваю, что так будет установлены и ненужные пакеты, но этот метод просто работает. А самые внимательные из вас всегда подскажут что именно можно не устанавливать (подозреваю, что scalapack-* можно было не устанавливать).

Шаг 2: вносим в .bashrc необходимые переменные окружения


Для этой цели, вы можете использовать любой любимый текстовый редактор. Но если использовать 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


Шаг 3: загружаем, компилируем и устанавливаем библиотеку FFTW с поддержкой MPI


Для этого, в окне терминала выполняем:
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 ..


Шаг 4: библиотеку 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=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure
make -j4
sudo make install
cd ..


Шаг 5: MPB


Компилируем и устанавливаем без поддержки 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 ..


Шаг 6: 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=/lib64/mpich/bin/mpicc CXX=/lib64/mpich/bin/mpicxx F77=/lib64/mpich/bin/mpif77 ./configure
make
sudo make install
cd ..


Шаг 7: MEEP


Без поддержки 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


Шаг 8: h5utils


Программы 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 ..


Проверим работу MEEP


Перемещаемся в каталог с примерами:
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.

Скрипт, для автоматического выполнения операций 3-8 (написан и опробован для Scientific Linux 6.5)
#!/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 ..

Комментарии (3)


  1. customizer
    04.04.2015 14:21

    У меня вопрос не совсем в тему поста. Вы писали что:
    Мне в работе приходится пользоваться этими программами...
    Не пытались ли сымитировать возникновение и перемещение эл.маг. волны не по расчетам, а так как происходит в природе, вроде как «само собой». Скажем, при помощи JavaScript'а, причем не анимацией, а именно имитацией — перемещение заряда, возникновение магнитного поля, заряд диэлектрика и т.д. В трехмерном пространстве, конечно. Ну, или в относительно трехмерном.


    1. piva Автор
      04.04.2015 16:51

      Нет, такого не пробовал. Даже не знаю никого, кто делал бы такие расчёты даже в упрощённом виде.


  1. roller
    05.04.2015 21:06

    Отличная статья! Все бы так писали подробно — что это, для чего это, и только потом у сути. Кстати, с удовольствием бы прочитал (и попробовал) статью, в которой с азов рассказано как рассчитать волновод на примере генератора в СВЧ печке например.