savetest
BZones   a JAVA applet to visualize Brillouin zones
BZones   a JAVA applet to visualize Brillouin zones
Useful Stuff
PJ, 8 July 2009 (created 22 June 2009)
  • not tagging
  • no tags
I've done a lot of investigation on the topic, hopefully I've collected some useful sources.

Programs


At least 2 small programs are out that can visualize both Brillouin zone and Fermi sphere. Unfortunately both are not downloadable

  • Software from japanese researchers Hiroshi Nakano and Yoshitaka Sato
Materials Science and Engineering Vol 294–296 (2000) p542–547 (see [file:./Development%20of%203d%20visualization%20system.pdf])

  • BRIZ: a vizualization program for Brillouin zone – Fermi sphere configuration
Z. Kristallogr. Vol222 (2007) p718–721


(see [file:./zkri.2007.222.12.pdf])

Further Software


  • Unisoft can visualise 1st Brillouin zone


  • XCrySDen is a crystalline and molecular structure visualisation program able to
  1. switch between primitive and conventional cell settings
  2. change the number of the displayed unit cells, that is, display smaller or larger portions of a crystal
  3. display the crystal lattice
  4. visualise the Wigner-Seitz cell and Brillouin-zone
  5. k-path selection for band-structure calculations
  6. visualization of Fermi surfaces
Note: XCrysden just displays prior generated files so you need other software as well



Webarchives


The Bilbao Crystallographic Server links to excellent sites. Don't miss The interactive course on crystallography with lots of applets. Especially the CrystalOgraph Applet is impressive ;-)
Large programe archive ccp14


Videos

Video using the Visualization ToolKit
Brillouin zone morphing
Main sources
PJ, 8 July 2009 (created 22 June 2009)
  • not tagging
  • no tags

Brillouin zone


The given PDF sheets are not perfect, until today nobody knows the real source of them. So I used "Bradley ,Cracknell - Mathematical Theory of Symmetry" as reference. The two texts use different basis and reciprocal space vectors, besides the monoclinic lattice I used Bradley's definition. So you have to convert the coordinates if you want to compare.

Websites



Rhombohedral - hexagonal coordinates


It's more convenient to use hexagonal coordinates
http://www.uwgb.edu/DutchS/SYMMETRY/rhombo-lattice.htm
To convert coordinates you can use
http://qpeng.org/tools/r2h.html or use the formulas http://materials.binghamton.edu/444/part_I/sld048.htm
http://cst-www.nrl.navy.mil/lattice/
Voronoi Diagrams
PJ, 8 July 2009 (created 2 July 2009)
  • not tagging
  • no tags
Brillouin Zones or Wigner-Seitz cells are closely related to Veronoi diagrams There is a huge field in computing science and mathematics to develop Veronoi algorithm.

I found a JAVA Applet Voronoi3D on the web that draw my attention. The (screenshot) clearly shows a brillouin zone. With further research I found out that Voronoi algorithm are already implemented in MATLAB.

With MATLAB it was rather a easy task:

(Monoclinic basecentered BZ)

Use the MATLAB script

MATLAB script
PJ, 16 July 2009 (created 8 July 2009)
  • not tagging
  • no tags
%Based on QHULL DEMO
%http://www.mathworks.com/products/demos/shipping/matlab/qhulldemo.html

clear all;
close all;
clc;

disp('+++++++++++++++++++');
disp('  BRILLOUIN ZONES  ');
disp('(c)  Poms 2009     ');
disp('+++++++++++++++++++');

a=input(['\n','General triclinic lattice','\n','a: ']);
if isempty(a), a=1.2; end
b=input('b: ');
if isempty(b), b=2; end
c=input('c: ');
if isempty(c), c=1.5; end
alpha=input('alpha: ');
if isempty(alpha), alpha=72; end
beta=input('beta: ');
if isempty(beta), beta=80; end
gamma=input('gamma: ');
if isempty(gamma), gamma=110; end
animation=input('Make an animation and save the movie as gif yes/no: ','s');
if isempty(animation), animation='y'; end

