最近在跑MPB程序,把一些心得体会写下来。如果你对这个领域的知识和程序感兴趣,可以发电子邮件到:ghxandsky@gmail.com

a. 如果你喜欢物理,特别是固体物理,又喜欢光学,特别是光子晶体,但是你不熟悉计算机,甚至不知道GNU/Linux和*BSD为何物或者没有安装此系统, 这没关系,先搜索这方面的资料,强化UNIX风格操作系统的基本命令,这个软件将会很适合你。如果有时间,了解一下Scheme,这个语言很大用途,特别 是构建科学计算程序。

b.如果你喜欢计算机,喜欢自由/开源软件,你的机器已经安装了GNU/Linux或者*BSD系统,那么你可以快 速“预览”这个软件,不过,“预览”过后,如果你依然想把源代码洞察清楚,请翻看关于电动力学和固体物理的书籍,甚至还要了解量子力学的内容。如果你只是 从事互联网和计算机行业,这个程序“预览”在此文就为止了,珍惜时间,把精力放在更专注的领域。

c.如果你来自生物信息或者其他搞模拟计算领域的,或许MPB软件的设计“哲学”可以帮助你设计一些高性能计算程序。

d.如果你对以上abc都不“感冒”,纯粹看图片可以了,窥探一下。

以上是我一点心得,但愿可以给读者思想准备。

MPB 全称是MIT Photonic Bands,顾名思义,是MIT科研人员开发的一套关于光子晶体能带结构计算工具,之所以冠名“光子”,因为计算的目的就是为了让普通光源(激光)发出光 能量通过这些“猜想”结构的晶体,使到某些频谱范围的受到限制,就是“禁带”。利用禁带的现象,可以制作光学滤波器,商业化后可以安装在光纤网络交换机 中,提高光通滤波效率能耗,提升性能价格比,促进大规模应用,提高互联网基础设施的带宽,彻底改变“龟速”状况,提高广大人民群众互联网生活的幸福感,构 建和谐社会(小星越吹越远了.^_^.)。说明一个问题,其实物理学研究和广大人民群众是息息相关。

这里说明我的工作平台:硬件 Intel P4 2.8Mhz(HT)、i865G、DDR 1G、Geforece 6800GT 256RAM(原本买来打游戏的,现在却用来搞可视化)、SATAII 500G;软件平台Debian GNU/Linux Lenny 5.05(32bit) ,only use stable ,具体基础软件版本参看debian.org。总的来说:没有钱买新机器,Debian稳定易用。

安装软件环境:

sudo apt-get install mpb h5utils qtiplot nlpot

这里,安装程序自动关联libctl、fftw和guile。

说明一下程序的基本功能:

a.Guile(GPL) 是GNU工程一个项目,主要提供GNU/Linux系统的语言扩展,暂时发现支持C和Scheme(没有深入挖掘),我们知道C语言很快,Scheme脚 本语言很灵活,可不可以把两者结合?对!Guile可以满足你需求,用C语言写核心程序,Scheme写原始数据脚本和递归控制流程,当然,混合编程是一 个很深的学问,慢慢学习(我曾经想过使用Guile对GSL的封装,可惜已经有别人做了,而且公开了,我思想落伍了)。

b.mpb(GPL)提供能带计算的平面波展开法,包含麦克斯韦方程组的变换展开。详细见源代码。

c.h5utils(GPL)是一个可视化的组件,提供生成二维图和三维可视化文件,.v5d和.vtk,可以分别使用vis5d和paraview软件,具体这些程序哪里下载和安装,请自行搜索或者Email我。

d.qtiplot(GPL),Qt界面的绘图软件,功能齐全。

e.libctl(GPL)是一个关于常用晶体格子的函数库,提供晶格和格点的“描述”,向上支持调用,典型的软件有MPB和MEEP。

f.fftw是广泛使用的离散傅立叶变换库之一,类似有GSL,LAPACK和私有的Intel MKL等。

要注意的是,以上软件使用GNU GPL自由软件协议发行。好的,现在默认你已经安装了以上软件。如果不能很好安装或者想使用最新版本,请到MPB官方网站 下载对应软件的最新版本,按照安装提示自行解压安装。

现在要运行测试了,假设目录位置为mpb/,则编写以下文件:

main.ctl 和 run.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
;-------main.ctl-------------

(set! num-bands 8)
;这里设置八个带,是每一个k点计算带的个数

(set! geometry-lattice (make lattice (size 1 1 no-size)
(basis1 (/ (sqrt 3) 2) 0.5)
(basis2 (/ (sqrt 3) 2) -0.5)))
;这里设置晶格的组成结构,晶格基矢为(1 1 no-size),因为是平面的原因
;这里是元包的两个基矢,注意语法


(set! geometry (list (make cylinder
(center 0 0 0) (radius 0.2) (height infinity)
(material (make dielectric (epsilon 12))))))
;设置格点位置放置的晶系,有方格,球,椭圆,圆柱,锥体,台体
;这里设置圆柱,中心(0 0 0),半径0.2,高为无穷大,绝缘介质中,介电常数e=12
;具体的设置见官方文档

(set! k-points (list (vector3 0 0 0) ; Gamma
(vector3 0 0.5 0) ; M
(vector3 (/ -3) (/ 3) 0) ; K
(vector3 0 0 0))) ; Gamma
;设置布里渊区倒空间的k点模样,由于是三角格子,倒空间也是三角格子,
;注意对称性的关系可以减少范围

(set! k-points (interpolate 4 k-points))
;设置k点,使每个k点间隔4个点内差值细分

(set! resolution 32)
;设置分辨率,也就是精确度

(run-tm (output-at-kpoint (vector3 (/ -3) (/ 3) 0)
fix-efield-phase output-efield-z))
;计算TM模式在矢量方向的数值
(run-te)
;计算TE模式
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

mpb main.ctl >& main.out
h5topng -S 3 epsilon.h5
h5tov5d epsilon.h5
h5tovtk epsilon.h5

mpb-data -r -m 3 -n 32 epsilon.h5
h5ls epsilon.h5

h5topng epsilon.h5:data-new
h5tov5d epsilon.h5:data-new

grep Gap main.out
grep tmfreqs main.out > main.tm.dat
grep tefreqs main.out > main.te.dat

在/mpb目录下输入命令:

$ chmod 755 run.sh  //该为可执行文件
$ ./run.sh                  //执行

等待结果,那么就可以得到图片和数据。

MPB以及周围软件的浅谈介绍

至于怎样绘制main.tm.dat和main.te.dat的数据?首先删除这些文件的第一行,替换删除“tmfreqs:,”,除去“、”替换为空格。好了,打开qtiplot把数据读取进去,划出来就可以了。这里粗糙画画。

MPB以及周围软件的浅谈介绍

这里附加一个其他main.ctl脚本的结构生成的三维图形:

MPB以及周围软件的浅谈介绍


谢谢你能看到这里。.^_^.

Logo

更多推荐