public override bool Run() { Iterative_Greens_Function iter = new Iterative_Greens_Function(this); iter.Iterate(); //throw new NotImplementedException(); return true; }
public override bool Run() { Iterative_Greens_Function iter = new Iterative_Greens_Function(this); iter.Iterate(); //throw new NotImplementedException(); return(true); }
public override void Get_ChargeDensity(ILayer[] layers, ref SpinResolved_Data charge_density, Band_Data chem_pot) { // convert the chemical potential into a quantum mechanical potential Band_Data dft_pot = chem_pot.DeepenThisCopy(); Get_Potential(ref dft_pot, layers); double[,] xy_energy = new double[nx, ny]; xy_energy = Solve_Eigenvector_Problem(dft_pot, ref charge_density); /*int max_wavefunction = (from val in eig_decomp.EigenValues where val < no_kb_T * Physics_Base.kB * temperature select val).ToArray().Length; double[,] dens_xy = new double[nx, ny]; // and generate a density for the y-direction for (int i = 0; i < nx; i++) for (int j = 0; j < ny; j++) for (int k = 0; k < max_wavefunction; k++) dens_xy[i, j] += DoubleComplex.Norm(eig_decomp.EigenVector(k)[i * ny + j]) * DoubleComplex.Norm(eig_decomp.EigenVector(k)[i * ny + j]) * Get_Fermi_Function(energies[k]); */ IExperiment exp_green; exp_green = new Iterative_Greens_Function_Test.Experiment(); Iterative_Greens_Function_Test.Iterative_Greens_Function iter = new Iterative_Greens_Function_Test.Iterative_Greens_Function(exp_green, xy_energy); double[,] dens_xy = new double[nx, ny]; double max_energy = Physics_Base.kB * temperature * no_kb_T; DoubleMatrix xy_energy_mat = new DoubleMatrix(xy_energy); double min_energy = xy_energy_mat.Min(); double dE = 0.1; //double min_energy = -1.0 * max_energy; int n_slices = (int)((max_energy - min_energy) / dE); for (int n = 1; n < n_slices-1; n++) { double energy = min_energy + n * dE; double[,] dens_per_E = iter.GetDoS(energy); double fermi_func = Get_Fermi_Function(energy); for (int i = 0; i < nx; i++) for (int j = 0; j < ny; j++) { dens_xy[i, j] += dens_per_E[i,j] * fermi_func; } } //double fermi_fact_max = Math.Exp(max_energy / (Physics_Base.kB * temperature)) + 1; //double fermi_fact_min = 2.0; double[,] dens_per_E_max = iter.GetDoS(max_energy); double[,] dens_per_E_min = iter.GetDoS(min_energy); double fermi_func_max = Get_Fermi_Function(max_energy); double fermi_func_min = Get_Fermi_Function(min_energy); for (int i = 0; i < nx; i++) for (int j = 0; j < ny; j++) { dens_xy[i, j] += 0.5*(dens_per_E_max[i, j] * fermi_func_max + dens_per_E_min[i,j] * fermi_func_min); } // multiply the z-densities by the xy-density for (int i = 0; i < nx; i++) for (int j = 0; j < ny; j++) for (int k = 0; k < nz; k++) { charge_density.Spin_Up.vol[k][i, j] *= dens_xy[i, j]; charge_density.Spin_Down.vol[k][i, j] *= dens_xy[i, j]; } // and multiply the density by -e to get the charge density (as these are electrons) charge_density = unit_charge * charge_density; }
public override void Get_ChargeDensity(ILayer[] layers, ref SpinResolved_Data charge_density, Band_Data chem_pot) { // convert the chemical potential into a quantum mechanical potential Band_Data dft_pot = chem_pot.DeepenThisCopy(); Get_Potential(ref dft_pot, layers); double[,] xy_energy = new double[nx, ny]; xy_energy = Solve_Eigenvector_Problem(dft_pot, ref charge_density); /*int max_wavefunction = (from val in eig_decomp.EigenValues * where val < no_kb_T * Physics_Base.kB * temperature * select val).ToArray().Length; * * double[,] dens_xy = new double[nx, ny]; * // and generate a density for the y-direction * for (int i = 0; i < nx; i++) * for (int j = 0; j < ny; j++) * for (int k = 0; k < max_wavefunction; k++) * dens_xy[i, j] += DoubleComplex.Norm(eig_decomp.EigenVector(k)[i * ny + j]) * DoubleComplex.Norm(eig_decomp.EigenVector(k)[i * ny + j]) * Get_Fermi_Function(energies[k]); */ IExperiment exp_green; exp_green = new Iterative_Greens_Function_Test.Experiment(); Iterative_Greens_Function_Test.Iterative_Greens_Function iter = new Iterative_Greens_Function_Test.Iterative_Greens_Function(exp_green, xy_energy); double[,] dens_xy = new double[nx, ny]; double max_energy = Physics_Base.kB * temperature * no_kb_T; DoubleMatrix xy_energy_mat = new DoubleMatrix(xy_energy); double min_energy = xy_energy_mat.Min(); double dE = 0.1; //double min_energy = -1.0 * max_energy; int n_slices = (int)((max_energy - min_energy) / dE); for (int n = 1; n < n_slices - 1; n++) { double energy = min_energy + n * dE; double[,] dens_per_E = iter.GetDoS(energy); double fermi_func = Get_Fermi_Function(energy); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { dens_xy[i, j] += dens_per_E[i, j] * fermi_func; } } } //double fermi_fact_max = Math.Exp(max_energy / (Physics_Base.kB * temperature)) + 1; //double fermi_fact_min = 2.0; double[,] dens_per_E_max = iter.GetDoS(max_energy); double[,] dens_per_E_min = iter.GetDoS(min_energy); double fermi_func_max = Get_Fermi_Function(max_energy); double fermi_func_min = Get_Fermi_Function(min_energy); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { dens_xy[i, j] += 0.5 * (dens_per_E_max[i, j] * fermi_func_max + dens_per_E_min[i, j] * fermi_func_min); } } // multiply the z-densities by the xy-density for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { for (int k = 0; k < nz; k++) { charge_density.Spin_Up.vol[k][i, j] *= dens_xy[i, j]; charge_density.Spin_Down.vol[k][i, j] *= dens_xy[i, j]; } } } // and multiply the density by -e to get the charge density (as these are electrons) charge_density = unit_charge * charge_density; }