public override SpinResolved_Data Get_ChargeDensity_Deriv(ILayer[] layers, SpinResolved_Data carrier_density_deriv, SpinResolved_Data dopent_density_deriv, Band_Data chem_pot) { for (int i = 0; i < nz; i++) { double z = dz * i + zmin; // get the relevant layer and if it's frozen out, don't recalculate the dopent charge ILayer current_Layer = Solver_Bases.Geometry.Geom_Tool.GetLayer(layers, z); ZeroD_Density charge_calc = new ZeroD_Density(current_Layer, temperature); if (!current_Layer.Dopents_Frozen_Out(temperature)) { double local_dopent_density_deriv = charge_calc.Get_DopentDensityDeriv(chem_pot.vec[i]); dopent_density_deriv.Spin_Up.vec[i] = 0.5 * local_dopent_density_deriv; dopent_density_deriv.Spin_Down.vec[i] = 0.5 * local_dopent_density_deriv; } else { dopent_density_deriv.Spin_Up.vec[i] = 0.0; dopent_density_deriv.Spin_Down.vec[i] = 0.0; } carrier_density_deriv.Spin_Up.vec[i] = 0.5 * charge_calc.Get_CarrierDensityDeriv(chem_pot.vec[i]); carrier_density_deriv.Spin_Down.vec[i] = 0.5 * charge_calc.Get_CarrierDensityDeriv(chem_pot.vec[i]); } return(carrier_density_deriv + dopent_density_deriv); }
public override SpinResolved_Data Get_ChargeDensity_Deriv(ILayer[] layers, SpinResolved_Data carrier_density_deriv, SpinResolved_Data dopent_density_deriv, Band_Data chem_pot) { for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { // leave the edges zeroed if (i == 0 || i == nx - 1 || j == 0 || j == ny - 1) { continue; } double x = dx * i + xmin; double y = dy * j + ymin; // get the relevant layer and if it's frozen out, don't recalculate the dopent charge ILayer current_Layer = Solver_Bases.Geometry.Geom_Tool.GetLayer(layers, plane, x, y, pos_z); ZeroD_Density charge_calc = new ZeroD_Density(current_Layer, temperature); if (!current_Layer.Dopents_Frozen_Out(temperature)) { double local_dopent_density_deriv = charge_calc.Get_DopentDensityDeriv(chem_pot.mat[i, j]); dopent_density_deriv.Spin_Up.mat[i, j] = 0.5 * local_dopent_density_deriv; dopent_density_deriv.Spin_Down.mat[i, j] = 0.5 * local_dopent_density_deriv; } else { dopent_density_deriv.Spin_Up.mat[i, j] = 0.0; dopent_density_deriv.Spin_Down.mat[i, j] = 0.0; } carrier_density_deriv.Spin_Up.mat[i, j] = 0.5 * charge_calc.Get_CarrierDensityDeriv(chem_pot.mat[i, j]); carrier_density_deriv.Spin_Down.mat[i, j] = 0.5 * charge_calc.Get_CarrierDensityDeriv(chem_pot.mat[i, j]); } } return(carrier_density_deriv + dopent_density_deriv); }