alpha=alpha*pi/180;
beta=beta*pi/180;
gamma=gamma*pi/180;

w1 = cos(alpha) - cos(beta) * cos(gamma)/(sin(beta) * sin(gamma));
w2 = sin(gamma)^2 - cos(beta)^2 - cos(alpha)^2 ...
    + 2*cos(alpha) *cos(beta) * cos(gamma);
w2 = sqrt(w2) / (sin(beta) * sin(gamma));

T1 = [a, 0, 0];
T2 = [b * cos(gamma), b	* sin(gamma), 0];
T3 = [c * cos(beta), c * w1*sin(beta), c*w2*sin(beta)];

spat=cross(T1,T2)*T3';

G1=2*pi*cross(T2,T3)/spat;
G2=2*pi*cross(T3,T1)/spat;
G3=2*pi*cross(T1,T2)/spat;

X = zeros(125,3);

l=1;
for i=-2:2;
    for j=-2:2;
        for k=-2:2;
            X(l,:)=i*G1+j*G2+k*G3;
            l=l+1;
        end
    end
end


cla reset; hold on

% Compute Voronoi diagram.
[c,v] = voronoin(X);

nx = c(v{63},:);
tri = convhulln(nx);

% Plot the Voronoi diagram.

if (animation ~= 'y')
    fh=figure(1);
    plot3(X(:,1),X(:,2),X(:,3),'b.','markersize',10);
    for i = 1:size(tri,1)
        patch(nx(tri(i,:),1),nx(tri(i,:),2),nx(tri(i,:),3),i,'FaceAlpha',0.85);
    end
    % Modify the view.
    view(3);
    title('1st Brillouin zone');
    axis equal tight off  vis3d
    grid on;
    camzoom(2);
    rotate3d on
else
    fh=figure('Position',[10,10,400,300]);  %size of the gif!
    for i = 1:size(tri,1)
        patch(nx(tri(i,:),1),nx(tri(i,:),2),nx(tri(i,:),3),i,'FaceAlpha',0.85);
    end
    title('1st Brillouin zone');
    axis equal tight off vis3d
    camtarget([0,0,0]);
    loop=36;
    azimuth=360/loop*[0:loop-1];
    view(azimuth(1),30);
    drawnow;
    pause(0.1);
    mov=getframe(gcf);
    
    gifname = 'animation.gif';
    I = frame2im(mov);
    [X, map] = rgb2ind(I, 128);
    imwrite(X, map, gifname, 'GIF', 'WriteMode', 'overwrite', 'DelayTime', 0, 'LoopCount', Inf);
    
    for k=2:loop
     view(azimuth(k),30);
      drawnow;
      pause(0.1);
      mov=getframe(gcf);
      I = frame2im(mov);
        [X, map] = rgb2ind(I, 128);
        imwrite(X, map, gifname, 'GIF', 'WriteMode', 'append', 'DelayTime', 0);
    end
end

brillouin_zones_matlab.m


<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
BZones is a JAVA applet visualizing Brillouin zones by the original author Otto Scheibelhofer, extended  by Johannes Poms
&copy; 2009
!Books
Symmetry principles in solid state and molecular physics  by  Melvin J. Lax
 http://books.google.at/books?id=Nr2Uo9u0a8cC&dq=Symmetry+principles+in+solid+state+and+molecular+physics

Point groups, space groups, crystals, molecules by R. Mirman
http://books.google.at/books?id=fAolOGrjWZ0C&q

The Mathematical Theory of Symmetry in Solids by Christopher John Bradley, Arthur P. Cracknell

The theory of Brillouin zones and electronic states in crystals by Harry Jones
[file:./Jones,%20Theory%20of%20Brillouin%20Zones%20and%20Electronic%20States%20in%20Crystals%20(1960)(ASIN%20B0000CKQ6X).djvu]

!Papers

