def test_mp_query(mocker): mock = mocker.patch("pydefect.util.mp_tools.MPRester") expected = [{ 'full_formula': 'Mg9' }, { 'full_formula': 'Mg1O1' }, { 'full_formula': 'O8' }, { 'full_formula': 'O2' }, { 'full_formula': 'O2' }, { 'full_formula': 'O8' }] mock.return_value.__enter__.return_value.query.return_value = expected element_list = ["Mg", "O"] excluded = list(set(elements) - set(element_list)) mp_query = MpQuery(element_list=element_list, properties=["full_formula"]) mock.return_value.__enter__.return_value.query.assert_called_with( criteria={ "elements": { "$in": element_list, "$nin": excluded }, "e_above_hull": { "$lte": 1e-5 } }, properties=["full_formula"]) assert mp_query.materials == expected
def make_chem_pot_diag_from_mp(target: Union[Composition, str], additional_elements: List[str] = None, vertex_elements: List[str] = None, atom_energy_yaml: Optional[str] = None): """Obtain the energies from Materials Project.""" properties = ["task_id", "full_formula", "final_energy"] target = target if isinstance(target, Composition) else Composition(target) elements = target.chemical_system.split("-") vertex_elements = vertex_elements or elements vertex_elements = [Element(e) for e in vertex_elements] if additional_elements: elements.extend(additional_elements) query = MpQuery(elements, properties=properties) comp_es = [] if atom_energy_yaml: if ".yaml" in atom_energy_yaml: energies = loadfn(atom_energy_yaml) else: logger.info(f"Atom energy set for {atom_energy_yaml} is used.") energies = AtomEnergyType.from_string(atom_energy_yaml).energies diff = {e: energies[e] - mp_energies[e] for e in elements} else: diff = None for m in query.materials: energy = m["final_energy"] if diff: for k, v in Composition(m["full_formula"]).as_dict().items(): energy += diff[k] * v comp_es.append( CompositionEnergy(Composition(m["full_formula"]), energy, m["task_id"])) comp_es = remove_higher_energy_comp(comp_es) return ChemPotDiag(comp_es, target, vertex_elements)
def make_composition_energies_from_mp( elements: List[str], atom_energy_yaml: Optional[str] = None, ) -> CompositionEnergies: """Obtain the energies from Materials Project. When the atom_energy_yaml is provided, the total energies are aligned via atom energies. """ properties = ["task_id", "full_formula", "final_energy"] query = MpQuery(elements, properties=properties) comp_es = {} if atom_energy_yaml: energies = loadfn(atom_energy_yaml) diff = {e: energies[e] - mp_energies[e] for e in elements} else: diff = {e: 0.0 for e in elements} for m in query.materials: key = Composition(m["full_formula"]) energy = m["final_energy"] for k, v in key.as_dict().items(): energy += diff[k] * v comp_es[key] = CompositionEnergy(energy, m["task_id"]) print(comp_es) comp_es = remove_higher_energy_comp(comp_es) print(comp_es) return CompositionEnergies(comp_es)
def make_competing_phase_dirs(args): query = MpQuery(element_list=args.elements, e_above_hull=args.e_above_hull) make_poscars_from_query(materials_query=query.materials, path=Path.cwd())
def test_mp_actual_query(): element_list = ["Mg", "O"] mp_query = MpQuery(element_list=element_list, properties=["full_formula", "structure"]) print(mp_query.materials)