{ "cells": [ { "cell_type": "markdown", "id": "22d177dc-6cfb-4de2-9509-f1eb45e10cf2", "metadata": {}, "source": [ "# Wannier90\n", "For the source code, see [wannier90](https://workgraph-collections.readthedocs.io/en/latest/qe/module.html#workgraph_collections.ase.espresso.wannier90.wannier90_workgraph).\n", "\n", "## Visualizing the WorkGraph Builder\n" ] }, { "cell_type": "code", "execution_count": null, "id": "9db8ed4f", "metadata": {}, "outputs": [], "source": [ "from workgraph_collections.qe.wannier90_minimal import wannier90_minimal_workgraph\n", "from aiida import load_profile\n", "load_profile()\n", "\n", "task = wannier90_minimal_workgraph.TaskCls()\n", "task.to_html()" ] }, { "cell_type": "markdown", "id": "9e6360d8", "metadata": {}, "source": [ "## Visualizing the WorkGraph" ] }, { "cell_type": "code", "execution_count": null, "id": "01bedd69", "metadata": {}, "outputs": [], "source": [ "from workgraph_collections.qe.wannier90_minimal import wannier90_minimal_workgraph\n", "from aiida import load_profile\n", "load_profile()\n", "\n", "wg = wannier90_minimal_workgraph()\n", "wg.to_html()" ] }, { "cell_type": "markdown", "id": "efa095d0", "metadata": {}, "source": [ "## Example: GaAs band structure\n", "### Prepare the inputs and submit the workflow\n" ] }, { "cell_type": "code", "execution_count": null, "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [], "source": [ "from workgraph_collections.qe.wannier90_minimal import wannier90_minimal_workgraph\n", "from aiida_wannier90.workflows.minimal import get_explicit_kpoints\n", "from aiida import load_profile, orm\n", "from copy import deepcopy\n", "from aiida.plugins import DataFactory\n", "from aiida_wannier90.orbitals import generate_projections\n", "\n", "load_profile()\n", "\n", "pw_code = orm.load_code(\"qe-7.2-pw@localhost\")\n", "pw2wannier90_code = orm.load_code(\"qe-7.2-pw2wannier90@localhost\")\n", "wannier90_code = orm.load_code(\"wannier90@localhost\")\n", "\n", "StructureData = DataFactory(\"core.structure\")\n", "a = 5.68018817933178\n", "structure = StructureData(\n", " cell=[[-a / 2.0, 0, a / 2.0], [0, a / 2.0, a / 2.0], [-a / 2.0, a / 2.0, 0]]\n", ")\n", "structure.append_atom(symbols=[\"Ga\"], position=(0.0, 0.0, 0.0))\n", "structure.append_atom(symbols=[\"As\"], position=(-a / 4.0, a / 4.0, a / 4.0))\n", "structure.store()\n", "\n", "# Load the pseudopotential family.\n", "pseudo_family = orm.load_group(\"SSSP/1.3/PBEsol/efficiency\")\n", "pseudos = pseudo_family.get_pseudos(structure=structure)\n", "\n", "scf_paras = {\n", " \"CONTROL\": {\n", " \"calculation\": \"scf\",\n", " },\n", " \"SYSTEM\": {\n", " \"ecutwfc\": 30,\n", " \"ecutrho\": 240,\n", " },\n", " \"ELECTRONS\": {},\n", "}\n", "nscf_paras = deepcopy(scf_paras)\n", "nscf_paras[\"CONTROL\"][\"calculation\"] = \"nscf\"\n", "nscf_paras[\"SYSTEM\"].update(\n", " {\n", " \"nosym\": True,\n", " \"noinv\": True,\n", " }\n", ")\n", "nscf_paras[\"ELECTRONS\"].update({\"startingpot\": \"file\", \"diago_full_acc\": True})\n", "\n", "\n", "scf_kpoints = orm.KpointsData()\n", "scf_kpoints.set_kpoints_mesh([4, 4, 4])\n", "# Use explicit list of kpoints generated by wannier.\n", "# Since the QE auto generated kpoints might be different from wannier90, here we explicitly\n", "# generate a list of kpoint coordinates to avoid discrepancies.\n", "nscf_kpoints = orm.KpointsData()\n", "nscf_kpoints.set_kpoints_mesh([10, 10, 10])\n", "kpoints_nscf_explicit = get_explicit_kpoints(nscf_kpoints)\n", "# If wannier inputs.kpoints is a kmesh, mp_grid will be auto-set by `Wannier90Calculation`,\n", "# otherwise we need to set it manually. If use open_grid, kpoints will be set dynamically\n", "# after open_grid calculation.\n", "mp_grid = nscf_kpoints.get_kpoints_mesh()[0]\n", "\n", "# k-points path for the band structure\n", "kpoint_path = orm.Dict(\n", " {\n", " \"point_coords\": {\n", " \"G\": [0.0, 0.0, 0.0],\n", " \"K\": [0.375, 0.375, 0.75],\n", " \"L\": [0.5, 0.5, 0.5],\n", " \"U\": [0.625, 0.25, 0.625],\n", " \"W\": [0.5, 0.25, 0.75],\n", " \"X\": [0.5, 0.0, 0.5],\n", " },\n", " \"path\": [\n", " (\"G\", \"X\"),\n", " (\"X\", \"U\"),\n", " (\"K\", \"G\"),\n", " (\"G\", \"L\"),\n", " (\"L\", \"W\"),\n", " (\"W\", \"X\"),\n", " ],\n", " }\n", ")\n", "# sp^3 projections, centered on As\n", "projections = generate_projections(\n", " {\n", " \"position_cart\": (-a / 4.0, a / 4.0, a / 4.0),\n", " \"ang_mtm_l_list\": -3,\n", " \"spin\": None,\n", " \"spin_axis\": None,\n", " },\n", " structure=structure,\n", ")\n", "#\n", "metadata = {\n", " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", " \"num_mpiprocs_per_machine\": 1,\n", " },\n", " }\n", "}\n", "\n", "# ===============================================================================\n", "\n", "wannier_inputs = {\n", " \"seekpath\": {\"structure\": structure},\n", " \"scf\": {\n", " \"code\": pw_code,\n", " \"pseudos\": pseudos,\n", " \"parameters\": orm.Dict(scf_paras),\n", " \"metadata\": metadata,\n", " \"kpoints\": scf_kpoints,\n", " },\n", " \"nscf\": {\n", " \"code\": pw_code,\n", " \"pseudos\": pseudos,\n", " \"parameters\": orm.Dict(nscf_paras),\n", " \"metadata\": metadata,\n", " \"kpoints\": kpoints_nscf_explicit,\n", " },\n", " \"wannier90_pp\": {\n", " \"code\": wannier90_code,\n", " \"parameters\": orm.Dict(\n", " {\n", " \"write_hr\": False,\n", " \"write_xyz\": False,\n", " \"use_ws_distance\": True,\n", " \"bands_plot\": True,\n", " \"num_iter\": 200,\n", " \"guiding_centres\": False,\n", " \"num_wann\": 4,\n", " \"exclude_bands\": [1, 2, 3, 4, 5],\n", " \"mp_grid\": mp_grid,\n", " }\n", " ),\n", " \"kpoints\": kpoints_nscf_explicit,\n", " \"kpoint_path\": kpoint_path,\n", " \"projections\": projections,\n", " \"metadata\": metadata,\n", " \"settings\": orm.Dict({\"postproc_setup\": True}),\n", " },\n", " \"pw2wannier90\": {\n", " \"code\": pw2wannier90_code,\n", " \"parameters\": orm.Dict(\n", " {\n", " \"inputpp\": {\n", " \"write_mmn\": True,\n", " \"write_amn\": True,\n", " \"write_unk\": True,\n", " },\n", " }\n", " ),\n", " \"metadata\": metadata,\n", " },\n", " \"wannier90\": {\n", " \"code\": wannier90_code,\n", " \"parameters\": orm.Dict(\n", " {\n", " \"mp_grid\": mp_grid,\n", " \"write_hr\": False,\n", " \"write_xyz\": False,\n", " \"use_ws_distance\": True,\n", " \"bands_plot\": True,\n", " \"num_iter\": 200,\n", " \"guiding_centres\": False,\n", " \"num_wann\": 4,\n", " \"exclude_bands\": [1, 2, 3, 4, 5],\n", " }\n", " ),\n", " \"kpoints\": kpoints_nscf_explicit,\n", " \"kpoint_path\": kpoint_path,\n", " \"projections\": projections,\n", " \"metadata\": metadata,\n", " \"settings\": orm.Dict({\"postproc_setup\": False}),\n", " },\n", "}\n", "wg = wannier90_minimal_workgraph(structure=structure, inputs=wannier_inputs)\n", "wg.name = \"Wannier-GaAs\"\n", "wg.run()\n" ] }, { "cell_type": "markdown", "id": "589641a2", "metadata": {}, "source": [ "## Bands WorkGraph" ] }, { "cell_type": "code", "execution_count": null, "id": "bc1be491", "metadata": {}, "outputs": [], "source": [ "from workgraph_collections.qe.wannier90_bands import wannier90_workgraph\n", "from aiida import load_profile\n", "load_profile()\n", "\n", "task = wannier90_workgraph.TaskCls()\n", "task.to_html()" ] }, { "cell_type": "markdown", "id": "6ebf8ec9", "metadata": {}, "source": [ "## Visualizing the WorkGraph" ] }, { "cell_type": "code", "execution_count": 2, "id": "5326ec64", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from workgraph_collections.qe.wannier90_bands import wannier90_bands_workgraph\n", "from aiida import load_profile\n", "load_profile()\n", "\n", "wg = wannier90_bands_workgraph(bands_kpoints_distance=0.1)\n", "wg.to_html()" ] }, { "cell_type": "markdown", "id": "9697a36c", "metadata": {}, "source": [ "## Example: GaAs band structure\n", "### Prepare the inputs and submit the workflow\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "11dcb1a7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "num_bands 9\n", "num_projs 13\n", "WorkGraph process created, PK: 19813\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from workgraph_collections.qe.wannier90_bands import wannier90_bands_workgraph\n", "from aiida import load_profile, orm\n", "from copy import deepcopy\n", "from aiida.plugins import DataFactory\n", "from aiida_wannier90_workflows.utils.kpoints import (\n", " create_kpoints_from_distance,\n", " get_explicit_kpoints,\n", " )\n", "from aiida_wannier90_workflows.utils.pseudo import (\n", " get_number_of_projections,\n", " get_pseudo_and_cutoff,\n", " get_wannier_number_of_bands,\n", " )\n", "load_profile()\n", "\n", "codes = {\n", "\"pw\": orm.load_code(\"qe-7.2-pw@localhost\"),\n", "\"projwfc\": orm.load_code('qe-7.2-projwfc@localhost'),\n", "\"pw2wannier90\": orm.load_code('qe-7.2-pw2wannier90@localhost'),\n", "\"wannier90\": orm.load_code('wannier90@localhost'),\n", "}\n", "\n", "StructureData = DataFactory('core.structure')\n", "a = 5.68018817933178\n", "structure = StructureData(cell = [[-a/2., 0, a/2.], [0, a/2., a/2.], [-a/2., a/2., 0]])\n", "structure.append_atom(symbols=['Ga'], position=(0., 0., 0.))\n", "structure.append_atom(symbols=['As'], position=(-a/4., a/4., a/4.))\n", "structure.store()\n", "\n", "# Load the pseudopotential family.\n", "pseudo_family = orm.load_group(\"SSSP/1.3/PBEsol/efficiency\")\n", "pseudos = pseudo_family.get_pseudos(structure=structure)\n", "pseudos, _, _ = get_pseudo_and_cutoff(\"SSSP/1.3/PBEsol/efficiency\", structure)\n", "# INSULATOR\n", "num_bands = get_wannier_number_of_bands(\n", " structure=structure,\n", " pseudos=pseudos,\n", " factor=1.2,\n", " only_valence=True,\n", " spin_polarized=False,\n", " spin_orbit_coupling=False,\n", " )\n", "num_projs = get_number_of_projections(\n", " structure=structure,\n", " pseudos=pseudos,\n", " spin_orbit_coupling=False,\n", ")\n", "print(\"num_bands\", num_bands)\n", "print(\"num_projs\", num_projs)\n", "num_wann = num_bands # if insulator, num_wann = num_bands else num_wann = num_projs\n", "\n", "scf_paras = {\n", " \"CONTROL\": {\n", " \"calculation\": \"scf\",\n", " },\n", " \"SYSTEM\": {\n", " \"ecutwfc\": 30,\n", " \"ecutrho\": 240,\n", " \"occupations\": \"fixed\",\n", " },\n", " \"ELECTRONS\": {}\n", "}\n", "nscf_paras = deepcopy(scf_paras)\n", "nscf_paras['CONTROL']['calculation'] = 'nscf'\n", "nscf_paras['SYSTEM'].update({'nosym': True,\n", " 'noinv': True,\n", " 'nbnd': num_bands})\n", "nscf_paras['ELECTRONS'].update({'startingpot': 'file',\n", " 'diago_full_acc': True})\n", "\n", "\n", "scf_kpoints = orm.KpointsData()\n", "scf_kpoints.set_kpoints_mesh([2, 2, 2])\n", "# Use explicit list of kpoints generated by wannier.\n", "# Since the QE auto generated kpoints might be different from wannier90, here we explicitly\n", "# generate a list of kpoint coordinates to avoid discrepancies.\n", "kpoints = create_kpoints_from_distance(\n", " structure,\n", " distance=0.5,\n", " force_parity=False,\n", " )\n", "wannier90_kpoints = get_explicit_kpoints(kpoints)\n", "# If wannier inputs.kpoints is a kmesh, mp_grid will be auto-set by `Wannier90Calculation`,\n", "# otherwise we need to set it manually. If use open_grid, kpoints will be set dynamically\n", "# after open_grid calculation.\n", "mp_grid = kpoints.get_kpoints_mesh()[0]\n", "\n", "#\n", "metadata = {\n", " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", " \"num_mpiprocs_per_machine\": 4,\n", " },\n", " }\n", "}\n", "\n", "# ===============================================================================\n", "\n", "inputs = {\n", " 'seekpath': {\"structure\": structure},\n", " 'scf': {\n", " 'pw': {\n", " 'pseudos': pseudos,\n", " 'parameters': orm.Dict(scf_paras),\n", " 'metadata': metadata,\n", " },\n", " 'kpoints': scf_kpoints,\n", " },\n", " 'nscf': {\n", " 'pw': {\n", " 'pseudos': pseudos,\n", " 'parameters': orm.Dict(nscf_paras),\n", " 'metadata': metadata,\n", " },\n", " 'kpoints': wannier90_kpoints,\n", " },\n", " 'projwfc': {\n", " 'projwfc': {\n", " 'metadata': metadata,\n", " }\n", " },\n", " 'wannier90_pp': {\n", " 'wannier90': {\n", " 'parameters': orm.Dict({\n", " \"auto_projections\": True,\n", " \"bands_plot\": True,\n", " \"conv_tol\": 2.0e-05,\n", " \"conv_window\": 1,\n", " \"dis_conv_tol\": 2.0e-05,\n", " \"dis_num_iter\": 0,\n", " \"num_cg_steps\": 200,\n", " \"num_iter\": 400,\n", " \"num_wann\": num_wann,\n", " \"num_bands\": num_bands,\n", " \"mp_grid\": mp_grid,\n", " }),\n", " 'kpoints': wannier90_kpoints,\n", " 'metadata': metadata,\n", " 'settings': orm.Dict({'postproc_setup': True}),\n", " },\n", " },\n", " 'pw2wannier90': {\n", " 'pw2wannier90': {\n", " \"parameters\": orm.Dict({\n", " \"inputpp\": {\n", " \"scdm_entanglement\": \"erfc\",\n", " \"write_mmn\": True,\n", " \"write_amn\": True,\n", " \"write_unk\": True,\n", " \"scdm_proj\": True,\n", " },\n", " }),\n", " 'metadata': metadata,\n", " }\n", " },\n", " 'wannier90': {\n", " 'wannier90': {\n", " 'parameters': orm.Dict({\n", " \"auto_projections\": True,\n", " \"bands_plot\": True,\n", " \"conv_tol\": 2.0e-05,\n", " \"conv_window\": 1,\n", " \"dis_conv_tol\": 2.0e-05,\n", " \"dis_num_iter\": 0,\n", " \"num_cg_steps\": 200,\n", " \"num_iter\": 400,\n", " \"num_wann\": num_wann,\n", " \"num_bands\": num_bands,\n", " \"mp_grid\": mp_grid,\n", " }),\n", " 'kpoints': wannier90_kpoints,\n", " 'metadata': metadata,\n", " 'settings': orm.Dict({'postproc_setup': False}),\n", " },\n", " },\n", " \n", "}\n", "\n", "wg = wannier90_bands_workgraph(structure=structure,\n", " codes=codes,\n", " inputs=inputs,\n", " bands_kpoints_distance=0.1,\n", " )\n", "wg.name = \"Wannier90-Bands-GaAs\"\n", "wg.submit()\n", "wg.to_html()\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.0" }, "vscode": { "interpreter": { "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" } } }, "nbformat": 4, "nbformat_minor": 5 }