The monoclinic lattice isn't well described in above books. There was a series of articles on the Russian Physics Journal (former Soviet Physics Journal) in the 70s covering the geometry of the brillouin zone. Maybe you can get the papers
*Dispersion laws in a simple monoclinic lattice 	Russian Physics Journal Volume 14, Number 4 / April 1971
http://www.springerlink.com/content/g875263511q6654u
*Brillouin zone of a base-centered monoclinic lattice Russian Physics Journal Volume 17, Number 7 / Juli 1974
http://www.springerlink.com/content/j4085p1p93144642
[[Useful Stuff]] [[Main sources]] [[Voronoi Diagrams]] [[MATLAB script]]
[[GettingStarted]]
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
* Original renderer http://www.dgp.toronto.edu/~mjmcguff/learn/java/11-3d/

Some nice applets for inspiration
*http://www.crystallographic-software.com/
*http://www.iumsc.indiana.edu/morphology/xmorphDemo.html
*http://escher.epfl.ch/crystalOgraph/
Accepted parameters are:

|!tag|!default |!type|!description|h
|size      |400     |int      |height of the applet window|
|selectable |false   |boolean   |disables the choice box*|
|crystalID  |bcc   |string   |short name of the lattice to be shown**|
|a | ***       | double      |lattice parameter a|
|b |***        | double      |lattice parameter b|
|c |***        |double       |lattice parameter c|
|alpha |*** |double       |lattice parameter alpha|
|beta  |***  |double       |lattice parameter beta|
|gamma |***  |double    |lattice parameter gamma|
|scale    |100 or 200   |int      |scaling the image inside the square|
|elevation  |12  |int     |coordinate of the point of view|
|azimuth    |106  |int    |coordiante of the point of view|
|perspective |false   |boolean   |perspective on/off|
|showaxes    |true     |boolean   |visibility of axes|
|showbase    |false   |boolean    |visibility of reciprocal base vectors|
|showbasis |falaw     |boolean   |visibility of base translation vectors|
|showsymmetry  |true      |boolean     |visibility of symmetry points and edges|
|zoom  |true or false |boolean   |enables /disables mouse wheel zoom|
|caption|c
    
If no parameter is given, or it is not interpreted right, the default value is taken.
The right lattice is not chosen by the crystal parameters, you have to do this yourself.

     * Has no effect in the version without interface

     ** All 14 Bravais lattices:
|scc   |simple cubic lattice |
|bcc   |body centered cubic lattice|
|fcc    |face centered cubic lattice|
|hex   |hexagonal lattice|
|tets   |simple tetragonal lattice|
|tetbc |body centered tetragonal lattice|
|orthos  |simple orthorhombic|
|orthobase |base centered orthorhombic|
|orthofc|face centered orthorhombic|
|orthobc  |body centered orthorhombic|
|trigonal |primitive trigonal lattice|
|monos |simple monoclinic|
|monobase |base centered monoclinic|
|tri |triclinic lattice|
        
     *** every crystallclass uses own default values 



