コード例 #1
0
ファイル: test_mp_tools.py プロジェクト: ZhouWJ1991/pydefect
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
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
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())
コード例 #5
0
ファイル: test_mp_tools.py プロジェクト: ZhouWJ1991/pydefect
def test_mp_actual_query():
    element_list = ["Mg", "O"]
    mp_query = MpQuery(element_list=element_list,
                       properties=["full_formula", "structure"])
    print(mp_query.materials)