def get_energy(self, n, relax=True): """ Formation Energy for nth symmetrically distinct interstitial. """ if relax and not self._relax_energies: self._relax_analysis() if not relax and not self._norelax_energies: no_inter = self._inter.defectsite_count() inter_gulp_kw = ('qok',) val_dict = self._inter.struct_valences val_dict[self._el] = self._oxi_state # If element not in structure scd = self._scd scale_mat = [[scd, 0, 0], [0, scd, 0], [0, 0, scd]] sc = self._inter.make_supercells_with_defects(scale_mat, self._el) blk_energy = get_energy_buckingham(sc[0]) for i in range(1, no_inter + 1): inter_energy = get_energy_buckingham( sc[i], keywords=inter_gulp_kw, valence_dict=val_dict ) form_energy = inter_energy - blk_energy self._norelax_energies.append(form_energy) if relax: return self._relax_energies[n] else: return self._norelax_energies[n]
def get_energy(self, n, tol=0.5): """ Formation Energy for nth symmetrically distinct vacancy. """ # generate defect free structure energy if not self._energies: no_vac = self._vacancy.defectsite_count() prev_energies = [0.0] * no_vac tol_flg = [False] * no_vac vac_gulp_kw = ("optimise", "conp", "qok") val_dict = self._vacancy.struct_valences for sp in range(2, 6): if not (False in tol_flg): # print sp break scale_mat = [[sp, 0, 0], [0, sp, 0], [0, 0, sp]] sc = self._vacancy.make_supercells_with_defects(scale_mat) blk_energy = get_energy_buckingham(sc[0]) no = len(sc[0].sites) # print no for i in range(1, no_vac + 1): if not tol_flg[i - 1]: vac_energy = get_energy_buckingham(sc[i], keywords=vac_gulp_kw, valence_dict=val_dict) form_energy = vac_energy - (no - 1) / no * blk_energy if abs(form_energy - prev_energies[i - 1]) < tol: tol_flg[i - 1] = True prev_energies[i - 1] = form_energy self._energies = prev_energies self._tol_flg = tol_flg if not self._tol_flg[n]: print "Caution: tolerance not reached for {0} vacancy".format(n) return self._energies[n]
def get_energy(self, n, tol=0.5): """ Formation Energy for nth symmetrically distinct vacancy. """ #generate defect free structure energy if not self._energies: no_vac = self._vacancy.defectsite_count() prev_energies = [0.0] * no_vac tol_flg = [False] * no_vac vac_gulp_kw = ('optimise', 'conp', 'qok') val_dict = self._vacancy.struct_valences for sp in range(2, 6): if not (False in tol_flg): #print sp break scale_mat = [[sp, 0, 0], [0, sp, 0], [0, 0, sp]] sc = self._vacancy.make_supercells_with_defects(scale_mat) blk_energy = get_energy_buckingham(sc[0]) no = len(sc[0].sites) #print no for i in range(1, no_vac + 1): if not tol_flg[i - 1]: vac_energy = get_energy_buckingham( sc[i], keywords=vac_gulp_kw, valence_dict=val_dict) form_energy = vac_energy - (no - 1) / no * blk_energy if abs(form_energy - prev_energies[i - 1]) < tol: tol_flg[i - 1] = True prev_energies[i - 1] = form_energy self._energies = prev_energies self._tol_flg = tol_flg if not self._tol_flg[n]: print "Caution: tolerance not reached for {0} vacancy".format(n) return self._energies[n]
def get_energy(self, n, relax=True): """ Formation Energy for nth symmetrically distinct interstitial. """ if relax and not self._relax_energies: self._relax_analysis() if not relax and not self._norelax_energies: no_inter = self._inter.defectsite_count() inter_gulp_kw = ('qok', ) val_dict = self._inter.struct_valences val_dict[self._el] = self._oxi_state # If element not in structure scd = self._scd scale_mat = [[scd, 0, 0], [0, scd, 0], [0, 0, scd]] sc = self._inter.make_supercells_with_defects(scale_mat, self._el) blk_energy = get_energy_buckingham(sc[0]) for i in range(1, no_inter + 1): inter_energy = get_energy_buckingham(sc[i], keywords=inter_gulp_kw, valence_dict=val_dict) form_energy = inter_energy - blk_energy self._norelax_energies.append(form_energy) if relax: return self._relax_energies[n] else: return self._norelax_energies[n]
def test_get_energy_buckingham(self): enrgy = get_energy_buckingham(self.mgo_uc) self.assertIsInstance(enrgy, float) # test with vacancy structure del self.mgo_uc[0] energy = get_energy_buckingham(self.mgo_uc, keywords=('qok', 'optimise', 'conp'), valence_dict=self.val_dict) self.assertIsInstance(energy, float)