{{{
%Based on QHULL DEMO
%http://www.mathworks.com/products/demos/shipping/matlab/qhulldemo.html

clear all;
close all;
clc;

disp('+++++++++++++++++++');
disp('  BRILLOUIN ZONES  ');
disp('(c)  Poms 2009     ');
disp('+++++++++++++++++++');

a=input(['\n','General triclinic lattice','\n','a: ']);
if isempty(a), a=1.2; end
b=input('b: ');
if isempty(b), b=2; end
c=input('c: ');
if isempty(c), c=1.5; end
alpha=input('alpha: ');
if isempty(alpha), alpha=72; end
beta=input('beta: ');
if isempty(beta), beta=80; end
gamma=input('gamma: ');
if isempty(gamma), gamma=110; end
animation=input('Make an animation and save the movie as gif yes/no: ','s');
if isempty(animation), animation='y'; end

alpha=alpha*pi/180;
beta=beta*pi/180;
gamma=gamma*pi/180;

w1 = cos(alpha) - cos(beta) * cos(gamma)/(sin(beta) * sin(gamma));
w2 = sin(gamma)^2 - cos(beta)^2 - cos(alpha)^2 ...
    + 2*cos(alpha) *cos(beta) * cos(gamma);
w2 = sqrt(w2) / (sin(beta) * sin(gamma));

T1 = [a, 0, 0];
T2 = [b * cos(gamma), b	* sin(gamma), 0];
T3 = [c * cos(beta), c * w1*sin(beta), c*w2*sin(beta)];

spat=cross(T1,T2)*T3';

G1=2*pi*cross(T2,T3)/spat;
G2=2*pi*cross(T3,T1)/spat;
G3=2*pi*cross(T1,T2)/spat;

X = zeros(125,3);

l=1;
for i=-2:2;
    for j=-2:2;
        for k=-2:2;
            X(l,:)=i*G1+j*G2+k*G3;
            l=l+1;
        end
    end
end


cla reset; hold on

% Compute Voronoi diagram.
[c,v] = voronoin(X);

nx = c(v{63},:);
tri = convhulln(nx);

% Plot the Voronoi diagram.

if (animation ~= 'y')
    fh=figure(1);
    plot3(X(:,1),X(:,2),X(:,3),'b.','markersize',10);
    for i = 1:size(tri,1)
        patch(nx(tri(i,:),1),nx(tri(i,:),2),nx(tri(i,:),3),i,'FaceAlpha',0.85);
    end
    % Modify the view.
    view(3);
    title('1st Brillouin zone');
    axis equal tight off  vis3d
    grid on;
    camzoom(2);
    rotate3d on
else
    fh=figure('Position',[10,10,400,300]);  %size of the gif!
    for i = 1:size(tri,1)
        patch(nx(tri(i,:),1),nx(tri(i,:),2),nx(tri(i,:),3),i,'FaceAlpha',0.85);
    end
    title('1st Brillouin zone');
    axis equal tight off vis3d
    camtarget([0,0,0]);
    loop=36;
    azimuth=360/loop*[0:loop-1];
    view(azimuth(1),30);
    drawnow;
    pause(0.1);
    mov=getframe(gcf);
    
    gifname = 'animation.gif';
    I = frame2im(mov);
    [X, map] = rgb2ind(I, 128);
    imwrite(X, map, gifname, 'GIF', 'WriteMode', 'overwrite', 'DelayTime', 0, 'LoopCount', Inf);
    
    for k=2:loop
     view(azimuth(k),30);
      drawnow;
      pause(0.1);
      mov=getframe(gcf);
      I = frame2im(mov);
        [X, map] = rgb2ind(I, 128);
        imwrite(X, map, gifname, 'GIF', 'WriteMode', 'append', 'DelayTime', 0);
    end
end
}}}

[[brillouin_zones_matlab.m|brillouin_zones_matlab.m]]

[img[animation.gif]]
!Brillouin zone

The given [[PDF sheets|./symmetrypoints.pdf]] are not perfect, until today nobody knows the real source of them. So I used  [["Bradley ,Cracknell - Mathematical Theory of Symmetry"|./Bradley,Cracknell-Mathematical%20Theory%20of%20Symmetry%20in%20Solids%20(chapter%20space%20groups).pdf]] as reference. The two texts use different basis and reciprocal space vectors, besides the monoclinic lattice I used Bradley's definition. So you have to convert the coordinates if you want to compare.

!Websites
*http://homepage2.nifty.com/a-m/bandmemo/node1.html
*http://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-table?from=kv


!Rhombohedral - hexagonal coordinates

It's more convenient to use hexagonal coordinates
http://www.uwgb.edu/DutchS/SYMMETRY/rhombo-lattice.htm
To convert coordinates you can use
http://qpeng.org/tools/r2h.html or use the formulas http://materials.binghamton.edu/444/part_I/sld048.htm
http://cst-www.nrl.navy.mil/lattice/
[[Useful Stuff]]
[[Main sources]]
[[Voronoi Diagrams]]
[[MATLAB script]]
[[Books / Papers]]
[[JAVA sources]]

----
[[List of parameters]]
[[Release Notes v2.1]]
[[Release Notes v2]]
[[Release Notes v1]]
[[Javadoc|../doc/index.html]]

