int main(int argc, char* argv[]){ int N = 16;//Teilchenzahl double L = 1.0;//Seitenlänge des Systems double h = 0.01;//Schrittweite double Temp = 1.0;//Anfangstemperatur double rx[N];//x-Koordinate des Ortes double ry[N];//y-Koordinate des Ortes double vx[N];//x-Koordinate der Geschwindigkeit double vy[N];//y-Koordinate der Geschwindigkeit initialize(rx, ry, vx, vy, N, L, Temp); std::cout << "x\ty\tv_x\t\tv_y" << std::endl; for(int i = 0; i < 16; ++i){ std::cout << rx[i] << "\t" << ry[i] << "\t" << vx[i] << "\t" << vy[i] << std::endl; } //Test der Lennard-Jones-Funktion std::cout << "Lennard-Jones-Potential: " << Lennard_Jones(1.0, 3.0, 2.0, 4.0) << std::endl; //Test der Schwerpunktsfunktion std::cout << "Schwerpunktsgeschwindigkeit x: " << Schwerpunkt(vx, vy, N)[0] << std::endl; std::cout << "Schwerpunktsgeschwindigkeit y: " << Schwerpunkt(vx, vy, N)[1] << std::endl; //Test der potentiellen Energiefunktion std::cout << "Potentielle Energie: " << Pot(rx, ry, N) << std::endl; //Test der kintetischen Energiefunktion std::cout << "Kinetische Energie: " << Kin(vx, vy, N) << std::endl; //Test der Temperaturfunktion std::cout << "Temperatur: " << Temperatur(vx, vy, N) << std::endl; //Test der Kraftfunktion double Kraftx = 0.0; double Krafty = 0.0; int Teilchen = 13; for(int i = 0; i < N; ++i){ if(i != Teilchen) Kraftx += Kraft(rx[Teilchen], ry[Teilchen], rx[i], ry[i])[0]; if(i != Teilchen) Krafty += Kraft(rx[Teilchen], ry[Teilchen], rx[i], ry[i])[1]; } std::cout << "Kraft x: " << Kraftx << std::endl; std::cout << "Kraft y: " << Krafty << std::endl; //Test der Gesamtkraftfunktion /*double Gesamtkraftx = 0.0; double Gesamtkrafty = 0.0; int Teilchen = 0; for(int i = 0; i < N; ++i){ if(i != Teilchen) Gesamtkraftx += Gesamtkraft(rx[Teilchen], ry[Teilchen], rx[i], ry[i])[0]; if(i != Teilchen) Gesamtkrafty += Kraft(rx[Teilchen], ry[Teilchen], rx[i], ry[i])[1]; }*/ std::cout << "Gesamtkraft x: " << Gesamtkraft(rx[Teilchen], ry[Teilchen], rx, ry, L, N)[0] << std::endl; std::cout << "Gesamtkraft y: " << Gesamtkraft(rx[Teilchen], ry[Teilchen], rx, ry, L, N)[1] << std::endl; //Test des Verlet-Algorithmus //std::cout << "Verlet x: " << Verlet(rx, ry, vx, vy, h, L, N)[6] << std::endl; std::cout << "Verlet x" << std::endl; for(int i = 0; i < 16; ++i){ std::cout << Verlet(rx, ry, vx, vy, h, L, N)[i] << std::endl; } return 0; }
void Average_ekt::evaluate_valence(Wavefunction_data * wfdata, Wavefunction * wf, System * sys, Pseudopotential *psp, Sample_point * sample, Average_return & avg) { /* This is to evaluate the v_ij in extended Koopmans' theorem -- for valence bands */ wf->updateVal(wfdata,sample); Wf_return wfval_base(wf->nfunc(),2); wf->getVal(wfdata,0,wfval_base); int nup=sys->nelectrons(0); int ndown=sys->nelectrons(1); int nelectrons=nup+ndown; Array1 <doublevar> rn(3), rnp(3), rnpp(3); Array1 <Array2 <dcomplex> > movals1_base(nelectrons); Array2 <dcomplex> movals_p(nmo, 1); Array1 <doublevar> VLoc(nelectrons); Array1 <doublevar> VLoc0(nelectrons); Array1 <doublevar> Vtest(nelectrons+1); Array1 <dcomplex> pseudo_t(nmo); /*************************************** Routines to get Kin and Vloc ****************************************/ Array2<doublevar> Kin(nelectrons, wf->nfunc()); //Array2<doublevar> Kin0(nelectrons, wf->nfunc()); Array2<dcomplex> movals_lap(nmo, 5); for(int e=0; e< nelectrons; e++) { movals1_base(e).Resize(nmo,1); //Kin(e).Resize(1); //The Kinetic energy calc_mos(sample, e, movals1_base(e)); } // sys->calcKineticSeparated(sample,saved_r(i),Kin); //***** calculate kinetic energy and potential energy sys->calcKineticSeparated(wfdata, sample, wf, Kin); sys->calcLocSeparated(sample, VLoc); Array1 <Wf_return> wfs(nelectrons); Wavefunction_storage * store; wf->generateStorage(store); for(int i=0; i< npoints_eval; i++) { Array1 <doublevar> oldpos(3); sample->getElectronPos(0,oldpos); sample->setElectronPosNoNotify(0, saved_r(i)); calc_mosLap(sample, 0, movals_lap); int nrandvar=psp->nTest(); Array1 <doublevar> rand_num(nrandvar); for(int l=0; l< nrandvar; l++) rand_num(l)=rng.ulec(); calc_mos(sample,0,movals_p); calcPseudoMo(sys, sample, psp, rand_num, pseudo_t); sample->setElectronPosNoNotify(0,oldpos); Array1 <Wf_return> wf_eval; wf->evalTestPos(saved_r(i),sample,wfs); sys->calcLocWithTestPos(sample, saved_r(i), Vtest); doublevar vtot = 0.0; for (int e=0; e<nelectrons; e++) { vtot += Vtest(e); } doublevar dist1=0; for(int m=0; m < nmo; m++) dist1+=norm(movals_p(m,0)); for(int orbnum=0; orbnum < nmo; orbnum++) { avg.vals(orbnum)+=norm(movals_p(orbnum,0))/(dist1*npoints_eval);//this is the normalization } Array2<doublevar> totalv(nelectrons, wf->nfunc()); totalv = 0.0; psp->calcNonlocSeparated(wfdata, sys, sample, wf, totalv); int place = 0; for (int orbnum = 0; orbnum < nmo; orbnum++ ) { for (int orbnum2 = 0; orbnum2 < nmo; orbnum2++ ) { dcomplex tmp3=conj(movals_p(orbnum, 0))* (pseudo_t(orbnum2) + Vtest(nelectrons)*movals_p(orbnum2, 0) -0.5*movals_lap(orbnum2, 4) +movals_p(orbnum2, 0)*vtot) /(dist1*npoints_eval); // tmp3=conj(movals_p(orbnum, 0))*(movals_p(orbnum2, 0))/(dist1*npoints_eval); //dcomplex tmp3=conj(movals_p(orbnum, 0))*(pseudo_t(orbnum2))/(dist1*npoints_eval); int which_obdm = 0; avg.vals(nmo+8*nmo*nmo + 2*which_obdm*nmo*nmo+place) += tmp3.real(); avg.vals(nmo+8*nmo*nmo + 2*which_obdm*nmo*nmo+place+1) += tmp3.imag(); which_obdm = 1; //tmp3=conj(movals_p(orbnum, 0))*(-0.5*movals_lap(orbnum2, 4))/(dist1*npoints_eval); avg.vals(nmo+8*nmo*nmo + 2*which_obdm*nmo*nmo+place) += tmp3.real(); avg.vals(nmo+8*nmo*nmo + 2*which_obdm*nmo*nmo+place+1) += tmp3.imag(); place += 2; } } ofstream dump; if(dump_data) { dump.open("EKT_DUMP",ios::app); } for(int e=0; e< nelectrons; e++) { dcomplex psiratio_1b=conj(exp(dcomplex(wfs(e).amp(0,0) -wfval_base.amp(0,0), wfs(e).phase(0,0) -wfval_base.phase(0,0)))); int which_obdm=0; if(e >= nup) { which_obdm=1; } dcomplex tmp, tmp2, tmp3; int place=0; dcomplex prefactor=psiratio_1b/(dist1*npoints_eval); //cout << "Local potential" << " Kinetic" << " Pseudo" << endl; // cout << VLoc(e) << " " << Kin(e, 0) << " " << totalv(e, 0) << endl; for(int orbnum=0; orbnum < nmo; orbnum++) { for(int orbnum2=0; orbnum2 < nmo; orbnum2++) { // assert(wf->nfunc()==1); tmp = 0.5*(movals_p(orbnum,0)*conj(movals1_base(e)(orbnum2,0))*prefactor + movals1_base(e)(orbnum, 0)*conj(movals_p(orbnum2, 0))*conj(prefactor)); tmp2 = tmp*(VLoc(e) + Kin(e, 0) + totalv(e, 0)); //rho_ij part the one body reduced density matrix doublevar tmp2_mag=abs(tmp2); if(tmp2_mag > ekt_cutoff) { tmp2*=ekt_cutoff/tmp2_mag; } avg.vals(nmo+2*which_obdm*nmo*nmo+place) += tmp.real(); avg.vals(nmo+2*which_obdm*nmo*nmo+place+1) += tmp.imag(); //v_ij^v part //tmp3 = 0.0; avg.vals(nmo+4*nmo*nmo + 2*which_obdm*nmo*nmo+place)+=tmp2.real(); avg.vals(nmo+4*nmo*nmo + 2*which_obdm*nmo*nmo+place+1)+=tmp2.imag(); if(dump_data) { if(orbnum==orbnum2 and orbnum==0) { sample->getElectronPos(e,oldpos); dump << which_obdm << "," << tmp2.real() << "," << tmp.real() << "," << VLoc(e) << "," << Kin(e,0) << "," << totalv(e,0) << "," << oldpos(0) << "," << oldpos(1) << "," << oldpos(2) << endl; } } if (eval_conduction) { //tmp3 = -1.0*psiratio_1b*conj(movals1_base(e)(orbnum, 0))*(vtot*movals_lap(orbnum2, 0) // + pseudo_t(orbnum2) - 0.5*movals_lap(orbnum2, 4) + Vtest(nelectrons)*movals_lap(orbnum2, 0))/(dist1*npoints_eval); tmp3 = -1.0*conj(movals1_base(e)(orbnum, 0))*movals_p(orbnum2, 0)*prefactor*(VLoc(e) + Kin(e, 0) + totalv(e, 0) + Vtest(e)); doublevar tmp3_mag=abs(tmp3); if(tmp3_mag > ekt_cutoff) { tmp3*=ekt_cutoff/tmp3_mag; } avg.vals(nmo+8*nmo*nmo + 2*which_obdm*nmo*nmo+place) += tmp3.real(); avg.vals(nmo+8*nmo*nmo + 2*which_obdm*nmo*nmo+place+1) += tmp3.imag(); } place+=2; } } } } delete store; }