def test_freysoldt(self): struc = PymatgenTest.get_structure("VO2") struc.make_supercell(3) struc = struc vac = Vacancy(struc, struc.sites[0], charge=-3) abc = struc.lattice.abc axisdata = [np.arange(0., lattval, 0.2) for lattval in abc] bldata = [np.array([1. for u in np.arange(0., lattval, 0.2)]) for lattval in abc] dldata = [ np.array([(-1 - np.cos(2 * np.pi * u / lattval)) for u in np.arange(0., lattval, 0.2)]) for lattval in abc ] params = {'axis_grid': axisdata, 'bulk_planar_averages': bldata, 'defect_planar_averages': dldata} fc = FreysoldtCorrection(15) #test electrostatic correction es_corr = fc.perform_es_corr(struc.lattice, -3) self.assertAlmostEqual(es_corr, 0.975893) #test potential alignment method pot_corr = fc.perform_pot_corr(axisdata[0], bldata[0], dldata[0], struc.lattice, -3, vac.site.coords, 0) self.assertAlmostEqual(pot_corr, 2.836369987722345) #test entry full correction method de = DefectEntry(vac, 0., corrections={}, parameters=params, entry_id=None) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_electrostatic'], 0.975893) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 4.4700574) #test the freysoldt plotter and that plot metadata exists pltsaver = [] for ax in range(3): pltsaver.append(fc.plot(axis=ax)) self.assertAlmostEqual(len(pltsaver), 3) #check that uncertainty metadata exists for ax in range(3): self.assertAlmostEqual(set(fc.metadata['pot_corr_uncertainty_md'][ax].keys()), set(['potcorr', 'stats'])) #test a specified axis from entry fc = FreysoldtCorrection(15, axis=[1]) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 5.2869010593283132) #test a different charge # for electrostatic correction es_corr = fc.perform_es_corr(struc.lattice, 2) self.assertAlmostEqual(es_corr, 0.43373) # for potential alignment method pot_corr = fc.perform_pot_corr(axisdata[0], bldata[0], dldata[0], struc.lattice, 2, vac.site.coords, 0) self.assertAlmostEqual(pot_corr, -2.1375685936497768) #test an input anisotropic dielectric constant fc = FreysoldtCorrection([[1., 2., 3.], [0., 3., 5.], [4., 10., 8.]]) self.assertAlmostEqual(fc.dielectric, 4.) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_electrostatic'], 3.659599) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 3.3605255195745087) #test potalign being added to defect entry self.assertAlmostEqual(de.parameters['potalign'], 1.1201751731915028) #test that metadata entries exist in defect entry self.assertTrue('freysoldt_meta' in de.parameters.keys()) self.assertAlmostEqual( set(de.parameters['freysoldt_meta'].keys()), set(['pot_plot_data', 'pot_corr_uncertainty_md'])) #test a charge of zero vac = Vacancy(struc, struc.sites[0], charge=0) de = DefectEntry(vac, 0., corrections={}, parameters=params, entry_id=None) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_electrostatic'], 0.) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 0.)
def test_freysoldt(self): struc = PymatgenTest.get_structure("VO2") struc.make_supercell(3) struc = struc vac = Vacancy(struc, struc.sites[0], charge=-3) ids = vac.generate_defect_structure(1) abc = struc.lattice.abc axisdata = [np.arange(0.0, lattval, 0.2) for lattval in abc] bldata = [ np.array([1.0 for u in np.arange(0.0, lattval, 0.2)]) for lattval in abc ] dldata = [ np.array( [ (-1 - np.cos(2 * np.pi * u / lattval)) for u in np.arange(0.0, lattval, 0.2) ] ) for lattval in abc ] params = { "axis_grid": axisdata, "bulk_planar_averages": bldata, "defect_planar_averages": dldata, "initial_defect_structure": ids, "defect_frac_sc_coords": struc.sites[0].frac_coords, } fc = FreysoldtCorrection(15) # test electrostatic correction es_corr = fc.perform_es_corr(struc.lattice, -3) self.assertAlmostEqual(es_corr, 0.975893) # test potential alignment method pot_corr = fc.perform_pot_corr( axisdata[0], bldata[0], dldata[0], struc.lattice, -3, vac.site.coords, 0 ) self.assertAlmostEqual(pot_corr, 2.836369987722345) # test entry full correction method de = DefectEntry(vac, 0.0, corrections={}, parameters=params, entry_id=None) val = fc.get_correction(de) self.assertAlmostEqual(val["freysoldt_electrostatic"], 0.975893) self.assertAlmostEqual(val["freysoldt_potential_alignment"], 4.4700574) # test the freysoldt plotter for ax in range(3): fcp = fc.plot(axis=ax) self.assertTrue(fcp) # check that uncertainty metadata exists for ax in range(3): self.assertAlmostEqual( set(fc.metadata["pot_corr_uncertainty_md"][ax].keys()), set(["potcorr", "stats"]), ) # test a specified axis from entry fc = FreysoldtCorrection(15, axis=[1]) val = fc.get_correction(de) self.assertAlmostEqual(val["freysoldt_potential_alignment"], 5.2869010593283132) # test a different charge # for electrostatic correction es_corr = fc.perform_es_corr(struc.lattice, 2) self.assertAlmostEqual(es_corr, 0.43373) # for potential alignment method pot_corr = fc.perform_pot_corr( axisdata[0], bldata[0], dldata[0], struc.lattice, 2, vac.site.coords, 0 ) self.assertAlmostEqual(pot_corr, -2.1375685936497768) # test an input anisotropic dielectric constant fc = FreysoldtCorrection([[1.0, 2.0, 3.0], [0.0, 3.0, 5.0], [4.0, 10.0, 8.0]]) self.assertAlmostEqual(fc.dielectric, 4.0) val = fc.get_correction(de) self.assertAlmostEqual(val["freysoldt_electrostatic"], 3.659599) self.assertAlmostEqual(val["freysoldt_potential_alignment"], 3.3605255195745087) # test potalign being added to defect entry self.assertAlmostEqual(de.parameters["potalign"], 1.1201751731915028) # test that metadata entries exist in defect entry self.assertTrue("freysoldt_meta" in de.parameters.keys()) self.assertAlmostEqual( set(de.parameters["freysoldt_meta"].keys()), set(["pot_plot_data", "pot_corr_uncertainty_md"]), ) # test a charge of zero vac = Vacancy(struc, struc.sites[0], charge=0) de = DefectEntry(vac, 0.0, corrections={}, parameters=params, entry_id=None) val = fc.get_correction(de) self.assertAlmostEqual(val["freysoldt_electrostatic"], 0.0) self.assertAlmostEqual(val["freysoldt_potential_alignment"], 0.0)
def test_freysoldt(self): struc = PymatgenTest.get_structure("VO2") struc.make_supercell(3) struc = struc vac = Vacancy(struc, struc.sites[0], charge=-3) abc = struc.lattice.abc axisdata = [np.arange(0., lattval, 0.2) for lattval in abc] bldata = [ np.array([1. for u in np.arange(0., lattval, 0.2)]) for lattval in abc ] dldata = [ np.array([(-1 - np.cos(2 * np.pi * u / lattval)) for u in np.arange(0., lattval, 0.2)]) for lattval in abc ] params = { 'axis_grid': axisdata, 'bulk_planar_averages': bldata, 'defect_planar_averages': dldata } fc = FreysoldtCorrection(15) #test electrostatic correction es_corr = fc.perform_es_corr(struc.lattice, -3) self.assertAlmostEqual(es_corr, 0.975893) #test potential alignment method pot_corr = fc.perform_pot_corr(axisdata[0], bldata[0], dldata[0], struc.lattice, -3, vac.site.coords, 0) self.assertAlmostEqual(pot_corr, 2.836369987722345) #test entry full correction method de = DefectEntry(vac, 0., corrections={}, parameters=params, entry_id=None) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_electrostatic'], 0.975893) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 4.4700574) #test the freysoldt plotter and that plot metadata exists pltsaver = [] for ax in range(3): pltsaver.append(fc.plot(axis=ax)) self.assertAlmostEqual(len(pltsaver), 3) #check that uncertainty metadata exists for ax in range(3): self.assertAlmostEqual( set(fc.metadata['pot_corr_uncertainty_md'][ax].keys()), set(['potcorr', 'stats'])) #test a specified axis from entry fc = FreysoldtCorrection(15, axis=[1]) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 5.2869010593283132) #test a different charge # for electrostatic correction es_corr = fc.perform_es_corr(struc.lattice, 2) self.assertAlmostEqual(es_corr, 0.43373) # for potential alignment method pot_corr = fc.perform_pot_corr(axisdata[0], bldata[0], dldata[0], struc.lattice, 2, vac.site.coords, 0) self.assertAlmostEqual(pot_corr, -2.1375685936497768) #test an input anisotropic dielectric constant fc = FreysoldtCorrection([[1., 2., 3.], [0., 3., 5.], [4., 10., 8.]]) self.assertAlmostEqual(fc.dielectric, 4.) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_electrostatic'], 3.659599) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 3.3605255195745087) #test potalign being added to defect entry self.assertAlmostEqual(de.parameters['potalign'], 1.1201751731915028) #test that metadata entries exist in defect entry self.assertTrue('freysoldt_meta' in de.parameters.keys()) self.assertAlmostEqual( set(de.parameters['freysoldt_meta'].keys()), set(['pot_plot_data', 'pot_corr_uncertainty_md'])) #test a charge of zero vac = Vacancy(struc, struc.sites[0], charge=0) de = DefectEntry(vac, 0., corrections={}, parameters=params, entry_id=None) val = fc.get_correction(de) self.assertAlmostEqual(val['freysoldt_electrostatic'], 0.) self.assertAlmostEqual(val['freysoldt_potential_alignment'], 0.)