[[Test BZones|../btest2.html]]
[[Test MiniBZones|../../MiniBzones/minibzonestest.html]]

----

[[Edit this wiki]]
author of v2

I've you want to drop me a couple of lines
poms [at] student.tugraz.at
Notes from the original author Otto Scheibelhofer pasted in this wiki

----
<html>
<head>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
<title>Documentation of Bzones</title> <! Exported with Notepad++>
<style type="text/css">
span {
	font-family: 'Courier New';
	font-size: 10pt;
	color: #000000;
}
.sc0 {
}
</style>
</head>
<body>
<div style="float: left; white-space: pre; line-height: 1; background: #FFFFFF; "><span class="sc0">
Table of Contents

    1) General Remarks
    2) Personal Remarks
    3) A Quick Guide for Introducing New Lattices



1) General Remarks

    This Applet was made with
    - jdk1.6.0_10
    - Eclipse 3.4.1
    
    The documentation (in Javadoc manner) can be found in the correspondent /doc directory.
    The source code can be found in the correspondent /src directory.
    
    In the folder Bzones, the complete applet with user interface can be found; In the folder
    Bzones_mini a version without interface can be found. Both versions accept the same parameters,
    they are enlisted in parameters.html. The versions only differ in the classes: Launch.java and
	ControlPanel.java.


2) Personal Remarks
    
    As I have just little serious Java programming experience, there may be found some
    unusual solutions or even bad programming style. Anyone should feel free to improve this!
    

3) A Quick Guide for Introducing New Lattices

    For the 'even-less-experienced-than-me' users, this is a quick and dirty
    introduction in introducing a new lattice, in just a few steps.
    
    -)  Create a new class and let it inherit from AbstractCrystal. (Or just copy and
        rename an existing class, found in the crystals-subfolder.)
		
    -)  Import this class in the CrystalMasterList found in the main-subfolder. Add 1
        to the numbers of elements in the allCrystals-array. Add your new lattice in
        the list of crystals. It might then look as:
		
            AbstractCrystal[] allCrystals = new AbstractCrystal[9];
            allCrystals[0] = new Cscc();
            ...
            allCrystals[7] = new Cmkl();
            allCrystals[8] = new Cmynewlattice();
            return allCrystals;
			
    -)  Edit Cmynewlattice.java according to the lattice you desire. You should change the
        following functions:
		
                public String getName() {
                    return "Enter the name of your lattice, as it should appear in the spin wheel";
                }

                public String getCrystalID() {
                    return "short name used internal and as parameter for the mini-applet";
                }

                public GuiModel getguiModel() {
                    // a gui model to your desires and needs
                    GuiModel model = new GuiModel("allowed", "allowed", "b", "90", "80", "70");
                    return model;
                }
    
    -)  Now you can start calculating your lattice points in the function
                public void calculate(Parameter param) {}
                
        With
                double atilde = param.geta();
        and similar you can get the crystal parameters.
        
        A bunch of vector operations is provided to help calculating your points.
        
        In the end make your points appear on the drawing board with functions
                this.addSymmetricPoint(vector, "Name of this point");
                this.addEdge(starting vector, ending vector);
                etc.
				(The other functions can be found in the documentation of 
                the AbstractCrystal class.)
                
	-) Compile every now and then.
    -) Good luck, have fun!
    
    


</span></div></body>
</html>
This is the second release of the applet. I want to thx the v1 author Otto Scheibelhofer for his great work, the usefull advices and feedback.

!Changelog

!!New Features

*Zoom
*Mini thumbnails
*More crystal classes
*Base translation vector = bravais basis vectors (primitive cell)
*MATLAB script file for serious  

!!Enhancements

*Tiddlywiki system as doku/help
*Source version control system
*lots of resources on the svn
*smaller bugfixes

!Used Software

*Java JDK <br>1.6.0_13
*Eclipse Platform <br>  Version: 3.4.2
*Eclipse Java Development Tools <br> v 3.4.2
*Subversive SVN Connector <br> v 2.2.0
*Subversive SVN Team Provider <br> v 0.7.8

