{
"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
}