2777 lines
70 KiB
C++
2777 lines
70 KiB
C++
#include "global.h"
|
|
#include "kpath.h"
|
|
|
|
#ifdef UseSPG
|
|
extern "C"{
|
|
#include "spglib.h"
|
|
}
|
|
#include "math.h"
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
* Class kPath will help to find the high symmetry k-path for a given lattice.
|
|
* The lattice info is passed via a DynMat object.
|
|
* ---------------------------------------------------------------------------- */
|
|
kPath::kPath(DynMat *dm, QNodes *qn)
|
|
{
|
|
// create memory
|
|
memory = new Memory();
|
|
|
|
// pass the class from main
|
|
q = qn;
|
|
dynmat = dm;
|
|
sysdim = dynmat->sysdim;
|
|
num_atom = dynmat->nucell;
|
|
|
|
memory->create(atpos, num_atom, 3, "kpath:atpos");
|
|
memory->create(attyp, num_atom, "kpath:attyp");
|
|
|
|
// set default, in case system dimension under study is not 3.
|
|
for (int i = 0; i < num_atom; ++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];
|
|
|
|
// get the space group number
|
|
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];
|
|
spgnum = spg_get_international(symbol, latvec, pos, attyp, num_atom, symprec);
|
|
|
|
return;
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
* Show the lattice info
|
|
* ---------------------------------------------------------------------------- */
|
|
void kPath::show_info()
|
|
{
|
|
// display the unit cell info read
|
|
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 =", idim+1);
|
|
for (int jdim = 0; jdim < 3; ++jdim) printf(" %lg", latvec[jdim][idim]);
|
|
printf("\n");
|
|
}
|
|
|
|
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);
|
|
|
|
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");
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
* Free the memeory used by kPath.
|
|
* ---------------------------------------------------------------------------- */
|
|
kPath::~kPath( )
|
|
{
|
|
memory->destroy(attyp);
|
|
memory->destroy(atpos);
|
|
delete memory;
|
|
dynmat = NULL;
|
|
q = NULL;
|
|
|
|
return;
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
* Main workhorse
|
|
* ---------------------------------------------------------------------------- */
|
|
void kPath::kpath( )
|
|
{
|
|
q->ndstr.clear();
|
|
q->qs.clear();
|
|
q->qe.clear();
|
|
q->nqbin.clear();
|
|
|
|
// 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];
|
|
int 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
|
|
|
|
q->ndstr.push_back("X");
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M/R");
|
|
|
|
// R-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
} else { // A.14, TRI1b and TRI2b
|
|
|
|
q->ndstr.push_back("X");
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = -0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[1] = qtmp[2] = 0.; qtmp[0] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = -0.5; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M/R");
|
|
|
|
// R-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = -0.5; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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;
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = eta; qtmp[2] = 1.-niu;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
// H-C
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = eta; qtmp[2] = 1.-niu;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("C");
|
|
|
|
// C-E
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("E");
|
|
|
|
// E-M1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 1.-eta; qtmp[2] = niu;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M_1");
|
|
|
|
// M1-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 1.-eta; qtmp[2] = niu;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A");
|
|
|
|
// A-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-H1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[2] = 1.-eta; qtmp[1] = niu;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H_1/M");
|
|
|
|
// M-D
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[2] = eta; qtmp[1] = 1.-niu;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("D");
|
|
|
|
// D-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/Y");
|
|
|
|
// Y-D
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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;
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F");
|
|
|
|
// F-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[1] = 1.-phi; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("I/I_1");
|
|
|
|
// I1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = -qtmp[0]; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F_1/Y");
|
|
|
|
// Y-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = psi; qtmp[1] = 1.-psi; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X_1/X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-psi; qtmp[1] = -qtmp[0]; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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;
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F");
|
|
|
|
// F-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-xi; qtmp[2] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[1] = 1.-phi; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("I/I_1");
|
|
|
|
// I1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = -qtmp[0]; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F_1/N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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;
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F");
|
|
|
|
// F-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
// H-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("I/H_1");
|
|
|
|
// H1-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-xi; qtmp[1] = -xi; qtmp[2] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y_1");
|
|
|
|
// Y1-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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;
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F");
|
|
|
|
// F-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-phi; qtmp[2] = 1.-psi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
// H-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("I/H_1");
|
|
|
|
// I-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[2] = phi - 1.; qtmp[1] = psi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F_1/H_1");
|
|
|
|
// H1-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-xi; qtmp[1] = -xi; qtmp[2] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y_1");
|
|
|
|
// Y1-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = miu; qtmp[2] = del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = niu; qtmp[2] = omg;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F");
|
|
|
|
// F-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = niu; qtmp[2] = omg;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// L-I
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = rho; qtmp[1] = 1.-rho; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("I/I_1");
|
|
|
|
// I1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-rho; qtmp[1] = -qtmp[0]; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
// H-F1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-niu; qtmp[2] = 1.-omg;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F_1/H_1");
|
|
|
|
// H1-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-xi; qtmp[1] = -xi; qtmp[2] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y_1");
|
|
|
|
// Y1-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-miu; qtmp[1] = -miu; qtmp[2] = -del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y_1");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("N/M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
}
|
|
}
|
|
}
|
|
|
|
} else if (spgnum >= 16 && spgnum <= 74){ // Orthorhombic
|
|
|
|
if (symbol[0] == 'P'){ // ORC
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-S
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("S");
|
|
|
|
// S-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-U
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("U");
|
|
|
|
// U-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("R");
|
|
|
|
// R-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("T");
|
|
|
|
// T-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/Y");
|
|
|
|
// Y-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("T/U");
|
|
|
|
// U-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X/S");
|
|
|
|
// S-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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));
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("T");
|
|
|
|
// T-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-A1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A_1");
|
|
|
|
// A1-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y/X");
|
|
|
|
// X-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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));
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("T");
|
|
|
|
// T-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-A1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A_1");
|
|
|
|
// A1-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-xi; qtmp[2] = 1.-xi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y/T");
|
|
|
|
// T-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.; qtmp[1] = qtmp[2] = 1.-eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X_1/X");
|
|
|
|
// X-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+xi; qtmp[2] = xi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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));
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-C
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[2] = 0.5-eta; qtmp[1] = 1.-eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("C");
|
|
|
|
// C-D
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[2] = 0.5-eta; qtmp[1] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5-del; qtmp[2] = 0.5; qtmp[1] = 1.-del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("D");
|
|
|
|
// D-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5-del; qtmp[2] = 0.5; qtmp[1] = 1.-del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-D1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5+del; qtmp[1] = 0.5; qtmp[2] = del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("D_1");
|
|
|
|
// D1-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5+del; qtmp[1] = 0.5; qtmp[2] = del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = 0.5-phi; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
// H-C
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-phi; qtmp[1] = 0.5-phi; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5-eta; qtmp[2] = 1.-eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("C/C_1");
|
|
|
|
// C1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.5+eta; qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/X");
|
|
|
|
// X-H1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = phi; qtmp[1] = 0.5+phi; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y/L");
|
|
|
|
// L-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
}
|
|
|
|
} else if (symbol[0] == 'C'){ // ORCC
|
|
|
|
const double xi = 0.25 * (1. + la*la/(lb*lb));
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-S
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("S");
|
|
|
|
// S-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("R");
|
|
|
|
// R-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = xi; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X_1");
|
|
|
|
// X1-A1
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A_1");
|
|
|
|
// A1-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = 1.-xi; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("T");
|
|
|
|
// T-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y/Z");
|
|
|
|
// Z-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = qtmp[2] = xi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = qtmp[2] = xi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -miu; qtmp[1] = miu; qtmp[2] = 0.5-del;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-T
|
|
qtmp = new double [3];
|
|
qtmp[0] = -miu; qtmp[1] = miu; qtmp[2] = 0.5-del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("T");
|
|
|
|
// T-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("W");
|
|
|
|
// W-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("R");
|
|
|
|
// R-X1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = xi; qtmp[1] = 1.-xi; qtmp[2] = -xi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X_1");
|
|
|
|
// X1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = xi; qtmp[1] = 1.-xi; qtmp[2] = -xi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = eta; qtmp[1] = -eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-S
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = eta; qtmp[1] = -eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("S");
|
|
|
|
// S-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("W/L_1");
|
|
|
|
// L1-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = miu; qtmp[1] = -miu; qtmp[2] = 0.5+del;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = eta; qtmp[1] = -eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y/Y_1");
|
|
|
|
// Y1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-eta; qtmp[1] = eta; qtmp[2] = -eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
}
|
|
|
|
} else if (spgnum >= 75 && spgnum <= 142){ // Tetragonal
|
|
|
|
if (symbol[0] == 'P'){ // TET
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("R");
|
|
|
|
// R-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A");
|
|
|
|
// A-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/X");
|
|
|
|
// X-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("R/M");
|
|
|
|
// M-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A");
|
|
|
|
} else { // BCT
|
|
if (la > lc){ // BCT1
|
|
const double eta = 0.25 * (1. + lc*lc/(la*la));
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = eta; qtmp[2] = -eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = eta; qtmp[2] = -eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P");
|
|
|
|
// P-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("N");
|
|
|
|
// N-Z1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = 1.-eta; qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z_1");
|
|
|
|
// Z1-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = 1.-eta; qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -0.5; qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M");
|
|
|
|
// X-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P");
|
|
|
|
} else { // BCT2
|
|
|
|
const double eta = 0.25 * (1. + la*la/(lc*lc));
|
|
const double xi = la*la/(2.*lc*lc);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-Y
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = xi; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y");
|
|
|
|
// Y-Sigma
|
|
qtmp = new double [3];
|
|
qtmp[0] = -xi; qtmp[1] = xi; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol S}");
|
|
|
|
// Sigma-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = -eta; qtmp[1] = qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-Sigma_1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = -0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = 1.-eta; qtmp[2] = -eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol S}_1");
|
|
|
|
// Sigma_1-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = 1.-eta; qtmp[2] = -eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("N");
|
|
|
|
// N-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.25;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P");
|
|
|
|
// P-Y1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.25;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -xi;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Y_1");
|
|
|
|
// Y1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -xi;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// X-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = qtmp[1] = 0.25;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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;
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-B1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 1.-eta; qtmp[2] = eta - 1.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("B_1/B");
|
|
|
|
// B-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = 0.5; qtmp[2] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = niu; qtmp[1] = 0.; qtmp[2] = -niu;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X/Q");
|
|
|
|
// Q-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-niu; qtmp[1] = niu; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F");
|
|
|
|
// F-P1
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-niu; qtmp[2] = 1.-eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P_1");
|
|
|
|
// P1-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1.-niu; qtmp[2] = 1.-eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z/L");
|
|
|
|
// L-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = eta; qtmp[1] = qtmp[2] = niu;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P");
|
|
|
|
} else { // RHL2
|
|
const double eta = 0.5*(1.+cosa)/(1.-cosa);
|
|
const double niu = 0.75 - 0.5*eta;
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 1.-niu; qtmp[1] = -niu;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P");
|
|
|
|
// P-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 1.-niu; qtmp[1] = -niu;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
|
|
// Z-Q
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Q");
|
|
|
|
// Q-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-F
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("F");
|
|
|
|
// F-P1
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = -0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = niu; qtmp[1] = qtmp[2] = niu - 1.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P_1");
|
|
|
|
// P1-Q1
|
|
qtmp = new double [3];
|
|
qtmp[0] = niu; qtmp[1] = qtmp[2] = niu - 1.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-eta; qtmp[1] = qtmp[2] = -eta;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Q_1");
|
|
|
|
// Q1-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = 1.-eta; qtmp[1] = qtmp[2] = -eta;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-Z
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("Z");
|
|
}
|
|
|
|
} else if (spgnum >= 168 && spgnum <= 194){ // Hexagonal
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M");
|
|
|
|
// M-K
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("K");
|
|
|
|
// K-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A");
|
|
|
|
// A-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
// H-A
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("A/L");
|
|
|
|
// L-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M/K");
|
|
|
|
// K-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 1./3.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
} else if (spgnum >= 195 && spgnum <= 230){ // Cubic
|
|
|
|
if (symbol[0] == 'P'){ // CUB
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-M
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("M");
|
|
|
|
// M-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("R");
|
|
|
|
// R-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.; qtmp[1] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X/M");
|
|
|
|
// M-R
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.5; qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("R");
|
|
|
|
} else if (symbol[0] == 'F'){ // FCC
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
// X-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("W");
|
|
|
|
// W-K
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.375; qtmp[2] = 0.75;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("K");
|
|
|
|
// K-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.375; qtmp[2] = 0.75;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-U
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.625; qtmp[1] = 0.25; qtmp[2] = 0.625;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("U");
|
|
|
|
// U-W
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.625; qtmp[1] = 0.25; qtmp[2] = 0.625;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("W");
|
|
|
|
// W-L
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.25; qtmp[2] = 0.75;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("L");
|
|
|
|
// L-K
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.375; qtmp[2] = 0.75;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("K/U");
|
|
|
|
// U-X
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.625; qtmp[1] = 0.25; qtmp[2] = 0.625;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = 0.5; qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("X");
|
|
|
|
} else { // BCC
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
// G-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H");
|
|
|
|
// H-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("N");
|
|
|
|
// N-G
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("{/Symbol G}");
|
|
|
|
// G-P
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("P");
|
|
|
|
// P-H
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[2] = 0.5; qtmp[1] = -0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->ndstr.push_back("H/P");
|
|
|
|
// P-N
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = qtmp[2] = 0.25;
|
|
q->qs.push_back(qtmp);
|
|
|
|
qtmp = new double [3];
|
|
qtmp[0] = qtmp[1] = 0.; qtmp[2] = 0.5;
|
|
q->qe.push_back(qtmp);
|
|
|
|
q->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 = q->qs.size();
|
|
for (int is = 0; is < nbin; ++is){
|
|
double *qstr = q->qs[is];
|
|
double *qend = q->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);
|
|
q->nqbin.push_back(nqpt);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
* Show the k-path info
|
|
* ---------------------------------------------------------------------------- */
|
|
void kPath::show_path()
|
|
{
|
|
if (q == NULL) return;
|
|
int nbin = q->ndstr.size();
|
|
if (nbin > 0){
|
|
printf("\nk-path for the current lattice will be:\n\t%s", q->ndstr[0].c_str());
|
|
for (int is = 1; is < nbin; ++is) printf("-%s", q->ndstr[is].c_str());
|
|
printf("\n");
|
|
}
|
|
|
|
return;
|
|
}
|
|
/* ---------------------------------------------------------------------------- */
|
|
#endif
|