!Version Control System

I set up a [[svn project|http://en.wikipedia.org/wiki/Subversion_(software)]] on our university's SVN server:

https://svn.tugraz.at/svn/bzones/


You need your favourite SVN client, a TUGonline account and a manual activation for this repository. Please contact Prof. Peter Hadley p.hadley@tugraz.at to get access. Maybe the source code will be available also on the course website, but for copyright reasons the additional resources won't be public.

!Things need to be done

*Triclinic BZ also in Applet
*New renderer
*Migrate to JAVA3D
*List of all the symmetry points in k-space <br> in cartesian and reciprocal base vectors
*Spell checking ;-)



*Do not show the BTV anymore, because this leads to confusion if a vector of real space is drawn in k-space
*Updated Matlab script to save animated gif files

[img[animation.gif]]
a JAVA applet to visualize Brillouin zones
[>img[./logo_head.gif]] BZones 
I've done a lot of investigation on the topic, hopefully I've collected some useful sources.

!Programs

At least 2 small programs are out that can visualize both Brillouin zone and Fermi sphere. Unfortunately both are not downloadable

* Software from japanese researchers  Hiroshi Nakano and Yoshitaka Sato
Materials Science and Engineering Vol 294–296 (2000) p542–547 (see [file:./Development%20of%203d%20visualization%20system.pdf])

*BRIZ: a vizualization program for Brillouin zone – Fermi sphere configuration
Z. Kristallogr. Vol222 (2007) p718–721
<html><img src="http://www.issp.ac.ru/lsr/images/briz.gif" width="800" height="600"></html>

(see [file:./zkri.2007.222.12.pdf])

!Further Software

*[[Unisoft|http://www.uni-pc.gwdg.de/eckold/unisoft.html]] can visualise 1st Brillouin zone
[img[http://www.uni-pc.gwdg.de/eckold/uni/scshot2.jpg]]

*[[XCrySDen|http://www.xcrysden.org]] is a crystalline and molecular structure visualisation program able to
# switch between primitive and conventional cell settings
# change the number of the displayed unit cells, that is, display smaller or larger portions of a crystal
# display the crystal lattice
# visualise the Wigner-Seitz cell and Brillouin-zone
# k-path selection for band-structure calculations
# visualization of Fermi surfaces
Note: XCrysden just displays prior generated files so you need other software as well

<html><img src="http://www.xcrysden.org/img/xcrysden-in-action.png" width="800" height="600"></html>

!Webarchives

[[The Bilbao Crystallographic Server|http://www.cryst.ehu.es/html/doc/bcs_links.html]] links to excellent sites. Don't miss [[The interactive course on crystallography|http://lcr.epfl.ch/page37304.html]] with lots of applets. Especially [[the CrystalOgraph Applet|http://escher.epfl.ch/crystalOgraph]] is impressive ;-)
Large programe archive [[ccp14|http://www.ccp14.ac.uk/mirror/mirror.htm]]


!Videos
[[Video using the Visualization ToolKit|http://www.youtube.com/watch?v=wjZwNGr-Nlw]]
[[Brillouin zone morphing|http://abulafia.mt.ic.ac.uk/Bulatov/gallery/qmech/bzone/fcc_sc_bcc.mpg]]
Brillouin Zones or Wigner-Seitz cells are closely related to [[Veronoi diagrams|http://en.wikipedia.org/wiki/Voronoi_diagram]]  There is a huge field in computing science and mathematics to develop Veronoi algorithm.

I found a JAVA Applet [[Voronoi3D|http://www.voronoi3d.com]]  on the web that draw my attention. The ([[screenshot|http://www.voronoi3d.com/graphics/chLarge.jpg]]) clearly shows a brillouin zone. With further research I found out that Voronoi algorithm are already implemented in MATLAB.

With MATLAB it was rather a easy task:
<html><img src="monob.png" width="800" height="600"></html>
(Monoclinic basecentered BZ)

Use the [[MATLAB script]]