git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@14366 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp
2015-12-15 15:59:01 +00:00
parent 75de12f26a
commit 5f802f86b5
10 changed files with 399 additions and 543 deletions

View File

@ -4,8 +4,7 @@
#include <math.h>
#include "green.h"
#include <complex>
#define MAXLINE 256
#include "global.h"
/*******************************************************************************
* The class of Green is designed to evaluate the LDOS via the Green's Function
@ -45,7 +44,7 @@ Green::Green(const int ntm, const int sdim, const int niter, const double min, c
H = Hessian; iatom = itm;
ldos = lpdos;
memory = new Memory;
memory = new Memory();
if (natom < 1 || iatom < 0 || iatom >= natom){
printf("\nError: Wrong number of total atoms or wrong index of interested atom!\n");
return;
@ -58,9 +57,9 @@ Green::Green(const int ntm, const int sdim, const int niter, const double min, c
// initialize variables and allocate local memories
dw = (wmax - wmin)/double(nw-1);
alpha = memory->create(alpha, sysdim,nit, "Green_Green:alpha");
beta = memory->create(beta, sysdim,nit+1,"Green_Green:beta");
//ldos = memory->create(ldos, nw,sysdim, "Green_Green:ldos");
memory->create(alpha, sysdim,nit, "Green_Green:alpha");
memory->create(beta, sysdim,nit+1,"Green_Green:beta");
//memory->create(ldos, nw,sysdim, "Green_Green:ldos");
// use Lanczos algorithm to diagonalize the Hessian
Lanczos();
@ -100,35 +99,35 @@ void Green::Lanczos()
int ipos = iatom*sysdim;
// Loop over dimension
for (int idim=0; idim<sysdim; idim++){
for (int idim = 0; idim < sysdim; ++idim){
beta[idim][0] = 0.;
for (int i=0; i<ndim; i++){vp[i] = v[i] = 0.;}
for (int i = 0; i < ndim; ++i) vp[i] = v[i] = 0.;
v[ipos+idim] = 1.;
// Loop on fraction levels
for (int i=0; i<nit; i++){
for (int i = 0; i < nit; ++i){
double sum_a = 0.;
for (int j=0; j<ndim; j++){
for (int j = 0; j < ndim; ++j){
double sumHv = 0.;
for (int k=0; k<ndim; k++) sumHv += H[j][k]*v[k];
for (int k = 0; k < ndim; ++k) sumHv += H[j][k]*v[k];
w[j] = sumHv - beta[idim][i]*vp[j];
sum_a += w[j]*v[j];
}
alpha[idim][i] = sum_a;
for (int k=0; k<ndim; k++) w[k] -= alpha[idim][i]*v[k];
for (int k = 0; k < ndim; ++k) w[k] -= alpha[idim][i]*v[k];
double gamma = 0.;
for (int k=0; k<ndim; k++) gamma += w[k]*v[k];
for (int k=0; k<ndim; k++) w[k] -= gamma*v[k];
for (int k = 0; k < ndim; ++k) gamma += w[k]*v[k];
for (int k = 0; k < ndim; ++k) w[k] -= gamma*v[k];
double sum_b = 0.;
for (int k=0; k<ndim; k++) sum_b += w[k]*w[k];
for (int k = 0; k < ndim; ++k) sum_b += w[k]*w[k];
beta[idim][i+1] = sqrt(sum_b);
ptr = vp; vp = v; v = ptr;
double tmp = 1./beta[idim][i+1];
for (int k=0; k<ndim; k++) v[k] = w[k]*tmp;
for (int k = 0; k < ndim; ++k) v[k] = w[k] * tmp;
}
}
@ -154,10 +153,10 @@ void Green::Recursion()
xmax = new double [sysdim];
int nave = nit/4;
for (int idim=0; idim<sysdim; idim++){
for (int idim = 0; idim < sysdim; ++idim){
alpha_inf[idim] = beta_inf[idim] = 0.;
for (int i= nit-nave; i<nit; i++){
for (int i = nit-nave; i < nit; ++i){
alpha_inf[idim] += alpha[idim][i];
beta_inf[idim] += beta[idim][i+1];
}
@ -173,11 +172,11 @@ void Green::Recursion()
double sr, si;
double w = wmin;
for (int i=0; i<nw; i++){
for (int i = 0; i < nw; ++i){
double a = w*w, ax, bx;
Z = std::complex<double>(w*w, epson);
for (int idim=0; idim<sysdim; idim++){
for (int idim = 0; idim < sysdim; ++idim){
double two_b = 2.*beta_inf[idim]*beta_inf[idim];
double rtwob = 1./two_b;
@ -201,7 +200,7 @@ void Green::Recursion()
si = epson * rtwob + bx;
rec_x = std::complex<double> (sr, si);
for (int j=0; j<nit; j++){
for (int j = 0; j < nit; ++j){
rec_x_inv = Z - alpha[idim][nit-j-1] - beta[idim][nit-j]*beta[idim][nit-j]*rec_x;
rec_x = 1./rec_x_inv;
}
@ -229,13 +228,13 @@ void Green::recursion()
double w = wmin;
for (int i=0; i<nw; i++){
for (int i = 0; i < nw; ++i){
Z = std::complex<double>(w*w, epson);
for (int idim=0; idim<sysdim; idim++){
for (int idim = 0; idim < sysdim; ++idim){
rec_x = std::complex<double>(0.,0.);
for (int j=0; j<nit; j++){
for (int j = 0; j < nit; ++j){
rec_x_inv = Z - alpha[idim][nit-j-1] - beta[idim][nit-j]*beta[idim][nit-j]*rec_x;
rec_x = 1./rec_x_inv;
}