Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <list>
- #include <string>
- #include <sstream>
- #include <cmath>
- using std::fstream;
- using std::ofstream;
- using std::cout;
- using std::endl;
- using std::list;
- using std::string;
- using std::stringstream;
- double Integrate3(double *func, int Nx, int Ny, int Nz);
- double Integrate6(double *func, int Nx, int Ny, int Nz);
- void Renorm(double *func, int Nx, int Ny, int Nz, double norm);
- void SquareMO(double *source,double *dest, int Nx, int Ny, int Nz);
- void Substract(double *term1, double *term2, double *source,
- int Nx, int Ny, int Nz);
- void Mult(double *term1, double *term2, double *source,
- int Nx, int Ny, int Nz);
- void InitDeltaDens(double *source,double *dest, int Nx, int Ny, int Nz);
- void InitLeftDens(double *source,double *dest, double *diff,
- int Nx, int Ny, int Nz);
- void InitRightDens(double *source,double *dest, double *diff,
- int Nx, int Ny, int Nz);
- void InitRS(double *source,double *dest,
- int Nx, int Ny, int Nz);
- void InitEx(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitLeftEx_m(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitRightEx_m(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitLeftEx_r(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitRightEx_r(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitEc(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitLeftEc_m(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitRightEc_m(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitLeftEc_r(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void InitRightEc_r(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz);
- void FormIntM(double *rhoHOMO, double *rhoLUMO, double *rho,
- double *Ex, double *Exleft, double *Exright,
- double *Ec, double *Ecleft, double *Ecright,double *dest,
- int Nx, int Ny, int Nz);
- void FormIntR(double *rhoHOMO, double *rhoLUMO, double *drho,
- double *Ex, double *Exleft, double *Exright,
- double *Ec, double *Ecleft, double *Ecright,double *dest,
- int Nx, int Ny, int Nz);
- void WriteGCube(string filename, double *data,int Nx, int Ny, int Nz);
- void ConstructV(double *charge, double *dest, int Nx, int Ny, int Nz);
- double dx,dy,dz;
- double h=0.001; /* increment for differentiating f(z) */
- const double PI=3.141592653589793;
- /* PWLDA parameters below */
- double f_z=0.0;
- double f_lz=(pow(1-h,4/3.)+pow(1+h,4/3.)-2)/(pow(2,4/3.)-2);
- double f_rz=(pow(1+h,4/3.)+pow(1-h,4/3.)-2)/(pow(2,4/3.)-2);
- double f2z=1.709921;
- double AEX=-(3./(4*PI))*pow((9*PI/4.),1/3.);
- /* for \epsilon_c(r_s,0) */
- double A_0=0.031091;
- double alpha1_0=0.21370;
- double beta1_0=7.5957;
- double beta2_0=3.5876;
- double beta3_0=1.6382;
- double beta4_0=0.49294;
- double p=1.00; /* Common for all */
- /* for \epsilon_c(r_s,1) */
- double A_1=0.015545;
- double alpha1_1=0.20548;
- double beta1_1=14.1189;
- double beta2_1=6.1977;
- double beta3_1=3.3662;
- double beta4_1=0.62517;
- /* for \alpha_c(rs) */
- double A_a=0.016887;
- double alpha1_a=0.11125;
- double beta1_a=10.357;
- double beta2_a=3.6231;
- double beta3_a=0.88026;
- double beta4_a=0.49671;
- /* For writing CUB file these need to be global */
- int Nat=0;
- int Nx,Ny,Nz;
- double xmin,ymin,zmin;
- /* START OF main() */
- int main (int ac, char* av[]){
- if (ac != 4)
- {
- cout<<"Usage: "<<av[0]<< " <density>.cub <homo>.cub <lumo>.cub"<<endl;
- return 1;
- }
- cout.precision(16);
- fstream fdensity;
- fstream fhomo;
- fstream flumo;
- fdensity.open(av[1]);
- if (!fdensity.is_open())
- {
- cout<<"Cannot open file "<<av[1]<<"."<<endl;
- return 1;
- }
- cout << "Reading density from file "<<av[1]<<"... ";
- string buffer;
- int nline=0;
- while(getline(fdensity,buffer))
- {
- double trash;
- if (nline==2)
- {
- stringstream s(buffer);
- s>>Nat>>xmin>>ymin>>zmin;
- if (Nat<0) Nat=-Nat;
- }
- if (nline==3){
- stringstream s(buffer);
- s>>Nx>>dx>>trash>>trash;
- }
- if (nline==4){
- stringstream s(buffer);
- s>>Ny>>trash>>dy>>trash;
- }
- if (nline==5){
- stringstream s(buffer);
- s>>Nz>>trash>>trash>>dz;
- }
- if (nline>=5+Nat)
- {
- break;
- }
- nline++;
- }
- double *density = new double[Nx*Ny*Nz];
- int i,j,k;
- for(i=0;i<Nx;i++){
- for(j=0;j<Ny;j++){
- for(k=0;k<Nz;k++){
- fdensity>>density[i*Ny*Nz+j*Nz+k];
- }}}
- fdensity.close();
- cout<<"Done!"<<endl;
- cout<<"Number of atoms = "<<Nat<<", grid points x = "<<Nx
- <<", grid points y = "<<Ny<<", grid points z = "<<Nz<<endl;
- fhomo.open(av[2]);
- if (!fhomo.is_open())
- {
- cout<<"Cannot open file "<<av[2]<<"."<<endl;
- return 1;
- }
- cout << "Reading HOMO from file "<<av[2]<<"... ";
- nline=0;
- while(getline(fhomo,buffer)){
- if (nline==Nat+5) break;
- nline++;
- }
- double *homo = new double[Nx*Ny*Nz];
- double *homo2 = new double[Nx*Ny*Nz];
- for(i=0;i<Nx;i++){
- for(j=0;j<Ny;j++){
- for(k=0;k<Nz;k++){
- fhomo>>homo[i*Ny*Nz+j*Nz+k];
- }}}
- fhomo.close();
- SquareMO(homo,homo2,Nx,Ny,Nz);
- cout<<"Done!"<<endl;
- flumo.open(av[3]);
- if (!flumo.is_open())
- {
- cout<<"Cannot open file "<<av[3]<<"."<<endl;
- return 1;
- }
- cout << "Reading LUMO from file "<<av[3]<<"... ";
- nline=0;
- while(getline(flumo,buffer)){
- if (nline==Nat+5) break;
- nline++;
- }
- double *lumo = new double [Nx*Ny*Nz];
- double *lumo2 = new double [Nx*Ny*Nz];
- for(i=0;i<Nx;i++){
- for(j=0;j<Ny;j++){
- for(k=0;k<Nz;k++){
- flumo>>lumo[i*Ny*Nz+j*Nz+k];
- }}}
- flumo.close();
- //END of reading data
- SquareMO(lumo,lumo2,Nx,Ny,Nz);
- cout<<"Done!"<<endl;
- double HOMO_NORM=Integrate3(homo2,Nx,Ny,Nz);
- double LUMO_NORM=Integrate3(lumo2,Nx,Ny,Nz);
- cout<<"Integrated number of electrons = "
- <<Integrate3(density,Nx,Ny,Nz)<<endl;
- cout<<"Integrated HOMO norm = "<<HOMO_NORM<<endl;
- cout<<"Integrated LUMO norm = "<<LUMO_NORM<<endl;
- cout<<"Renorming HOMO... ";
- Renorm(homo,Nx,Ny,Nz,sqrt(HOMO_NORM));
- SquareMO(homo,homo2,Nx,Ny,Nz);
- cout<<"new norm = "<<Integrate3(homo2,Nx,Ny,Nz)<<endl;
- cout<<"Renorming LUMO... ";
- Renorm(lumo,Nx,Ny,Nz,sqrt(LUMO_NORM));
- SquareMO(lumo,lumo2,Nx,Ny,Nz);
- cout<<"new norm = "<<Integrate3(lumo2,Nx,Ny,Nz)<<endl;
- double *delta_dens = new double [Nx*Ny*Nz];
- InitDeltaDens(density,delta_dens,Nx,Ny,Nz);
- double *left_dens = new double [Nx*Ny*Nz];
- InitLeftDens(density,left_dens,delta_dens,Nx,Ny,Nz);
- double *right_dens = new double [Nx*Ny*Nz];
- InitRightDens(density,right_dens,delta_dens,Nx,Ny,Nz);
- double *rs = new double [Nx*Ny*Nz];
- InitRS(density,rs,Nx,Ny,Nz);
- double *rsleft = new double [Nx*Ny*Nz];
- InitRS(left_dens,rsleft,Nx,Ny,Nz);
- double *rsright = new double [Nx*Ny*Nz];
- InitRS(right_dens,rsright,Nx,Ny,Nz);
- double *Ex = new double [Nx*Ny*Nz];
- InitEx(density,rs,Ex,Nx,Ny,Nz);
- cout<<"Exchange energy: "<<Integrate3(Ex,Nx,Ny,Nz)<<" Hartree"<<endl;
- double *left_Ex_m = new double [Nx*Ny*Nz];
- InitLeftEx_m(density,rs,left_Ex_m,Nx,Ny,Nz);
- double *right_Ex_m = new double [Nx*Ny*Nz];
- InitRightEx_m(density,rs,right_Ex_m,Nx,Ny,Nz);
- double *Ec = new double [Nx*Ny*Nz];
- InitEc(density,rs,Ec,Nx,Ny,Nz);
- cout<<"Correlation energy: "<<Integrate3(Ec,Nx,Ny,Nz)<<" Hartree"<<endl;
- double *left_Ec_m = new double [Nx*Ny*Nz];
- InitLeftEc_m(density,rs,left_Ec_m,Nx,Ny,Nz);
- double *right_Ec_m = new double [Nx*Ny*Nz];
- InitRightEc_m(density,rs,right_Ec_m,Nx,Ny,Nz);
- double *EXCwrtM = new double [Nx*Ny*Nz];
- FormIntM(homo2,lumo2,density,Ex,left_Ex_m,right_Ex_m,
- Ec,left_Ec_m,right_Ec_m,EXCwrtM,Nx,Ny,Nz);
- cout<<"Integral of EXC wrt M:"
- <<Integrate3(EXCwrtM,Nx,Ny,Nz)<<" Hartree"<<endl;
- delete [] left_Ex_m;
- delete [] right_Ex_m;
- delete [] left_Ec_m;
- delete [] right_Ec_m;
- delete [] EXCwrtM;
- double *left_Ex_r = new double [Nx*Ny*Nz];
- InitEx(left_dens,rsleft,left_Ex_r,Nx,Ny,Nz);
- double *right_Ex_r = new double [Nx*Ny*Nz];
- InitEx(right_dens,rsright,right_Ex_r,Nx,Ny,Nz);
- double *left_Ec_r = new double [Nx*Ny*Nz];
- InitEc(left_dens,rsleft,left_Ec_r,Nx,Ny,Nz);
- double *right_Ec_r = new double [Nx*Ny*Nz];
- InitEc(right_dens,rsright,right_Ec_r,Nx,Ny,Nz);
- double *EXCwrtR = new double [Nx*Ny*Nz];
- FormIntR(homo2,lumo2,delta_dens,Ex,left_Ex_r,right_Ex_r,
- Ec,left_Ec_r,right_Ec_r,EXCwrtR, Nx,Ny,Nz);
- cout<<"Integral of EXC wrt R:"
- <<Integrate3(EXCwrtR,Nx,Ny,Nz)<<" Hartree"<<endl;
- delete [] density;
- delete [] left_dens;
- delete [] right_dens;
- delete [] delta_dens;
- delete [] rs;
- delete [] rsleft;
- delete [] rsright;
- delete [] EXCwrtR;
- delete [] left_Ex_r;
- delete [] right_Ex_r;
- delete [] left_Ec_r;
- delete [] right_Ec_r;
- delete [] Ex;
- delete [] Ec;
- double *diff = new double [Nx*Ny*Nz];
- Substract(homo2,lumo2,diff,Nx,Ny,Nz);
- delete [] homo2;
- delete [] lumo2;
- double *vpot = new double [Nx*Ny*Nz];
- void ConstructV(double *charge, double *dest, int Nx, int Ny, int Nz);
- ConstructV(diff,vpot,Nx,Ny,Nz);
- double *integralc = new double [Nx*Ny*Nz];
- Mult(diff,vpot,integralc,Nx,Ny,Nz);
- delete [] diff;
- delete [] vpot;
- cout<<"Coulomb Integral="<<Integrate3(integralc,Nx,Ny,Nz)<<endl;
- delete [] integralc;
- return 0;
- }/* END OF main() */
- void SquareMO(double *source,double *dest, int Nx, int Ny, int Nz)
- {/* To find norm of MO, see below */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=source[i*Ny*Nz+j*Nz+k]
- *source[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void Substract(double *term1, double *term2, double *source,
- int Nx, int Ny, int Nz)
- {
- for(int i=0;i<Nx;i++){
- for(int j=0;j<Ny;j++){
- for(int k=0;k<Nz;k++){
- source[i*Ny*Nz+j*Nz+k]=term1[i*Ny*Nz+j*Nz+k]
- -term2[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void Mult(double *term1, double *term2, double *source,
- int Nx, int Ny, int Nz)
- {
- for(int i=0;i<Nx;i++){
- for(int j=0;j<Ny;j++){
- for(int k=0;k<Nz;k++){
- source[i*Ny*Nz+j*Nz+k]=term1[i*Ny*Nz+j*Nz+k]
- *term2[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void InitDeltaDens(double *source,double *dest, int Nx, int Ny, int Nz)
- {
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=source[i*Ny*Nz+j*Nz+k]/100.;
- }
- }
- }
- }
- void InitLeftDens(double *source,double *dest, double *diff,
- int Nx, int Ny, int Nz)
- {
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=source[i*Ny*Nz+j*Nz+k]
- -diff[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void InitRightDens(double *source,double *dest, double *diff,
- int Nx, int Ny, int Nz)
- {
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=source[i*Ny*Nz+j*Nz+k]
- +diff[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void Renorm(double *func, int Nx, int Ny, int Nz, double norm=1)
- {/* Call for normalizing MO density to 1, must calculate norm before */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- func[i*Ny*Nz+j*Nz+k]=func[i*Ny*Nz+j*Nz+k]/norm;
- }
- }
- }
- }
- void InitRS(double *source,double *dest, int Nx, int Ny, int Nz)
- {/* Constructs rs from density */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=pow(0.75/PI/source[i*Ny*Nz+j*Nz+k],1./3.);
- }
- }
- }
- }
- void InitEx(double *rho, double *rs, double *dest, int Nx, int Ny, int Nz)
- {/* Exchange energy on grid */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=AEX*rho[i*Ny*Nz+j*Nz+k]/rs[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void InitLeftEx_m(double *rho, double *rs, double *dest, int Nx, int Ny, int Nz)
- {/* Left part of Ex deriv wrt m */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=AEX*0.5*(pow(1-h,4/3.)+pow(1+h,4/3.))
- *rho[i*Ny*Nz+j*Nz+k]/rs[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void InitRightEx_m(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz)
- {/* Right part of Ex deriv wrt m */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=AEX*0.5*(pow(1+h,4/3.)+pow(1-h,4/3.))
- *rho[i*Ny*Nz+j*Nz+k]/rs[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void InitEc(double *rho, double *rs, double *dest, int Nx, int Ny, int Nz)
- {/* Correlation energy on grid */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=(
- -2.*A_0*(1.+alpha1_0*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_0*
- (beta1_0*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_0*rs[i*Ny*Nz+j*Nz+k]
- +beta3_0*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_0*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))+
- -2.*A_1*(1.+alpha1_1*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_1*
- (beta1_1*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_1*rs[i*Ny*Nz+j*Nz+k]
- +beta3_1*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_1*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*0+
- -2.*A_a*(1.+alpha1_a*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_a*
- (beta1_a*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_a*rs[i*Ny*Nz+j*Nz+k]
- +beta3_a*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_a*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*0
- )*rho[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void InitLeftEc_m(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz)
- {/* Left part of deriv wrt m */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=(
- -2.*A_0*(1.+alpha1_0*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_0*
- (beta1_0*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_0*rs[i*Ny*Nz+j*Nz+k]
- +beta3_0*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_0*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*(1-f_lz*pow(0-h,4))+
- -2.*A_1*(1.+alpha1_1*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_1*
- (beta1_1*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_1*rs[i*Ny*Nz+j*Nz+k]
- +beta3_1*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_1*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*f_lz*pow(0-h,4)+
- -2.*A_a*(1.+alpha1_a*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_a*
- (beta1_a*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_a*rs[i*Ny*Nz+j*Nz+k]
- +beta3_a*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_a*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*f_lz*(1-pow(0-h,4))/f2z)
- *rho[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void InitRightEc_m(double *rho, double *rs, double *dest,
- int Nx, int Ny, int Nz)
- {/* Right part of deriv wrt m */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=(
- -2.*A_0*(1.+alpha1_0*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_0*
- (beta1_0*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_0*rs[i*Ny*Nz+j*Nz+k]
- +beta3_0*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_0*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*(1-f_rz*pow(0+h,4))+
- -2.*A_1*(1.+alpha1_1*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_1*
- (beta1_1*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_1*rs[i*Ny*Nz+j*Nz+k]
- +beta3_1*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_1*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*f_rz*pow(0+h,4)+
- -2.*A_a*(1.+alpha1_a*rs[i*Ny*Nz+j*Nz+k])*log(1.+1./(2*A_a*
- (beta1_a*sqrt(rs[i*Ny*Nz+j*Nz+k])
- +beta2_a*rs[i*Ny*Nz+j*Nz+k]
- +beta3_a*pow(rs[i*Ny*Nz+j*Nz+k],1.5)
- +beta4_a*pow(rs[i*Ny*Nz+j*Nz+k],p+1.)
- )))*f_rz*(1-pow(0+h,4))/f2z)
- *rho[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void FormIntM(double *rhoHOMO, double *rhoLUMO, double *rho,
- double *Ex, double *Exleft, double *Exright,
- double *Ec, double *Ecleft, double *Ecright, double *dest,
- int Nx, int Ny, int Nz)
- {/* EXC wrt M on grid */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=
- (rhoHOMO[i*Ny*Nz+j*Nz+k]+rhoLUMO[i*Ny*Nz+j*Nz+k])
- *(rhoHOMO[i*Ny*Nz+j*Nz+k]+rhoLUMO[i*Ny*Nz+j*Nz+k])
- *(Exleft[i*Ny*Nz+j*Nz+k]+Ecleft[i*Ny*Nz+j*Nz+k]
- -2*Ex[i*Ny*Nz+j*Nz+k]-2*Ec[i*Ny*Nz+j*Nz+k]
- +Exright[i*Ny*Nz+j*Nz+k]+Ecright[i*Ny*Nz+j*Nz+k])
- /rho[i*Ny*Nz+j*Nz+k]/rho[i*Ny*Nz+j*Nz+k]/h/h;
- }
- }
- }
- }
- void FormIntR(double *rhoHOMO, double *rhoLUMO, double *drho,
- double *Ex, double *Exleft, double *Exright,
- double *Ec, double *Ecleft, double *Ecright,double *dest,
- int Nx, int Ny, int Nz)
- {/* EXC wrt rho on grid */
- for(int i=0;i<Nx;i+=1){
- for(int j=0;j<Ny;j+=1){
- for(int k=0;k<Nz;k+=1){
- dest[i*Ny*Nz+j*Nz+k]=
- (rhoHOMO[i*Ny*Nz+j*Nz+k]-rhoLUMO[i*Ny*Nz+j*Nz+k])
- *(rhoHOMO[i*Ny*Nz+j*Nz+k]-rhoLUMO[i*Ny*Nz+j*Nz+k])
- *(Exleft[i*Ny*Nz+j*Nz+k]+Ecleft[i*Ny*Nz+j*Nz+k]
- -2*Ex[i*Ny*Nz+j*Nz+k]-2*Ec[i*Ny*Nz+j*Nz+k]
- +Exright[i*Ny*Nz+j*Nz+k]+Ecright[i*Ny*Nz+j*Nz+k])
- /drho[i*Ny*Nz+j*Nz+k]/drho[i*Ny*Nz+j*Nz+k];
- }
- }
- }
- }
- void WriteGCube(string filename, double *data,int Nx, int Ny, int Nz)
- {
- ofstream outfile;
- outfile.open(filename.c_str());
- if (!outfile.is_open())
- {
- cout<<"Cannot open file "<<filename<<"."<<endl;
- return;
- }
- outfile.precision(6);
- outfile<<"User defined data"<<endl;
- outfile<<"Comment line"<<endl;
- outfile<<Nat<<" "<<xmin<<" "<<ymin<<" "<<zmin<<endl;
- outfile<<Nx<<" "<<dx<<" 0.000000 0.000000"<<endl;
- outfile<<Ny<<" "<<"0.000000 "<<dy<<" 0.000000"<<endl;
- outfile<<Nz<<" "<<"0.000000 0.000000 "<<dz<<endl;
- for(int i=0;i<Nat;i++)
- outfile<<" 1 1.000000 0.000000 0.000000 0.000000"<<endl;
- for (int i=0;i<Nx;i++){
- for (int j=0;j<Ny;j++){
- for (int k=0;k<Nz;k++){
- outfile<<" "<<data[i*Ny*Nz+j*Nz+k]<<" ";
- if (k % 6 == 5)
- outfile<<endl;
- }
- outfile<<endl;
- }
- }
- outfile.close();
- }
- void ConstructV(double *charge, double *dest, int Nx, int Ny, int Nz)
- {
- double *temp = new double [Nx*Ny*Nz];
- double fac=0.346873950;
- for(int i=0;i<Nx;i++){
- cout<<"Iteration "<<i<<"/"<<Nx-1<<"... "<<endl;
- for(int j=0;j<Ny;j++){
- for(int k=0;k<Nz;k++){
- /* Calculate V only on grid points which are used by Integrate3 */
- if ( ((i%2 == 1) && (j%2 == 0) && (k%2 == 0)) ||
- ((i%2 == 0) && (j%2 == 1) && (k%2 == 0)) ||
- ((i%2 == 0) && (j%2 == 0) && (k%2 == 1)) )
- {
- for(int ii=0;ii<Nx;ii+=1){
- for(int jj=0;jj<Ny;jj+=1){
- for(int kk=0;kk<Nz;kk+=1){
- if (i!=ii || j!=jj || k!=kk)
- temp[ii*Ny*Nz+jj*Nz+kk]=
- charge[ii*Ny*Nz+jj*Nz+kk]
- /sqrt((i-ii)*(i-ii)
- +(j-jj)*(j-jj)
- +(k-kk)*(k-kk))/dx;
- else
- temp[ii*Ny*Nz+jj*Nz+kk]=
- charge[ii*Ny*Nz+jj*Nz+kk]/dx/fac;
- }
- }
- }
- dest[i*Ny*Nz+j*Nz+k]=Integrate3(temp,Nx,Ny,Nz);}
- else dest[i*Ny*Nz+j*Nz+k]=0;
- }
- }
- }
- delete [] temp;
- }
- double Integrate3(double *func, int Nx, int Ny, int Nz)
- {/* Integrates on grid */
- double result=0;
- for(int i=0;i<Nx-1;i+=2){
- for(int j=0;j<Ny-1;j+=2){
- for(int k=0;k<Nz-1;k+=2){
- result+=func[(i+1)*Ny*Nz+j*Nz+k]/3.
- +func[i*Ny*Nz+(j+1)*Nz+k]/3.
- +func[i*Ny*Nz+j*Nz+(k+1)]/3.;
- }
- }
- }
- return result*8*dx*dy*dz;
- }
- double integrate6(double *func, int Nx, int Ny, int Nz)
- {/* Not used right now, more expensive */
- double result=0;
- for(int i=1;i<Nx-1;i+=2){
- for(int j=1;j<Ny-1;j+=2){
- for(int k=1;k<Nz-1;k+=2){
- result+=func[(i+1)*Ny*Nz+j*Nz+k]/6.
- +func[(i-1)*Ny*Nz+j*Nz+k]/6.
- +func[i*Ny*Nz+(j+1)*Nz+k]/6.
- +func[i*Ny*Nz+(j-1)*Nz+k]/6.
- +func[i*Ny*Nz+j*Nz+(k+1)]/6.
- +func[i*Ny*Nz+j*Nz+(k-1)]/6.;
- }
- }
- }
- return result*8*dx*dy*dz;
- }
Advertisement
Add Comment
Please, Sign In to add comment