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.
#!/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