forked from lijiext/lammps
2856 lines
76 KiB
C++
2856 lines
76 KiB
C++
#include <vector>
|
|
#include "string.h"
|
|
#include "phonon.h"
|
|
#include "green.h"
|
|
#include "timer.h"
|
|
#include "global.h"
|
|
|
|
#ifdef UseSPG
|
|
extern "C"{
|
|
#include "spglib.h"
|
|
}
|
|
#endif
|
|
|
|
/*------------------------------------------------------------------------------
|
|
* Private method to evaluate the phonon dispersion curves
|
|
*----------------------------------------------------------------------------*/
|
|
void Phonon::pdisp()
|
|
{
|
|
// ask the output file name and write the header.
|
|
char str[MAXLINE];
|
|
for (int ii = 0; ii < 80; ++ii) printf("=");
|
|
printf("\n");
|
|
#ifdef UseSPG
|
|
// ask method to generate q-lines
|
|
int method = 2;
|
|
printf("Please select your method to generate the phonon dispersion:\n");
|
|
printf(" 1. Manual, should always work;\n");
|
|
printf(" 2. Automatic, works only for 3D crystals (CMS49-299).\nYour choice [2]: ");
|
|
if (count_words(fgets(str,MAXLINE,stdin)) > 0) method = atoi(strtok(str," \t\n\r\f"));
|
|
method = 2 - method%2;
|
|
printf("Your selection: %d\n", method);
|
|
#endif
|
|
printf("\nPlease input the filename to output the dispersion data [pdisp.dat]:");
|
|
if (count_words(fgets(str,MAXLINE,stdin)) < 1) strcpy(str, "pdisp.dat");
|
|
char *ptr = strtok(str," \t\n\r\f");
|
|
char *fname = new char[strlen(ptr)+1];
|
|
strcpy(fname,ptr);
|
|
|
|
// to store the nodes of the dispersion curve
|
|
std::vector<double> nodes; nodes.clear();
|
|
std::vector<std::string> ndstr; ndstr.clear();
|
|
std::vector<double *> qs, qe; qs.clear(); qe.clear();
|
|
std::vector<int> nqbin; nqbin.clear();
|
|
|
|
// now the calculate the dispersion curve
|
|
double qstr[3], qend[3];
|
|
int nq = MAX(MAX(dynmat->nx,dynmat->ny),dynmat->nz)/2+1;
|
|
qend[0] = qend[1] = qend[2] = 0.;
|
|
|
|
double *egvs = new double [ndim];
|
|
#ifdef UseSPG
|
|
if (method == 1){
|
|
#endif
|
|
while (1){
|
|
for (int i = 0; i < 3; ++i) qstr[i] = qend[i];
|
|
|
|
printf("\nPlease input the start q-point in unit of B1->B3, q to exit [%g %g %g]: ", qstr[0], qstr[1], qstr[2]);
|
|
int n = count_words(fgets(str, MAXLINE, stdin));
|
|
ptr = strtok(str, " \t\n\r\f");
|
|
if ((n == 1) && (strcmp(ptr,"q") == 0)) break;
|
|
else if (n >= 3){
|
|
qstr[0] = atof(ptr);
|
|
qstr[1] = atof(strtok(NULL, " \t\n\r\f"));
|
|
qstr[2] = atof(strtok(NULL, " \t\n\r\f"));
|
|
}
|
|
|
|
do printf("Please input the end q-point in unit of B1->B3: ");
|
|
while (count_words(fgets(str, MAXLINE, stdin)) < 3);
|
|
qend[0] = atof(strtok(str, " \t\n\r\f"));
|
|
qend[1] = atof(strtok(NULL, " \t\n\r\f"));
|
|
qend[2] = atof(strtok(NULL, " \t\n\r\f"));
|
|
|
|
printf("Please input the # of points along the line [%d]: ", nq);
|
|
if (count_words(fgets(str, MAXLINE, stdin)) > 0) nq = atoi(strtok(str," \t\n\r\f"));
|
|
nq = MAX(nq,2);
|
|
|
|
double *qtmp = new double [3];
|
|
for (int i = 0; i < 3; ++i) qtmp[i] = qstr[i];
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
for (int i = 0; i < 3; ++i) qtmp[i] = qend[i];
|
|
qe.push_back(qtmp);
|
|
|
|
nqbin.push_back(nq);
|
|
ndstr.push_back("");
|
|
}
|
|
ndstr.push_back("");
|
|
|
|
#ifdef UseSPG
|
|
} else {
|
|
|
|
memory->grow(atpos, dynmat->nucell, 3, "pdisp:atpos");
|
|
memory->grow(attyp, dynmat->nucell, "pdisp:attyp");
|
|
|
|
num_atom = dynmat->nucell;
|
|
// set default, in case system dimension under study is not 3.
|
|
for (int i = 0; i < dynmat->nucell; ++i)
|
|
for (int idim = 0; idim < 3; ++idim) atpos[i][idim] = 0.;
|
|
for (int i = 0; i < 3; ++i)
|
|
for (int j = 0; j < 3; ++j) latvec[i][j] = 0.;
|
|
for (int i = 0; i < 3; ++i) latvec[i][i] = 1.;
|
|
|
|
// get atomic type info
|
|
for (int i = 0; i < num_atom; ++i) attyp[i] = dynmat->attyp[i];
|
|
|
|
// get unit cell vector info
|
|
int ndim = 0;
|
|
for (int idim = 0; idim < 3; ++idim)
|
|
for (int jdim = 0; jdim < 3; ++jdim) latvec[jdim][idim] = dynmat->basevec[ndim++];
|
|
|
|
// get atom position in unit cell; fractional
|
|
for (int i = 0; i < num_atom; ++i)
|
|
for (int idim = 0; idim < sysdim; ++idim) atpos[i][idim] = dynmat->basis[i][idim];
|
|
|
|
// display the unit cell info read
|
|
printf("\n");
|
|
for (int ii = 0; ii < 80; ++ii) printf("-"); printf("\n");
|
|
printf("The basis vectors of the unit cell:\n");
|
|
for (int idim = 0; idim < 3; ++idim) printf(" A%d = %lg %lg %lg\n", idim+1, latvec[0][idim], latvec[1][idim], latvec[2][idim]);
|
|
printf("Atom(s) in the unit cell:\n");
|
|
printf(" No. type sx sy sz\n");
|
|
for (int i = 0; i < MIN(num_atom, NUMATOM); ++i) printf(" %d %d %lg %lg %lg\n", i+1, attyp[i], atpos[i][0], atpos[i][1], atpos[i][2]);
|
|
if (num_atom > NUMATOM) printf(" ... (%d atoms omitted.)\n", num_atom-NUMATOM);
|
|
|
|
char symbol[11];
|
|
double symprec = 1.e-4, pos[num_atom][3];
|
|
for (int i = 0; i < num_atom; ++i)
|
|
for (int j = 0; j < 3; ++j) pos[i][j] = atpos[i][j];
|
|
|
|
int spgnum = spg_get_international(symbol, latvec, pos, attyp, num_atom, symprec);
|
|
printf("The space group number of your unit cell is: %d => %s\n", spgnum, symbol);
|
|
for (int ii = 0; ii < 80; ++ii) printf("-"); printf("\n");
|
|
|
|
// angles
|
|
const double la = sqrt(latvec[0][0] * latvec[0][0] + latvec[0][1] * latvec[0][1] + latvec[0][2] * latvec[0][2]);
|
|
const double lb = sqrt(latvec[1][0] * latvec[1][0] + latvec[1][1] * latvec[1][1] + latvec[1][2] * latvec[1][2]);
|
|
const double lc = sqrt(latvec[2][0] * latvec[2][0] + latvec[2][1] * latvec[2][1] + latvec[2][2] * latvec[2][2]);
|
|
const double cosa = sqrt(latvec[1][0] * latvec[2][0] + latvec[1][1] * latvec[2][1] + latvec[1][2] * latvec[2][2])/(lb*lc);
|
|
const double cosg = sqrt(latvec[0][0] * latvec[1][0] + latvec[0][1] * latvec[1][1] + latvec[0][2] * latvec[1][2])/(la*lb);
|
|
double ivec[3][3];
|
|
ndim = 0;
|
|
for (int idim = 0; idim < 3; ++idim)
|
|
for (int jdim = 0; jdim < 3; ++jdim) ivec[jdim][idim] = dynmat->ibasevec[ndim++];
|
|
const double ka = sqrt(ivec[0][0] * ivec[0][0] + ivec[0][1] * ivec[0][1] + ivec[0][2] * ivec[0][2]);
|
|
const double kb = sqrt(ivec[1][0] * ivec[1][0] + ivec[1][1] * ivec[1][1] + ivec[1][2] * ivec[1][2]);
|
|
const double coskg = sqrt(ivec[0][0] * ivec[1][0] + ivec[0][1] * ivec[1][1] + ivec[0][2] * ivec[1][2])/(ka*kb);
|
|
|
|
double *qtmp;
|
|
if (spgnum >= 1 && spgnum <= 2){ // Triclinic system
|
|
if (fabs(coskg) > ZERO){ // A.14, TRI1a and TRI2a
|
|
|
|
ndstr.push_back("X");
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M/R");
|
|
|
|
// R-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
} else { // A.14, TRI1b and TRI2b
|
|
|
|
ndstr.push_back("X");
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = -0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[1] = qtmp[2] = 0.; qtmp[0] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = -0.5; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M/R");
|
|
|
|
// R-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = -0.5; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
}
|
|
|
|
} else if (spgnum >= 3 && spgnum <= 15){ // Monoclinic
|
|
|
|
if (symbol[0] == 'P'){ // MCL-P
|
|
const double eta = (1.-lb*cosa/lc)/(2.*(1.-cosa*cosa));
|
|
const double niu = 0.5 - eta * lc * cosa / lb;
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = eta; qtmp[2] = 1.-niu;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
// H-C
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = eta; qtmp[2] = 1.-niu;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("C");
|
|
|
|
// C-E
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("E");
|
|
|
|
// E-M1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 1.-eta; qtmp[2] = niu;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M_1");
|
|
|
|
// M1-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 1.-eta; qtmp[2] = niu;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A");
|
|
|
|
// A-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-H1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[2] = 1.-eta; qtmp[1] = niu;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H_1/M");
|
|
|
|
// M-D
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[2] = eta; qtmp[1] = 1.-niu;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("D");
|
|
|
|
// D-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/Y");
|
|
|
|
// Y-D
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("D");
|
|
|
|
} else { // MCL-C
|
|
|
|
if (coskg < 0.){ // MCLC1
|
|
const double xi = (2. - lb * cosa / lc) / (4.*(1.-cosa*cosa));
|
|
const double eta = 0.5 + 2.*xi*lc/lb*cosa;
|
|
const double psi = 0.75 - la * la /(4.*lb*lb*(1.-cosa*cosa));
|
|
const double phi = psi + (0.75 - psi) * lb / lc * cosa;
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F");
|
|
|
|
// F-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[1] = 1.-phi; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("I/I_1");
|
|
|
|
// I1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = -qtmp[0]; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F_1/Y");
|
|
|
|
// Y-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = psi; qtmp[1] = 1.-psi; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X_1/X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-psi; qtmp[1] = -qtmp[0]; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
} else if ( fabs(coskg) < ZERO) { // MCLC2
|
|
const double xi = (2. - lb * cosa / lc) / (4.*(1.-cosa*cosa));
|
|
const double eta = 0.5 + 2.*xi*lc/lb*cosa;
|
|
const double psi = 0.75 - la * la /(4.*lb*lb*(1.-cosa*cosa));
|
|
const double phi = psi + (0.75 - psi) * lb / lc * cosa;
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F");
|
|
|
|
// F-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[1] = 1.-phi; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("I/I_1");
|
|
|
|
// I1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = -qtmp[0]; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F_1/N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M");
|
|
|
|
} else {
|
|
|
|
double flag = lb / lc * cosa + lb * lb / (la * la *(1.-cosa*cosa));
|
|
if (fabs(flag) < ZERO){ // MCLC4
|
|
const double miu = 0.25*(1. + lb * lb / (la *la));
|
|
const double del = lb * lc * cosa / (2.*la*la);
|
|
const double xi = miu - 0.25 + (1. - lb * cosa / lc)/(4.*(1.-cosa*cosa));
|
|
const double eta = 0.5 + 2.*xi*lc/lb*cosa;
|
|
const double phi = 1. + xi - 2.*miu;
|
|
const double psi = eta - 2.*del;
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F");
|
|
|
|
// F-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
// H-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("I/H_1");
|
|
|
|
// H1-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-xi; qtmp[1] = -xi; qtmp[2] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y_1");
|
|
|
|
// Y1-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
} else if (flag < 1.){ // MCLC3
|
|
const double miu = 0.25*(1. + lb * lb / (la *la));
|
|
const double del = lb * lc * cosa / (2.*la*la);
|
|
const double xi = miu - 0.25 + (1. - lb * cosa / lc)/(4.*(1.-cosa*cosa));
|
|
const double eta = 0.5 + 2.*xi*lc/lb*cosa;
|
|
const double phi = 1. + xi - 2.*miu;
|
|
const double psi = eta - 2.*del;
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F");
|
|
|
|
// F-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
// H-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("I/H_1");
|
|
|
|
// I-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[2] = phi - 1.; qtmp[1] = psi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F_1/H_1");
|
|
|
|
// H1-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-xi; qtmp[1] = -xi; qtmp[2] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y_1");
|
|
|
|
// Y1-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
} else { // MCLC5
|
|
const double xi = (lb*lb/(la*la) + (1.-lb*cosa/lc)/(1.-cosa*cosa))*0.25;
|
|
const double eta = 0.5 + 2.*xi*lc*cosa/lb;
|
|
const double miu = 0.5*eta + lb * lb /(4.*la*la) - lb*lc/(2.*la*la)*cosa;
|
|
const double niu = 2.*miu - xi;
|
|
const double omg = (4.*niu - 1. - lb*lb*(1.-cosa*cosa)/(la*la))*lc/(2.*lb*cosa);
|
|
const double del = xi*lc*cosa/lb + omg*0.5 - 0.25;
|
|
const double rho = 1.-xi*la*la/(lb*lb);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = niu; qtmp[2] = omg;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F");
|
|
|
|
// F-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = niu; qtmp[2] = omg;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// L-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = rho; qtmp[1] = 1.-rho; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("I/I_1");
|
|
|
|
// I1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-rho; qtmp[1] = -qtmp[0]; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
// H-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-niu; qtmp[2] = 1.-omg;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F_1/H_1");
|
|
|
|
// H1-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-xi; qtmp[1] = -xi; qtmp[2] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y_1");
|
|
|
|
// Y1-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y_1");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
}
|
|
}
|
|
}
|
|
|
|
} else if (spgnum >= 16 && spgnum <= 74){ // Orthorhombic
|
|
|
|
if (symbol[0] == 'P'){ // ORC
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-S
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("S");
|
|
|
|
// S-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-U
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("U");
|
|
|
|
// U-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R");
|
|
|
|
// R-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("T");
|
|
|
|
// T-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/Y");
|
|
|
|
// Y-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("T/U");
|
|
|
|
// U-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X/S");
|
|
|
|
// S-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R");
|
|
|
|
} else if (symbol[0] == 'F'){ // ORCF
|
|
|
|
double flag = 1./(la*la) - 1./(lb*lb) - 1./(lc*lc);
|
|
if (fabs(flag) < ZERO){ // ORCF3
|
|
|
|
const double xi = 0.25 * (1. + la*la/(lb*lb) - la*la/(lc*lc));
|
|
const double eta = 0.25 * (1. + la*la/(lb*lb) + la*la/(lc*lc));
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("T");
|
|
|
|
// T-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-A1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A_1");
|
|
|
|
// A1-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y/X");
|
|
|
|
// X-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
} else if (flag > 0.){ // ORCF1
|
|
|
|
const double xi = 0.25 * (1. + la*la/(lb*lb) - la*la/(lc*lc));
|
|
const double eta = 0.25 * (1. + la*la/(lb*lb) + la*la/(lc*lc));
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("T");
|
|
|
|
// T-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-A1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A_1");
|
|
|
|
// A1-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y/T");
|
|
|
|
// T-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 1.-eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X_1/X");
|
|
|
|
// X-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
} else { // ORCF2
|
|
|
|
const double eta = 0.25 * (1. + la*la/(lb*lb) - la*la/(lc*lc));
|
|
const double phi = 0.25 * (1. + lc*lc/(lb*lb) - lc*lc/(la*la));
|
|
const double del = 0.25 * (1. + lb*lb/(la*la) - lb*lb/(lc*lc));
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-C
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[2] = 0.5-eta; qtmp[1] = 1.-eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("C");
|
|
|
|
// C-D
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[2] = 0.5-eta; qtmp[1] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5-del; qtmp[2] = 0.5; qtmp[1] = 1.-del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("D");
|
|
|
|
// D-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5-del; qtmp[2] = 0.5; qtmp[1] = 1.-del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-D1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5+del; qtmp[1] = 0.5; qtmp[2] = del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("D_1");
|
|
|
|
// D1-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5+del; qtmp[1] = 0.5; qtmp[2] = del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = 0.5-phi; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
// H-C
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = 0.5-phi; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-eta; qtmp[2] = 1.-eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("C/C_1");
|
|
|
|
// C1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+eta; qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/X");
|
|
|
|
// X-H1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[1] = 0.5+phi; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H_1/H");
|
|
|
|
// H-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = 0.5-phi; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
}
|
|
|
|
} else if (symbol[0] == 'C'){ // ORCC
|
|
|
|
const double xi = 0.25 * (1. + la*la/(lb*lb));
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-S
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("S");
|
|
|
|
// S-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R");
|
|
|
|
// R-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X_1");
|
|
|
|
// X1-A1
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A_1");
|
|
|
|
// A1-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("T");
|
|
|
|
// T-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y/Z");
|
|
|
|
// Z-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("T");
|
|
|
|
} else { // ORCI
|
|
|
|
const double xi = 0.25 * (1. + la*la/(lc*lc));
|
|
const double eta = 0.25 * (1. + lb*lb/(lc*lc));
|
|
const double del = (lb*lb-la*la)/(4.*lc*lc);
|
|
const double miu = (lb*lb+la*la)/(4.*lc*lc);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = qtmp[2] = xi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = qtmp[2] = xi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -miu; qtmp[1] = miu; qtmp[2] = 0.5-del;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = -miu; qtmp[1] = miu; qtmp[2] = 0.5-del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("T");
|
|
|
|
// T-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("W");
|
|
|
|
// W-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R");
|
|
|
|
// R-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = xi; qtmp[1] = 1.-xi; qtmp[2] = -xi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X_1");
|
|
|
|
// X1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = xi; qtmp[1] = 1.-xi; qtmp[2] = -xi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = eta; qtmp[1] = -eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-S
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = eta; qtmp[1] = -eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("S");
|
|
|
|
// S-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("W/L_1");
|
|
|
|
// L1-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = miu; qtmp[1] = -miu; qtmp[2] = 0.5+del;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = eta; qtmp[1] = -eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y/Y_1");
|
|
|
|
// Y1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-eta; qtmp[1] = eta; qtmp[2] = -eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
}
|
|
|
|
} else if (spgnum >= 75 && spgnum <= 142){ // Tetragonal
|
|
|
|
if (symbol[0] == 'P'){ // TET
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R");
|
|
|
|
// R-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/X");
|
|
|
|
// X-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R/M");
|
|
|
|
// M-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A");
|
|
|
|
} else { // BCT
|
|
if (la > lc){ // BCT1
|
|
const double eta = 0.25 * (1. + lc*lc/(la*la));
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = eta; qtmp[2] = -eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = eta; qtmp[2] = -eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P");
|
|
|
|
// P-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N");
|
|
|
|
// N-Z1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = 1.-eta; qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z_1");
|
|
|
|
// Z1-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = 1.-eta; qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M");
|
|
|
|
// X-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P");
|
|
|
|
} else { // BCT2
|
|
|
|
const double eta = 0.25 * (1. + la*la/(lc*lc));
|
|
const double xi = la*la/(2.*lc*lc);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = xi; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y");
|
|
|
|
// Y-Sigma
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = xi; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol S}");
|
|
|
|
// Sigma-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-Sigma_1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = 1.-eta; qtmp[2] = -eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol S}_1");
|
|
|
|
// Sigma_1-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = 1.-eta; qtmp[2] = -eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N");
|
|
|
|
// N-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.25;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P");
|
|
|
|
// P-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.25;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -xi;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Y_1");
|
|
|
|
// Y1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -xi;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// X-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.25;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P");
|
|
}
|
|
}
|
|
} else if (spgnum >= 143 && spgnum <= 167){ // Trigonal
|
|
if (cosg > 0.){ // RHL1
|
|
|
|
const double eta = (1.+4.*cosa)/(2.+4.*cosa);
|
|
const double niu = 0.75 - 0.5*eta;
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-B1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 1.-eta; qtmp[2] = eta - 1.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("B_1/B");
|
|
|
|
// B-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = 0.5; qtmp[2] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = niu; qtmp[1] = 0.; qtmp[2] = -niu;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X/Q");
|
|
|
|
// Q-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-niu; qtmp[1] = niu; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F");
|
|
|
|
// F-P1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-niu; qtmp[2] = 1.-eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P_1");
|
|
|
|
// P1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-niu; qtmp[2] = 1.-eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z/L");
|
|
|
|
// L-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = qtmp[2] = niu;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P");
|
|
|
|
} else { // RHL2
|
|
const double eta = 0.5*(1.+cosa)/(1.-cosa);
|
|
const double niu = 0.75 - 0.5*eta;
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 1.-niu; qtmp[1] = -niu;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P");
|
|
|
|
// P-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 1.-niu; qtmp[1] = -niu;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
|
|
// Z-Q
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Q");
|
|
|
|
// Q-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("F");
|
|
|
|
// F-P1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = niu; qtmp[1] = qtmp[2] = niu - 1.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P_1");
|
|
|
|
// P1-Q1
|
|
qtmp = new double [3];
|
|
qtmp[0] = niu; qtmp[1] = qtmp[2] = niu - 1.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-eta; qtmp[1] = qtmp[2] = -eta;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Q_1");
|
|
|
|
// Q1-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-eta; qtmp[1] = qtmp[2] = -eta;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("Z");
|
|
}
|
|
|
|
} else if (spgnum >= 168 && spgnum <= 194){ // Hexagonal
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M");
|
|
|
|
// M-K
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("K");
|
|
|
|
// K-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A");
|
|
|
|
// A-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
// H-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("A/L");
|
|
|
|
// L-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M/K");
|
|
|
|
// K-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
} else if (spgnum >= 195 && spgnum <= 230){ // Cubic
|
|
|
|
if (symbol[0] == 'P'){ // CUB
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R");
|
|
|
|
// R-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X/M");
|
|
|
|
// M-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("R");
|
|
|
|
} else if (symbol[0] == 'F'){ // FCC
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
// X-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("W");
|
|
|
|
// W-K
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.375; qtmp[2] = 0.75;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("K");
|
|
|
|
// K-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.375; qtmp[2] = 0.75;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-U
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.625; qtmp[1] = 0.25; qtmp[2] = 0.625;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("U");
|
|
|
|
// U-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.625; qtmp[1] = 0.25; qtmp[2] = 0.625;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("W");
|
|
|
|
// W-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("L");
|
|
|
|
// L-K
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.375; qtmp[2] = 0.75;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("K/U");
|
|
|
|
// U-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.625; qtmp[1] = 0.25; qtmp[2] = 0.625;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("X");
|
|
|
|
} else { // BCC
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
// G-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H");
|
|
|
|
// H-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("P");
|
|
|
|
// P-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("H/P");
|
|
|
|
// P-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
qe.push_back(qtmp);
|
|
|
|
ndstr.push_back("N");
|
|
|
|
}
|
|
|
|
} else {
|
|
printf("\nSorry, failed to identify the crystal system, please use the manual mode.\n");
|
|
}
|
|
|
|
// to determine the number of points along each line, with a step size of 0.05
|
|
const double qs_inv = 1./QSTEP;
|
|
int nbin = qs.size();
|
|
if (nbin > 0) printf("\nPhonon dispersion will be evaluated along lines:\n\t%s", ndstr[0].c_str());
|
|
for (int is = 0; is < nbin; ++is){
|
|
double *qstr = qs[is];
|
|
double *qend = qe[is];
|
|
double ql = 0.;
|
|
for (int i = 0; i < 3; ++i) ql += (qend[i] - qstr[i])*(qend[i] - qstr[i]);
|
|
int nqpt = MAX(int(sqrt(ql) * qs_inv + 0.5), 2);
|
|
nqbin.push_back(nqpt);
|
|
|
|
printf("-%s", ndstr[is+1].c_str());
|
|
}
|
|
if (nbin > 0) printf("\n");
|
|
}
|
|
#endif
|
|
|
|
FILE *fp = fopen(fname, "w");
|
|
fprintf(fp,"# q qr freq\n");
|
|
fprintf(fp,"# 2pi/L 2pi/L %s\n", dynmat->funit);
|
|
|
|
double qr = 0., dq, q[3], qinc[3];
|
|
int nbin = qs.size();
|
|
for (int is = 0; is < nbin; ++is){
|
|
double *qstr = qs[is];
|
|
double *qend = qe[is];
|
|
int nbin = nqbin[is];
|
|
for (int i = 0; i < 3; ++i) qinc[i] = (qend[i]-qstr[i])/double(nbin-1);
|
|
dq = sqrt(qinc[0]*qinc[0]+qinc[1]*qinc[1]+qinc[2]*qinc[2]);
|
|
|
|
nodes.push_back(qr);
|
|
for (int i = 0; i < 3; ++i) q[i] = qstr[i];
|
|
for (int ii = 0; ii < nbin; ++ii){
|
|
double wii = 1.;
|
|
dynmat->getDMq(q, &wii);
|
|
if (wii > 0.){
|
|
dynmat->geteigen(egvs, 0);
|
|
fprintf(fp,"%lg %lg %lg %lg ", q[0], q[1], q[2], qr);
|
|
for (int i = 0; i < ndim; ++i) fprintf(fp," %lg", egvs[i]);
|
|
}
|
|
fprintf(fp,"\n");
|
|
|
|
for (int i = 0; i < 3; ++i) q[i] += qinc[i];
|
|
qr += dq;
|
|
}
|
|
qr -= dq;
|
|
delete []qstr;
|
|
delete []qend;
|
|
}
|
|
qs.clear(); qe.clear();
|
|
if (qr > 0.) nodes.push_back(qr);
|
|
fclose(fp);
|
|
delete []egvs;
|
|
|
|
// write the gnuplot script which helps to visualize the result
|
|
int nnd = nodes.size();
|
|
if (nnd > 1){
|
|
const char qmk = char(34); // "
|
|
fp = fopen("pdisp.gnuplot", "w");
|
|
fprintf(fp,"set term post enha colo 20\nset out %cpdisp.eps%c\n\n", qmk, qmk);
|
|
fprintf(fp,"set xlabel %cq%c\n", qmk, qmk);
|
|
fprintf(fp,"set ylabel %cfrequency (THz)%c\n\n", qmk, qmk);
|
|
fprintf(fp,"set xrange [0:%lg]\nset yrange [0:*]\n\n", nodes[nnd-1]);
|
|
fprintf(fp,"set grid xtics\n");
|
|
fprintf(fp,"# {/Symbol G} will give you letter gamma in the label\nset xtics (");
|
|
for (int i = 0; i < nnd-1; ++i) fprintf(fp,"%c%s%c %lg, ", qmk, ndstr[i].c_str(), qmk, nodes[i]);
|
|
fprintf(fp, "%c%s%c %lg)\n\n", qmk, ndstr[nnd-1].c_str(), qmk, nodes[nnd-1]);
|
|
fprintf(fp, "unset key\n\n");
|
|
fprintf(fp, "plot %c%s%c u 4:5 w l lt 1", qmk, fname, qmk);
|
|
for (int i = 1; i < ndim; ++i) fprintf(fp,",\\\n%c%c u 4:%d w l lt 1", qmk, qmk, i+5);
|
|
fclose(fp);
|
|
|
|
printf("\nPhonon dispersion data are written to: %s, you can visualize the results\n", fname);
|
|
printf("by invoking: `gnuplot pdisp.gnuplot; gv pdisp.eps`\n");
|
|
}
|
|
for (int ii = 0; ii < 80; ++ii) printf("=");
|
|
printf("\n");
|
|
|
|
delete []fname;
|
|
nodes.clear();
|
|
ndstr.clear();
|
|
|
|
return;
|
|
}
|