def initialize(self): self.eta /= Hartree self.ecut /= Hartree calc = self.calc # kpoint init self.kd = kd = calc.wfs.kd self.bzk_kc = kd.bzk_kc self.ibzk_kc = kd.ibzk_kc self.nkpt = kd.nbzkpts self.ftol /= self.nkpt # band init if self.nbands is None: self.nbands = calc.wfs.nbands self.nvalence = calc.wfs.nvalence # cell init self.acell_cv = calc.atoms.cell / Bohr self.bcell_cv, self.vol, self.BZvol = get_primitive_cell(self.acell_cv) # grid init self.nG = calc.get_number_of_grid_points() self.nG0 = self.nG[0] * self.nG[1] * self.nG[2] gd = GridDescriptor(self.nG, calc.wfs.gd.cell_cv, pbc_c=True, comm=serial_comm) self.gd = gd self.h_cv = gd.h_cv # obtain eigenvalues, occupations nibzkpt = kd.nibzkpts kweight_k = kd.weight_k try: self.e_kn except: self.printtxt('Use eigenvalues from the calculator.') self.e_kn = np.array( [calc.get_eigenvalues(kpt=k) for k in range(nibzkpt)]) / Hartree self.printtxt('Eigenvalues(k=0) are:') print >> self.txt, self.e_kn[0] * Hartree self.f_kn = np.array([ calc.get_occupation_numbers(kpt=k) / kweight_k[k] for k in range(nibzkpt) ]) / self.nkpt # k + q init assert self.q_c is not None self.qq_v = np.dot(self.q_c, self.bcell_cv) # summation over c if self.optical_limit: kq_k = np.arange(self.nkpt) self.expqr_g = 1. else: r_vg = gd.get_grid_point_coordinates() # (3, nG) qr_g = gemmdot(self.qq_v, r_vg, beta=0.0) self.expqr_g = np.exp(-1j * qr_g) del r_vg, qr_g kq_k = kd.find_k_plus_q(self.q_c) self.kq_k = kq_k # Plane wave init self.npw, self.Gvec_Gc, self.Gindex_G = set_Gvectors( self.acell_cv, self.bcell_cv, self.nG, self.ecut) # Projectors init setups = calc.wfs.setups pt = LFC(gd, [setup.pt_j for setup in setups], dtype=calc.wfs.dtype, forces=True) spos_ac = calc.atoms.get_scaled_positions() pt.set_k_points(self.bzk_kc) pt.set_positions(spos_ac) self.pt = pt # Printing calculation information self.print_stuff() return
def initialize(self): self.eta /= Hartree self.ecut /= Hartree calc = self.calc self.nspins = self.calc.wfs.nspins # kpoint init self.kd = kd = calc.wfs.kd self.nikpt = kd.nibzkpts self.ftol /= kd.nbzkpts # cell init self.acell_cv = calc.wfs.gd.cell_cv self.acell_cv, self.bcell_cv, self.vol, self.BZvol = \ get_primitive_cell(self.acell_cv,rpad=self.rpad) # grid init gd = calc.wfs.gd.new_descriptor(comm=serial_comm) self.pbc = gd.pbc_c self.gd = gd self.nG0 = np.prod(gd.N_c) # Number of grid points and volume including zero padding self.nGrpad = gd.N_c * self.rpad self.nG0rpad = np.prod(self.nGrpad) self.d_c = [ Gradient(gd, i, n=4, dtype=complex).apply for i in range(3) ] # obtain eigenvalues, occupations nibzkpt = kd.nibzkpts kweight_k = kd.weight_k self.eFermi = self.calc.occupations.get_fermi_level() try: self.e_skn self.printtxt('Use eigenvalues from user.') except: self.printtxt('Use eigenvalues from the calculator.') self.e_skn = {} self.f_skn = {} for ispin in range(self.nspins): self.e_skn[ispin] = np.array([ calc.get_eigenvalues(kpt=k, spin=ispin) for k in range(nibzkpt) ]) / Hartree self.f_skn[ispin] = np.array([ calc.get_occupation_numbers(kpt=k, spin=ispin) / kweight_k[k] for k in range(nibzkpt) ]) / kd.nbzkpts #self.printtxt('Eigenvalues(k=0) are:') #print >> self.txt, self.e_skn[0][0] * Hartree self.enoshift_skn = {} for ispin in range(self.nspins): self.enoshift_skn[ispin] = self.e_skn[ispin].copy() if self.eshift is not None: self.add_discontinuity(self.eshift) self.printtxt('Shift unoccupied bands by %f eV' % (self.eshift)) # k + q init if self.q_c is not None: self.qq_v = np.dot(self.q_c, self.bcell_cv) # summation over c if self.optical_limit: kq_k = np.arange(kd.nbzkpts) self.expqr_g = 1. else: r_vg = gd.get_grid_point_coordinates() # (3, nG) qr_g = gemmdot(self.qq_v, r_vg, beta=0.0) self.expqr_g = np.exp(-1j * qr_g) del r_vg, qr_g kq_k = kd.find_k_plus_q(self.q_c) self.kq_k = kq_k # Plane wave init if self.G_plus_q: self.npw, self.Gvec_Gc, self.Gindex_G = set_Gvectors(self.acell_cv, self.bcell_cv, self.gd.N_c, self.ecut, q=self.q_c) else: self.npw, self.Gvec_Gc, self.Gindex_G = set_Gvectors( self.acell_cv, self.bcell_cv, self.gd.N_c, self.ecut) # band init if self.nbands is None: self.nbands = calc.wfs.bd.nbands self.nvalence = calc.wfs.nvalence # Projectors init setups = calc.wfs.setups self.spos_ac = calc.atoms.get_scaled_positions() if self.pwmode: self.pt = PWLFC([setup.pt_j for setup in setups], self.calc.wfs.pd) self.pt.set_positions(self.spos_ac) else: self.pt = LFC(gd, [setup.pt_j for setup in setups], KPointDescriptor(self.kd.bzk_kc), dtype=complex, forces=True) self.pt.set_positions(self.spos_ac) # Printing calculation information self.print_stuff() return
def initialize(self): self.eta /= Hartree self.ecut /= Hartree calc = self.calc self.nspins = self.calc.wfs.nspins # kpoint init self.kd = kd = calc.wfs.kd self.nikpt = kd.nibzkpts self.ftol /= kd.nbzkpts # cell init self.acell_cv = calc.wfs.gd.cell_cv self.acell_cv, self.bcell_cv, self.vol, self.BZvol = \ get_primitive_cell(self.acell_cv,rpad=self.rpad) # grid init gd = calc.wfs.gd.new_descriptor(comm=serial_comm) self.pbc = gd.pbc_c self.gd = gd self.nG0 = np.prod(gd.N_c) # Number of grid points and volume including zero padding self.nGrpad = gd.N_c * self.rpad self.nG0rpad = np.prod(self.nGrpad) self.d_c = [Gradient(gd, i, n=4, dtype=complex).apply for i in range(3)] # obtain eigenvalues, occupations nibzkpt = kd.nibzkpts kweight_k = kd.weight_k self.eFermi = self.calc.occupations.get_fermi_level() try: self.e_skn self.printtxt('Use eigenvalues from user.') except: self.printtxt('Use eigenvalues from the calculator.') self.e_skn = {} self.f_skn = {} for ispin in range(self.nspins): self.e_skn[ispin] = np.array([calc.get_eigenvalues(kpt=k, spin=ispin) for k in range(nibzkpt)]) / Hartree self.f_skn[ispin] = np.array([calc.get_occupation_numbers(kpt=k, spin=ispin) / kweight_k[k] for k in range(nibzkpt)]) / kd.nbzkpts #self.printtxt('Eigenvalues(k=0) are:') #print >> self.txt, self.e_skn[0][0] * Hartree self.enoshift_skn = {} for ispin in range(self.nspins): self.enoshift_skn[ispin] = self.e_skn[ispin].copy() if self.eshift is not None: self.add_discontinuity(self.eshift) self.printtxt('Shift unoccupied bands by %f eV' % (self.eshift)) # k + q init if self.q_c is not None: self.qq_v = np.dot(self.q_c, self.bcell_cv) # summation over c if self.optical_limit: kq_k = np.arange(kd.nbzkpts) self.expqr_g = 1. else: r_vg = gd.get_grid_point_coordinates() # (3, nG) qr_g = gemmdot(self.qq_v, r_vg, beta=0.0) self.expqr_g = np.exp(-1j * qr_g) del r_vg, qr_g kq_k = kd.find_k_plus_q(self.q_c) self.kq_k = kq_k # Plane wave init if self.G_plus_q: self.npw, self.Gvec_Gc, self.Gindex_G = set_Gvectors(self.acell_cv, self.bcell_cv, self.gd.N_c, self.ecut, q=self.q_c) else: self.npw, self.Gvec_Gc, self.Gindex_G = set_Gvectors(self.acell_cv, self.bcell_cv, self.gd.N_c, self.ecut) # band init if self.nbands is None: self.nbands = calc.wfs.bd.nbands self.nvalence = calc.wfs.nvalence # Projectors init setups = calc.wfs.setups self.spos_ac = calc.atoms.get_scaled_positions() if self.pwmode: self.pt = PWLFC([setup.pt_j for setup in setups], self.calc.wfs.pd) self.pt.set_positions(self.spos_ac) else: self.pt = LFC(gd, [setup.pt_j for setup in setups], KPointDescriptor(self.kd.bzk_kc), dtype=complex, forces=True) self.pt.set_positions(self.spos_ac) # Printing calculation information self.print_stuff() return
def initialize(self): self.eta /= Hartree self.ecut /= Hartree calc = self.calc # kpoint init self.kd = kd = calc.wfs.kd self.bzk_kc = kd.bzk_kc self.ibzk_kc = kd.ibzk_kc self.nkpt = kd.nbzkpts self.ftol /= self.nkpt # band init if self.nbands is None: self.nbands = calc.wfs.nbands self.nvalence = calc.wfs.nvalence # cell init self.acell_cv = calc.atoms.cell / Bohr self.bcell_cv, self.vol, self.BZvol = get_primitive_cell(self.acell_cv) # grid init self.nG = calc.get_number_of_grid_points() self.nG0 = self.nG[0] * self.nG[1] * self.nG[2] gd = GridDescriptor(self.nG, calc.wfs.gd.cell_cv, pbc_c=True, comm=serial_comm) self.gd = gd self.h_cv = gd.h_cv # obtain eigenvalues, occupations nibzkpt = kd.nibzkpts kweight_k = kd.weight_k try: self.e_kn except: self.printtxt('Use eigenvalues from the calculator.') self.e_kn = np.array([calc.get_eigenvalues(kpt=k) for k in range(nibzkpt)]) / Hartree self.printtxt('Eigenvalues(k=0) are:') print >> self.txt, self.e_kn[0] * Hartree self.f_kn = np.array([calc.get_occupation_numbers(kpt=k) / kweight_k[k] for k in range(nibzkpt)]) / self.nkpt # k + q init assert self.q_c is not None self.qq_v = np.dot(self.q_c, self.bcell_cv) # summation over c if self.optical_limit: kq_k = np.arange(self.nkpt) self.expqr_g = 1. else: r_vg = gd.get_grid_point_coordinates() # (3, nG) qr_g = gemmdot(self.qq_v, r_vg, beta=0.0) self.expqr_g = np.exp(-1j * qr_g) del r_vg, qr_g kq_k = kd.find_k_plus_q(self.q_c) self.kq_k = kq_k # Plane wave init self.npw, self.Gvec_Gc, self.Gindex_G = set_Gvectors(self.acell_cv, self.bcell_cv, self.nG, self.ecut) # Projectors init setups = calc.wfs.setups pt = LFC(gd, [setup.pt_j for setup in setups], dtype=calc.wfs.dtype, forces=True) spos_ac = calc.atoms.get_scaled_positions() pt.set_k_points(self.bzk_kc) pt.set_positions(spos_ac) self.pt = pt # Printing calculation information self.print_stuff() return