def calculate_isolate_molecular_levels(self, tp): atoms = self.isolate_atoms atoms.pbc = True p = tp.gpw_kwargs.copy() p['nbands'] = None if 'mixer' in p: if not tp.spinpol: p['mixer'] = Mixer(0.1, 5, weight=100.0) else: p['mixer'] = MixerDif(0.1, 5, weight=100.0) p['poissonsolver'] = PoissonSolver(nn=2) if type(p['basis']) is dict and len(p['basis']) == len(tp.atoms): p['basis'] = 'dzp' raise Warning('the dict basis is not surpported in isolate atoms') if 'txt' in p and p['txt'] != '-': p['txt'] = 'isolate_' + p['txt'] atoms.set_calculator(GPAW(**p)) atoms.get_potential_energy() setups = atoms.calc.wfs.setups self.project_basis_in_molecule = get_atom_indices( self.project_atoms_in_molecule, setups) kpt = atoms.calc.wfs.kpt_u[0] s_mm = atoms.calc.wfs.S_qMM[0] c_nm = eig_states_norm(kpt.C_nM, s_mm) self.isolate_eigen_values = kpt.eps_n self.isolate_eigen_vectors = c_nm self.isolate_s_mm = s_mm
def initialize(self, tp): kw = tp.analysis_parameters if self.restart: self.initialize_selfenergy_and_green_function(tp) else: self.selfenergies = tp.selfenergies p = self.set_default_analysis_parameters() for key in kw: if key in [ 'energies', 'lead_pairs', 'dos_project_atoms', 'project_equal_atoms', 'project_molecular_levels', 'isolate_atoms', 'dos_project_orbital', 'trans_project_orbital', 'eig_trans_channel_energies', 'eig_trans_channel_num', 'dos_realspace_energies' ]: p[key] = kw[key] for key in p: vars(self)[key] = p[key] ef = tp.lead_fermi[0] path = tp.contour.get_plot_path() self.energies = path.energies self.my_energies = path.my_energies self.weights = path.weights self.my_weights = path.my_weights self.nids = path.nids self.my_nids = path.my_nids for variable in [ self.eig_trans_channel_energies, self.dos_realspace_energies ]: if variable is not None: variable = np.array(variable) + ef ecomm = tp.contour.comm if self.eig_trans_channel_energies is not None: self.my_eig_trans_channel_energies = np.array_split( self.eig_trans_channel_energies, ecomm.size)[ecomm.rank] self.my_eig_trans_channel_nids = np.array_split( np.arange(len(self.eig_trans_channel_energies)), ecomm.size)[ecomm.rank] if self.dos_realspace_energies is not None: self.my_dos_realspace_energies = np.array_split( self.dos_realspace_energies, ecomm.size)[ecomm.rank] self.my_dos_realspace_nids = np.array_split( np.arange(len(self.dos_realspace_energies)), ecomm.size)[ecomm.rank] setups = tp.inner_setups self.project_atoms_in_device = self.project_equal_atoms[0] self.project_atoms_in_molecule = self.project_equal_atoms[1] self.project_basis_in_device = get_atom_indices( self.project_atoms_in_device, setups) if self.isolate_atoms is not None: self.calculate_isolate_molecular_levels(tp) self.overhead_data_saved = False if world.rank == 0: if not os.access('analysis_data', os.F_OK): os.mkdir('analysis_data') if not os.access('analysis_data/ionic_step_0', os.F_OK): os.mkdir('analysis_data/ionic_step_0') world.barrier() self.data = {}
def initialize(self, tp): kw = tp.analysis_parameters if self.restart: self.initialize_selfenergy_and_green_function(tp) else: self.selfenergies = tp.selfenergies p = self.set_default_analysis_parameters() for key in kw: if key in ['energies', 'lead_pairs', 'dos_project_atoms', 'project_equal_atoms', 'project_molecular_levels', 'isolate_atoms', 'dos_project_orbital', 'trans_project_orbital', 'eig_trans_channel_energies', 'eig_trans_channel_num', 'dos_realspace_energies']: p[key] = kw[key] for key in p: vars(self)[key] = p[key] ef = tp.lead_fermi[0] path = tp.contour.get_plot_path() self.energies = path.energies self.my_energies = path.my_energies self.weights = path.weights self.my_weights = path.my_weights self.nids = path.nids self.my_nids = path.my_nids for variable in [self.eig_trans_channel_energies, self.dos_realspace_energies]: if variable is not None: variable = np.array(variable) + ef ecomm = tp.contour.comm if self.eig_trans_channel_energies is not None: self.my_eig_trans_channel_energies = np.array_split( self.eig_trans_channel_energies, ecomm.size)[ecomm.rank] self.my_eig_trans_channel_nids = np.array_split( np.arange(len(self.eig_trans_channel_energies)), ecomm.size)[ecomm.rank] if self.dos_realspace_energies is not None: self.my_dos_realspace_energies = np.array_split( self.dos_realspace_energies, ecomm.size)[ecomm.rank] self.my_dos_realspace_nids = np.array_split( np.arange(len(self.dos_realspace_energies)), ecomm.size)[ecomm.rank] setups = tp.inner_setups self.project_atoms_in_device = self.project_equal_atoms[0] self.project_atoms_in_molecule = self.project_equal_atoms[1] self.project_basis_in_device = get_atom_indices( self.project_atoms_in_device, setups) if self.isolate_atoms is not None: self.calculate_isolate_molecular_levels(tp) self.overhead_data_saved = False if world.rank == 0: if not os.access('analysis_data', os.F_OK): os.mkdir('analysis_data') if not os.access('analysis_data/ionic_step_0', os.F_OK): os.mkdir('analysis_data/ionic_step_0') world.barrier() self.data = {}