Example #1
0
 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
Example #2
0
 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
Example #3
0
    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 = {}
Example #4
0
    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 = {}