From 7335daff6cb539145a781305d3cabc50c4d56558 Mon Sep 17 00:00:00 2001 From: superstar54 Date: Tue, 15 Jul 2025 17:29:47 +0200 Subject: [PATCH 1/2] Update to WorkGraph stable release --- docs/source/qe/bader.ipynb | 133 +++----- docs/source/qe/html/WorkGraph.html | 54 +++- docs/source/qe/html/bader_workgraph.html | 290 ++++++++++++++++++ .../ase/emt/atomization_energy.py | 4 +- .../ase/espresso/adsorption.py | 4 +- .../ase/espresso/atomization_energy.py | 4 +- workgraph_collections/ase/espresso/bader.py | 2 +- workgraph_collections/ase/espresso/bands.py | 2 +- .../ase/espresso/core_hole_pseudo.py | 2 +- workgraph_collections/ase/espresso/elastic.py | 4 +- workgraph_collections/ase/espresso/eos.py | 2 +- workgraph_collections/ase/espresso/oer.py | 2 +- workgraph_collections/ase/espresso/pdos.py | 2 +- workgraph_collections/ase/espresso/relax.py | 2 +- workgraph_collections/ase/espresso/slabs.py | 4 +- workgraph_collections/ase/espresso/xas.py | 4 +- workgraph_collections/ase/espresso/xps.py | 4 +- workgraph_collections/common/eos.py | 4 +- workgraph_collections/cp2k/eos.py | 4 +- workgraph_collections/cp2k/xps.py | 4 +- workgraph_collections/gpaw/wannier90.py | 2 +- workgraph_collections/qe/__init__.py | 12 + workgraph_collections/qe/bader.py | 48 ++- workgraph_collections/qe/bands.py | 2 +- workgraph_collections/qe/eos.py | 4 +- workgraph_collections/qe/pdos.py | 69 ++--- workgraph_collections/qe/relax.py | 2 +- workgraph_collections/qe/wannier90_bands.py | 2 +- workgraph_collections/qe/wannier90_minimal.py | 2 +- .../qe/wannier90_minimal_base.py | 2 +- workgraph_collections/qe/xps.py | 4 +- 31 files changed, 477 insertions(+), 203 deletions(-) create mode 100644 docs/source/qe/html/bader_workgraph.html diff --git a/docs/source/qe/bader.ipynb b/docs/source/qe/bader.ipynb index b71983a..cc496e9 100644 --- a/docs/source/qe/bader.ipynb +++ b/docs/source/qe/bader.ipynb @@ -9,72 +9,15 @@ "\n", "For the source code, see [bader](https://workgraph-collections.readthedocs.io/en/latest/qe/module.html#workgraph_collections.ase.espresso.bader.bader_workgraph).\n", "\n", - "\n", - "## Visualizing the WorkGraph Builder\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "6be40ba7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.qe.bader import bader_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = bader_workgraph.TaskCls()\n", - "task.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "9e6360d8", - "metadata": {}, - "source": [ "## Visualizing the WorkGraph" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "01bedd69", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/xing/miniconda3/envs/aiida/lib/python3.11/site-packages/aiida/engine/processes/ports.py:148: UserWarning: default of input port `charge_density_filename` is a `Node` instance, which can lead to unexpected side effects. It is advised to use a lambda instead, e.g.: `default=lambda: orm.Int(5)`.\n", - " warnings.warn(UserWarning(message))\n", - "/home/xing/miniconda3/envs/aiida/lib/python3.11/site-packages/aiida/engine/processes/ports.py:148: UserWarning: default of input port `reference_charge_density_filename` is a `Node` instance, which can lead to unexpected side effects. It is advised to use a lambda instead, e.g.: `default=lambda: orm.Int(5)`.\n", - " warnings.warn(UserWarning(message))\n" - ] - }, { "data": { "text/html": [ @@ -82,7 +25,7 @@ " " + "" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -101,7 +44,7 @@ "source": [ "from workgraph_collections.qe.bader import bader_workgraph\n", "\n", - "wg = bader_workgraph()\n", + "wg = bader_workgraph.get_graph()\n", "wg.to_html()" ] }, @@ -117,23 +60,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 53980\n", - "Bader charges:\n", - "Index Symbol Charge\n", - " 0 O 7.147\n", - " 1 H 0.427\n", - " 2 H 0.427\n" - ] - } - ], + "outputs": [], "source": [ "from aiida import load_profile\n", "from aiida.orm import Dict, KpointsData, StructureData, load_code\n", @@ -145,8 +75,8 @@ "load_profile()\n", "#===============================================================================\n", "# load the codes\n", - "pw_code = load_code(\"qe-7.2-pw@localhost\")\n", - "pp_code = load_code(\"qe-7.2-pp@localhost\")\n", + "pw_code = load_code(\"pw-7.4@localhost\")\n", + "pp_code = load_code(\"pp-7.4@localhost\")\n", "bader_code = load_code(\"bader@localhost\")\n", "# ===============================================================================\n", "# create input structure\n", @@ -213,12 +143,42 @@ " }\n", "}\n", "# prepare inputs and submit\n", - "wg = bader_workgraph(structure=structure, pw_code=pw_code,\n", + "wg = bader_workgraph.get_graph(structure=structure, pw_code=pw_code,\n", " pp_code=pp_code, bader_code=bader_code,\n", - " inputs=inputs)\n", + " inputs=inputs)\n" + ] + }, + { + "cell_type": "markdown", + "id": "21537606", + "metadata": {}, + "source": [ + "Submit the WorkGraph:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a935c67", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bader charges:\n", + "Index Symbol Charge\n", + " 0 O 7.147\n", + " 1 H 0.427\n", + " 2 H 0.427\n" + ] + } + ], + "source": [ "wg.submit(wait=True, timeout=300)\n", + "\n", "#------------------------- Print the output -------------------------\n", - "charges = wg.tasks[\"bader\"].node.outputs.bader_charge.get_array(\"charge\")\n", + "charges = wg.outputs.bader_charge.value.get_array(\"charge\")\n", "print(\"Bader charges:\")\n", "print(\"Index Symbol Charge\")\n", "for i, charge in enumerate(charges):\n", @@ -228,7 +188,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -242,12 +202,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.1.-1" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } + "version": "3.11.0" } }, "nbformat": 4, diff --git a/docs/source/qe/html/WorkGraph.html b/docs/source/qe/html/WorkGraph.html index 72c112b..c5e3378 100644 --- a/docs/source/qe/html/WorkGraph.html +++ b/docs/source/qe/html/WorkGraph.html @@ -21,6 +21,7 @@ + + + +
+ + + diff --git a/workgraph_collections/ase/emt/atomization_energy.py b/workgraph_collections/ase/emt/atomization_energy.py index f1927fd..34a8f34 100644 --- a/workgraph_collections/ase/emt/atomization_energy.py +++ b/workgraph_collections/ase/emt/atomization_energy.py @@ -8,9 +8,7 @@ def calc_atomization_energy(molecule: Atoms, molecule_output: dict, atom_output: return energy -@task.graph_builder( - outputs=[{"name": "result", "from": "calc_atomization_energy.result"}] -) +@task.graph(outputs=[{"name": "result", "from": "calc_atomization_energy.result"}]) def atomization_energy(atom: Atoms = None, molecule: Atoms = None): """Workgraph for atomization energy calculation using EMT calculator.""" from .base import emt_calculator diff --git a/workgraph_collections/ase/espresso/adsorption.py b/workgraph_collections/ase/espresso/adsorption.py index 070cd83..d97e757 100644 --- a/workgraph_collections/ase/espresso/adsorption.py +++ b/workgraph_collections/ase/espresso/adsorption.py @@ -4,7 +4,7 @@ from typing import Dict -@task.graph_builder( +@task.graph( outputs=[ {"name": "parameters", "from": "context.parameters"}, {"name": "structures", "from": "context.structures"}, @@ -73,7 +73,7 @@ def get_surface_energy( return surface_energies -@task.graph_builder( +@task.graph( outputs=[ {"name": "parameters", "from": "relax_structures.parameters"}, {"name": "structures", "from": "relax_structures.structures"}, diff --git a/workgraph_collections/ase/espresso/atomization_energy.py b/workgraph_collections/ase/espresso/atomization_energy.py index 5ef1175..2e233dd 100644 --- a/workgraph_collections/ase/espresso/atomization_energy.py +++ b/workgraph_collections/ase/espresso/atomization_energy.py @@ -8,9 +8,7 @@ def calc_atomization_energy(molecule, molecule_output, atom_output): return energy -@task.graph_builder( - outputs=[{"name": "result", "from": "calc_atomization_energy.result"}] -) +@task.graph(outputs=[{"name": "result", "from": "calc_atomization_energy.result"}]) def atomization_energy(atom: Atoms = None, molecule: Atoms = None): """Workgraph for atomization energy calculation using Espresso calculator.""" diff --git a/workgraph_collections/ase/espresso/bader.py b/workgraph_collections/ase/espresso/bader.py index bbca81a..cc6e8bf 100644 --- a/workgraph_collections/ase/espresso/bader.py +++ b/workgraph_collections/ase/espresso/bader.py @@ -4,7 +4,7 @@ from workgraph_collections.bader import bader_calculator -@task.graph_builder() +@task.graph() def bader_workgraph( atoms: Atoms = None, pw_command: str = "pw.x", diff --git a/workgraph_collections/ase/espresso/bands.py b/workgraph_collections/ase/espresso/bands.py index 3756230..f26e657 100644 --- a/workgraph_collections/ase/espresso/bands.py +++ b/workgraph_collections/ase/espresso/bands.py @@ -15,7 +15,7 @@ def find_kpoint_path( return kpts -@task.graph_builder() +@task.graph() def bands_workgraph( atoms: Atoms = None, pw_command: str = "pw.x", diff --git a/workgraph_collections/ase/espresso/core_hole_pseudo.py b/workgraph_collections/ase/espresso/core_hole_pseudo.py index 383b9d9..43d9610 100644 --- a/workgraph_collections/ase/espresso/core_hole_pseudo.py +++ b/workgraph_collections/ase/espresso/core_hole_pseudo.py @@ -9,7 +9,7 @@ def calc_correction(ground_output, core_hole_output): return energy -@task.graph_builder(outputs=[{"name": "result", "from": "calc_correction.result"}]) +@task.graph(outputs=[{"name": "result", "from": "calc_correction.result"}]) def core_hole_pseudo_workgraph( ground_inputs: dict = None, core_hole_inputs: dict = None, diff --git a/workgraph_collections/ase/espresso/elastic.py b/workgraph_collections/ase/espresso/elastic.py index cc1b603..d33d5d3 100644 --- a/workgraph_collections/ase/espresso/elastic.py +++ b/workgraph_collections/ase/espresso/elastic.py @@ -22,7 +22,7 @@ def get_deformed_structure_set( return deformed_structure_set -@task.graph_builder(outputs=[{"name": "relax_results", "from": "context.results"}]) +@task.graph(outputs=[{"name": "relax_results", "from": "context.results"}]) def run_relaxation( deformed_structure_set: DeformedStructureSet, relax_inputs: dict ) -> WorkGraph: @@ -98,7 +98,7 @@ def restore_full_strains_stresses( return elastic_constants -@task.graph_builder(outputs=[{"name": "result", "from": "fit_elastic.result"}]) +@task.graph(outputs=[{"name": "result", "from": "fit_elastic.result"}]) def elastic_workgraph( atoms: Atoms = None, command: str = "pw.x", diff --git a/workgraph_collections/ase/espresso/eos.py b/workgraph_collections/ase/espresso/eos.py index b09359a..902eba2 100644 --- a/workgraph_collections/ase/espresso/eos.py +++ b/workgraph_collections/ase/espresso/eos.py @@ -3,7 +3,7 @@ from ase import Atoms -@task.graph_builder(outputs=[{"name": "result", "from": "fit_eos.result"}]) +@task.graph(outputs=[{"name": "result", "from": "fit_eos.result"}]) def eos_workgraph( atoms: Atoms = None, command: str = "pw.x", diff --git a/workgraph_collections/ase/espresso/oer.py b/workgraph_collections/ase/espresso/oer.py index 2a1335b..58bfef4 100644 --- a/workgraph_collections/ase/espresso/oer.py +++ b/workgraph_collections/ase/espresso/oer.py @@ -79,7 +79,7 @@ def build_adsorbate(atoms, site, site_symbol, site_position, mols): return structures -@task.graph_builder(outputs=[{"name": "scf_results", "from": "context.results"}]) +@task.graph(outputs=[{"name": "scf_results", "from": "context.results"}]) def relax_structures(structures, pw_inputs): """Run the scf calculation for each atoms.""" from workgraph_collections.ase.espresso.base import pw_calculator diff --git a/workgraph_collections/ase/espresso/pdos.py b/workgraph_collections/ase/espresso/pdos.py index 5d3a478..7e694ed 100644 --- a/workgraph_collections/ase/espresso/pdos.py +++ b/workgraph_collections/ase/espresso/pdos.py @@ -5,7 +5,7 @@ from aiida import orm -@task.graph_builder() +@task.graph() def pdos_workgraph( atoms: Atoms = None, pw_command: str = "pw.x", diff --git a/workgraph_collections/ase/espresso/relax.py b/workgraph_collections/ase/espresso/relax.py index 4abefd5..3adc1f2 100644 --- a/workgraph_collections/ase/espresso/relax.py +++ b/workgraph_collections/ase/espresso/relax.py @@ -41,7 +41,7 @@ def inspect_relax( return results -@task.graph_builder( +@task.graph( outputs=[ {"name": "atoms", "from": "relax.atoms"}, {"name": "parameters", "from": "context.parameters"}, diff --git a/workgraph_collections/ase/espresso/slabs.py b/workgraph_collections/ase/espresso/slabs.py index 1f63809..d7aea6f 100644 --- a/workgraph_collections/ase/espresso/slabs.py +++ b/workgraph_collections/ase/espresso/slabs.py @@ -4,7 +4,7 @@ from typing import List, Dict -@task.graph_builder( +@task.graph( outputs=[ {"name": "parameters", "from": "context.parameters"}, {"name": "structures", "from": "context.structures"}, @@ -71,7 +71,7 @@ def get_surface_energy( return surface_energies -@task.graph_builder( +@task.graph( outputs=[ {"name": "parameters", "from": "relax_slabs.parameters"}, {"name": "structures", "from": "relax_slabs.structures"}, diff --git a/workgraph_collections/ase/espresso/xas.py b/workgraph_collections/ase/espresso/xas.py index 5ae9a33..a83f23c 100644 --- a/workgraph_collections/ase/espresso/xas.py +++ b/workgraph_collections/ase/espresso/xas.py @@ -6,7 +6,7 @@ from workgraph_collections.ase.espresso.base import pw_calculator -@task.graph_builder( +@task.graph( outputs=[["context.scf_results", "scf"], ["context.xspectra_results", "xspectra"]] ) def run_all_xspectra_prod( @@ -91,7 +91,7 @@ def run_all_xspectra_prod( return wg -@task.graph_builder(outputs=[{"name": "result", "from": "binding_energy.result"}]) +@task.graph(outputs=[{"name": "result", "from": "binding_energy.result"}]) def xas_workgraph( atoms: Atoms = None, commands: dict = None, diff --git a/workgraph_collections/ase/espresso/xps.py b/workgraph_collections/ase/espresso/xps.py index a7dd1bb..e8a67ab 100644 --- a/workgraph_collections/ase/espresso/xps.py +++ b/workgraph_collections/ase/espresso/xps.py @@ -8,7 +8,7 @@ from copy import deepcopy -@task.graph_builder(outputs=[{"name": "results", "from": "context.scf"}]) +@task.graph(outputs=[{"name": "results", "from": "context.scf"}]) def run_scf( marked_atoms: dict, command: str = None, @@ -109,7 +109,7 @@ def run_scf( return wg -@task.graph_builder(outputs=[{"name": "result", "from": "binding_energy.result"}]) +@task.graph(outputs=[{"name": "result", "from": "binding_energy.result"}]) def xps_workgraph( atoms: Atoms = None, scf_inputs: str = None, diff --git a/workgraph_collections/common/eos.py b/workgraph_collections/common/eos.py index 091e2af..4c8eb55 100644 --- a/workgraph_collections/common/eos.py +++ b/workgraph_collections/common/eos.py @@ -44,7 +44,7 @@ def fit_eos(volumes: dict = None, **scf_outputs): # Output result from context to the output socket -@task.graph_builder(outputs=[{"name": "result", "from": "context.result"}]) +@task.graph(outputs=[{"name": "result", "from": "context.result"}]) def all_scf(calculator, structures, scf_inputs): """Run the scf calculation for each structure.""" from aiida_workgraph import WorkGraph @@ -58,7 +58,7 @@ def all_scf(calculator, structures, scf_inputs): return wg -@task.graph_builder(outputs=[{"name": "result", "from": "fit_eos.result"}]) +@task.graph(outputs=[{"name": "result", "from": "fit_eos.result"}]) def eos_workgraph( structure: orm.StructureData = None, scales: list = None, diff --git a/workgraph_collections/cp2k/eos.py b/workgraph_collections/cp2k/eos.py index b85ce8f..fbdbb03 100644 --- a/workgraph_collections/cp2k/eos.py +++ b/workgraph_collections/cp2k/eos.py @@ -4,7 +4,7 @@ # Output result from context to the output socket -@task.graph_builder(outputs=[{"name": "result", "from": "context.result"}]) +@task.graph(outputs=[{"name": "result", "from": "context.result"}]) def all_scf(structures, scf_inputs): """Run the scf calculation for each structure.""" from aiida_workgraph import WorkGraph @@ -19,7 +19,7 @@ def all_scf(structures, scf_inputs): return wg -@task.graph_builder(outputs=[{"name": "result", "from": "fit_eos.result"}]) +@task.graph(outputs=[{"name": "result", "from": "fit_eos.result"}]) def eos_workgraph( structure: orm.StructureData = None, code: orm.Code = None, diff --git a/workgraph_collections/cp2k/xps.py b/workgraph_collections/cp2k/xps.py index c10e0b3..63d119c 100644 --- a/workgraph_collections/cp2k/xps.py +++ b/workgraph_collections/cp2k/xps.py @@ -25,7 +25,7 @@ ) -@task.graph_builder(outputs=[{"name": "result", "form": "context.scf"}]) +@task.graph(outputs=[{"name": "result", "form": "context.scf"}]) def run_scf( structure, code: Code = None, @@ -90,7 +90,7 @@ def run_scf( return wg -@task.graph_builder(outputs=[{"name": "result", "from": "binding_energy.result"}]) +@task.graph(outputs=[{"name": "result", "from": "binding_energy.result"}]) def xps_workgraph( structure: StructureData = None, code: Code = None, diff --git a/workgraph_collections/gpaw/wannier90.py b/workgraph_collections/gpaw/wannier90.py index d28894e..65fb6da 100644 --- a/workgraph_collections/gpaw/wannier90.py +++ b/workgraph_collections/gpaw/wannier90.py @@ -29,7 +29,7 @@ def wannier90( os.system(f"{binary} " + seed) -@task.graph_builder() +@task.graph() def wannier90_workgraph( atoms: Atoms = None, ): diff --git a/workgraph_collections/qe/__init__.py b/workgraph_collections/qe/__init__.py index e69de29..5f5a224 100644 --- a/workgraph_collections/qe/__init__.py +++ b/workgraph_collections/qe/__init__.py @@ -0,0 +1,12 @@ +from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain +from aiida_quantumespresso.workflows.pw.relax import PwRelaxWorkChain +from aiida_quantumespresso.calculations.dos import DosCalculation +from aiida_quantumespresso.calculations.projwfc import ProjwfcCalculation +from aiida_quantumespresso.calculations.pp import PpCalculation +from aiida_workgraph import task + +PwBaseTask = task()(PwBaseWorkChain) +PwRelaxTask = task()(PwRelaxWorkChain) +DosTask = task()(DosCalculation) +ProjwfcTask = task()(ProjwfcCalculation) +PpTask = task()(PpCalculation) diff --git a/workgraph_collections/qe/bader.py b/workgraph_collections/qe/bader.py index 6cea1c8..c5508ef 100644 --- a/workgraph_collections/qe/bader.py +++ b/workgraph_collections/qe/bader.py @@ -1,10 +1,14 @@ # -*- coding: utf-8 -*- """QeBaderWorkGraph of the AiiDA bader plugin""" from aiida import orm -from aiida_workgraph import WorkGraph, task +from aiida_workgraph import task +from workgraph_collections.qe import PwBaseTask, PpTask +from aiida_bader.calculations import BaderCalculation +BaderTask = task()(BaderCalculation) -@task.graph_builder(outputs=[{"name": "charge", "from": "bader.charge"}]) + +@task.graph(outputs=["bader_charge"]) def bader_workgraph( structure: orm.StructureData = None, pw_code: orm.Code = None, @@ -19,43 +23,29 @@ def bader_workgraph( 4. Run the Bader charge analysis. """ - from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain - from aiida_quantumespresso.calculations.pp import PpCalculation - from aiida_bader.calculations import BaderCalculation - inputs = {} if inputs is None else inputs - wg = WorkGraph("BaderCharge") # -------- scf ----------- - scf_task = wg.add_task(PwBaseWorkChain, name="scf") scf_inputs = inputs.get("scf", {}) scf_inputs.update({"pw.structure": structure, "pw.code": pw_code}) - scf_task.set(scf_inputs) + scf_outs = PwBaseTask(**scf_inputs) # -------- pp valence ----------- - pp_valence = wg.add_task( - PpCalculation, - name="pp_valence", + pp_valence_outs = PpTask( code=pp_code, - parent_folder=scf_task.outputs["remote_folder"], + parent_folder=scf_outs.remote_folder, + **inputs.get("pp_valence", {}), ) - pp_valence_inputs = inputs.get("pp_valence", {}) - pp_valence.set(pp_valence_inputs) # -------- pp all ----------- - pp_all = wg.add_task( - PpCalculation, - name="pp_all", + pp_all_outs = PpTask( code=pp_code, - parent_folder=scf_task.outputs["remote_folder"], + parent_folder=scf_outs.remote_folder, + **inputs.get("pp_all", {}), ) - pp_all_inputs = inputs.get("pp_all", {}) - pp_all.set(pp_all_inputs) + # -------- bader ----------- - bader_task = wg.add_task( - BaderCalculation, - name="bader", + bader_outs = BaderTask( code=bader_code, - charge_density_folder=pp_valence.outputs["remote_folder"], - reference_charge_density_folder=pp_all.outputs["remote_folder"], + charge_density_folder=pp_valence_outs.remote_folder, + reference_charge_density_folder=pp_all_outs.remote_folder, + **inputs.get("bader", {}), ) - bader_inputs = inputs.get("bader", {}) - bader_task.set(bader_inputs) - return wg + return {"bader_charge": bader_outs.bader_charge} diff --git a/workgraph_collections/qe/bands.py b/workgraph_collections/qe/bands.py index 8c8fc9f..1fdf09f 100644 --- a/workgraph_collections/qe/bands.py +++ b/workgraph_collections/qe/bands.py @@ -51,7 +51,7 @@ def update_bands_parameters(parameters, scf_parameters, nbands_factor=None): return orm.Dict(parameters) -@task.graph_builder() +@task.graph() def bands_workgraph( structure: orm.StructureData = None, code: orm.Code = None, diff --git a/workgraph_collections/qe/eos.py b/workgraph_collections/qe/eos.py index 94ed55b..0571827 100644 --- a/workgraph_collections/qe/eos.py +++ b/workgraph_collections/qe/eos.py @@ -4,7 +4,7 @@ # Output result from context to the output socket -@task.graph_builder(outputs=[{"name": "result", "from": "context.result"}]) +@task.graph(outputs=[{"name": "result", "from": "context.result"}]) def all_scf(structures, scf_inputs): """Run the scf calculation for each structure.""" from aiida_workgraph import WorkGraph @@ -19,7 +19,7 @@ def all_scf(structures, scf_inputs): return wg -@task.graph_builder(outputs=[{"name": "result", "from": "fit_eos.result"}]) +@task.graph(outputs=[{"name": "result", "from": "fit_eos.result"}]) def eos_workgraph( structure: orm.StructureData = None, code: orm.Code = None, diff --git a/workgraph_collections/qe/pdos.py b/workgraph_collections/qe/pdos.py index e07d780..85fcab1 100644 --- a/workgraph_collections/qe/pdos.py +++ b/workgraph_collections/qe/pdos.py @@ -2,12 +2,8 @@ """PdosWorkGraph.""" from aiida import orm -from aiida_workgraph import WorkGraph from aiida_workgraph import task -from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain -from aiida_quantumespresso.workflows.pw.relax import PwRelaxWorkChain -from aiida_quantumespresso.calculations.dos import DosCalculation -from aiida_quantumespresso.calculations.projwfc import ProjwfcCalculation +from workgraph_collections.qe import PwBaseTask, PwRelaxTask, DosTask, ProjwfcTask @task() @@ -39,7 +35,12 @@ def generate_projwfc_parameters(nscf_outputs, parameters=None): return orm.Dict(paras) -@task.graph_builder() +@task.graph( + outputs=[ + {"name": "dos", "identifier": "workgraph.namespace"}, + {"name": "projwfc", "identifier": "workgraph.namespace"}, + ] +) def pdos_workgraph( structure: orm.StructureData = None, pw_code: orm.Code = None, @@ -52,17 +53,15 @@ def pdos_workgraph( run_scf: bool = False, run_relax: bool = False, ): - """Generate PdosWorkGraph.""" + """Workgraph to run a full PDOS calculation.""" + inputs = {} if inputs is None else inputs # Load the pseudopotential family. if pseudo_family is not None: pseudo_family = orm.load_group(pseudo_family) pseudos = pseudo_family.get_pseudos(structure=structure) - # create workgraph - wg = WorkGraph("PDOS") # ------- relax ----------- if run_relax: - relax_task = wg.add_task(PwRelaxWorkChain, name="relax", structure=structure) relax_inputs = inputs.get("relax", {}) relax_inputs.update( { @@ -70,20 +69,18 @@ def pdos_workgraph( "base.pw.pseudos": pseudos, } ) - relax_task.set(relax_inputs) + relax_outs = PwRelaxTask(structure=structure, **relax_inputs) # override the structure - structure = relax_task.outputs["output_structure"] + structure = relax_outs.output_structure # -------- scf ----------- if run_scf: - scf_task = wg.add_task(PwBaseWorkChain, name="scf") scf_inputs = inputs.get("scf", {}) scf_inputs.update( {"pw.structure": structure, "pw.code": pw_code, "pw.pseudos": pseudos} ) - scf_task.set(scf_inputs) - scf_parent_folder = scf_task.outputs["remote_folder"] + scf_outs = PwBaseTask(**scf_inputs) + scf_parent_folder = scf_outs.remote_folder # -------- nscf ----------- - nscf_task = wg.add_task(PwBaseWorkChain, name="nscf") nscf_inputs = inputs.get("nscf", {}) nscf_inputs.update( { @@ -93,33 +90,35 @@ def pdos_workgraph( "pw.pseudos": pseudos, } ) - nscf_task.set(nscf_inputs) + nscf_outs = PwBaseTask(**nscf_inputs) # -------- dos ----------- - dos1 = wg.add_task(DosCalculation, name="dos") dos_input = inputs.get("dos", {}) dos_input.update({"code": dos_code}) - dos1.set(dos_input) - dos_parameters = wg.add_task( - generate_dos_parameters, + dos_parameters_outs = generate_dos_parameters( name="dos_parameters", - parameters=dos_input.get("parameters"), + parameters=dos_input.pop("parameters", {}), + ) + dos_input.update( + { + "parent_folder": nscf_outs.remote_folder, + "nscf_outputs": nscf_outs._outputs, + "parameters": dos_parameters_outs.result, + } ) - wg.links.new(nscf_task.outputs["remote_folder"], dos1.inputs["parent_folder"]) - wg.links.new(nscf_task.outputs["_outputs"], dos_parameters.inputs["nscf_outputs"]) - wg.links.new(dos_parameters.outputs[0], dos1.inputs["parameters"]) + dos_outs = DosTask(**dos_input) # -------- projwfc ----------- - projwfc1 = wg.add_task(ProjwfcCalculation, name="projwfc") projwfc_inputs = inputs.get("projwfc", {}) projwfc_inputs.update({"code": projwfc_code}) - projwfc1.set(projwfc_inputs) - projwfc_parameters = wg.add_task( - generate_projwfc_parameters, + projwfc_parameters_outs = generate_projwfc_parameters( name="projwfc_parameters", - parameters=projwfc_inputs.get("parameters"), + parameters=projwfc_inputs.pop("parameters", {}), ) - wg.links.new(nscf_task.outputs["remote_folder"], projwfc1.inputs["parent_folder"]) - wg.links.new( - nscf_task.outputs["_outputs"], projwfc_parameters.inputs["nscf_outputs"] + projwfc_inputs.update( + { + "parent_folder": nscf_outs.remote_folder, + "nscf_outputs": nscf_outs._outputs, + "parameters": projwfc_parameters_outs.result, + } ) - wg.links.new(projwfc_parameters.outputs[0], projwfc1.inputs["parameters"]) - return wg + projwfc_outs = ProjwfcTask(**projwfc_inputs) + return {"dos": dos_outs, "projwfc": projwfc_outs} diff --git a/workgraph_collections/qe/relax.py b/workgraph_collections/qe/relax.py index 642d6e0..7035094 100644 --- a/workgraph_collections/qe/relax.py +++ b/workgraph_collections/qe/relax.py @@ -115,7 +115,7 @@ def relax_workgraph( return tree -@task.graph_builder() +@task.graph() def relax_scf_workgraph( structure=None, inputs=None, max_iterations=5, volume_threshold=0.1 ): diff --git a/workgraph_collections/qe/wannier90_bands.py b/workgraph_collections/qe/wannier90_bands.py index 0522f65..89efeba 100644 --- a/workgraph_collections/qe/wannier90_bands.py +++ b/workgraph_collections/qe/wannier90_bands.py @@ -55,7 +55,7 @@ def prepare_wannier90_pp_inputs( return orm.Dict(parameters) -@task.graph_builder() +@task.graph() def wannier90_bands_workgraph( structure: orm.StructureData = None, codes: dict = None, diff --git a/workgraph_collections/qe/wannier90_minimal.py b/workgraph_collections/qe/wannier90_minimal.py index 269f08a..f1dbba4 100644 --- a/workgraph_collections/qe/wannier90_minimal.py +++ b/workgraph_collections/qe/wannier90_minimal.py @@ -4,7 +4,7 @@ from aiida_wannier90.calculations.wannier90 import Wannier90Calculation -@task.graph_builder() +@task.graph() def wannier90_minimal_workgraph(structure=None, inputs=None): """Generate PdosWorkGraph.""" inputs = {} if inputs is None else inputs diff --git a/workgraph_collections/qe/wannier90_minimal_base.py b/workgraph_collections/qe/wannier90_minimal_base.py index 53d92e0..911b7ea 100644 --- a/workgraph_collections/qe/wannier90_minimal_base.py +++ b/workgraph_collections/qe/wannier90_minimal_base.py @@ -6,7 +6,7 @@ from aiida_wannier90_workflows.workflows.base.wannier90 import Wannier90BaseWorkChain -@task.graph_builder() +@task.graph() def wannier90_minimal_base_workgraph(structure=None, inputs=None): """Generate PdosWorkGraph.""" inputs = {} if inputs is None else inputs diff --git a/workgraph_collections/qe/xps.py b/workgraph_collections/qe/xps.py index 67538f0..195a09f 100644 --- a/workgraph_collections/qe/xps.py +++ b/workgraph_collections/qe/xps.py @@ -25,7 +25,7 @@ ) -@task.graph_builder(outputs=[{"name": "result", "from": "context.scf"}]) +@task.graph(outputs=[{"name": "result", "from": "context.scf"}]) def run_scf( structure: StructureData = None, code: Code = None, @@ -124,7 +124,7 @@ def run_scf( return wg -@task.graph_builder(outputs=[{"name": "result", "from": "binding_energy.result"}]) +@task.graph(outputs=[{"name": "result", "from": "binding_energy.result"}]) def xps_workgraph( structure: StructureData = None, code: Code = None, From 95e506a466b5efa5e4f783914907eb0a9a0f102d Mon Sep 17 00:00:00 2001 From: superstar54 Date: Mon, 18 Aug 2025 08:45:05 +0200 Subject: [PATCH 2/2] Use spec --- .gitignore | 3 + .../ase/espresso/atomization_energy.ipynb | 184 ++++---- docs/source/ase/espresso/bader.ipynb | 188 ++++---- docs/source/ase/espresso/bands.ipynb | 191 ++++----- docs/source/ase/espresso/base.ipynb | 66 ++- docs/source/ase/espresso/elastic.ipynb | 219 +++++----- docs/source/ase/espresso/eos.ipynb | 210 +++++---- .../ase/espresso/html/AtomizationEnergy.html | 290 +++++++++++++ .../ase/espresso/html/BaderWorkgraph.html | 290 +++++++++++++ .../ase/espresso/html/BandsWorkgraph.html | 290 +++++++++++++ .../ase/espresso/html/ElasticWorkgraph.html | 290 +++++++++++++ .../ase/espresso/html/EosWorkGraph.html | 290 +++++++++++++ .../ase/espresso/html/PdosWorkgraph.html | 290 +++++++++++++ .../ase/espresso/html/RelaxWorkgraph.html | 290 +++++++++++++ .../ase/espresso/html/dos_calculator.html | 290 +++++++++++++ .../ase/espresso/html/pp_calculator.html | 290 +++++++++++++ .../ase/espresso/html/projwfc_calculator.html | 290 +++++++++++++ docs/source/ase/espresso/index.rst | 1 + docs/source/ase/espresso/pdos.ipynb | 269 ++++-------- docs/source/ase/espresso/relax.ipynb | 215 ++++++++++ docs/source/ase/espresso/surface_slabs.ipynb | 367 +++++++++++++--- docs/source/ase/espresso/xps.ipynb | 124 ++---- docs/source/qe/bader.ipynb | 67 +-- docs/source/qe/bands.ipynb | 194 ++++----- docs/source/qe/eos.ipynb | 168 +++----- docs/source/qe/html/BaderWorkgraph.html | 290 +++++++++++++ docs/source/qe/html/BandsWorkgraph.html | 290 +++++++++++++ docs/source/qe/html/EosWorkgraph.html | 290 +++++++++++++ docs/source/qe/html/PdosWorkGraph.html | 290 +++++++++++++ docs/source/qe/html/XpsWorkgraph.html | 290 +++++++++++++ docs/source/qe/html/eos_workgraph.html | 290 +++++++++++++ docs/source/qe/pdos.ipynb | 190 +++----- docs/source/qe/xps.ipynb | 405 +++++------------- tests/ase/test_ase_emt.py | 19 +- tests/ase/test_ase_espresso.py | 62 +-- tests/conftest.py | 2 +- .../ase/common/core_level.py | 12 +- workgraph_collections/ase/common/eos.py | 25 +- workgraph_collections/ase/common/surface.py | 29 +- .../ase/emt/atomization_energy.py | 29 +- workgraph_collections/ase/emt/base.py | 4 +- .../ase/espresso/adsorption.py | 66 +-- .../ase/espresso/atomization_energy.py | 67 ++- workgraph_collections/ase/espresso/bader.py | 69 ++- workgraph_collections/ase/espresso/bands.py | 64 ++- workgraph_collections/ase/espresso/base.py | 35 +- .../ase/espresso/core_hole_pseudo.py | 32 +- workgraph_collections/ase/espresso/elastic.py | 93 ++-- workgraph_collections/ase/espresso/eos.py | 107 +++-- workgraph_collections/ase/espresso/pdos.py | 112 ++--- workgraph_collections/ase/espresso/pw.py | 57 ++- workgraph_collections/ase/espresso/relax.py | 145 +++---- workgraph_collections/ase/espresso/slabs.py | 119 ++--- workgraph_collections/ase/espresso/xps.py | 111 ++--- workgraph_collections/bader.py | 2 +- workgraph_collections/common/eos.py | 57 ++- workgraph_collections/qe/__init__.py | 15 +- workgraph_collections/qe/bader.py | 20 +- workgraph_collections/qe/bands.py | 104 ++--- workgraph_collections/qe/eos.py | 53 +-- workgraph_collections/qe/pdos.py | 55 ++- workgraph_collections/qe/xps.py | 135 +++--- 62 files changed, 6853 insertions(+), 2548 deletions(-) create mode 100644 docs/source/ase/espresso/html/AtomizationEnergy.html create mode 100644 docs/source/ase/espresso/html/BaderWorkgraph.html create mode 100644 docs/source/ase/espresso/html/BandsWorkgraph.html create mode 100644 docs/source/ase/espresso/html/ElasticWorkgraph.html create mode 100644 docs/source/ase/espresso/html/EosWorkGraph.html create mode 100644 docs/source/ase/espresso/html/PdosWorkgraph.html create mode 100644 docs/source/ase/espresso/html/RelaxWorkgraph.html create mode 100644 docs/source/ase/espresso/html/dos_calculator.html create mode 100644 docs/source/ase/espresso/html/pp_calculator.html create mode 100644 docs/source/ase/espresso/html/projwfc_calculator.html create mode 100644 docs/source/ase/espresso/relax.ipynb create mode 100644 docs/source/qe/html/BaderWorkgraph.html create mode 100644 docs/source/qe/html/BandsWorkgraph.html create mode 100644 docs/source/qe/html/EosWorkgraph.html create mode 100644 docs/source/qe/html/PdosWorkGraph.html create mode 100644 docs/source/qe/html/XpsWorkgraph.html create mode 100644 docs/source/qe/html/eos_workgraph.html diff --git a/.gitignore b/.gitignore index 68bc17f..bd47a95 100644 --- a/.gitignore +++ b/.gitignore @@ -158,3 +158,6 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + + +.vscode/ diff --git a/docs/source/ase/espresso/atomization_energy.ipynb b/docs/source/ase/espresso/atomization_energy.ipynb index 09ddf32..ad09d9a 100644 --- a/docs/source/ase/espresso/atomization_energy.ipynb +++ b/docs/source/ase/espresso/atomization_energy.ipynb @@ -24,13 +24,16 @@ "- $E_{\\text{atom}}$ is the energy of an isolated atom.\n", "- $E_{\\text{molecule}}$ is the energy of the molecule.\n", "\n", - "## Visualizing the WorkGraph Builder\n" + "## Example: Atomization energy of a molecule N2\n", + "\n", + "### Prepare the inputs and submit the workflow\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 1, - "id": "1a8ebc0d", + "execution_count": 4, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -40,7 +43,7 @@ " " + "" ] }, - "execution_count": 1, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from workgraph_collections.ase.espresso.atomization_energy import atomization_energy\n", + "from ase.build import molecule\n", + "from ase import Atoms\n", + "from aiida import load_profile\n", + "from workgraph_collections.ase.espresso.atomization_energy import AtomizationEnergy\n", + "from aiida_pythonjob.config import config\n", + "# allow pickle\n", + "config[\"allow_pickle\"] = True\n", + "load_profile()\n", + "\n", + "# create input structure\n", + "n_atom = Atoms(\"N\", pbc=True)\n", + "n_atom.center(vacuum=5.0)\n", + "n2_molecule = molecule(\"N2\", pbc=True)\n", + "n2_molecule.center(vacuum=5.0)\n", + "\n", + "metadata = {\n", + " \"options\": {\n", + " 'prepend_text' : \"\"\"eval \"$(conda shell.posix hook)\"\n", + " conda activate aiida\n", + " export OMP_NUM_THREADS=1\n", + " \"\"\",\n", + " }\n", + "}\n", + "pseudopotentials = {\"N\": \"N.pbe-n-rrkjus_psl.1.0.0.UPF\"}\n", + "pseudo_dir = \"/home/xing/data/ase/espresso_pseudo\"\n", + "# pseudo_dir = \"/home/wang_x3/datas/pseudos/psl\"\n", + "input_data = {\n", + " \"system\": {\"ecutwfc\": 30, \"ecutrho\": 240,\n", + " \"occupations\": \"smearing\",\n", + " \"degauss\": 0.01,\n", + " \"smearing\": \"cold\",},\n", + "}\n", + "#------------------------- Set the inputs -------------------------\n", + "wg = AtomizationEnergy.build_graph(atom=n_atom,\n", + " molecule=n2_molecule,\n", + " pseudopotentials=pseudopotentials,\n", + " input_data=input_data,\n", + " pseudo_dir=pseudo_dir,\n", + " computer=\"localhost\",\n", + " metadata=metadata)\n", "\n", - "task = atomization_energy.TaskCls()\n", - "task.to_html()" + "wg.to_html()" ] }, { "cell_type": "markdown", - "id": "9e6360d8", + "id": "dd873a97", "metadata": {}, "source": [ - "## Visualizing the WorkGraph" + "Run the workflow" ] }, { "cell_type": "code", "execution_count": 2, - "id": "01bedd69", + "id": "c48c10af", "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "09/04/2025 07:22:58 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator,pw_calculator1\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator,pw_calculator1\n", + "09/04/2025 07:23:01 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180062, 180075\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180062, 180075\n", + "09/04/2025 07:23:04 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:23:04 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "09/04/2025 07:23:06 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|continue_workgraph]: tasks ready to run: calc_atomization_energy\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|continue_workgraph]: tasks ready to run: calc_atomization_energy\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/04/2025 07:23:07 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|update_task_state]: Task: calc_atomization_energy, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|update_task_state]: Task: calc_atomization_energy, type: PYFUNCTION, finished.\n", + "09/04/2025 07:23:07 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:23:07 AM <581732> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180058|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180058|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] } ], "source": [ - "from workgraph_collections.ase.espresso.atomization_energy import atomization_energy\n", - "\n", - "wg = atomization_energy()\n", - "wg.to_html()" + "wg.run()\n" ] }, { "cell_type": "markdown", - "id": "efa095d0", + "id": "2e7efd9d", "metadata": {}, "source": [ - "## Example: Atomization energy of a molecule N2\n", - "\n", - "### Prepare the inputs and submit the workflow\n" + "Print out the result" ] }, { "cell_type": "code", "execution_count": 3, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", + "id": "72481d10", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "WorkGraph process created, PK: 16469\n", - "Energy of a N atom: -269.881\n", - "Energy of an un-relaxed N2 molecule: -556.008\n", - "Atomization energy: 16.246 eV\n" + "Atomization energy: 16.262 eV\n" ] } ], "source": [ - "from ase.build import molecule\n", - "from ase import Atoms\n", - "from aiida import load_profile\n", - "from workgraph_collections.ase.espresso.atomization_energy import atomization_energy\n", - "\n", - "load_profile()\n", - "\n", - "# create input structure\n", - "n_atom = Atoms(\"N\", pbc=True)\n", - "n_atom.center(vacuum=5.0)\n", - "n2_molecule = molecule(\"N2\", pbc=True)\n", - "n2_molecule.center(vacuum=5.0)\n", - "\n", - "metadata = {\n", - " \"options\": {\n", - " 'prepend_text' : \"\"\"eval \"$(conda shell.posix hook)\"\n", - " conda activate aiida\n", - " export OMP_NUM_THREADS=1\n", - " \"\"\",\n", - " }\n", - "}\n", - "pseudopotentials = {\"N\": \"N.pbe-n-rrkjus_psl.1.0.0.UPF\"}\n", - "# pseudo_dir = \"/home/xing/data/ase/espresso_pseudo\"\n", - "pseudo_dir = \"/home/wang_x3/datas/pseudos/psl\"\n", - "input_data = {\n", - " \"system\": {\"ecutwfc\": 30, \"ecutrho\": 240,\n", - " \"occupations\": \"smearing\",\n", - " \"degauss\": 0.01,\n", - " \"smearing\": \"cold\",},\n", - "}\n", - "#------------------------- Set the inputs -------------------------\n", - "wg = atomization_energy()\n", - "wg.tasks[\"scf_atom\"].set({\"atoms\": n_atom,\n", - " \"pseudopotentials\": pseudopotentials,\n", - " \"pseudo_dir\": pseudo_dir,\n", - " \"input_data\": input_data,\n", - " \"computer\": \"localhost\",\n", - " \"metadata\": metadata})\n", - "wg.tasks[\"scf_mol\"].set({\"atoms\": n2_molecule,\n", - " \"pseudopotentials\": pseudopotentials,\n", - " \"pseudo_dir\": pseudo_dir,\n", - " \"input_data\": input_data,\n", - " \"computer\": \"localhost\",\n", - " \"metadata\": metadata})\n", - "wg.tasks[\"calc_atomization_energy\"].set({\"molecule\": n2_molecule, \"computer\": \"localhost\"})\n", - "#------------------------- Submit the calculation -------------------\n", - "# wg.run()\n", - "wg.submit(wait=True, timeout=200)\n", "#------------------------- Print the output -------------------------\n", - "print('Energy of a N atom: {:0.3f}'.format(wg.tasks['scf_atom'].outputs[\"results\"].value.value['energy']))\n", - "print('Energy of an un-relaxed N2 molecule: {:0.3f}'.format(wg.tasks['scf_mol'].outputs[\"results\"].value.value['energy']))\n", - "print('Atomization energy: {:0.3f} eV'.format(wg.tasks['calc_atomization_energy'].outputs[\"result\"].value.value))\n", - "\n" + "print('Atomization energy: {:0.3f} eV'.format(wg.outputs.atomization_energy.value.value))" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -208,11 +191,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } } }, "nbformat": 4, diff --git a/docs/source/ase/espresso/bader.ipynb b/docs/source/ase/espresso/bader.ipynb index e03cd98..27a0d16 100644 --- a/docs/source/ase/espresso/bader.ipynb +++ b/docs/source/ase/espresso/bader.ipynb @@ -9,61 +9,23 @@ "\n", "For the source code, see [bader](https://workgraph-collections.readthedocs.io/en/latest/ase/espresso/module.html#workgraph_collections.ase.espresso.bader.bader_workgraph).\n", "\n", - "\n", - "## Visualizing the WorkGraph Builder\n", "\n" ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "1a8ebc0d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.ase.espresso.bader import bader_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = bader_workgraph.TaskCls()\n", - "task.to_html()" - ] - }, { "cell_type": "markdown", - "id": "9e6360d8", + "id": "efa095d0", "metadata": {}, "source": [ - "## Visualizing the WorkGraph" + "## Example: H2O\n", + "\n", + "### Prepare the inputs and visualize the WorkGraph\n" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", + "execution_count": 1, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -73,7 +35,7 @@ " " + "" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "from workgraph_collections.ase.espresso.bader import bader_workgraph\n", - "\n", - "wg = bader_workgraph()\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: H2O\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 53900\n", - "Bader charges:\n", - "Index Symbol Charge\n", - " 0 O 7.148\n", - " 1 H 0.426\n", - " 2 H 0.426\n" - ] - } - ], "source": [ "from ase.build import molecule\n", "from aiida import load_profile\n", "\n", - "from workgraph_collections.ase.espresso.bader import bader_workgraph\n", + "from workgraph_collections.ase.espresso.bader import BaderWorkgraph\n", + "from aiida_pythonjob.config import config\n", + "# allow pickle\n", + "config[\"allow_pickle\"] = True\n", "\n", "load_profile()\n", "\n", @@ -162,7 +91,7 @@ "inputs = {\n", " \"scf\": {\n", " \"input_data\": scf_input_data,\n", - " \"kpts\": (1, 1, 1),\n", + " \"kpts\": [1, 1, 1],\n", " \"metadata\": metadata\n", " },\n", " \"pp_valence\": {\n", @@ -176,7 +105,7 @@ " }\n", "}\n", "#------------------------- Set the inputs -------------------------\n", - "wg = bader_workgraph(atoms=atoms,\n", + "wg = BaderWorkgraph.build_graph(atoms=atoms,\n", " pw_command=\"mpirun -np 1 pw.x\",\n", " pp_command=\"mpirun -np 1 pp.x\",\n", " bader_command=\"bader\",\n", @@ -184,11 +113,85 @@ " pseudopotentials=pseudopotentials,\n", " pseudo_dir=pseudo_dir,\n", " inputs=inputs)\n", + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "9deaa83d", + "metadata": {}, + "source": [ + "### Run the WorkGraph\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "26768641", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/04/2025 07:17:28 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 07:17:29 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180002\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180002\n", + "09/04/2025 07:17:46 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:17:49 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: pp_calculator,pp_calculator1\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: pp_calculator,pp_calculator1\n", + "09/04/2025 07:17:51 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180018, 180024\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180018, 180024\n", + "09/04/2025 07:18:04 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|update_task_state]: Task: pp_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|update_task_state]: Task: pp_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:18:07 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:18:07 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180024\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180024\n", + "09/04/2025 07:18:12 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|update_task_state]: Task: pp_calculator1, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|update_task_state]: Task: pp_calculator1, type: PYTHONJOB, finished.\n", + "09/04/2025 07:18:15 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: bader_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: bader_calculator\n", + "09/04/2025 07:18:16 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180036\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180036\n", + "09/04/2025 07:18:27 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|update_task_state]: Task: bader_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|update_task_state]: Task: bader_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:18:29 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:18:30 AM <564861> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179998|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179998|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ "#------------------------- Submit the calculation -------------------\n", - "# wg.run()\n", - "wg.submit(wait=True, timeout=200)\n", + "wg.run()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9d20300e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bader charges:\n", + "Index Symbol Charge\n", + " 0 O 7.148\n", + " 1 H 0.426\n", + " 2 H 0.426\n" + ] + } + ], + "source": [ "#------------------------- Print the output -------------------------\n", - "charges = wg.tasks['bader'].outputs[\"result\"].value.value\n", + "charges = wg.outputs.result.value.value\n", "print(\"Bader charges:\")\n", "print(\"Index Symbol Charge\")\n", "for i, charge in enumerate(charges):\n", @@ -198,7 +201,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -213,11 +216,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } } }, "nbformat": 4, diff --git a/docs/source/ase/espresso/bands.ipynb b/docs/source/ase/espresso/bands.ipynb index d662890..3cc3967 100644 --- a/docs/source/ase/espresso/bands.ipynb +++ b/docs/source/ase/espresso/bands.ipynb @@ -9,15 +9,15 @@ "\n", "For the source code, see [bands](https://workgraph-collections.readthedocs.io/en/latest/ase/espresso/module.html#workgraph_collections.ase.espresso.bands.bands_workgraph).\n", "\n", + "## Example: Silicon\n", "\n", - "## Visualizing the WorkGraph Builder\n", - "\n" + "### Prepare the inputs and submit the workflow\n" ] }, { "cell_type": "code", "execution_count": 1, - "id": "1a8ebc0d", + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -27,7 +27,7 @@ " " + "" ] }, "execution_count": 1, @@ -43,99 +43,15 @@ "output_type": "execute_result" } ], - "source": [ - "from workgraph_collections.ase.espresso.bands import bands_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = bands_workgraph.TaskCls()\n", - "task.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "9e6360d8", - "metadata": {}, - "source": [ - "## Visualizing the WorkGraph" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.ase.espresso.bands import bands_workgraph\n", - "\n", - "wg = bands_workgraph(run_relax=True, run_scf=True)\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: Silicon\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 98691\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ "from ase.build import bulk\n", "from aiida import load_profile\n", "from copy import deepcopy\n", "\n", - "from workgraph_collections.ase.espresso.bands import bands_workgraph\n", + "from workgraph_collections.ase.espresso.bands import BandsWorkgraph\n", + "from aiida_pythonjob.config import config\n", + "# allow pickle\n", + "config[\"allow_pickle\"] = True\n", "\n", "load_profile()\n", "\n", @@ -162,17 +78,21 @@ " \"smearing\": \"cold\"\n", " },\n", "}\n", + "relax_input_data = deepcopy(scf_input_data)\n", + "relax_input_data[\"control\"].update({\"calculation\": \"vc-relax\"})\n", "bands_input_data = deepcopy(scf_input_data)\n", "bands_input_data[\"control\"].update({\"calculation\": \"bands\"})\n", "\n", "inputs = {\n", - " \"scf\": {\n", - " \"input_data\": scf_input_data,\n", - " \"kpts\": (4, 4, 4),\n", + " \"relax\": {\n", + " \"input_data\": relax_input_data,\n", + " \"kpts\": [4, 4, 4],\n", " \"computer\": \"localhost\",\n", " \"metadata\": metadata\n", " },\n", - " \"find_kponits_path\": {\n", + " \"scf\": {\n", + " \"input_data\": scf_input_data,\n", + " \"kpts\": [4, 4, 4],\n", " \"computer\": \"localhost\",\n", " \"metadata\": metadata\n", " },\n", @@ -183,7 +103,7 @@ " },\n", "}\n", "#------------------------- Set the inputs -------------------------\n", - "wg = bands_workgraph(atoms=atoms,\n", + "wg = BandsWorkgraph.build_graph(atoms=atoms,\n", " pw_command=\"mpirun -np 1 pw.x\",\n", " pseudopotentials=pseudopotentials,\n", " pseudo_dir=pseudo_dir,\n", @@ -192,9 +112,59 @@ " run_relax=True,\n", " run_scf=True,\n", " )\n", - "#------------------------- Submit the calculation -------------------\n", - "wg.submit(wait=True, timeout=200)\n", - "\n" + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "c37aa1d6", + "metadata": {}, + "source": [ + "Run the workgraph:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c0668cfd", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/03/2025 09:32:44 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/03/2025 09:32:45 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178890\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178890\n", + "09/03/2025 09:33:04 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/03/2025 09:33:06 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1,find_kpoint_path\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1,find_kpoint_path\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/03/2025 09:33:08 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|update_task_state]: Task: find_kpoint_path, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|update_task_state]: Task: find_kpoint_path, type: PYFUNCTION, finished.\n", + "09/03/2025 09:33:08 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/03/2025 09:33:08 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178904\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178904\n", + "09/03/2025 09:33:17 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "09/03/2025 09:33:20 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator2\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator2\n", + "09/03/2025 09:33:21 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178924\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178924\n", + "09/03/2025 09:33:34 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PYTHONJOB, finished.\n", + "09/03/2025 09:33:36 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/03/2025 09:33:36 PM <374217> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178886|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178886|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ + "wg.run()" ] }, { @@ -207,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "07ec40d4", "metadata": {}, "outputs": [ @@ -217,13 +187,13 @@ "" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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IiIiSWMZIiIiIkljGSIiIiJJYxkiIiIiSWMZIiIiIknTqjJ0+fJleHl5oXXr1jAyMsKgQYMQFxcndiwiIiJSY1pVhkaOHInq6mocO3YMZ86cgaOjI0aOHIn8/HyxoxEREZGa0poydOfOHVy5cgVBQUHo2bMn7OzssGzZMty/fx8XLlwQOx4RERGpKa0pQ61atYK9vT127tyJsrIyVFdXY8uWLTA3N0fv3r2fer+KigoUFxfXmYiIiEg6mogdQFlkMhl+++03jBo1Ci1atICOjg7Mzc0RExMDU1PTp95v6dKl+OKLLxoxKREREakTtd8zFBQUBJlM9szp4sWLEAQBM2bMgLm5ORISEpCSkoJRo0bhrbfeQl5e3lMfPzg4GEVFRbXTjRs3GvHZERERkdjUfs9QYGAg/Pz8nnkbW1tbHDt2DFFRUSgoKICRkREAYOPGjYiNjcWOHTsQFBT0xPvK5XLI5XJlxyYiIiINofZlyMzMDGZmZs+93f379wEAOjp1d3bp6OhAoVCoJBsRERFpPrX/muxF9e/fH6ampvD19cXZs2dx+fJlzJ07F5mZmfD09BQ7HhEREakprSlDrVu3RkxMDEpLS+Hu7o4+ffogMTERhw4dgqOjo9jxiIiISE2p/ddk9dGnTx8cPnxY7BhERESkQbRmzxARERFRQ7AMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaSxDBEREZGksQwRERGRpLEMERERkaRpTBlavHgxBgwYAENDQ5iYmDzxNtnZ2fD09IShoSHMzc0xd+5cVFdXN25QIiIi0ihNxA7woiorKzF+/Hj0798fW7dufez3NTU18PT0hIWFBU6cOIG8vDz4+PhAT08PS5YsESExERERaQKN2TP0xRdf4OOPP0aPHj2e+PsjR47gzz//xA8/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", + "image/png": "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", "text/plain": [ "
" ] @@ -236,9 +206,9 @@ "from ase.spectrum.band_structure import BandStructure\n", "import numpy as np\n", "\n", - "data = wg.tasks[\"bands\"].outputs[\"results\"].value.value\n", - "eigenvalues = np.array([np.array(data['eigenvalues'][0])])\n", - "kpts = wg.tasks[\"find_kponits_path\"].outputs[\"result\"].value.value\n", + "data = wg.outputs.bands.band.value.value\n", + "eigenvalues = np.array([np.array(data['bands']['energies'])])\n", + "kpts = wg.outputs.kpoints_path.value.value\n", "bs = BandStructure(path=kpts, energies=eigenvalues)\n", "bs.plot()" ] @@ -246,7 +216,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -261,11 +231,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } } }, "nbformat": 4, diff --git a/docs/source/ase/espresso/base.ipynb b/docs/source/ase/espresso/base.ipynb index 6610e79..cf03d61 100644 --- a/docs/source/ase/espresso/base.ipynb +++ b/docs/source/ase/espresso/base.ipynb @@ -14,37 +14,30 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "01bedd69", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "\n", - " \n", - " " - ], + "application/vnd.jupyter.widget-view+json": { + "model_id": "18717669efc747d3875d2884211120de", + "version_major": 2, + "version_minor": 1 + }, "text/plain": [ - "" + "NodeGraphWidget(settings={'minmap': False}, style={'width': '80%', 'height': '600px'}, value={'name': 'pw_calc…" ] }, - "execution_count": 1, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from workgraph_collections.ase.espresso.base import pw_calculator\n", + "from workgraph_collections.ase.espresso.pw import pw_calculator\n", "\n", - "task = pw_calculator.TaskCls()\n", + "task = pw_calculator()._node\n", "task.to_html()" ] }, @@ -58,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "ade67b06", "metadata": {}, "outputs": [ @@ -69,7 +62,7 @@ " " + "" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -88,7 +81,7 @@ "source": [ "from workgraph_collections.ase.espresso.base import dos_calculator\n", "\n", - "task = dos_calculator.TaskCls()\n", + "task = dos_calculator()._node\n", "task.to_html()" ] }, @@ -102,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "3c1a4732", "metadata": {}, "outputs": [ @@ -113,7 +106,7 @@ " " + "" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -132,7 +125,7 @@ "source": [ "from workgraph_collections.ase.espresso.base import projwfc_calculator\n", "\n", - "task = projwfc_calculator.TaskCls()\n", + "task = projwfc_calculator()._node\n", "task.to_html()" ] }, @@ -146,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "ccd79543", "metadata": {}, "outputs": [ @@ -157,7 +150,7 @@ " " + "" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -176,14 +169,14 @@ "source": [ "from workgraph_collections.ase.espresso.base import pp_calculator\n", "\n", - "task = pp_calculator.TaskCls()\n", + "task = pp_calculator()._node\n", "task.to_html()" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -197,12 +190,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.1.-1" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } + "version": "3.11.0" } }, "nbformat": 4, diff --git a/docs/source/ase/espresso/elastic.ipynb b/docs/source/ase/espresso/elastic.ipynb index 950d68b..589c227 100644 --- a/docs/source/ase/espresso/elastic.ipynb +++ b/docs/source/ase/espresso/elastic.ipynb @@ -9,57 +9,17 @@ "\n", "For the source code, see [elastic](https://workgraph-collections.readthedocs.io/en/latest/ase/espresso/module.html#workgraph_collections.ase.espresso.elastic.elastic_workgraph).\n", "\n", - "## Visualizing the WorkGraph Builder\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "1a8ebc0d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.ase.espresso.elastic import elastic_workgraph\n", + "## Example: Aluminum\n", "\n", - "task = elastic_workgraph.TaskCls()\n", - "task.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "9e6360d8", - "metadata": {}, - "source": [ - "## Visualizing the WorkGraph" + "\n", + "### Prepare the inputs and submit the workflow\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", + "execution_count": 6, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -69,7 +29,7 @@ " " + "" ] }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.ase.espresso.elastic import elastic_workgraph\n", - "from aiida import load_profile\n", - "\n", - "load_profile()\n", - "\n", - "wg = elastic_workgraph()\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: Aluminum\n", - "\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 20671\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -133,7 +48,10 @@ "source": [ "from ase.build import bulk\n", "from aiida import load_profile\n", - "from workgraph_collections.ase.espresso.elastic import elastic_workgraph\n", + "from workgraph_collections.ase.espresso.elastic import ElasticWorkgraph\n", + "from aiida_pythonjob.config import config\n", + "# allow pickle\n", + "config[\"allow_pickle\"] = True\n", "\n", "load_profile()\n", "\n", @@ -152,8 +70,8 @@ "}\n", "\n", "pseudopotentials = {\"Al\": \"Al.pbe-nl-rrkjus_psl.1.0.0.UPF\"}\n", - "# pseudo_dir = \"/home/xing/data/ase/espresso_pseudo\"\n", - "pseudo_dir = \"/home/wang_x3/datas/pseudos/psl\"\n", + "pseudo_dir = \"/home/xing/data/ase/espresso_pseudo\"\n", + "# pseudo_dir = \"/home/wang_x3/datas/pseudos/psl\"\n", "\n", "# we need use high conv_thr to get accurate elastic constants\n", "input_data = {\n", @@ -172,21 +90,93 @@ " \"electrons\": {\"conv_thr\": 1e-11}\n", "}\n", "#------------------------- Set the inputs -------------------------\n", - "wg = elastic_workgraph(atoms=atoms,\n", + "wg = ElasticWorkgraph.build_graph(atoms=atoms,\n", " computer=\"localhost\",\n", " command=\"mpirun -np 4 pw.x\",\n", " pseudopotentials=pseudopotentials,\n", " pseudo_dir=pseudo_dir,\n", " input_data=input_data,\n", - " kpts=(30, 30, 30),\n", + " kpts=[25, 25, 25],\n", " metadata=metadata)\n", - "#------------------------- Submit the calculation -------------------\n", - "wg.submit(wait=True, timeout=500)\n" + "wg.to_html()\n" + ] + }, + { + "cell_type": "markdown", + "id": "b5e184eb", + "metadata": {}, + "source": [ + "Run the calculation" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, + "id": "3d227bea", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/04/2025 07:04:36 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 07:04:38 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 179698\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 179698\n", + "09/04/2025 07:04:41 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:04:42 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: get_deformed_structure_set\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: get_deformed_structure_set\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/04/2025 07:04:43 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|update_task_state]: Task: get_deformed_structure_set, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|update_task_state]: Task: get_deformed_structure_set, type: PYFUNCTION, finished.\n", + "09/04/2025 07:04:43 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: run_relaxation\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: run_relaxation\n", + "09/04/2025 07:04:51 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 179749\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 179749\n", + "09/04/2025 07:04:57 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator,pw_calculator1,pw_calculator2,pw_calculator3,pw_calculator4,pw_calculator5\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator,pw_calculator1,pw_calculator2,pw_calculator3,pw_calculator4,pw_calculator5\n", + "09/04/2025 07:05:17 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 179753, 179766, 179779, 179792, 179805, 179818\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 179753, 179766, 179779, 179792, 179805, 179818\n", + "09/04/2025 07:05:24 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:05:25 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "09/04/2025 07:05:25 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PYTHONJOB, finished.\n", + "09/04/2025 07:05:26 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|update_task_state]: Task: pw_calculator3, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|update_task_state]: Task: pw_calculator3, type: PYTHONJOB, finished.\n", + "09/04/2025 07:05:27 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|update_task_state]: Task: pw_calculator4, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|update_task_state]: Task: pw_calculator4, type: PYTHONJOB, finished.\n", + "09/04/2025 07:05:28 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|update_task_state]: Task: pw_calculator5, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|update_task_state]: Task: pw_calculator5, type: PYTHONJOB, finished.\n", + "09/04/2025 07:05:33 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:05:34 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179749|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179749|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/04/2025 07:05:36 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|update_task_state]: Task: run_relaxation, type: GRAPH, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|update_task_state]: Task: run_relaxation, type: GRAPH, finished.\n", + "09/04/2025 07:05:38 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: fit_elastic_constants\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: fit_elastic_constants\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/pymatgen/analysis/elasticity/elastic.py:473: UserWarning: Pseudo-inverse fitting of Strain/Stress lists may yield questionable results from vasp data, use with caution.\n", + " warnings.warn(\n", + "09/04/2025 07:05:39 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|update_task_state]: Task: fit_elastic_constants, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|update_task_state]: Task: fit_elastic_constants, type: PYFUNCTION, finished.\n", + "09/04/2025 07:05:40 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:05:40 AM <526049> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [179694|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[179694|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ + "wg.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "id": "e14c98b4", "metadata": {}, "outputs": [ @@ -195,21 +185,19 @@ "output_type": "stream", "text": [ "Elastic constants: \n", - "[[117.33 57.59 57.59 -0. -4.2 4.2 ]\n", - " [ 57.59 117.33 57.59 4.2 0. -4.2 ]\n", - " [ 57.59 57.59 117.33 -4.2 4.2 -0. ]\n", - " [ 0. 0. -0. 38.14 -0. -0. ]\n", - " [ 0. 0. -0. -0. 38.14 -0. ]\n", - " [ -0. -0. -0. -0. -0. 38.14]]\n" + "[[-109.87 -61.3 -61.3 -0. 4.25 -4.25]\n", + " [ -61.3 -109.87 -61.3 -4.25 0. 4.25]\n", + " [ -61.3 -61.3 -109.87 4.25 -4.25 0. ]\n", + " [ -0. -0. -0. -38.51 -0. -0. ]\n", + " [ -0. -0. -0. 0. -38.51 -0. ]\n", + " [ 0. 0. 0. -0. -0. -38.51]]\n" ] } ], "source": [ "#------------------------- Print the output -------------------------\n", "import numpy as np\n", - "elastic_constants = wg.tasks[\"fit_elastic\"].outputs[\"result\"].value.value\n", - "# 1 eV/Angstrom3 = 160.21766208 GPa\n", - "elastic_constants = elastic_constants * 160.21766208\n", + "elastic_constants = wg.outputs.result.value.value\n", "print(\"Elastic constants: \")\n", "print(np.round(elastic_constants, 2))\n" ] @@ -225,7 +213,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -239,12 +227,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.0" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } + "version": "3.11.0" } }, "nbformat": 4, diff --git a/docs/source/ase/espresso/eos.ipynb b/docs/source/ase/espresso/eos.ipynb index 4e11b24..d5f9747 100644 --- a/docs/source/ase/espresso/eos.ipynb +++ b/docs/source/ase/espresso/eos.ipynb @@ -9,13 +9,16 @@ "\n", "For the source code, see [eos](https://workgraph-collections.readthedocs.io/en/latest/ase/espresso/module.html#workgraph_collections.ase.espresso.eos.eos_workgraph).\n", "\n", - "## Visualizing the WorkGraph Builder\n" + "## Example: Silicon\n", + "\n", + "### Prepare the inputs and submit the workflow\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 1, - "id": "1a8ebc0d", + "execution_count": 5, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -25,7 +28,7 @@ " " + "" ] }, - "execution_count": 1, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "from workgraph_collections.ase.espresso.eos import eos_workgraph\n", - "\n", - "task = eos_workgraph._TaskCls()\n", - "task.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "9e6360d8", - "metadata": {}, - "source": [ - "## Visualizing the WorkGraph" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", - "metadata": {}, - "outputs": [], - "source": [ - "from workgraph_collections.ase.espresso.eos import eos_workgraph\n", - "from aiida import load_profile\n", - "\n", - "load_profile()\n", - "\n", - "wg = eos_workgraph()\n", - "# wg.to_html()\n", - "# wg" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: Silicon\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "03/27/2025 09:59:12 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1\n", - "03/27/2025 09:59:13 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63178\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63178\n", - "03/27/2025 09:59:26 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PythonJob, finished.\n", - "03/27/2025 09:59:27 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: generate_scaled_atoms2\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: generate_scaled_atoms2\n", - "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", - "03/27/2025 09:59:28 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: generate_scaled_atoms2, type: PyFunction, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: generate_scaled_atoms2, type: PyFunction, finished.\n", - "03/27/2025 09:59:28 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: map_zone3\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: map_zone3\n", - "03/27/2025 09:59:29 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: s_0_pw_calculator4,s_1_pw_calculator4,s_2_pw_calculator4,s_3_pw_calculator4,s_4_pw_calculator4\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: s_0_pw_calculator4,s_1_pw_calculator4,s_2_pw_calculator4,s_3_pw_calculator4,s_4_pw_calculator4\n", - "03/27/2025 09:59:33 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63203, 63209, 63215, 63221, 63227\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63203, 63209, 63215, 63221, 63227\n", - "03/27/2025 09:59:54 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: s_0_pw_calculator4, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: s_0_pw_calculator4, type: PythonJob, finished.\n", - "03/27/2025 09:59:54 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: s_1_pw_calculator4, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: s_1_pw_calculator4, type: PythonJob, finished.\n", - "03/27/2025 09:59:54 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: s_2_pw_calculator4, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: s_2_pw_calculator4, type: PythonJob, finished.\n", - "03/27/2025 09:59:54 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: s_3_pw_calculator4, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: s_3_pw_calculator4, type: PythonJob, finished.\n", - "03/27/2025 09:59:54 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: s_4_pw_calculator4, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: s_4_pw_calculator4, type: PythonJob, finished.\n", - "03/27/2025 09:59:56 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_template_task_state]: Task: pw_calculator4 finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_template_task_state]: Task: pw_calculator4 finished.\n", - "03/27/2025 09:59:56 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_zone_task_state]: Task: map_zone3 finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_zone_task_state]: Task: map_zone3 finished.\n", - "03/27/2025 09:59:57 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: fit_eos5\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: fit_eos5\n", - "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", - "03/27/2025 09:59:58 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|update_task_state]: Task: fit_eos5, type: PyFunction, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|update_task_state]: Task: fit_eos5, type: PyFunction, finished.\n", - "03/27/2025 09:59:58 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "03/27/2025 09:59:58 PM <1595705> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63172|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63172|WorkGraphEngine|finalize]: Finalize workgraph.\n" - ] - } - ], "source": [ "from ase.build import bulk\n", "from ase import Atoms\n", "from aiida import load_profile\n", - "from workgraph_collections.ase.espresso.eos import eos_workgraph\n", + "from workgraph_collections.ase.espresso.eos import EosWorkGraph\n", "from aiida_pythonjob.config import config\n", "\n", "load_profile()\n", @@ -169,7 +77,7 @@ " \"smearing\": \"cold\",},\n", "}\n", "#------------------------- Set the inputs -------------------------\n", - "wg = eos_workgraph(atoms=atoms,\n", + "wg = EosWorkGraph.build_graph(atoms=atoms,\n", " computer=\"localhost\",\n", " scales=[0.95, 0.98, 1.0, 1.02, 1.05],\n", " command=\"mpirun -np 2 pw.x\",\n", @@ -178,17 +86,95 @@ " input_data=input_data,\n", " kpts=[4, 4, 4],\n", " metadata=metadata)\n", - "#------------------------- Submit the calculation -------------------\n", - "wg.run()\n", - "# wg.submit(wait=True, timeout=200)\n", - "\n" + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "9c213904", + "metadata": {}, + "source": [ + "Run the calculation\n" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "d1e32cd5", "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/03/2025 06:13:07 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/03/2025 06:13:08 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178210\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178210\n", + "09/03/2025 06:13:30 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/03/2025 06:13:32 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: generate_scaled_atoms\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: generate_scaled_atoms\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/03/2025 06:13:33 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|update_task_state]: Task: generate_scaled_atoms, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|update_task_state]: Task: generate_scaled_atoms, type: PYFUNCTION, finished.\n", + "09/03/2025 06:13:34 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: calc_all_structures\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: calc_all_structures\n", + "09/03/2025 06:13:42 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178253\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178253\n", + "09/03/2025 06:13:49 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator,pw_calculator1,pw_calculator2,pw_calculator3,pw_calculator4\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator,pw_calculator1,pw_calculator2,pw_calculator3,pw_calculator4\n", + "09/03/2025 06:13:58 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178257, 178261, 178265, 178269, 178273\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178257, 178261, 178265, 178269, 178273\n", + "09/03/2025 06:14:25 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/03/2025 06:14:31 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/03/2025 06:14:31 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178261, 178265, 178269, 178273\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178261, 178265, 178269, 178273\n", + "09/03/2025 06:14:43 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "09/03/2025 06:14:44 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PYTHONJOB, finished.\n", + "09/03/2025 06:14:45 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|update_task_state]: Task: pw_calculator3, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|update_task_state]: Task: pw_calculator3, type: PYTHONJOB, finished.\n", + "09/03/2025 06:14:45 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|update_task_state]: Task: pw_calculator4, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|update_task_state]: Task: pw_calculator4, type: PYTHONJOB, finished.\n", + "09/03/2025 06:14:51 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/03/2025 06:14:52 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178253|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178253|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/03/2025 06:14:53 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|update_task_state]: Task: calc_all_structures, type: GRAPH, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|update_task_state]: Task: calc_all_structures, type: GRAPH, finished.\n", + "09/03/2025 06:14:56 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: fit_eos\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: fit_eos\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/03/2025 06:14:57 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|update_task_state]: Task: fit_eos, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|update_task_state]: Task: fit_eos, type: PYFUNCTION, finished.\n", + "09/03/2025 06:14:57 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/03/2025 06:14:57 PM <77904> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178206|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178206|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ + "wg.run()\n" + ] + }, + { + "cell_type": "markdown", + "id": "0f6d4e61", + "metadata": {}, + "source": [ + "Print the results" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4aae567b", + "metadata": {}, "outputs": [ { "name": "stdout", @@ -196,16 +182,16 @@ "text": [ "\n", "Result: \n", - "B: 88.541858293157\n", - "v0: 41.224378688729\n", + "B: 88.541858293246\n", + "v0: 41.224378688688\n", "e0: -277.89646661704\n", - "v0: 41.224378688729\n" + "v0: 41.224378688688\n" ] } ], "source": [ "#------------------------- Print the output -------------------------\n", - "print('\\nResult: \\nB: {B}\\nv0: {v0}\\ne0: {e0}\\nv0: {v0}'.format(**wg.tasks[-1].outputs.result.value))\n" + "print('\\nResult: \\nB: {B}\\nv0: {v0}\\ne0: {e0}\\nv0: {v0}'.format(**wg.outputs.result.value))\n" ] } ], diff --git a/docs/source/ase/espresso/html/AtomizationEnergy.html b/docs/source/ase/espresso/html/AtomizationEnergy.html new file mode 100644 index 0000000..81fcc0b --- /dev/null +++ b/docs/source/ase/espresso/html/AtomizationEnergy.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/BaderWorkgraph.html b/docs/source/ase/espresso/html/BaderWorkgraph.html new file mode 100644 index 0000000..286d71e --- /dev/null +++ b/docs/source/ase/espresso/html/BaderWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/BandsWorkgraph.html b/docs/source/ase/espresso/html/BandsWorkgraph.html new file mode 100644 index 0000000..2e86e2d --- /dev/null +++ b/docs/source/ase/espresso/html/BandsWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/ElasticWorkgraph.html b/docs/source/ase/espresso/html/ElasticWorkgraph.html new file mode 100644 index 0000000..8e36873 --- /dev/null +++ b/docs/source/ase/espresso/html/ElasticWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/EosWorkGraph.html b/docs/source/ase/espresso/html/EosWorkGraph.html new file mode 100644 index 0000000..b4501c5 --- /dev/null +++ b/docs/source/ase/espresso/html/EosWorkGraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/PdosWorkgraph.html b/docs/source/ase/espresso/html/PdosWorkgraph.html new file mode 100644 index 0000000..666b14a --- /dev/null +++ b/docs/source/ase/espresso/html/PdosWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/RelaxWorkgraph.html b/docs/source/ase/espresso/html/RelaxWorkgraph.html new file mode 100644 index 0000000..f7920b8 --- /dev/null +++ b/docs/source/ase/espresso/html/RelaxWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/dos_calculator.html b/docs/source/ase/espresso/html/dos_calculator.html new file mode 100644 index 0000000..b2484b3 --- /dev/null +++ b/docs/source/ase/espresso/html/dos_calculator.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/pp_calculator.html b/docs/source/ase/espresso/html/pp_calculator.html new file mode 100644 index 0000000..6f17b89 --- /dev/null +++ b/docs/source/ase/espresso/html/pp_calculator.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/html/projwfc_calculator.html b/docs/source/ase/espresso/html/projwfc_calculator.html new file mode 100644 index 0000000..a96e37d --- /dev/null +++ b/docs/source/ase/espresso/html/projwfc_calculator.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/ase/espresso/index.rst b/docs/source/ase/espresso/index.rst index e222dd1..0fd400a 100644 --- a/docs/source/ase/espresso/index.rst +++ b/docs/source/ase/espresso/index.rst @@ -10,6 +10,7 @@ Here are the collection of WorkGraphs for Quantum ESPRESSO base atomization_energy eos + relax elastic bands pdos diff --git a/docs/source/ase/espresso/pdos.ipynb b/docs/source/ase/espresso/pdos.ipynb index df365be..106c788 100644 --- a/docs/source/ase/espresso/pdos.ipynb +++ b/docs/source/ase/espresso/pdos.ipynb @@ -9,60 +9,16 @@ "For the source code, see [pdos](https://workgraph-collections.readthedocs.io/en/latest/ase/espresso/module.html#workgraph_collections.ase.espresso.pdos.pdos_workgraph).\n", "\n", "\n", - "## Visualizing the WorkGraph Builder\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "1a8ebc0d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.ase.espresso.pdos import pdos_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", + "## Example: Silicon\n", "\n", - "task = pdos_workgraph._TaskCls()\n", - "task.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "9e6360d8", - "metadata": {}, - "source": [ - "## Visualizing the WorkGraph" + "### Prepare the inputs and submit the workflow\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", + "execution_count": 7, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -72,7 +28,7 @@ " " + "" ] }, - "execution_count": 2, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "from workgraph_collections.ase.espresso.pdos import pdos_workgraph\n", - "\n", - "wg = pdos_workgraph(run_relax=True, run_scf=True)\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: Silicon\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "03/28/2025 08:45:07 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1\n", - "03/28/2025 08:45:07 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63649\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63649\n", - "03/28/2025 08:45:12 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PythonJob, finished.\n", - "03/28/2025 08:45:12 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator2\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator2\n", - "03/28/2025 08:45:13 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63666\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63666\n", - "03/28/2025 08:45:47 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|update_task_state]: Task: pw_calculator2, type: PythonJob, finished.\n", - "03/28/2025 08:45:48 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: dos_calculator3,projwfc_calculator4\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: dos_calculator3,projwfc_calculator4\n", - "03/28/2025 08:45:49 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63682, 63688\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63682, 63688\n", - "03/28/2025 08:47:05 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|update_task_state]: Task: projwfc_calculator4, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|update_task_state]: Task: projwfc_calculator4, type: PythonJob, finished.\n", - "03/28/2025 08:47:06 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "03/28/2025 08:47:06 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63682\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 63682\n", - "03/28/2025 08:50:12 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|update_task_state]: Task: dos_calculator3, type: PythonJob, finished.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|update_task_state]: Task: dos_calculator3, type: PythonJob, finished.\n", - "03/28/2025 08:50:13 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", - "03/28/2025 08:50:13 AM <1764244> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [63644|WorkGraphEngine|finalize]: Finalize workgraph.\n", - "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[63644|WorkGraphEngine|finalize]: Finalize workgraph.\n" - ] - } - ], "source": [ "from ase.build import bulk\n", "from aiida import load_profile\n", "from copy import deepcopy\n", "\n", - "from workgraph_collections.ase.espresso.pdos import pdos_workgraph\n", + "from workgraph_collections.ase.espresso.pdos import PdosWorkgraph\n", "from aiida_pythonjob.config import config\n", - "\n", + "# allow pickle\n", "config[\"allow_pickle\"] = True\n", "\n", "load_profile()\n", @@ -184,13 +82,13 @@ "inputs = {\n", " \"scf\": {\n", " \"input_data\": scf_input_data,\n", - " \"kpts\": [15, 15, 15],\n", + " \"kpts\": [10, 10, 10],\n", " \"computer\": \"localhost\",\n", " \"metadata\": metadata\n", " },\n", " \"nscf\": {\n", " \"input_data\": nscf_input_data,\n", - " \"kpts\": [30, 30, 30],\n", + " \"kpts\": [20, 20, 20],\n", " \"computer\": \"localhost\",\n", " \"metadata\": metadata\n", " },\n", @@ -201,54 +99,96 @@ " }\n", "}\n", "#------------------------- Set the inputs -------------------------\n", - "wg = pdos_workgraph(atoms=atoms,\n", + "wg = PdosWorkgraph.build_graph(atoms=atoms,\n", " pw_command=\"mpirun -np 4 pw.x\",\n", " dos_command=\"mpirun -np 4 dos.x\",\n", " projwfc_command=\"mpirun -np 4 projwfc.x\",\n", " pseudopotentials=pseudopotentials,\n", " pseudo_dir=pseudo_dir,\n", " inputs=inputs)\n", - "#------------------------- Submit the calculation -------------------\n", - "wg.run()\n", - "# wg.submit(wait=True, timeout=200)\n", - "\n" + "wg.to_html()" ] }, { "cell_type": "markdown", - "id": "ea09fce9", + "id": "6df097e2", "metadata": {}, "source": [ - "## Print the results" + "Run the calculation\n" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "afe2b91d", + "execution_count": 2, + "id": "d6112a2f", "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "{'arrays': [[0.0, 3.459e-06, 2.767e-05, 9.338e-05, 0.0003134, 0.0004912, 0.0006978, 0.0009352, 0.001205, 0.001516, 0.001867, 0.002238, 0.002599, 0.002962, 0.003344, 0.003744, 0.004166, 0.004611, 0.005078, 0.005568, 0.006075, 0.006588, 0.007111, 0.007644, 0.008184, 0.008731, 0.009283, 0.009845, 0.01042, 0.01102, 0.01163, 0.01225, 0.0129, 0.01356, 0.01423, 0.01491, 0.01559, 0.01627, 0.01696, 0.01767, 0.01838, 0.0191, 0.01982, 0.02056, 0.0213, 0.02205, 0.02281, 0.02359, 0.02437, 0.02517, 0.02599, 0.02681, 0.02765, 0.02849, 0.02934, 0.03019, 0.03104, 0.0319, 0.03276, 0.03364, 0.03451, 0.0354, 0.0363, 0.0372, 0.03811, 0.03903, 0.03995, 0.04089, 0.04183, 0.04278, 0.04374, 0.04471, 0.04569, 0.04668, 0.04768, 0.04869, 0.0497, 0.05071, 0.05173, 0.05276, 0.05378, 0.05482, 0.05586, 0.0569, 0.05794, 0.059, 0.06006, 0.06113, 0.0622, 0.06329, 0.06438, 0.06547, 0.06658, 0.06769, 0.06881, 0.06994, 0.07107, 0.07221, 0.07336, 0.07452, 0.07569, 0.07685, 0.07803, 0.07921, 0.08039, 0.08158, 0.08277, 0.08397, 0.08517, 0.08637, 0.08758, 0.0888, 0.09002, 0.09125, 0.09248, 0.09371, 0.09496, 0.0962, 0.09746, 0.09872, 0.09998, 0.1013, 0.1025, 0.1038, 0.1051, 0.1064, 0.1077, 0.109, 0.1104, 0.1117, 0.113, 0.1144, 0.1157, 0.117, 0.1184, 0.1197, 0.1211, 0.1225, 0.1238, 0.1252, 0.1266, 0.128, 0.1293, 0.1307, 0.1321, 0.1335, 0.1349, 0.1363, 0.1377, 0.1392, 0.1406, 0.142, 0.1434, 0.1449, 0.1463, 0.1478, 0.1492, 0.1507, 0.1522, 0.1536, 0.1551, 0.1566, 0.1581, 0.1596, 0.1611, 0.1626, 0.1641, 0.1656, 0.1671, 0.1687, 0.1702, 0.1717, 0.1732, 0.1748, 0.1763, 0.1779, 0.1794, 0.181, 0.1825, 0.1841, 0.1856, 0.1872, 0.1888, 0.1904, 0.1919, 0.1935, 0.1951, 0.1967, 0.1983, 0.1999, 0.2015, 0.2032, 0.2048, 0.2064, 0.208, 0.2097, 0.2113, 0.213, 0.2146, 0.2163, 0.2179, 0.2196, 0.2213, 0.223, 0.2246, 0.2263, 0.228, 0.2297, 0.2314, 0.2331, 0.2348, 0.2365, 0.2382, 0.2399, 0.2416, 0.2434, 0.2451, 0.2468, 0.2485, 0.2503, 0.252, 0.2538, 0.2555, 0.2573, 0.259, 0.2608, 0.2625, 0.2643, 0.2661, 0.2679, 0.2696, 0.2714, 0.2732, 0.275, 0.2768, 0.2786, 0.2804, 0.2822, 0.2841, 0.2859, 0.2877, 0.2895, 0.2914, 0.2932, 0.2951, 0.2969, 0.2988, 0.3006, 0.3025, 0.3043, 0.3062, 0.3081, 0.31, 0.3118, 0.3137, 0.3156, 0.3175, 0.3194, 0.3213, 0.3232, 0.3251, 0.327, 0.3289, 0.3308, 0.3327, 0.3346, 0.3365, 0.3385, 0.3404, 0.3423, 0.3443, 0.3462, 0.3481, 0.3501, 0.3521, 0.354, 0.356, 0.3579, 0.3599, 0.3619, 0.3639, 0.3659, 0.3678, 0.3698, 0.3718, 0.3738, 0.3758, 0.3779, 0.3799, 0.3819, 0.3839, 0.3859, 0.388, 0.39, 0.392, 0.3941, 0.3961, 0.3981, 0.4002, 0.4022, 0.4043, 0.4063, 0.4084, 0.4105, 0.4125, 0.4146, 0.4167, 0.4187, 0.4208, 0.4229, 0.425, 0.4271, 0.4292, 0.4313, 0.4334, 0.4355, 0.4376, 0.4397, 0.4418, 0.4439, 0.446, 0.4482, 0.4503, 0.4524, 0.4546, 0.4567, 0.4588, 0.461, 0.4631, 0.4653, 0.4675, 0.4696, 0.4718, 0.474, 0.4762, 0.4783, 0.4805, 0.4827, 0.4849, 0.4871, 0.4893, 0.4915, 0.4937, 0.4959, 0.4981, 0.5003, 0.5026, 0.5048, 0.507, 0.5092, 0.5114, 0.5137, 0.5159, 0.5181, 0.5204, 0.5226, 0.5249, 0.5271, 0.5294, 0.5316, 0.5339, 0.5361, 0.5384, 0.5407, 0.543, 0.5452, 0.5475, 0.5498, 0.5521, 0.5544, 0.5567, 0.559, 0.5613, 0.5636, 0.5659, 0.5682, 0.5705, 0.5728, 0.5752, 0.5775, 0.5798, 0.5821, 0.5845, 0.5868, 0.5892, 0.5915, 0.5939, 0.5962, 0.5986, 0.6009, 0.6033, 0.6057, 0.608, 0.6104, 0.6128, 0.6152, 0.6176, 0.62, 0.6223, 0.6247, 0.6271, 0.6295, 0.6319, 0.6343, 0.6367, 0.6392, 0.6416, 0.644, 0.6464, 0.6488, 0.6513, 0.6537, 0.6561, 0.6585, 0.661, 0.6634, 0.6659, 0.6683, 0.6708, 0.6732, 0.6757, 0.6781, 0.6806, 0.6831, 0.6855, 0.688, 0.6905, 0.6929, 0.6954, 0.6979, 0.7004, 0.7029, 0.7054, 0.7079, 0.7104, 0.7129, 0.7154, 0.7179, 0.7205, 0.723, 0.7255, 0.728, 0.7306, 0.7331, 0.7356, 0.7382, 0.7407, 0.7433, 0.7458, 0.7484, 0.7509, 0.7535, 0.756, 0.7586, 0.7612, 0.7637, 0.7663, 0.7689, 0.7715, 0.7741, 0.7766, 0.7792, 0.7818, 0.7844, 0.787, 0.7896, 0.7922, 0.7948, 0.7974, 0.8, 0.8026, 0.8053, 0.8079, 0.8105, 0.8131, 0.8158, 0.8184, 0.821, 0.8237, 0.8263, 0.8289, 0.8316, 0.8342, 0.8369, 0.8395, 0.8422, 0.8449, 0.8475, 0.8502, 0.8529, 0.8555, 0.8582, 0.8609, 0.8636, 0.8663, 0.869, 0.8717, 0.8744, 0.8771, 0.8798, 0.8825, 0.8852, 0.8879, 0.8906, 0.8934, 0.8961, 0.8988, 0.9015, 0.9043, 0.907, 0.9098, 0.9125, 0.9152, 0.918, 0.9207, 0.9235, 0.9262, 0.929, 0.9318, 0.9345, 0.9373, 0.9401, 0.9428, 0.9456, 0.9484, 0.9512, 0.954, 0.9567, 0.9595, 0.9623, 0.9651, 0.9679, 0.9707, 0.9735, 0.9763, 0.9791, 0.982, 0.9848, 0.9876, 0.9904, 0.9932, 0.9961, 0.9989, 1.002, 1.005, 1.007, 1.01, 1.013, 1.016, 1.019, 1.022, 1.025, 1.027, 1.03, 1.033, 1.036, 1.039, 1.042, 1.045, 1.047, 1.05, 1.053, 1.056, 1.059, 1.062, 1.065, 1.068, 1.071, 1.074, 1.077, 1.079, 1.082, 1.085, 1.088, 1.091, 1.094, 1.097, 1.1, 1.103, 1.106, 1.109, 1.112, 1.115, 1.118, 1.121, 1.124, 1.127, 1.13, 1.133, 1.136, 1.139, 1.142, 1.145, 1.148, 1.151, 1.154, 1.157, 1.16, 1.163, 1.166, 1.169, 1.172, 1.175, 1.178, 1.181, 1.184, 1.187, 1.19, 1.193, 1.196, 1.2, 1.203, 1.206, 1.209, 1.212, 1.215, 1.218, 1.222, 1.225, 1.228, 1.231, 1.234, 1.238, 1.241, 1.244, 1.247, 1.25, 1.254, 1.257, 1.26, 1.264, 1.267, 1.27, 1.273, 1.277, 1.28, 1.283, 1.286, 1.29, 1.293, 1.296, 1.3, 1.303, 1.306, 1.31, 1.313, 1.316, 1.319, 1.323, 1.326, 1.329, 1.333, 1.336, 1.339, 1.342, 1.346, 1.349, 1.352, 1.355, 1.359, 1.362, 1.365, 1.368, 1.371, 1.375, 1.378, 1.381, 1.384, 1.387, 1.39, 1.394, 1.397, 1.4, 1.403, 1.406, 1.409, 1.412, 1.415, 1.418, 1.422, 1.425, 1.428, 1.431, 1.434, 1.437, 1.44, 1.443, 1.446, 1.449, 1.453, 1.456, 1.459, 1.462, 1.465, 1.468, 1.471, 1.474, 1.478, 1.481, 1.484, 1.487, 1.49, 1.493, 1.496, 1.5, 1.503, 1.506, 1.509, 1.512, 1.515, 1.519, 1.522, 1.525, 1.528, 1.531, 1.534, 1.538, 1.541, 1.544, 1.547, 1.551, 1.554, 1.557, 1.56, 1.564, 1.567, 1.57, 1.574, 1.577, 1.58, 1.584, 1.587, 1.59, 1.594, 1.597, 1.601, 1.604, 1.607, 1.611, 1.614, 1.618, 1.621, 1.625, 1.628, 1.632, 1.635, 1.638, 1.642, 1.645, 1.649, 1.652, 1.656, 1.659, 1.663, 1.666, 1.669, 1.673, 1.676, 1.68, 1.683, 1.687, 1.69, 1.694, 1.697, 1.701, 1.704, 1.708, 1.711, 1.715, 1.718, 1.722, 1.725, 1.729, 1.732, 1.736, 1.739, 1.743, 1.746, 1.75, 1.753, 1.757, 1.761, 1.764, 1.768, 1.772, 1.775, 1.779, 1.783, 1.786, 1.79, 1.794, 1.798, 1.801, 1.805, 1.809, 1.813, 1.816, 1.82, 1.824, 1.828, 1.831, 1.835, 1.839, 1.843, 1.847, 1.85, 1.854, 1.858, 1.862, 1.866, 1.87, 1.874, 1.877, 1.881, 1.885, 1.889, 1.893, 1.897, 1.901, 1.905, 1.908, 1.912, 1.916, 1.92, 1.924, 1.928, 1.932, 1.936, 1.94, 1.944, 1.948, 1.951, 1.955, 1.959, 1.963, 1.967, 1.971, 1.975, 1.979, 1.982, 1.986, 1.99, 1.994, 1.998, 2.002, 2.006, 2.009, 2.013, 2.017, 2.021, 2.025, 2.029, 2.032, 2.036, 2.04, 2.044, 2.047, 2.051, 2.055, 2.059, 2.063, 2.066, 2.07, 2.074, 2.078, 2.081, 2.085, 2.089, 2.093, 2.096, 2.1, 2.104, 2.107, 2.111, 2.115, 2.118, 2.122, 2.126, 2.13, 2.133, 2.137, 2.141, 2.144, 2.148, 2.152, 2.155, 2.159, 2.162, 2.166, 2.17, 2.173, 2.177, 2.181, 2.184, 2.188, 2.192, 2.195, 2.199, 2.202, 2.206, 2.209, 2.213, 2.216, 2.22, 2.223, 2.227, 2.23, 2.234, 2.237, 2.241, 2.244, 2.248, 2.251, 2.255, 2.258, 2.262, 2.265, 2.268, 2.272, 2.275, 2.278, 2.282, 2.285, 2.288, 2.291, 2.295, 2.298, 2.301, 2.305, 2.308, 2.311, 2.314, 2.318, 2.321, 2.324, 2.327, 2.331, 2.334, 2.337, 2.34, 2.344, 2.347, 2.35, 2.354, 2.357, 2.361, 2.364, 2.368, 2.371, 2.375, 2.378, 2.382, 2.385, 2.389, 2.393, 2.396, 2.4, 2.403, 2.407, 2.41, 2.414, 2.417, 2.421, 2.424, 2.428, 2.431, 2.435, 2.439, 2.442, 2.446, 2.45, 2.453, 2.457, 2.461, 2.464, 2.468, 2.472, 2.476, 2.479, 2.483, 2.487, 2.491, 2.494, 2.498, 2.502, 2.506, 2.509, 2.513, 2.517, 2.521, 2.525, 2.528, 2.532, 2.536, 2.54, 2.544, 2.548, 2.551, 2.555, 2.559, 2.563, 2.567, 2.571, 2.575, 2.579, 2.583, 2.587, 2.591, 2.595, 2.599, 2.603, 2.607, 2.611, 2.615, 2.619, 2.623, 2.627, 2.631, 2.635, 2.64, 2.644, 2.648, 2.652, 2.656, 2.661, 2.665, 2.669, 2.673, 2.678, 2.682, 2.686, 2.69, 2.694, 2.698, 2.703, 2.707, 2.711, 2.715, 2.719, 2.723, 2.727, 2.731, 2.735, 2.739, 2.743, 2.747, 2.751, 2.756, 2.76, 2.764, 2.768, 2.772, 2.776, 2.78, 2.783, 2.787, 2.791, 2.795, 2.799, 2.803, 2.807, 2.81, 2.814, 2.818, 2.822, 2.826, 2.829, 2.833, 2.837, 2.841, 2.844, 2.848, 2.852, 2.855, 2.859, 2.863, 2.866, 2.87, 2.874, 2.877, 2.881, 2.885, 2.888, 2.892, 2.896, 2.899, 2.903, 2.907, 2.91, 2.914, 2.918, 2.921, 2.925, 2.929, 2.932, 2.936, 2.94, 2.943, 2.947, 2.951, 2.955, 2.958, 2.962, 2.966, 2.97, 2.973, 2.977, 2.981, 2.985, 2.989, 2.992, 2.996, 3.0, 3.004, 3.008, 3.012, 3.016, 3.02, 3.024, 3.028, 3.032, 3.036, 3.04, 3.044, 3.049, 3.053, 3.057, 3.061, 3.065, 3.07, 3.074, 3.078, 3.082, 3.087, 3.091, 3.095, 3.1, 3.104, 3.108, 3.113, 3.117, 3.121, 3.126, 3.13, 3.134, 3.138, 3.143, 3.147, 3.151, 3.156, 3.16, 3.164, 3.168, 3.173, 3.177, 3.181, 3.185, 3.19, 3.194, 3.198, 3.202, 3.207, 3.211, 3.215, 3.219, 3.223, 3.228, 3.232, 3.236, 3.24, 3.245, 3.249, 3.253, 3.257, 3.261, 3.266, 3.27, 3.274, 3.278, 3.283, 3.287, 3.291, 3.295, 3.299, 3.304, 3.308, 3.312, 3.316, 3.321, 3.325, 3.329, 3.333, 3.338, 3.342, 3.346, 3.35, 3.355, 3.359, 3.363, 3.367, 3.372, 3.376, 3.38, 3.384, 3.389, 3.393, 3.397, 3.401, 3.406, 3.41, 3.414, 3.419, 3.423, 3.427, 3.432, 3.436, 3.44, 3.444, 3.449, 3.453, 3.457, 3.461, 3.466, 3.47, 3.474, 3.478, 3.483, 3.487, 3.491, 3.495, 3.5, 3.504, 3.508, 3.512, 3.517, 3.521, 3.525, 3.529, 3.534, 3.538, 3.542, 3.547, 3.551, 3.555, 3.559, 3.564, 3.568, 3.572, 3.577, 3.581, 3.585, 3.589, 3.594, 3.598, 3.602, 3.607, 3.611, 3.615, 3.62, 3.624, 3.628, 3.633, 3.637, 3.641, 3.646, 3.65, 3.654, 3.659, 3.663, 3.667, 3.672, 3.676, 3.68, 3.685, 3.689, 3.693, 3.698, 3.702, 3.706, 3.711, 3.715, 3.72, 3.724, 3.728, 3.733, 3.737, 3.742, 3.746, 3.751, 3.755, 3.759, 3.764, 3.768, 3.773, 3.777, 3.782, 3.786, 3.791, 3.795, 3.8, 3.804, 3.808, 3.813, 3.817, 3.822, 3.826, 3.831, 3.835, 3.84, 3.844, 3.848, 3.853, 3.857, 3.862, 3.866, 3.871, 3.875, 3.88, 3.884, 3.889, 3.893, 3.898, 3.902, 3.907, 3.911, 3.916, 3.92, 3.925, 3.929, 3.934, 3.938, 3.943, 3.948, 3.952, 3.957, 3.961, 3.966, 3.97, 3.975, 3.979, 3.984, 3.989, 3.993, 3.998, 4.002, 4.007, 4.011, 4.016, 4.021, 4.025, 4.03, 4.034, 4.039, 4.043, 4.048, 4.053, 4.057, 4.062, 4.066, 4.071, 4.075, 4.08, 4.085, 4.089, 4.094, 4.098, 4.103, 4.107, 4.112, 4.117, 4.121, 4.126, 4.13, 4.135, 4.14, 4.144, 4.149, 4.153, 4.158, 4.163, 4.167, 4.172, 4.177, 4.181, 4.186, 4.19, 4.195, 4.2, 4.204, 4.209, 4.214, 4.218, 4.223, 4.228, 4.232, 4.237, 4.242, 4.246, 4.251, 4.256, 4.26, 4.265, 4.27, 4.274, 4.279, 4.284, 4.288, 4.293, 4.298, 4.303, 4.307, 4.312, 4.317, 4.321, 4.326, 4.331, 4.336, 4.34, 4.345, 4.35, 4.355, 4.359, 4.364, 4.369, 4.374, 4.378, 4.383, 4.388, 4.393, 4.397, 4.402, 4.407, 4.412, 4.416, 4.421, 4.426, 4.431, 4.435, 4.44, 4.445, 4.45, 4.454, 4.459, 4.464, 4.469, 4.474, 4.478, 4.483, 4.488, 4.493, 4.498, 4.502, 4.507, 4.512, 4.517, 4.522, 4.527, 4.531, 4.536, 4.541, 4.546, 4.551, 4.555, 4.56, 4.565, 4.57, 4.575, 4.58, 4.584, 4.589, 4.594, 4.599, 4.604, 4.609, 4.614, 4.618, 4.623, 4.628, 4.633, 4.638, 4.643, 4.648, 4.653, 4.658, 4.663, 4.667, 4.672, 4.677, 4.682, 4.687, 4.692, 4.697, 4.702, 4.707, 4.712, 4.717, 4.721, 4.726, 4.731, 4.736, 4.741, 4.746, 4.751, 4.756, 4.761, 4.766, 4.771, 4.776, 4.781, 4.786, 4.791, 4.795, 4.8, 4.805, 4.81, 4.815, 4.82, 4.825, 4.83, 4.835, 4.84, 4.845, 4.85, 4.855, 4.86, 4.865, 4.87, 4.875, 4.88, 4.885, 4.89, 4.895, 4.9, 4.905, 4.91, 4.915, 4.92, 4.925, 4.93, 4.935, 4.94, 4.945, 4.95, 4.955, 4.96, 4.965, 4.97, 4.976, 4.981, 4.986, 4.991, 4.996, 5.001, 5.006, 5.011, 5.016, 5.022, 5.027, 5.032, 5.037, 5.042, 5.047, 5.053, 5.058, 5.063, 5.068, 5.073, 5.079, 5.084, 5.089, 5.094, 5.099, 5.104, 5.11, 5.115, 5.12, 5.125, 5.13, 5.136, 5.141, 5.146, 5.151, 5.156, 5.162, 5.167, 5.172, 5.177, 5.182, 5.188, 5.193, 5.198, 5.203, 5.209, 5.214, 5.219, 5.224, 5.23, 5.235, 5.24, 5.245, 5.25, 5.256, 5.261, 5.266, 5.271, 5.277, 5.282, 5.287, 5.293, 5.298, 5.303, 5.308, 5.314, 5.319, 5.324, 5.33, 5.335, 5.34, 5.346, 5.351, 5.356, 5.362, 5.367, 5.372, 5.378, 5.383, 5.389, 5.394, 5.399, 5.405, 5.41, 5.416, 5.421, 5.427, 5.432, 5.438, 5.444, 5.449, 5.455, 5.461, 5.466, 5.472, 5.478, 5.483, 5.489, 5.495, 5.501, 5.507, 5.512, 5.518, 5.524, 5.53, 5.536, 5.542, 5.548, 5.554, 5.56, 5.566, 5.572, 5.578, 5.584, 5.59, 5.596, 5.602, 5.608, 5.614, 5.62, 5.626, 5.632, 5.638, 5.645, 5.651, 5.657, 5.663, 5.669, 5.675, 5.681, 5.687, 5.693, 5.699, 5.705, 5.711, 5.717, 5.723, 5.729, 5.735, 5.741, 5.747, 5.753, 5.759, 5.765, 5.77, 5.776, 5.782, 5.788, 5.794, 5.8, 5.806, 5.812, 5.817, 5.823, 5.829, 5.835, 5.841, 5.847, 5.852, 5.858, 5.864, 5.87, 5.875, 5.881, 5.887, 5.893, 5.898, 5.904, 5.91, 5.916, 5.921, 5.927, 5.933, 5.938, 5.944, 5.95, 5.956, 5.961, 5.967, 5.973, 5.978, 5.984, 5.99, 5.995, 6.001, 6.007, 6.012, 6.018, 6.024, 6.029, 6.035, 6.04, 6.046, 6.052, 6.057, 6.063, 6.068, 6.074, 6.079, 6.085, 6.09, 6.096, 6.102, 6.107, 6.113, 6.118, 6.124, 6.129, 6.135, 6.14, 6.146, 6.151, 6.157, 6.162, 6.168, 6.173, 6.179, 6.184, 6.19, 6.195, 6.201, 6.206, 6.212, 6.217, 6.222, 6.228, 6.233, 6.239, 6.244, 6.25, 6.255, 6.26, 6.266, 6.271, 6.277, 6.282, 6.287, 6.293, 6.298, 6.304, 6.309, 6.314, 6.32, 6.325, 6.331, 6.336, 6.341, 6.347, 6.352, 6.358, 6.363, 6.368, 6.374, 6.379, 6.384, 6.39, 6.395, 6.4, 6.406, 6.411, 6.416, 6.422, 6.427, 6.432, 6.438, 6.443, 6.448, 6.453, 6.459, 6.464, 6.469, 6.474, 6.48, 6.485, 6.49, 6.496, 6.501, 6.506, 6.511, 6.517, 6.522, 6.527, 6.532, 6.538, 6.543, 6.548, 6.554, 6.559, 6.564, 6.569, 6.575, 6.58, 6.585, 6.591, 6.596, 6.601, 6.607, 6.612, 6.617, 6.622, 6.628, 6.633, 6.638, 6.644, 6.649, 6.654, 6.66, 6.665, 6.67, 6.675, 6.681, 6.686, 6.691, 6.697, 6.702, 6.707, 6.712, 6.718, 6.723, 6.728, 6.734, 6.739, 6.744, 6.749, 6.755, 6.76, 6.765, 6.771, 6.776, 6.781, 6.786, 6.792, 6.797, 6.802, 6.808, 6.813, 6.818, 6.823, 6.829, 6.834, 6.839, 6.845, 6.85, 6.855, 6.861, 6.866, 6.871, 6.877, 6.882, 6.887, 6.893, 6.898, 6.903, 6.909, 6.914, 6.919, 6.925, 6.93, 6.935, 6.941, 6.946, 6.951, 6.956, 6.962, 6.967, 6.972, 6.978, 6.983, 6.988, 6.994, 6.999, 7.004, 7.01, 7.015, 7.02, 7.026, 7.031, 7.036, 7.042, 7.047, 7.052, 7.058, 7.063, 7.068, 7.074, 7.079, 7.084, 7.089, 7.095, 7.1, 7.105, 7.111, 7.116, 7.121, 7.126, 7.132, 7.137, 7.142, 7.148, 7.153, 7.158, 7.163, 7.169, 7.174, 7.179, 7.185, 7.19, 7.195, 7.2, 7.206, 7.211, 7.216, 7.222, 7.227, 7.232, 7.238, 7.243, 7.248, 7.253, 7.259, 7.264, 7.269, 7.275, 7.28, 7.285, 7.291, 7.296, 7.301, 7.306, 7.312, 7.317, 7.323, 7.328, 7.333, 7.339, 7.344, 7.349, 7.355, 7.36, 7.365, 7.371, 7.376, 7.381, 7.387, 7.392, 7.397, 7.403, 7.408, 7.413, 7.419, 7.424, 7.429, 7.435, 7.44, 7.445, 7.451, 7.456, 7.461, 7.466, 7.472, 7.477, 7.482, 7.487, 7.492, 7.498, 7.503, 7.508, 7.513, 7.519, 7.524, 7.529, 7.534, 7.54, 7.545, 7.55, 7.555, 7.561, 7.566, 7.571, 7.577, 7.582, 7.587, 7.593, 7.598, 7.604, 7.609, 7.614, 7.62, 7.625, 7.631, 7.636, 7.642, 7.647, 7.653, 7.658, 7.664, 7.669, 7.675, 7.68, 7.686, 7.691, 7.697, 7.702, 7.708, 7.713, 7.719, 7.724, 7.73, 7.736, 7.741, 7.747, 7.752, 7.758, 7.763, 7.769, 7.774, 7.78, 7.785, 7.791, 7.796, 7.802, 7.807, 7.813, 7.818, 7.824, 7.829, 7.835, 7.841, 7.846, 7.852, 7.857, 7.863, 7.868, 7.874, 7.88, 7.885, 7.891, 7.896, 7.902, 7.907, 7.913, 7.919, 7.924, 7.93, 7.935, 7.941, 7.947, 7.952, 7.958, 7.963, 7.969, 7.975, 7.98, 7.986, 7.992, 7.997, 8.003, 8.009, 8.014, 8.02, 8.026, 8.031, 8.037, 8.043, 8.048, 8.054, 8.06, 8.065, 8.071, 8.076, 8.082, 8.088, 8.093, 8.099, 8.105, 8.11, 8.116, 8.122, 8.127, 8.133, 8.139, 8.144, 8.15, 8.156, 8.161, 8.167, 8.173, 8.178, 8.184, 8.19, 8.196, 8.201, 8.207, 8.213, 8.219, 8.224, 8.23, 8.236, 8.241, 8.247, 8.253, 8.258, 8.264, 8.27, 8.276, 8.281, 8.287, 8.293, 8.298, 8.304, 8.31, 8.315, 8.321, 8.327, 8.332, 8.338, 8.344, 8.349, 8.355, 8.361, 8.366, 8.372, 8.378, 8.383, 8.389, 8.395, 8.401, 8.406, 8.412, 8.418, 8.424, 8.429, 8.435, 8.441, 8.447, 8.452, 8.458, 8.464, 8.47, 8.476, 8.482, 8.487, 8.493, 8.499, 8.505, 8.511, 8.517, 8.523, 8.529, 8.535, 8.541, 8.547, 8.553, 8.559, 8.565, 8.571, 8.577, 8.583, 8.589, 8.596, 8.602, 8.608, 8.614, 8.62, 8.627, 8.633, 8.639, 8.646, 8.652, 8.658, 8.665, 8.671, 8.677, 8.684, 8.69, 8.697, 8.703, 8.71, 8.716, 8.723, 8.729, 8.736, 8.742, 8.749, 8.756, 8.762, 8.769, 8.775, 8.782, 8.789, 8.795, 8.802, 8.809, 8.815, 8.822, 8.829, 8.835, 8.842, 8.849, 8.856, 8.862, 8.869, 8.876, 8.883, 8.889, 8.896, 8.903, 8.91, 8.917, 8.923, 8.93, 8.937, 8.944, 8.951, 8.957, 8.964, 8.971, 8.978, 8.984, 8.991, 8.998, 9.005, 9.012, 9.019, 9.025, 9.032, 9.039, 9.046, 9.053, 9.06, 9.067, 9.074, 9.082, 9.089, 9.096, 9.103, 9.11, 9.117, 9.124, 9.131, 9.138, 9.145, 9.153, 9.16, 9.167, 9.174, 9.181, 9.188, 9.195, 9.203, 9.21, 9.217, 9.224, 9.231, 9.238, 9.246, 9.253, 9.26, 9.267, 9.274, 9.281, 9.288, 9.296, 9.303, 9.31, 9.317, 9.324, 9.331, 9.338, 9.345, 9.352, 9.359, 9.366, 9.373, 9.38, 9.387, 9.394, 9.401, 9.408, 9.415, 9.422, 9.429, 9.436, 9.443, 9.45, 9.457, 9.464, 9.471, 9.478, 9.485, 9.492, 9.5, 9.507, 9.514, 9.521, 9.528, 9.536, 9.543, 9.55, 9.557, 9.564, 9.571, 9.578, 9.584, 9.591, 9.598, 9.605, 9.611, 9.618, 9.625, 9.631, 9.638, 9.644, 9.651, 9.658, 9.664, 9.671, 9.677, 9.684, 9.69, 9.697, 9.703, 9.71, 9.716, 9.723, 9.729, 9.735, 9.742, 9.748, 9.755, 9.761, 9.767, 9.774, 9.78, 9.786, 9.793, 9.799, 9.805, 9.812, 9.818, 9.824, 9.83, 9.837, 9.843, 9.849, 9.855, 9.861, 9.868, 9.874, 9.88, 9.886, 9.892, 9.898, 9.904, 9.91, 9.917, 9.923, 9.929, 9.935, 9.941, 9.947, 9.953, 9.959, 9.966, 9.972, 9.978, 9.984, 9.99, 9.996, 10.0, 10.01, 10.01, 10.02, 10.03, 10.03, 10.04, 10.05, 10.05, 10.06, 10.06, 10.07, 10.08, 10.08, 10.09, 10.09, 10.1, 10.11, 10.11, 10.12, 10.12, 10.13, 10.14, 10.14, 10.15, 10.15, 10.16, 10.17, 10.17, 10.18, 10.18, 10.19, 10.2, 10.2, 10.21, 10.21, 10.22, 10.23, 10.23, 10.24, 10.24, 10.25, 10.26, 10.26, 10.27, 10.27, 10.28, 10.28, 10.29, 10.3, 10.3, 10.31, 10.31, 10.32, 10.33, 10.33, 10.34, 10.34, 10.35, 10.36, 10.36, 10.37, 10.37, 10.38, 10.38, 10.39, 10.4, 10.4, 10.41, 10.41, 10.42, 10.42, 10.43, 10.44, 10.44, 10.45, 10.45, 10.46, 10.46, 10.47, 10.48, 10.48, 10.49, 10.49, 10.5, 10.5, 10.51, 10.52, 10.52, 10.53, 10.53, 10.54, 10.55, 10.55, 10.56, 10.56, 10.57, 10.57, 10.58, 10.59, 10.59, 10.6, 10.6, 10.61, 10.62, 10.62, 10.63, 10.63, 10.64, 10.64, 10.65, 10.66, 10.66, 10.67, 10.67, 10.68, 10.68, 10.69, 10.7, 10.7, 10.71, 10.71, 10.72, 10.73, 10.73, 10.74, 10.74, 10.75, 10.75, 10.76, 10.77, 10.77, 10.78, 10.79, 10.79, 10.8, 10.8, 10.81, 10.82, 10.82, 10.83, 10.84, 10.84, 10.85, 10.86, 10.86, 10.87, 10.88, 10.88, 10.89, 10.9, 10.91, 10.91, 10.92, 10.93, 10.93, 10.94, 10.95, 10.96, 10.96, 10.97, 10.98, 10.99, 10.99, 11.0, 11.01, 11.02, 11.02, 11.03, 11.04, 11.05, 11.05, 11.06, 11.07, 11.07, 11.08, 11.09, 11.09, 11.1, 11.11, 11.11, 11.12, 11.13, 11.13, 11.14, 11.15, 11.15, 11.16, 11.17, 11.17, 11.18, 11.19, 11.19, 11.2, 11.2, 11.21, 11.22, 11.22, 11.23, 11.24, 11.24, 11.25, 11.26, 11.26, 11.27, 11.28, 11.28, 11.29, 11.29, 11.3, 11.31, 11.31, 11.32, 11.33, 11.33, 11.34, 11.35, 11.35, 11.36, 11.37, 11.38, 11.38, 11.39, 11.4, 11.4, 11.41, 11.42, 11.42, 11.43, 11.44, 11.44, 11.45, 11.45, 11.46, 11.47, 11.47, 11.48, 11.48, 11.49, 11.49, 11.5, 11.5, 11.51, 11.52, 11.52, 11.53, 11.53, 11.54, 11.54, 11.54, 11.55, 11.55, 11.56, 11.56, 11.57, 11.57, 11.58, 11.58, 11.59, 11.59, 11.59, 11.6, 11.6, 11.61, 11.61, 11.61, 11.62, 11.62, 11.63, 11.63, 11.63, 11.64, 11.64, 11.65, 11.65, 11.65, 11.66, 11.66, 11.66, 11.67, 11.67, 11.67, 11.68, 11.68, 11.68, 11.69, 11.69, 11.69, 11.7, 11.7, 11.7, 11.71, 11.71, 11.71, 11.72, 11.72, 11.72, 11.72, 11.73, 11.73, 11.73, 11.74, 11.74, 11.74, 11.74, 11.75, 11.75, 11.75, 11.75, 11.76, 11.76, 11.76, 11.76, 11.77, 11.77, 11.77, 11.77, 11.78, 11.78, 11.78, 11.78, 11.78, 11.79, 11.79, 11.79, 11.79, 11.8, 11.8, 11.8, 11.8, 11.8, 11.81, 11.81, 11.81, 11.81, 11.82, 11.82, 11.82, 11.82, 11.82, 11.83, 11.83, 11.83, 11.83, 11.83, 11.83, 11.84, 11.84, 11.84, 11.84, 11.84, 11.85, 11.85, 11.85, 11.85, 11.85, 11.85, 11.86, 11.86, 11.86, 11.86, 11.86, 11.86, 11.87, 11.87, 11.87, 11.87, 11.87, 11.87, 11.87, 11.88, 11.88, 11.88, 11.88, 11.88, 11.88, 11.88, 11.89, 11.89, 11.89, 11.89, 11.89, 11.89, 11.89, 11.89, 11.9, 11.9, 11.9, 11.9, 11.9, 11.9, 11.9, 11.9, 11.91, 11.91, 11.91, 11.91, 11.91, 11.91, 11.91, 11.91, 11.91, 11.92, 11.92, 11.92, 11.92, 11.92, 11.92, 11.92, 11.92, 11.92, 11.92, 11.93, 11.93, 11.93, 11.93, 11.93, 11.93, 11.93, 11.93, 11.93, 11.93, 11.94, 11.94, 11.94, 11.94, 11.94, 11.94, 11.94, 11.94, 11.94, 11.94, 11.94, 11.95, 11.95, 11.95, 11.95, 11.95, 11.95, 11.95, 11.95, 11.95, 11.95, 11.95, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.96, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.97, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.98, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 11.99, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0], [0.0, 0.001038, 0.00415, 0.009338, 0.01702, 0.01919, 0.02217, 0.02533, 0.02866, 0.03338, 0.03638, 0.03762, 0.03551, 0.03722, 0.03909, 0.04111, 0.04329, 0.04556, 0.04785, 0.05015, 0.05084, 0.05183, 0.05281, 0.05368, 0.05445, 0.05485, 0.05565, 0.05689, 0.05851, 0.06017, 0.06186, 0.06358, 0.06532, 0.06679, 0.06759, 0.06773, 0.06809, 0.06896, 0.06978, 0.07063, 0.07149, 0.0723, 0.07307, 0.0738, 0.0746, 0.07567, 0.07682, 0.07803, 0.07933, 0.08067, 0.08206, 0.08347, 0.08379, 0.08434, 0.08485, 0.08526, 0.08556, 0.08601, 0.08667, 0.08751, 0.08832, 0.08911, 0.0899, 0.09068, 0.09144, 0.09221, 0.09297, 0.09372, 0.09458, 0.09552, 0.09651, 0.09755, 0.09865, 0.09966, 0.1004, 0.1009, 0.1011, 0.1016, 0.1022, 0.1027, 0.1031, 0.1036, 0.104, 0.1044, 0.1051, 0.1058, 0.1064, 0.1072, 0.1079, 0.1087, 0.1094, 0.1101, 0.1109, 0.1116, 0.1123, 0.1131, 0.1138, 0.1145, 0.1154, 0.1163, 0.1166, 0.1171, 0.1176, 0.1181, 0.1185, 0.1189, 0.1194, 0.1198, 0.1204, 0.1209, 0.1214, 0.1219, 0.1224, 0.1228, 0.1233, 0.1238, 0.1245, 0.1251, 0.1257, 0.1264, 0.127, 0.1277, 0.1284, 0.1291, 0.1298, 0.1305, 0.1312, 0.1319, 0.1325, 0.1331, 0.1336, 0.1338, 0.1341, 0.1345, 0.1349, 0.1354, 0.1359, 0.1363, 0.1367, 0.1372, 0.1376, 0.1381, 0.1386, 0.1391, 0.1396, 0.1401, 0.1405, 0.141, 0.1415, 0.142, 0.1425, 0.1429, 0.1434, 0.144, 0.1446, 0.1453, 0.1459, 0.1465, 0.1471, 0.1477, 0.1484, 0.149, 0.1496, 0.1502, 0.1505, 0.1509, 0.1512, 0.1516, 0.1519, 0.1522, 0.1525, 0.1528, 0.1532, 0.1537, 0.1541, 0.1545, 0.155, 0.1554, 0.1558, 0.1563, 0.1567, 0.1572, 0.1577, 0.1581, 0.1586, 0.1591, 0.1596, 0.16, 0.1605, 0.161, 0.1615, 0.1619, 0.1624, 0.1629, 0.1633, 0.1639, 0.1645, 0.165, 0.1656, 0.1662, 0.1668, 0.1672, 0.1676, 0.1678, 0.1682, 0.1686, 0.1689, 0.1693, 0.1696, 0.17, 0.1703, 0.1706, 0.171, 0.1713, 0.1717, 0.172, 0.1724, 0.1728, 0.1732, 0.1736, 0.174, 0.1745, 0.1749, 0.1753, 0.1758, 0.1762, 0.1767, 0.1771, 0.1776, 0.178, 0.1785, 0.179, 0.1794, 0.1799, 0.1803, 0.1808, 0.1813, 0.1817, 0.1822, 0.1826, 0.1831, 0.1836, 0.184, 0.1843, 0.1847, 0.185, 0.1854, 0.1857, 0.186, 0.1863, 0.1867, 0.1871, 0.1874, 0.1878, 0.1881, 0.1885, 0.1888, 0.1891, 0.1895, 0.1898, 0.1902, 0.1905, 0.1909, 0.1913, 0.1916, 0.192, 0.1924, 0.1927, 0.1931, 0.1935, 0.1939, 0.1944, 0.1948, 0.1952, 0.1956, 0.1961, 0.1965, 0.1969, 0.1974, 0.1978, 0.1983, 0.1987, 0.1992, 0.1996, 0.2001, 0.2005, 0.2009, 0.2014, 0.2017, 0.202, 0.2022, 0.2025, 0.2028, 0.203, 0.2033, 0.2037, 0.204, 0.2043, 0.2046, 0.205, 0.2053, 0.2057, 0.206, 0.2064, 0.2067, 0.2071, 0.2074, 0.2078, 0.2081, 0.2084, 0.2088, 0.2091, 0.2095, 0.2098, 0.2102, 0.2105, 0.2109, 0.2113, 0.2116, 0.212, 0.2123, 0.2127, 0.2131, 0.2135, 0.2139, 0.2143, 0.2147, 0.2151, 0.2155, 0.2159, 0.2163, 0.2167, 0.2172, 0.2176, 0.218, 0.2184, 0.2189, 0.2191, 0.2194, 0.2197, 0.22, 0.2203, 0.2206, 0.2208, 0.2211, 0.2214, 0.2217, 0.222, 0.2223, 0.2226, 0.2229, 0.2231, 0.2234, 0.2238, 0.2241, 0.2244, 0.2248, 0.2251, 0.2254, 0.2258, 0.2261, 0.2265, 0.2268, 0.2272, 0.2275, 0.2278, 0.2282, 0.2285, 0.2289, 0.2292, 0.2296, 0.2299, 0.2303, 0.2306, 0.231, 0.2313, 0.2317, 0.232, 0.2324, 0.2327, 0.2331, 0.2335, 0.2338, 0.2342, 0.2346, 0.235, 0.2354, 0.2358, 0.2362, 0.2366, 0.2369, 0.2372, 0.2374, 0.2377, 0.238, 0.2383, 0.2386, 0.2389, 0.2391, 0.2394, 0.2397, 0.24, 0.2403, 0.2406, 0.2409, 0.2412, 0.2415, 0.2417, 0.242, 0.2423, 0.2426, 0.2429, 0.2432, 0.2434, 0.2437, 0.2441, 0.2444, 0.2448, 0.2451, 0.2454, 0.2458, 0.2461, 0.2464, 0.2468, 0.2471, 0.2474, 0.2478, 0.2481, 0.2485, 0.2488, 0.2492, 0.2495, 0.2498, 0.2502, 0.2505, 0.2509, 0.2512, 0.2516, 0.2519, 0.2523, 0.2526, 0.253, 0.2533, 0.2537, 0.254, 0.2544, 0.2547, 0.2549, 0.2552, 0.2555, 0.2558, 0.256, 0.2563, 0.2566, 0.2569, 0.2572, 0.2574, 0.2577, 0.258, 0.2583, 0.2586, 0.2589, 0.2591, 0.2594, 0.2597, 0.26, 0.2603, 0.2606, 0.2609, 0.2612, 0.2615, 0.2618, 0.2621, 0.2624, 0.2627, 0.2629, 0.2632, 0.2635, 0.2638, 0.2641, 0.2644, 0.2647, 0.265, 0.2654, 0.2657, 0.266, 0.2664, 0.2667, 0.267, 0.2674, 0.2677, 0.268, 0.2684, 0.2687, 0.2691, 0.2694, 0.2697, 0.2701, 0.2704, 0.2708, 0.2711, 0.2715, 0.2718, 0.2721, 0.2725, 0.2728, 0.2732, 0.2734, 0.2736, 0.2739, 0.2742, 0.2744, 0.2747, 0.2749, 0.2752, 0.2754, 0.2756, 0.2759, 0.2762, 0.2765, 0.2768, 0.277, 0.2773, 0.2776, 0.2779, 0.2782, 0.2785, 0.2788, 0.2791, 0.2794, 0.2797, 0.28, 0.2803, 0.2806, 0.2809, 0.2812, 0.2815, 0.2818, 0.2821, 0.2824, 0.2827, 0.283, 0.2833, 0.2836, 0.2839, 0.2842, 0.2845, 0.2848, 0.2851, 0.2854, 0.2857, 0.286, 0.2863, 0.2866, 0.2869, 0.2873, 0.2876, 0.288, 0.2883, 0.2887, 0.289, 0.2894, 0.2897, 0.2901, 0.2904, 0.2908, 0.2911, 0.2915, 0.2919, 0.2922, 0.2925, 0.2928, 0.2931, 0.2934, 0.2937, 0.294, 0.2943, 0.2946, 0.2949, 0.2953, 0.2956, 0.2959, 0.2962, 0.2966, 0.2969, 0.2972, 0.2976, 0.298, 0.2983, 0.2987, 0.2991, 0.2996, 0.3, 0.3005, 0.301, 0.3015, 0.302, 0.3026, 0.3031, 0.3037, 0.3043, 0.3049, 0.3055, 0.3062, 0.3069, 0.3076, 0.3084, 0.3092, 0.31, 0.3108, 0.3116, 0.3125, 0.3133, 0.3142, 0.3151, 0.316, 0.3169, 0.3178, 0.3187, 0.3196, 0.3205, 0.3213, 0.3222, 0.323, 0.3237, 0.3244, 0.3249, 0.3254, 0.3259, 0.3262, 0.3265, 0.3268, 0.327, 0.3271, 0.3273, 0.3276, 0.3281, 0.3285, 0.329, 0.3294, 0.3297, 0.3299, 0.3299, 0.3299, 0.3298, 0.3297, 0.3295, 0.3292, 0.3289, 0.3286, 0.3283, 0.3282, 0.3279, 0.3276, 0.3271, 0.3264, 0.3257, 0.3249, 0.324, 0.323, 0.3221, 0.3214, 0.3207, 0.3198, 0.3188, 0.3177, 0.3164, 0.3152, 0.314, 0.3128, 0.312, 0.3114, 0.311, 0.3107, 0.3103, 0.3098, 0.3092, 0.3089, 0.3088, 0.3086, 0.3082, 0.3091, 0.3099, 0.3105, 0.311, 0.3113, 0.3116, 0.3119, 0.3121, 0.3123, 0.3124, 0.3124, 0.3125, 0.3124, 0.3123, 0.3122, 0.312, 0.3119, 0.3119, 0.3127, 0.314, 0.3147, 0.3153, 0.3158, 0.3162, 0.3163, 0.3163, 0.3164, 0.3165, 0.3167, 0.3169, 0.3173, 0.3181, 0.319, 0.3199, 0.3208, 0.3217, 0.3226, 0.3236, 0.3245, 0.3254, 0.3264, 0.3275, 0.3285, 0.3296, 0.3307, 0.3311, 0.3339, 0.3344, 0.3351, 0.3359, 0.3367, 0.3377, 0.3388, 0.3401, 0.3414, 0.3427, 0.3439, 0.3446, 0.3449, 0.3451, 0.3444, 0.3439, 0.3441, 0.3443, 0.3445, 0.3445, 0.3446, 0.3445, 0.3443, 0.3442, 0.3442, 0.3443, 0.3445, 0.3448, 0.3451, 0.3454, 0.3455, 0.3457, 0.3459, 0.3459, 0.346, 0.3463, 0.3466, 0.3469, 0.3473, 0.3481, 0.3488, 0.3495, 0.3501, 0.3506, 0.3512, 0.3517, 0.3523, 0.3533, 0.3544, 0.3555, 0.3567, 0.358, 0.3593, 0.3607, 0.3621, 0.3635, 0.3649, 0.3664, 0.3679, 0.3692, 0.3706, 0.3721, 0.3736, 0.3749, 0.3759, 0.3765, 0.3765, 0.3763, 0.3762, 0.3761, 0.3762, 0.3765, 0.3768, 0.3773, 0.3781, 0.3791, 0.3802, 0.3812, 0.3822, 0.3833, 0.3844, 0.3854, 0.3863, 0.387, 0.3877, 0.3883, 0.3889, 0.3895, 0.3898, 0.3888, 0.3884, 0.3884, 0.3886, 0.3891, 0.3896, 0.39, 0.3901, 0.3902, 0.3902, 0.3903, 0.3903, 0.3902, 0.3901, 0.3897, 0.3892, 0.3885, 0.3878, 0.3872, 0.3868, 0.3865, 0.3865, 0.3868, 0.3869, 0.3869, 0.3867, 0.3864, 0.386, 0.3857, 0.3851, 0.3847, 0.3848, 0.384, 0.3829, 0.3818, 0.3808, 0.379, 0.3773, 0.3763, 0.376, 0.3761, 0.3762, 0.3769, 0.3771, 0.377, 0.3769, 0.3769, 0.3768, 0.3765, 0.376, 0.3754, 0.3731, 0.3725, 0.3719, 0.3713, 0.3708, 0.3703, 0.3697, 0.3689, 0.3685, 0.3683, 0.3682, 0.3683, 0.3678, 0.3669, 0.3652, 0.3651, 0.3651, 0.3652, 0.3655, 0.3656, 0.3655, 0.3653, 0.365, 0.3647, 0.3644, 0.3635, 0.3621, 0.3606, 0.3591, 0.3577, 0.3565, 0.3554, 0.3545, 0.3538, 0.3531, 0.3526, 0.352, 0.3513, 0.3506, 0.3499, 0.3491, 0.3483, 0.3475, 0.3466, 0.3469, 0.3435, 0.3407, 0.3387, 0.3372, 0.3359, 0.3347, 0.3338, 0.333, 0.3322, 0.3312, 0.3304, 0.3295, 0.3288, 0.3281, 0.3274, 0.3268, 0.3263, 0.3259, 0.3255, 0.3253, 0.3253, 0.3255, 0.3258, 0.3262, 0.3267, 0.3275, 0.3288, 0.3304, 0.3324, 0.3348, 0.3378, 0.3417, 0.3445, 0.3464, 0.3483, 0.3503, 0.3522, 0.354, 0.3532, 0.3551, 0.3559, 0.3569, 0.3585, 0.3553, 0.355, 0.3542, 0.3533, 0.3526, 0.3519, 0.3516, 0.3517, 0.3527, 0.3542, 0.3561, 0.3583, 0.3605, 0.3626, 0.3648, 0.3669, 0.3687, 0.3702, 0.3715, 0.3725, 0.3736, 0.3748, 0.3761, 0.3775, 0.3776, 0.3771, 0.3764, 0.3755, 0.3748, 0.3746, 0.3751, 0.3773, 0.3781, 0.3793, 0.3803, 0.381, 0.3818, 0.3826, 0.3834, 0.3842, 0.3852, 0.3863, 0.3875, 0.3886, 0.3895, 0.3904, 0.3912, 0.3902, 0.3917, 0.3939, 0.3958, 0.3974, 0.3989, 0.4003, 0.4015, 0.4027, 0.404, 0.4055, 0.4075, 0.4094, 0.4098, 0.4109, 0.4127, 0.4144, 0.416, 0.4174, 0.4186, 0.4234, 0.4283, 0.4268, 0.4242, 0.4224, 0.4211, 0.4196, 0.4181, 0.4223, 0.4178, 0.4159, 0.4147, 0.4133, 0.4119, 0.4105, 0.4089, 0.4065, 0.4056, 0.4054, 0.4059, 0.4059, 0.4058, 0.4061, 0.4068, 0.4079, 0.4079, 0.4061, 0.4026, 0.3993, 0.3966, 0.3942, 0.3934, 0.3921, 0.3902, 0.3877, 0.3855, 0.3838, 0.3826, 0.3818, 0.3812, 0.3803, 0.3791, 0.3775, 0.3758, 0.3745, 0.3733, 0.3726, 0.3717, 0.3711, 0.3708, 0.3708, 0.3711, 0.3683, 0.3673, 0.3663, 0.3655, 0.3647, 0.364, 0.3637, 0.3634, 0.3633, 0.3637, 0.3634, 0.3642, 0.3651, 0.3661, 0.3673, 0.3698, 0.369, 0.3688, 0.369, 0.3694, 0.37, 0.3705, 0.371, 0.3715, 0.372, 0.3725, 0.373, 0.3735, 0.3742, 0.3751, 0.376, 0.3773, 0.3789, 0.3806, 0.3823, 0.384, 0.3856, 0.3872, 0.3901, 0.3924, 0.3939, 0.3954, 0.3969, 0.3986, 0.4007, 0.4038, 0.4082, 0.4134, 0.4132, 0.4129, 0.4152, 0.4175, 0.42, 0.4227, 0.4251, 0.4275, 0.4296, 0.4309, 0.4321, 0.4326, 0.4327, 0.4324, 0.4313, 0.4305, 0.4308, 0.4308, 0.43, 0.4292, 0.4291, 0.4291, 0.4291, 0.4289, 0.4283, 0.4278, 0.4273, 0.4269, 0.4265, 0.4261, 0.4258, 0.4256, 0.4254, 0.425, 0.4244, 0.4238, 0.4234, 0.4231, 0.4231, 0.4232, 0.423, 0.4227, 0.4227, 0.4227, 0.4228, 0.4228, 0.4229, 0.423, 0.4231, 0.4227, 0.4224, 0.4221, 0.4218, 0.4215, 0.4212, 0.4213, 0.4219, 0.422, 0.4223, 0.4226, 0.4229, 0.4232, 0.4235, 0.4236, 0.4235, 0.4234, 0.4235, 0.4237, 0.4239, 0.4239, 0.4239, 0.4241, 0.4243, 0.4245, 0.4248, 0.4251, 0.4255, 0.4259, 0.4262, 0.4264, 0.4267, 0.4269, 0.427, 0.427, 0.4272, 0.4274, 0.4281, 0.429, 0.4288, 0.4292, 0.4297, 0.4294, 0.429, 0.4287, 0.4284, 0.4287, 0.4247, 0.4241, 0.4237, 0.4236, 0.4235, 0.4234, 0.4235, 0.4237, 0.4239, 0.4244, 0.4248, 0.4252, 0.4258, 0.4264, 0.427, 0.4277, 0.4288, 0.4293, 0.4296, 0.4293, 0.4286, 0.4281, 0.4278, 0.4277, 0.4277, 0.4279, 0.428, 0.4282, 0.4287, 0.4291, 0.4296, 0.4301, 0.4306, 0.4312, 0.4317, 0.4321, 0.4307, 0.4307, 0.4309, 0.4311, 0.4313, 0.4315, 0.4317, 0.432, 0.4323, 0.4327, 0.4331, 0.4336, 0.4333, 0.4343, 0.4336, 0.4335, 0.434, 0.4345, 0.435, 0.4354, 0.4357, 0.436, 0.4362, 0.4365, 0.4369, 0.4375, 0.4382, 0.4391, 0.44, 0.4407, 0.4414, 0.4422, 0.4432, 0.4444, 0.4457, 0.4443, 0.4446, 0.445, 0.4458, 0.447, 0.4487, 0.4452, 0.4444, 0.4444, 0.4439, 0.444, 0.4443, 0.4445, 0.4448, 0.4451, 0.4451, 0.4443, 0.4441, 0.4445, 0.4449, 0.4453, 0.4458, 0.4463, 0.4468, 0.4475, 0.4483, 0.449, 0.4494, 0.4497, 0.4498, 0.4494, 0.4499, 0.45, 0.4504, 0.4511, 0.4523, 0.4526, 0.4514, 0.4512, 0.4518, 0.4527, 0.4535, 0.4542, 0.4547, 0.4551, 0.4554, 0.4556, 0.4557, 0.4558, 0.4561, 0.4567, 0.4569, 0.4568, 0.4566, 0.4565, 0.4566, 0.4568, 0.4569, 0.4571, 0.4571, 0.457, 0.4566, 0.4565, 0.4565, 0.4564, 0.4563, 0.4562, 0.4565, 0.4567, 0.457, 0.4576, 0.4581, 0.4587, 0.4593, 0.4595, 0.4593, 0.4592, 0.4591, 0.4589, 0.459, 0.4592, 0.4594, 0.4596, 0.4599, 0.4602, 0.4605, 0.4608, 0.4611, 0.4615, 0.4618, 0.4619, 0.462, 0.4622, 0.4625, 0.4628, 0.4631, 0.4635, 0.4642, 0.4651, 0.4656, 0.4656, 0.4649, 0.464, 0.4642, 0.4646, 0.465, 0.4654, 0.4657, 0.466, 0.4663, 0.4671, 0.4681, 0.4688, 0.4694, 0.4699, 0.4703, 0.4706, 0.4709, 0.4718, 0.4718, 0.4716, 0.4716, 0.4717, 0.4718, 0.472, 0.4721, 0.4723, 0.4725, 0.4728, 0.4731, 0.4735, 0.4738, 0.4742, 0.4748, 0.4755, 0.476, 0.4762, 0.4762, 0.4761, 0.4759, 0.4755, 0.4753, 0.4754, 0.4755, 0.4757, 0.4758, 0.476, 0.4762, 0.4765, 0.4767, 0.4769, 0.4772, 0.4774, 0.4776, 0.4779, 0.4781, 0.4786, 0.479, 0.4794, 0.4799, 0.4804, 0.4809, 0.4812, 0.4816, 0.4819, 0.4822, 0.4823, 0.4823, 0.4821, 0.4818, 0.4818, 0.4818, 0.4819, 0.4823, 0.4827, 0.4831, 0.4835, 0.484, 0.4845, 0.485, 0.4855, 0.4859, 0.4862, 0.4865, 0.4866, 0.4866, 0.4874, 0.4882, 0.4888, 0.4892, 0.4896, 0.4898, 0.49, 0.4908, 0.4908, 0.4908, 0.4908, 0.4908, 0.4909, 0.491, 0.4911, 0.4912, 0.4913, 0.4915, 0.4917, 0.4919, 0.4923, 0.4927, 0.493, 0.4929, 0.4926, 0.4922, 0.4923, 0.4924, 0.4926, 0.4928, 0.4932, 0.4935, 0.4939, 0.4943, 0.4948, 0.4952, 0.4956, 0.496, 0.4964, 0.4968, 0.4973, 0.4977, 0.4979, 0.4981, 0.4982, 0.4984, 0.4985, 0.4984, 0.4983, 0.4982, 0.4981, 0.4982, 0.4985, 0.4988, 0.499, 0.4993, 0.4995, 0.4999, 0.5004, 0.5008, 0.5012, 0.5016, 0.502, 0.5025, 0.5029, 0.5033, 0.5038, 0.5042, 0.5047, 0.5051, 0.5055, 0.5063, 0.5072, 0.5081, 0.5089, 0.5097, 0.5104, 0.5112, 0.5124, 0.5137, 0.5145, 0.5152, 0.5159, 0.5166, 0.5173, 0.5181, 0.5181, 0.5181, 0.5182, 0.5183, 0.5184, 0.5185, 0.5185, 0.5186, 0.5187, 0.5187, 0.5188, 0.5189, 0.5191, 0.5195, 0.5197, 0.5197, 0.5199, 0.5201, 0.5203, 0.5204, 0.5206, 0.5207, 0.5207, 0.5208, 0.5212, 0.5215, 0.5217, 0.5218, 0.522, 0.5221, 0.5223, 0.5225, 0.5226, 0.5227, 0.5229, 0.523, 0.5231, 0.5232, 0.5233, 0.5236, 0.5238, 0.5244, 0.5251, 0.5258, 0.5265, 0.5271, 0.5278, 0.5284, 0.5289, 0.5295, 0.53, 0.5305, 0.5311, 0.5318, 0.5326, 0.5332, 0.5338, 0.5343, 0.5348, 0.5352, 0.5359, 0.5366, 0.5373, 0.538, 0.5387, 0.5395, 0.5418, 0.5441, 0.5465, 0.5486, 0.5505, 0.5526, 0.5548, 0.5597, 0.5615, 0.5631, 0.5646, 0.5661, 0.5677, 0.5693, 0.5707, 0.572, 0.5735, 0.5752, 0.5774, 0.5798, 0.5823, 0.5838, 0.5849, 0.5865, 0.5883, 0.5897, 0.5912, 0.5927, 0.5942, 0.5958, 0.5973, 0.5988, 0.6002, 0.6017, 0.6031, 0.605, 0.6072, 0.6089, 0.6106, 0.6122, 0.6147, 0.6192, 0.6188, 0.615, 0.6128, 0.611, 0.6096, 0.6081, 0.6064, 0.6023, 0.6012, 0.6005, 0.6, 0.5991, 0.5982, 0.5972, 0.5961, 0.595, 0.5945, 0.5939, 0.5928, 0.591, 0.5886, 0.5879, 0.5875, 0.5872, 0.5874, 0.5874, 0.5871, 0.5865, 0.5859, 0.5854, 0.5847, 0.584, 0.5832, 0.5823, 0.5813, 0.5804, 0.5794, 0.5784, 0.5772, 0.576, 0.5746, 0.5737, 0.5732, 0.5727, 0.5737, 0.5735, 0.5732, 0.573, 0.5727, 0.5726, 0.5722, 0.5718, 0.5715, 0.573, 0.5732, 0.5695, 0.5695, 0.5694, 0.5692, 0.5688, 0.5683, 0.5675, 0.5664, 0.5651, 0.5638, 0.5624, 0.5611, 0.5597, 0.5585, 0.558, 0.5574, 0.5568, 0.5561, 0.5554, 0.5547, 0.554, 0.5537, 0.5538, 0.5537, 0.5534, 0.5531, 0.5527, 0.5523, 0.552, 0.5517, 0.5514, 0.551, 0.5507, 0.5504, 0.5502, 0.5499, 0.5496, 0.5492, 0.5488, 0.5485, 0.5487, 0.5487, 0.5484, 0.548, 0.5472, 0.5463, 0.545, 0.5438, 0.5433, 0.5428, 0.543, 0.5433, 0.5435, 0.5431, 0.5419, 0.5408, 0.5403, 0.5398, 0.5393, 0.5394, 0.5398, 0.5401, 0.5405, 0.5402, 0.5399, 0.5396, 0.5393, 0.539, 0.5387, 0.5382, 0.5376, 0.5372, 0.5368, 0.5364, 0.536, 0.5355, 0.5351, 0.5346, 0.534, 0.5335, 0.533, 0.5325, 0.5321, 0.5317, 0.5312, 0.5308, 0.5303, 0.5299, 0.5294, 0.5286, 0.5278, 0.5272, 0.5268, 0.5267, 0.5267, 0.5268, 0.5269, 0.527, 0.527, 0.5269, 0.5268, 0.5266, 0.5265, 0.5264, 0.5266, 0.527, 0.5274, 0.5278, 0.5282, 0.5288, 0.5293, 0.5297, 0.5301, 0.5303, 0.5304, 0.5304, 0.5302, 0.5302, 0.5303, 0.5304, 0.5304, 0.5305, 0.5305, 0.5305, 0.5302, 0.5299, 0.5295, 0.5291, 0.5287, 0.5285, 0.5285, 0.5284, 0.5288, 0.5305, 0.5306, 0.529, 0.5275, 0.5274, 0.5275, 0.5279, 0.5286, 0.5295, 0.5304, 0.5285, 0.528, 0.5279, 0.5281, 0.5283, 0.5285, 0.5286, 0.5288, 0.5289, 0.5292, 0.5294, 0.5295, 0.5296, 0.5297, 0.5298, 0.5298, 0.53, 0.5303, 0.5306, 0.5309, 0.5312, 0.5315, 0.5317, 0.532, 0.5323, 0.5325, 0.5327, 0.5328, 0.5329, 0.5325, 0.5322, 0.5321, 0.5321, 0.532, 0.5319, 0.5319, 0.5318, 0.5316, 0.5315, 0.5314, 0.5312, 0.5311, 0.5309, 0.5308, 0.5308, 0.5308, 0.5308, 0.5311, 0.5305, 0.5305, 0.5304, 0.5307, 0.5319, 0.5341, 0.5346, 0.5346, 0.534, 0.5336, 0.5332, 0.5328, 0.5324, 0.532, 0.5316, 0.5313, 0.5309, 0.5306, 0.5302, 0.5298, 0.5295, 0.5292, 0.529, 0.5287, 0.529, 0.5292, 0.5292, 0.5291, 0.5289, 0.5285, 0.5281, 0.528, 0.528, 0.5281, 0.5281, 0.5282, 0.5282, 0.5284, 0.5289, 0.5296, 0.5304, 0.5308, 0.5305, 0.5302, 0.53, 0.5298, 0.5296, 0.5295, 0.5295, 0.5294, 0.5294, 0.5293, 0.5293, 0.5294, 0.5296, 0.5298, 0.53, 0.5302, 0.5304, 0.5306, 0.5326, 0.5346, 0.5357, 0.5358, 0.5349, 0.5351, 0.5353, 0.5354, 0.5356, 0.5357, 0.5359, 0.5362, 0.5363, 0.5362, 0.5359, 0.5356, 0.535, 0.5343, 0.5334, 0.5326, 0.5317, 0.5308, 0.5299, 0.5291, 0.5283, 0.5276, 0.5271, 0.5265, 0.526, 0.5255, 0.525, 0.5245, 0.5242, 0.5239, 0.5237, 0.5235, 0.5233, 0.5232, 0.5232, 0.5233, 0.5235, 0.5237, 0.5242, 0.5248, 0.5254, 0.5263, 0.5273, 0.5285, 0.5299, 0.5314, 0.5332, 0.534, 0.5353, 0.5368, 0.5384, 0.5398, 0.5409, 0.5419, 0.544, 0.5462, 0.5479, 0.549, 0.55, 0.5505, 0.5508, 0.551, 0.5511, 0.5511, 0.5508, 0.5508, 0.5507, 0.5508, 0.5509, 0.5509, 0.5509, 0.5514, 0.5523, 0.5526, 0.5526, 0.5526, 0.5525, 0.5523, 0.5519, 0.5515, 0.5511, 0.5511, 0.5513, 0.5515, 0.5518, 0.552, 0.5522, 0.5524, 0.5527, 0.553, 0.5536, 0.5544, 0.5556, 0.5569, 0.5581, 0.558, 0.5575, 0.5565, 0.5552, 0.5552, 0.5554, 0.5556, 0.5559, 0.5564, 0.557, 0.5576, 0.5582, 0.5588, 0.5594, 0.56, 0.5607, 0.5613, 0.5619, 0.5604, 0.5609, 0.5614, 0.5617, 0.5621, 0.5624, 0.5627, 0.5629, 0.5661, 0.5758, 0.5637, 0.5638, 0.564, 0.5643, 0.5645, 0.5647, 0.5649, 0.5651, 0.5652, 0.5653, 0.5654, 0.5654, 0.5654, 0.5654, 0.5646, 0.5644, 0.5645, 0.5647, 0.565, 0.5652, 0.5654, 0.5657, 0.5661, 0.5663, 0.5663, 0.5663, 0.5661, 0.5666, 0.5671, 0.5676, 0.568, 0.5684, 0.5731, 0.5764, 0.573, 0.5712, 0.5717, 0.5722, 0.5709, 0.5718, 0.5737, 0.5718, 0.5713, 0.5708, 0.5701, 0.5692, 0.5684, 0.5677, 0.5675, 0.5674, 0.5673, 0.5671, 0.567, 0.5669, 0.5669, 0.5669, 0.5669, 0.567, 0.5671, 0.5672, 0.5674, 0.5676, 0.5677, 0.5679, 0.5681, 0.5685, 0.569, 0.5696, 0.5701, 0.5714, 0.5727, 0.574, 0.5752, 0.5762, 0.5766, 0.5765, 0.5766, 0.5769, 0.5776, 0.5784, 0.5794, 0.5805, 0.5819, 0.5834, 0.5851, 0.5868, 0.5871, 0.5865, 0.5875, 0.5889, 0.5904, 0.592, 0.5937, 0.5955, 0.5974, 0.5994, 0.6019, 0.6049, 0.6066, 0.6075, 0.61, 0.6122, 0.6143, 0.6165, 0.6185, 0.6205, 0.6225, 0.6244, 0.6263, 0.6281, 0.63, 0.6319, 0.6313, 0.6337, 0.6361, 0.6385, 0.6407, 0.6429, 0.6449, 0.6467, 0.648, 0.6492, 0.6504, 0.6516, 0.6529, 0.6542, 0.6555, 0.6567, 0.6578, 0.6589, 0.6605, 0.6621, 0.6632, 0.6638, 0.6646, 0.6654, 0.6662, 0.667, 0.6679, 0.6689, 0.6698, 0.6708, 0.672, 0.6731, 0.6741, 0.6751, 0.676, 0.6769, 0.6777, 0.6786, 0.6794, 0.6786, 0.6785, 0.6784, 0.6782, 0.6779, 0.6778, 0.6779, 0.6781, 0.6787, 0.6798, 0.6793, 0.679, 0.6797, 0.6804, 0.6811, 0.6823, 0.6837, 0.6856, 0.6882, 0.6911, 0.6949, 0.7036, 0.7123, 0.7024, 0.7034, 0.7044, 0.7198, 0.7054, 0.7061, 0.7067, 0.7073, 0.7082, 0.7097, 0.7109, 0.7118, 0.7124, 0.713, 0.7137, 0.7143, 0.7148, 0.7153, 0.7158, 0.7161, 0.7164, 0.7167, 0.7169, 0.717, 0.717, 0.717, 0.7169, 0.7166, 0.7157, 0.7145, 0.7133, 0.7121, 0.7111, 0.7102, 0.7093, 0.7084, 0.7074, 0.7065, 0.7057, 0.7048, 0.704, 0.7033, 0.7026, 0.702, 0.7015, 0.7009, 0.7003, 0.7, 0.6995, 0.6993, 0.6993, 0.6994, 0.6994, 0.6997, 0.7001, 0.7005, 0.7009, 0.7016, 0.7032, 0.707, 0.7128, 0.7176, 0.7216, 0.7222, 0.7213, 0.7182, 0.7147, 0.7119, 0.709, 0.707, 0.7066, 0.6943, 0.6896, 0.6849, 0.6826, 0.6694, 0.6676, 0.666, 0.6646, 0.6636, 0.6626, 0.6618, 0.661, 0.6599, 0.6593, 0.659, 0.6578, 0.6561, 0.6544, 0.6527, 0.6508, 0.649, 0.6472, 0.6454, 0.6437, 0.642, 0.6404, 0.6389, 0.6375, 0.636, 0.6356, 0.6354, 0.6354, 0.6355, 0.636, 0.6367, 0.6347, 0.632, 0.6304, 0.6289, 0.6274, 0.6258, 0.6243, 0.6229, 0.6215, 0.6195, 0.6178, 0.6166, 0.6146, 0.6131, 0.6125, 0.6121, 0.6117, 0.6114, 0.6114, 0.6116, 0.6118, 0.6121, 0.6124, 0.6127, 0.6129, 0.6131, 0.6133, 0.6135, 0.6138, 0.6141, 0.6152, 0.6171, 0.6194, 0.6184, 0.6162, 0.613, 0.6098, 0.6097, 0.6097, 0.6099, 0.6104, 0.6109, 0.6106, 0.6102, 0.61, 0.6098, 0.6097, 0.6076, 0.6053, 0.6045, 0.6037, 0.6033, 0.6014, 0.6016, 0.6015, 0.6011, 0.6002, 0.5989, 0.5973, 0.5956, 0.5945, 0.5936, 0.5928, 0.5923, 0.5922, 0.5924, 0.5927, 0.593, 0.5932, 0.5935, 0.5936, 0.5938, 0.5939, 0.594, 0.5941, 0.5942, 0.5943, 0.5944, 0.5943, 0.5941, 0.5941, 0.5939, 0.593, 0.592, 0.591, 0.5901, 0.5892, 0.5883, 0.5873, 0.5861, 0.5838, 0.5819, 0.5804, 0.5791, 0.578, 0.5765, 0.574, 0.5731, 0.5725, 0.5719, 0.5716, 0.5716, 0.5717, 0.5719, 0.5724, 0.573, 0.5735, 0.5741, 0.5746, 0.5751, 0.5757, 0.5762, 0.5769, 0.5777, 0.5788, 0.5794, 0.58, 0.5807, 0.5802, 0.5832, 0.5847, 0.5857, 0.5863, 0.5862, 0.5857, 0.5833, 0.5816, 0.5803, 0.58, 0.5801, 0.5801, 0.5799, 0.5795, 0.579, 0.5785, 0.5782, 0.578, 0.5781, 0.5783, 0.5784, 0.5784, 0.5783, 0.5783, 0.5781, 0.5771, 0.576, 0.576, 0.576, 0.5765, 0.5773, 0.5782, 0.5792, 0.5801, 0.581, 0.582, 0.5839, 0.5858, 0.5878, 0.5943, 0.5888, 0.5909, 0.593, 0.5953, 0.5978, 0.6006, 0.6038, 0.608, 0.6136, 0.6205, 0.6277, 0.6352, 0.6417, 0.6482, 0.6548, 0.6613, 0.6673, 0.673, 0.6786, 0.684, 0.6891, 0.6941, 0.6992, 0.7041, 0.7089, 0.7136, 0.7181, 0.7224, 0.7265, 0.7303, 0.7337, 0.7368, 0.7387, 0.7398, 0.74, 0.7395, 0.7395, 0.7394, 0.7388, 0.7376, 0.736, 0.7342, 0.7381, 0.7248, 0.7224, 0.7159, 0.7107, 0.705, 0.6993, 0.6938, 0.6882, 0.6825, 0.6769, 0.6712, 0.6652, 0.6596, 0.6579, 0.6566, 0.6541, 0.6522, 0.6505, 0.6488, 0.6474, 0.6463, 0.6453, 0.6444, 0.6436, 0.643, 0.6425, 0.6417, 0.6413, 0.6423, 0.6428, 0.6428, 0.6422, 0.6412, 0.6413, 0.642, 0.643, 0.6445, 0.6462, 0.648, 0.65, 0.6521, 0.6542, 0.6564, 0.6586, 0.6609, 0.6631, 0.666, 0.6696, 0.6738, 0.6827, 0.6942, 0.6863, 0.682, 0.6793, 0.6766, 0.675, 0.6726, 0.6681, 0.6616, 0.6535, 0.6451, 0.6361, 0.6268, 0.6169, 0.6075, 0.598, 0.5888, 0.5798, 0.5709, 0.562, 0.5499, 0.5423, 0.5347, 0.5269, 0.5191, 0.5116, 0.5046, 0.4982, 0.4924, 0.4869, 0.4811, 0.4752, 0.4696, 0.4642, 0.4585, 0.4529, 0.448, 0.4432, 0.4377, 0.4323, 0.4272, 0.4224, 0.4177, 0.413, 0.4091, 0.407, 0.4062, 0.4056, 0.404, 0.4015, 0.398, 0.3937, 0.3892, 0.3848, 0.3804, 0.3761, 0.3718, 0.3676, 0.3634, 0.3592, 0.355, 0.3509, 0.3468, 0.3431, 0.3411, 0.3409, 0.3253, 0.3219, 0.3186, 0.3155, 0.3125, 0.3097, 0.307, 0.3042, 0.3008, 0.2976, 0.2944, 0.2912, 0.288, 0.2859, 0.284, 0.2786, 0.2736, 0.2701, 0.2669, 0.2641, 0.2615, 0.259, 0.2566, 0.2542, 0.2519, 0.2496, 0.2473, 0.2452, 0.2431, 0.2411, 0.2392, 0.2375, 0.2358, 0.2342, 0.2325, 0.2307, 0.229, 0.2273, 0.2257, 0.2241, 0.2226, 0.221, 0.2195, 0.2181, 0.2168, 0.2158, 0.2148, 0.2138, 0.2122, 0.2106, 0.209, 0.2076, 0.2061, 0.2043, 0.2024, 0.2004, 0.1983, 0.1961, 0.1936, 0.1909, 0.1882, 0.1856, 0.1831, 0.1809, 0.179, 0.1773, 0.1757, 0.1742, 0.1725, 0.1707, 0.1691, 0.1675, 0.166, 0.1645, 0.1631, 0.1617, 0.1603, 0.1587, 0.157, 0.1552, 0.1534, 0.1517, 0.1499, 0.1482, 0.1465, 0.1448, 0.1433, 0.1419, 0.1404, 0.139, 0.1376, 0.1361, 0.1347, 0.1333, 0.132, 0.1306, 0.1293, 0.128, 0.1267, 0.1255, 0.1242, 0.1229, 0.1216, 0.1203, 0.119, 0.1162, 0.1154, 0.1147, 0.114, 0.1133, 0.1125, 0.1118, 0.1111, 0.1104, 0.1096, 0.1089, 0.1082, 0.1075, 0.1067, 0.106, 0.1054, 0.1047, 0.104, 0.1033, 0.1027, 0.102, 0.1013, 0.1007, 0.1001, 0.09955, 0.09901, 0.09851, 0.09804, 0.09758, 0.0971, 0.09656, 0.09602, 0.0955, 0.09498, 0.09446, 0.09393, 0.0934, 0.09286, 0.09232, 0.09177, 0.09122, 0.09067, 0.09011, 0.08959, 0.08909, 0.08862, 0.08818, 0.08778, 0.08837, 0.0901, 0.09223, 0.09398, 0.1003, 0.09108, 0.08177, 0.07762, 0.07439, 0.07159, 0.06922, 0.06728, 0.06577, 0.06466, 0.06369, 0.06275, 0.06185, 0.06098, 0.06016, 0.05937, 0.05866, 0.05801, 0.0574, 0.05683, 0.0563, 0.0558, 0.0553, 0.0548, 0.0543, 0.0538, 0.0533, 0.0528, 0.05231, 0.05181, 0.05131, 0.05079, 0.05017, 0.04956, 0.04893, 0.04831, 0.04769, 0.04708, 0.04648, 0.04588, 0.04529, 0.04471, 0.04413, 0.04356, 0.043, 0.04246, 0.04195, 0.04148, 0.04104, 0.04064, 0.04026, 0.03991, 0.03955, 0.03918, 0.03881, 0.03845, 0.03808, 0.03772, 0.03736, 0.03699, 0.03663, 0.03627, 0.03591, 0.03554, 0.03517, 0.03481, 0.03443, 0.03406, 0.03368, 0.03316, 0.03262, 0.03211, 0.03163, 0.0312, 0.0308, 0.03043, 0.03011, 0.02982, 0.02896, 0.02759, 0.02669, 0.02621, 0.02581, 0.0254, 0.025, 0.02459, 0.02419, 0.02379, 0.02339, 0.02299, 0.02259, 0.02218, 0.02178, 0.02138, 0.02099, 0.02059, 0.02019, 0.01979, 0.01939, 0.019, 0.0186, 0.0182, 0.01779, 0.01737, 0.01695, 0.01652, 0.01609, 0.01565, 0.01517, 0.01448, 0.01394, 0.01353, 0.01324, 0.01295, 0.01267, 0.01238, 0.01209, 0.0118, 0.01151, 0.01121, 0.01091, 0.01062, 0.01032, 0.01002, 0.009713, 0.009408, 0.009102, 0.008794, 0.008485, 0.008174, 0.007861, 0.007547, 0.007231, 0.006917, 0.006605, 0.006295, 0.005987, 0.005681, 0.005377, 0.005076, 0.004776, 0.004479, 0.004184, 0.00389, 0.003599, 0.00331, 0.003023, 0.002704, 0.002185, 0.001717, 0.0013, 0.0009344, 0.0006195, 0.0003556, 0.0001428]], 'labels': ['integrated_dos', 'dos'], 'units': ['states', 'states/eV']}\n" + "09/03/2025 09:14:50 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/03/2025 09:14:51 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178742\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178742\n", + "09/03/2025 09:14:58 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/03/2025 09:15:00 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator1\n", + "09/03/2025 09:15:01 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178758\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178758\n", + "09/03/2025 09:15:16 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|update_task_state]: Task: pw_calculator1, type: PYTHONJOB, finished.\n", + "09/03/2025 09:15:18 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: dos_calculator,projwfc_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: dos_calculator,projwfc_calculator\n", + "09/03/2025 09:15:20 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178774, 178780\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178774, 178780\n", + "09/03/2025 09:15:44 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|update_task_state]: Task: projwfc_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|update_task_state]: Task: projwfc_calculator, type: PYTHONJOB, finished.\n", + "09/03/2025 09:15:48 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/03/2025 09:15:49 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178774\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 178774\n", + "09/03/2025 09:16:44 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|update_task_state]: Task: dos_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|update_task_state]: Task: dos_calculator, type: PYTHONJOB, finished.\n", + "09/03/2025 09:16:47 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/03/2025 09:16:47 PM <328043> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [178738|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[178738|WorkGraphEngine|finalize]: Finalize workgraph.\n" ] - }, + } + ], + "source": [ + "wg.run()" + ] + }, + { + "cell_type": "markdown", + "id": "ea09fce9", + "metadata": {}, + "source": [ + "## Print the results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "afe2b91d", + "metadata": {}, + "outputs": [ { - "ename": "KeyError", - "evalue": "'atom'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[27], line 12\u001b[0m\n\u001b[1;32m 10\u001b[0m plt\u001b[38;5;241m.\u001b[39mplot(dos_data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124marray\u001b[39m\u001b[38;5;124m'\u001b[39m], dos_data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124marrays\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;241m0\u001b[39m], label\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtotal\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 11\u001b[0m \u001b[38;5;66;03m# plt.plot(pdos_data['totol']['energy'], pdos_data['totol']['dos'], label='total')\u001b[39;00m\n\u001b[0;32m---> 12\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m file_name, data \u001b[38;5;129;01min\u001b[39;00m \u001b[43mpdos_data\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43matom\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 13\u001b[0m value \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray(data)\n\u001b[1;32m 14\u001b[0m plt\u001b[38;5;241m.\u001b[39mplot(value[:, \u001b[38;5;241m0\u001b[39m], np\u001b[38;5;241m.\u001b[39msum(value[:, \u001b[38;5;241m2\u001b[39m:], axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m), label\u001b[38;5;241m=\u001b[39mfile_name[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m4\u001b[39m:])\n", - "\u001b[0;31mKeyError\u001b[0m: 'atom'" - ] + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" }, { "data": { - "image/png": "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bN++XZL4vIvL6O3OrFmzNHXqVA0cOFCDBw/WM888o6qqKk2bNs3saG3Wfffdp3HjxikpKUn5+fl69NFH5e3trSlTppgdrc2orKxsMnqQk5Oj7du3Kzw8XImJiZo5c6bmzZunbt26KTk5WXPmzFF8fLwmTJhgXug24HTnPTw8XHPnztV1112n2NhYHThwQA888IBSU1M1ZswYE1O3btOnT9dbb72lDz74QCEhIY33YVqtVgUGBspqterWW2/VrFmzFB4ertDQUN19990aOnSoLrzwQpPTt15nOu8HDhzQW2+9pauuukoRERHauXOn7r33Xl1yySVKT083Ob0HMPtxeLS85557zkhMTDT8/PyMwYMHG+vXrzc7Ups2efJkIy4uzvDz8zM6depkTJ482cjOzjY7VpuyYsUKQ9IPvqZOnWoYRsP0R3PmzDFiYmIMf39/Y9SoUUZmZqa5oduA05336upq44orrjCioqIMX19fIykpybjtttuMgoICs2O3aqc635KMhQsXNu5z8uRJ48477zQ6duxodOjQwZg4caJx7Ngx80K3AWc677m5ucYll1xihIeHG/7+/kZqaqpx//33G+Xl5eYG9xAWwzCMliy3AAAAaD+4ZxMAAABuQ9kEAACA21A2AQAA4DaUTQAAALgNZRMAAABuQ9kEAACA21A2AQAA4DaUTQAAALgNZRMAAABuQ9kEAACA21A2AQAA4Db/Hw1Mldz25KU9AAAAAElFTkSuQmCC", + "image/png": "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0zUAxBdffNF0u6amRgQg/v7776IoiuIbb7whTpo0qcXrZmdniwDElJQUURRF8ZprrhEHDBjQ4prFixeLCQkJLe574YUXRABieXm5KIqiuH//flEul4t5eXmiKIpiYWGhqFAoxO3bt7f6e7r55pvF+++/v8V9banx9OnTIgBx27ZtpmvGjBkj3n333Ze8x4wZM8S5c+e2WgMRUUdwAQ0R2ZXx48fjk08+aXGfj49Pi9t9+/Y1/ezq6goPDw8UFRUBABITE7Ft2za4ubld8trp6eno3r07AFwyWpiSkoIhQ4a0uG/o0KGX3O7duze++uorPPvss/jmm28QGRmJsWPHtvr7qa+vh5OTU4v72lJjfHw8Ro4cieXLl2PcuHE4c+YMdu3ahddff/2S5zg7O6Ourq7VGoiIOoJhkojsiqurK2JjY694jVKpbHFbEATo9XoAhnWFN954I/71r39d8rzg4OAW72OOBx54AEuXLsWzzz6LFStW4L777oMgCK1e7+fnh/Ly8hb3tbXGefPm4bHHHsPSpUuxYsUKxMTE4JprrrnkOWVlZYiJiTHr90NEdDVcM0lEXcrAgQNx8uRJdOvWDbGxsS1+XSlA9ujRA4cOHWpxn3HH9IXuvvtunDt3Dh9++CFOnTqFOXPmXLGeAQMG4NSpU2bVOGvWLMhkMqxatQorV67E/ffff9ngeuLECQwYMOCKdRARmYthkojsSmNjIwoKClr8unAn9tUsXLgQZWVluOOOO3Dw4EGkp6dj48aNuO+++6DT6Vp93oIFC5CcnIzFixcjNTUV3333nWk39YUBztvbGzNnzsQzzzyDSZMmXdK652KTJ0/GyZMnW4xOtrVGNzc3zJ49G8899xzy8/Mxd+7cS14/MzMTubm5mDhxYhs/ISKi9mGYJCK78scffyA4OLjFr9GjR7f5+SEhIdi9ezd0Oh0mTZqEPn36YNGiRfDy8oJM1vofiVFRUfj++++xbt069O3bF5988olpN7darW5x7bx586DRaHD//fdftZ4+ffpg4MCB+O6778yqcd68eSgvL8fkyZMREhJyyeuvXr0akyZNQmRk5FVrISIyB5uWExGZacmSJVi2bBmys7Nb3P/111/jiSeeQF5eXpuanf/666945plncOLEiSsG2vbSaDSIi4vDqlWrMGrUKIu9LhHRhbgBh4iojT7++GMMGTIEvr6+2L17N9555x08+uijpsfr6uqQn5+Pf/7zn1iwYEGbT825/vrrkZaWhtzcXISHh1us3qysLDz//PMMkkTUqTgySUTURk888QTWrFmDsrIyRERE4J577sFzzz1nOqbw1VdfxZIlSzB27Fhs2LDhsq19iIgcDcMkEREREZmNG3CIiIiIyGwMk0RERERkNoZJIiIiIjIbwyQRERERmY1hkoiIiIjMxjBJRERERGZjmCQiIiIiszFMEhEREZHZGCaJiIiIyGz/D147MAyIukIEAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -262,65 +202,20 @@ "import numpy as np\n", "\n", "#------------------------- Print the output -------------------------\n", - "dos_data = wg.tasks[-2].outputs.dos.value.value\n", - "pdos_data = wg.tasks[-1].outputs.dos.value.value\n", + "dos_data = wg.outputs.dos.dos.value.value\n", + "pdos_data = wg.outputs.projwfc.projections.value.value\n", "# make plots\n", "plt.figure(figsize = (8, 4))\n", - "plt.plot(dos_data['x']['array'], dos_data['y']['arrays'][0], label='total')\n", + "plt.plot(dos_data['x']['array'], dos_data['y']['arrays'][1], label='total')\n", "# plt.plot(pdos_data['totol']['energy'], pdos_data['totol']['dos'], label='total')\n", - "for file_name, data in pdos_data['atom'].items():\n", - " value = np.array(data)\n", - " plt.plot(value[:, 0], np.sum(value[:, 2:], axis=1), label=file_name[-4:])\n", + "# for file_name, data in pdos_data['atom'].items():\n", + " # value = np.array(data)\n", + " # plt.plot(value[:, 0], np.sum(value[:, 2:], axis=1), label=file_name[-4:])\n", "plt.yticks([])\n", "plt.xlabel('Energy (eV)')\n", "plt.ylabel('DOS')\n", "plt.legend(frameon=False)\n" ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "4a5647a2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ProjectionData(orbitals=[, , , ], list_of_projections=[array([[1. , 0. , 0. , 0. , 0. , 0. ],\n", - " [0.961, 0.01 , 0. , 0. , 0. , 0. ],\n", - " [0.864, 0.059, 0. , 0. , 0. , 0. ],\n", - " ...,\n", - " [0.111, 0. , 0.007, 0.865, 0. , 0. ],\n", - " [0. , 0.087, 0. , 0.898, 0. , 0. ],\n", - " [0. , 0. , 0.099, 0.886, 0. , 0.002]]), array([[0. , 0. , 0. , 0. , 0.309, 0.309],\n", - " [0.013, 0.081, 0.038, 0.038, 0.271, 0.271],\n", - " [0.045, 0.125, 0.094, 0.094, 0.217, 0.217],\n", - " ...,\n", - " [0.292, 0.326, 0.307, 0.039, 0.006, 0.02 ],\n", - " [0.327, 0.299, 0.31 , 0.029, 0.013, 0.004],\n", - " [0.329, 0.327, 0.278, 0.032, 0.006, 0.02 ]]), array([[0. , 0. , 0. , 0. , 0.309, 0.309],\n", - " [0.013, 0.081, 0.038, 0.038, 0.271, 0.271],\n", - " [0.045, 0.125, 0.094, 0.094, 0.217, 0.217],\n", - " ...,\n", - " [0.292, 0.326, 0.307, 0.039, 0.006, 0.02 ],\n", - " [0.327, 0.299, 0.31 , 0.029, 0.013, 0.004],\n", - " [0.329, 0.327, 0.278, 0.032, 0.006, 0.02 ]]), array([[0. , 0. , 0. , 0. , 0.309, 0.309],\n", - " [0.013, 0.081, 0.038, 0.038, 0.271, 0.271],\n", - " [0.045, 0.125, 0.094, 0.094, 0.217, 0.217],\n", - " ...,\n", - " [0.292, 0.326, 0.307, 0.039, 0.006, 0.02 ],\n", - " [0.327, 0.299, 0.31 , 0.029, 0.013, 0.004],\n", - " [0.329, 0.327, 0.278, 0.032, 0.006, 0.02 ]])], list_of_energy=[array([-3.255, -3.245, -3.235, ..., 26.845, 26.855, 26.865]), array([-3.255, -3.245, -3.235, ..., 26.845, 26.855, 26.865]), array([-3.255, -3.245, -3.235, ..., 26.845, 26.855, 26.865]), array([-3.255, -3.245, -3.235, ..., 26.845, 26.855, 26.865])], list_of_pdos=[array([0.00e+00, 2.41e-03, 9.53e-03, ..., 5.54e-08, 1.21e-08, 0.00e+00]), array([0.00e+00, 1.05e-05, 8.37e-05, ..., 3.28e-05, 1.75e-05, 0.00e+00]), array([0.00e+00, 1.05e-05, 8.37e-05, ..., 3.28e-05, 1.75e-05, 0.00e+00]), array([0.00e+00, 1.05e-05, 8.37e-05, ..., 3.28e-05, 1.75e-05, 0.00e+00])], bands_check=False, bands_data=BandStructure(path=BandPath(path='', cell=[3x3], special_points={}, kpts=[752x3]), energies=[1x752x6 values], reference=0.0))" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wg.tasks[-1].outputs.projections.value.value" - ] } ], "metadata": { diff --git a/docs/source/ase/espresso/relax.ipynb b/docs/source/ase/espresso/relax.ipynb new file mode 100644 index 0000000..804e6c1 --- /dev/null +++ b/docs/source/ase/espresso/relax.ipynb @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9fd2308b", + "metadata": {}, + "source": [ + "# Relaxation\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "af8d6f96", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from workgraph_collections.ase.espresso.relax import RelaxWorkgraph\n", + "from ase.build import bulk\n", + "from ase import Atoms\n", + "from aiida import load_profile\n", + "from aiida_pythonjob.config import config\n", + "\n", + "load_profile()\n", + "\n", + "config[\"allow_pickle\"] = True\n", + "\n", + "# create input structure\n", + "atoms = bulk(\"Si\")\n", + "atoms.set_cell(atoms.cell * 1.05, scale_atoms=True)\n", + "\n", + "metadata = {\n", + " \"options\": {\n", + " 'prepend_text' : \"\"\"eval \"$(conda shell.posix hook)\"\n", + " conda activate aiida\n", + " export OMP_NUM_THREADS=1\n", + " \"\"\",\n", + " }\n", + "}\n", + "pseudopotentials = {\"Si\": \"Si.pbe-nl-rrkjus_psl.1.0.0.UPF\"}\n", + "pseudo_dir = \"/home/xing/data/ase/espresso_pseudo\"\n", + "# pseudo_dir = \"/home/wang_x3/datas/pseudos/psl\"\n", + "input_data = {\n", + " \"control\": {\"calculation\": \"scf\"},\n", + " \"system\": {\"ecutwfc\": 30, \"ecutrho\": 240,\n", + " \"occupations\": \"smearing\",\n", + " \"degauss\": 0.01,\n", + " \"smearing\": \"cold\",},\n", + "}\n", + "# ------------------------- Set the inputs -------------------------\n", + "wg = RelaxWorkgraph.build_graph(\n", + " atoms=atoms,\n", + " computer=\"localhost\",\n", + " command=\"mpirun -np 2 pw.x\",\n", + " pseudopotentials=pseudopotentials,\n", + " pseudo_dir=pseudo_dir,\n", + " input_data=input_data,\n", + " kpts=[4, 4, 4],\n", + " metadata=metadata,\n", + ")\n", + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "2c06ac3a", + "metadata": {}, + "source": [ + "## Run the workflow\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "defb31bb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/04/2025 07:30:18 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 07:30:19 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180113\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180113\n", + "09/04/2025 07:30:41 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:30:42 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/04/2025 07:30:43 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "09/04/2025 07:30:43 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "09/04/2025 07:30:46 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180139\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180139\n", + "09/04/2025 07:30:50 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 07:30:50 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180143\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180143\n", + "09/04/2025 07:31:02 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:31:04 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/04/2025 07:31:05 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "09/04/2025 07:31:05 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "09/04/2025 07:31:08 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180168\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180168\n", + "09/04/2025 07:31:10 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180168|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180168|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 07:31:11 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180168|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180172\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180168|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 180172\n", + "09/04/2025 07:31:20 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180168|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180168|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 07:31:21 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180168|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180168|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:31:21 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180168|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180168|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/04/2025 07:31:22 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "09/04/2025 07:31:24 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:31:24 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180139|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180139|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/04/2025 07:31:24 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "09/04/2025 07:31:26 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 07:31:26 AM <593221> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [180109|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[180109|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ + "wg.run()" + ] + }, + { + "cell_type": "markdown", + "id": "f5ab3ef8", + "metadata": {}, + "source": [ + "## Print the outputs" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c2dc5c49", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Relaxed structure:\n", + "Atoms(symbols='Si2', pbc=True, cell=[[0.0, 2.7391864002289, 2.7391864002289], [2.7391864002289, 0.0, 2.7391864002289], [2.7391864002289, 2.7391864002289, 0.0]])\n" + ] + } + ], + "source": [ + "print(\"Relaxed structure:\")\n", + "print(wg.outputs.atoms.value.value)\n" + ] + } + ], + "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 +} diff --git a/docs/source/ase/espresso/surface_slabs.ipynb b/docs/source/ase/espresso/surface_slabs.ipynb index 46a1094..eba57ed 100644 --- a/docs/source/ase/espresso/surface_slabs.ipynb +++ b/docs/source/ase/espresso/surface_slabs.ipynb @@ -9,51 +9,6 @@ "\n", "Generating surface slabs and related structures is a common task in computational materials science.\n", "\n", - "## Visualizing the WorkGraph Builder\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1a8ebc0d", - "metadata": {}, - "outputs": [], - "source": [ - "from workgraph_collections.ase.espresso.slabs import slabs_workgraph\n", - "\n", - "task = slabs_workgraph.TaskCls()\n", - "task.to_html()\n", - "#\n", - "# task" - ] - }, - { - "cell_type": "markdown", - "id": "9e6360d8", - "metadata": {}, - "source": [ - "## Visualizing the WorkGraph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "01bedd69", - "metadata": {}, - "outputs": [], - "source": [ - "from workgraph_collections.ase.espresso.slabs import slabs_workgraph\n", - "\n", - "wg = slabs_workgraph()\n", - "wg.to_html()\n", - "# wg" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ "## Example: Al (111) and Al (100) surfaces\n", "\n", "### Prepare the inputs and submit the workflow\n" @@ -65,17 +20,15 @@ "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 156499\n" - ] - }, { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "88f76081bb9040fc8cb026f3d3a00fb7", + "version_major": 2, + "version_minor": 1 + }, "text/plain": [ - "" + "NodeGraphWidget(settings={'minimap': True}, style={'width': '90%', 'height': '600px'}, value={'name': 'SlabsWo…" ] }, "execution_count": 1, @@ -84,10 +37,12 @@ } ], "source": [ - "from workgraph_collections.ase.espresso.slabs import slabs_workgraph\n", + "from workgraph_collections.ase.espresso.slabs import SlabsWorkgraph\n", "from ase.build import bulk\n", "from aiida import load_profile\n", - "\n", + "from aiida_pythonjob.config import config\n", + "# allow pickle\n", + "config[\"allow_pickle\"] = True\n", "load_profile()\n", "\n", "# create input structure\n", @@ -114,20 +69,19 @@ " \"smearing\": \"cold\",},\n", "}\n", "#------------------------- Set the inputs -------------------------\n", - "wg = slabs_workgraph(atoms=atoms,\n", + "wg = SlabsWorkgraph.build_graph(atoms=atoms,\n", " computer=\"localhost\",\n", " miller_indices=[[1, 1, 1], [1, 0, 0]],\n", - " command=\"mpirun -np 4 pw.x\",\n", + " command=\"mpirun -np 1 pw.x\",\n", " pseudopotentials=pseudopotentials,\n", " pseudo_dir=pseudo_dir,\n", " input_data=input_data,\n", - " kspacing=0.10,\n", + " layers=1,\n", + " kspacing=0.3,\n", " metadata=metadata,\n", " calc_surface_energy=True,\n", " )\n", - "#------------------------- Submit the calculation -------------------\n", - "# wg.run()\n", - "wg.submit(wait=True, timeout=300)\n", + "wg\n", "\n" ] }, @@ -139,6 +93,275 @@ "## Relaxed slabs" ] }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8d6c90d6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/04/2025 10:15:34 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "09/04/2025 10:15:38 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181435\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181435\n", + "09/04/2025 10:15:41 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 10:15:43 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181439\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181439\n", + "09/04/2025 10:15:45 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 10:15:47 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/04/2025 10:15:48 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "09/04/2025 10:15:48 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "09/04/2025 10:15:51 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181464\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181464\n", + "09/04/2025 10:15:55 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 10:15:57 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181468\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181468\n", + "09/04/2025 10:15:59 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 10:16:01 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/04/2025 10:16:02 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: PYFUNCTION, finished.\n", + "09/04/2025 10:16:02 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph\n", + "09/04/2025 10:16:05 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181492\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181492\n", + "09/04/2025 10:16:08 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181492|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181492|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 10:16:10 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181492|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181496\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181492|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181496\n", + "09/04/2025 10:16:12 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181492|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181492|WorkGraphEngine|update_task_state]: Task: pw_calculator, type: PYTHONJOB, finished.\n", + "09/04/2025 10:16:14 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181492|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181492|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:16:14 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181492|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181492|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/04/2025 10:16:15 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "09/04/2025 10:16:16 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:16:16 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181464|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181464|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/04/2025 10:16:17 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "09/04/2025 10:16:19 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:16:19 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181435|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181435|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/04/2025 10:16:19 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|update_task_state]: Task: RelaxWorkgraph, type: GRAPH, finished.\n", + "09/04/2025 10:16:21 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: get_slabs_from_miller_indices_ase\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: get_slabs_from_miller_indices_ase\n", + "INFO:aiida_pythonjob.decorator:Executing process function, current stack status: 47 frames of 3000\n", + "09/04/2025 10:16:22 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|update_task_state]: Task: get_slabs_from_miller_indices_ase, type: PYFUNCTION, finished.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|update_task_state]: Task: get_slabs_from_miller_indices_ase, type: PYFUNCTION, finished.\n", + "09/04/2025 10:16:22 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxSlabs\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxSlabs\n", + "09/04/2025 10:16:23 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181514\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181514\n", + "09/04/2025 10:16:26 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph,RelaxWorkgraph1\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|continue_workgraph]: tasks ready to run: RelaxWorkgraph,RelaxWorkgraph1\n", + "09/04/2025 10:16:32 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181530, 181546\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181530, 181546\n", + "09/04/2025 10:16:35 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181530|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181530|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 10:16:36 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181530|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181550\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181530|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181550\n", + "09/04/2025 10:16:39 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181546|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181546|WorkGraphEngine|continue_workgraph]: tasks ready to run: pw_calculator\n", + "09/04/2025 10:16:40 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181546|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181554\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181546|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181554\n", + "09/04/2025 10:31:08 AM <1075524> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [WARNING] output parser returned exit code<325>: Function execution failed.\n", + "'PwExitCodes' object has no attribute 'get'\n", + "Traceback (most recent call last):\n", + " File \"\", line 41, in main\n", + " File \"/home/xing/repos/superstar54/workgraph-collections/workgraph_collections/ase/espresso/pw.py\", line 196, in pw_calculator\n", + " atoms.get_potential_energy()\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/atoms.py\", line 770, in get_potential_energy\n", + " energy = self._calc.get_potential_energy(self)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/abc.py\", line 24, in get_potential_energy\n", + " return self.get_property(name, atoms)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 141, in get_property\n", + " return super().get_property(name, atoms=atoms, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/calculator.py\", line 538, in get_property\n", + " self.calculate(atoms, [name], system_changes)\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/genericfileio.py\", line 334, in calculate\n", + " self.results = self.template.read_results(self.directory)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 63, in read_results\n", + " exit_code = parser.parse()\n", + " ^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 171, in parse\n", + " exit_code = self.validate_premature_exit(logs_stdout)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 229, in validate_premature_exit\n", + " return self.exit_codes.get(error_label)\n", + " ^^^^^^^^^^^^^^^^^^^\n", + "AttributeError: 'PwExitCodes' object has no attribute 'get'\n", + "\n", + "WARNING:aiida.orm.nodes.process.calculation.calcjob.CalcJobNode:output parser returned exit code<325>: Function execution failed.\n", + "'PwExitCodes' object has no attribute 'get'\n", + "Traceback (most recent call last):\n", + " File \"\", line 41, in main\n", + " File \"/home/xing/repos/superstar54/workgraph-collections/workgraph_collections/ase/espresso/pw.py\", line 196, in pw_calculator\n", + " atoms.get_potential_energy()\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/atoms.py\", line 770, in get_potential_energy\n", + " energy = self._calc.get_potential_energy(self)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/abc.py\", line 24, in get_potential_energy\n", + " return self.get_property(name, atoms)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 141, in get_property\n", + " return super().get_property(name, atoms=atoms, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/calculator.py\", line 538, in get_property\n", + " self.calculate(atoms, [name], system_changes)\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/genericfileio.py\", line 334, in calculate\n", + " self.results = self.template.read_results(self.directory)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 63, in read_results\n", + " exit_code = parser.parse()\n", + " ^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 171, in parse\n", + " exit_code = self.validate_premature_exit(logs_stdout)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 229, in validate_premature_exit\n", + " return self.exit_codes.get(error_label)\n", + " ^^^^^^^^^^^^^^^^^^^\n", + "AttributeError: 'PwExitCodes' object has no attribute 'get'\n", + "\n", + "09/04/2025 10:31:09 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181546|WorkGraphEngine|on_task_failed]: Task, pw_calculator, type: PYTHONJOB, failed. Error message: Function execution failed.\n", + "'PwExitCodes' object has no attribute 'get'\n", + "Traceback (most recent call last):\n", + " File \"\", line 41, in main\n", + " File \"/home/xing/repos/superstar54/workgraph-collections/workgraph_collections/ase/espresso/pw.py\", line 196, in pw_calculator\n", + " atoms.get_potential_energy()\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/atoms.py\", line 770, in get_potential_energy\n", + " energy = self._calc.get_potential_energy(self)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/abc.py\", line 24, in get_potential_energy\n", + " return self.get_property(name, atoms)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 141, in get_property\n", + " return super().get_property(name, atoms=atoms, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/calculator.py\", line 538, in get_property\n", + " self.calculate(atoms, [name], system_changes)\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/genericfileio.py\", line 334, in calculate\n", + " self.results = self.template.read_results(self.directory)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 63, in read_results\n", + " exit_code = parser.parse()\n", + " ^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 171, in parse\n", + " exit_code = self.validate_premature_exit(logs_stdout)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 229, in validate_premature_exit\n", + " return self.exit_codes.get(error_label)\n", + " ^^^^^^^^^^^^^^^^^^^\n", + "AttributeError: 'PwExitCodes' object has no attribute 'get'\n", + "\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181546|WorkGraphEngine|on_task_failed]: Task, pw_calculator, type: PYTHONJOB, failed. Error message: Function execution failed.\n", + "'PwExitCodes' object has no attribute 'get'\n", + "Traceback (most recent call last):\n", + " File \"\", line 41, in main\n", + " File \"/home/xing/repos/superstar54/workgraph-collections/workgraph_collections/ase/espresso/pw.py\", line 196, in pw_calculator\n", + " atoms.get_potential_energy()\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/atoms.py\", line 770, in get_potential_energy\n", + " energy = self._calc.get_potential_energy(self)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/abc.py\", line 24, in get_potential_energy\n", + " return self.get_property(name, atoms)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 141, in get_property\n", + " return super().get_property(name, atoms=atoms, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/calculator.py\", line 538, in get_property\n", + " self.calculate(atoms, [name], system_changes)\n", + " File \"/home/xing/apps/miniforge3/envs/aiida/lib/python3.11/site-packages/ase/calculators/genericfileio.py\", line 334, in calculate\n", + " self.results = self.template.read_results(self.directory)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/espresso.py\", line 63, in read_results\n", + " exit_code = parser.parse()\n", + " ^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 171, in parse\n", + " exit_code = self.validate_premature_exit(logs_stdout)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/xing/repos/superstar54/ase-quantumespresso/src/ase_quantumespresso/parsers/pw.py\", line 229, in validate_premature_exit\n", + " return self.exit_codes.get(error_label)\n", + " ^^^^^^^^^^^^^^^^^^^\n", + "AttributeError: 'PwExitCodes' object has no attribute 'get'\n", + "\n", + "09/04/2025 10:31:09 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181546|WorkGraphEngine|run_error_handlers]: Run error handlers for pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181546|WorkGraphEngine|run_error_handlers]: Run error handlers for pw_calculator\n", + "09/04/2025 10:31:12 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181546|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181546|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:31:12 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181546|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181546|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "09/04/2025 10:31:14 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|on_task_failed]: Task, RelaxWorkgraph1, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|on_task_failed]: Task, RelaxWorkgraph1, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "09/04/2025 10:31:14 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|run_error_handlers]: Run error handlers for RelaxWorkgraph1\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|run_error_handlers]: Run error handlers for RelaxWorkgraph1\n", + "09/04/2025 10:31:15 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:31:15 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181530\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 181530\n", + "09/04/2025 10:46:09 AM <1075524> aiida.orm.nodes.process.calculation.calcjob.CalcJobNode: [WARNING] output parser returned exit code<312>: The stdout output file was incomplete probably because the calculation got interrupted.\n", + "WARNING:aiida.orm.nodes.process.calculation.calcjob.CalcJobNode:output parser returned exit code<312>: The stdout output file was incomplete probably because the calculation got interrupted.\n", + "09/04/2025 10:46:09 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181530|WorkGraphEngine|on_task_failed]: Task, pw_calculator, type: PYTHONJOB, failed. Error message: The stdout output file was incomplete probably because the calculation got interrupted.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181530|WorkGraphEngine|on_task_failed]: Task, pw_calculator, type: PYTHONJOB, failed. Error message: The stdout output file was incomplete probably because the calculation got interrupted.\n", + "09/04/2025 10:46:09 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181530|WorkGraphEngine|run_error_handlers]: Run error handlers for pw_calculator\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181530|WorkGraphEngine|run_error_handlers]: Run error handlers for pw_calculator\n", + "09/04/2025 10:46:10 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181530|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181530|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:46:10 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181530|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181530|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "09/04/2025 10:46:11 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|on_task_failed]: Task, RelaxWorkgraph, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|on_task_failed]: Task, RelaxWorkgraph, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['pw_calculator'] failed. Thus all their child tasks are skipped.\n", + "09/04/2025 10:46:11 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|run_error_handlers]: Run error handlers for RelaxWorkgraph\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|run_error_handlers]: Run error handlers for RelaxWorkgraph\n", + "09/04/2025 10:46:12 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:46:12 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181514|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['RelaxWorkgraph', 'RelaxWorkgraph1'] failed. Thus all their child tasks are skipped.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181514|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['RelaxWorkgraph', 'RelaxWorkgraph1'] failed. Thus all their child tasks are skipped.\n", + "09/04/2025 10:46:12 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|on_task_failed]: Task, RelaxSlabs, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['RelaxWorkgraph', 'RelaxWorkgraph1'] failed. Thus all their child tasks are skipped.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|on_task_failed]: Task, RelaxSlabs, type: GRAPH, failed. Error message: WorkGraph finished, but tasks: ['RelaxWorkgraph', 'RelaxWorkgraph1'] failed. Thus all their child tasks are skipped.\n", + "09/04/2025 10:46:12 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|run_error_handlers]: Run error handlers for RelaxSlabs\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|run_error_handlers]: Run error handlers for RelaxSlabs\n", + "09/04/2025 10:46:13 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/04/2025 10:46:13 AM <1075524> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [181419|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['RelaxSlabs'] failed. Thus all their child tasks are skipped.\n", + "REPORT:aiida.orm.nodes.process.workflow.workchain.WorkChainNode:[181419|WorkGraphEngine|is_workgraph_finished]: WorkGraph finished, but tasks: ['RelaxSlabs'] failed. Thus all their child tasks are skipped.\n" + ] + } + ], + "source": [ + "#------------------------- Submit the calculation -------------------\n", + "wg.run()" + ] + }, + { + "cell_type": "markdown", + "id": "5e6352f2", + "metadata": {}, + "source": [ + "Print the results" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -149,22 +372,28 @@ "name": "stdout", "output_type": "stream", "text": [ - "Surface Energy\n", - "slab100 1.4816161652404\n", - "slab111 1.4816131295258\n", - "Surfae Atoms\n", - "slab100 Atoms(symbols='Al3', pbc=True, cell=[[2.8794445061349, 0.0, 0.0], [1.4397222530675, 2.4936720911004, 0.0], [0.0, 0.0, 14.702113144751]])\n", - "slab111 Atoms(symbols='Al3', pbc=True, cell=[[2.8794445061349, 0.0, 0.0], [1.4397222530675, 2.4936720911004, 0.0], [0.0, 0.0, 14.702113144751]])\n" + "Surface Energy\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "'NoneType' object has no attribute 'items'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[3], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSurface Energy\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, E \u001b[38;5;129;01min\u001b[39;00m \u001b[43mwg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutputs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msurface_energy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m():\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(key, E)\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSurfae Atoms\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'items'" ] } ], "source": [ "print(\"Surface Energy\")\n", - "for key, E in wg.tasks[\"get_surface_energy\"].outputs.result.value.items():\n", + "for key, E in wg.outputs.surface_energy.value.items():\n", " print(key, E)\n", "\n", "print(\"Surfae Atoms\")\n", - "for key, slab in wg.tasks[\"relax_slabs\"].outputs.structures.value.items():\n", + "for key, slab in wg.outputs.structures.value.items():\n", " print(key, slab.value)\n", "\n" ] diff --git a/docs/source/ase/espresso/xps.ipynb b/docs/source/ase/espresso/xps.ipynb index cdb4773..7fc1b4a 100644 --- a/docs/source/ase/espresso/xps.ipynb +++ b/docs/source/ase/espresso/xps.ipynb @@ -9,108 +9,15 @@ "For the source code, see [xps](https://workgraph-collections.readthedocs.io/en/latest/ase/espresso/module.html#workgraph_collections.ase.espresso.xps.xps_workgraph).\n", "\n", "\n", - "## Visualizing the WorkGraph Builder\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "6be40ba7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.ase.espresso.xps import xps_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = xps_workgraph.TaskCls()\n", - "task.to_html()\n", - "# task" - ] - }, - { - "cell_type": "markdown", - "id": "9e6360d8", - "metadata": {}, - "source": [ - "## Visualizing the WorkGraph" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.ase.espresso.xps import xps_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "wg = xps_workgraph(marked_structures_inputs={\"element_list\": [\"C\"]})\n", - "wg.to_html()\n", - "# wg" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ "## Example: ETFA molecule\n", "\n", - "### Prepare the inputs and submit the workflow\n" + "### Prepare the inputs and submit the workflow\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ @@ -135,7 +42,7 @@ "source": [ "from ase.io import read\n", "from aiida import load_profile\n", - "from workgraph_collections.ase.espresso.xps import xps_workgraph\n", + "from workgraph_collections.ase.espresso.xps import XpsWorkgraph\n", "\n", "load_profile()\n", "\n", @@ -190,7 +97,7 @@ "}\n", "\n", "# ===============================================================================\n", - "wg = xps_workgraph(\n", + "wg = XpsWorkgraph.build_graph(\n", " atoms=atoms,\n", " marked_structures_inputs={\"atom_list\": [0, 1, 2, 3],\n", " \"min_cell_length\": 14,\n", @@ -200,8 +107,25 @@ " core_hole_pseudos=core_hole_pseudos,\n", " metadata=metadata,\n", ")\n", - "wg.name = \"ASE-espresso-XPS-ETFA\"\n", - "wg.submit(wait=True, timeout=300)" + "wg" + ] + }, + { + "cell_type": "markdown", + "id": "b934e777", + "metadata": {}, + "source": [ + "Run the workflow" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a78771f4", + "metadata": {}, + "outputs": [], + "source": [ + "wg.run()" ] }, { diff --git a/docs/source/qe/bader.ipynb b/docs/source/qe/bader.ipynb index cc496e9..3de2c6a 100644 --- a/docs/source/qe/bader.ipynb +++ b/docs/source/qe/bader.ipynb @@ -9,13 +9,15 @@ "\n", "For the source code, see [bader](https://workgraph-collections.readthedocs.io/en/latest/qe/module.html#workgraph_collections.ase.espresso.bader.bader_workgraph).\n", "\n", - "## Visualizing the WorkGraph" + "## Example: H2O molecule\n", + "\n", + "### Prepare the inputs and submit the workflow\n" ] }, { "cell_type": "code", "execution_count": 1, - "id": "01bedd69", + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -25,7 +27,7 @@ " " + "" ] }, "execution_count": 1, @@ -41,35 +43,12 @@ "output_type": "execute_result" } ], - "source": [ - "from workgraph_collections.qe.bader import bader_workgraph\n", - "\n", - "wg = bader_workgraph.get_graph()\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: H2O molecule\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [], "source": [ "from aiida import load_profile\n", "from aiida.orm import Dict, KpointsData, StructureData, load_code\n", "from aiida_pseudo.data.pseudo import UpfData\n", "from ase.build import molecule\n", - "from workgraph_collections.qe.bader import bader_workgraph\n", + "from workgraph_collections.qe.bader import BaderWorkgraph\n", "\n", "\n", "load_profile()\n", @@ -143,9 +122,10 @@ " }\n", "}\n", "# prepare inputs and submit\n", - "wg = bader_workgraph.get_graph(structure=structure, pw_code=pw_code,\n", + "wg = BaderWorkgraph.build_graph(structure=structure, pw_code=pw_code,\n", " pp_code=pp_code, bader_code=bader_code,\n", - " inputs=inputs)\n" + " inputs=inputs)\n", + "wg.to_html()" ] }, { @@ -153,15 +133,36 @@ "id": "21537606", "metadata": {}, "source": [ - "Submit the WorkGraph:\n" + "Run the WorkGraph:\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "5a935c67", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/02/2025 01:54:31 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwBaseWorkChain\n", + "09/02/2025 01:54:32 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175332\n", + "09/02/2025 01:54:39 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175332|PwBaseWorkChain|run_process]: launching PwCalculation<175335> iteration #1\n", + "09/02/2025 01:54:52 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175332|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", + "09/02/2025 01:54:52 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175332|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:54:53 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|update_task_state]: Task: PwBaseWorkChain, type: WORKCHAIN, finished.\n", + "09/02/2025 01:54:58 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|continue_workgraph]: tasks ready to run: PpCalculation,PpCalculation1\n", + "09/02/2025 01:55:01 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175341, 175342\n", + "09/02/2025 01:55:16 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|update_task_state]: Task: PpCalculation1, type: CALCJOB, finished.\n", + "09/02/2025 01:55:17 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|update_task_state]: Task: PpCalculation, type: CALCJOB, finished.\n", + "09/02/2025 01:55:23 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|continue_workgraph]: tasks ready to run: BaderCalculation\n", + "09/02/2025 01:55:25 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175353\n", + "09/02/2025 01:55:35 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|update_task_state]: Task: BaderCalculation, type: CALCJOB, finished.\n", + "09/02/2025 01:55:40 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 01:55:41 PM <1365991> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175329|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -175,7 +176,7 @@ } ], "source": [ - "wg.submit(wait=True, timeout=300)\n", + "wg.run()\n", "\n", "#------------------------- Print the output -------------------------\n", "charges = wg.outputs.bader_charge.value.get_array(\"charge\")\n", diff --git a/docs/source/qe/bands.ipynb b/docs/source/qe/bands.ipynb index 316fea5..8d97422 100644 --- a/docs/source/qe/bands.ipynb +++ b/docs/source/qe/bands.ipynb @@ -6,64 +6,23 @@ "metadata": {}, "source": [ "# Bands Structure\n", - "For the source code, see [bands](https://workgraph-collections.readthedocs.io/en/latest/qe/module.html#workgraph_collections.ase.espresso.bands.bands_workgraph).\n", - "\n", - "## Introduction\n", - "\n", - "## Visualizing the WorkGraph Builder\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c052509f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.qe.bands import bands_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = bands_workgraph.TaskCls()\n", - "task.to_html()" + "For the source code, see [bands](https://workgraph-collections.readthedocs.io/en/latest/qe/module.html#workgraph_collections.ase.espresso.bands.bands_workgraph).\n" ] }, { "cell_type": "markdown", - "id": "9e6360d8", + "id": "efa095d0", "metadata": {}, "source": [ - "## Visualizing the WorkGraph" + "## Example: Silicon band structure\n", + "### Prepare the inputs and visualize the WorkGraph\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", + "execution_count": 1, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -73,7 +32,7 @@ " " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.qe.bands import bands_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "wg = bands_workgraph(run_relax=True)\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: Silicon band structure\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 19490\n" - ] - }, - { - "data": { - "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -136,14 +53,14 @@ "from aiida import load_profile\n", "from aiida.orm import Dict, KpointsData, StructureData, load_code\n", "from ase.build import bulk\n", - "from workgraph_collections.qe.bands import bands_workgraph\n", + "from workgraph_collections.qe.bands import BandsWorkgraph\n", "\n", "load_profile()\n", "\n", "atoms = bulk('Si')\n", "structure_si = StructureData(ase=atoms)\n", "\n", - "pw_code = load_code('qe-7.2-pw@localhost')\n", + "pw_code = load_code('pw-7.4@localhost')\n", "scf_paras = {\n", " 'CONTROL': {\n", " 'calculation': 'scf',\n", @@ -199,7 +116,7 @@ " },\n", "}\n", "\n", - "wg = bands_workgraph(\n", + "wg = BandsWorkgraph.build_graph(\n", " structure=structure_si,\n", " code=pw_code,\n", " inputs=bands_inputs,\n", @@ -207,8 +124,70 @@ " run_relax=True,\n", " bands_kpoints_distance=0.1,\n", ")\n", - "#------------------------- Submit the calculation -------------------\n", - "wg.submit(wait=True, timeout=300)\n" + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "83f8b2ad", + "metadata": {}, + "source": [ + "## Run the WorkGraph" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9dbe9a7a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/02/2025 01:00:02 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwRelaxWorkChain\n", + "09/02/2025 01:00:03 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175117\n", + "09/02/2025 01:00:09 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175117|PwRelaxWorkChain|run_relax]: launching PwBaseWorkChain<175120>\n", + "09/02/2025 01:00:09 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175120|PwBaseWorkChain|run_process]: launching PwCalculation<175123> iteration #1\n", + "09/02/2025 01:00:24 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175120|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", + "09/02/2025 01:00:24 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175120|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:00:24 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175117|PwRelaxWorkChain|inspect_relax]: after iteration 1 cell volume of relaxed structure is 40.9225595043556\n", + "09/02/2025 01:00:25 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175117|PwRelaxWorkChain|run_relax]: launching PwBaseWorkChain<175132>\n", + "09/02/2025 01:00:25 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175132|PwBaseWorkChain|run_process]: launching PwCalculation<175135> iteration #1\n", + "09/02/2025 01:00:33 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175132|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", + "09/02/2025 01:00:33 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175132|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:00:33 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175117|PwRelaxWorkChain|inspect_relax]: after iteration 2 cell volume of relaxed structure is 40.92255896569323\n", + "09/02/2025 01:00:33 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175117|PwRelaxWorkChain|inspect_relax]: relative cell volume difference 1.3162968698541411e-08 smaller than threshold 0.01\n", + "09/02/2025 01:00:33 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175117|PwRelaxWorkChain|results]: workchain completed after 2 iterations\n", + "09/02/2025 01:00:34 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175117|PwRelaxWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:00:34 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|update_task_state]: Task: PwRelaxWorkChain, type: WORKCHAIN, finished.\n", + "09/02/2025 01:00:42 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: inspect_relax,seekpath_structure_analysis\n", + "09/02/2025 01:00:43 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|update_task_state]: Task: inspect_relax, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:00:44 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: seekpath_structure_analysis,update_scf_parameters\n", + "09/02/2025 01:00:45 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|update_task_state]: Task: seekpath_structure_analysis, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:00:46 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: update_scf_parameters\n", + "09/02/2025 01:00:47 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|update_task_state]: Task: update_scf_parameters, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:00:48 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwBaseWorkChain\n", + "09/02/2025 01:00:50 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175153\n", + "09/02/2025 01:00:55 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175153|PwBaseWorkChain|run_process]: launching PwCalculation<175156> iteration #1\n", + "09/02/2025 01:01:00 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175153|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", + "09/02/2025 01:01:00 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175153|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:01:01 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|update_task_state]: Task: PwBaseWorkChain, type: WORKCHAIN, finished.\n", + "09/02/2025 01:01:07 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: update_bands_parameters\n", + "09/02/2025 01:01:08 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|update_task_state]: Task: update_bands_parameters, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:01:08 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwBaseWorkChain1\n", + "09/02/2025 01:01:10 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175166\n", + "09/02/2025 01:01:15 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175166|PwBaseWorkChain|run_process]: launching PwCalculation<175169> iteration #1\n", + "09/02/2025 01:01:22 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175166|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", + "09/02/2025 01:01:22 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175166|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:01:23 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|update_task_state]: Task: PwBaseWorkChain1, type: WORKCHAIN, finished.\n", + "09/02/2025 01:01:28 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 01:01:30 PM <1272331> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175111|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ + "wg.run()" ] }, { @@ -221,23 +200,23 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "3defa20f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(
, )" + "(
, )" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -249,14 +228,14 @@ "source": [ "from workgraph_collections.qe.utils import plot_bandstructure\n", " \n", - "bands = wg.tasks[\"bands\"].outputs[\"output_band\"].value\n", + "bands = wg.outputs.output_band.value\n", "plot_bandstructure(bands)" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -270,12 +249,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.0" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } + "version": "3.11.0" } }, "nbformat": 4, diff --git a/docs/source/qe/eos.ipynb b/docs/source/qe/eos.ipynb index b5ef60d..32f137b 100644 --- a/docs/source/qe/eos.ipynb +++ b/docs/source/qe/eos.ipynb @@ -8,15 +8,14 @@ "# Equation of state (EOS)\n", "For the source code, see [eos](https://workgraph-collections.readthedocs.io/en/latest/qe/module.html#workgraph_collections.ase.espresso.eos.eos_workgraph).\n", "\n", - "## Visualizing the WorkGraph Builder\n", - "\n", - "\n" + "## Example: Silicon\n", + "### Prepare the inputs and visualize the WorkGraph" ] }, { "cell_type": "code", "execution_count": 1, - "id": "b25d223b", + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -26,7 +25,7 @@ " " + "" ] }, "execution_count": 1, @@ -42,104 +41,15 @@ "output_type": "execute_result" } ], - "source": [ - "from workgraph_collections.qe.eos import eos_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = eos_workgraph.TaskCls()\n", - "task.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "f226a175", - "metadata": {}, - "source": [ - "\n", - "## Visualizing the WorkGraph" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.qe.eos import eos_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "wg = eos_workgraph()\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: Silicon\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 54748\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ "from aiida import load_profile, orm\n", "from ase.build import bulk\n", - "from workgraph_collections.qe.eos import eos_workgraph\n", + "from workgraph_collections.qe.eos import EosWorkgraph\n", "\n", "load_profile()\n", "\n", "structure = orm.StructureData(ase=bulk(\"Si\"))\n", - "code = orm.load_code(\"qe-7.2-pw@localhost\")\n", + "code = orm.load_code(\"pw-7.4@localhost\")\n", "parameters = {\n", " \"CONTROL\": {\n", " \"calculation\": \"scf\",\n", @@ -168,7 +78,7 @@ "}\n", "\n", "# ===============================================================================\n", - "wg = eos_workgraph(\n", + "wg = EosWorkgraph.build_graph(\n", " structure=structure,\n", " code=code,\n", " scales=[0.98, 0.99, 1.0, 1.01, 1.02],\n", @@ -177,9 +87,52 @@ " pseudos=pseudos,\n", " metadata=metadata,\n", ")\n", - "wg.name = \"QE-EOS-Si\"\n", - "#------------------------- Submit the calculation -------------------\n", - "wg.submit(wait=True, timeout=300)\n" + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "4e61ea35", + "metadata": {}, + "source": [ + "### Run the workflow" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "99092862", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/02/2025 01:10:17 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|continue_workgraph]: tasks ready to run: scale_structure\n", + "09/02/2025 01:10:17 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|update_task_state]: Task: scale_structure, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:10:17 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|continue_workgraph]: tasks ready to run: all_scf\n", + "09/02/2025 01:10:19 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175190\n", + "09/02/2025 01:10:21 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4\n", + "09/02/2025 01:10:23 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175191, 175192, 175193, 175194, 175195\n", + "09/02/2025 01:10:37 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", + "09/02/2025 01:10:39 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 01:10:39 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175192, 175193, 175194, 175195\n", + "09/02/2025 01:10:48 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", + "09/02/2025 01:10:48 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", + "09/02/2025 01:10:48 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", + "09/02/2025 01:10:49 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", + "09/02/2025 01:10:50 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 01:10:51 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175190|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/02/2025 01:10:51 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|update_task_state]: Task: all_scf, type: GRAPH, finished.\n", + "09/02/2025 01:10:52 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|continue_workgraph]: tasks ready to run: fit_eos\n", + "09/02/2025 01:10:52 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|update_task_state]: Task: fit_eos, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:10:52 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 01:10:52 PM <1293550> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175182|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ + "wg.run()" ] }, { @@ -192,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "id": "64c3f175", "metadata": {}, "outputs": [ @@ -202,7 +155,7 @@ "text": [ "\n", "Result: \n", - "B: 83.930472220007\n", + "B: 83.930472220061\n", "v0: 40.947349586558\n", "e0: -308.18973212512\n", "v0: 40.947349586558\n" @@ -211,14 +164,14 @@ ], "source": [ "#------------------------- Print the output -------------------------\n", - "data = wg.tasks[\"fit_eos\"].outputs[\"result\"].value.get_dict()\n", + "data = wg.outputs.result.value.get_dict()\n", "print('\\nResult: \\nB: {B}\\nv0: {v0}\\ne0: {e0}\\nv0: {v0}'.format(**data))\n" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -233,11 +186,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } } }, "nbformat": 4, diff --git a/docs/source/qe/html/BaderWorkgraph.html b/docs/source/qe/html/BaderWorkgraph.html new file mode 100644 index 0000000..133df7f --- /dev/null +++ b/docs/source/qe/html/BaderWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/qe/html/BandsWorkgraph.html b/docs/source/qe/html/BandsWorkgraph.html new file mode 100644 index 0000000..91f12fe --- /dev/null +++ b/docs/source/qe/html/BandsWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/qe/html/EosWorkgraph.html b/docs/source/qe/html/EosWorkgraph.html new file mode 100644 index 0000000..bca2cca --- /dev/null +++ b/docs/source/qe/html/EosWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/qe/html/PdosWorkGraph.html b/docs/source/qe/html/PdosWorkGraph.html new file mode 100644 index 0000000..58226c5 --- /dev/null +++ b/docs/source/qe/html/PdosWorkGraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/qe/html/XpsWorkgraph.html b/docs/source/qe/html/XpsWorkgraph.html new file mode 100644 index 0000000..ec846be --- /dev/null +++ b/docs/source/qe/html/XpsWorkgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/qe/html/eos_workgraph.html b/docs/source/qe/html/eos_workgraph.html new file mode 100644 index 0000000..f7fa31b --- /dev/null +++ b/docs/source/qe/html/eos_workgraph.html @@ -0,0 +1,290 @@ + + + + + + + Rete.js with React in Vanilla JS + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/docs/source/qe/pdos.ipynb b/docs/source/qe/pdos.ipynb index 6fa5e86..6fc5984 100644 --- a/docs/source/qe/pdos.ipynb +++ b/docs/source/qe/pdos.ipynb @@ -8,61 +8,15 @@ "# Projected density of states (PDOS)\n", "For the source code, see [pdos](https://workgraph-collections.readthedocs.io/en/latest/qe/module.html#workgraph_collections.ase.espresso.pdos.pdos_workgraph).\n", "\n", + "## Example: Silicon\n", "\n", - "## Visualizing the WorkGraph Builder\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "10a0fe13", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.qe.pdos import pdos_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = pdos_workgraph.TaskCls()\n", - "task.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "0ce77a97", - "metadata": {}, - "source": [ - "## Visualizing the WorkGraph" + "### Prepare the inputs " ] }, { "cell_type": "code", - "execution_count": 5, - "id": "01bedd69", + "execution_count": 1, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -72,7 +26,7 @@ " " + "" ] }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.qe.pdos import pdos_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "wg = pdos_workgraph(run_relax=True, run_scf=True)\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: Silicon\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WorkGraph process created, PK: 98639\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 15, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -137,16 +48,16 @@ "from aiida.orm import Dict, KpointsData, StructureData, load_code, load_group\n", "from ase.build import bulk\n", "\n", - "from workgraph_collections.qe.pdos import pdos_workgraph\n", + "from workgraph_collections.qe.pdos import PdosWorkGraph\n", "\n", "load_profile()\n", "\n", "atoms = bulk('Si')\n", "structure_si = StructureData(ase=atoms)\n", "\n", - "pw_code = load_code('qe-7.2-pw@localhost')\n", - "dos_code = load_code('qe-7.2-dos@localhost')\n", - "projwfc_code = load_code('qe-7.2-projwfc@localhost')\n", + "pw_code = load_code('pw-7.4@localhost')\n", + "dos_code = load_code('dos-7.4@localhost')\n", + "projwfc_code = load_code('projwfc-7.4@localhost')\n", "paras = {\n", " 'CONTROL': {\n", " 'calculation': 'scf',\n", @@ -200,7 +111,7 @@ " },\n", "}\n", "\n", - "wg = pdos_workgraph(structure=structure_si,\n", + "wg = PdosWorkGraph.build_graph(structure=structure_si,\n", " pw_code=pw_code,\n", " dos_code=dos_code,\n", " projwfc_code=projwfc_code,\n", @@ -208,8 +119,56 @@ " pseudo_family='SSSP/1.3/PBEsol/efficiency',\n", " run_scf=True,\n", " )\n", - "wg.name = 'scf_and_pdos'\n", - "wg.submit(wait=True)\n" + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "38c5209d", + "metadata": {}, + "source": [ + "### Run the WorkGraph" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5d11d672", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/02/2025 01:37:54 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwBaseWorkChain\n", + "09/02/2025 01:37:56 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175282\n", + "09/02/2025 01:38:05 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175282|PwBaseWorkChain|run_process]: launching PwCalculation<175285> iteration #1\n", + "09/02/2025 01:38:13 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175282|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", + "09/02/2025 01:38:13 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175282|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:38:14 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|update_task_state]: Task: PwBaseWorkChain, type: WORKCHAIN, finished.\n", + "09/02/2025 01:38:23 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwBaseWorkChain1\n", + "09/02/2025 01:38:26 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175293\n", + "09/02/2025 01:38:34 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175293|PwBaseWorkChain|run_process]: launching PwCalculation<175296> iteration #1\n", + "09/02/2025 01:38:40 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175293|PwBaseWorkChain|results]: work chain completed after 1 iterations\n", + "09/02/2025 01:38:41 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175293|PwBaseWorkChain|on_terminated]: remote folders will not be cleaned\n", + "09/02/2025 01:38:42 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|update_task_state]: Task: PwBaseWorkChain1, type: WORKCHAIN, finished.\n", + "09/02/2025 01:38:50 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|continue_workgraph]: tasks ready to run: generate_dos_parameters,generate_projwfc_parameters\n", + "09/02/2025 01:38:52 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|update_task_state]: Task: generate_dos_parameters, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:38:53 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|continue_workgraph]: tasks ready to run: DosCalculation,generate_projwfc_parameters\n", + "09/02/2025 01:38:56 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|update_task_state]: Task: generate_projwfc_parameters, type: CALCFUNCTION, finished.\n", + "09/02/2025 01:38:56 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|continue_workgraph]: tasks ready to run: ProjwfcCalculation\n", + "09/02/2025 01:38:59 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175304, 175307\n", + "/home/xing/repos/aiidateam/aiida-core/src/aiida/plugins/entry_point.py:351: AiidaDeprecationWarning: The entry point `realhydrogen` is deprecated. Please replace it with `core.realhydrogen`. (this will be removed in v3)\n", + " warn_deprecation(f'The entry point `{name}` is deprecated. Please replace it with `core.{name}`.', version=3)\n", + "09/02/2025 01:39:16 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|update_task_state]: Task: ProjwfcCalculation, type: CALCJOB, finished.\n", + "09/02/2025 01:39:16 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|update_task_state]: Task: DosCalculation, type: CALCJOB, finished.\n", + "09/02/2025 01:39:25 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 01:39:26 PM <1340270> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175279|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + } + ], + "source": [ + "wg.run()" ] }, { @@ -222,23 +181,23 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 3, "id": "bd0ea563", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 16, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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ft3ixYt7PKZ33HFHkFYdWGvXrsWIESMQERGBefPmYdeuXf3efsOGDRg/fjwiIiIwZcoUfPLJJ0FaafA8/vjjmDNnDmJjY5GWloYrr7wSBQUF/X7N+vXrezxHIiIigrTi4Pr973/f42cdP358v18TDs8boPfrryAIuPPOO3u9vdafN9988w0uv/xyZGVlQRAEfPDBB10+L4oiHnroIWRmZiIyMhJLly5FYWHhgN/X2+uWWvX3+FitVtx///2YMmUKoqOjkZWVhZtuugllZWX9fk9f/n1qHYNJHz366KMoLy+X//zsZz/r9/b33nsv/u///g8bNmzA5s2bUVZWhquvvjpIqw2eY8eOweFw4K9//Svy8/Px3HPP4cUXX8RvfvObAb/21ltv7fKYPvXUU0FYcWC9/fbbuO+++/Dwww9j3759mDZtGpYvX46qqqpeb79t2zZcf/31WLNmDfbv348rr7wSV155JQ4fPhzklQfW5s2bceedd2LHjh34/PPPYbVasWzZMrS2tvb7dXFxcV2eI8XFxUFacfBNmjSpy8/67bff9nnbcHneAMDu3bu7PC6ff/45AODaa6/t82u0/LxpbW3FtGnTsHbt2l4//9RTT+GPf/wjXnzxRezcuRPR0dFYvnw5LBZLn9/T2+uWmvX3+LS1tWHfvn343e9+h3379uG9995DQUEBVqxYMeD39ebfZ1gQyWu5ubnic889N+jbNzQ0iEajUdywYYP8saNHj4oAxO3btwdghery1FNPiXl5ef3eZtGiReLdd98dnAUF0dy5c8U777xT/rvdbhezsrLExx9/vNfbr1y5Urz00ku7fGzevHni7bffHtB1Kq2qqkoEIG7evLnP26xbt06Mj48P3qIU9PDDD4vTpk0b9O3D9XkjiqJ49913i6NGjRIdDkevnw+n5w0A8f3335f/7nA4xIyMDPHpp5+WP9bQ0CCazWbxzTff7PP7eHvdChXdH5/e7Nq1SwQgFhcX93kbb/99hgNmJn30xBNPIDk5GTNmzMDTTz8Nm83W52337t0Lq9WKpUuXyh8bP348hg8fju3btwdjuYpqbGxEUlLSgLd7/fXXkZKSgsmTJ+PXv/412tragrC6wOns7MTevXu7/N51Oh2WLl3a5+99+/btXW4PAMuXL9f886SxsREABnyetLS0IDc3Fzk5ObjiiiuQn58fjOUp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", + "image/png": "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/X7d4sWLezymd9xxR5BWHVhr167FiBEjEBERgXnz5mHXrl393n7Dhg0YP348IiIiMGXKFHzyySdBWmnwPP7445gzZw5iY2ORlpaGK6+8EgUFBf1+zfr163s8RyIiIoK04uD6/e9/3+NnHT9+fL9fEw7PG6D3668gCLjzzjt7vb3WnzfffPMNLr/8cmRlZUEQBHzwwQddPi+KIh566CFkZmYiMjISS5cuRWFh4YDf19vrllr19/hYrVbcf//9mDJlCqKjo5GVlYWbbroJZWVl/X5PX/59ah2DSR89+uijKC8vl//87Gc/6/f29957L/7v//4PGzZswObNm1FWVoarr746SKsNnmPHjsHhcOCvf/0r8vPz8dxzz+HFF1/Eb37zmwG/9tZbb+3ymD711FNBWHFgvf3227jvvvvw8MMPY9++fZg2bRqWL1+OqqqqXm+/bds2XH/99VizZg3279+PK6+8EldeeSUOHz4c5JUH1ubNm3HnnXdix44d+Pzzz2G1WrFs2TK0trb2+3VxcXFdniPFxcVBWnHwTZo0qcvP+u233/Z523B53gDA7t27uzwun3/+OQDg2muv7fNrtPy8aW1txbRp07B27dpeP//UU0/hj3/8I1588UXs3LkT0dHRWL58OSwWS5/f09vrlpr19/i0tbVh3759+N3vfod9+/bhvffeQ0FBAVasWDHg9/Xm32dYEMlrubm54nPPPTfo2zc0NIhGo1HcsGGD/LGjR4+KAMTt27cHYIXq8tRTT4l5eXn93mbRokXi3XffHZwFBdHcuXPFO++8U/673W4Xs7KyxMcff7zX269cuVK89NJLu3xs3rx54u233x7QdSqtqqpKBCBu3ry5z9usW7dOjI+PD96iFPTwww+L06ZNG/Ttw/V5I4qiePfdd4ujRo0SHQ5Hr58Pp+cNAPH999+X/+5wOMSMjAzx6aeflj/W0NAgms1m8c033+zz+3h73QoV3R+f3uzatUsEIBYXF/d5G2//fYYDZiZ99MQTTyA5ORkzZszA008/DZvN1udt9+7dC6vViqVLl8ofGz9+PIYPH47t27cHY7mKamxsRFJS0oC3e/3115GSkoLJkyfj17/+Ndra2oKwusDp7OzE3r17u/zedTodli5d2ufvffv27V1uDwDLly/X/POksbERAAZ8nrS0tCA3Nxc5OTm44oorkJ+fH4zlKaKwsBBZWVkYOXIkbrjhBpSUlPR523B93nR2duK1117DLbfcAkEQ+rxdOD1vPJ0+fRoVFRVdnhvx8fGYN29en88NX65bWtLY2AhBEJCQkNDv7bz59xkODEovIBT9/Oc/x8yZM5GUlIRt27bh17/+NcrLy/Hss8/2evuKigqYTKYeT8709HRUVFQEYcXKOXHiBP70pz/hmWee6fd2P/jBD5Cbm4usrCwcOnQI999/PwoKCvDee+8FaaX+V1NTA7vdjvT09C4fT09Px7Fjx3r9moqKil5vr+XnicPhwD333INzzjkHkydP7vN248aNw0svvYSpU6eisbERzzzzDBYuXIj8/HxkZ2cHccWBN2/ePKxfvx7jxo1DeXk5HnnkEZx33nk4fPgwYmNje9w+HJ83APDBBx+goaEBq1ev7vM24fS86U76/Xvz3PDluqUVFosF999/P66//nrExcX1eTtv/32GAwaTLg888ACefPLJfm9z9OhRjB8/Hvfdd5/8salTp8JkMuH222/H448/rtkjmLx5fCRnz57FxRdfjGuvvRa33nprv1972223yf8/ZcoUZGZm4sILL8TJkycxatSooS2eVO3OO+/E4cOHB9xztGDBAixYsED++8KFCzFhwgT89a9/xX//938HeplBdckll8j/P3XqVMybNw+5ubl45513sGbNGgVXpi7//Oc/cckllyArK6vP24TT84Z8Z7VasXLlSoiiiBdeeKHf2/LfZ08MJl1+8Ytf9PvuFgBGjhzZ68fnzZsHm82GoqIijBs3rsfnMzIy0NnZiYaGhi7ZycrKSmRkZAxl2UHj7eNTVlaGJUuWYOHChfjb3/7m9f3NmzcPgDOzGarBZEpKCvR6fY+u/f5+7xkZGV7dPtTddddd+Pe//41vvvnG6yyR0WjEjBkzcOLEiQCtTj0SEhIwduzYPn/WcHveAEBxcTG++OILr6sX4fS8kX7/lZWVyMzMlD9eWVmJ6dOn9/o1vly3Qp0USBYXF+Orr77qNyvZm4H+fYYD7pl0SU1Nxfjx4/v9YzKZev3aAwcOQKfTIS0trdfPz5o1C0ajEV9++aX8sYKCApSUlHR5x6xm3jw+Z8+exeLFizFr1iysW7cOOp33T7MDBw4AQJcLYKgxmUyYNWtWl9+7w+HAl19+2efvfcGCBV1uDwCff/55yDxPBksURdx11114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", "text/plain": [ "
" ] @@ -251,7 +210,7 @@ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "#------------------------- Print the output -------------------------\n", - "dos_data = wg.tasks['dos'].outputs[\"output_dos\"].value\n", + "dos_data = wg.outputs.dos.output_dos.value\n", "# pdos_data = wg.tasks['projwfc'].outputs[\"results\"].value.value\n", "# make plots\n", "plt.figure(figsize = (8, 4))\n", @@ -265,19 +224,11 @@ "plt.ylabel('DOS')\n", "plt.legend(frameon=False)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0d11bf81", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -292,11 +243,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } } }, "nbformat": 4, diff --git a/docs/source/qe/xps.ipynb b/docs/source/qe/xps.ipynb index 879ddcd..697a61f 100644 --- a/docs/source/qe/xps.ipynb +++ b/docs/source/qe/xps.ipynb @@ -12,56 +12,20 @@ "## Visualizing the WorkGraph Builder\n" ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "6be40ba7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from workgraph_collections.qe.xps import xps_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "task = xps_workgraph.TaskCls()\n", - "task.to_html()" - ] - }, { "cell_type": "markdown", - "id": "9e6360d8", + "id": "efa095d0", "metadata": {}, "source": [ - "## Visualizing the WorkGraph" + "## Example: ETFA molecule\n", + "\n", + "### Prepare the inputs and submit the workflow\n" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "01bedd69", + "execution_count": 1, + "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", "metadata": {}, "outputs": [ { @@ -71,7 +35,7 @@ " " + "" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "from workgraph_collections.qe.xps import xps_workgraph\n", - "from aiida import load_profile\n", - "load_profile()\n", - "\n", - "wg = xps_workgraph()\n", - "wg.to_html()" - ] - }, - { - "cell_type": "markdown", - "id": "efa095d0", - "metadata": {}, - "source": [ - "## Example: ETFA molecule\n", - "\n", - "### Prepare the inputs and submit the workflow\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8ee799d2-0b5b-4609-957f-6b3f2cd451f0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "core_hole_pseudos dict_keys(['core_hole', 'gipaw'])\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:12 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56762|WorkGraphEngine|continue_workgraph]: Continue workgraph.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Continue workgraph.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:12 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56762|WorkGraphEngine|continue_workgraph]: nodes ready to run: marked_structures\n", - "06/10/2024 07:36:12 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56762|WorkGraphEngine|run_nodes]: Run node: marked_structures, type: CALCFUNCTION\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------------------\n", - "executor: \n", - "args: []\n", - "kwargs: {'structure': }\n", - "var_kwargs: {'absorbing_elements_list': , 'is_molecule_input': }\n", - "node type: calcfunction/workfunction.\n", - "link_label: supercell uuid: 8702053c-59d8-4d45-8648-bba6c7e55679 (unstored)\n", - "link_label: output_parameters uuid: dd789b6d-bf57-42f1-ba62-cd9beb90d56c (unstored)\n", - "link_label: marked_structures__site_0 uuid: f2bde682-dfb9-4f85-84df-8b6fefc41d4c (unstored)\n", - "link_label: marked_structures__site_1 uuid: ded5fe01-ed43-4cd1-ac41-78da08195e25 (unstored)\n", - "link_label: marked_structures__site_2 uuid: 9c11afc3-1865-442d-94c5-c5d8b6bd9af6 (unstored)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:13 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56762|WorkGraphEngine|run_nodes]: Node: marked_structures finished.\n", - "06/10/2024 07:36:13 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56762|WorkGraphEngine|continue_workgraph]: Continue workgraph.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "link_label: marked_structures__site_3 uuid: 50ffdefc-1a14-4a9e-b9a6-aadb3250453f (unstored)\n", - "Continue workgraph.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:13 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56762|WorkGraphEngine|continue_workgraph]: nodes ready to run: run_scf\n", - "06/10/2024 07:36:13 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56762|WorkGraphEngine|run_nodes]: Run node: run_scf, type: graph_builder\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------------------\n", - "executor: \n", - "args: []\n", - "kwargs: {'structure': , 'code': , 'parameters': , 'kpoints': , 'pseudos': {'C': , 'F': , 'H': , 'O': }, 'core_hole_pseudos': {'core_hole': {'Al': , 'Au': , 'C': , 'Co': , 'Cu': , 'F': , 'O': , 'Pt': , 'Si': }, 'gipaw': {'Al': , 'Au': , 'C': , 'Co': , 'Cu': , 'F': , 'O': , 'Pt': , 'Si': , 'W': }}, 'core_hole_treatment': 'xch', 'is_molecule': True, 'metadata': {'options': {'custom_scheduler_commands': '#SBATCH --account=mr32', 'resources': {'num_machines': 1, 'num_mpiprocs_per_machine': 36}}}}\n", - "var_kwargs: {'supercell': , 'output_parameters': , 'marked_structures': {'site_0': , 'site_1': , 'site_2': , 'site_3': }}\n", - "node type: graph_builder.\n", - "var_kwargs: {'supercell': , 'output_parameters': , 'marked_structures': {'site_0': , 'site_1': , 'site_2': , 'site_3': }}\n", - "sites_info {'site_0': {'symbol': 'C', 'site_index': 0, 'multiplicity': 1, 'equivalent_sites_list': [0]}, 'site_1': {'symbol': 'C', 'site_index': 1, 'multiplicity': 1, 'equivalent_sites_list': [1]}, 'site_2': {'symbol': 'C', 'site_index': 2, 'multiplicity': 1, 'equivalent_sites_list': [2]}, 'site_3': {'symbol': 'C', 'site_index': 3, 'multiplicity': 1, 'equivalent_sites_list': [3]}}\n", - "WorkGraph process created, PK: 56782\n", - "submit workgraph: \n", - "node: binding_energy CREATED\n", - "node: marked_structures FINISHED\n", - "node: run_scf RUNNING\n", - "is workgraph finished: False\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:18 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56782|WorkGraphEngine|continue_workgraph]: Continue workgraph.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Continue workgraph.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:18 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56782|WorkGraphEngine|continue_workgraph]: nodes ready to run: ground,pw_excited_site_0,pw_excited_site_1,pw_excited_site_2,pw_excited_site_3\n", - "06/10/2024 07:36:18 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56782|WorkGraphEngine|run_nodes]: Run node: ground, type: CALCJOB\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------------------\n", - "executor: \n", - "args: [, , {'C': , 'F': , 'H': , 'O': }, ]\n", - "kwargs: {'metadata': {'options': {'custom_scheduler_commands': '#SBATCH --account=mr32', 'resources': {'num_machines': 1, 'num_mpiprocs_per_machine': 36}}}, 'code': , 'structure': , 'parameters': , 'pseudos': {'C': , 'F': , 'H': , 'O': }, 'kpoints': }\n", - "var_kwargs: None\n", - "node type: calcjob/workchain.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:19 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56782|WorkGraphEngine|run_nodes]: Run node: pw_excited_site_0, type: CALCJOB\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------------------\n", - "executor: \n", - "args: [, , {'C': , 'F': , 'H': , 'O': , 'X': }, ]\n", - "kwargs: {'metadata': {'options': {'custom_scheduler_commands': '#SBATCH --account=mr32', 'resources': {'num_machines': 1, 'num_mpiprocs_per_machine': 36}}}, 'code': , 'settings': , 'structure': , 'parameters': , 'pseudos': {'C': , 'F': , 'H': , 'O': , 'X': }, 'kpoints': }\n", - "var_kwargs: None\n", - "node type: calcjob/workchain.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:19 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56782|WorkGraphEngine|run_nodes]: Run node: pw_excited_site_1, type: CALCJOB\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------------------\n", - "executor: \n", - "args: [, , {'C': , 'F': , 'H': , 'O': , 'X': }, ]\n", - "kwargs: {'metadata': {'options': {'custom_scheduler_commands': '#SBATCH --account=mr32', 'resources': {'num_machines': 1, 'num_mpiprocs_per_machine': 36}}}, 'code': , 'settings': , 'structure': , 'parameters': , 'pseudos': {'C': , 'F': , 'H': , 'O': , 'X': }, 'kpoints': }\n", - "var_kwargs: None\n", - "node type: calcjob/workchain.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:19 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56782|WorkGraphEngine|run_nodes]: Run node: pw_excited_site_2, type: CALCJOB\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------------------\n", - "executor: \n", - "args: [, , {'C': , 'F': , 'H': , 'O': , 'X': }, ]\n", - "kwargs: {'metadata': {'options': {'custom_scheduler_commands': '#SBATCH --account=mr32', 'resources': {'num_machines': 1, 'num_mpiprocs_per_machine': 36}}}, 'code': , 'settings': , 'structure': , 'parameters': , 'pseudos': {'C': , 'F': , 'H': , 'O': , 'X': }, 'kpoints': }\n", - "var_kwargs: None\n", - "node type: calcjob/workchain.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "06/10/2024 07:36:20 AM <756097> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [56782|WorkGraphEngine|run_nodes]: Run node: pw_excited_site_3, type: CALCJOB\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------------------------------------------\n", - "executor: \n", - "args: [, , {'C': , 'F': , 'H': , 'O': , 'X': }, ]\n", - "kwargs: {'metadata': {'options': {'custom_scheduler_commands': '#SBATCH --account=mr32', 'resources': {'num_machines': 1, 'num_mpiprocs_per_machine': 36}}}, 'code': , 'settings': , 'structure': , 'parameters': , 'pseudos': {'C': , 'F': , 'H': , 'O': , 'X': }, 'kpoints': }\n", - "var_kwargs: None\n", - "node type: calcjob/workchain.\n", - "node: ground RUNNING\n", - "node: pw_excited_site_0 RUNNING\n", - "node: pw_excited_site_1 RUNNING\n", - "node: pw_excited_site_2 RUNNING\n", - "node: pw_excited_site_3 RUNNING\n", - "is workgraph finished: False\n" - ] - } - ], "source": [ "from ase.io import read\n", "from aiida import load_profile\n", @@ -331,7 +63,7 @@ " QueryBuilder,\n", " Group,\n", ")\n", - "from workgraph_collections.qe.xps import xps_workgraph\n", + "from workgraph_collections.qe.xps import XpsWorkgraph\n", "\n", "load_profile()\n", "\n", @@ -353,16 +85,16 @@ "etfa = read(\"datas/ETFA.xyz\")\n", "structure = StructureData(ase=etfa)\n", "# create the PW node\n", - "# code = load_code(\"qe-7.2-pw@localhost\")\n", - "code = load_code(\"qe-7.2-pw@eiger\")\n", + "code = load_code(\"pw-7.4@localhost\")\n", + "# code = load_code(\"pw-7.4@eiger\")\n", "parameters = Dict(\n", " {\n", " \"CONTROL\": {\n", " \"calculation\": \"scf\",\n", " },\n", " \"SYSTEM\": {\n", - " \"ecutwfc\": 50,\n", - " \"ecutrho\": 600,\n", + " \"ecutwfc\": 40,\n", + " \"ecutrho\": 300,\n", " \"occupations\": \"fixed\",\n", " },\n", " }\n", @@ -381,7 +113,7 @@ " \"options\": {\n", " \"resources\": {\n", " \"num_machines\": 1,\n", - " \"num_mpiprocs_per_machine\": 1,\n", + " \"num_mpiprocs_per_machine\": 4,\n", " },\n", " }\n", "}\n", @@ -395,7 +127,7 @@ " }\n", "}\n", "# ===============================================================================\n", - "wg = xps_workgraph(\n", + "wg = XpsWorkgraph.build_graph(\n", " structure=structure,\n", " code=code,\n", " # atoms_list=[0, 1, 2, 3],\n", @@ -406,18 +138,104 @@ " is_molecule=True,\n", " core_hole_pseudos=core_hole_pseudos,\n", " correction_energies=correction_energies,\n", - " metadata=metadata_eiger,\n", + " metadata=metadata,\n", ")\n", - "wg.name = \"QE, XPS, ETFA\"\n", - "print(\"core_hole_pseudos\", core_hole_pseudos.keys())\n", - "# wg.submit()\n", - "wg.run()\n" + "wg.to_html()" + ] + }, + { + "cell_type": "markdown", + "id": "b12df8ef", + "metadata": {}, + "source": [ + "Run the workgraph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7fcfdafe", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "09/02/2025 03:12:25 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|continue_workgraph]: tasks ready to run: get_xspectra_structures\n", + "09/02/2025 03:12:26 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|update_task_state]: Task: get_xspectra_structures, type: CALCFUNCTION, finished.\n", + "09/02/2025 03:12:26 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|continue_workgraph]: tasks ready to run: run_scf\n", + "09/02/2025 03:12:31 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175849\n", + "09/02/2025 03:12:36 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|continue_workgraph]: tasks ready to run: PwCalculation,PwCalculation1,PwCalculation2,PwCalculation3,PwCalculation4\n", + "09/02/2025 03:12:40 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175850, 175851, 175852, 175853, 175854\n", + "09/02/2025 03:13:24 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|update_task_state]: Task: PwCalculation1, type: CALCJOB, finished.\n", + "09/02/2025 03:13:32 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 03:13:32 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|on_wait]: Process status: Waiting for child processes: 175850, 175852, 175853, 175854\n", + "09/02/2025 03:13:42 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|update_task_state]: Task: PwCalculation, type: CALCJOB, finished.\n", + "09/02/2025 03:13:43 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|update_task_state]: Task: PwCalculation2, type: CALCJOB, finished.\n", + "09/02/2025 03:13:43 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|update_task_state]: Task: PwCalculation3, type: CALCJOB, finished.\n", + "09/02/2025 03:13:44 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|update_task_state]: Task: PwCalculation4, type: CALCJOB, finished.\n", + "09/02/2025 03:13:47 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 03:13:47 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175849|WorkGraphEngine|finalize]: Finalize workgraph.\n", + "09/02/2025 03:13:49 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|update_task_state]: Task: run_scf, type: GRAPH, finished.\n", + "09/02/2025 03:13:50 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|continue_workgraph]: tasks ready to run: binding_energy\n", + "09/02/2025 03:13:51 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|update_task_state]: Task: binding_energy, type: CALCFUNCTION, finished.\n", + "09/02/2025 03:13:51 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|continue_workgraph]: tasks ready to run: \n", + "09/02/2025 03:13:51 PM <1488790> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [175827|WorkGraphEngine|finalize]: Finalize workgraph.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "result: \n", + " site_0: 305.1129763777\n", + " site_1: 302.0445550643\n", + " site_2: 299.7042622079\n", + " site_3: 297.9095340518\n" + ] + } + ], + "source": [ + "wg.run()" + ] + }, + { + "cell_type": "markdown", + "id": "1a6fe286", + "metadata": {}, + "source": [ + "Print the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3aaf0dc5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "result: \n", + " site_0: 305.1129763777\n", + " site_1: 302.0445550643\n", + " site_2: 299.7042622079\n", + " site_3: 297.9095340518\n" + ] + } + ], + "source": [ + "print(\"result: \")\n", + "\n", + "for key, value in wg.outputs.result.value.value.items():\n", + " print(f\" {key}: {value}\")" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aiida", "language": "python", "name": "python3" }, @@ -431,12 +249,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.1.-1" - }, - "vscode": { - "interpreter": { - "hash": "2f450c1ff08798c4974437dd057310afef0de414c25d1fd960ad375311c3f6ff" - } + "version": "3.11.0" } }, "nbformat": 4, diff --git a/tests/ase/test_ase_emt.py b/tests/ase/test_ase_emt.py index 9e31650..33f8565 100644 --- a/tests/ase/test_ase_emt.py +++ b/tests/ase/test_ase_emt.py @@ -1,20 +1,11 @@ import numpy as np -from workgraph_collections.ase.emt.atomization_energy import atomization_energy +from workgraph_collections.ase.emt.atomization_energy import AtomizationEnergy def test_atomization_energy(n_atom, n2_molecule, metadata_aiida): - wg = atomization_energy() - wg.tasks.scf_atom.set( - {"atoms": n_atom, "computer": "localhost", "metadata": metadata_aiida} - ) - wg.tasks.scf_mol.set( - {"atoms": n2_molecule, "computer": "localhost", "metadata": metadata_aiida} - ) - wg.tasks.calc_atomization_energy.set( - {"molecule": n2_molecule, "computer": "localhost"} + wg = AtomizationEnergy.build_graph( + atom=n_atom, molecule=n2_molecule, metadata=metadata_aiida ) # ------------------------- Submit the calculation ------------------- - wg.submit(wait=True, timeout=200) - assert np.isclose( - wg.tasks.calc_atomization_energy.outputs.result.value.value, 9.6512352 - ) + wg.run() + assert np.isclose(wg.outputs.result.value.value, 9.6512352) diff --git a/tests/ase/test_ase_espresso.py b/tests/ase/test_ase_espresso.py index be8d003..71cbc3f 100644 --- a/tests/ase/test_ase_espresso.py +++ b/tests/ase/test_ase_espresso.py @@ -1,8 +1,11 @@ import numpy as np -from workgraph_collections.ase.espresso.atomization_energy import atomization_energy +from workgraph_collections.ase.espresso.atomization_energy import AtomizationEnergy from workgraph_collections.ase.espresso.base import vibrations from aiida_workgraph import WorkGraph import pytest +from aiida_pythonjob.config import config + +config["allow_pickle"] = True input_data = { "CONTROL": { @@ -44,44 +47,28 @@ def test_atomization_energy(n_atom, n2_molecule, pseudo_dir, metadata_aiida): pseudopotentials = {"N": "N.pbe-n-rrkjus_psl.1.0.0.UPF"} # ------------------------- Set the inputs ------------------------- - wg = atomization_energy() - wg.tasks.scf_atom.set( - { - "atoms": n_atom, - "pseudopotentials": pseudopotentials, - "pseudo_dir": pseudo_dir, - "input_data": input_data, - "computer": "localhost", - "metadata": metadata_aiida, - } - ) - wg.tasks.scf_mol.set( - { - "atoms": n2_molecule, - "pseudopotentials": pseudopotentials, - "pseudo_dir": pseudo_dir, - "input_data": input_data, - "computer": "localhost", - "metadata": metadata_aiida, - } - ) - wg.tasks.calc_atomization_energy.set( - {"molecule": n2_molecule, "computer": "localhost"} + wg = AtomizationEnergy.build_graph( + atom=n_atom, + molecule=n2_molecule, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + input_data=input_data, + metadata=metadata_aiida, ) wg.run() assert np.isclose( - wg.tasks.calc_atomization_energy.outputs.result.value.value, + wg.outputs.result.value.value, 16.24625509874, ) def test_eos(bulk_si, pseudo_dir, metadata_aiida): - from workgraph_collections.ase.espresso.eos import eos_workgraph + from workgraph_collections.ase.espresso.eos import EosWorkGraph pseudopotentials = {"Si": "Si.pbe-nl-rrkjus_psl.1.0.0.UPF"} # ------------------------- Set the inputs ------------------------- - wg = eos_workgraph( + wg = EosWorkGraph.build_graph( atoms=bulk_si, computer="localhost", scales=[0.95, 1.0, 1.05], @@ -101,3 +88,24 @@ def test_eos(bulk_si, pseudo_dir, metadata_aiida): 88.8909406, atol=1e-1, ) + + +def test_relax(bulk_si, pseudo_dir, metadata_aiida): + from workgraph_collections.ase.espresso.relax import RelaxWorkgraph + + pseudopotentials = {"Si": "Si.pbe-nl-rrkjus_psl.1.0.0.UPF"} + # ------------------------- Set the inputs ------------------------- + wg = RelaxWorkgraph.build_graph( + atoms=bulk_si, + computer="localhost", + command="mpirun -np 2 pw.x", + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + input_data=input_data, + kpts=[4, 4, 4], + metadata=metadata_aiida, + ) + # ------------------------- Submit the calculation ------------------- + # wg.run() + wg.run() + print(wg.outputs) diff --git a/tests/conftest.py b/tests/conftest.py index ac25347..eada3c7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -35,7 +35,7 @@ def metadata_aiida(): "options": { "prepend_text": """ eval "$(conda shell.posix hook)" - conda activate base + conda activate aiida export OMP_NUM_THREADS=1 """, } diff --git a/workgraph_collections/ase/common/core_level.py b/workgraph_collections/ase/common/core_level.py index ae493b7..637cd35 100644 --- a/workgraph_collections/ase/common/core_level.py +++ b/workgraph_collections/ase/common/core_level.py @@ -1,4 +1,4 @@ -from aiida_workgraph import task +from aiida_workgraph import task, spec from ase import Atoms @@ -77,15 +77,7 @@ def create_supercell(atoms, min_cell_length, is_molecule): return atoms -@task( - outputs=[ - { - "name": "structures", - "identifier": "workgraph.namespace", - "metadata": {"dynamic": True}, - }, - ] -) +@task(outputs=spec.namespace(structures=spec.dynamic(Atoms))) def get_marked_structures( atoms: Atoms = None, atom_list: list = None, diff --git a/workgraph_collections/ase/common/eos.py b/workgraph_collections/ase/common/eos.py index 42a3e2d..e9d0597 100644 --- a/workgraph_collections/ase/common/eos.py +++ b/workgraph_collections/ase/common/eos.py @@ -1,17 +1,8 @@ -from aiida_workgraph import task +from aiida_workgraph import task, spec from ase import Atoms -@task( - outputs=[ - { - "name": "scaled_atoms", - "identifier": "workgraph.namespace", - "metadata": {"dynamic": True}, - }, - {"name": "volumes"}, - ] -) +@task(outputs=spec.namespace(scaled_atoms=spec.dynamic(Atoms), volumes=dict)) def generate_scaled_atoms(atoms: Atoms, scales: list) -> dict: """Scale the structure by the given scales.""" volumes = {} @@ -24,16 +15,8 @@ def generate_scaled_atoms(atoms: Atoms, scales: list) -> dict: return {"scaled_atoms": scaled_atoms, "volumes": volumes} -@task( - inputs=[ - { - "name": "scf_results", - "identifier": "workgraph.namespace", - "metadata": {"dynamic": True}, - } - ] -) -def fit_eos(volumes: dict, scf_results: dict) -> dict: +@task +def fit_eos(volumes: dict, scf_results: spec.dynamic(dict)) -> dict: """Fit the EOS of the data.""" from ase.eos import EquationOfState from ase.units import kJ diff --git a/workgraph_collections/ase/common/surface.py b/workgraph_collections/ase/common/surface.py index f55e824..f27779c 100644 --- a/workgraph_collections/ase/common/surface.py +++ b/workgraph_collections/ase/common/surface.py @@ -1,9 +1,8 @@ -from aiida_workgraph import task +from aiida_workgraph import task, spec from typing import List from ase import Atoms -@task.pythonjob() def get_slab_from_miller_indices_ase( atoms: Atoms, indices: List[int], @@ -12,7 +11,7 @@ def get_slab_from_miller_indices_ase( tol: float = 1e-5, periodic: bool = True, center_slab: bool = True, -): +) -> Atoms: """Generate a slab from a bulk structure using ASE's surface module.""" from ase.build import surface @@ -30,15 +29,7 @@ def get_slab_from_miller_indices_ase( return slab -@task.pythonjob( - outputs=[ - { - "name": "slabs", - "identifier": "workgraph.namespace", - "metadata": {"dynamic": True}, - } - ] -) +@task(outputs=spec.namespace(slabs=spec.dynamic(Atoms))) def get_slabs_from_miller_indices_ase( atoms: Atoms, indices: List[List[int]], @@ -64,7 +55,7 @@ def get_slabs_from_miller_indices_ase( return {"slabs": slabs} -@task.pythonjob() +@task() def get_slab_from_miller_indices_pymatgen( atoms: Atoms, miller_index: List[int], @@ -100,15 +91,7 @@ def get_slab_from_miller_indices_pymatgen( return slabs_with_info -@task.pythonjob( - outputs=[ - { - "name": "structures", - "identifier": "workgraph.namespace", - "metadata": {"dynamic": True}, - } - ] -) +@task(outputs=spec.namespace(structures=spec.dynamic(Atoms))) def get_adsorption_structure( slab: Atoms, adsorbate: Atoms, @@ -147,7 +130,7 @@ def get_adsorption_structure( } structures[f"{position}_{count}"] = atoms count += 1 - return structures + return {"structures": structures} def add_adsorbate_to_nanoparticle( diff --git a/workgraph_collections/ase/emt/atomization_energy.py b/workgraph_collections/ase/emt/atomization_energy.py index 34a8f34..ac43bae 100644 --- a/workgraph_collections/ase/emt/atomization_energy.py +++ b/workgraph_collections/ase/emt/atomization_energy.py @@ -1,4 +1,4 @@ -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task from ase import Atoms @@ -8,25 +8,16 @@ def calc_atomization_energy(molecule: Atoms, molecule_output: dict, atom_output: return energy -@task.graph(outputs=[{"name": "result", "from": "calc_atomization_energy.result"}]) -def atomization_energy(atom: Atoms = None, molecule: Atoms = None): +@task.graph +def AtomizationEnergy( + atom: Atoms = None, molecule: Atoms = None, metadata: dict = None +): """Workgraph for atomization energy calculation using EMT calculator.""" from .base import emt_calculator - wg = WorkGraph("Atomization energy") - pw_atom = wg.add_task( - "workgraph.pythonjob", function=emt_calculator, name="scf_atom", atoms=atom - ) - pw_mol = wg.add_task( - "workgraph.pythonjob", function=emt_calculator, name="scf_mol", atoms=molecule - ) + pw_atom_out = emt_calculator(atoms=atom, metadata=metadata).result + pw_mol_out = emt_calculator(atoms=molecule, metadata=metadata).result # create the task to calculate the atomization energy - wg.add_task( - "workgraph.pythonjob", - function=calc_atomization_energy, - name="calc_atomization_energy", - molecule=molecule, - atom_output=pw_atom.outputs["results"], - molecule_output=pw_mol.outputs["results"], - ) - return wg + return calc_atomization_energy( + molecule=molecule, atom_output=pw_atom_out, molecule_output=pw_mol_out + ).result diff --git a/workgraph_collections/ase/emt/base.py b/workgraph_collections/ase/emt/base.py index 6959bf9..5e338dc 100644 --- a/workgraph_collections/ase/emt/base.py +++ b/workgraph_collections/ase/emt/base.py @@ -2,8 +2,8 @@ from ase import Atoms -@task(outputs=[{"name": "results"}]) -def emt_calculator(atoms: Atoms) -> float: +@task.pythonjob +def emt_calculator(atoms: Atoms) -> dict: from ase.calculators.emt import EMT atoms.calc = EMT() diff --git a/workgraph_collections/ase/espresso/adsorption.py b/workgraph_collections/ase/espresso/adsorption.py index d97e757..a36ad58 100644 --- a/workgraph_collections/ase/espresso/adsorption.py +++ b/workgraph_collections/ase/espresso/adsorption.py @@ -1,30 +1,24 @@ -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task, spec from workgraph_collections.ase.common.surface import get_adsorption_structure from ase import Atoms -from typing import Dict @task.graph( - outputs=[ - {"name": "parameters", "from": "context.parameters"}, - {"name": "structures", "from": "context.structures"}, - ] + outputs=spec.namespace( + parameters=spec.dynamic(dict), structures=spec.dynamic(dict) + ), ) def relax_structures(slabs, inputs): """Run the scf calculation for each atoms.""" - from aiida_workgraph import WorkGraph from workgraph_collections.ase.espresso.relax import relax_workgraph - wg = WorkGraph() + parameters = {} + structures = {} for key, atoms in slabs.items(): - scf = wg.tasks.new( - relax_workgraph, name=f"relax_{key}", atoms=atoms, calculation="relax" - ) - scf.set(inputs) - scf.set_context( - {f"parameters.{key}": "parameters", f"structures.{key}": "atoms"} - ) - return wg + relax_out = relax_workgraph(atoms=atoms, calculation="relax", **inputs) + parameters[key] = relax_out.parameters + structures[key] = relax_out.atoms + return {"parameters": parameters, "structures": structures} @task.pythonjob( @@ -44,8 +38,8 @@ def relax_structures(slabs, inputs): def get_surface_energy( bulk_atoms: Atoms, bulk_parameters: dict, - slab_parameters: Dict[str, dict], - slab_structures: Dict[str, dict], + slab_parameters: spec.dynamic(dict), + slab_structures: spec.dynamic(Atoms), ): """Calculate the surface energy.""" from ase.units import J, eV @@ -73,12 +67,7 @@ def get_surface_energy( return surface_energies -@task.graph( - outputs=[ - {"name": "parameters", "from": "relax_structures.parameters"}, - {"name": "structures", "from": "relax_structures.structures"}, - ] -) +@task.graph() def adsorption_workgraph( slab: Atoms = None, adsorbate: Atoms = None, @@ -105,12 +94,9 @@ def adsorption_workgraph( input_data = input_data or {} - wg = WorkGraph("slabs") # -------- relax slab ----------- if relax_slab: - relax_slab_task = wg.tasks.new( - relax_workgraph, - name="relax_slab", + relax_slab_out = relax_workgraph( command=command, input_data=input_data, pseudopotentials=pseudopotentials, @@ -121,11 +107,9 @@ def adsorption_workgraph( kpts=kpts, kspacing=kspacing, ) - slab = relax_slab_task.outputs["atoms"] + slab = relax_slab_out.atoms # -------- generate slab with adsorbate ----------- - add_adsorbate_task = wg.tasks.new( - get_adsorption_structure, - name="add_adsorbate", + add_adsorbate_out = get_adsorption_structure( slab=slab, adsorbate=adsorbate, distance=distance, @@ -134,10 +118,8 @@ def adsorption_workgraph( metadata=metadata, ) # -------- relax_structures ----------- - relax_structures_task = wg.tasks.new( - relax_structures, - name="relax_structures", - structures=add_adsorbate_task.outputs["structures"], + relax_structures_out = relax_structures( + structures=add_adsorbate_out.structures, inputs={ "command": command, "input_data": input_data, @@ -152,11 +134,9 @@ def adsorption_workgraph( if calc_adsorption_energy: if adsorbate_energy is None: raise ValueError("adsorbate_energy must be provided") - wg.tasks.new( - get_surface_energy, - name="get_surface_energy", - bulk_parameters=relax_slab_task.outputs["parameters"], + surf_energy_out = get_surface_energy( + bulk_parameters=relax_slab_out.parameters, adsorbate_energy=adsorbate_energy, - slab_parameters=relax_structures_task.outputs["parameters"], - ) - return wg + slab_parameters=relax_structures_out.parameters, + ).result + return surf_energy_out diff --git a/workgraph_collections/ase/espresso/atomization_energy.py b/workgraph_collections/ase/espresso/atomization_energy.py index 2e233dd..4381b9d 100644 --- a/workgraph_collections/ase/espresso/atomization_energy.py +++ b/workgraph_collections/ase/espresso/atomization_energy.py @@ -1,33 +1,54 @@ -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task, spec from ase import Atoms -@task() -def calc_atomization_energy(molecule, molecule_output, atom_output): +@task +def calc_atomization_energy( + molecule: Atoms, molecule_output: dict, atom_output: dict +) -> float: energy = atom_output["energy"] * len(molecule) - molecule_output["energy"] return energy -@task.graph(outputs=[{"name": "result", "from": "calc_atomization_energy.result"}]) -def atomization_energy(atom: Atoms = None, molecule: Atoms = None): +@task.graph( + outputs=spec.namespace( + atomization_energy=float, molecule_parameters=dict, atom_parameters=dict + ) +) +def AtomizationEnergy( + atom: Atoms = None, + molecule: Atoms = None, + pseudopotentials: dict = None, + input_data: dict = None, + pseudo_dir: str = None, + computer: str = "localhost", + metadata: dict = None, +): """Workgraph for atomization energy calculation using Espresso calculator.""" - from .pw import pw_calculator - wg = WorkGraph("Atomization energy") - pw_atom = wg.add_task( - "workgraph.pythonjob", function=pw_calculator, name="scf_atom", atoms=atom - ) - pw_mol = wg.add_task( - "workgraph.pythonjob", function=pw_calculator, name="scf_mol", atoms=molecule - ) - # create the task to calculate the atomization energy - wg.add_task( - "workgraph.pythonjob", - function=calc_atomization_energy, - name="calc_atomization_energy", - molecule=molecule, - atom_output=pw_atom.outputs.parameters, - molecule_output=pw_mol.outputs["parameters"], - ) - return wg + pw_atom_out = pw_calculator( + atoms=atom, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + input_data=input_data, + computer=computer, + metadata=metadata, + ).parameters + pw_mol_out = pw_calculator( + atoms=molecule, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + input_data=input_data, + calculation="relax", + computer=computer, + metadata=metadata, + ).parameters + atomization_out = calc_atomization_energy( + molecule=molecule, atom_output=pw_atom_out, molecule_output=pw_mol_out + ).result + return { + "atomization_energy": atomization_out, + "molecule_parameters": pw_mol_out, + "atom_parameters": pw_atom_out, + } diff --git a/workgraph_collections/ase/espresso/bader.py b/workgraph_collections/ase/espresso/bader.py index cc6e8bf..bca8a57 100644 --- a/workgraph_collections/ase/espresso/bader.py +++ b/workgraph_collections/ase/espresso/bader.py @@ -1,11 +1,12 @@ -from aiida_workgraph import WorkGraph, task +from aiida_workgraph import task from ase import Atoms -from .pw import pw_calculator, pp_calculator +from .pw import pw_calculator +from .base import pp_calculator from workgraph_collections.bader import bader_calculator @task.graph() -def bader_workgraph( +def BaderWorkgraph( atoms: Atoms = None, pw_command: str = "pw.x", pp_command: str = "dos.x", @@ -17,35 +18,17 @@ def bader_workgraph( ): """Generate PdosWorkGraph.""" inputs = {} if inputs is None else inputs - # create workgraph - wg = WorkGraph("Bader") - wg.context = { - "current_number_of_bands": None, - } # -------- scf ----------- - scf_task = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name="scf", + scf_inputs = inputs.get("scf", {}) + scf_task_out = pw_calculator( atoms=atoms, command=pw_command, computer=computer, pseudopotentials=pseudopotentials, pseudo_dir=pseudo_dir, + **scf_inputs ) - scf_inputs = inputs.get("scf", {}) - scf_task.set(scf_inputs) # -------- pp valence ----------- - pp_valence = wg.add_task( - "workgraph.pythonjob", - function=pp_calculator, - name="pp_valence", - command=pp_command, - computer=computer, - parent_folder=scf_task.outputs["remote_folder"], - parent_output_folder="out", - parent_folder_name="out", - ) pp_valence_inputs = inputs.get("pp_valence", {}) pp_valence_inputs["input_data"] = { "INPUTPP": {"plot_num": 0}, @@ -55,18 +38,16 @@ def bader_workgraph( "fileout": "charge_density.cube", }, } - pp_valence.set(pp_valence_inputs) - # -------- pp all ----------- - pp_all = wg.add_task( - "workgraph.pythonjob", - function=pp_calculator, - name="pp_all", + pp_valence_out = pp_calculator( command=pp_command, computer=computer, - parent_folder=scf_task.outputs["remote_folder"], + parent_folder=scf_task_out.remote_folder, parent_output_folder="out", parent_folder_name="out", + **pp_valence_inputs ) + # -------- pp all ----------- + pp_all_inputs = inputs.get("pp_all", {}) pp_all_inputs["input_data"] = { "INPUTPP": {"plot_num": 21}, @@ -76,19 +57,25 @@ def bader_workgraph( "fileout": "charge_density.cube", }, } - pp_all.set(pp_all_inputs) + pp_all_out = pp_calculator( + command=pp_command, + computer=computer, + parent_folder=scf_task_out.remote_folder, + parent_output_folder="out", + parent_folder_name="out", + **pp_all_inputs + ) # -------- bader ----------- - bader_task = wg.add_task( - "workgraph.pythonjob", - function=bader_calculator, - name="bader", + bader_inputs = inputs.get("bader", {}) + bader_task_out = bader_calculator( computer=computer, command=bader_command, charge_density_folder="pp_valence_remote_folder", reference_charge_density_folder="pp_all_remote_folder", + copy_files={ + "pp_valence_remote_folder": pp_valence_out.remote_folder, + "pp_all_remote_folder": pp_all_out.remote_folder, + }, + **bader_inputs ) - wg.links.new(pp_valence.outputs["remote_folder"], bader_task.inputs["copy_files"]) - wg.links.new(pp_all.outputs["remote_folder"], bader_task.inputs["copy_files"]) - bader_inputs = inputs.get("bader", {}) - bader_task.set(bader_inputs) - return wg + return bader_task_out.result diff --git a/workgraph_collections/ase/espresso/bands.py b/workgraph_collections/ase/espresso/bands.py index f26e657..cc1d69f 100644 --- a/workgraph_collections/ase/espresso/bands.py +++ b/workgraph_collections/ase/espresso/bands.py @@ -1,11 +1,11 @@ -from aiida_workgraph import WorkGraph, task +from aiida_workgraph import task, namespace from ase import Atoms from .pw import pw_calculator from aiida import orm @task() -def find_kpoint_path( +def find_kpoints_path( atoms: Atoms, path: str = None, npoints: int = None, density: int = None ): """Find kpoint path for band structure calculation.""" @@ -15,14 +15,18 @@ def find_kpoint_path( return kpts -@task.graph() -def bands_workgraph( +@task.graph( + outputs=namespace( + bands=pw_calculator.outputs, kpoints_path=find_kpoints_path.outputs.result + ) +) +def BandsWorkgraph( atoms: Atoms = None, pw_command: str = "pw.x", inputs: dict = None, pseudopotentials: dict = None, pseudo_dir: str = ".", - nkpoints: int = None, + npoints: int = None, density: int = None, kpoints_path: str = None, scf_parent_folder: orm.RemoteData = None, @@ -31,65 +35,45 @@ def bands_workgraph( ): """Generate BandsStructure WorkGraph.""" inputs = {} if inputs is None else inputs - # create workgraph - wg = WorkGraph("BandsStructure") - wg.context = { - "current_number_of_bands": None, - } - # -------- relax ----------- if run_relax: - relax_task = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name="relax", + relax_inputs = inputs.get("relax", {}) + relax_task_out = pw_calculator( atoms=atoms, command=pw_command, pseudopotentials=pseudopotentials, pseudo_dir=pseudo_dir, + **relax_inputs ) - relax_inputs = inputs.get("relax", {}) - relax_task.set(relax_inputs) - atoms = relax_task.outputs["atoms"] + atoms = relax_task_out.atoms # -------- scf ----------- if run_scf: - scf_task = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name="scf", + scf_inputs = inputs.get("scf", {}) + scf_task_out = pw_calculator( atoms=atoms, command=pw_command, pseudopotentials=pseudopotentials, pseudo_dir=pseudo_dir, + **scf_inputs ) - scf_inputs = inputs.get("scf", {}) - scf_task.set(scf_inputs) - scf_parent_folder = scf_task.outputs["remote_folder"] + scf_parent_folder = scf_task_out.remote_folder # -------- kpoints path ----------- - find_kpoints_path_task = wg.add_task( - "workgraph.pythonjob", - function=find_kpoint_path, - name="find_kponits_path", + find_kpoints_path_out = find_kpoints_path( atoms=atoms, path=kpoints_path, - npoints=nkpoints, + npoints=npoints, density=density, ) - find_kpoints_path_inputs = inputs.get("find_kpoints_path", {}) - find_kpoints_path_task.set(find_kpoints_path_inputs) # -------- bands ----------- - bands_task = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name="bands", + bands_inputs = inputs.get("bands", {}) + bands_task_out = pw_calculator( atoms=atoms, command=pw_command, pseudopotentials=pseudopotentials, pseudo_dir=pseudo_dir, - kpts=find_kpoints_path_task.outputs.result, + kpts=find_kpoints_path_out.result, parent_folder=scf_parent_folder, parent_output_folder="out", parent_folder_name="out", + **bands_inputs ) - bands_inputs = inputs.get("bands", {}) - bands_task.set(bands_inputs) - return wg + return {"bands": bands_task_out, "kpoints_path": find_kpoints_path_out.result} diff --git a/workgraph_collections/ase/espresso/base.py b/workgraph_collections/ase/espresso/base.py index 0f6e001..bf800ff 100644 --- a/workgraph_collections/ase/espresso/base.py +++ b/workgraph_collections/ase/espresso/base.py @@ -1,8 +1,9 @@ -from aiida_workgraph import task +from aiida_workgraph import task, spec from ase import Atoms +from typing import Any -@task.pythonjob(outputs=[{"name": "parameters"}, {"name": "dos"}]) +@task.pythonjob(outputs=spec.namespace(parameters=dict, dos=dict)) def dos_calculator( command: str = "dos.x", input_data: dict = None, @@ -23,12 +24,7 @@ def dos_calculator( @task.pythonjob( - outputs=[ - {"name": "parameters"}, - {"name": "dos"}, - {"name": "bands"}, - {"name": "projections"}, - ] + outputs=spec.namespace(parameters=dict, dos=dict, bands=Any, projections=Any) ) def projwfc_calculator( command: str = "projwfc.x", @@ -50,7 +46,7 @@ def projwfc_calculator( return calc.results -@task.pythonjob(outputs=[{"name": "results"}]) +@task.pythonjob() def pp_calculator( command: str = "pp.x", input_data: dict = None, @@ -67,11 +63,11 @@ def pp_calculator( calc = Espresso(profile=profile, template=PpTemplate(), input_data=input_data) - results = calc.get_property("pp", Atoms()) - return {"results": results} + result = calc.get_property("pp", Atoms()) + return result -@task.pythonjob(outputs=[{"name": "results"}]) +@task.pythonjob() def xspectra_calculator( command: str = "xspectra.x", input_data: dict = None, @@ -96,11 +92,11 @@ def xspectra_calculator( koffset=koffset, ) - results = calc.get_property("xspectra", Atoms()) - return {"results": results} + result = calc.get_property("xspectra", Atoms()) + return result -@task.pythonjob(outputs=[{"name": "results"}]) +@task.pythonjob() def vibrations( atoms: Atoms, pseudopotentials: dict, @@ -146,15 +142,10 @@ def vibrations( vib.write_jmol() vib.write_dos() energies = vib.get_energies() - return {"energies": energies} + return energies -@task.pythonjob( - outputs=[ - {"name": "parameters"}, - {"name": "ld1"}, - ] -) +@task.pythonjob(outputs=spec.namespace(parameters=dict, ld1=dict)) def ld1_calculator( command: str = "ld1.x", input_data: dict = None, diff --git a/workgraph_collections/ase/espresso/core_hole_pseudo.py b/workgraph_collections/ase/espresso/core_hole_pseudo.py index 43d9610..a012ee4 100644 --- a/workgraph_collections/ase/espresso/core_hole_pseudo.py +++ b/workgraph_collections/ase/espresso/core_hole_pseudo.py @@ -1,4 +1,4 @@ -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task @task() @@ -9,11 +9,11 @@ def calc_correction(ground_output, core_hole_output): return energy -@task.graph(outputs=[{"name": "result", "from": "calc_correction.result"}]) +@task.graph() def core_hole_pseudo_workgraph( ground_inputs: dict = None, core_hole_inputs: dict = None, -) -> WorkGraph: +) -> float: """Workgraph for atomization energy calculation using Espresso calculator.""" from .base import ld1_calculator @@ -21,23 +21,9 @@ def core_hole_pseudo_workgraph( ground_inputs = {} if ground_inputs is None else ground_inputs core_hole_inputs = {} if core_hole_inputs is None else core_hole_inputs - wg = WorkGraph("Core-hole pseudo workgraph") - ground_task = wg.add_task( - "workgraph.pythonjob", - function=ld1_calculator, - name="ground", - ) - ground_task.set(ground_inputs) - core_hole_task = wg.add_task( - "workgraph.pythonjob", function=ld1_calculator, name="core_hole" - ) - core_hole_task.set(core_hole_inputs) - # create the task to calculate the atomization energy - wg.add_task( - "workgraph.pythonjob", - function=calc_correction, - name="calc_correction", - core_hole_output=core_hole_task.outputs["ld1"], - ground_output=ground_task.outputs["ld1"], - ) - return wg + ground_out = ld1_calculator(**ground_inputs) + core_hole_out = ld1_calculator(**core_hole_inputs) + return calc_correction( + core_hole_output=core_hole_out.ld1, + ground_output=ground_out.ld1, + ).result diff --git a/workgraph_collections/ase/espresso/elastic.py b/workgraph_collections/ase/espresso/elastic.py index d33d5d3..8591749 100644 --- a/workgraph_collections/ase/espresso/elastic.py +++ b/workgraph_collections/ase/espresso/elastic.py @@ -1,6 +1,7 @@ -from aiida_workgraph import WorkGraph, task +from aiida_workgraph import WorkGraph, task, dynamic from pymatgen.analysis.elasticity.strain import DeformedStructureSet from ase import Atoms +from typing import Annotated, Any @task() @@ -22,39 +23,32 @@ def get_deformed_structure_set( return deformed_structure_set -@task.graph(outputs=[{"name": "relax_results", "from": "context.results"}]) +@task.graph(outputs=dynamic(Any)) def run_relaxation( deformed_structure_set: DeformedStructureSet, relax_inputs: dict ) -> WorkGraph: """Run relaxation for each deformed structure.""" - from aiida_workgraph import WorkGraph from .pw import pw_calculator - wg = WorkGraph() - wg.context = {"deformed_structure": deformed_structure_set} + # Be careful, we generate new data here, thus break the data provenance! deformed_atoms = [ structure.to_ase_atoms() for structure in deformed_structure_set.value ] - # becareful, we generate new data here, thus break the data provenance! - # that's why I put the deformed_structure in the context, so that we can link them + results = {} for i in range(len(deformed_atoms)): - relax = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name=f"relax_{i}", + relax_out = pw_calculator( atoms=deformed_atoms[i], + **relax_inputs, ) - relax.set(relax_inputs) - # save the output parameters to the context - relax.set_context({f"results.{i}": "parameters"}) - return wg + results[f"atoms_{i}"] = relax_out.trajectory + return results @task() def fit_elastic_constants( atoms: Atoms, deformed_structure_set: DeformedStructureSet, - relax_results: dict, + relax_results: Annotated[dict, dynamic(dict)], symmetry: bool = True, ): """Fit the elastic constants.""" @@ -87,7 +81,16 @@ def restore_full_strains_stresses( stresses = [] strains = [] for i in range(len(deformed_structure_set)): - stress = Stress.from_voigt(relax_results[f"{i}"]["stress"]) + stress = relax_results[f"atoms_{i}"].get_array("stress")[0] + stress = [ + stress[0][0], + stress[1][1], + stress[2][2], + stress[1][2], + stress[0][2], + stress[0][1], + ] + stress = Stress.from_voigt(stress) stresses.append(stress) strains.append(deformed_structure_set.deformations[i].green_lagrange_strain) if symmetry: @@ -98,8 +101,8 @@ def restore_full_strains_stresses( return elastic_constants -@task.graph(outputs=[{"name": "result", "from": "fit_elastic.result"}]) -def elastic_workgraph( +@task.graph() +def ElasticWorkgraph( atoms: Atoms = None, command: str = "pw.x", computer: str = "localhost", @@ -123,46 +126,34 @@ def elastic_workgraph( input_data = input_data or {} - wg = WorkGraph("Elastic") # -------- relax ----------- if run_relax: - relax_task = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name="relax", + relax_input_data = deepcopy(input_data) + inputs = { + "command": command, + "input_data": relax_input_data, + "kpts": kpts, + "pseudopotentials": pseudopotentials, + "pseudo_dir": pseudo_dir, + } + relax_out = pw_calculator( atoms=atoms, calculation="vc-relax", metadata=metadata, computer=computer, + **inputs, ) - relax_input_data = deepcopy(input_data) - relax_task.set( - { - "command": command, - "input_data": relax_input_data, - "kpts": kpts, - "pseudopotentials": pseudopotentials, - "pseudo_dir": pseudo_dir, - } - ) - atoms = relax_task.outputs["atoms"] + atoms = relax_out.atoms # -------- deformed_structure ----------- - deformed_structure_task = wg.add_task( - "workgraph.pythonjob", - function=get_deformed_structure_set, - name="deformed_structure", + deformed_structure_out = get_deformed_structure_set( atoms=atoms, norm_strains=norm_strains, shear_strains=shear_strains, symmetry=symmetry, - computer=computer, - metadata=metadata, ) # -------- run_relaxation ----------- - run_relaxation_task = wg.add_task( - run_relaxation, - name="run_relaxation", - deformed_structure_set=deformed_structure_task.outputs.result, + run_relaxation_out = run_relaxation( + deformed_structure_set=deformed_structure_out.result, relax_inputs={ "command": command, "input_data": input_data, @@ -174,15 +165,9 @@ def elastic_workgraph( }, ) # -------- fit_elastic ----------- - wg.add_task( - "workgraph.pythonjob", - function=fit_elastic_constants, - name="fit_elastic", + return fit_elastic_constants( atoms=atoms, - deformed_structure_set=deformed_structure_task.outputs.result, - relax_results=run_relaxation_task.outputs["relax_results"], + deformed_structure_set=deformed_structure_out.result, + relax_results=run_relaxation_out, symmetry=symmetry, - computer=computer, - metadata=metadata, ) - return wg diff --git a/workgraph_collections/ase/espresso/eos.py b/workgraph_collections/ase/espresso/eos.py index 902eba2..d42b871 100644 --- a/workgraph_collections/ase/espresso/eos.py +++ b/workgraph_collections/ase/espresso/eos.py @@ -1,10 +1,42 @@ -from aiida_workgraph import task, WorkGraph, active_map_zone +from aiida_workgraph import task, spec from workgraph_collections.ase.common.eos import generate_scaled_atoms, fit_eos from ase import Atoms -@task.graph(outputs=[{"name": "result", "from": "fit_eos.result"}]) -def eos_workgraph( +@task.graph() +def calc_all_structures( + structures: spec.dynamic(Atoms), + command: str = "pw.x", + input_data: dict = None, + kpts: list = None, + pseudopotentials: dict = None, + pseudo_dir: str = None, + metadata: dict = None, + computer: str = "localhost", +) -> spec.namespace(results=spec.dynamic(dict)): + """Run SCF calculations for all structures.""" + from .pw import pw_calculator + + input_data = input_data or {} + results = {} + for name, atoms in structures.items(): + scf_output = pw_calculator( + atoms=atoms, + command=command, + input_data=input_data, + kpts=kpts, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + metadata=metadata, + computer=computer, + ) + results[name] = scf_output.parameters + + return {"results": results} + + +@task.graph() +def EosWorkGraph( atoms: Atoms = None, command: str = "pw.x", computer: str = "localhost", @@ -26,39 +58,38 @@ def eos_workgraph( input_data = input_data or {} - with WorkGraph("EOS") as wg: - # -------- relax ----------- - if run_relax: - relax_input_data = deepcopy(input_data) - relax_input_data.setdefault("CONTROL", {}) - relax_input_data["CONTROL"]["calculation"] = "vc-relax" - relax_output = pw_calculator( - atoms=atoms, - metadata=metadata, - computer=computer, - command=command, - input_data=relax_input_data, - kpts=kpts, - pseudopotentials=pseudopotentials, - pseudo_dir=pseudo_dir, - ) - atoms = relax_output.atoms - # -------- scale_atoms ----------- - scale_output = generate_scaled_atoms(atoms=atoms, scales=scales) - with active_map_zone(scale_output.scaled_atoms) as map_zone: - scf_output = pw_calculator( - atoms=map_zone.item, - command=command, - input_data=input_data, - kpts=kpts, - pseudopotentials=pseudopotentials, - pseudo_dir=pseudo_dir, - metadata=metadata, - computer=computer, - ) - # -------- fit_eos ----------- - fit_eos( - volumes=scale_output.volumes, - scf_results=scf_output.parameters, + # -------- relax ----------- + if run_relax: + relax_input_data = deepcopy(input_data) + relax_input_data.setdefault("CONTROL", {}) + relax_input_data["CONTROL"]["calculation"] = "vc-relax" + relax_output = pw_calculator( + atoms=atoms, + metadata=metadata, + computer=computer, + command=command, + input_data=relax_input_data, + kpts=kpts, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, ) - return wg + atoms = relax_output.atoms + # -------- scale_atoms ----------- + scale_output = generate_scaled_atoms(atoms=atoms, scales=scales) + + scf_outputs = calc_all_structures( + structures=scale_output.scaled_atoms, + command=command, + input_data=input_data, + kpts=kpts, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + metadata=metadata, + computer=computer, + ) + + # -------- fit_eos ----------- + return fit_eos( + volumes=scale_output.volumes, + scf_results=scf_outputs.results, + ).result diff --git a/workgraph_collections/ase/espresso/pdos.py b/workgraph_collections/ase/espresso/pdos.py index 7e694ed..e30be5f 100644 --- a/workgraph_collections/ase/espresso/pdos.py +++ b/workgraph_collections/ase/espresso/pdos.py @@ -1,12 +1,17 @@ -from aiida_workgraph import WorkGraph, task +from aiida_workgraph import task, spec from ase import Atoms from .pw import pw_calculator from .base import dos_calculator, projwfc_calculator from aiida import orm -@task.graph() -def pdos_workgraph( +@task.graph( + outputs=spec.namespace( + dos=dos_calculator.outputs, + projwfc=projwfc_calculator.outputs, + ), +) +def PdosWorkgraph( atoms: Atoms = None, pw_command: str = "pw.x", dos_command: str = "dos.x", @@ -21,60 +26,59 @@ def pdos_workgraph( """Generate PdosWorkGraph.""" inputs = {} if inputs is None else inputs # create workgraph - with WorkGraph("PDOS") as wg: - # -------- relax ----------- - if run_relax: - relax_inputs = inputs.get("relax", {}) - relax_output = pw_calculator( - command=pw_command, - atoms=atoms, - calculation="vc-relax", - pseudopotentials=pseudopotentials, - pseudo_dir=pseudo_dir, - **relax_inputs, - ) - atoms = relax_output.atoms - # -------- scf ----------- - if run_scf: - scf_inputs = inputs.get("scf", {}) - scf_output = pw_calculator( - command=pw_command, - atoms=atoms, - calculation="scf", - pseudopotentials=pseudopotentials, - pseudo_dir=pseudo_dir, - **scf_inputs, - ) - scf_parent_folder = scf_output.remote_folder - # -------- nscf ----------- - nscf_inputs = inputs.get("nscf", {}) - nscf_output = pw_calculator( + # -------- relax ----------- + if run_relax: + relax_inputs = inputs.get("relax", {}) + relax_output = pw_calculator( command=pw_command, atoms=atoms, - calculation="nscf", + calculation="vc-relax", pseudopotentials=pseudopotentials, pseudo_dir=pseudo_dir, - parent_folder=scf_parent_folder, - parent_output_folder="out", - parent_folder_name="out", - **nscf_inputs, + **relax_inputs, ) - # -------- dos ----------- - dos_input = inputs.get("dos", {"input_data": {}}) - dos_calculator( - command=dos_command, - parent_folder=nscf_output.remote_folder, - parent_output_folder="out", - parent_folder_name="out", - **dos_input, - ) - # -------- projwfc ----------- - projwfc_input = inputs.get("projwfc", {"input_data": {}}) - projwfc_calculator( - command=projwfc_command, - parent_folder=nscf_output.remote_folder, - parent_output_folder="out", - parent_folder_name="out", - **projwfc_input, + atoms = relax_output.atoms + # -------- scf ----------- + if run_scf: + scf_inputs = inputs.get("scf", {}) + scf_output = pw_calculator( + command=pw_command, + atoms=atoms, + calculation="scf", + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + **scf_inputs, ) - return wg + scf_parent_folder = scf_output.remote_folder + # -------- nscf ----------- + nscf_inputs = inputs.get("nscf", {}) + nscf_output = pw_calculator( + command=pw_command, + atoms=atoms, + calculation="nscf", + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + parent_folder=scf_parent_folder, + parent_output_folder="out", + parent_folder_name="out", + **nscf_inputs, + ) + # -------- dos ----------- + dos_input = inputs.get("dos", {"input_data": {}}) + dos_outs = dos_calculator( + command=dos_command, + parent_folder=nscf_output.remote_folder, + parent_output_folder="out", + parent_folder_name="out", + **dos_input, + ) + # -------- projwfc ----------- + projwfc_input = inputs.get("projwfc", {"input_data": {}}) + projwfc_outs = projwfc_calculator( + command=projwfc_command, + parent_folder=nscf_output.remote_folder, + parent_output_folder="out", + parent_folder_name="out", + **projwfc_input, + ) + return {"dos": dos_outs, "projwfc": projwfc_outs} diff --git a/workgraph_collections/ase/espresso/pw.py b/workgraph_collections/ase/espresso/pw.py index 184a50b..3090c77 100644 --- a/workgraph_collections/ase/espresso/pw.py +++ b/workgraph_collections/ase/espresso/pw.py @@ -1,8 +1,8 @@ -from aiida_workgraph import task +from aiida_workgraph import task, spec from ase import Atoms from ase_quantumespresso.parsers.exit_code import PwExitCodes - import dataclasses +from typing import Any @dataclasses.dataclass @@ -115,45 +115,45 @@ def handle_relax_recoverable_electronic_convergence_error(task): @task.pythonjob( - outputs=[ - {"name": "atoms"}, - {"name": "parameters"}, - {"name": "kpoints"}, - {"name": "band"}, - {"name": "trajectory"}, - {"name": "atomic_occupations"}, - {"name": "energy"}, - ], - error_handlers=[ - { + outputs=spec.namespace( + atoms=Atoms, + parameters=dict, + kpoints=Any, + band=Any, + trajectory=Any, + atomic_occupations=Any, + energy=float, + ), + error_handlers={ + "handle_relax_recoverable_ionic_convergence_error": { "handler": handle_relax_recoverable_ionic_convergence_error, "exit_codes": [ - PwExitCodes.ERROR_IONIC_CONVERGENCE_NOT_REACHED, - PwExitCodes.ERROR_IONIC_CYCLE_BFGS_HISTORY_FAILURE, - PwExitCodes.ERROR_IONIC_CYCLE_EXCEEDED_NSTEP, - PwExitCodes.ERROR_IONIC_CYCLE_BFGS_HISTORY_AND_FINAL_SCF_FAILURE, + PwExitCodes.ERROR_IONIC_CONVERGENCE_NOT_REACHED.status, + PwExitCodes.ERROR_IONIC_CYCLE_BFGS_HISTORY_FAILURE.status, + PwExitCodes.ERROR_IONIC_CYCLE_EXCEEDED_NSTEP.status, + PwExitCodes.ERROR_IONIC_CYCLE_BFGS_HISTORY_AND_FINAL_SCF_FAILURE.status, ], "max_retries": 5, }, - { + "handle_out_of_walltime": { "handler": handle_out_of_walltime, - "exit_codes": [PwExitCodes.ERROR_OUT_OF_WALLTIME], + "exit_codes": [PwExitCodes.ERROR_OUT_OF_WALLTIME.status], "max_retries": 5, }, - { + "handle_electronic_convergence_not_reached": { "handler": handle_electronic_convergence_not_reached, - "exit_codes": [PwExitCodes.ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED], + "exit_codes": [PwExitCodes.ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED.status], "max_retries": 5, }, - { + "handle_relax_recoverable_electronic_convergence_error": { "handler": handle_relax_recoverable_electronic_convergence_error, "exit_codes": [ - PwExitCodes.ERROR_IONIC_CYCLE_ELECTRONIC_CONVERGENCE_NOT_REACHED, - PwExitCodes.ERROR_IONIC_CONVERGENCE_REACHED_FINAL_SCF_FAILED, + PwExitCodes.ERROR_IONIC_CYCLE_ELECTRONIC_CONVERGENCE_NOT_REACHED.status, + PwExitCodes.ERROR_IONIC_CONVERGENCE_REACHED_FINAL_SCF_FAILED.status, ], "max_retries": 5, }, - ], + }, ) def pw_calculator( atoms: Atoms, @@ -163,7 +163,7 @@ def pw_calculator( command: str = "pw.x", input_data: dict = None, pseudo_dir: str = "./pseudopotentials", - calculation: str = None, + calculation: str = "scf", ) -> dict: """Run a Quantum Espresso calculation on the given atoms object.""" from ase.io.espresso import Namelist @@ -176,9 +176,8 @@ def pw_calculator( input_data = Namelist(input_data) input_data.to_nested(binary="pw") # set the calculation type - if calculation: - input_data.setdefault("CONTROL", {}) - input_data["CONTROL"]["calculation"] = calculation + input_data.setdefault("CONTROL", {}) + input_data["CONTROL"]["calculation"] = calculation or "scf" # Set the output directory input_data.setdefault("CONTROL", {}) diff --git a/workgraph_collections/ase/espresso/relax.py b/workgraph_collections/ase/espresso/relax.py index 3adc1f2..553f4ad 100644 --- a/workgraph_collections/ase/espresso/relax.py +++ b/workgraph_collections/ase/espresso/relax.py @@ -1,4 +1,4 @@ -from aiida_workgraph import WorkGraph, task +from aiida_workgraph import task, spec from ase import Atoms from .pw import pw_calculator @@ -10,45 +10,40 @@ def should_run_while(is_converged: bool): @task( - outputs=[ - {"name": "current_number_of_bands"}, - {"name": "is_converged"}, - {"name": "current_atoms"}, - ] + outputs=spec.namespace(current_number_of_bands=int, is_converged=bool), ) def inspect_relax( parameters: dict, - current_atoms: Atoms, + atoms: Atoms, prev_atoms: Atoms = None, volume_threshold=0.1, ): """Inspect the results of the relaxation calculation to check for convergence.""" - current_number_of_bands = parameters.get_dict()["number_of_bands"] + current_number_of_bands = parameters["number_of_bands"] is_converged = False if prev_atoms is not None: - prev_volume = prev_atoms.value.get_volume() - volume_difference = ( - abs(prev_volume - current_atoms.value.get_volume()) / prev_volume - ) + prev_volume = prev_atoms.get_volume() + volume_difference = abs(prev_volume - atoms.get_volume()) / prev_volume if volume_difference < volume_threshold: is_converged = True results = { "current_number_of_bands": current_number_of_bands, "is_converged": is_converged, - "current_atoms": current_atoms, } return results @task.graph( - outputs=[ - {"name": "atoms", "from": "relax.atoms"}, - {"name": "parameters", "from": "context.parameters"}, - ] + outputs=spec.namespace(atoms=Atoms, parameters=dict), ) -def relax_workgraph( +def RelaxWorkgraph( atoms: Atoms = None, + prev_atoms: Atoms = None, + current_number_of_bands: int = None, + is_converged: bool = False, + number_of_iterations: int = 0, + inputs: dict = None, command: str = "pw.x", computer: str = "localhost", calculation: str = "vc-relax", @@ -61,6 +56,7 @@ def relax_workgraph( max_iterations: int = 5, volume_threshold: float = 0.1, metadata: dict = None, + output_parameters: dict = None, ): """Construct a WorkGraph to relax a structure using Quantum ESPRESSO's pw.x. @@ -77,68 +73,9 @@ def relax_workgraph( Returns: WorkGraph: The constructed workgraph for the relaxation workflow. """ - from aiida_workgraph.orm.atoms import AtomsData - input_data = {} if input_data is None else input_data - # create workgraph - wg = WorkGraph("BandsStructure") - wg.context = { - "current_atoms": atoms if isinstance(atoms, AtomsData) else AtomsData(atoms), - "prev_atoms": None, - "current_number_of_bands": None, - "prev_cell_volume": None, - "is_converged": False, - } - # Add a task to compare the convergence status - should_run_while_task = wg.add_task( - should_run_while, name="should_run_while", is_converged="{{is_converged}}" - ) - # Create a while loop that continues until convergence or max_iterations is reached - while_task = wg.add_task( - "While", - name="while", - conditions=should_run_while_task.outputs.result, - max_iterations=max_iterations, - ) - relax_task = wg.add_task( - pw_calculator, - name="relax", - atoms="{{current_atoms}}", - command=command, - computer=computer, - metadata=metadata, - input_data=input_data, - pseudopotentials=pseudopotentials, - pseudo_dir=pseudo_dir, - kpts=kpts, - kspacing=kspacing, - calculation=calculation, - ) - atoms = relax_task.outputs["atoms"] - relax_task.set_context({"parameters": "parameters"}) - # -------- inspect relax ----------- - inspect_relax_task = wg.add_task( - inspect_relax, - name="inspect_relax", - parameters=relax_task.outputs["parameters"], - prev_atoms="{{current_atoms}}", - current_atoms=relax_task.outputs["atoms"], - volume_threshold=volume_threshold, - ) - # Update context variables with outputs from inspect_relax_task - inspect_relax_task.set_context( - { - "current_number_of_bands": "current_number_of_bands", - "is_converged": "is_converged", - "current_atoms": "current_atoms", - } - ) - while_task.children.add(["relax", inspect_relax_task]) - # Optionally add an SCF calculation after relaxation is complete - if run_scf: - scf_task = wg.add_task( - pw_calculator, - name="scf", + if not is_converged and number_of_iterations < max_iterations: + relax_task_out = pw_calculator( atoms=atoms, command=command, computer=computer, @@ -146,10 +83,52 @@ def relax_workgraph( input_data=input_data, pseudopotentials=pseudopotentials, pseudo_dir=pseudo_dir, - calculation="scf", kpts=kpts, kspacing=kspacing, + calculation=calculation, ) - scf_task.set_context({"parameters": "parameters"}) - - return wg + # -------- inspect relax ----------- + inspect_relax_out = inspect_relax( + parameters=relax_task_out.parameters, + prev_atoms=atoms, + atoms=relax_task_out.atoms, + volume_threshold=volume_threshold, + ) + return RelaxWorkgraph( + atoms=relax_task_out.atoms, + prev_atoms=atoms, + current_number_of_bands=inspect_relax_out.current_number_of_bands, + is_converged=inspect_relax_out.is_converged, + number_of_iterations=number_of_iterations + 1, + inputs=inputs, + command=command, + computer=computer, + input_data=input_data, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + kpts=kpts, + kspacing=kspacing, + run_scf=run_scf, + max_iterations=max_iterations, + volume_threshold=volume_threshold, + output_parameters=relax_task_out.parameters, + ) + else: + # Optionally add an SCF calculation after relaxation is complete + if run_scf: + scf_task_out = pw_calculator( + atoms=atoms, + command=command, + computer=computer, + metadata=metadata, + input_data=input_data, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + calculation="scf", + kpts=kpts, + kspacing=kspacing, + ) + return { + "atoms": atoms, + "parameters": scf_task_out.parameters if run_scf else output_parameters, + } diff --git a/workgraph_collections/ase/espresso/slabs.py b/workgraph_collections/ase/espresso/slabs.py index d7aea6f..b045a53 100644 --- a/workgraph_collections/ase/espresso/slabs.py +++ b/workgraph_collections/ase/espresso/slabs.py @@ -1,49 +1,32 @@ -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task, namespace, dynamic from workgraph_collections.ase.common.surface import get_slabs_from_miller_indices_ase from ase import Atoms -from typing import List, Dict +from typing import List, Annotated +from workgraph_collections.ase.espresso.relax import RelaxWorkgraph -@task.graph( - outputs=[ - {"name": "parameters", "from": "context.parameters"}, - {"name": "structures", "from": "context.structures"}, - ] -) -def relax_slabs(slabs, inputs): +@task.graph(outputs=namespace(parameters=dynamic(dict), structures=dynamic(Atoms))) +def RelaxSlabs( + slabs: Annotated[dict, dynamic(Atoms)], + inputs: Annotated[dict, RelaxWorkgraph.inputs.exclude("atoms")], +): """Run the scf calculation for each atoms.""" - from aiida_workgraph import WorkGraph - from workgraph_collections.ase.espresso.relax import relax_workgraph - wg = WorkGraph() + parameters = {} + structures = {} for key, atoms in slabs.items(): - scf = wg.add_task(relax_workgraph, name=f"relax_{key}", atoms=atoms) - scf.set(inputs) - scf.set_context( - {f"parameters.{key}": "parameters", f"structures.{key}": "atoms"} - ) - return wg + scf_out = RelaxWorkgraph(atoms=atoms, **inputs) + parameters[key] = scf_out.parameters + structures[key] = scf_out.atoms + return {"parameters": parameters, "structures": structures} -@task.pythonjob( - inputs=[ - { - "name": "slab_parameters", - "identifier": "workgraph.namespace", - "metadata": {"dynamic": True}, - }, - { - "name": "slab_structures", - "identifier": "workgraph.namespace", - "metadata": {"dynamic": True}, - }, - ] -) +@task() def get_surface_energy( bulk_atoms: Atoms, bulk_parameters: dict, - slab_parameters: Dict[str, dict], - slab_structures: Dict[str, dict], + slab_parameters: dynamic(dict), + slab_structures: dynamic(Atoms), ): """Calculate the surface energy.""" from ase.units import J, eV @@ -72,12 +55,11 @@ def get_surface_energy( @task.graph( - outputs=[ - {"name": "parameters", "from": "relax_slabs.parameters"}, - {"name": "structures", "from": "relax_slabs.structures"}, - ] + outputs=namespace( + parameters=dynamic(dict), structures=dynamic(Atoms), surface_energy=dict + ) ) -def slabs_workgraph( +def SlabsWorkgraph( atoms: Atoms = None, command: str = "pw.x", computer: str = "localhost", @@ -90,7 +72,6 @@ def slabs_workgraph( kspacing: float = None, input_data: dict = None, metadata: dict = None, - relax_bulk: bool = True, calc_surface_energy: bool = False, ): """Workgraph for generating slabs and relax them. @@ -98,43 +79,33 @@ def slabs_workgraph( 2. Generate slabs. 3. Relax the slabs. """ - from workgraph_collections.ase.espresso.relax import relax_workgraph + from workgraph_collections.ase.espresso.relax import RelaxWorkgraph input_data = input_data or {} - wg = WorkGraph("slabs") # -------- relax bulk ----------- - if run_relax: - relax_bulk_task = wg.add_task( - relax_workgraph, - name="relax_bulk", - command=command, - input_data=input_data, - pseudopotentials=pseudopotentials, - pseudo_dir=pseudo_dir, - atoms=atoms, - metadata=metadata, - computer=computer, - kpts=kpts, - kspacing=kspacing, - ) - atoms = relax_bulk_task.outputs["atoms"] + relax_bulk_out = RelaxWorkgraph( + command=command, + input_data=input_data, + pseudopotentials=pseudopotentials, + pseudo_dir=pseudo_dir, + atoms=atoms, + metadata=metadata, + computer=computer, + kpts=kpts, + kspacing=kspacing, + ) + atoms = relax_bulk_out.atoms # -------- generate_slabs ----------- - generate_slabs_task = wg.add_task( - get_slabs_from_miller_indices_ase, - name="generate_slabs", + generate_slabs_out = get_slabs_from_miller_indices_ase( atoms=atoms, indices=miller_indices, layers=layers, vacuum=vacuum, - computer=computer, - metadata=metadata, ) # -------- relax_slabs ----------- - relax_slabs_task = wg.add_task( - relax_slabs, - name="relax_slabs", - slabs=generate_slabs_task.outputs["slabs"], + relax_slabs_out = RelaxSlabs( + slabs=generate_slabs_out.slabs, inputs={ "command": command, "input_data": input_data, @@ -147,12 +118,14 @@ def slabs_workgraph( }, ) if calc_surface_energy: - wg.tasks.new( - get_surface_energy, - name="get_surface_energy", + surface_energy_out = get_surface_energy( bulk_atoms=atoms, - bulk_parameters=relax_bulk_task.outputs["parameters"], - slab_parameters=relax_slabs_task.outputs["parameters"], - slab_structures=relax_slabs_task.outputs["structures"], + bulk_parameters=relax_bulk_out.parameters, + slab_parameters=relax_slabs_out.parameters, + slab_structures=relax_slabs_out.structures, ) - return wg + return { + "parameters": relax_slabs_out.parameters, + "structures": relax_slabs_out.structures, + "surface_energy": surface_energy_out.result, + } diff --git a/workgraph_collections/ase/espresso/xps.py b/workgraph_collections/ase/espresso/xps.py index e8a67ab..afa4beb 100644 --- a/workgraph_collections/ase/espresso/xps.py +++ b/workgraph_collections/ase/espresso/xps.py @@ -1,4 +1,4 @@ -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task, dynamic from workgraph_collections.ase.common.core_level import ( get_marked_structures, get_binding_energy, @@ -8,7 +8,7 @@ from copy import deepcopy -@task.graph(outputs=[{"name": "results", "from": "context.scf"}]) +@task.graph(outputs=dynamic(dict)) def run_scf( marked_atoms: dict, command: str = None, @@ -21,45 +21,33 @@ def run_scf( core_hole_treatment: str = "XCH_SMEAR", is_molecule: bool = None, metadata: dict = None, -) -> WorkGraph: +) -> dict: """Run the scf calculation for each atoms.""" - from aiida_workgraph import WorkGraph from .pw import pw_calculator - wg = WorkGraph("XPS") + results = {} + # run the ground state calculation for the supercell - scf_ground = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name="ground", - atoms=marked_atoms.pop("supercell"), - computer=computer, - metadata=metadata, - ) # update pseudopotentials using ground state pseudopotentials for key, value in core_hole_pseudos.items(): pseudopotentials[key] = value["ground"] - scf_ground.set( - { - "command": command, - "input_data": input_data, - "kpts": kpts, - "pseudopotentials": pseudopotentials, - "pseudo_dir": pseudo_dir, - } + scf_ground_inputs = { + "command": command, + "input_data": input_data, + "kpts": kpts, + "pseudopotentials": pseudopotentials, + "pseudo_dir": pseudo_dir, + } + scf_ground = pw_calculator( + atoms=marked_atoms.pop("supercell"), + computer=computer, + metadata=metadata, + **scf_ground_inputs ) - scf_ground.set_context({"scf.ground": "parameters"}) + results["ground"] = scf_ground.parameters # remove the original atoms marked_atoms.pop("original", None) for key, atoms in marked_atoms.items(): - scf = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name=f"scf_{key}", - atoms=atoms, - computer=computer, - metadata=metadata, - ) # update pseudopotentials based on marked atoms # split key by last underscore label, _index = key.rsplit("_", 1) @@ -95,22 +83,23 @@ def run_scf( "tot_charge": 1, } ) - scf.set( - { - "command": command, - "input_data": input_data, - "kpts": kpts, - "pseudopotentials": pseudopotentials, - "pseudo_dir": pseudo_dir, - } + scf_inputs = { + "command": command, + "input_data": input_data, + "kpts": kpts, + "pseudopotentials": pseudopotentials, + "pseudo_dir": pseudo_dir, + } + scf_out = pw_calculator( + atoms=atoms, computer=computer, metadata=metadata, **scf_inputs ) # save the output parameters to the context - scf.set_context({f"scf.{key}": "parameters"}) - return wg + results[key] = scf_out.parameters + return results @task.graph(outputs=[{"name": "result", "from": "binding_energy.result"}]) -def xps_workgraph( +def XpsWorkgraph( atoms: Atoms = None, scf_inputs: str = None, marked_structures_inputs: dict = None, @@ -129,46 +118,30 @@ def xps_workgraph( scf_inputs = scf_inputs or {} marked_structures_inputs = marked_structures_inputs or {} - wg = WorkGraph("XPS") # -------- relax ----------- if run_relax: - relax_task = wg.add_task( - "workgraph.pythonjob", - function=pw_calculator, - name="relax", - atoms=atoms, - ) + relax_inputs = deepcopy(scf_inputs) input_data = Namelist(relax_inputs.get("input_data", {})).to_nested(binary="pw") input_data["CONTROL"]["calculation"] = "relax" relax_inputs["input_data"] = input_data - relax_task.set(relax_inputs) - atoms = relax_task.outputs["atoms"] + relax_out = pw_calculator(name="relax", atoms=atoms, **relax_inputs) + atoms = relax_out.atoms # -------- get_marked_atoms ----------- - marked_atoms_task = wg.add_task( - "workgraph.pythonjob", - function=get_marked_structures, - name="marked_atoms", - atoms=atoms, - metadata=metadata, + marked_atoms_out = get_marked_structures( + name="marked_atoms", atoms=atoms, **marked_structures_inputs ) - marked_atoms_task.set(marked_structures_inputs) # ------------------ run scf ------------------- - run_scf_task = wg.add_task( - run_scf, - name="run_scf", - marked_atoms=marked_atoms_task.outputs.structures, + run_scf_out = run_scf( + marked_atoms=marked_atoms_out.structures, core_hole_pseudos=core_hole_pseudos, is_molecule=marked_structures_inputs.get("is_molecule", False), + metadata=metadata, + **scf_inputs ) - run_scf_task.set(scf_inputs) # -------- calculate binding energy ----------- - wg.add_task( - "workgraph.pythonjob", - function=get_binding_energy, - name="get_binding_energy", + binding_energy = get_binding_energy( core_hole_pseudos=core_hole_pseudos, - scf_outputs=run_scf_task.outputs["results"], - metadata=metadata, + scf_outputs=run_scf_out.results, ) - return wg + return binding_energy.result diff --git a/workgraph_collections/bader.py b/workgraph_collections/bader.py index 6739f3b..1e72d86 100644 --- a/workgraph_collections/bader.py +++ b/workgraph_collections/bader.py @@ -1,7 +1,7 @@ from aiida_workgraph import task -@task() +@task.pythonjob() def bader_calculator( command: str = "pw.x", charge_density_folder: str = "./", diff --git a/workgraph_collections/common/eos.py b/workgraph_collections/common/eos.py index 4c8eb55..bdbc890 100644 --- a/workgraph_collections/common/eos.py +++ b/workgraph_collections/common/eos.py @@ -1,10 +1,13 @@ from aiida import orm -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task, spec +from typing import Annotated, Any # explicitly define the output socket name to match the return value of the function -@task.calcfunction(outputs=[{"name": "structures"}, {"name": "volumes"}]) -def scale_structure(structure: orm.StructureData, scales: list): +@task.calcfunction( + outputs=spec.namespace(structures=spec.dynamic(orm.StructureData), volumes=dict) +) +def scale_structure(structure: orm.StructureData, scales: list) -> dict: """Scale the structure by the given scales.""" atoms = structure.get_ase() volumes = {} @@ -20,7 +23,9 @@ def scale_structure(structure: orm.StructureData, scales: list): @task.calcfunction() # because this is a calcfunction, and the input scf_outputs are dynamic, we need use **scf_outputs. -def fit_eos(volumes: dict = None, **scf_outputs): +def fit_eos( + volumes: dict = None, **scf_outputs: Annotated[dict, spec.dynamic(dict)] +) -> orm.Dict: """Fit the EOS of the data.""" from ase.eos import EquationOfState from ase.units import kJ @@ -44,25 +49,27 @@ def fit_eos(volumes: dict = None, **scf_outputs): # Output result from context to the output socket -@task.graph(outputs=[{"name": "result", "from": "context.result"}]) -def all_scf(calculator, structures, scf_inputs): +@task.graph(outputs=spec.namespace(result=spec.dynamic(Any))) +def all_scf( + calculator, + structures: Annotated[dict, spec.dynamic(Any)], + scf_inputs: Annotated[dict, spec.dynamic(Any)], +) -> dict: """Run the scf calculation for each structure.""" - from aiida_workgraph import WorkGraph - wg = WorkGraph() + result = {} for key, structure in structures.items(): - scf = wg.add_task(calculator, name=f"scf_{key}", structure=structure) - scf.set(scf_inputs) + scf_out = calculator(structure=structure, **scf_inputs) # save the output parameters to the context - scf.set_context({f"result.{key}": "output_parameters"}) - return wg + result[key] = scf_out.output_parameters + return result -@task.graph(outputs=[{"name": "result", "from": "fit_eos.result"}]) +@task.graph def eos_workgraph( structure: orm.StructureData = None, scales: list = None, - scf_inputs: dict = None, + scf_inputs: Annotated[dict, spec.dynamic(Any)] = None, calculator: callable = None, ): """Workgraph for EOS calculation. @@ -70,21 +77,13 @@ def eos_workgraph( 2. Run the SCF calculation for each scaled structure. 3. Fit the EOS. """ - wg = WorkGraph("EOS") - scale_structure1 = wg.add_task( - scale_structure, name="scale_structure", structure=structure, scales=scales - ) - all_scf1 = wg.add_task( - all_scf, - name="all_scf", + scale_structure_out = scale_structure(structure=structure, scales=scales) + all_scf_out = all_scf( calculator=calculator, - structures=scale_structure1.outputs.structures, + structures=scale_structure_out.structures, scf_inputs=scf_inputs, ) - wg.add_task( - fit_eos, - name="fit_eos", - volumes=scale_structure1.outputs["volumes"], - scf_outputs=all_scf1.outputs.result, - ) - return wg + return fit_eos( + volumes=scale_structure_out.volumes, + scf_outputs=all_scf_out.result, + ).result diff --git a/workgraph_collections/qe/__init__.py b/workgraph_collections/qe/__init__.py index 5f5a224..f86ace8 100644 --- a/workgraph_collections/qe/__init__.py +++ b/workgraph_collections/qe/__init__.py @@ -3,10 +3,23 @@ from aiida_quantumespresso.calculations.dos import DosCalculation from aiida_quantumespresso.calculations.projwfc import ProjwfcCalculation from aiida_quantumespresso.calculations.pp import PpCalculation -from aiida_workgraph import task +from aiida_quantumespresso.calculations.pw import PwCalculation +from aiida_workgraph import task, spec +from aiida_quantumespresso.calculations.functions.seekpath_structure_analysis import ( + seekpath_structure_analysis, +) +from aiida import orm PwBaseTask = task()(PwBaseWorkChain) PwRelaxTask = task()(PwRelaxWorkChain) +PwTask = task()(PwCalculation) DosTask = task()(DosCalculation) ProjwfcTask = task()(ProjwfcCalculation) PpTask = task()(PpCalculation) + +# Add only two outputs port here, because we only use these outputs in the following. +SeekpathTask = task( + outputs=spec.namespace( + primitive_structure=orm.StructureData, explicit_kpoints=orm.KpointsData + ) +)(seekpath_structure_analysis) diff --git a/workgraph_collections/qe/bader.py b/workgraph_collections/qe/bader.py index c5508ef..8e94129 100644 --- a/workgraph_collections/qe/bader.py +++ b/workgraph_collections/qe/bader.py @@ -1,20 +1,29 @@ # -*- coding: utf-8 -*- """QeBaderWorkGraph of the AiiDA bader plugin""" from aiida import orm -from aiida_workgraph import task +from aiida_workgraph import task, spec from workgraph_collections.qe import PwBaseTask, PpTask from aiida_bader.calculations import BaderCalculation +from typing import Annotated, Any BaderTask = task()(BaderCalculation) -@task.graph(outputs=["bader_charge"]) -def bader_workgraph( +@task.graph(outputs=spec.namespace(bader_charge=Any)) +def BaderWorkgraph( structure: orm.StructureData = None, pw_code: orm.Code = None, pp_code: orm.Code = None, bader_code: orm.Code = None, - inputs: dict = None, + inputs: Annotated[ + dict, + spec.namespace( + scf=PwBaseTask.inputs, + pp_valence=PpTask.inputs, + pp_all=PpTask.inputs, + bader=BaderTask.inputs, + ), + ] = None, ): """Workgraph for Bader charge analysis. 1. Run the SCF calculation. @@ -40,7 +49,6 @@ def bader_workgraph( parent_folder=scf_outs.remote_folder, **inputs.get("pp_all", {}), ) - # -------- bader ----------- bader_outs = BaderTask( code=bader_code, @@ -48,4 +56,4 @@ def bader_workgraph( reference_charge_density_folder=pp_all_outs.remote_folder, **inputs.get("bader", {}), ) - return {"bader_charge": bader_outs.bader_charge} + return bader_outs.bader_charge diff --git a/workgraph_collections/qe/bands.py b/workgraph_collections/qe/bands.py index 1fdf09f..e3e97de 100644 --- a/workgraph_collections/qe/bands.py +++ b/workgraph_collections/qe/bands.py @@ -1,25 +1,12 @@ """BandsWorkGraph.""" from aiida import orm -from aiida_workgraph import WorkGraph, task, build_task -from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain -from aiida_quantumespresso.workflows.pw.relax import PwRelaxWorkChain -from aiida_quantumespresso.calculations.functions.seekpath_structure_analysis import ( - seekpath_structure_analysis, -) +from aiida_workgraph import task, spec +from workgraph_collections.qe import PwBaseTask, PwRelaxTask, SeekpathTask +from typing import Annotated -# we build a SeekpathTask Node -# Add only two outputs port here, because we only use these outputs in the following. -SeekpathTask = build_task( - seekpath_structure_analysis, - outputs=[ - {"name": "primitive_structure"}, - {"name": "explicit_kpoints"}, - ], -) - -@task() +@task.calcfunction() def inspect_relax(parameters): """Inspect relax calculation.""" return orm.Int(parameters.get_dict()["number_of_bands"]) @@ -52,16 +39,21 @@ def update_bands_parameters(parameters, scf_parameters, nbands_factor=None): @task.graph() -def bands_workgraph( +def BandsWorkgraph( structure: orm.StructureData = None, code: orm.Code = None, pseudo_family: str = None, - pseudos: dict = None, - inputs: dict = None, + pseudos: Annotated[dict, spec.dynamic(orm.UpfData)] = None, + inputs: Annotated[ + dict, + spec.namespace( + relax=PwRelaxTask.inputs, scf=PwBaseTask.inputs, bands=PwBaseTask.inputs + ), + ] = None, run_relax: bool = False, bands_kpoints_distance: float = None, nbands_factor: float = None, -) -> WorkGraph: +) -> Annotated[dict, PwBaseTask.outputs]: """BandsWorkGraph.""" inputs = {} if inputs is None else inputs # Initialize some variables which can be overridden in the following @@ -72,77 +64,65 @@ def bands_workgraph( pseudo_family = orm.load_group(pseudo_family) pseudos = pseudo_family.get_pseudos(structure=structure) # Initialize the workgraph - wg = WorkGraph("BandsStructure") # ------- relax ----------- if run_relax: - relax_task = wg.add_task(PwRelaxWorkChain, name="relax", structure=structure) # retrieve the relax inputs from the inputs, and set the relax inputs relax_inputs = inputs.get("relax", {}) relax_inputs.update( { + "structure": structure, "base.pw.code": code, "base.pw.pseudos": pseudos, } ) - relax_task.set(relax_inputs) + relax_task_out = PwRelaxTask(**relax_inputs) # override the input structure with the relaxed structure - structure = relax_task.outputs["output_structure"] + structure = relax_task_out.output_structure # -------- inspect_relax ----------- - inspect_relax_task = wg.add_task( - inspect_relax, - name="inspect_relax", - parameters=relax_task.outputs["output_parameters"], - ) - current_number_of_bands = inspect_relax_task.outputs.result + inspect_relax_out = inspect_relax(parameters=relax_task_out.output_parameters) + current_number_of_bands = inspect_relax_out.result # -------- seekpath ----------- if bands_kpoints_distance is not None: - seekpath_task = wg.add_task( - SeekpathTask, - name="seekpath", + seekpath_task_out = SeekpathTask( structure=structure, kwargs={"reference_distance": orm.Float(bands_kpoints_distance)}, ) - structure = seekpath_task.outputs["primitive_structure"] - # override the bands_kpoints - bands_kpoints = seekpath_task.outputs["explicit_kpoints"] + structure = seekpath_task_out.primitive_structure + bands_kpoints = seekpath_task_out.explicit_kpoints # -------- scf ----------- # retrieve the scf inputs from the inputs, and update the scf parameters - scf_inputs = inputs.get("scf", {"pw": {}}) - scf_parameters = wg.add_task( - update_scf_parameters, - name="scf_parameters", + scf_inputs = inputs.get("scf", {}) + scf_inputs.setdefault("pw", {}) + scf_parameters_out = update_scf_parameters( parameters=scf_inputs["pw"].get("parameters", {}), current_number_of_bands=current_number_of_bands, ) - scf_task = wg.add_task(PwBaseWorkChain, name="scf") - # update inputs - scf_inputs.update( + scf_inputs["pw"].update( { - "pw.code": code, - "pw.structure": structure, - "pw.pseudos": pseudos, - "pw.parameters": scf_parameters.outputs[0], + "code": code, + "structure": structure, + "pseudos": pseudos, + "parameters": scf_parameters_out.result, } ) - scf_task.set(scf_inputs) + scf_task_out = PwBaseTask(**scf_inputs) # -------- bands ----------- bands_inputs = inputs.get("bands", {"pw": {}}) - bands_parameters = wg.add_task( - update_bands_parameters, - name="bands_parameters", + bands_inputs.setdefault("pw", {}) + bands_parameters_out = update_bands_parameters( parameters=bands_inputs["pw"].get("parameters", {}), nbands_factor=nbands_factor, - scf_parameters=scf_task.outputs["output_parameters"], + scf_parameters=scf_task_out.output_parameters, ) - bands_task = wg.add_task(PwBaseWorkChain, name="bands", kpoints=bands_kpoints) - bands_inputs.update( + bands_inputs["kpoints"] = bands_kpoints + bands_inputs["pw"].update( { - "pw.code": code, - "pw.structure": structure, - "pw.pseudos": pseudos, - "pw.parent_folder": scf_task.outputs["remote_folder"], - "pw.parameters": bands_parameters.outputs[0], + "code": code, + "structure": structure, + "pseudos": pseudos, + "parent_folder": scf_task_out.remote_folder, + "parameters": bands_parameters_out.result, } ) - bands_task.set(bands_inputs) - return wg + bands_task_out = PwBaseTask(**bands_inputs) + return bands_task_out diff --git a/workgraph_collections/qe/eos.py b/workgraph_collections/qe/eos.py index 0571827..471c5ac 100644 --- a/workgraph_collections/qe/eos.py +++ b/workgraph_collections/qe/eos.py @@ -1,47 +1,43 @@ from aiida import orm -from aiida_workgraph import task, WorkGraph +from aiida_workgraph import task, spec from workgraph_collections.common.eos import scale_structure, fit_eos +from workgraph_collections.qe import PwTask +from typing import Annotated, Any # Output result from context to the output socket -@task.graph(outputs=[{"name": "result", "from": "context.result"}]) -def all_scf(structures, scf_inputs): +@task.graph(outputs=spec.namespace(result=spec.dynamic(Any))) +def all_scf( + structures: Annotated[dict, spec.dynamic(orm.StructureData)], + scf_inputs: Annotated[dict, spec.dynamic(Any)], +) -> dict: """Run the scf calculation for each structure.""" - from aiida_workgraph import WorkGraph - from aiida_quantumespresso.calculations.pw import PwCalculation - - wg = WorkGraph() + result = {} for key, structure in structures.items(): - scf = wg.add_task(PwCalculation, name=f"scf_{key}", structure=structure) - scf.set(scf_inputs) + scf_out = PwTask(structure=structure, **scf_inputs) # save the output parameters to the context - scf.set_context({f"result.{key}": "output_parameters"}) - return wg + result[key] = scf_out.output_parameters + return {"result": result} -@task.graph(outputs=[{"name": "result", "from": "fit_eos.result"}]) -def eos_workgraph( +@task.graph +def EosWorkgraph( structure: orm.StructureData = None, code: orm.Code = None, scales: list = None, parameters: dict = None, kpoints: orm.KpointsData = None, - pseudos: dict = None, - metadata: dict = None, + pseudos: Annotated[dict, spec.dynamic(orm.UpfData)] = None, + metadata: Annotated[dict, spec.dynamic(Any)] = None, ): """Workgraph for EOS calculation. 1. Get the scaled structures. 2. Run the SCF calculation for each scaled structure. 3. Fit the EOS. """ - wg = WorkGraph("EOS") - scale_structure1 = wg.add_task( - scale_structure, name="scale_structure", structure=structure, scales=scales - ) - all_scf1 = wg.add_task( - all_scf, - name="all_scf", - structures=scale_structure1.outputs.structures, + scale_structure_out = scale_structure(structure=structure, scales=scales) + all_scf_out = all_scf( + structures=scale_structure_out.structures, scf_inputs={ "code": code, "parameters": orm.Dict(parameters), @@ -50,10 +46,7 @@ def eos_workgraph( "metadata": metadata, }, ) - wg.add_task( - fit_eos, - name="fit_eos", - volumes=scale_structure1.outputs["volumes"], - scf_outputs=all_scf1.outputs.result, - ) - return wg + return fit_eos( + volumes=scale_structure_out.volumes, + scf_outputs=all_scf_out.result, + ).result diff --git a/workgraph_collections/qe/pdos.py b/workgraph_collections/qe/pdos.py index 85fcab1..6e3f6f2 100644 --- a/workgraph_collections/qe/pdos.py +++ b/workgraph_collections/qe/pdos.py @@ -1,17 +1,17 @@ -# -*- coding: utf-8 -*- """PdosWorkGraph.""" from aiida import orm -from aiida_workgraph import task +from aiida_workgraph import task, spec from workgraph_collections.qe import PwBaseTask, PwRelaxTask, DosTask, ProjwfcTask +from typing import Annotated -@task() -def generate_dos_parameters(nscf_outputs, parameters=None): +@task.calcfunction() +def generate_dos_parameters(output_band, output_parameters, parameters=None): """Generate DOS parameters from NSCF calculation.""" - nscf_emin = nscf_outputs.output_band.get_array("bands").min() - nscf_emax = nscf_outputs.output_band.get_array("bands").max() - nscf_fermi = nscf_outputs.output_parameters.dict.fermi_energy + nscf_emin = output_band.get_array("bands").min() + nscf_emax = output_band.get_array("bands").max() + nscf_fermi = output_parameters.dict.fermi_energy paras = {} if parameters is None else parameters.get_dict() paras.setdefault("DOS", {}) if paras.pop("align_to_fermi", False): @@ -21,12 +21,12 @@ def generate_dos_parameters(nscf_outputs, parameters=None): return orm.Dict(paras) -@task() -def generate_projwfc_parameters(nscf_outputs, parameters=None): +@task.calcfunction() +def generate_projwfc_parameters(output_band, output_parameters, parameters=None): """Generate PROJWFC parameters from NSCF calculation.""" - nscf_emin = nscf_outputs.output_band.get_array("bands").min() - nscf_emax = nscf_outputs.output_band.get_array("bands").max() - nscf_fermi = nscf_outputs.output_parameters.dict.fermi_energy + nscf_emin = output_band.get_array("bands").min() + nscf_emax = output_band.get_array("bands").max() + nscf_fermi = output_parameters.dict.fermi_energy paras = {} if parameters is None else parameters.get_dict() paras.setdefault("PROJWFC", {}) if paras.pop("align_to_fermi", False): @@ -36,19 +36,28 @@ def generate_projwfc_parameters(nscf_outputs, parameters=None): @task.graph( - outputs=[ - {"name": "dos", "identifier": "workgraph.namespace"}, - {"name": "projwfc", "identifier": "workgraph.namespace"}, - ] + outputs=spec.namespace( + dos=DosTask.outputs, + projwfc=ProjwfcTask.outputs, + ), ) -def pdos_workgraph( +def PdosWorkGraph( structure: orm.StructureData = None, pw_code: orm.Code = None, dos_code: orm.Code = None, projwfc_code: orm.Code = None, - inputs: dict = None, + inputs: Annotated[ + dict, + spec.namespace( + relax=PwRelaxTask.inputs, + scf=PwBaseTask.inputs, + nscf=PwBaseTask.inputs, + dos=DosTask.inputs, + projwfc=ProjwfcTask.inputs, + ), + ] = None, pseudo_family: str = None, - pseudos: dict = None, + pseudos: Annotated[dict, spec.dynamic(orm.UpfData)] = None, scf_parent_folder: orm.RemoteData = None, run_scf: bool = False, run_relax: bool = False, @@ -95,13 +104,13 @@ def pdos_workgraph( dos_input = inputs.get("dos", {}) dos_input.update({"code": dos_code}) dos_parameters_outs = generate_dos_parameters( - name="dos_parameters", + output_band=nscf_outs.output_band, + output_parameters=nscf_outs.output_parameters, parameters=dos_input.pop("parameters", {}), ) dos_input.update( { "parent_folder": nscf_outs.remote_folder, - "nscf_outputs": nscf_outs._outputs, "parameters": dos_parameters_outs.result, } ) @@ -110,13 +119,13 @@ def pdos_workgraph( projwfc_inputs = inputs.get("projwfc", {}) projwfc_inputs.update({"code": projwfc_code}) projwfc_parameters_outs = generate_projwfc_parameters( - name="projwfc_parameters", + output_band=nscf_outs.output_band, + output_parameters=nscf_outs.output_parameters, parameters=projwfc_inputs.pop("parameters", {}), ) projwfc_inputs.update( { "parent_folder": nscf_outs.remote_folder, - "nscf_outputs": nscf_outs._outputs, "parameters": projwfc_parameters_outs.result, } ) diff --git a/workgraph_collections/qe/xps.py b/workgraph_collections/qe/xps.py index 195a09f..a1cba63 100644 --- a/workgraph_collections/qe/xps.py +++ b/workgraph_collections/qe/xps.py @@ -1,76 +1,65 @@ -from aiida_workgraph import WorkGraph, task, build_task -from aiida.orm import StructureData, Dict, KpointsData, Code, List, Bool +from aiida.orm import StructureData, Dict, KpointsData, Code, List, Bool, UpfData from workgraph_collections.common.xps import binding_energy -from aiida_quantumespresso.workflows.functions.get_xspectra_structures import ( +from aiida_qe_xspec.workflows.functions.get_xspectra_structures import ( get_xspectra_structures, ) -from aiida_quantumespresso.workflows.functions.get_marked_structures import ( +from aiida_qe_xspec.workflows.functions.get_marked_structures import ( get_marked_structures, ) +from typing import Annotated +from aiida_workgraph import task, spec +from workgraph_collections.qe import PwTask # add a output socket manually -GetXspectraStructureTask = build_task( - get_xspectra_structures, - outputs=[ - {"name": "output_parameters"}, - {"name": "marked_structures"}, - ], +GetXspectraStructureTask = task(outputs=["output_parameters", "marked_structures"])( + get_xspectra_structures ) -GetMarkedStructuresTask = build_task( - get_marked_structures, - outputs=[ - {"name": "output_parameters"}, - {"name": "marked_structures"}, - ], +GetMarkedStructuresTask = task(outputs=["output_parameters", "marked_structures"])( + get_marked_structures ) -@task.graph(outputs=[{"name": "result", "from": "context.scf"}]) +@task.graph(outputs=spec.dynamic(PwTask.outputs.output_parameters)) def run_scf( structure: StructureData = None, code: Code = None, parameters: dict = None, kpoints: KpointsData = None, - pseudos: dict = None, - core_hole_pseudos: dict = None, + pseudos: Annotated[dict, spec.dynamic(UpfData)] = None, + core_hole_pseudos: Annotated[dict, spec.dynamic(UpfData)] = None, core_hole_treatment: str = "xch", is_molecule: bool = None, metadata: dict = None, - **marked_structures, + marked_structures: Annotated[dict, spec.dynamic(StructureData)] = None, ): - from aiida_workgraph import WorkGraph - from aiida_quantumespresso.calculations.pw import PwCalculation from copy import deepcopy + results = {} # output_parameters = marked_structures.pop("output_parameters", Dict({})).get_dict() sites_info = output_parameters["equivalent_sites_data"] - print("sites_info", sites_info) for site in sites_info: abs_element = sites_info[site]["symbol"] pseudos[abs_element] = core_hole_pseudos["gipaw"][abs_element] # ground state - wg = WorkGraph("run_scf") supercell = marked_structures.pop("supercell", structure) - pw_ground = wg.add_task(PwCalculation, name="ground") - pw_ground.set( - { - "code": code, - "parameters": parameters, - "kpoints": kpoints, - "pseudos": pseudos, - "metadata": metadata, - "structure": supercell, - } - ) - pw_ground.set_context({"scf.ground": "output_parameters"}) - # remove unwanted data - marked_structures = marked_structures["marked_structures"] + parameters = parameters.get_dict() if isinstance(parameters, Dict) else parameters + pw_inputs = { + "code": code, + "parameters": Dict(parameters), + "kpoints": kpoints, + "pseudos": pseudos, + "metadata": metadata, + "structure": supercell, + } + pw_ground_out = PwTask(**pw_inputs) + results["ground"] = pw_ground_out.output_parameters # excited state node - for key, marked_structure in marked_structures.items(): + for key, data in sites_info.items(): + symbol = data["symbol"] + marked_structure = marked_structures[f"{key}_{symbol}"] pseudos1 = pseudos.copy() - symbol = sites_info[key]["symbol"] pseudos1["X"] = core_hole_pseudos["core_hole"][symbol] # remove pseudo of non-exist element pseudos1 = {kind.name: pseudos1[kind.name] for kind in marked_structure.kinds} @@ -108,34 +97,32 @@ def run_scf( "tot_charge": 1, } ) - pw_excited = wg.add_task(PwCalculation, name=f"pw_excited_{key}") - pw_excited.set( - { - "code": code, - "parameters": ch_parameters, - "kpoints": kpoints, - "pseudos": pseudos1, - "metadata": metadata, - "structure": marked_structure, - "settings": settings, - } - ) - pw_excited.set_context({f"scf.{key}": "output_parameters"}) - return wg + pw_inputs = { + "code": code, + "parameters": Dict(ch_parameters), + "kpoints": kpoints, + "pseudos": pseudos1, + "metadata": metadata, + "structure": marked_structure, + "settings": settings, + } + pw_excited_out = PwTask(**pw_inputs) + results[key] = pw_excited_out.output_parameters + return results -@task.graph(outputs=[{"name": "result", "from": "binding_energy.result"}]) -def xps_workgraph( +@task.graph() +def XpsWorkgraph( structure: StructureData = None, code: Code = None, atoms_list: list = None, element_list: list = None, parameters: dict = None, kpoints: KpointsData = None, - pseudos: dict = None, + pseudos: Annotated[dict, spec.dynamic(UpfData)] = None, is_molecule: bool = False, core_hole_treatment: str = "xch", - core_hole_pseudos: dict = None, + core_hole_pseudos: Annotated[dict, spec.dynamic(UpfData)] = None, correction_energies: dict = None, metadata: dict = None, ): @@ -144,27 +131,18 @@ def xps_workgraph( 2. Run the SCF calculation for ground state, and each marked structure with core hole. 3. Calculate the binding energy. """ - wg = WorkGraph() if atoms_list: - structures_task = wg.add_task( - GetMarkedStructuresTask, - name="marked_structures", + structures_task_out = GetMarkedStructuresTask( structure=structure, atoms_list=atoms_list, ) else: - structures_task = wg.add_task( - GetXspectraStructureTask, - name="marked_structures", + structures_task_out = GetXspectraStructureTask( structure=structure, - kwargs={ - "absorbing_elements_list": List(element_list), - "is_molecule_input": Bool(is_molecule), - }, + absorbing_elements_list=List(element_list), + is_molecule_input=Bool(is_molecule), ) - run_scf1 = wg.add_task( - run_scf, - name="run_scf", + run_scf1_out = run_scf( structure=structure, code=code, parameters=parameters, @@ -174,14 +152,11 @@ def xps_workgraph( is_molecule=is_molecule, core_hole_treatment=core_hole_treatment, metadata=metadata, - marked_structures=structures_task.outputs["_outputs"], + marked_structures=structures_task_out, ) - wg.add_task( - binding_energy, - name="binding_energy", - sites_info=structures_task.outputs["output_parameters"], - scf_outputs=run_scf1.outputs.result, + binding_energy_out = binding_energy( + sites_info=structures_task_out.output_parameters, corrections=correction_energies, - energy_units="a.u", + scf_outputs=run_scf1_out, ) - return wg + return binding_energy_out