Una implementación de codificación para construir y analizar estructuras cristalinas utilizando Pymatgen para análisis de simetría, diagramas de fase, generación de superficies e integración de proyectos de materiales
header(“11. ESTRUCTURA DESORDENADA -> APROXIMACIÓN ORDENADA”) desordenada = Estructura( Lattice.cubic(3.6),
[{“Cu”: 0.5, “Au”: 0.5}],
[[0, 0, 0]], ) desordenado.make_supercell([2, 2, 2]) print(“Composición desordenada:”, desordenada.composición) intente: desordenada_oxi = desordenada.copia() desordenada_oxi.add_oxidación_estado_by_element({“Cu”: 1, “Au”: 1}) ordenada_transformada = OrdenDisorderedStructureTransformation() ordenada_candidatos = ordenada_transformada.apply_transformación( desordenada_oxi, return_ranked_list=3, ) para idx, cand en enumerar (ordered_candidates): s = cand[“structure”].copy() s.remove_oxidation_states() print(f”Candidato ordenado {idx+1}: fórmula={s.composition.formula}, sites={len(s)}”) excepto excepción como e: print(“Paso de pedido omitido debido a un problema de transformación:”, e) header(“12. SOPORTE DE MOLÉCULAS”) agua = Molécula(
[“O”, “H”, “H”],
[
[0.0, 0.0, 0.0],
[0.7586, 0.0, 0.5043],
[-0.7586, 0.0, 0.5043]], ) print(“Fórmula del agua:”, agua.composición.fórmula) print(“Centro de masa del agua:”, np.round(water.center_of_mass, 4)) print( “Longitudes de los enlaces OH:”, round(water.get_distance(0, 1), 4), round(water.get_distance(0, 2), 4), ) header(“13. CIF EXPORT”) salida_dir = “/content/pymatgen_tutorial_outputs” os.makedirs(output_dir, exist_ok=True) si_cif = os.path.join(output_dir, “si.cif”) nacl_cif = os.path.join(output_dir, “nacl.cif”) slab_cif = os.path.join(output_dir, “si_111_slab.cif”) CifWriter(si).write_file(si_cif) CifWriter(nacl).write_file(nacl_cif) CifWriter(slab).write_file(slab_cif) print(“Saved:”, si_cif) print(“Saved:”, nacl_cif) print(“Saved:”, slab_cif) header(“14. RESUMEN DE MARCO DE DATOS”) filas = []

para nombre, s en [
(“Si”, si),
(“NaCl”, nacl),
(“LiFePO4-like”, li_fe_po4),
(“Si slab”, slab),
]: sga = SpacegroupAnalyzer(s, symprec=0.1) rows.append( { “nombre”: nombre, “fórmula”: s.composition.reduced_formula, “sitios”: len(s), “volumen_A3”: redondo(s.volumen, 4), “densidad_g_cm3”: redondo(float(s.densidad), 4), “grupo espacial”: sga.get_space_group_symbol(), “sg_number”: sga.get_space_group_number(), } ) df = pd.DataFrame(rows) print(df) header(“15. ACCESO A LA API DEL PROYECTO DE MATERIALES OPCIONALES”) mp_api_key = Ninguno intente: desde google.colab importar datos de usuario mp_api_key = userdata.get(“MP_API_KEY”) excepto Excepción: pase si no mp_api_key: mp_api_key = os.environ.get(“MP_API_KEY”, Ninguno) si mp_api_key: intente: desde pymatgen.ext.matproj importe MPRester con MPRester(mp_api_key) como mpr: mp_struct = mpr.get_structure_by_material_id(“mp-149”) resumen_docs = mpr.summary.search(material_ids=[“mp-149”]campos=[
“material_id”,
“formula_pretty”,
“band_gap”,
“energy_above_hull”,
“is_stable”,
]) print(“Obtuve mp-149 del Proyecto de materiales”) print(“Fórmula:”, mp_struct.composition.reduced_formula) print(“Sitios:”, len(mp_struct)) if len(summary_docs) > 0: doc = resumen_docs[0]

print( { “material_id”: str(doc.material_id), “formula_pretty”: doc.formula_pretty, “band_gap”: doc.band_gap, “energy_above_hull”: doc.energy_above_hull, “is_stable”: doc.is_stable, } ) excepto excepción como e: print(“La sección API del proyecto de materiales se omitió debido a un problema de tiempo de ejecución/API:”, e) else: print(“No se encontró MP_API_KEY. Omitiendo la consulta del proyecto de materiales en vivo.”) print(“En Colab, agregue un secreto llamado MP_API_KEY o configure os.environ[‘MP_API_KEY’].”) encabezado(“16. GUARDAR RESUMEN JSON”) resumen = { “estructuras”: { “Si”: { “fórmula”: si.composition.reduced_formula, “sitios”: len(si), “spacegroup”: SpacegroupAnalyzer(si, symprec=0.1).get_space_group_symbol(), }, “NaCl”: { “fórmula”: nacl.composition.reduced_formula, “sitios”: len(nacl), “spacegroup”: SpacegroupAnalyzer(nacl, symprec=0.1).get_space_group_symbol(), }, “LiFePO4-like”: { “fórmula”: li_fe_po4.composition.reduced_formula, “sitios”: len(li_fe_po4), “spacegroup”: SpacegroupAnalyzer(li_fe_po4, symprec=0.1).get_space_group_symbol(), }, }, “phase_diagram”: { “target”: target.composition.reduced_formula, “energy_above_hull_eV_atom”: float(e_above_hull), }, “files”: { “si_cif”: si_cif, “nacl_cif”: nacl_cif, “slab_cif”: slab_cif, }, } json_path = os.path.join(output_dir, “summary.json”) con open(json_path, “w”) como f: json.dump(summary, f, indent=2) print(“Saved:”, json_path) header(“17. NOTAS FINALES”) print(“Tutorial completado con éxito.”) print(“Los artefactos se guardan en:”, output_dir) print(“Ahora puede ampliar este cuaderno para analizar salidas VASP, consultar MP a escala o crear canales de flujo de trabajo/defectos.”)