• R/O
  • HTTP
  • SSH
  • HTTPS

fermisurfer: Commit

fermisurfer Git


Commit MetaInfo

Revisionfe4d3999aa301f62aac81d0936a507e52361b235 (tree)
Zeit2017-05-10 00:52:26
Autormitsuaki1987 <kawamitsuaki@gmai...>
Commitermitsuaki1987

Log Message

Add function for the 2D Fermi surface. It still has bugs.

Ändern Zusammenfassung

Diff

--- a/doc/fermisurfer.doxygen
+++ b/doc/fermisurfer.doxygen
@@ -91,7 +91,7 @@ ALLOW_UNICODE_NAMES = NO
9191 # Ukrainian and Vietnamese.
9292 # The default value is: English.
9393
94-OUTPUT_LANGUAGE = Japanese
94+OUTPUT_LANGUAGE = English
9595
9696 # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
9797 # descriptions after the members that are listed in the file and class
@@ -1505,7 +1505,7 @@ USE_MATHJAX = YES
15051505 # The default value is: HTML-CSS.
15061506 # This tag requires that the tag USE_MATHJAX is set to YES.
15071507
1508-MATHJAX_FORMAT = NativeMML
1508+MATHJAX_FORMAT = HTML-CSS
15091509
15101510 # When MathJax is enabled you need to specify the location relative to the HTML
15111511 # output directory using the MATHJAX_RELPATH option. The destination directory
@@ -1518,7 +1518,7 @@ MATHJAX_FORMAT = NativeMML
15181518 # The default value is: http://cdn.mathjax.org/mathjax/latest.
15191519 # This tag requires that the tag USE_MATHJAX is set to YES.
15201520
1521-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
1521+MATHJAX_RELPATH = https://cdn.mathjax.org/mathjax/latest
15221522
15231523 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
15241524 # extension names that should be enabled during MathJax rendering. For example
@@ -2050,7 +2050,7 @@ INCLUDE_FILE_PATTERNS =
20502050 # recursively expanded use the := operator instead of the = operator.
20512051 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
20522052
2053-PREDEFINED =
2053+PREDEFINED = _OPENMP
20542054
20552055 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
20562056 # tag can be used to specify a list of macro names that should be expanded. The
--- a/src/Makefile
+++ b/src/Makefile
@@ -17,7 +17,8 @@ initialize.o \
1717 kumo.o \
1818 menu.o \
1919 operation.o \
20-read_file.o
20+read_file.o \
21+section.o
2122
2223 HEADERS= \
2324 basic_math.h \
@@ -31,6 +32,7 @@ kumo.h \
3132 menu.h \
3233 operation.h \
3334 read_file.h \
35+section.h \
3436 variable.h
3537
3638 all:fermisurfer bxsf2frmsf
@@ -67,3 +69,4 @@ kumo.o:$(HEADERS)
6769 menu.o:$(HEADERS)
6870 operation.o:$(HEADERS)
6971 read_file.o:$(HEADERS)
72+section.o:$(HEADERS)
--- a/src/bz_lines.c
+++ b/src/bz_lines.c
@@ -37,7 +37,7 @@ THE SOFTWARE.
3737 /**
3838 Judge wheser this line is the edge of 1st BZ
3939 */
40-int bragg_vert(
40+static int bragg_vert(
4141 int ibr /**< [in] Index of a Bragg plane*/,
4242 int jbr /**< [in] Index of a Bragg plane*/,
4343 int nbr /**< [in] */,
@@ -95,17 +95,16 @@ int bragg_vert(
9595 this line is not a BZ boundary
9696 */
9797 return 0;
98- /**/
9998 }/* bragg_vert */
10099 /**
101100 Compute Brillouin zone boundariy lines
102101 */
103102 void bz_lines() {
104103 /**/
105- int ibr, jbr, nbr, ibzl, i, j, lvert;
104+ int ibr, jbr, nbr, i, j, lvert;
106105 GLfloat vert[2][3];
107106 /**/
108- ibzl = 0;
107+ nbzl = 0;
109108 /**/
110109 for (ibr = 0; ibr < 26; ++ibr) {
111110 for (jbr = 0; jbr < 26; ++jbr) {
@@ -119,26 +118,8 @@ void bz_lines() {
119118 lvert = bragg_vert(ibr, jbr, nbr, vert[1], vert[0]);
120119 if (lvert == 0) continue;
121120 /**/
122- if (query == 1) {
123- nbzl = nbzl + 1;
124- }
125- else {
126- for (i = 0; i<2; ++i) for (j = 0; j<3; ++j) bzl[ibzl][i][j] = vert[i][j];
127- ibzl = ibzl + 1;
128- }
129- /**/
130- }
131- }
132- /**/
133- if (query == 1) {
134- printf(" # of lines for BZ : %d\n", nbzl);
135- /**/
136- bzl = (GLfloat***)malloc(nbzl * sizeof(GLfloat*));
137- for (ibzl = 0; ibzl < nbzl; ++ibzl) {
138- bzl[ibzl] = (GLfloat**)malloc(2 * sizeof(GLfloat*));
139- for (i = 0; i < 2; ++i) {
140- bzl[ibzl][i] = (GLfloat*)malloc(3 * sizeof(GLfloat));
141- }/*for (i = 0; i < 2; ++i)*/
142- }/*for (ibzl = 0; ibzl < nbzl; ++ibzl)*/
143- }/*if (query == 1)*/
144-} /* bz_lines */
121+ for (i = 0; i < 2; ++i) for (j = 0; j < 3; ++j) bzl[nbzl][i][j] = vert[i][j];
122+ nbzl = nbzl + 1;
123+ }/*for (jbr = 0; jbr < 26; ++jbr)*/
124+ }/*for (ibr = 0; ibr < 26; ++ibr)*/
125+}/*bz_lines*/
--- a/src/calc_nodeline.c
+++ b/src/calc_nodeline.c
@@ -39,139 +39,118 @@ THE SOFTWARE.
3939 void calc_nodeline() {
4040 int ib, itri, i, j, nnl0, ithread;
4141 GLfloat mprod[2];
42- /*
43- Query
44- */
42+
4543 #pragma omp parallel default(none) \
46- shared(nb,nnl,matp,ntri,ntri_th) \
47- private(ib,itri,mprod,nnl0,ithread)
44+ shared(nb,nnl,matp,kvnl,kvp,ntri,ntri_th,query) \
45+ private(ib,itri,mprod,i,nnl0,ithread)
4846 {
4947 ithread = get_thread();
5048 for (ib = 0; ib < nb; ib++) {
51- nnl0 = 0;
49+ if(query == 1) nnl0 = 0;
50+ else nnl0 = ntri_th[ib][ithread];
5251 #pragma omp for
5352 for (itri = 0; itri < ntri[ib]; ++itri) {
5453 /**/
5554 mprod[0] = matp[ib][itri][0] * matp[ib][itri][1];
5655 mprod[1] = matp[ib][itri][1] * matp[ib][itri][2];
5756 /**/
58- if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][1]) < 0.00001) {
57+ if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][1]) < 0.00001) {
58+ if (query == 0) {
59+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][0][i] = kvp[ib][itri][0][i];
60+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][1][i] = kvp[ib][itri][1][i];
61+ }/*if (query == 0)*/
5962 nnl0 += 1;
60- }
61- else if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001) {
63+ }/*if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][1]) < 0.00001)*/
64+ else if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001) {
65+ if (query == 0) {
66+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][0][i] = kvp[ib][itri][0][i];
67+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][1][i] = kvp[ib][itri][2][i];
68+ }/*if (query == 0)*/
6269 nnl0 += 1;
63- }
64- else if (fabsf(matp[ib][itri][1]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001) {
70+ }/*if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001)*/
71+ else if (fabsf(matp[ib][itri][1]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001) {
72+ if (query == 0) {
73+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][0][i] = kvp[ib][itri][1][i];
74+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][1][i] = kvp[ib][itri][2][i];
75+ }/*if (query == 0)*/
6576 nnl0 += 1;
66- }
77+ }/*if (fabsf(matp[ib][itri][1]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001)*/
6778 else if (mprod[0] < 0.0) {
6879 if (mprod[1] < 0.0) {
80+ if (query == 0) {
81+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][0][i] =
82+ (matp[ib][itri][0] * kvp[ib][itri][1][i] - matp[ib][itri][1] * kvp[ib][itri][0][i])
83+ / (matp[ib][itri][0] - matp[ib][itri][1]);
84+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][1][i] =
85+ (matp[ib][itri][1] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][1][i])
86+ / (matp[ib][itri][1] - matp[ib][itri][2]);
87+ }/*if (query == 0)*/
6988 nnl0 += 1;
70- }
89+ }/*if (mprod[1] < 0.0)*/
7190 else {
91+ if (query == 0) {
92+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][0][i] =
93+ (matp[ib][itri][0] * kvp[ib][itri][1][i] - matp[ib][itri][1] * kvp[ib][itri][0][i])
94+ / (matp[ib][itri][0] - matp[ib][itri][1]);
95+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][1][i] =
96+ (matp[ib][itri][0] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][0][i])
97+ / (matp[ib][itri][0] - matp[ib][itri][2]);
98+ }/*if (query == 0)*/
7299 nnl0 += 1;
73100 }
74- }
101+ }/* else if (mprod[0] < 0.0)*/
75102 else if (mprod[1] < 0.0) {
103+ if (query == 0) {
104+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][0][i] =
105+ (matp[ib][itri][0] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][0][i])
106+ / (matp[ib][itri][0] - matp[ib][itri][2]);
107+ for (i = 0; i < 3; ++i)kvnl[ib][nnl0][1][i] =
108+ (matp[ib][itri][1] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][1][i])
109+ / (matp[ib][itri][1] - matp[ib][itri][2]);
110+ }/*if (query == 0)*/
76111 nnl0 += 1;
77- }
112+ }/*else if (mprod[1] < 0.0)*/
78113 }/*for (itri = 0; itri < ntri[ib]; ++itri)*/
79- ntri_th[ib][ithread] = nnl0;
114+ if (query == 1) ntri_th[ib][ithread] = nnl0;
80115 }/*for (ib = 0; ib < nb; ib++)*/
81116 }/* End of parallel region */
82117 /*
83- Sum node-lines in all threads
84- */
85- for (ib = 0; ib < nb; ib++) {
86- for (ithread = 1; ithread < nthreads; ithread++) {
87- ntri_th[ib][ithread] += ntri_th[ib][ithread - 1];
88- }
89- nnl[ib] = ntri_th[ib][nthreads - 1];
90- for (ithread = nthreads - 1; ithread > 0; ithread--) {
91- ntri_th[ib][ithread] = ntri_th[ib][ithread - 1];
92- }
93- ntri_th[ib][0] = 0;
94- }
95- printf(" band # of nodeline\n");
96- for (ib = 0; ib < nb; ib++) {
97- printf(" %d %d\n", ib + 1, nnl[ib]);
98- }
99- /*
100118 Allocation of nodeline
101119 */
102- kvnl = (GLfloat****)malloc(nb * sizeof(GLfloat***));
103- kvnl_rot = (GLfloat****)malloc(nb * sizeof(GLfloat***));
104- for (ib = 0; ib < nb; ++ib) {
105- kvnl[ib] = (GLfloat***)malloc(nnl[ib] * sizeof(GLfloat**));
106- kvnl_rot[ib] = (GLfloat***)malloc(nnl[ib] * sizeof(GLfloat**));
107- for (i = 0; i < nnl[ib]; ++i) {
108- kvnl[ib][i] = (GLfloat**)malloc(2 * sizeof(GLfloat*));
109- kvnl_rot[ib][i] = (GLfloat**)malloc(2 * sizeof(GLfloat*));
110- for (j = 0; j < 2; ++j) {
111- kvnl[ib][i][j] = (GLfloat*)malloc(3 * sizeof(GLfloat));
112- kvnl_rot[ib][i][j] = (GLfloat*)malloc(3 * sizeof(GLfloat));
120+ if (query == 1) {
121+ /*
122+ Sum node-lines in all threads
123+ */
124+ for (ib = 0; ib < nb; ib++) {
125+ for (ithread = 1; ithread < nthreads; ithread++) {
126+ ntri_th[ib][ithread] += ntri_th[ib][ithread - 1];
113127 }
114- }
115- }
116- /**/
117-#pragma omp parallel default(none) \
118- shared(nb,nnl,matp,kvnl,kvp,ntri,ntri_th) \
119- private(ib,itri,mprod,i,nnl0,ithread)
120- {
121- ithread = get_thread();
128+ nnl[ib] = ntri_th[ib][nthreads - 1];
129+ for (ithread = nthreads - 1; ithread > 0; ithread--) {
130+ ntri_th[ib][ithread] = ntri_th[ib][ithread - 1];
131+ }
132+ ntri_th[ib][0] = 0;
133+ }/*for (ib = 0; ib < nb; ib++)*/
134+ printf(" band # of nodeline\n");
122135 for (ib = 0; ib < nb; ib++) {
123- nnl0 = ntri_th[ib][ithread];
124-#pragma omp for
125- for (itri = 0; itri < ntri[ib]; ++itri) {
126- /**/
127- mprod[0] = matp[ib][itri][0] * matp[ib][itri][1];
128- mprod[1] = matp[ib][itri][1] * matp[ib][itri][2];
129- /**/
130- if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][1]) < 0.00001) {
131- for (i = 0; i<3; ++i)kvnl[ib][nnl0][0][i] = kvp[ib][itri][0][i];
132- for (i = 0; i<3; ++i)kvnl[ib][nnl0][1][i] = kvp[ib][itri][1][i];
133- nnl0 += 1;
134- }
135- else if (fabsf(matp[ib][itri][0]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001) {
136- for (i = 0; i<3; ++i)kvnl[ib][nnl0][0][i] = kvp[ib][itri][0][i];
137- for (i = 0; i<3; ++i)kvnl[ib][nnl0][1][i] = kvp[ib][itri][2][i];
138- nnl0 += 1;
139- }
140- else if (fabsf(matp[ib][itri][1]) < 0.00001 && fabsf(matp[ib][itri][2]) < 0.00001) {
141- for (i = 0; i<3; ++i)kvnl[ib][nnl0][0][i] = kvp[ib][itri][1][i];
142- for (i = 0; i<3; ++i)kvnl[ib][nnl0][1][i] = kvp[ib][itri][2][i];
143- nnl0 += 1;
144- }
145- else if (mprod[0] < 0.0) {
146- if (mprod[1] < 0.0) {
147- for (i = 0; i<3; ++i)kvnl[ib][nnl0][0][i] =
148- (matp[ib][itri][0] * kvp[ib][itri][1][i] - matp[ib][itri][1] * kvp[ib][itri][0][i])
149- / (matp[ib][itri][0] - matp[ib][itri][1]);
150- for (i = 0; i<3; ++i)kvnl[ib][nnl0][1][i] =
151- (matp[ib][itri][1] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][1][i])
152- / (matp[ib][itri][1] - matp[ib][itri][2]);
153- nnl0 += 1;
154- }
155- else {
156- for (i = 0; i<3; ++i)kvnl[ib][nnl0][0][i] =
157- (matp[ib][itri][0] * kvp[ib][itri][1][i] - matp[ib][itri][1] * kvp[ib][itri][0][i])
158- / (matp[ib][itri][0] - matp[ib][itri][1]);
159- for (i = 0; i<3; ++i)kvnl[ib][nnl0][1][i] =
160- (matp[ib][itri][0] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][0][i])
161- / (matp[ib][itri][0] - matp[ib][itri][2]);
162- nnl0 += 1;
163- }
164- }
165- else if (mprod[1] < 0.0) {
166- for (i = 0; i<3; ++i)kvnl[ib][nnl0][0][i] =
167- (matp[ib][itri][0] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][0][i])
168- / (matp[ib][itri][0] - matp[ib][itri][2]);
169- for (i = 0; i<3; ++i)kvnl[ib][nnl0][1][i] =
170- (matp[ib][itri][1] * kvp[ib][itri][2][i] - matp[ib][itri][2] * kvp[ib][itri][1][i])
171- / (matp[ib][itri][1] - matp[ib][itri][2]);
172- nnl0 += 1;
173- }
174- }/*for (itri = 0; itri < ntri[ib]; ++itri)*/
136+ printf(" %d %d\n", ib + 1, nnl[ib]);
175137 }/*for (ib = 0; ib < nb; ib++)*/
176- }/* End of parallel region */
138+ /*
139+ Allocation of nodeline
140+ */
141+ kvnl = (GLfloat****)malloc(nb * sizeof(GLfloat***));
142+ kvnl_rot = (GLfloat****)malloc(nb * sizeof(GLfloat***));
143+ for (ib = 0; ib < nb; ++ib) {
144+ kvnl[ib] = (GLfloat***)malloc(nnl[ib] * sizeof(GLfloat**));
145+ kvnl_rot[ib] = (GLfloat***)malloc(nnl[ib] * sizeof(GLfloat**));
146+ for (i = 0; i < nnl[ib]; ++i) {
147+ kvnl[ib][i] = (GLfloat**)malloc(2 * sizeof(GLfloat*));
148+ kvnl_rot[ib][i] = (GLfloat**)malloc(2 * sizeof(GLfloat*));
149+ for (j = 0; j < 2; ++j) {
150+ kvnl[ib][i][j] = (GLfloat*)malloc(3 * sizeof(GLfloat));
151+ kvnl_rot[ib][i][j] = (GLfloat*)malloc(3 * sizeof(GLfloat));
152+ }/*for (j = 0; j < 2; ++j)*/
153+ }/*for (i = 0; i < nnl[ib]; ++i)*/
154+ }/*for (ib = 0; ib < nb; ++ib)*/
155+ }/*if (query == 1)*/
177156 }/*void calc_nodeline()*/
--- a/src/draw.c
+++ b/src/draw.c
@@ -34,7 +34,7 @@ THE SOFTWARE.
3434 /**
3535 Draw Fermi surfaces
3636 */
37-void draw_fermi() {
37+static void draw_fermi() {
3838 int i, j, ib, itri;
3939 GLfloat vect[3];
4040 /*
@@ -128,7 +128,7 @@ void draw_fermi() {
128128 /**
129129 Draw lines of BZ boundaries
130130 */
131-void draw_bz_lines() {
131+static void draw_bz_lines() {
132132 int ibzl, i, j;
133133 GLfloat bzl2[3], bvec2[3][3], linecolor[4];
134134 /*
@@ -167,7 +167,8 @@ void draw_bz_lines() {
167167 for (j = 0; j < 3; ++j) {
168168 bvec2[i][j] = rot[j][0] * bvec[i][0]
169169 + rot[j][1] * bvec[i][1]
170- + rot[j][2] * bvec[i][2];
170+ + rot[j][2] * bvec[i][2]
171+ + trans[j];
171172 }
172173 }
173174 glBegin(GL_LINE_STRIP);
@@ -190,14 +191,29 @@ void draw_bz_lines() {
190191 for (i = 0; i<3; ++i) bzl2[i] = trans[i] + bvec2[0][i] + bvec2[1][i]; glVertex3fv(bzl2);
191192 glEnd();
192193 }
193- /**/
194+ /*
195+ Section for the 2D Fermi line
196+ */
197+ if (lsection == 1) {
198+ glBegin(GL_POLYGON);
199+ glNormal3fv(secvec);
200+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, white);
201+ for (ibzl = 0; ibzl < nbzl2d; ++ibzl) {
202+ for (j = 0; j < 3; ++j)
203+ bzl2[j] = rot[j][0] * bzl2d[ibzl][0]
204+ + rot[j][1] * bzl2d[ibzl][1]
205+ + rot[j][2] * bzl2d[ibzl][2]
206+ + trans[j];
207+ glVertex3fv(bzl2);
208+ }
209+ glEnd();
210+ }/*if (lsection == 1)*/
194211 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black);
195- /**/
196212 } /* draw bz_lines */
197213 /**
198214 Draw color scale
199215 */
200-void draw_colorbar()
216+static void draw_colorbar()
201217 {
202218 int i, j;
203219 GLfloat mat2, barcolor[4];
@@ -301,7 +317,7 @@ void draw_colorbar()
301317 /**
302318 Draw points for the stereogram
303319 */
304-void draw_circles() {
320+static void draw_circles(double dx2d) {
305321 int i;
306322 GLfloat r;
307323 /**/
@@ -318,30 +334,53 @@ void draw_circles() {
318334 /**/
319335 glBegin(GL_TRIANGLE_FAN);
320336 glNormal3f(0.0, 0.0, 1.0);
321- glVertex3f(0.7, scl, 0.0);
337+ glVertex3f(0.7 - dx2d, scl, 0.0);
322338 for (i = 0; i <= 20; i++) {
323- glVertex3f(r * cos((GLfloat)i / 20.0 * 6.283185307) + 0.7,
339+ glVertex3f(r * cos((GLfloat)i / 20.0 * 6.283185307) + 0.7 - dx2d,
324340 r * sin((GLfloat)i / 20.0 * 6.283185307) + scl, 0.0);
325341 }
326342 glEnd();
327343 /**/
328344 glBegin(GL_TRIANGLE_FAN);
329345 glNormal3f(0.0, 0.0, 1.0);
330- glVertex3f(-0.7, scl, 0.0);
346+ glVertex3f(-0.7 - dx2d, scl, 0.0);
331347 for (i = 0; i <= 20; i++) {
332- glVertex3f(r * cos((GLfloat)i / 20.0 * 6.283185307) - 0.7,
348+ glVertex3f(r * cos((GLfloat)i / 20.0 * 6.283185307) - 0.7 - dx2d,
333349 r * sin((GLfloat)i / 20.0 * 6.283185307) + scl, 0.0);
334350 }
335351 glEnd();
336352 }/*void draw_circles*/
337353 /**
354+ Draw Fermi lines
355+*/
356+static void draw_fermi_line() {
357+ int i, ib, itri;
358+ GLfloat vect[3];
359+
360+ glLineWidth(2.0);
361+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, black);
362+ glBegin(GL_LINES);
363+ for (ib = 0; ib < nb; ib++) {
364+ if (draw_band[ib] == 1) {
365+ for (itri = 0; itri < n2d[ib]; ++itri) {
366+ for (i = 0; i < 2; ++i) {
367+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, clr2d[ib][itri][i]);
368+ glVertex3fv(kv2d[ib][itri][i]);
369+ }/*for (i = 0; i < 2; ++i)*/
370+ }/*for (itri = 0; itri < nnl[ib]; ++itri)*/
371+ }/*if (draw_band[ib] == 1)*/
372+ }/* for (ib = 0; ib < nb; ib++)*/
373+ glEnd();
374+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black);
375+}/*void draw_fermi_line*/
376+ /**
338377 Glut Display function
339378 */
340379 void display()
341380 {
342381 GLfloat pos[] = { 1.0, 1.0, 1.0, 0.0 };
343382 GLfloat amb[] = { 0.2, 0.2, 0.2, 0.0 };
344- double dx, theta, posz, phi;
383+ double dx, dx2d, theta, posz, phi;
345384 GLfloat pos1[4], pos2[4];
346385 /**/
347386 if (lstereo == 2) {
@@ -380,6 +419,8 @@ void display()
380419 theta = 0.0;
381420 dx = 0.0;
382421 }
422+ if (lsection == 1) dx2d = 0.7;
423+ else dx2d = 0.0;
383424 /*
384425 Initialize
385426 */
@@ -394,6 +435,7 @@ void display()
394435 */
395436 if (lstereo == 1) {
396437 glLightfv(GL_LIGHT0, GL_POSITION, pos);
438+ glTranslated(-dx2d, 0.0, 0.0);
397439 /*
398440 Draw color scale
399441 */
@@ -401,8 +443,8 @@ void display()
401443 }
402444 else {
403445 glLightfv(GL_LIGHT0, GL_POSITION, pos1);
404- draw_circles();
405- glTranslated(-dx, 0.0, 0.0);
446+ draw_circles(dx2d);
447+ glTranslated(-dx-dx2d, 0.0, 0.0);
406448 glRotated(theta, 0.0, 1.0, 0.0);
407449 }
408450 glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
@@ -427,7 +469,7 @@ void display()
427469 gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
428470 glLightfv(GL_LIGHT0, GL_POSITION, pos2);
429471 /**/
430- glTranslated(dx, 0.0, 0.0);
472+ glTranslated(dx-dx2d, 0.0, 0.0);
431473 glRotated(-theta, 0.0, 1.0, 0.0);
432474 /**/
433475 glScaled(scl, scl, scl);
@@ -436,6 +478,22 @@ void display()
436478 /**/
437479 glPopMatrix();
438480 }
439- /**/
481+ /*
482+ Draw 2D Fermi line
483+ */
484+ if (lsection == 1) {
485+ glPushMatrix();
486+ glLoadIdentity();
487+ gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
488+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
489+ /**/
490+ if (lstereo == 1) glTranslated(dx2d, 0.0, 0.0);
491+ else glTranslated(2.0 * dx2d, 0.0, 0.0);
492+ /**/
493+ glScaled(scl, scl, scl);
494+ draw_fermi_line();
495+ /**/
496+ glPopMatrix();
497+ }/*if (lsection == 1)*/
440498 glutSwapBuffers();
441499 }/*void display*/
--- a/src/fermisurfer.c
+++ b/src/fermisurfer.c
@@ -51,6 +51,7 @@ with a color plot of the arbitraly matrix element
5151 #include "calc_nodeline.h"
5252 #include "bz_lines.h"
5353 #include "free_patch.h"
54+#include "section.h"
5455
5556 #if defined(MAC)
5657 #include <GLUT/glut.h>
@@ -116,20 +117,17 @@ int main(
116117 init_corner();
117118 bragg_vector();
118119 /**/
119- query = 1;
120- bz_lines();
121- query = 0;
122120 bz_lines();
123121 /**/
124122 max_and_min_bz();
125123 /**/
126- query = 1;
127- fermi_patch();
128- query = 0;
129- fermi_patch();
130- calc_nodeline();
131- /**/
124+ query = 1; fermi_patch();
125+ query = 0; fermi_patch();
132126 max_and_min();
127+ query = 1; calc_nodeline();
128+ query = 0; calc_nodeline();
129+ query = 1; calc_section();
130+ query = 0; calc_section();
133131 /*
134132 Description
135133 */
--- a/src/free_patch.c
+++ b/src/free_patch.c
@@ -33,7 +33,9 @@ THE SOFTWARE.
3333 */
3434 void free_patch() {
3535 int ib, i0, i1;
36-
36+ /*
37+ Fermi patch
38+ */
3739 for (ib = 0; ib < nb; ++ib) {
3840 for (i0 = 0; i0 < ntri[ib]; ++i0) {
3941 for (i1 = 0; i1 < 3; ++i1) {
@@ -61,21 +63,40 @@ void free_patch() {
6163 free(kvp);
6264 free(nmlp_rot);
6365 free(kvp_rot);
64-
66+ /*
67+ Nodal line
68+ */
6569 for (ib = 0; ib < nb; ++ib) {
6670 for (i0 = 0; i0 < nnl[ib]; ++i0) {
6771 for (i1 = 0; i1 < 2; ++i1) {
6872 free(kvnl[ib][i0][i1]);
6973 free(kvnl_rot[ib][i0][i1]);
70- }
74+ }/*for (i1 = 0; i1 < 2; ++i1)*/
7175 free(kvnl[ib][i0]);
7276 free(kvnl_rot[ib][i0]);
73- }
77+ }/*for (i0 = 0; i0 < nnl[ib]; ++i0)*/
7478 free(kvnl[ib]);
7579 free(kvnl_rot[ib]);
76- }
80+ }/*for (ib = 0; ib < nb; ++ib)*/
7781 free(kvnl);
7882 free(kvnl_rot);
83+ /*
84+ 2D Fermi line
85+ */
86+ for (ib = 0; ib < nb; ++ib) {
87+ for (i0 = 0; i0 < n2d[ib]; ++i0) {
88+ for (i1 = 0; i1 < 2; ++i1) {
89+ free(kv2d[ib][i0][i1]);
90+ free(clr2d[ib][i0][i1]);
91+ }/*for (i1 = 0; i1 < 2; ++i1)*/
92+ free(kv2d[ib][i0]);
93+ free(clr2d[ib][i0]);
94+ }/*for (i0 = 0; i0 < n2d[ib]; ++i0)*/
95+ free(kv2d[ib]);
96+ free(clr2d[ib]);
97+ }/*for (ib = 0; ib < nb; ++ib)*/
98+ free(kv2d);
99+ free(clr2d);
79100 }/*void free_patch()*/
80101 /**
81102 Compute Max. & Min. of matrix elements.
--- a/src/initialize.c
+++ b/src/initialize.c
@@ -254,6 +254,7 @@ void initialize_val() {
254254 lcolorbar = 1;
255255 lstereo = 1;
256256 lmouse = 1;
257+ lsection = 0;
257258 itet = 0;
258259 scl = 1.0;
259260 trans[0] = 0.0; trans[1] = 0.0; trans[2] = 0.0;
--- a/src/menu.c
+++ b/src/menu.c
@@ -30,6 +30,8 @@ THE SOFTWARE.
3030 #include "fermi_patch.h"
3131 #include "calc_nodeline.h"
3232 #include "kumo.h"
33+#include "initialize.h"
34+#include "section.h"
3335
3436 #if defined(MAC)
3537 #include <GLUT/glut.h>
@@ -65,13 +67,6 @@ void main_menu(int value /**< [in] Selected menu*/) {
6567 free(mat);
6668 free(ntri);
6769 free(draw_band);
68- for (ibzl = 0; ibzl < nbzl; ++ibzl) {
69- for (i = 0; i < 2; ++i) {
70- free(bzl[ibzl][i]);
71- }
72- free(bzl[ibzl]);
73- }
74- free(bzl);
7570 free(nnl);
7671 exit(0);
7772 }
@@ -105,13 +100,13 @@ void menu_shiftEF(int value /**< [in] Selected menu*/)
105100 if (ierr != 1) printf("error ! reading ef");
106101 /**/
107102 free_patch();
108- query = 1;
109- fermi_patch();
110- query = 0;
111- fermi_patch();
112- calc_nodeline();
113- /**/
103+ query = 1; fermi_patch();
104+ query = 0; fermi_patch();
114105 max_and_min();
106+ query = 1; calc_nodeline();
107+ query = 0; calc_nodeline();
108+ query = 1; calc_section();
109+ query = 0; calc_section();
115110 /**/
116111 glutPostRedisplay();
117112 }
@@ -133,13 +128,13 @@ void menu_interpol(int value /**< [in] Selected menu*/)
133128 /**/
134129 interpol_energy();
135130 free_patch();
136- query = 1;
137- fermi_patch();
138- query = 0;
139- fermi_patch();
140- calc_nodeline();
141- /**/
131+ query = 1; fermi_patch();
132+ query = 0; fermi_patch();
142133 max_and_min();
134+ query = 1; calc_nodeline();
135+ query = 0; calc_nodeline();
136+ query = 1; calc_section();
137+ query = 0; calc_section();
143138 /**/
144139 glutPostRedisplay();
145140 }
@@ -285,13 +280,13 @@ void menu_bzmode(int value /**<[in] Selected menu*/) {
285280 fbz = 1;
286281 /**/
287282 free_patch();
288- query = 1;
289- fermi_patch();
290- query = 0;
291- fermi_patch();
292- calc_nodeline();
293- /**/
283+ query = 1; fermi_patch();
284+ query = 0; fermi_patch();
294285 max_and_min();
286+ query = 1; calc_nodeline();
287+ query = 0; calc_nodeline();
288+ query = 1; calc_section();
289+ query = 0; calc_section();
295290 /**/
296291 glutPostRedisplay();
297292 }
@@ -299,13 +294,13 @@ void menu_bzmode(int value /**<[in] Selected menu*/) {
299294 fbz = -1;
300295 /**/
301296 free_patch();
302- query = 1;
303- fermi_patch();
304- query = 0;
305- fermi_patch();
306- calc_nodeline();
307- /**/
297+ query = 1; fermi_patch();
298+ query = 0; fermi_patch();
308299 max_and_min();
300+ query = 1; calc_nodeline();
301+ query = 0; calc_nodeline();
302+ query = 1; calc_section();
303+ query = 0; calc_section();
309304 /**/
310305 glutPostRedisplay();
311306 }
@@ -341,6 +336,61 @@ void menu_stereo(int value /**<[in] Selected menu*/) {
341336 }
342337 } /* menu_stereo */
343338 /**
339+ Menu for 2D Fermi lines
340+*/
341+void menu_section(int value) /**<[in] Selected menu*/ {
342+ int ierr, ii, jj, ib;
343+ GLfloat vec[3];
344+
345+ if (value == 1) {
346+ if (lsection != 1) {
347+ lsection = 1;
348+ glutPostRedisplay();
349+ }
350+ else {
351+ lsection = 0;
352+ glutPostRedisplay();
353+ }
354+ }/*if (value == 1)*/
355+ else if (value > 1) {
356+ if (value == 2) secscale = 1.0;
357+ else secscale = 0.0;
358+
359+ printf(" New Millor index : ");
360+ ierr = scanf("%f %f %f", &vec[0], &vec[1], &vec[2]);
361+ /*
362+ Fractional -> Cartecian
363+ */
364+ for (ii = 0; ii < 3; ii++) {
365+ secvec[ii] = 0.0;
366+ for (jj = 0; jj < 3; jj++) {
367+ secvec[ii] += vec[jj] * bvec[jj][ii];
368+ }/*for (jj = 0; jj < 3; jj++)*/
369+ }/*for (ii = 0; ii < 3; ii++)*/
370+ /*
371+ Free variables for Fermi line
372+ */
373+ for (ib = 0; ib < nb; ++ib) {
374+ for (ii = 0; ii < n2d[ib]; ++ii) {
375+ for (jj = 0; jj < 2; ++jj) {
376+ free(kv2d[ib][ii][jj]);
377+ free(clr2d[ib][ii][jj]);
378+ }/*for (jj = 0; jj < 2; ++jj)*/
379+ free(kv2d[ib][ii]);
380+ free(clr2d[ib][ii]);
381+ }/*for (ii = 0; ii < n2d[ib]; ++ii)*/
382+ free(kv2d[ib]);
383+ free(clr2d[ib]);
384+ }/*for (ib = 0; ib < nb; ++ib)*/
385+ free(kv2d);
386+ free(clr2d);
387+
388+ query = 1; calc_section();
389+ query = 0; calc_section();
390+ glutPostRedisplay();
391+ }/*else if (value > 1)*/
392+} /*void menu_section*/
393+/**
344394 On/Off Colorbar
345395 */
346396 void menu_colorbar(int value /**<[in] Selected menu*/) {
@@ -363,12 +413,13 @@ void menu_tetra(int value) /**<[in] Selected menu*/ {
363413 itet = value;
364414 init_corner();
365415 free_patch();
366- query = 1;
367- fermi_patch();
368- query = 0;
369- fermi_patch();
370- calc_nodeline();
416+ query = 1; fermi_patch();
417+ query = 0; fermi_patch();
371418 max_and_min();
419+ query = 1; calc_nodeline();
420+ query = 0; calc_nodeline();
421+ query = 1; calc_section();
422+ query = 0; calc_section();
372423 glutPostRedisplay();
373424 }
374425 } /* menu_tetra */
@@ -473,6 +524,15 @@ void FS_ModifyMenu(int status)
473524 if (lstereo == 3) glutAddMenuEntry("[x] Cross", 3);
474525 else glutAddMenuEntry("[ ] Cross", 3);
475526 /*
527+ 2D Fermi lines
528+ */
529+ glutSetMenu(imenu_section);
530+ for (ib = 0; ib < 3; ib++) glutRemoveMenuItem(1);
531+ if (lsection == 1) glutAddMenuEntry("[x] Section", 1);
532+ else glutAddMenuEntry("[ ] Section", 1);
533+ glutAddMenuEntry("Modify section", 2);
534+ glutAddMenuEntry("Modify section (across Gamma)", 3);
535+ /*
476536 Tetrahedron
477537 */
478538 glutSetMenu(imenu_tetra);
@@ -584,6 +644,14 @@ void FS_CreateMenu()
584644 if (lstereo == 3) glutAddMenuEntry("[x] Cross", 3);
585645 else glutAddMenuEntry("[ ] Cross", 3);
586646 /*
647+ 2D Fermi lines
648+ */
649+ imenu_section = glutCreateMenu(menu_section);
650+ if (lsection == 1) glutAddMenuEntry("[x] Section", 1);
651+ else glutAddMenuEntry("[ ] Section", 1);
652+ glutAddMenuEntry("Modify section", 2);
653+ glutAddMenuEntry("Modify section (across Gamma)", 3);
654+ /*
587655 Tetrahedron
588656 */
589657 imenu_tetra = glutCreateMenu(menu_tetra);
@@ -607,6 +675,7 @@ void FS_CreateMenu()
607675 glutAddSubMenu("Node lines", imenu_nodeline);
608676 glutAddSubMenu("Color bar On/Off", imenu_colorbar);
609677 glutAddSubMenu("Stereogram", imenu_stereo);
678+ glutAddSubMenu("Section", imenu_section);
610679 glutAddSubMenu("Tetrahedron", imenu_tetra);
611680 glutAddMenuEntry("Exit", 9);
612681 glutAttachMenu(GLUT_RIGHT_BUTTON);
--- a/src/read_file.c
+++ b/src/read_file.c
@@ -84,6 +84,7 @@ void read_file(char *fname/**<[in] fname Input file name*/)
8484 ntri_th = (int**)malloc(nb * sizeof(int*));
8585 for (ib = 0; ib < nb; ib++) ntri_th[ib] = (int*)malloc(nthreads * sizeof(int));
8686 nnl = (int*)malloc(nb * sizeof(int));
87+ n2d = (int*)malloc(nb * sizeof(int));
8788 draw_band = (int*)malloc(nb * sizeof(int));
8889 for (ib = 0; ib < nb; ib++) draw_band[ib] = 1;
8990 /*
@@ -94,6 +95,8 @@ void read_file(char *fname/**<[in] fname Input file name*/)
9495 if (ierr == 0) printf("error ! reading bvec");
9596 printf(" bvec %d : %f %f %f \n", i + 1, bvec[i][0], bvec[i][1], bvec[i][2]);
9697 }
98+ for (i = 0; i < 3; ++i) secvec[i] = bvec[2][i];
99+ secscale = 0.0;
97100 /*
98101 Allocation of Kohn-Sham energies $ matrix elements
99102 */
--- a/src/variable.h
+++ b/src/variable.h
@@ -56,16 +56,17 @@ int nodeline; /**< Switch for node lines */
5656 int lcolorbar; /**< Switch for colorbar */
5757 int lstereo; /**< Switch for the stereogram */
5858 int lmouse; /**< Switch for the mouse function */
59+int lsection; /**< Switch for the 2D Fermi lines*/
5960 /*
6061 Menu
6162 */
62-int imenu_band, imenu_interpol, imenu_bgcolor, imenu_colorscale, imenu_bzmode,
63+int imenu_band, imenu_interpol, imenu_bgcolor, imenu_colorscale, imenu_bzmode, imenu_section,
6364 imenu_nodeline, imenu_colorbar, imenu_tetra, imenu_stereo, imenu_mouse, imenu;
6465 /*
6566 Variables for Brillouin zone boundaries
6667 */
6768 int nbzl; /**< The number of Lines of 1st Brillouin zone */
68-GLfloat ***bzl; /**< Lines of 1st BZ [nbzl][2][3] */
69+GLfloat bzl[676][2][3]; /**< Lines of 1st BZ [nbzl(max:26*26=676)][2][3] */
6970 GLfloat bragg[26][3]; /**< Bragg plane vectors */
7071 GLfloat brnrm[26]; /**< Norms of Bragg plane vectors */
7172 /*
@@ -88,6 +89,17 @@ int *nnl; /**< The number of nodeline */
8889 GLfloat ****kvnl; /**< K-vector of nodeline [nb][nnl][2][3] */
8990 GLfloat ****kvnl_rot; /**< K-vector of nodeline [nb][nnl][2][3] */
9091 /*
92+ 2D Fermi line
93+*/
94+GLfloat secvec[3]; /**< k-vector to define section*/
95+GLfloat secscale; /**0.0 or 1.0*/
96+GLfloat axis2d[2][3]; /**< k-vector to define section*/
97+int *n2d;
98+GLfloat ****kv2d;/**< k-vector for 2D plot[nb][n2d][2][2] */
99+GLfloat ****clr2d; /**< Matrix element for 2D plot[nb][n2d][2][4] */
100+int nbzl2d; /**< The number of Lines of 1st Brillouin zone */
101+GLfloat bzl2d[26][3]; /**< Lines of 1st BZ [nbzl2d(max:26)][3] */
102+/*
91103 Variables for mouse & cursorkey
92104 */
93105 GLfloat sx; /**< Scale of mouse movement */
Show on old repository browser