/** * @brief Find the largest interval of projection coordinates if the interval is large then VAC_SPACE. If we can find any one are satified in the i dierction, then vac[i][0]= 0 vac[i][1]= 0 * @param pos * @param vac (Direct Coordinates) */ void FindVac( POSCAR* pos, double vac[3][2]) { int i,j,v; double post; double len[3]; double *interval=NULL; double max_interval=-1; POSCAR* posTmp=NULL; /*Init*/ for (i=0; i<3; i++) for (j=0; j<2; j++) vac[i][j]=0; POSCAR_Copy(pos, posTmp); POSCAR_C2D(posTmp); POSCAR_Confined(posTmp); for (i=0; i<3; i++) { len[i]= dot3D(posTmp->lat->a[i], posTmp->lat->a[i]); len[i]= sqrt(len[i]); } interval= malloc(sizeof(double)*posTmp->natom); if (interval==NULL) { fprintf(stderr, "POSCAR_FindVac: Memory Allocate Error.\n"); exit(1); } for (v=0; v<3; v++) { insort(&(posTmp->atom_pos[0][0]), posTmp->natom, 3, v, false); for (i=0; i<posTmp->natom; i++) { if (i==posTmp->natom-1) post= posTmp->atom_pos[0][v]+1.0; else post= posTmp->atom_pos[i+1][v]; interval[i]=(post-posTmp->atom_pos[i][v])*len[v]; if (interval[i]>max_interval && interval[i]>VAC_SPACE) { vac[v][0]= posTmp->atom_pos[i][v]; vac[v][1]= post; } } } free(interval); POSCAR_Free(posTmp); }
void check_beta_cubic() { int i,j; FILE *pf=NULL; FILE *pfE=NULL; POSCAR *pos=NULL; POSCAR *posE=NULL; SCALAR3D *sca=NULL; SCALAR3D *scaE=NULL; double beta_value; double skip[3][2]; double vac[3][2]; double max_pos[3]; double max_vec[3]; /*Init*/ POSCAR_Init(pos); POSCAR_Init(posE); SCALAR3D_Init(sca); SCALAR3D_Init(scaE); for (i=0; i<3; i++) for (j=0; j<2; j++) { vac[i][j]=0; skip[i][j]=0; } /*Read*/ if ((pf=fopen("data/beta/Cubic_E0.0","r"))==NULL) { g_assert(false); } else if ((pfE=fopen("data/beta/Cubic_E0.5","r"))==NULL) { g_assert(false); } g_assert_cmpint(SCALAR3D_READ(sca,pos,pf),==,0); g_assert_cmpint(SCALAR3D_READ(scaE,posE,pfE),==,0); beta_value=beta(sca, scaE, 0.5, 2, vac, max_pos, max_vec, 2); g_assert_cmpfloat(beta_value,==,3); for (i=0; i<3; i++) for (j=0; j<2; j++) { g_assert_cmpfloat(skip[i][j],==,0); } g_assert_cmpfloat(max_pos[0],==,1./3.); g_assert_cmpfloat(max_pos[1],==,1./3.); g_assert_cmpfloat(max_pos[2],==,1./3.); g_assert_cmpfloat(max_vec[0],==,0); g_assert_cmpfloat(max_vec[1],==,0); g_assert_cmpfloat(max_vec[2],==,1.5); fclose(pf); fclose(pfE); /*Free*/ POSCAR_Free(pos); SCALAR3D_Free(sca); POSCAR_Free(posE); SCALAR3D_Free(scaE); }
void check_beta_hex() { int i,j; double d; FILE *pf=NULL; FILE *pfE=NULL; POSCAR *pos=NULL; POSCAR *posE=NULL; SCALAR3D *sca=NULL; SCALAR3D *scaE=NULL; double beta_value; double vac[3][2]; double skip[3][2]; double max_pos[3]; double max_vec[3]; /*Init*/ POSCAR_Init(pos); POSCAR_Init(posE); SCALAR3D_Init(sca); SCALAR3D_Init(scaE); for (i=0; i<3; i++) for (j=0; j<2; j++) { vac[i][j]=0; skip[i][j]=0; } /*Read*/ if ((pf=fopen("data/beta/Hex_E0.0","r"))==NULL) { g_assert(false); } else if ((pfE=fopen("data/beta/Hex_E1.0","r"))==NULL) { g_assert(false); } g_assert_cmpint(SCALAR3D_READ(sca,pos,pf),==,0); g_assert_cmpint(SCALAR3D_READ(scaE,posE,pfE),==,0); beta_value=beta(sca, scaE, 1.0, 2, vac, max_pos, max_vec, 2); d= pow(1.5*cos(PI/3.),2)+pow(6.+1.5*sin(PI/3.),2)+pow(3.,2); g_assert_cmpfloat(beta_value,==,sqrt(d)); for (i=0; i<3; i++) for (j=0; j<2; j++) g_assert_cmpfloat(skip[i][j],==,0); g_assert_cmpfloat(max_pos[0],==,1/3.); g_assert_cmpfloat(max_pos[1],==,0/3.); g_assert_cmpfloat(max_pos[2],==,0/3.); g_assert_cmpfloat(max_vec[0],==,1.5/2.); g_assert_cmpfloat(max_vec[1],==,6.0+1.5*sin(PI/3.)); g_assert_cmpfloat(max_vec[2],==,3.); fclose(pf); fclose(pfE); /*Free*/ POSCAR_Free(pos); SCALAR3D_Free(sca); POSCAR_Free(posE); SCALAR3D_Free(scaE); }
void check_beta_vac() { int i,j; double d; FILE *pf=NULL; FILE *pfE=NULL; POSCAR *pos=NULL; POSCAR *posE=NULL; SCALAR3D *sca=NULL; SCALAR3D *scaE=NULL; double beta_value; double vac[3][2]; double skip[3][2]; double max_pos[3]; double max_vec[3]; /*Init*/ POSCAR_Init(pos); POSCAR_Init(posE); SCALAR3D_Init(sca); SCALAR3D_Init(scaE); /*Read*/ if ((pf=fopen("data/beta/Vac_E0.0","r"))==NULL) { g_assert(false); } else if ((pfE=fopen("data/beta/Vac_E1.0_Z","r"))==NULL) { g_assert(false); } else { g_assert_cmpint(SCALAR3D_READ(sca,pos,pf),==,0); g_assert_cmpint(SCALAR3D_READ(scaE,posE,pfE),==,0); } fclose(pf); fclose(pfE); /* No Vaccumm*/ for (i=0; i<3; i++) for (j=0; j<2; j++) { vac[i][j]=0; skip[i][j]=0; } beta_value=beta(sca, scaE, 1.0, 1, vac, max_pos, max_vec, 2); for (i=0; i<3; i++) for (j=0; j<2; j++) { g_assert_cmpfloat(skip[i][j],==,0); } g_assert_cmpfloat(max_pos[0],==,0); g_assert_cmpfloat(max_pos[1],==,5./6.); g_assert_cmpfloat(max_pos[2],==,0./6.); g_assert_cmpfloat(max_vec[0],==,0); /*-2187*/ g_assert_cmpfloat(max_vec[1],==,(-9+729)/8.); g_assert_cmpfloat(max_vec[2],==,(-128-2187)/8.); d= sqrt(pow((-9+729)/8.,2)+pow((-128-2187)/8.,2)); g_assert_cmpfloat(beta_value,==,d); /* Vaccumm*/ skip[2][0]= -1./12.; skip[2][1]= 1./12.; beta_value=beta(sca, scaE, 1.0, 0, vac, max_pos, max_vec, 2); g_assert_cmpfloat(max_pos[0],==,0./6.); g_assert_cmpfloat(max_pos[1],==,5./6.); g_assert_cmpfloat(max_pos[2],==,5./6.); g_assert_cmpfloat(max_vec[0],==,0); /*2187*/ g_assert_cmpfloat(max_vec[1],==,(9-729)/8.); g_assert_cmpfloat(max_vec[2],==,(-2187-128)/8.); /* Vaccumm*/ skip[2][0]= -3./12.; skip[2][1]= 1./12.; beta_value=beta(sca, scaE, 1.0, 0, vac, max_pos, max_vec, 2); g_assert_cmpfloat(max_pos[0],==,0); g_assert_cmpfloat(max_pos[1],==,5./6.); g_assert_cmpfloat(max_pos[2],==,1./6.); g_assert_cmpfloat(max_vec[0],==,0); /*-128*/ g_assert_cmpfloat(max_vec[1],==,(-4+64)/8.); g_assert_cmpfloat(max_vec[2],==,(-1+2187)/8.); /* Vaccumm*/ skip[2][0]= -3./12.; skip[2][1]= 3./12.; beta_value=beta(sca, scaE, 1.0, 1, vac, max_pos, max_vec, 2); g_assert_cmpfloat(max_pos[0],==,0); g_assert_cmpfloat(max_pos[1],==,5./6.); g_assert_cmpfloat(max_pos[2],==,4./6.); g_assert_cmpfloat(max_vec[0],==,0); /*128*/ g_assert_cmpfloat(max_vec[1],==,(4-64)/8.); g_assert_cmpfloat(max_vec[2],==,(2187-1)/8.); /* Vaccumm*/ skip[2][0]= -5./12.; skip[2][1]= 3./12.; beta_value=beta(sca, scaE, 1.0, 2, vac, max_pos, max_vec, 2); g_assert_cmpfloat(max_pos[0],==,0); g_assert_cmpfloat(max_pos[1],==,5./6.); g_assert_cmpfloat(max_pos[2],==,2./6.); g_assert_cmpfloat(max_vec[0],==,0); /*-1*/ g_assert_cmpfloat(max_vec[1],==,0); g_assert_cmpfloat(max_vec[2],==,(1+128)/8.); /* Vaccumm*/ skip[2][0]= -5./12.; skip[2][1]= 5./12.; beta_value=beta(sca, scaE, 1.0, 2, vac, max_pos, max_vec, 2); g_assert_cmpfloat(max_pos[0],==,0); g_assert_cmpfloat(max_pos[1],==,5./6.); g_assert_cmpfloat(max_pos[2],==,3./6.); g_assert_cmpfloat(max_vec[0],==,0); /*1*/ g_assert_cmpfloat(max_vec[1],==,0); g_assert_cmpfloat(max_vec[2],==,(1+128)/8.); /* Vaccumm*/ skip[2][0]= -7./12.; skip[2][1]= 5./12.; beta_value=beta(sca, scaE, 1.0, 0, vac, max_pos, max_vec, 2); g_assert_cmpfloat(max_pos[0],==,-1); g_assert_cmpfloat(max_pos[1],==,-1); g_assert_cmpfloat(max_pos[2],==,-1); g_assert_cmpfloat(max_vec[0],==,0); /*1*/ g_assert_cmpfloat(max_vec[1],==,0); g_assert_cmpfloat(max_vec[2],==,0); /* Vaccumm*/ skip[1][0]= 9./12.; skip[1][1]= 11./12.; skip[2][0]= 0; skip[2][1]= 0; beta_value=beta(sca, scaE, 1.0, 0, vac, max_pos, max_vec, 2); g_assert_cmpfloat(max_pos[0],==,0); g_assert_cmpfloat(max_pos[1],==,0); g_assert_cmpfloat(max_pos[2],==,0.); g_assert_cmpfloat(max_vec[0],==,0); /* -9 */ g_assert_cmpfloat(max_vec[1],==,(-27+2187)/8.); g_assert_cmpfloat(max_vec[2],==,(-4-9)/8.); /*Free*/ POSCAR_Free(pos); SCALAR3D_Free(sca); POSCAR_Free(posE); SCALAR3D_Free(scaE); }