{ "cells": [ { "cell_type": "markdown", "id": "22d177dc-6cfb-4de2-9509-f1eb45e10cf2", "metadata": {}, "source": [ "# Quick Start" ] }, { "cell_type": "markdown", "id": "58696c91", "metadata": {}, "source": [ "## Introduction\n", "In this tutorial, you will get a quick view of `AiiDA-Bader`. To run this tutorial, you need to install `aiida-bader`. Open a terminal and run:\n", "\n", "```console\n", "pip install aiida-bader\n", "```\n", "\n", "### Set up `bader` code and pseudopotentials\n", "\n", "Create a yaml file named `bader-localhost.yml` with the following content:\n", "\n", "```console\n", "python -m aiida_bader post-install\n", "```\n", "\n", "### Load the AiiDA profile." ] }, { "cell_type": "code", "execution_count": 1, "id": "c6b83fb5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Profile" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%load_ext aiida\n", "from aiida import load_profile\n", "load_profile()" ] }, { "cell_type": "markdown", "id": "30719f9a", "metadata": {}, "source": [ "## Quantum Espresso\n", "Here, we will carry out the Bader charge analysis on H2O molecule using Quantum Espresso.\n", "\n", "Three steps:\n", "\n", "- Self consistent calculation using `pw.x`.\n", "- Post-processing to obtain cube files using `pp.x`.\n", "- Bader charge analysis using `bader`.\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "11e3bca1-dda6-44e9-9585-54feeda7e7db", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "04/08/2025 10:29:34 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|continue_workgraph]: tasks ready to run: scf\n", "04/08/2025 10:29:35 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 66354\n", "04/08/2025 10:29:38 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66354|PwBaseWorkChain|run_process]: launching PwCalculation<66360> iteration #1\n", "04/08/2025 10:30:34 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66354|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", "04/08/2025 10:30:34 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66354|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", "04/08/2025 10:30:34 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|update_task_state]: Task: scf, type: WORKCHAIN, finished.\n", "04/08/2025 10:30:35 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|continue_workgraph]: tasks ready to run: pp_valence,pp_all\n", "04/08/2025 10:30:37 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 66366, 66367\n", "04/08/2025 10:30:51 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|update_task_state]: Task: pp_valence, type: CALCJOB, finished.\n", "04/08/2025 10:30:52 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|update_task_state]: Task: pp_all, type: CALCJOB, finished.\n", "04/08/2025 10:30:53 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|continue_workgraph]: tasks ready to run: bader\n", "04/08/2025 10:30:54 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 66378\n", "04/08/2025 10:30:59 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|update_task_state]: Task: bader, type: CALCJOB, finished.\n", "04/08/2025 10:31:00 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", "04/08/2025 10:31:00 PM <343662> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [66350|WorkGraphEngine|finalize]: Finalize workgraph.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Bader charges:\n", "Index Symbol Charge\n", " 0 O 7.169\n", " 1 H 0.415\n", " 2 H 0.416\n" ] } ], "source": [ "from aiida import load_profile\n", "from aiida.orm import Dict, KpointsData, StructureData, load_code\n", "from ase.build import molecule\n", "from aiida_bader.workgraph.qe_bader import bader_workgraph\n", "from aiida_bader.utils import load_pseudos\n", "\n", "load_profile()\n", "#===============================================================================\n", "# load the codes\n", "pw_code = load_code(\"pw-7.2@localhost\")\n", "pp_code = load_code(\"pp-7.2@localhost\")\n", "bader_code = load_code(\"bader@localhost\")\n", "# ===============================================================================\n", "# create input structure\n", "atoms = molecule(\"H2O\")\n", "atoms.center(vacuum=3.0)\n", "atoms.pbc = True\n", "structure = StructureData(ase=atoms)\n", "# create input parameters node\n", "scf_paras = Dict(\n", " {\n", " \"SYSTEM\": {\n", " \"ecutwfc\": 30,\n", " \"ecutrho\": 240,\n", " \"occupations\": \"smearing\",\n", " \"smearing\": \"cold\",\n", " \"degauss\": 0.02,\n", " },\n", " }\n", ")\n", "pseudo_group = \"psl_kjpaw_pbesol\"\n", "pseudos = load_pseudos(structure, pseudo_group)\n", "#\n", "metadata = {\n", " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", " \"num_mpiprocs_per_machine\": 1,\n", " },\n", " }\n", "}\n", "# ===============================================================================\n", "# prepare inputs and submit\n", "wg = bader_workgraph(structure=structure,\n", " pw_code=pw_code,\n", " pp_code=pp_code,\n", " bader_code=bader_code,\n", " parameters=scf_paras,\n", " pseudos=pseudos,\n", " metadata_pw=metadata,\n", " metadata_pp=metadata,\n", " metadata_bader=metadata,)\n", "wg.run()\n", "#------------------------- Print the output -------------------------\n", "charges = wg.tasks[\"bader\"].node.outputs.bader_charge.get_array(\"charge\")\n", "print(\"Bader charges:\")\n", "print(\"Index Symbol Charge\")\n", "for i, charge in enumerate(charges):\n", " print(f\"{i:5d} {atoms.get_chemical_symbols()[i]:5s} {charge:5.3f}\")\n" ] }, { "cell_type": "markdown", "id": "bd5b4ed8", "metadata": {}, "source": [ "## CP2K\n", "Here, we will carry out the Bader charge analysis on H2O molecule using CP2K.\n", "\n", "Two steps:\n", "\n", "- Self consistent calculation using `cp2k`, and print out the charge density as cube file.\n", "- Bader charge analysis using `bader`.\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "ef9d6349", "metadata": {}, "outputs": [], "source": [ "from aiida import load_profile\n", "from aiida.orm import Dict, StructureData, load_code, load_node, Str\n", "from ase.build import molecule\n", "\n", "load_profile()\n", "#===============================================================================\n", "# load the codes\n", "cp2k_code = load_code(\"cp2k-psmp-9.1@localhost\")\n", "bader_code = load_code(\"bader@localhost\")\n", "basis_file = load_node(3745)\n", "pseudo_file = load_node(3746)\n", "# ===============================================================================\n", "# create input structure node\n", "h2o = molecule(\"H2O\")\n", "h2o.center(vacuum=3.0)\n", "h2o.pbc = True\n", "structure = StructureData(ase=h2o)\n", "# Parameters.\n", "cp2k_parameters = Dict(\n", " {\n", " \"GLOBAL\": {\n", " \"RUN_TYPE\": \"ENERGY_FORCE\",\n", " },\n", " \"FORCE_EVAL\": {\n", " \"METHOD\": \"Quickstep\",\n", " \"DFT\": {\n", " \"BASIS_SET_FILE_NAME\": \"BASIS_MOLOPT\",\n", " \"POTENTIAL_FILE_NAME\": \"GTH_POTENTIALS\",\n", " \"SCF\": {\n", " \"EPS_DIIS\": 0.1,\n", " \"EPS_SCF\": 1e-06,\n", " \"MAX_SCF\": 50,\n", " \"SCF_GUESS\": \"ATOMIC\",\n", " \"OUTER_SCF\": {\n", " \"MAX_SCF\": 20,\n", " \"EPS_SCF\": 1e-06,\n", " },\n", " \"OT\": {\n", " \"ORTHO_IRAC\": \"CHOL\",\n", " \"N_HISTORY_VEC\": 7,\n", " \"SAFE_DIIS\": False,\n", " \"PRECONDITIONER\": \"FULL_ALL\",\n", " \"ENERGY_GAP\": 0.05,\n", " \"MINIMIZER\": \"CG\",\n", " \"ALGORITHM\": \"IRAC\",\n", " \"EPS_IRAC_SWITCH\": 0.01,\n", " },\n", " },\n", " \"QS\": {\n", " \"METHOD\": \"GPW\",\n", " \"EPS_DEFAULT\": 1.0e-12,\n", " \"EXTRAPOLATION_ORDER\": 3,\n", " },\n", " \"MGRID\": {\n", " \"NGRIDS\": 5,\n", " \"CUTOFF\": 800,\n", " \"REL_CUTOFF\": 50,\n", " },\n", " \"XC\": {\n", " \"XC_FUNCTIONAL\": {\n", " \"_\": \"PBE\",\n", " },\n", " },\n", " \"PRINT\": {\n", " \"E_DENSITY_CUBE\":{\n", " \"EACH\": {\n", " \"GEO_OPT\": 0,\n", " },\n", " \"ADD_LAST\": \"NUMERIC\",\n", " \"STRIDE\": \"1 1 1\",\n", " }\n", " },\n", " },\n", " \"PRINT\": {\n", " # \"STRESS_TENSOR\": {\"_\": \"ON\"}, \n", " # \"FORCES\": {\"_\": \"ON\"}, \n", " },\n", " \"SUBSYS\": {\n", " \"KIND\": [\n", " {\n", " \"_\": \"O\",\n", " \"BASIS_SET\": \"DZVP-MOLOPT-GTH-q6\",\n", " \"POTENTIAL\": \"GTH-PBE-q6\",\n", " },\n", " {\n", " \"_\": \"H\",\n", " \"BASIS_SET\": \"TZVP-MOLOPT-GTH\",\n", " \"POTENTIAL\": \"GTH-PBE\",\n", " },\n", " ],\n", " },\n", " },\n", " }\n", ")\n", "#\n", "metadata = {\n", " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", " \"num_mpiprocs_per_machine\": 4,\n", " },\n", " 'withmpi': False,\n", " }\n", "}\n", "# ===============================================================================\n", "from aiida_bader.worktrees.cp2k_bader import Cp2kBaderWorkTree\n", "wt = Cp2kBaderWorkTree()\n", "wt.nodes[\"cp2k_base\"].set({\"cp2k\": {\n", " \"code\": cp2k_code,\n", " \"structure\": structure,\n", " \"parameters\": cp2k_parameters,\n", " \"file\": {\n", " \"basis\": basis_file,\n", " \"pseudo\": pseudo_file,\n", " },\n", " \"metadata\": metadata,\n", " },\n", " })\n", "wt.nodes[\"bader\"].set({\"code\": bader_code,\n", " \"charge_density_filename\": Str(\"aiida-ELECTRON_DENSITY-1_0.cube\")})\n", "# submit\n", "wt.submit(wait=True, timeout=300)" ] }, { "cell_type": "markdown", "id": "10919503", "metadata": {}, "source": [ "### Check status and results\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "058b0efe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "State of WorkTree: FINISHED\n", "Result of bader : [7.112106 0.44395 0.443945]\n" ] } ], "source": [ "wt.update()\n", "print(\"State of WorkTree: {}\".format(wt.state))\n", "print('Result of bader : {}'.format(wt.nodes[\"bader\"].node.outputs.bader_charge.get_array(\"charge\")))" ] } ], "metadata": { "kernelspec": { "display_name": "aiida", "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.11.0" } }, "nbformat": 4, "nbformat_minor": 5 }