diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml new file mode 100644 index 0000000..ec37da0 --- /dev/null +++ b/.github/workflows/book.yml @@ -0,0 +1,28 @@ +name: Jupyterbook + +on: + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: "3.11" + environment-file: book/environment.yml + auto-activate-base: false + - name: Install Jupyterbook + shell: bash -l {0} + run: | + cp book/logo_dark.png . + cp book/_config.yml . + cp book/_toc.yml . + cp book/*.md . + cp -r book/images . + jupyter-book build . --path-output public + - run: mv public/_build/html public_html + - run: touch public_html/.nojekyll diff --git a/.github/workflows/delpoy.yml b/.github/workflows/delpoy.yml new file mode 100644 index 0000000..977d318 --- /dev/null +++ b/.github/workflows/delpoy.yml @@ -0,0 +1,35 @@ +name: Deploy + +on: + push: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: "3.11" + environment-file: book/environment.yml + auto-activate-base: false + - name: Install Jupyterbook + shell: bash -l {0} + run: | + cp book/logo_dark.png . + cp book/_config.yml . + cp book/_toc.yml . + cp book/*.md . + cp -r book/images . + jupyter-book build . --path-output public + - run: mv public/_build/html public_html + - run: touch public_html/.nojekyll + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@3.7.1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: gh-pages # The branch the action should deploy to. + FOLDER: public_html # The folder the action should deploy. + CLEAN: true diff --git a/aiida.ipynb b/aiida.ipynb index c7641b7..78a042f 100644 --- a/aiida.ipynb +++ b/aiida.ipynb @@ -1 +1 @@ -{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3 (ipykernel)","language":"python"},"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Setup for running Quantum ESPRESSO","metadata":{}},{"cell_type":"code","source":"import subprocess","metadata":{"tags":[],"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"try: \n subprocess.check_output([\"verdi\", \"profile\", \"setup\", \"core.sqlite_dos\", \"-n\", \"--profile\", \"test\", \"--email\", \"no@email.com\"])\nexcept: \n pass","metadata":{"tags":[],"trusted":true},"execution_count":2,"outputs":[{"name":"stderr","text":"/srv/conda/envs/notebook/lib/python3.11/site-packages/aiida/manage/configuration/settings.py:59: UserWarning: Creating AiiDA configuration folder `/home/jovyan/.aiida`.\n warnings.warn(f'Creating AiiDA configuration folder `{path}`.')\n","output_type":"stream"}]},{"cell_type":"code","source":"from pathlib import Path\nfrom ase.build import bulk\n\nfrom aiida import orm, engine, load_profile\nfrom aiida.common.exceptions import NotExistent\n\nload_profile()","metadata":{"tags":[],"trusted":true},"execution_count":3,"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"Profile"},"metadata":{}}]},{"cell_type":"code","source":"try:\n localhost = orm.load_computer('localhost')\nexcept NotExistent:\n localhost = orm.Computer(\n label='localhost',\n hostname='localhost',\n transport_type='core.local',\n scheduler_type='core.direct',\n workdir=Path('workdir').absolute().as_posix()\n ).store()\n localhost.configure()\n\ntry:\n pw_code = orm.load_code('pw@localhost')\nexcept NotExistent:\n pw_code = orm.InstalledCode(\n label='pw',\n computer=localhost,\n filepath_executable='pw.x',\n default_calc_job_plugin='aiida_qe_basic.pw',\n prepend_text='export OMP_NUM_THREADS=1'\n ).store()","metadata":{"tags":[],"trusted":true},"execution_count":4,"outputs":[{"name":"stderr","text":"/srv/conda/envs/notebook/lib/python3.11/site-packages/aiida/orm/nodes/data/code/legacy.py:42: AiidaDeprecationWarning: The `Code` class is deprecated. To create an instance, use the `aiida.orm.nodes.data.code.installed.InstalledCode` or `aiida.orm.nodes.data.code.portable.PortableCode` for a \"remote\" or \"local\" code, respectively. If you are using this class to compare type, e.g. in `isinstance`, use `aiida.orm.nodes.data.code.abstract.AbstractCode`. (this will be removed in v3)\n warn_deprecation(\n","output_type":"stream"}]},{"cell_type":"code","source":"from aiida_qe_basic.pw import PwCalculation\n\nbuilder = PwCalculation.get_builder()\n\nbuilder.code = pw_code\nbuilder.structure = orm.StructureData(ase=bulk('Al', a=4.05, cubic=True))\nbuilder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\nbuilder.parameters = orm.Dict(\n {\n 'CONTROL': {\n 'calculation': 'scf',\n # 'pseudo_dir': Path('files').absolute().as_posix(),\n },\n 'SYSTEM': {\n 'occupations': 'smearing',\n 'smearing': 'cold',\n 'degauss': 0.02\n }\n }\n)\nbuilder.metadata.options.resources = {\n 'num_machines': 1,\n 'num_mpiprocs_per_machine': 1\n}","metadata":{"tags":[],"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"! rabbitmq-server -detached","metadata":{"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"! sleep 5","metadata":{"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"results = engine.run(builder)","metadata":{"tags":[],"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"results","metadata":{"trusted":true},"execution_count":9,"outputs":[{"execution_count":9,"output_type":"execute_result","data":{"text/plain":"{'structure': ,\n 'properties': ,\n 'remote_folder': ,\n 'retrieved': }"},"metadata":{}}]},{"cell_type":"code","source":"results['properties'].get_dict()","metadata":{"trusted":true},"execution_count":10,"outputs":[{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"{'energy': -1074.9272223013, 'volume': 66.430124128914}"},"metadata":{}}]},{"cell_type":"markdown","source":"# Equation of State curve - basic QE\n\nRunning an EOS without all the fancy features in the `aiida-quantumespresso` plugin.","metadata":{}},{"cell_type":"code","source":"from pathlib import Path\n\nfrom aiida import orm, engine, load_profile\n\nload_profile()","metadata":{"trusted":true},"execution_count":11,"outputs":[{"execution_count":11,"output_type":"execute_result","data":{"text/plain":"Profile"},"metadata":{}}]},{"cell_type":"markdown","source":"## Importing a structure","metadata":{}},{"cell_type":"code","source":"from ase.build import bulk\n\nstructure = orm.StructureData(ase=bulk('Al', a=4.05, cubic=True))","metadata":{"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"markdown","source":"## Relaxing the geometry","metadata":{}},{"cell_type":"code","source":"resources = {\n 'num_machines': 1,\n 'num_mpiprocs_per_machine': 1\n}\n\nrelax_params = {\n 'CONTROL': {\n 'calculation': 'vc-relax',\n # 'pseudo_dir': Path('files').absolute().as_posix(),\n },\n 'SYSTEM': {\n 'occupations': 'smearing',\n 'smearing': 'cold',\n 'degauss': 0.02\n }\n}","metadata":{"trusted":true},"execution_count":13,"outputs":[]},{"cell_type":"code","source":"from aiida_qe_basic.pw import PwCalculation\n\nbuilder = PwCalculation.get_builder()\n\nbuilder.code = orm.load_code('pw@localhost')\nbuilder.structure = orm.StructureData(ase=bulk('Al', a=4.05, cubic=True))\nbuilder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\nbuilder.parameters = orm.Dict(relax_params)\nbuilder.metadata.options.resources = resources","metadata":{"trusted":true},"execution_count":14,"outputs":[]},{"cell_type":"code","source":"results = engine.run(builder)\nrelaxed_structure = results['structure']\nrelaxed_structure","metadata":{"trusted":true},"execution_count":15,"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":""},"metadata":{}}]},{"cell_type":"markdown","source":"## Calc function to rescale structures\n\nThe `calcfunction` below takes an input structure and rescales it to different volumes.","metadata":{}},{"cell_type":"code","source":"from aiida_qe_basic.pw import PwCalculation\n\n@engine.calcfunction\ndef rescale_list(structure: orm.StructureData, factor_list: orm.List):\n\n scaled_structure_dict = {}\n\n for index, scaling_factor in enumerate(factor_list.get_list()):\n\n ase_structure = structure.get_ase()\n\n new_cell = ase_structure.get_cell() * scaling_factor\n ase_structure.set_cell(new_cell, scale_atoms=True)\n\n scaled_structure_dict[f'structure_{index}'] = orm.StructureData(ase=ase_structure)\n\n return scaled_structure_dict","metadata":{"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"markdown","source":"Typically, you'd just run it by calling the function as you would a regular Python function:","metadata":{}},{"cell_type":"code","source":"rescaled_structures = rescale_list(relaxed_structure, orm.List(list=[0.9, 0.95, 1.0, 1.05, 1.1]))","metadata":{"trusted":true},"execution_count":17,"outputs":[]},{"cell_type":"code","source":"rescaled_structures","metadata":{"trusted":true},"execution_count":18,"outputs":[{"execution_count":18,"output_type":"execute_result","data":{"text/plain":"{'structure_0': ,\n 'structure_1': ,\n 'structure_2': ,\n 'structure_3': ,\n 'structure_4': }"},"metadata":{}}]},{"cell_type":"markdown","source":"## EOS: Work function version","metadata":{}},{"cell_type":"code","source":"scf_inputs = {\n 'CONTROL': {\n 'calculation': 'scf',\n # 'pseudo_dir': Path('files').absolute().as_posix(),\n },\n 'SYSTEM': {\n 'occupations': 'smearing',\n 'smearing': 'cold',\n 'degauss': 0.02\n }\n}","metadata":{"trusted":true},"execution_count":19,"outputs":[]},{"cell_type":"code","source":"@engine.workfunction\ndef run_eos_wf(code: orm.Code, structure: orm.StructureData, scale_factors: orm.List):\n \"\"\"Run an equation of state of a bulk crystal structure for the given element.\"\"\"\n\n properties = {}\n\n for label, rescaled_structure in rescale_list(structure, scale_factors).items():\n\n builder = PwCalculation.get_builder()\n builder.code = code\n builder.structure = rescaled_structure\n builder.parameters = orm.Dict(scf_inputs)\n builder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\n builder.metadata.options.resources = resources\n\n results = engine.run(builder)\n properties[label] = results['properties']\n\n return properties","metadata":{"trusted":true},"execution_count":20,"outputs":[]},{"cell_type":"code","source":"results = run_eos_wf(\n code=orm.load_code('pw@localhost'),\n structure=relaxed_structure,\n scale_factors=[0.9, 0.95, 1.0, 1.05, 1.1]\n)","metadata":{"trusted":true},"execution_count":21,"outputs":[]},{"cell_type":"code","source":"results","metadata":{"trusted":true},"execution_count":22,"outputs":[{"execution_count":22,"output_type":"execute_result","data":{"text/plain":"{'structure_0': ,\n 'structure_1': ,\n 'structure_2': ,\n 'structure_3': ,\n 'structure_4': }"},"metadata":{}}]},{"cell_type":"code","source":"volumes = []\nenergies = []\n\nfor result in results.values():\n volumes.append(result['volume'])\n energies.append(result['energy'])","metadata":{"trusted":true},"execution_count":23,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.plot(volumes, energies)","metadata":{"trusted":true},"execution_count":24,"outputs":[{"execution_count":24,"output_type":"execute_result","data":{"text/plain":"[]"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAAjYAAAGsCAYAAADOo+2NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJoklEQVR4nO3deVxU9f4/8NcsMOyDiuybO4KAO0uW1S3UNBUtM5WsbpZ6u6231NutrG5ZfX+3W91uWtpqVla4Z6Te1EoERUVQUVxQEBhAkGGTbebz+wOhCJBFhjNz5vV8POYPzpzDvD990nl5zvmct0IIIUBEREQkA0qpCyAiIiLqLgw2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2V7366quIjo6Gg4MDXF1dO3SMEALLly+Ht7c37O3tcfPNN+P48eNN758/fx4KhaLV17ffftvi99XU1GD48OFQKBRITU3tVP0rV65EWFgYXFxc4OLigqioKPzwww+d+h1ERESWjsHmqtraWtx9991YtGhRh49588038dZbb+G9997DwYMH4enpidtvvx3l5eUAAD8/P+Tn5zd7vfTSS3B0dMSkSZNa/L5nn30W3t7eXarf19cXr7/+OlJSUpCSkoJbb70V06ZNaxa0iIiIZE9QM5988onQarXt7mc0GoWnp6d4/fXXm7ZVV1cLrVYrVq1a1eZxw4cPFw8++GCL7du3bxdBQUHi+PHjAoA4cuRIs/ePHz8uJk2aJBwdHYW7u7uYN2+eKCoqumaNvXr1EmvWrGl3LERERHLBMzZdlJWVBZ1Oh5iYmKZtGo0G48ePR2JiYqvHHDp0CKmpqfjzn//cbHtBQQEWLFiAtWvXwsHBocVx+fn5GD9+PIYPH46UlBQkJCSgoKAAs2bNavVzDAYDvv76a1RWViIqKuo6RklERGRZ1FIXYKl0Oh0AwMPDo9l2Dw8PXLhwodVjPvroIwwdOhTR0dFN24QQuP/++7Fw4UKMHj0a58+fb3HcypUrMXLkSLz22mtN2z7++GP4+fkhMzMTgwcPBgCkp6cjKioK1dXVcHJywsaNGxEcHHy9QyUiIrIYsj5js3z58jZv3m18paSkXNdnKBSKZj8LIVpsA4ArV67gyy+/bHG25j//+Q/KysqwbNmyNj/j0KFD2L17N5ycnJpeQUFBAICzZ8827TdkyBCkpqYiKSkJixYtwvz583HixInrGR4REZFFkfUZm0cffRSzZ8++5j6BgYFd+t2enp4AGs7ceHl5NW0vLCxscRYHAL777jtUVVXhvvvua7b9p59+QlJSEjQaTbPto0ePxty5c/HZZ5/BaDTizjvvxBtvvNHi9/7+s21tbTFw4MCm4w8ePIh33nkHH3zwQZfGSEREZGlkHWzc3Nzg5uZmkt/dr18/eHp6YufOnRgxYgSAhpVVe/fubTWAfPTRR5g6dSr69u3bbPu7776Lf/7zn00/5+XlYcKECVi/fj0iIiIAACNHjkR8fDwCAwOhVnd8yoQQqKmp6crwiIiILJKsg01nZGdno6SkBNnZ2TAYDE3PkRk4cCCcnJwAAEFBQVixYgViY2OhUCjwxBNP4LXXXsOgQYMwaNAgvPbaa3BwcMCcOXOa/e4zZ87g559/xvbt21t8rr+/f7OfGz9rwIAB8PX1BQD85S9/werVq3HvvffimWeegZubG86cOYOvv/4aq1evhkqlwt///ndMmjQJfn5+KC8vx9dff409e/YgISGhu/9TERERmS0Gm6teeOEFfPbZZ00/N56F2b17N26++WYAwKlTp6DX65v2efbZZ3HlyhUsXrwYly9fRkREBHbs2AFnZ+dmv/vjjz+Gj49PsxVUneHt7Y19+/ZhyZIlmDBhAmpqahAQEICJEydCqWy4TaqgoABxcXHIz8+HVqtFWFgYEhIScPvtt3fpM4mIiCyRQgghpC6CiIiIqDvIelUUERERWRcGGyIiIpIN2d1jYzQakZeXB2dn51afJ0NERETmRwiB8vJyeHt7N90/2hWyCzZ5eXnw8/OTugwiIiLqgpycnKZVwV0hu2DTuCIpJycHLi4uEldDREREHVFWVgY/P78WK4s7S3bBpvHyk4uLC4MNERGRhbne20h48zARERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGg00H6a/UYc0v57DkuzSpSyEiIqI2MNh0UHWdAa9tz8D6lBxcKK6UuhwiIiJqBYNNB3m42OGGgW4AgE1H8iSuhoiIiFrDYNMJsSN8AACbUnMhhJC4GiIi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hx4SEyZMkKjC6/P78bUmLy9P2NjYiPj4+B6urOtsbGxEVFRUs21//etfRWRkpBBCWPw8tje+1ljiPDaKiYkRU6ZMafrZ0ufvj/44vtZY4vx99dVXwtfXV3z11VciLS1NfP7556J3797i008/FUJY/jy2N77WWOI8njlzRtx0000CgFCpVGLMmDFi7ty5YujQod02h7wU1cMcHR0RGhqK06dPN60e0ul0zfYpLCyEh4eHFOVdt9+PrzVeXl4ICAho831z5OXlheDg4Gbbhg4diuzsbACw+Hlsb3xtHWNp8wgAFy5cwK5du/DQQw81bbP0+fu91sbXGkucv2eeeQZLly7F7NmzERoairi4ODz55JNYsWIFAMufx/bG1xpLnMcBAwZg7969qKioQE5ODg4cOIC6ujr069ev2+aQwaaH1dTUICMjA15eXk0TuXPnzqb3a2trsXfvXkRHR0tYZdf9fnytKS4uRk5OTpvvm6MbbrgBp06darYtMzMTAQEBAGDx89je+FpjifMIAJ988gnc3d0xefLkpm2WPn+/19r4WmOJ81dVVQWlsvlXlkqlaloObenz2N74WmOJ89jI0dERXl5euHz5Mn788UdMmzat++awu08zUXNPP/202LNnjzh37pxISkoSU6ZMEc7OzuL8+fNCiIalbVqtVmzYsEGkp6eLe++912KWJwpx7fGVl5eLp59+WiQmJoqsrCyxe/duERUVJXx8fCxmfEIIceDAAaFWq8Wrr74qTp8+LdatWyccHBzEF1980bSPJc9je+OTyzwaDAbh7+8vlixZ0uI9S56/Rm2NTy7zN3/+fOHj49O0HHrDhg3Czc1NPPvss037WPI8tjc+ucxjQkKC+OGHH8S5c+fEjh07RHh4uBg7dqyora0VQnTPHDLYmFjjGnwbGxvh7e0tZsyYIY4fP970vtFoFC+++KLw9PQUGo1G3HTTTSI9PV3CijvnWuOrqqoSMTExom/fvsLGxkb4+/uL+fPni+zsbImr7rytW7eKYcOGCY1GI4KCgsSHH37Y7H1Ln8drjU8u8/jjjz8KAOLUqVMt3rP0+ROi7fHJZf7KysrE448/Lvz9/YWdnZ3o37+/eO6550RNTU3TPpY8j+2NTy7zuH79etG/f39ha2srPD09xV/+8hdRWlra9H53zKFCCCG6/RwTERERkQR4jw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREcnG/wci5SF28bFkygAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"markdown","source":"## Work chain version","metadata":{}},{"cell_type":"code","source":"@engine.calcfunction\ndef create_eos_dictionary(**kwargs) -> orm.Dict:\n eos = {\n label: (result['volume'], result['energy'])\n for label, result in kwargs.items()\n }\n return orm.Dict(eos)","metadata":{"trusted":true},"execution_count":25,"outputs":[]},{"cell_type":"code","source":"create_eos_dictionary(**results).get_dict()","metadata":{"trusted":true},"execution_count":26,"outputs":[{"execution_count":26,"output_type":"execute_result","data":{"text/plain":"{'structure_0': [48.283007573324, -1073.9421694118],\n 'structure_1': [56.785519366503, -1074.7251942208],\n 'structure_2': [66.231834805659, -1074.9273047095],\n 'structure_3': [76.671627766898, -1074.7863009779],\n 'structure_4': [88.154572126333, -1074.451028786]}"},"metadata":{}}]},{"cell_type":"code","source":"class EquationOfState(engine.WorkChain):\n \"\"\"WorkChain to compute Equation of State using Quantum ESPRESSO.\"\"\"\n\n @classmethod\n def define(cls, spec):\n \"\"\"Specify inputs and outputs.\"\"\"\n super().define(spec)\n spec.input(\"code\", valid_type=orm.Code)\n spec.input(\"structure\", valid_type=orm.StructureData)\n spec.input(\"scale_factors\", valid_type=orm.List)\n\n spec.outline(\n cls.run_eos,\n cls.results,\n )\n spec.output(\"eos_dict\", valid_type=orm.Dict)\n\n def run_eos(self):\n\n calcjob_dict = {}\n\n for label, rescaled_structure in rescale_list(self.inputs.structure, self.inputs.scale_factors).items():\n\n builder = PwCalculation.get_builder()\n builder.code = self.inputs.code\n builder.structure = rescaled_structure\n builder.parameters = orm.Dict(scf_inputs)\n builder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\n builder.metadata.options.resources = resources\n\n calcjob_dict[label] = self.submit(builder)\n\n self.ctx.labels = list(calcjob_dict.keys())\n\n return calcjob_dict\n\n def results(self):\n\n self.report(self.ctx)\n\n eos_results = {\n label: self.ctx[label].outputs['properties'] for label in self.ctx.labels\n }\n eos_dict = create_eos_dictionary(**eos_results)\n self.out('eos_dict', eos_dict)\n","metadata":{"trusted":true},"execution_count":27,"outputs":[]},{"cell_type":"code","source":"engine.run(EquationOfState, code=orm.load_code('pw@localhost'),\n structure=relaxed_structure,\n scale_factors=orm.List([0.9, 0.95, 1.0, 1.05, 1.1]))","metadata":{"trusted":true},"execution_count":28,"outputs":[{"name":"stderr","text":"04/04/2024 05:40:39 PM <83> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [71|EquationOfState|results]: AttributeDict({'labels': ['structure_0', 'structure_1', 'structure_2', 'structure_3', 'structure_4'], 'structure_0': , 'structure_1': , 'structure_2': , 'structure_3': , 'structure_4': })\n","output_type":"stream"},{"execution_count":28,"output_type":"execute_result","data":{"text/plain":"{'eos_dict': }"},"metadata":{}}]},{"cell_type":"markdown","source":"## Using the `builder`","metadata":{}},{"cell_type":"code","source":"builder = EquationOfState.get_builder()","metadata":{"trusted":true},"execution_count":29,"outputs":[]},{"cell_type":"code","source":"builder.structure = relaxed_structure","metadata":{"trusted":true},"execution_count":30,"outputs":[]},{"cell_type":"code","source":"builder","metadata":{"trusted":true},"execution_count":31,"outputs":[{"execution_count":31,"output_type":"execute_result","data":{"text/plain":"Process class: EquationOfState\nInputs:\nmetadata: {}\nstructure: Al\n"},"metadata":{}}]},{"cell_type":"code","source":"builder.scale_factors = orm.List([0.9, 0.95, 1.0, 1.05, 1.1])\nbuilder.code = orm.load_code('pw@localhost')","metadata":{"trusted":true},"execution_count":32,"outputs":[]},{"cell_type":"code","source":"results, node = engine.run_get_node(builder)","metadata":{"trusted":true},"execution_count":33,"outputs":[{"name":"stderr","text":"04/04/2024 05:41:05 PM <83> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [116|EquationOfState|results]: AttributeDict({'labels': ['structure_0', 'structure_1', 'structure_2', 'structure_3', 'structure_4'], 'structure_0': , 'structure_1': , 'structure_2': , 'structure_3': , 'structure_4': })\n","output_type":"stream"}]},{"cell_type":"code","source":"results['eos_dict'].get_dict()","metadata":{"trusted":true},"execution_count":34,"outputs":[{"execution_count":34,"output_type":"execute_result","data":{"text/plain":"{'structure_0': [48.283007573324, -1073.9421694118],\n 'structure_1': [56.785519366503, -1074.7251942208],\n 'structure_2': [66.231834805659, -1074.9273047095],\n 'structure_3': [76.671627766898, -1074.7863009779],\n 'structure_4': [88.154572126333, -1074.451028786]}"},"metadata":{}}]},{"cell_type":"code","source":"eos = node.outputs.eos_dict.get_dict()","metadata":{"trusted":true},"execution_count":35,"outputs":[]},{"cell_type":"code","source":"eos","metadata":{"trusted":true},"execution_count":36,"outputs":[{"execution_count":36,"output_type":"execute_result","data":{"text/plain":"{'structure_0': [48.283007573324, -1073.9421694118],\n 'structure_1': [56.785519366503, -1074.7251942208],\n 'structure_2': [66.231834805659, -1074.9273047095],\n 'structure_3': [76.671627766898, -1074.7863009779],\n 'structure_4': [88.154572126333, -1074.451028786]}"},"metadata":{}}]},{"cell_type":"code","source":"plt.plot(\n [v[0] for v in eos.values()],\n [v[1] for v in eos.values()],\n)","metadata":{"tags":[],"trusted":true},"execution_count":37,"outputs":[{"execution_count":37,"output_type":"execute_result","data":{"text/plain":"[]"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAAjYAAAGsCAYAAADOo+2NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJoklEQVR4nO3deVxU9f4/8NcsMOyDiuybO4KAO0uW1S3UNBUtM5WsbpZ6u6231NutrG5ZfX+3W91uWtpqVla4Z6Te1EoERUVQUVxQEBhAkGGTbebz+wOhCJBFhjNz5vV8POYPzpzDvD990nl5zvmct0IIIUBEREQkA0qpCyAiIiLqLgw2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2V7366quIjo6Gg4MDXF1dO3SMEALLly+Ht7c37O3tcfPNN+P48eNN758/fx4KhaLV17ffftvi99XU1GD48OFQKBRITU3tVP0rV65EWFgYXFxc4OLigqioKPzwww+d+h1ERESWjsHmqtraWtx9991YtGhRh49588038dZbb+G9997DwYMH4enpidtvvx3l5eUAAD8/P+Tn5zd7vfTSS3B0dMSkSZNa/L5nn30W3t7eXarf19cXr7/+OlJSUpCSkoJbb70V06ZNaxa0iIiIZE9QM5988onQarXt7mc0GoWnp6d4/fXXm7ZVV1cLrVYrVq1a1eZxw4cPFw8++GCL7du3bxdBQUHi+PHjAoA4cuRIs/ePHz8uJk2aJBwdHYW7u7uYN2+eKCoqumaNvXr1EmvWrGl3LERERHLBMzZdlJWVBZ1Oh5iYmKZtGo0G48ePR2JiYqvHHDp0CKmpqfjzn//cbHtBQQEWLFiAtWvXwsHBocVx+fn5GD9+PIYPH46UlBQkJCSgoKAAs2bNavVzDAYDvv76a1RWViIqKuo6RklERGRZ1FIXYKl0Oh0AwMPDo9l2Dw8PXLhwodVjPvroIwwdOhTR0dFN24QQuP/++7Fw4UKMHj0a58+fb3HcypUrMXLkSLz22mtN2z7++GP4+fkhMzMTgwcPBgCkp6cjKioK1dXVcHJywsaNGxEcHHy9QyUiIrIYsj5js3z58jZv3m18paSkXNdnKBSKZj8LIVpsA4ArV67gyy+/bHG25j//+Q/KysqwbNmyNj/j0KFD2L17N5ycnJpeQUFBAICzZ8827TdkyBCkpqYiKSkJixYtwvz583HixInrGR4REZFFkfUZm0cffRSzZ8++5j6BgYFd+t2enp4AGs7ceHl5NW0vLCxscRYHAL777jtUVVXhvvvua7b9p59+QlJSEjQaTbPto0ePxty5c/HZZ5/BaDTizjvvxBtvvNHi9/7+s21tbTFw4MCm4w8ePIh33nkHH3zwQZfGSEREZGlkHWzc3Nzg5uZmkt/dr18/eHp6YufOnRgxYgSAhpVVe/fubTWAfPTRR5g6dSr69u3bbPu7776Lf/7zn00/5+XlYcKECVi/fj0iIiIAACNHjkR8fDwCAwOhVnd8yoQQqKmp6crwiIiILJKsg01nZGdno6SkBNnZ2TAYDE3PkRk4cCCcnJwAAEFBQVixYgViY2OhUCjwxBNP4LXXXsOgQYMwaNAgvPbaa3BwcMCcOXOa/e4zZ87g559/xvbt21t8rr+/f7OfGz9rwIAB8PX1BQD85S9/werVq3HvvffimWeegZubG86cOYOvv/4aq1evhkqlwt///ndMmjQJfn5+KC8vx9dff409e/YgISGhu/9TERERmS0Gm6teeOEFfPbZZ00/N56F2b17N26++WYAwKlTp6DX65v2efbZZ3HlyhUsXrwYly9fRkREBHbs2AFnZ+dmv/vjjz+Gj49PsxVUneHt7Y19+/ZhyZIlmDBhAmpqahAQEICJEydCqWy4TaqgoABxcXHIz8+HVqtFWFgYEhIScPvtt3fpM4mIiCyRQgghpC6CiIiIqDvIelUUERERWRcGGyIiIpIN2d1jYzQakZeXB2dn51afJ0NERETmRwiB8vJyeHt7N90/2hWyCzZ5eXnw8/OTugwiIiLqgpycnKZVwV0hu2DTuCIpJycHLi4uEldDREREHVFWVgY/P78WK4s7S3bBpvHyk4uLC4MNERGRhbne20h48zARERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGg00H6a/UYc0v57DkuzSpSyEiIqI2MNh0UHWdAa9tz8D6lBxcKK6UuhwiIiJqBYNNB3m42OGGgW4AgE1H8iSuhoiIiFrDYNMJsSN8AACbUnMhhJC4GiIi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hx4SEyZMkKjC6/P78bUmLy9P2NjYiPj4+B6urOtsbGxEVFRUs21//etfRWRkpBBCWPw8tje+1ljiPDaKiYkRU6ZMafrZ0ufvj/44vtZY4vx99dVXwtfXV3z11VciLS1NfP7556J3797i008/FUJY/jy2N77WWOI8njlzRtx0000CgFCpVGLMmDFi7ty5YujQod02h7wU1cMcHR0RGhqK06dPN60e0ul0zfYpLCyEh4eHFOVdt9+PrzVeXl4ICAho831z5OXlheDg4Gbbhg4diuzsbACw+Hlsb3xtHWNp8wgAFy5cwK5du/DQQw81bbP0+fu91sbXGkucv2eeeQZLly7F7NmzERoairi4ODz55JNYsWIFAMufx/bG1xpLnMcBAwZg7969qKioQE5ODg4cOIC6ujr069ev2+aQwaaH1dTUICMjA15eXk0TuXPnzqb3a2trsXfvXkRHR0tYZdf9fnytKS4uRk5OTpvvm6MbbrgBp06darYtMzMTAQEBAGDx89je+FpjifMIAJ988gnc3d0xefLkpm2WPn+/19r4WmOJ81dVVQWlsvlXlkqlaloObenz2N74WmOJ89jI0dERXl5euHz5Mn788UdMmzat++awu08zUXNPP/202LNnjzh37pxISkoSU6ZMEc7OzuL8+fNCiIalbVqtVmzYsEGkp6eLe++912KWJwpx7fGVl5eLp59+WiQmJoqsrCyxe/duERUVJXx8fCxmfEIIceDAAaFWq8Wrr74qTp8+LdatWyccHBzEF1980bSPJc9je+OTyzwaDAbh7+8vlixZ0uI9S56/Rm2NTy7zN3/+fOHj49O0HHrDhg3Czc1NPPvss037WPI8tjc+ucxjQkKC+OGHH8S5c+fEjh07RHh4uBg7dqyora0VQnTPHDLYmFjjGnwbGxvh7e0tZsyYIY4fP970vtFoFC+++KLw9PQUGo1G3HTTTSI9PV3CijvnWuOrqqoSMTExom/fvsLGxkb4+/uL+fPni+zsbImr7rytW7eKYcOGCY1GI4KCgsSHH37Y7H1Ln8drjU8u8/jjjz8KAOLUqVMt3rP0+ROi7fHJZf7KysrE448/Lvz9/YWdnZ3o37+/eO6550RNTU3TPpY8j+2NTy7zuH79etG/f39ha2srPD09xV/+8hdRWlra9H53zKFCCCG6/RwTERERkQR4jw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREcnG/wci5SF28bFkygAAAABJRU5ErkJggg=="},"metadata":{}}]}]} \ No newline at end of file +{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3 (ipykernel)","language":"python"},"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Aiida","metadata":{}},{"cell_type":"code","source":"import subprocess","metadata":{"tags":[]},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"try: \n subprocess.check_output([\"verdi\", \"profile\", \"setup\", \"core.sqlite_dos\", \"-n\", \"--profile\", \"test\", \"--email\", \"no@email.com\"])\nexcept: \n pass","metadata":{"tags":[]},"execution_count":2,"outputs":[{"name":"stderr","text":"/srv/conda/envs/notebook/lib/python3.11/site-packages/aiida/manage/configuration/settings.py:59: UserWarning: Creating AiiDA configuration folder `/home/jovyan/.aiida`.\n warnings.warn(f'Creating AiiDA configuration folder `{path}`.')\n","output_type":"stream"}]},{"cell_type":"code","source":"from pathlib import Path\nfrom ase.build import bulk\n\nfrom aiida import orm, engine, load_profile\nfrom aiida.common.exceptions import NotExistent\n\nload_profile()","metadata":{"tags":[]},"execution_count":3,"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"Profile"},"metadata":{}}]},{"cell_type":"code","source":"try:\n localhost = orm.load_computer('localhost')\nexcept NotExistent:\n localhost = orm.Computer(\n label='localhost',\n hostname='localhost',\n transport_type='core.local',\n scheduler_type='core.direct',\n workdir=Path('workdir').absolute().as_posix()\n ).store()\n localhost.configure()\n\ntry:\n pw_code = orm.load_code('pw@localhost')\nexcept NotExistent:\n pw_code = orm.InstalledCode(\n label='pw',\n computer=localhost,\n filepath_executable='pw.x',\n default_calc_job_plugin='aiida_qe_basic.pw',\n prepend_text='export OMP_NUM_THREADS=1'\n ).store()","metadata":{"tags":[]},"execution_count":4,"outputs":[{"name":"stderr","text":"/srv/conda/envs/notebook/lib/python3.11/site-packages/aiida/orm/nodes/data/code/legacy.py:42: AiidaDeprecationWarning: The `Code` class is deprecated. To create an instance, use the `aiida.orm.nodes.data.code.installed.InstalledCode` or `aiida.orm.nodes.data.code.portable.PortableCode` for a \"remote\" or \"local\" code, respectively. If you are using this class to compare type, e.g. in `isinstance`, use `aiida.orm.nodes.data.code.abstract.AbstractCode`. (this will be removed in v3)\n warn_deprecation(\n","output_type":"stream"}]},{"cell_type":"code","source":"from aiida_qe_basic.pw import PwCalculation\n\nbuilder = PwCalculation.get_builder()\n\nbuilder.code = pw_code\nbuilder.structure = orm.StructureData(ase=bulk('Al', a=4.05, cubic=True))\nbuilder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\nbuilder.parameters = orm.Dict(\n {\n 'CONTROL': {\n 'calculation': 'scf',\n # 'pseudo_dir': Path('files').absolute().as_posix(),\n },\n 'SYSTEM': {\n 'occupations': 'smearing',\n 'smearing': 'cold',\n 'degauss': 0.02\n }\n }\n)\nbuilder.metadata.options.resources = {\n 'num_machines': 1,\n 'num_mpiprocs_per_machine': 1\n}","metadata":{"tags":[]},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"! rabbitmq-server -detached","metadata":{},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"! sleep 5","metadata":{},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"results = engine.run(builder)","metadata":{"tags":[]},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"results","metadata":{},"execution_count":9,"outputs":[{"execution_count":9,"output_type":"execute_result","data":{"text/plain":"{'structure': ,\n 'properties': ,\n 'remote_folder': ,\n 'retrieved': }"},"metadata":{}}]},{"cell_type":"code","source":"results['properties'].get_dict()","metadata":{},"execution_count":10,"outputs":[{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"{'energy': -1074.9272223013, 'volume': 66.430124128914}"},"metadata":{}}]},{"cell_type":"markdown","source":"## Equation of State curve - basic QE\n\nRunning an EOS without all the fancy features in the `aiida-quantumespresso` plugin.","metadata":{}},{"cell_type":"code","source":"from pathlib import Path\n\nfrom aiida import orm, engine, load_profile\n\nload_profile()","metadata":{},"execution_count":11,"outputs":[{"execution_count":11,"output_type":"execute_result","data":{"text/plain":"Profile"},"metadata":{}}]},{"cell_type":"markdown","source":"### Importing a structure","metadata":{}},{"cell_type":"code","source":"from ase.build import bulk\n\nstructure = orm.StructureData(ase=bulk('Al', a=4.05, cubic=True))","metadata":{},"execution_count":12,"outputs":[]},{"cell_type":"markdown","source":"### Relaxing the geometry","metadata":{}},{"cell_type":"code","source":"resources = {\n 'num_machines': 1,\n 'num_mpiprocs_per_machine': 1\n}\n\nrelax_params = {\n 'CONTROL': {\n 'calculation': 'vc-relax',\n # 'pseudo_dir': Path('files').absolute().as_posix(),\n },\n 'SYSTEM': {\n 'occupations': 'smearing',\n 'smearing': 'cold',\n 'degauss': 0.02\n }\n}","metadata":{},"execution_count":13,"outputs":[]},{"cell_type":"code","source":"from aiida_qe_basic.pw import PwCalculation\n\nbuilder = PwCalculation.get_builder()\n\nbuilder.code = orm.load_code('pw@localhost')\nbuilder.structure = orm.StructureData(ase=bulk('Al', a=4.05, cubic=True))\nbuilder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\nbuilder.parameters = orm.Dict(relax_params)\nbuilder.metadata.options.resources = resources","metadata":{},"execution_count":14,"outputs":[]},{"cell_type":"code","source":"results = engine.run(builder)\nrelaxed_structure = results['structure']\nrelaxed_structure","metadata":{},"execution_count":15,"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":""},"metadata":{}}]},{"cell_type":"markdown","source":"### Calc function to rescale structures\n\nThe `calcfunction` below takes an input structure and rescales it to different volumes.","metadata":{}},{"cell_type":"code","source":"from aiida_qe_basic.pw import PwCalculation\n\n@engine.calcfunction\ndef rescale_list(structure: orm.StructureData, factor_list: orm.List):\n\n scaled_structure_dict = {}\n\n for index, scaling_factor in enumerate(factor_list.get_list()):\n\n ase_structure = structure.get_ase()\n\n new_cell = ase_structure.get_cell() * scaling_factor\n ase_structure.set_cell(new_cell, scale_atoms=True)\n\n scaled_structure_dict[f'structure_{index}'] = orm.StructureData(ase=ase_structure)\n\n return scaled_structure_dict","metadata":{},"execution_count":16,"outputs":[]},{"cell_type":"markdown","source":"Typically, you'd just run it by calling the function as you would a regular Python function:","metadata":{}},{"cell_type":"code","source":"rescaled_structures = rescale_list(relaxed_structure, orm.List(list=[0.9, 0.95, 1.0, 1.05, 1.1]))","metadata":{},"execution_count":17,"outputs":[]},{"cell_type":"code","source":"rescaled_structures","metadata":{},"execution_count":18,"outputs":[{"execution_count":18,"output_type":"execute_result","data":{"text/plain":"{'structure_0': ,\n 'structure_1': ,\n 'structure_2': ,\n 'structure_3': ,\n 'structure_4': }"},"metadata":{}}]},{"cell_type":"markdown","source":"## EOS: Work function version","metadata":{}},{"cell_type":"code","source":"scf_inputs = {\n 'CONTROL': {\n 'calculation': 'scf',\n # 'pseudo_dir': Path('files').absolute().as_posix(),\n },\n 'SYSTEM': {\n 'occupations': 'smearing',\n 'smearing': 'cold',\n 'degauss': 0.02\n }\n}","metadata":{},"execution_count":19,"outputs":[]},{"cell_type":"code","source":"@engine.workfunction\ndef run_eos_wf(code: orm.Code, structure: orm.StructureData, scale_factors: orm.List):\n \"\"\"Run an equation of state of a bulk crystal structure for the given element.\"\"\"\n\n properties = {}\n\n for label, rescaled_structure in rescale_list(structure, scale_factors).items():\n\n builder = PwCalculation.get_builder()\n builder.code = code\n builder.structure = rescaled_structure\n builder.parameters = orm.Dict(scf_inputs)\n builder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\n builder.metadata.options.resources = resources\n\n results = engine.run(builder)\n properties[label] = results['properties']\n\n return properties","metadata":{},"execution_count":20,"outputs":[]},{"cell_type":"code","source":"results = run_eos_wf(\n code=orm.load_code('pw@localhost'),\n structure=relaxed_structure,\n scale_factors=[0.9, 0.95, 1.0, 1.05, 1.1]\n)","metadata":{},"execution_count":21,"outputs":[]},{"cell_type":"code","source":"results","metadata":{},"execution_count":22,"outputs":[{"execution_count":22,"output_type":"execute_result","data":{"text/plain":"{'structure_0': ,\n 'structure_1': ,\n 'structure_2': ,\n 'structure_3': ,\n 'structure_4': }"},"metadata":{}}]},{"cell_type":"code","source":"volumes = []\nenergies = []\n\nfor result in results.values():\n volumes.append(result['volume'])\n energies.append(result['energy'])","metadata":{},"execution_count":23,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.plot(volumes, energies)","metadata":{},"execution_count":24,"outputs":[{"execution_count":24,"output_type":"execute_result","data":{"text/plain":"[]"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAAjYAAAGsCAYAAADOo+2NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJoklEQVR4nO3deVxU9f4/8NcsMOyDiuybO4KAO0uW1S3UNBUtM5WsbpZ6u6231NutrG5ZfX+3W91uWtpqVla4Z6Te1EoERUVQUVxQEBhAkGGTbebz+wOhCJBFhjNz5vV8POYPzpzDvD990nl5zvmct0IIIUBEREQkA0qpCyAiIiLqLgw2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2V7366quIjo6Gg4MDXF1dO3SMEALLly+Ht7c37O3tcfPNN+P48eNN758/fx4KhaLV17ffftvi99XU1GD48OFQKBRITU3tVP0rV65EWFgYXFxc4OLigqioKPzwww+d+h1ERESWjsHmqtraWtx9991YtGhRh49588038dZbb+G9997DwYMH4enpidtvvx3l5eUAAD8/P+Tn5zd7vfTSS3B0dMSkSZNa/L5nn30W3t7eXarf19cXr7/+OlJSUpCSkoJbb70V06ZNaxa0iIiIZE9QM5988onQarXt7mc0GoWnp6d4/fXXm7ZVV1cLrVYrVq1a1eZxw4cPFw8++GCL7du3bxdBQUHi+PHjAoA4cuRIs/ePHz8uJk2aJBwdHYW7u7uYN2+eKCoqumaNvXr1EmvWrGl3LERERHLBMzZdlJWVBZ1Oh5iYmKZtGo0G48ePR2JiYqvHHDp0CKmpqfjzn//cbHtBQQEWLFiAtWvXwsHBocVx+fn5GD9+PIYPH46UlBQkJCSgoKAAs2bNavVzDAYDvv76a1RWViIqKuo6RklERGRZ1FIXYKl0Oh0AwMPDo9l2Dw8PXLhwodVjPvroIwwdOhTR0dFN24QQuP/++7Fw4UKMHj0a58+fb3HcypUrMXLkSLz22mtN2z7++GP4+fkhMzMTgwcPBgCkp6cjKioK1dXVcHJywsaNGxEcHHy9QyUiIrIYsj5js3z58jZv3m18paSkXNdnKBSKZj8LIVpsA4ArV67gyy+/bHG25j//+Q/KysqwbNmyNj/j0KFD2L17N5ycnJpeQUFBAICzZ8827TdkyBCkpqYiKSkJixYtwvz583HixInrGR4REZFFkfUZm0cffRSzZ8++5j6BgYFd+t2enp4AGs7ceHl5NW0vLCxscRYHAL777jtUVVXhvvvua7b9p59+QlJSEjQaTbPto0ePxty5c/HZZ5/BaDTizjvvxBtvvNHi9/7+s21tbTFw4MCm4w8ePIh33nkHH3zwQZfGSEREZGlkHWzc3Nzg5uZmkt/dr18/eHp6YufOnRgxYgSAhpVVe/fubTWAfPTRR5g6dSr69u3bbPu7776Lf/7zn00/5+XlYcKECVi/fj0iIiIAACNHjkR8fDwCAwOhVnd8yoQQqKmp6crwiIiILJKsg01nZGdno6SkBNnZ2TAYDE3PkRk4cCCcnJwAAEFBQVixYgViY2OhUCjwxBNP4LXXXsOgQYMwaNAgvPbaa3BwcMCcOXOa/e4zZ87g559/xvbt21t8rr+/f7OfGz9rwIAB8PX1BQD85S9/werVq3HvvffimWeegZubG86cOYOvv/4aq1evhkqlwt///ndMmjQJfn5+KC8vx9dff409e/YgISGhu/9TERERmS0Gm6teeOEFfPbZZ00/N56F2b17N26++WYAwKlTp6DX65v2efbZZ3HlyhUsXrwYly9fRkREBHbs2AFnZ+dmv/vjjz+Gj49PsxVUneHt7Y19+/ZhyZIlmDBhAmpqahAQEICJEydCqWy4TaqgoABxcXHIz8+HVqtFWFgYEhIScPvtt3fpM4mIiCyRQgghpC6CiIiIqDvIelUUERERWRcGGyIiIpIN2d1jYzQakZeXB2dn51afJ0NERETmRwiB8vJyeHt7N90/2hWyCzZ5eXnw8/OTugwiIiLqgpycnKZVwV0hu2DTuCIpJycHLi4uEldDREREHVFWVgY/P78WK4s7S3bBpvHyk4uLC4MNERGRhbne20h48zARERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGg00H6a/UYc0v57DkuzSpSyEiIqI2MNh0UHWdAa9tz8D6lBxcKK6UuhwiIiJqBYNNB3m42OGGgW4AgE1H8iSuhoiIiFrDYNMJsSN8AACbUnMhhJC4GiIi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hx4SEyZMkKjC6/P78bUmLy9P2NjYiPj4+B6urOtsbGxEVFRUs21//etfRWRkpBBCWPw8tje+1ljiPDaKiYkRU6ZMafrZ0ufvj/44vtZY4vx99dVXwtfXV3z11VciLS1NfP7556J3797i008/FUJY/jy2N77WWOI8njlzRtx0000CgFCpVGLMmDFi7ty5YujQod02h7wU1cMcHR0RGhqK06dPN60e0ul0zfYpLCyEh4eHFOVdt9+PrzVeXl4ICAho831z5OXlheDg4Gbbhg4diuzsbACw+Hlsb3xtHWNp8wgAFy5cwK5du/DQQw81bbP0+fu91sbXGkucv2eeeQZLly7F7NmzERoairi4ODz55JNYsWIFAMufx/bG1xpLnMcBAwZg7969qKioQE5ODg4cOIC6ujr069ev2+aQwaaH1dTUICMjA15eXk0TuXPnzqb3a2trsXfvXkRHR0tYZdf9fnytKS4uRk5OTpvvm6MbbrgBp06darYtMzMTAQEBAGDx89je+FpjifMIAJ988gnc3d0xefLkpm2WPn+/19r4WmOJ81dVVQWlsvlXlkqlaloObenz2N74WmOJ89jI0dERXl5euHz5Mn788UdMmzat++awu08zUXNPP/202LNnjzh37pxISkoSU6ZMEc7OzuL8+fNCiIalbVqtVmzYsEGkp6eLe++912KWJwpx7fGVl5eLp59+WiQmJoqsrCyxe/duERUVJXx8fCxmfEIIceDAAaFWq8Wrr74qTp8+LdatWyccHBzEF1980bSPJc9je+OTyzwaDAbh7+8vlixZ0uI9S56/Rm2NTy7zN3/+fOHj49O0HHrDhg3Czc1NPPvss037WPI8tjc+ucxjQkKC+OGHH8S5c+fEjh07RHh4uBg7dqyora0VQnTPHDLYmFjjGnwbGxvh7e0tZsyYIY4fP970vtFoFC+++KLw9PQUGo1G3HTTTSI9PV3CijvnWuOrqqoSMTExom/fvsLGxkb4+/uL+fPni+zsbImr7rytW7eKYcOGCY1GI4KCgsSHH37Y7H1Ln8drjU8u8/jjjz8KAOLUqVMt3rP0+ROi7fHJZf7KysrE448/Lvz9/YWdnZ3o37+/eO6550RNTU3TPpY8j+2NTy7zuH79etG/f39ha2srPD09xV/+8hdRWlra9H53zKFCCCG6/RwTERERkQR4jw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREcnG/wci5SF28bFkygAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"markdown","source":"## Work chain version","metadata":{}},{"cell_type":"code","source":"@engine.calcfunction\ndef create_eos_dictionary(**kwargs) -> orm.Dict:\n eos = {\n label: (result['volume'], result['energy'])\n for label, result in kwargs.items()\n }\n return orm.Dict(eos)","metadata":{},"execution_count":25,"outputs":[]},{"cell_type":"code","source":"create_eos_dictionary(**results).get_dict()","metadata":{},"execution_count":26,"outputs":[{"execution_count":26,"output_type":"execute_result","data":{"text/plain":"{'structure_0': [48.283007573324, -1073.9421694118],\n 'structure_1': [56.785519366503, -1074.7251942208],\n 'structure_2': [66.231834805659, -1074.9273047095],\n 'structure_3': [76.671627766898, -1074.7863009779],\n 'structure_4': [88.154572126333, -1074.451028786]}"},"metadata":{}}]},{"cell_type":"code","source":"class EquationOfState(engine.WorkChain):\n \"\"\"WorkChain to compute Equation of State using Quantum ESPRESSO.\"\"\"\n\n @classmethod\n def define(cls, spec):\n \"\"\"Specify inputs and outputs.\"\"\"\n super().define(spec)\n spec.input(\"code\", valid_type=orm.Code)\n spec.input(\"structure\", valid_type=orm.StructureData)\n spec.input(\"scale_factors\", valid_type=orm.List)\n\n spec.outline(\n cls.run_eos,\n cls.results,\n )\n spec.output(\"eos_dict\", valid_type=orm.Dict)\n\n def run_eos(self):\n\n calcjob_dict = {}\n\n for label, rescaled_structure in rescale_list(self.inputs.structure, self.inputs.scale_factors).items():\n\n builder = PwCalculation.get_builder()\n builder.code = self.inputs.code\n builder.structure = rescaled_structure\n builder.parameters = orm.Dict(scf_inputs)\n builder.pseudopotentials = orm.Dict({\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\n builder.metadata.options.resources = resources\n\n calcjob_dict[label] = self.submit(builder)\n\n self.ctx.labels = list(calcjob_dict.keys())\n\n return calcjob_dict\n\n def results(self):\n\n self.report(self.ctx)\n\n eos_results = {\n label: self.ctx[label].outputs['properties'] for label in self.ctx.labels\n }\n eos_dict = create_eos_dictionary(**eos_results)\n self.out('eos_dict', eos_dict)\n","metadata":{},"execution_count":27,"outputs":[]},{"cell_type":"code","source":"engine.run(EquationOfState, code=orm.load_code('pw@localhost'),\n structure=relaxed_structure,\n scale_factors=orm.List([0.9, 0.95, 1.0, 1.05, 1.1]))","metadata":{},"execution_count":28,"outputs":[{"name":"stderr","text":"04/04/2024 05:40:39 PM <83> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [71|EquationOfState|results]: AttributeDict({'labels': ['structure_0', 'structure_1', 'structure_2', 'structure_3', 'structure_4'], 'structure_0': , 'structure_1': , 'structure_2': , 'structure_3': , 'structure_4': })\n","output_type":"stream"},{"execution_count":28,"output_type":"execute_result","data":{"text/plain":"{'eos_dict': }"},"metadata":{}}]},{"cell_type":"markdown","source":"## Using the `builder`","metadata":{}},{"cell_type":"code","source":"builder = EquationOfState.get_builder()","metadata":{},"execution_count":29,"outputs":[]},{"cell_type":"code","source":"builder.structure = relaxed_structure","metadata":{},"execution_count":30,"outputs":[]},{"cell_type":"code","source":"builder","metadata":{},"execution_count":31,"outputs":[{"execution_count":31,"output_type":"execute_result","data":{"text/plain":"Process class: EquationOfState\nInputs:\nmetadata: {}\nstructure: Al\n"},"metadata":{}}]},{"cell_type":"code","source":"builder.scale_factors = orm.List([0.9, 0.95, 1.0, 1.05, 1.1])\nbuilder.code = orm.load_code('pw@localhost')","metadata":{},"execution_count":32,"outputs":[]},{"cell_type":"code","source":"results, node = engine.run_get_node(builder)","metadata":{},"execution_count":33,"outputs":[{"name":"stderr","text":"04/04/2024 05:41:05 PM <83> aiida.orm.nodes.process.workflow.workchain.WorkChainNode: [REPORT] [116|EquationOfState|results]: AttributeDict({'labels': ['structure_0', 'structure_1', 'structure_2', 'structure_3', 'structure_4'], 'structure_0': , 'structure_1': , 'structure_2': , 'structure_3': , 'structure_4': })\n","output_type":"stream"}]},{"cell_type":"code","source":"results['eos_dict'].get_dict()","metadata":{},"execution_count":34,"outputs":[{"execution_count":34,"output_type":"execute_result","data":{"text/plain":"{'structure_0': [48.283007573324, -1073.9421694118],\n 'structure_1': [56.785519366503, -1074.7251942208],\n 'structure_2': [66.231834805659, -1074.9273047095],\n 'structure_3': [76.671627766898, -1074.7863009779],\n 'structure_4': [88.154572126333, -1074.451028786]}"},"metadata":{}}]},{"cell_type":"code","source":"eos = node.outputs.eos_dict.get_dict()","metadata":{},"execution_count":35,"outputs":[]},{"cell_type":"code","source":"eos","metadata":{},"execution_count":36,"outputs":[{"execution_count":36,"output_type":"execute_result","data":{"text/plain":"{'structure_0': [48.283007573324, -1073.9421694118],\n 'structure_1': [56.785519366503, -1074.7251942208],\n 'structure_2': [66.231834805659, -1074.9273047095],\n 'structure_3': [76.671627766898, -1074.7863009779],\n 'structure_4': [88.154572126333, -1074.451028786]}"},"metadata":{}}]},{"cell_type":"code","source":"plt.plot(\n [v[0] for v in eos.values()],\n [v[1] for v in eos.values()],\n)","metadata":{"tags":[]},"execution_count":37,"outputs":[{"execution_count":37,"output_type":"execute_result","data":{"text/plain":"[]"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAAjYAAAGsCAYAAADOo+2NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJoklEQVR4nO3deVxU9f4/8NcsMOyDiuybO4KAO0uW1S3UNBUtM5WsbpZ6u6231NutrG5ZfX+3W91uWtpqVla4Z6Te1EoERUVQUVxQEBhAkGGTbebz+wOhCJBFhjNz5vV8POYPzpzDvD990nl5zvmct0IIIUBEREQkA0qpCyAiIiLqLgw2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2REREJBsMNkRERCQbDDZEREQkGww2V7366quIjo6Gg4MDXF1dO3SMEALLly+Ht7c37O3tcfPNN+P48eNN758/fx4KhaLV17ffftvi99XU1GD48OFQKBRITU3tVP0rV65EWFgYXFxc4OLigqioKPzwww+d+h1ERESWjsHmqtraWtx9991YtGhRh49588038dZbb+G9997DwYMH4enpidtvvx3l5eUAAD8/P+Tn5zd7vfTSS3B0dMSkSZNa/L5nn30W3t7eXarf19cXr7/+OlJSUpCSkoJbb70V06ZNaxa0iIiIZE9QM5988onQarXt7mc0GoWnp6d4/fXXm7ZVV1cLrVYrVq1a1eZxw4cPFw8++GCL7du3bxdBQUHi+PHjAoA4cuRIs/ePHz8uJk2aJBwdHYW7u7uYN2+eKCoqumaNvXr1EmvWrGl3LERERHLBMzZdlJWVBZ1Oh5iYmKZtGo0G48ePR2JiYqvHHDp0CKmpqfjzn//cbHtBQQEWLFiAtWvXwsHBocVx+fn5GD9+PIYPH46UlBQkJCSgoKAAs2bNavVzDAYDvv76a1RWViIqKuo6RklERGRZ1FIXYKl0Oh0AwMPDo9l2Dw8PXLhwodVjPvroIwwdOhTR0dFN24QQuP/++7Fw4UKMHj0a58+fb3HcypUrMXLkSLz22mtN2z7++GP4+fkhMzMTgwcPBgCkp6cjKioK1dXVcHJywsaNGxEcHHy9QyUiIrIYsj5js3z58jZv3m18paSkXNdnKBSKZj8LIVpsA4ArV67gyy+/bHG25j//+Q/KysqwbNmyNj/j0KFD2L17N5ycnJpeQUFBAICzZ8827TdkyBCkpqYiKSkJixYtwvz583HixInrGR4REZFFkfUZm0cffRSzZ8++5j6BgYFd+t2enp4AGs7ceHl5NW0vLCxscRYHAL777jtUVVXhvvvua7b9p59+QlJSEjQaTbPto0ePxty5c/HZZ5/BaDTizjvvxBtvvNHi9/7+s21tbTFw4MCm4w8ePIh33nkHH3zwQZfGSEREZGlkHWzc3Nzg5uZmkt/dr18/eHp6YufOnRgxYgSAhpVVe/fubTWAfPTRR5g6dSr69u3bbPu7776Lf/7zn00/5+XlYcKECVi/fj0iIiIAACNHjkR8fDwCAwOhVnd8yoQQqKmp6crwiIiILJKsg01nZGdno6SkBNnZ2TAYDE3PkRk4cCCcnJwAAEFBQVixYgViY2OhUCjwxBNP4LXXXsOgQYMwaNAgvPbaa3BwcMCcOXOa/e4zZ87g559/xvbt21t8rr+/f7OfGz9rwIAB8PX1BQD85S9/werVq3HvvffimWeegZubG86cOYOvv/4aq1evhkqlwt///ndMmjQJfn5+KC8vx9dff409e/YgISGhu/9TERERmS0Gm6teeOEFfPbZZ00/N56F2b17N26++WYAwKlTp6DX65v2efbZZ3HlyhUsXrwYly9fRkREBHbs2AFnZ+dmv/vjjz+Gj49PsxVUneHt7Y19+/ZhyZIlmDBhAmpqahAQEICJEydCqWy4TaqgoABxcXHIz8+HVqtFWFgYEhIScPvtt3fpM4mIiCyRQgghpC6CiIiIqDvIelUUERERWRcGGyIiIpIN2d1jYzQakZeXB2dn51afJ0NERETmRwiB8vJyeHt7N90/2hWyCzZ5eXnw8/OTugwiIiLqgpycnKZVwV0hu2DTuCIpJycHLi4uEldDREREHVFWVgY/P78WK4s7S3bBpvHyk4uLC4MNERGRhbne20h48zARERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGg00H6a/UYc0v57DkuzSpSyEiIqI2MNh0UHWdAa9tz8D6lBxcKK6UuhwiIiJqBYNNB3m42OGGgW4AgE1H8iSuhoiIiFrDYNMJsSN8AACbUnMhhJC4GiIi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hx4SEyZMkKjC6/P78bUmLy9P2NjYiPj4+B6urOtsbGxEVFRUs21//etfRWRkpBBCWPw8tje+1ljiPDaKiYkRU6ZMafrZ0ufvj/44vtZY4vx99dVXwtfXV3z11VciLS1NfP7556J3797i008/FUJY/jy2N77WWOI8njlzRtx0000CgFCpVGLMmDFi7ty5YujQod02h7wU1cMcHR0RGhqK06dPN60e0ul0zfYpLCyEh4eHFOVdt9+PrzVeXl4ICAho831z5OXlheDg4Gbbhg4diuzsbACw+Hlsb3xtHWNp8wgAFy5cwK5du/DQQw81bbP0+fu91sbXGkucv2eeeQZLly7F7NmzERoairi4ODz55JNYsWIFAMufx/bG1xpLnMcBAwZg7969qKioQE5ODg4cOIC6ujr069ev2+aQwaaH1dTUICMjA15eXk0TuXPnzqb3a2trsXfvXkRHR0tYZdf9fnytKS4uRk5OTpvvm6MbbrgBp06darYtMzMTAQEBAGDx89je+FpjifMIAJ988gnc3d0xefLkpm2WPn+/19r4WmOJ81dVVQWlsvlXlkqlaloObenz2N74WmOJ89jI0dERXl5euHz5Mn788UdMmzat++awu08zUXNPP/202LNnjzh37pxISkoSU6ZMEc7OzuL8+fNCiIalbVqtVmzYsEGkp6eLe++912KWJwpx7fGVl5eLp59+WiQmJoqsrCyxe/duERUVJXx8fCxmfEIIceDAAaFWq8Wrr74qTp8+LdatWyccHBzEF1980bSPJc9je+OTyzwaDAbh7+8vlixZ0uI9S56/Rm2NTy7zN3/+fOHj49O0HHrDhg3Czc1NPPvss037WPI8tjc+ucxjQkKC+OGHH8S5c+fEjh07RHh4uBg7dqyora0VQnTPHDLYmFjjGnwbGxvh7e0tZsyYIY4fP970vtFoFC+++KLw9PQUGo1G3HTTTSI9PV3CijvnWuOrqqoSMTExom/fvsLGxkb4+/uL+fPni+zsbImr7rytW7eKYcOGCY1GI4KCgsSHH37Y7H1Ln8drjU8u8/jjjz8KAOLUqVMt3rP0+ROi7fHJZf7KysrE448/Lvz9/YWdnZ3o37+/eO6550RNTU3TPpY8j+2NTy7zuH79etG/f39ha2srPD09xV/+8hdRWlra9H53zKFCCCG6/RwTERERkQR4jw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREckGgw0RERHJBoMNERERyQaDDREREcnG/wci5SF28bFkygAAAABJRU5ErkJggg=="},"metadata":{}}]}]} \ No newline at end of file diff --git a/book/_config.yml b/book/_config.yml new file mode 100644 index 0000000..6e9fb3a --- /dev/null +++ b/book/_config.yml @@ -0,0 +1,17 @@ +title: ADIS2023 +author: pyiron +logo: logo_dark.png + +execute: + execute_notebooks : off + +html: + extra_navbar : Powered by pyiron + +repository: + url : https://github.com/materialdigital/ADIS2023 + path_to_book : "" + +launch_buttons: + notebook_interface : jupyterlab + binderhub_url : https://mybinder.org diff --git a/book/_toc.yml b/book/_toc.yml new file mode 100644 index 0000000..2baa69b --- /dev/null +++ b/book/_toc.yml @@ -0,0 +1,8 @@ +format: jb-book +root: README +chapters: +- file: introduction.md +- file: challenges.md +- file: aiida.ipynb +- file: jobflow.ipynb +- file: pyiron_base.ipynb diff --git a/book/challenges.md b/book/challenges.md new file mode 100644 index 0000000..5427453 --- /dev/null +++ b/book/challenges.md @@ -0,0 +1,92 @@ +# Challenges for workflow frameworks +Over the recent years a number of simulation frameworks have been developed which address various aspects of the development of simulation protocols. The general challenges are: + +* Interface with the simulation codes**: While some modern simulation codes already provide Python bindings, the majority require simulation code-specific input files, have specific variable names and the internal unit system used by a given simulation code might differ depending on the community it was developed for. +* **Access to high-performance computing (HPC) resources**: Traditional queuing systems like the Simple Linux Utility for Resource Management (SLURM) handle the execution of compute-intensive tasks. Still in the context of up-scaling simulation protocols or parameter studies the tracking of which parameters lead to a successful calculation and which calculations failed remains a manual task. +* **Efficient Data storage**: The input and output files of many simulation codes in the scientific community were intended to be human readable first and the machine readability was only a secondary concern. This resulted in a wide range of different formats of plain text files which are inefficient when the number of calculations increases. + +In the following, we compare the implementation of the same workflow in four different simulation frameworks, namely AiiDA, jobflow, pyiron and Simstack. All four of these frameworks are released as open-source software and developed in the Python programming language + +## Example Workflow +![workflow](images/workflow.png) +The comparison is focused on highlighting the implementation of a new simulation code and a simulation workflow in the four workflow frameworks. The calculation of a structure optimization followed by the calculation of the bulk modulus from fitting an energy volume curve with the quantum espresso open-source density functional theory (DFT) simulation code is chosen as an example workflow. The workflow consists of the following four steps: + +* Create a face-centred-cubic Aluminium supercell with 4 atoms and a lattice constant of 4.15A. +* Use the quantum espresso simulation code to optimize both the lattice constant and the positions in the crystal structure. +* Apply five strains ranging from -10% to +10% on the optimized structure to generate five strained structures. +* Evaluate these five structures with Quantum Espresso to calculate the energy. +* Plot the resulting energy volume curve. + +This workflow covers both a serial dependence of tasks as well as parallel execution of tasks. Rather than using the already existing framework-specific parsers to write the input files and parse the output files for the quantum espresso simulation code the same parser is implemented in all frameworks. This also highlights how new parsers can be developed in a general way to simplify the integration in existing simulation frameworks and enhance the parser's transferability. + +## Implementation +The challenge is to develop a workflow in a way that is can be easily integrated in a number of workflow frameworks, to give the users the option to choose the workflow framework which best suits their needs. + +### Python Function +For the case of python functions, integrating the function should ideally be as simple as setting a python decorator: +```python +@job_decorator +def my_function(*args, **kwargs): + ... +``` + +The generation of the strained structures can be represented as such a python function. It takes a single structure and a list of strains as an input and returns a list of strained structures as an output: +```python +def generate_structures(structure, strain_lst): + structure_lst = [] + for strain in strain_lst: + structure_strain = structure.copy() + structure_strain.set_cell( + structure_strain.cell * strain**(1/3), + scale_atoms=True + ) + structure_lst.append(structure_strain) + return structure_lst +``` + +In the same way, the plotting of the resulting energy volume curve can be represented as python functions: +```python +def plot_energy_volume_curve(volume_lst, energy_lst): + plt.plot(volume_lst, energy_lst) + plt.xlabel("Volume") + plt.ylabel("Energy") + plt.savefig("evcurve.png") +``` + +### External Executable +For the case of interfacing with an external executable three steps are required. The writing of the input files, the calling of the executable and the parsing of the output files. For interfacing with the quantum espresso DFT simulation code, the function to write the input files could be written as: +```python +def write_input(input_dict, working_directory="."): + filename = os.path.join(working_directory, 'input.pwi') + os.makedirs(working_directory, exist_ok=True) + write( + filename=filename, + images=input_dict["structure"], + Crystal=True, + kpts=input_dict["kpts"], + input_data={ + 'calculation': input_dict["calculation"], + 'occupations': 'smearing', + 'degauss': input_dict["smearing"], + }, + pseudopotentials=input_dict["pseudopotentials"], + tstress=True, + tprnfor=True + ) +``` + +Here all quantum espresso-specific inputs are defined by the `input_dict` and the additional `working_directory` specifies the directory in which the input should be written. In analogy, the function to collect the output of the quantum espresso calculation also receives the `working_directory` as input and returns the output as a python dictionary: +```python +def collect_output(working_directory="."): + output = parse_pw(os.path.join(working_directory, "pwscf.xml")) + return { + "structure": output["ase_structure"], + "energy": output["energy"], + "volume": output["ase_structure"].get_volume(), + } +``` + +By choosing to define both the input as well as the output as python dictionary, the interface is very flexible as it can be extended by additional elements. + +### Universal Interface +By following this recommendation of using python functions as well as external executables which are interfaced by one function to write the input and another function to parse the output any simulation workflow can be integrated in any of the four frameworks. This is demonstrated below for the workflow of calculating the energy volume curve with quantum espresso. diff --git a/book/environment.yml b/book/environment.yml new file mode 100644 index 0000000..a3fb454 --- /dev/null +++ b/book/environment.yml @@ -0,0 +1,4 @@ +channels: +- conda-forge +dependencies: +- jupyter-book diff --git a/book/images/workflow.png b/book/images/workflow.png new file mode 100644 index 0000000..a72dc35 Binary files /dev/null and b/book/images/workflow.png differ diff --git a/book/introduction.md b/book/introduction.md new file mode 100644 index 0000000..336a49c --- /dev/null +++ b/book/introduction.md @@ -0,0 +1,2 @@ +# Introduction +Why do we need workflow frameworks? For tenth to hundreds of simulations commonly used command line utilities and file-based storage are sufficient but when it comes to thousands of calculations or the coupling with modern machine learning frameworks, these traditional simulation environments are limited. diff --git a/book/logo_dark.png b/book/logo_dark.png new file mode 100644 index 0000000..a601086 Binary files /dev/null and b/book/logo_dark.png differ diff --git a/jobflow.ipynb b/jobflow.ipynb index 567dd3d..7778775 100644 --- a/jobflow.ipynb +++ b/jobflow.ipynb @@ -1 +1 @@ -{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.11.8","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import subprocess\nimport os\nfrom pydantic import BaseModel, Field","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:39.230259Z","start_time":"2024-04-04T12:23:39.139154Z"},"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:39.812727Z","start_time":"2024-04-04T12:23:39.233298Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"from ase.build import bulk\nfrom ase.io import write","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.064521Z","start_time":"2024-04-04T12:23:39.815771Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"from adis_tools.parsers import parse_pw","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.342218Z","start_time":"2024-04-04T12:23:40.067769Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"markdown","source":"# Functions","metadata":{}},{"cell_type":"code","source":"def generate_structures(structure, strain_lst): \n structure_lst = []\n for strain in strain_lst:\n structure_strain = structure.copy()\n structure_strain.set_cell(\n structure_strain.cell * strain**(1/3), \n scale_atoms=True\n )\n structure_lst.append(structure_strain)\n return structure_lst","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.349810Z","start_time":"2024-04-04T12:23:40.344659Z"},"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"def plot_energy_volume_curve(volume_lst, energy_lst):\n plt.plot(volume_lst, energy_lst)\n plt.xlabel(\"Volume\")\n plt.ylabel(\"Energy\")\n plt.savefig(\"evcurve.png\")","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.354972Z","start_time":"2024-04-04T12:23:40.351547Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"def write_input(input_dict, working_directory=\".\"):\n filename = os.path.join(working_directory, 'input.pwi')\n os.makedirs(working_directory, exist_ok=True)\n write(\n filename=filename, \n images=input_dict[\"structure\"], \n Crystal=True, \n kpts=input_dict[\"kpts\"], \n input_data={\n 'calculation': input_dict[\"calculation\"],\n 'occupations': 'smearing',\n 'degauss': input_dict[\"smearing\"],\n }, \n pseudopotentials=input_dict[\"pseudopotentials\"],\n tstress=True, \n tprnfor=True\n )","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.361062Z","start_time":"2024-04-04T12:23:40.356433Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"def collect_output(working_directory=\".\"):\n output = parse_pw(os.path.join(working_directory, 'pwscf.xml'))\n return {\n \"structure\": output['ase_structure'],\n \"energy\": output[\"energy\"],\n \"volume\": output['ase_structure'].get_volume(),\n }","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.365984Z","start_time":"2024-04-04T12:23:40.362667Z"},"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"from pymatgen.io.core import InputSet, InputGenerator\nfrom pymatgen.io.ase import MSONAtoms\nfrom typing import Any, Optional, Union\nQE_CMD= \"mpirun -np 1 pw.x -in input.pwi > output.pwo\"\ndef run_qe(qe_cmd=QE_CMD):\n subprocess.check_output(qe_cmd, shell=True, universal_newlines=True)\n\nclass QETaskDoc(BaseModel):\n structure: Optional[MSONAtoms] = Field(None, description=\"ASE structure\")\n energy: Optional[float] = Field(None, description=\"DFT energy in eV\")\n volume: Optional[float] = Field(None, description=\"volume in Angstrom^3\")\n \n @classmethod\n def from_directory(cls, working_directory):\n output=collect_output(working_directory=working_directory)\n # structure object needs to be serializable, i.e., we need an additional transformation\n return cls(structure=MSONAtoms(output[\"structure\"]), energy=output[\"energy\"], volume=output[\"volume\"])\n\nclass QEInputSet(InputSet):\n \"\"\"\n Writes an input based on an input_dict\n \"\"\"\n def __init__(self, input_dict):\n self.input_dict = input_dict\n\n def write_input(self, working_directory=\".\"):\n write_input(self.input_dict, working_directory=working_directory)\n\nfrom dataclasses import dataclass, field\n\n\n\n@dataclass\nclass QEInputGenerator(InputGenerator):\n pseudopotentials: dict = field(default_factory=lambda: {\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\n kpts: tuple = (3,3,3)\n calculation: str = \"vc-relax\"\n smearing: float = 0.02\n \n\n def get_input_set(self, structure) -> QEInputSet:\n\n input_dict={\"structure\":structure,\n \"pseudopotentials\":self.pseudopotentials, \n \"kpts\": self.kpts,\n \"calculation\": self.calculation,\n \"smearing\": self.smearing,\n }\n return QEInputSet(input_dict=input_dict)\n\n@dataclass\nclass QEInputStaticGenerator(QEInputGenerator):\n calculation: str = \"scf\"\n\n \ndef write_qe_input_set(structure, input_set_generator=QEInputGenerator(), working_directory=\".\"):\n qis = input_set_generator.get_input_set(structure=structure)\n qis.write_input(working_directory=working_directory)\n \n ","metadata":{"collapsed":false,"jupyter":{"outputs_hidden":false},"ExecuteTime":{"end_time":"2024-04-04T12:23:40.992461Z","start_time":"2024-04-04T12:23:40.368632Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"from dataclasses import dataclass, field\nfrom jobflow import job, Maker\n\n\n@dataclass\nclass BaseQEMaker(Maker):\n \"\"\"\n Base QE job maker.\n\n Parameters\n ----------\n name : str\n The job name.\n input_set_generator : .QEInputGenerator\n A generator used to make the input set.\n \"\"\"\n\n name: str = \"base qe job\"\n input_set_generator: QEInputGenerator = field(default_factory=QEInputGenerator)\n\n @job(output_schema=QETaskDoc)\n def make(\n self, structure\n ) -> QETaskDoc:\n \"\"\"\n Run a QE calculation.\n\n Parameters\n ----------\n structure : MSONAtoms|Atoms\n An Atoms or MSONAtoms object.\n \n Returns\n -------\n Output of a QE calculation\n \"\"\"\n # copy previous inputs\n\n # write qe input files\n write_qe_input_set(\n structure=structure, input_set_generator=self.input_set_generator)\n\n # qe\n run_qe()\n\n # parse qe outputs\n task_doc=QETaskDoc.from_directory(\".\")\n \n return task_doc\n\n@dataclass\nclass StaticQEMaker(BaseQEMaker):\n \"\"\"\n Base QE job maker.\n\n Parameters\n ----------\n name : str\n The job name.\n input_set_generator : .QEInputGenerator\n A generator used to make the input set.\n \"\"\"\n\n name: str = \"static qe job\"\n input_set_generator: QEInputGenerator = field(default_factory=QEInputStaticGenerator)\n\n\n\nfrom jobflow import job, Response, Flow, run_locally\n\n@job\ndef get_ev_curve(structure, strain_lst):\n structures=generate_structures(structure,strain_lst=strain_lst)\n jobs = []\n volumes = []\n energies = []\n for istructure in range(len(strain_lst)):\n new_job = StaticQEMaker().make(structures[istructure])\n jobs.append(new_job)\n volumes.append(new_job.output.volume)\n energies.append(new_job.output.energy)\n return Response(replace=Flow(jobs, output={\"energies\": energies, \"volumes\": volumes}))\n \n@job\ndef plot_energy_volume_curve_job(volume_lst, energy_lst):\n plot_energy_volume_curve(volume_lst=volume_lst, energy_lst=energy_lst)\n\nstructure = bulk('Al', a=4.15, cubic=True)\nrelax = BaseQEMaker().make(structure=MSONAtoms(structure))\nev_curve = get_ev_curve(relax.output.structure, strain_lst=np.linspace(0.9, 1.1, 5))\nplot = plot_energy_volume_curve_job(volume_lst=ev_curve.output[\"volumes\"], energy_lst=ev_curve.output[\"energies\"])\njobs = [relax, ev_curve, plot]\nrun_locally(Flow(jobs), create_folders=True)","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:26:08.108635Z","start_time":"2024-04-04T12:24:48.120617Z"},"trusted":true},"execution_count":10,"outputs":[{"name":"stdout","text":"2024-04-04 15:55:32,815 INFO Started executing jobs locally\n2024-04-04 15:55:32,892 INFO Starting job - base qe job (72ab2547-8a66-4dd0-a95a-b6255a668cd8)\n","output_type":"stream"},{"name":"stderr","text":"[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00139] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:56:37,395 INFO Finished job - base qe job (72ab2547-8a66-4dd0-a95a-b6255a668cd8)\n2024-04-04 15:56:37,396 INFO Starting job - get_ev_curve (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee)\n2024-04-04 15:56:37,404 INFO Finished job - get_ev_curve (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee)\n2024-04-04 15:56:37,406 INFO Starting job - static qe job (b0759785-155b-4e79-9b72-c626067d81e1)\n","output_type":"stream"},{"name":"stderr","text":"[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00149] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:56:45,563 INFO Finished job - static qe job (b0759785-155b-4e79-9b72-c626067d81e1)\n2024-04-04 15:56:45,564 INFO Starting job - static qe job (514079e9-d6ae-4369-8b80-bf8ca7860540)\n","output_type":"stream"},{"name":"stderr","text":"Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00159] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:56:53,979 INFO Finished job - static qe job (514079e9-d6ae-4369-8b80-bf8ca7860540)\n2024-04-04 15:56:53,980 INFO Starting job - static qe job (6e3c5a28-4edb-4244-9e35-0b8733b946c4)\n","output_type":"stream"},{"name":"stderr","text":"[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00169] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:57:03,600 INFO Finished job - static qe job (6e3c5a28-4edb-4244-9e35-0b8733b946c4)\n2024-04-04 15:57:03,600 INFO Starting job - static qe job (980b72a5-fbea-445c-9075-a880322c8261)\n","output_type":"stream"},{"name":"stderr","text":"Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00179] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:57:14,907 INFO Finished job - static qe job (980b72a5-fbea-445c-9075-a880322c8261)\n2024-04-04 15:57:14,908 INFO Starting job - static qe job (a44a935f-6bd2-4279-bbcb-53d5ed890a99)\n","output_type":"stream"},{"name":"stderr","text":"Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00189] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:57:27,174 INFO Finished job - static qe job (a44a935f-6bd2-4279-bbcb-53d5ed890a99)\n2024-04-04 15:57:27,174 INFO Starting job - store_inputs (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee, 2)\n2024-04-04 15:57:27,176 INFO Finished job - store_inputs (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee, 2)\n2024-04-04 15:57:27,176 INFO Starting job - plot_energy_volume_curve_job (9987ab9f-1ae9-4172-8e31-b2c9920d4791)\n2024-04-04 15:57:27,256 INFO Finished job - plot_energy_volume_curve_job (9987ab9f-1ae9-4172-8e31-b2c9920d4791)\n2024-04-04 15:57:27,256 INFO Finished executing jobs locally\n","output_type":"stream"},{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"{'72ab2547-8a66-4dd0-a95a-b6255a668cd8': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.045218941837687, 4.045218941837687, 4.045218941837687]), energy=-1074.9365272693506, volume=66.1951387021735), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '87ad6b9b-9f34-463e-b705-1ab7cdcf9aee': {1: Response(output=None, detour=None, addition=None, replace=Flow(name='Flow', uuid='0e46d480-7699-4e03-889b-b4ba65fe3d38')\n 1. Job(name='static qe job', uuid='b0759785-155b-4e79-9b72-c626067d81e1')\n 2. Job(name='static qe job', uuid='514079e9-d6ae-4369-8b80-bf8ca7860540')\n 3. Job(name='static qe job', uuid='6e3c5a28-4edb-4244-9e35-0b8733b946c4')\n 4. Job(name='static qe job', uuid='980b72a5-fbea-445c-9075-a880322c8261')\n 5. Job(name='static qe job', uuid='a44a935f-6bd2-4279-bbcb-53d5ed890a99')\n 6. Job(name='store_inputs', uuid='87ad6b9b-9f34-463e-b705-1ab7cdcf9aee'), stored_data=None, stop_children=False, stop_jobflow=False),\n 2: Response(output={'energies': [OutputReference(b0759785-155b-4e79-9b72-c626067d81e1, .energy), OutputReference(514079e9-d6ae-4369-8b80-bf8ca7860540, .energy), OutputReference(6e3c5a28-4edb-4244-9e35-0b8733b946c4, .energy), OutputReference(980b72a5-fbea-445c-9075-a880322c8261, .energy), OutputReference(a44a935f-6bd2-4279-bbcb-53d5ed890a99, .energy)], 'volumes': [OutputReference(b0759785-155b-4e79-9b72-c626067d81e1, .volume), OutputReference(514079e9-d6ae-4369-8b80-bf8ca7860540, .volume), OutputReference(6e3c5a28-4edb-4244-9e35-0b8733b946c4, .volume), OutputReference(980b72a5-fbea-445c-9075-a880322c8261, .volume), OutputReference(a44a935f-6bd2-4279-bbcb-53d5ed890a99, .volume)]}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n 'b0759785-155b-4e79-9b72-c626067d81e1': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[3.9056159296787105, 3.9056159296787105, 3.9056159296787105]), energy=-1074.8451830762128, volume=59.575624050752516), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '514079e9-d6ae-4369-8b80-bf8ca7860540': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[3.9766426435887574, 3.9766426435887574, 3.9766426435887574]), energy=-1074.9158947387848, volume=62.88538094246082), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '6e3c5a28-4edb-4244-9e35-0b8733b946c4': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.045218924156295, 4.045218924156295, 4.045218924156295]), energy=-1074.936525208987, volume=66.19513783416937), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '980b72a5-fbea-445c-9075-a880322c8261': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.111545777030954, 4.111545777030954, 4.111545777030954]), energy=-1074.9194989203452, volume=69.50489472587755), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n 'a44a935f-6bd2-4279-bbcb-53d5ed890a99': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.175799058074337, 4.175799058074337, 4.175799058074337]), energy=-1074.8741797823543, volume=72.81465161758611), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '9987ab9f-1ae9-4172-8e31-b2c9920d4791': {1: Response(output=None, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)}}"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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SkrKOT+rb++nhnH+41Hf3k8thmEYZoxoiYiIiDgDzVkSERERqYTKkoiIiEglVJZEREREKqGyJCIiIlIJlSURERGRSqgsiYiIiFRCZUlERESkEipLIiIiIpVQWRKRei0iIoLXX3/d7Bgi4sBUlkTEaQ0dOpT+/ftX+LPVq1djsVjYuHGjnVOJSF2jsiQiTuvee+/lxx9/ZN++fef87IMPPqBLly5069bNhGQiUpeoLImI0xoyZAhBQUHMmjWr3ON5eXl8/vnn3HvvvcyfP5+oqCg8PT2JiIhgxowZ532+tLQ0LBYLiYmJZY+dPHkSi8XCihUrAFixYgUWi4WlS5fStWtXvL29ueaaazhy5AjffvstHTp0wN/fn9tuu428vLyy5zEMg5deeolWrVrh7e1NTEwM8+bNq8nDISK1RGVJRJyWm5sbd911F7NmzeL31wSfO3cuhYWFxMbGMnr0aG699Va2bNnC1KlTmTJlyjnlqjqmTp3Km2++yapVqzhw4ACjR4/m9ddf59NPP+Wbb75h2bJl/Pvf/y7b/sknn2TmzJm8/fbbbNu2jQkTJnDnnXfy008/XXIWEaldFuP37zAiIk5mx44ddOjQgR9//JGrr74agCuvvJJmzZphsVg4evQo3333Xdn2jz/+ON988w3btm0DSid4P/zwwzz88MOkpaXRsmVLNm3aRJcuXYDSkaWGDRuyfPlyrrrqKlasWMHVV1/N999/z7XXXgvA9OnTmTRpErt376ZVq1YAPPDAA6SlpREfH09ubi6BgYH8+OOPxMbGlmW57777yMvL49NPP7XHoRKRatLIkog4tcjISPr06cMHH3wAwO7du/nll1+45557SE5Opm/fvuW279u3Lzt37qSkpOSSfm90dHTZ/w8ODsbHx6esKJ197MiRIwBs376d/Px8rrvuOvz8/MpuH374Ibt3776kHCJS+9zMDiAicqnuvfdexo8fz//93/8xc+ZMwsPDufbaazEMA4vFUm7bygbTXVxcztmmqKiowm3d3d3L/r/FYil3/+xjNpsNoOx/v/nmG5o1a1ZuO09Pzwu9PBExmUaWRMTpjR49GldXVz799FNmz57N2LFjsVgsdOzYkV9//bXctqtWraJdu3a4urqe8zxNmjQBID09veyx30/2rq6OHTvi6enJ/v37adOmTblb8+bNL/n5RaR2aWRJRJyen58ft9xyC5MnTyY7O5sxY8YA8Oijj3LZZZfx7LPPcsstt7B69WrefPNN3nrrrQqfx9vbm969ezN9+nQiIiI4duwYTz755CXna9CgAY899hgTJkzAZrPRr18/cnJyWLVqFX5+ftx9992X/DtEpPZoZElE6oR7772XrKws+vfvT4sWLQDo1q0bX3zxBXPmzKFTp0489dRT/POf/ywrUxX54IMPKCoqokePHvztb3/jueeeq5F8zz77LE899RTTpk2jQ4cODBw4kMWLF9OyZcsaeX4RqT36NpyIiIhIJTSyJCIiIlIJlSURERGRSqgsiYiIiFRCZUlERESkEipLIiIiIpVQWRIRERGphMqSiIiISCVUlkREREQqobIkIiIiUgmVJREREZFKqCyJiIiIVEJlSURERKQS/w+KFmKjiKyciAAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2024-04-04T12:23:49.409448Z","start_time":"2024-04-04T12:23:49.404281Z"},"jupyter":{"outputs_hidden":false}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2024-04-04T12:23:49.414721Z","start_time":"2024-04-04T12:23:49.411543Z"},"jupyter":{"outputs_hidden":false}},"execution_count":null,"outputs":[]}]} +{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.11.0","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# jobflow","metadata":{}},{"cell_type":"code","source":"import subprocess\nimport os\nfrom pydantic import BaseModel, Field","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:39.230259Z","start_time":"2024-04-04T12:23:39.139154Z"}},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:39.812727Z","start_time":"2024-04-04T12:23:39.233298Z"}},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"from ase.build import bulk\nfrom ase.io import write","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.064521Z","start_time":"2024-04-04T12:23:39.815771Z"}},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"from adis_tools.parsers import parse_pw","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.342218Z","start_time":"2024-04-04T12:23:40.067769Z"}},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"def generate_structures(structure, strain_lst): \n structure_lst = []\n for strain in strain_lst:\n structure_strain = structure.copy()\n structure_strain.set_cell(\n structure_strain.cell * strain**(1/3), \n scale_atoms=True\n )\n structure_lst.append(structure_strain)\n return structure_lst","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.349810Z","start_time":"2024-04-04T12:23:40.344659Z"}},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"def plot_energy_volume_curve(volume_lst, energy_lst):\n plt.plot(volume_lst, energy_lst)\n plt.xlabel(\"Volume\")\n plt.ylabel(\"Energy\")\n plt.savefig(\"evcurve.png\")","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.354972Z","start_time":"2024-04-04T12:23:40.351547Z"}},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"def write_input(input_dict, working_directory=\".\"):\n filename = os.path.join(working_directory, 'input.pwi')\n os.makedirs(working_directory, exist_ok=True)\n write(\n filename=filename, \n images=input_dict[\"structure\"], \n Crystal=True, \n kpts=input_dict[\"kpts\"], \n input_data={\n 'calculation': input_dict[\"calculation\"],\n 'occupations': 'smearing',\n 'degauss': input_dict[\"smearing\"],\n }, \n pseudopotentials=input_dict[\"pseudopotentials\"],\n tstress=True, \n tprnfor=True\n )","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.361062Z","start_time":"2024-04-04T12:23:40.356433Z"}},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"def collect_output(working_directory=\".\"):\n output = parse_pw(os.path.join(working_directory, 'pwscf.xml'))\n return {\n \"structure\": output['ase_structure'],\n \"energy\": output[\"energy\"],\n \"volume\": output['ase_structure'].get_volume(),\n }","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:23:40.365984Z","start_time":"2024-04-04T12:23:40.362667Z"}},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"from pymatgen.io.core import InputSet, InputGenerator\nfrom pymatgen.io.ase import MSONAtoms\nfrom typing import Any, Optional, Union\nQE_CMD= \"mpirun -np 1 pw.x -in input.pwi > output.pwo\"\ndef run_qe(qe_cmd=QE_CMD):\n subprocess.check_output(qe_cmd, shell=True, universal_newlines=True)\n\nclass QETaskDoc(BaseModel):\n structure: Optional[MSONAtoms] = Field(None, description=\"ASE structure\")\n energy: Optional[float] = Field(None, description=\"DFT energy in eV\")\n volume: Optional[float] = Field(None, description=\"volume in Angstrom^3\")\n \n @classmethod\n def from_directory(cls, working_directory):\n output=collect_output(working_directory=working_directory)\n # structure object needs to be serializable, i.e., we need an additional transformation\n return cls(structure=MSONAtoms(output[\"structure\"]), energy=output[\"energy\"], volume=output[\"volume\"])\n\nclass QEInputSet(InputSet):\n \"\"\"\n Writes an input based on an input_dict\n \"\"\"\n def __init__(self, input_dict):\n self.input_dict = input_dict\n\n def write_input(self, working_directory=\".\"):\n write_input(self.input_dict, working_directory=working_directory)\n\nfrom dataclasses import dataclass, field\n\n\n\n@dataclass\nclass QEInputGenerator(InputGenerator):\n pseudopotentials: dict = field(default_factory=lambda: {\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"})\n kpts: tuple = (3,3,3)\n calculation: str = \"vc-relax\"\n smearing: float = 0.02\n \n\n def get_input_set(self, structure) -> QEInputSet:\n\n input_dict={\"structure\":structure,\n \"pseudopotentials\":self.pseudopotentials, \n \"kpts\": self.kpts,\n \"calculation\": self.calculation,\n \"smearing\": self.smearing,\n }\n return QEInputSet(input_dict=input_dict)\n\n@dataclass\nclass QEInputStaticGenerator(QEInputGenerator):\n calculation: str = \"scf\"\n\n \ndef write_qe_input_set(structure, input_set_generator=QEInputGenerator(), working_directory=\".\"):\n qis = input_set_generator.get_input_set(structure=structure)\n qis.write_input(working_directory=working_directory)\n \n ","metadata":{"collapsed":false,"jupyter":{"outputs_hidden":false},"ExecuteTime":{"end_time":"2024-04-04T12:23:40.992461Z","start_time":"2024-04-04T12:23:40.368632Z"}},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"from dataclasses import dataclass, field\nfrom jobflow import job, Maker\n\n\n@dataclass\nclass BaseQEMaker(Maker):\n \"\"\"\n Base QE job maker.\n\n Parameters\n ----------\n name : str\n The job name.\n input_set_generator : .QEInputGenerator\n A generator used to make the input set.\n \"\"\"\n\n name: str = \"base qe job\"\n input_set_generator: QEInputGenerator = field(default_factory=QEInputGenerator)\n\n @job(output_schema=QETaskDoc)\n def make(\n self, structure\n ) -> QETaskDoc:\n \"\"\"\n Run a QE calculation.\n\n Parameters\n ----------\n structure : MSONAtoms|Atoms\n An Atoms or MSONAtoms object.\n \n Returns\n -------\n Output of a QE calculation\n \"\"\"\n # copy previous inputs\n\n # write qe input files\n write_qe_input_set(\n structure=structure, input_set_generator=self.input_set_generator)\n\n # qe\n run_qe()\n\n # parse qe outputs\n task_doc=QETaskDoc.from_directory(\".\")\n \n return task_doc\n\n@dataclass\nclass StaticQEMaker(BaseQEMaker):\n \"\"\"\n Base QE job maker.\n\n Parameters\n ----------\n name : str\n The job name.\n input_set_generator : .QEInputGenerator\n A generator used to make the input set.\n \"\"\"\n\n name: str = \"static qe job\"\n input_set_generator: QEInputGenerator = field(default_factory=QEInputStaticGenerator)\n\n\n\nfrom jobflow import job, Response, Flow, run_locally\n\n@job\ndef get_ev_curve(structure, strain_lst):\n structures=generate_structures(structure,strain_lst=strain_lst)\n jobs = []\n volumes = []\n energies = []\n for istructure in range(len(strain_lst)):\n new_job = StaticQEMaker().make(structures[istructure])\n jobs.append(new_job)\n volumes.append(new_job.output.volume)\n energies.append(new_job.output.energy)\n return Response(replace=Flow(jobs, output={\"energies\": energies, \"volumes\": volumes}))\n \n@job\ndef plot_energy_volume_curve_job(volume_lst, energy_lst):\n plot_energy_volume_curve(volume_lst=volume_lst, energy_lst=energy_lst)\n\nstructure = bulk('Al', a=4.15, cubic=True)\nrelax = BaseQEMaker().make(structure=MSONAtoms(structure))\nev_curve = get_ev_curve(relax.output.structure, strain_lst=np.linspace(0.9, 1.1, 5))\nplot = plot_energy_volume_curve_job(volume_lst=ev_curve.output[\"volumes\"], energy_lst=ev_curve.output[\"energies\"])\njobs = [relax, ev_curve, plot]\nrun_locally(Flow(jobs), create_folders=True)","metadata":{"ExecuteTime":{"end_time":"2024-04-04T12:26:08.108635Z","start_time":"2024-04-04T12:24:48.120617Z"}},"execution_count":10,"outputs":[{"name":"stdout","text":"2024-04-04 15:55:32,815 INFO Started executing jobs locally\n2024-04-04 15:55:32,892 INFO Starting job - base qe job (72ab2547-8a66-4dd0-a95a-b6255a668cd8)\n","output_type":"stream"},{"name":"stderr","text":"[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00139] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:56:37,395 INFO Finished job - base qe job (72ab2547-8a66-4dd0-a95a-b6255a668cd8)\n2024-04-04 15:56:37,396 INFO Starting job - get_ev_curve (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee)\n2024-04-04 15:56:37,404 INFO Finished job - get_ev_curve (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee)\n2024-04-04 15:56:37,406 INFO Starting job - static qe job (b0759785-155b-4e79-9b72-c626067d81e1)\n","output_type":"stream"},{"name":"stderr","text":"[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00149] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:56:45,563 INFO Finished job - static qe job (b0759785-155b-4e79-9b72-c626067d81e1)\n2024-04-04 15:56:45,564 INFO Starting job - static qe job (514079e9-d6ae-4369-8b80-bf8ca7860540)\n","output_type":"stream"},{"name":"stderr","text":"Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00159] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:56:53,979 INFO Finished job - static qe job (514079e9-d6ae-4369-8b80-bf8ca7860540)\n2024-04-04 15:56:53,980 INFO Starting job - static qe job (6e3c5a28-4edb-4244-9e35-0b8733b946c4)\n","output_type":"stream"},{"name":"stderr","text":"[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00169] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:57:03,600 INFO Finished job - static qe job (6e3c5a28-4edb-4244-9e35-0b8733b946c4)\n2024-04-04 15:57:03,600 INFO Starting job - static qe job (980b72a5-fbea-445c-9075-a880322c8261)\n","output_type":"stream"},{"name":"stderr","text":"Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00179] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:57:14,907 INFO Finished job - static qe job (980b72a5-fbea-445c-9075-a880322c8261)\n2024-04-04 15:57:14,908 INFO Starting job - static qe job (a44a935f-6bd2-4279-bbcb-53d5ed890a99)\n","output_type":"stream"},{"name":"stderr","text":"Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n[jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2d4ksucf2d:00189] mca_base_component_repository_open: unable to open mca_btl_openib: librdmacm.so.1: cannot open shared object file: No such file or directory (ignored)\nNote: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG\n","output_type":"stream"},{"name":"stdout","text":"2024-04-04 15:57:27,174 INFO Finished job - static qe job (a44a935f-6bd2-4279-bbcb-53d5ed890a99)\n2024-04-04 15:57:27,174 INFO Starting job - store_inputs (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee, 2)\n2024-04-04 15:57:27,176 INFO Finished job - store_inputs (87ad6b9b-9f34-463e-b705-1ab7cdcf9aee, 2)\n2024-04-04 15:57:27,176 INFO Starting job - plot_energy_volume_curve_job (9987ab9f-1ae9-4172-8e31-b2c9920d4791)\n2024-04-04 15:57:27,256 INFO Finished job - plot_energy_volume_curve_job (9987ab9f-1ae9-4172-8e31-b2c9920d4791)\n2024-04-04 15:57:27,256 INFO Finished executing jobs locally\n","output_type":"stream"},{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"{'72ab2547-8a66-4dd0-a95a-b6255a668cd8': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.045218941837687, 4.045218941837687, 4.045218941837687]), energy=-1074.9365272693506, volume=66.1951387021735), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '87ad6b9b-9f34-463e-b705-1ab7cdcf9aee': {1: Response(output=None, detour=None, addition=None, replace=Flow(name='Flow', uuid='0e46d480-7699-4e03-889b-b4ba65fe3d38')\n 1. Job(name='static qe job', uuid='b0759785-155b-4e79-9b72-c626067d81e1')\n 2. Job(name='static qe job', uuid='514079e9-d6ae-4369-8b80-bf8ca7860540')\n 3. Job(name='static qe job', uuid='6e3c5a28-4edb-4244-9e35-0b8733b946c4')\n 4. Job(name='static qe job', uuid='980b72a5-fbea-445c-9075-a880322c8261')\n 5. Job(name='static qe job', uuid='a44a935f-6bd2-4279-bbcb-53d5ed890a99')\n 6. Job(name='store_inputs', uuid='87ad6b9b-9f34-463e-b705-1ab7cdcf9aee'), stored_data=None, stop_children=False, stop_jobflow=False),\n 2: Response(output={'energies': [OutputReference(b0759785-155b-4e79-9b72-c626067d81e1, .energy), OutputReference(514079e9-d6ae-4369-8b80-bf8ca7860540, .energy), OutputReference(6e3c5a28-4edb-4244-9e35-0b8733b946c4, .energy), OutputReference(980b72a5-fbea-445c-9075-a880322c8261, .energy), OutputReference(a44a935f-6bd2-4279-bbcb-53d5ed890a99, .energy)], 'volumes': [OutputReference(b0759785-155b-4e79-9b72-c626067d81e1, .volume), OutputReference(514079e9-d6ae-4369-8b80-bf8ca7860540, .volume), OutputReference(6e3c5a28-4edb-4244-9e35-0b8733b946c4, .volume), OutputReference(980b72a5-fbea-445c-9075-a880322c8261, .volume), OutputReference(a44a935f-6bd2-4279-bbcb-53d5ed890a99, .volume)]}, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n 'b0759785-155b-4e79-9b72-c626067d81e1': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[3.9056159296787105, 3.9056159296787105, 3.9056159296787105]), energy=-1074.8451830762128, volume=59.575624050752516), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '514079e9-d6ae-4369-8b80-bf8ca7860540': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[3.9766426435887574, 3.9766426435887574, 3.9766426435887574]), energy=-1074.9158947387848, volume=62.88538094246082), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '6e3c5a28-4edb-4244-9e35-0b8733b946c4': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.045218924156295, 4.045218924156295, 4.045218924156295]), energy=-1074.936525208987, volume=66.19513783416937), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '980b72a5-fbea-445c-9075-a880322c8261': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.111545777030954, 4.111545777030954, 4.111545777030954]), energy=-1074.9194989203452, volume=69.50489472587755), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n 'a44a935f-6bd2-4279-bbcb-53d5ed890a99': {1: Response(output=QETaskDoc(structure=MSONAtoms(symbols='Al4', pbc=True, cell=[4.175799058074337, 4.175799058074337, 4.175799058074337]), energy=-1074.8741797823543, volume=72.81465161758611), detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)},\n '9987ab9f-1ae9-4172-8e31-b2c9920d4791': {1: Response(output=None, detour=None, addition=None, replace=None, stored_data=None, stop_children=False, stop_jobflow=False)}}"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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SkrKOT+rb++nhnH+41Hf3k8thmEYZoxoiYiIiDgDzVkSERERqYTKkoiIiEglVJZEREREKqGyJCIiIlIJlSURERGRSqgsiYiIiFRCZUlERESkEipLIiIiIpVQWRKRei0iIoLXX3/d7Bgi4sBUlkTEaQ0dOpT+/ftX+LPVq1djsVjYuHGjnVOJSF2jsiQiTuvee+/lxx9/ZN++fef87IMPPqBLly5069bNhGQiUpeoLImI0xoyZAhBQUHMmjWr3ON5eXl8/vnn3HvvvcyfP5+oqCg8PT2JiIhgxowZ532+tLQ0LBYLiYmJZY+dPHkSi8XCihUrAFixYgUWi4WlS5fStWtXvL29ueaaazhy5AjffvstHTp0wN/fn9tuu428vLyy5zEMg5deeolWrVrh7e1NTEwM8+bNq8nDISK1RGVJRJyWm5sbd911F7NmzeL31wSfO3cuhYWFxMbGMnr0aG699Va2bNnC1KlTmTJlyjnlqjqmTp3Km2++yapVqzhw4ACjR4/m9ddf59NPP+Wbb75h2bJl/Pvf/y7b/sknn2TmzJm8/fbbbNu2jQkTJnDnnXfy008/XXIWEaldFuP37zAiIk5mx44ddOjQgR9//JGrr74agCuvvJJmzZphsVg4evQo3333Xdn2jz/+ON988w3btm0DSid4P/zwwzz88MOkpaXRsmVLNm3aRJcuXYDSkaWGDRuyfPlyrrrqKlasWMHVV1/N999/z7XXXgvA9OnTmTRpErt376ZVq1YAPPDAA6SlpREfH09ubi6BgYH8+OOPxMbGlmW57777yMvL49NPP7XHoRKRatLIkog4tcjISPr06cMHH3wAwO7du/nll1+45557SE5Opm/fvuW279u3Lzt37qSkpOSSfm90dHTZ/w8ODsbHx6esKJ197MiRIwBs376d/Px8rrvuOvz8/MpuH374Ibt3776kHCJS+9zMDiAicqnuvfdexo8fz//93/8xc+ZMwsPDufbaazEMA4vFUm7bygbTXVxcztmmqKiowm3d3d3L/r/FYil3/+xjNpsNoOx/v/nmG5o1a1ZuO09Pzwu9PBExmUaWRMTpjR49GldXVz799FNmz57N2LFjsVgsdOzYkV9//bXctqtWraJdu3a4urqe8zxNmjQBID09veyx30/2rq6OHTvi6enJ/v37adOmTblb8+bNL/n5RaR2aWRJRJyen58ft9xyC5MnTyY7O5sxY8YA8Oijj3LZZZfx7LPPcsstt7B69WrefPNN3nrrrQqfx9vbm969ezN9+nQiIiI4duwYTz755CXna9CgAY899hgTJkzAZrPRr18/cnJyWLVqFX5+ftx9992X/DtEpPZoZElE6oR7772XrKws+vfvT4sWLQDo1q0bX3zxBXPmzKFTp0489dRT/POf/ywrUxX54IMPKCoqokePHvztb3/jueeeq5F8zz77LE899RTTpk2jQ4cODBw4kMWLF9OyZcsaeX4RqT36NpyIiIhIJTSyJCIiIlIJlSURERGRSqgsiYiIiFRCZUlERESkEipLIiIiIpVQWRIRERGphMqSiIiISCVUlkREREQqobIkIiIiUgmVJREREZFKqCyJiIiIVEJlSURERKQS/w+KFmKjiKyciAAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2024-04-04T12:23:49.409448Z","start_time":"2024-04-04T12:23:49.404281Z"},"jupyter":{"outputs_hidden":false}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"collapsed":false,"ExecuteTime":{"end_time":"2024-04-04T12:23:49.414721Z","start_time":"2024-04-04T12:23:49.411543Z"},"jupyter":{"outputs_hidden":false}},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/pyiron_base.ipynb b/pyiron_base.ipynb index 084b25a..e6fbc20 100644 --- a/pyiron_base.ipynb +++ b/pyiron_base.ipynb @@ -1 +1 @@ -{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.11.8","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os","metadata":{"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np","metadata":{"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"from ase.build import bulk\nfrom ase.io import write","metadata":{"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"from adis_tools.parsers import parse_pw","metadata":{"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"markdown","source":"# Functions","metadata":{}},{"cell_type":"code","source":"def generate_structures(structure, strain_lst): \n structure_lst = []\n for strain in strain_lst:\n structure_strain = structure.copy()\n structure_strain.set_cell(\n structure_strain.cell * strain**(1/3), \n scale_atoms=True\n )\n structure_lst.append(structure_strain)\n return structure_lst","metadata":{"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"def plot_energy_volume_curve(volume_lst, energy_lst):\n plt.plot(volume_lst, energy_lst)\n plt.xlabel(\"Volume\")\n plt.ylabel(\"Energy\")\n plt.savefig(\"evcurve.png\")","metadata":{"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"def write_input(input_dict, working_directory=\".\"):\n filename = os.path.join(working_directory, 'input.pwi')\n os.makedirs(working_directory, exist_ok=True)\n write(\n filename=filename, \n images=input_dict[\"structure\"], \n Crystal=True, \n kpts=input_dict[\"kpts\"], \n input_data={\n 'calculation': input_dict[\"calculation\"],\n 'occupations': 'smearing',\n 'degauss': input_dict[\"smearing\"],\n }, \n pseudopotentials=input_dict[\"pseudopotentials\"],\n tstress=True, \n tprnfor=True\n )","metadata":{"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"def collect_output(working_directory=\".\"):\n output = parse_pw(os.path.join(working_directory, 'pwscf.xml'))\n return {\n \"structure\": output['ase_structure'],\n \"energy\": output[\"energy\"],\n \"volume\": output['ase_structure'].get_volume(),\n }","metadata":{"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"def workflow(project, structure, pseudopotentials): \n # Structure optimization \n job_qe_minimize = pr.wrap_executable(\n job_name=\"job_qe_minimize\",\n write_input_funct=write_input,\n collect_output_funct=collect_output,\n input_dict={\n \"structure\": structure, \n \"pseudopotentials\": pseudopotentials, \n \"kpts\": (3, 3, 3),\n \"calculation\": \"vc-relax\",\n \"smearing\": 0.02,\n },\n executable_str=\"mpirun -np 1 pw.x -in input.pwi > output.pwo\",\n execute_job=True,\n )\n\n # Generate Structures\n structure_lst = pr.wrap_python_function(generate_structures)(\n structure=job_qe_minimize.output.structure, \n strain_lst=np.linspace(0.9, 1.1, 5),\n )\n \n # Energy Volume Curve \n energy_lst, volume_lst = [], []\n for i, structure_strain in enumerate(structure_lst):\n job_strain = pr.wrap_executable(\n job_name=\"job_strain_\" + str(i),\n write_input_funct=write_input,\n collect_output_funct=collect_output,\n input_dict={\n \"structure\": structure_strain, \n \"pseudopotentials\": pseudopotentials, \n \"kpts\": (3, 3, 3),\n \"calculation\": \"scf\",\n \"smearing\": 0.02,\n },\n executable_str=\"mpirun -np 1 pw.x -in input.pwi > output.pwo\",\n execute_job=True,\n )\n energy_lst.append(job_strain.output.energy)\n volume_lst.append(job_strain.output.volume)\n \n return {\"volume\": volume_lst, \"energy\": energy_lst}","metadata":{"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"markdown","source":"# Setup","metadata":{}},{"cell_type":"code","source":"from pyiron_base import Project","metadata":{"trusted":true},"execution_count":10,"outputs":[]},{"cell_type":"code","source":"pr = Project(\"test\")\npr.remove_jobs(recursive=True, silently=True)","metadata":{"trusted":true},"execution_count":11,"outputs":[{"output_type":"display_data","data":{"text/plain":"0it [00:00, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"ad61406143494ae5a2d4a01b0cb3750d"}},"metadata":{}}]},{"cell_type":"markdown","source":"# Workflow","metadata":{}},{"cell_type":"code","source":"job_workflow = pr.wrap_python_function(workflow)\njob_workflow.input.project = pr\njob_workflow.input.structure = bulk('Al', a=4.05, cubic=True)\njob_workflow.input.pseudopotentials = {\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"}\njob_workflow.run()","metadata":{"trusted":true},"execution_count":12,"outputs":[{"name":"stdout","text":"The job workflowdbcdde11bde789bfe23b268a60c426c2 was saved and received the ID: 1\nThe job job_qe_minimize was saved and received the ID: 2\nThe job generate_structuresffd5c51457c48a1cff1923a2d98eb48c was saved and received the ID: 3\nThe job job_strain_0 was saved and received the ID: 4\nThe job job_strain_1 was saved and received the ID: 5\nThe job job_strain_2 was saved and received the ID: 6\nThe job job_strain_3 was saved and received the ID: 7\nThe job job_strain_4 was saved and received the ID: 8\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Result","metadata":{}},{"cell_type":"code","source":"plot_energy_volume_curve(\n volume_lst=job_workflow.output.result[\"volume\"], \n energy_lst=job_workflow.output.result[\"energy\"]\n)","metadata":{"trusted":true},"execution_count":13,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAAksAAAHACAYAAACyIiyEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABb8ElEQVR4nO3deVxVdcLH8c9lF5SLyiaCoLkA7ksqZmnlmktamW2YVk7NjC1WVva0OG3a3pRt05S222hatlGa2uSCO64IuODC5soiyHrP8wfCRCIqwj1c+L5fr/t6Hi7nXL73xFy+/n7n/I7FMAwDEREREamUk9kBREREROoylSURERGRKqgsiYiIiFRBZUlERESkCipLIiIiIlVQWRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEqqCyZ5Pnnn6dfv354enri4+NzXvsYhsGMGTMICgqiUaNGDBw4kB07dpR/Pzk5GYvFUulj/vz5Z7xeQUEB3bp1w2KxEBcXd0H53333Xbp06YK3tzfe3t5ERUXx008/XdBriIiIOAKVJZMUFhYybtw4/vrXv573Pi+99BKvvfYas2fPZv369QQGBjJ48GBycnIACAkJIS0trcLjH//4B15eXgwfPvyM13vkkUcICgqqVv7g4GBmzZrFhg0b2LBhA1dddRXXXntthfImIiJSLxhiqjlz5hhWq/Wc29lsNiMwMNCYNWtW+XP5+fmG1Wo13nvvvbPu161bN+OOO+444/kff/zRCA8PN3bs2GEAxubNmyt8f8eOHcbw4cMNLy8vw9/f37jtttuMI0eOVJmxadOmxr///e9zvhcRERFHopElB7Fv3z7S09MZMmRI+XPu7u4MGDCA1atXV7rPxo0biYuL484776zwfEZGBpMnT+bTTz/F09PzjP3S0tIYMGAA3bp1Y8OGDcTExJCRkcGNN95Y6c8pKSlh3rx55ObmEhUVdRHvUkREpO5xMTuAnJ/09HQAAgICKjwfEBDA/v37K93nww8/JCIign79+pU/ZxgGEydO5J577qFXr14kJyefsd+7775Ljx49eOGFF8qf++ijjwgJCSExMZH27dsDsG3bNqKiosjPz6dx48YsWrSIyMjIi32rIiIidYpGlmrQjBkzznqCddljw4YNF/UzLBZLha8NwzjjOYBTp07xxRdfnDGq9NZbb5Gd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JCIiIlIFlSUHlpKSwm233Ubz5s3x9PSkW7dubNy4sfz7hmEwY8YMgoKCaNSoEQMHDmTHjh0mJq5dVR2PoqIiHn30UTp37oyXlxdBQUFMmDCB1NRUk1PXrnP9jvzR3XffjcVi4Y033rBvSDs6n+MRHx/P6NGjsVqtNGnShL59+3LgwAGTEteucx2PkydPMmXKFIKDg2nUqBERERG8++67JiauPWFhYVgsljMef//734GG93la1fFoiJ+nKksO6sSJE1x22WW4urry008/sXPnTl599VV8fHzKt3nppZd47bXXmD17NuvXrycwMJDBgweX356lPjnX8cjLy2PTpk08+eSTbNq0iYULF5KYmMjo0aPNDV6Lzud3pMw333zD2rVrCQoKsn9QOzmf47Fnzx769+9PeHg4K1asYMuWLTz55JN4eHiYF7yWnM/xmDp1KjExMXz22WfEx8czdepU7r33Xr799lvzgteS9evXk5aWVv5YsmQJAOPGjQMa1ucpVH08GuLnKYY4pEcffdTo37//Wb9vs9mMwMBAY9asWeXP5efnG1ar1XjvvffsEdGuznU8KrNu3ToDMPbv319Lqcx1vsfk0KFDRsuWLY3t27cboaGhxuuvv1774UxwPsdj/Pjxxm233WanROY6n+PRsWNH45lnnqnwXI8ePYwnnniiNqPVCffff79xySWXGDabrcF9nlbmj8ejMvX981QjSw5q8eLF9OrVi3HjxuHv70/37t354IMPyr+/b98+0tPTy288DKVrYwwYMIDVq1ebEblWnet4VCYrKwuLxVLpSEt9cD7HxGazER0dzbRp0+jYsaNJSe3jXMfDZrPxww8/0L59e4YOHYq/vz99+vThm2++MS90LTqf34/+/fuzePFiUlJSMAyD5cuXk5iYyNChQ01KbR+FhYV89tln3HHHHVgslgb3efpnfz4elanvn6caWXJQ7u7uhru7uzF9+nRj06ZNxnvvvWd4eHgYH3/8sWEYhrFq1SoDMFJSUirsN3nyZGPIkCFmRK5V5zoef3bq1CmjZ8+exq233mrnpPZzPsfkhRdeMAYPHlz+r8X6PLJ0ruORlpZmAIanp6fx2muvGZs3bzZmzpxpWCwWY8WKFSanr3nn8/tRUFBgTJgwwQAMFxcXw83Nzfjkk09MTG0fX331leHs7Fz++dnQPk//7M/H488awuepypKDcnV1NaKioio8d++99xp9+/Y1DON//+NOTU2tsM1dd91lDB061G457eVcx+OPCgsLjWuvvdbo3r27kZWVZa+IdneuY7JhwwYjICCgwgdgfS5L5zoeKSkpBmDcfPPNFbYZNWqUcdNNN9ktp72cz/9mXn75ZaN9+/bG4sWLjS1bthhvvfWW0bhxY2PJkiX2jmtXQ4YMMUaOHFn+dUP7PP2zPx+PP2oon6eahnNQLVq0IDIyssJzERER5VftBAYGApCenl5hm8OHDxMQEGCfkHZ0ruNRpqioiBtvvJF9+/axZMmSenHH7LM51zH5/fffOXz4MK1atcLFxQUXFxf279/PQw89RFhYmAmJa9e5joevry8uLi7n9XtUH5zreJw6dYrHH3+c1157jVGjRtGlSxemTJnC+PHjeeWVV8yIbBf79+9n6dKl3HXXXeXPNbTP0z+q7HiUaUifpypLDuqyyy4jISGhwnOJiYmEhoYC0Lp1awIDA8uvYIDSeefffvuNfv362TWrPZzreMD//oedlJTE0qVLad68ub1j2tW5jkl0dDRbt24lLi6u/BEUFMS0adP4+eefzYhcq851PNzc3Lj00kvP+XtUX5zreBQVFVFUVISTU8U/E87OzthsNrvltLc5c+bg7+/PiBEjyp9raJ+nf1TZ8YCG93mqaTgHtW7dOsPFxcV4/vnnjaSkJOPzzz83PD09jc8++6x8m1mzZhlWq9VYuHChsW3bNuPmm282WrRoYWRnZ5uYvHac63gUFRUZo0ePNoKDg424uDgjLS2t/FFQUGBy+tpxPr8jf1afp+HO53gsXLjQcHV1Nf71r38ZSUlJxltvvWU4Ozsbv//+u4nJa8f5HI8BAwYYHTt2NJYvX27s3bvXmDNnjuHh4WG88847JiavPSUlJUarVq2MRx999IzvNaTP0zJnOx4N8fNUZcmBfffdd0anTp0Md3d3Izw83PjXv/5V4fs2m814+umnjcDAQMPd3d244oorjG3btpmUtvZVdTz27dtnAJU+li9fbl7oWnau35E/q89lyTDO73h8+OGHRtu2bQ0PDw+ja9euxjfffGNCUvs41/FIS0szJk6caAQFBRkeHh5Ghw4djFdfffWsl487up9//tkAjISEhDO+19A+Tw3j7MejIX6eWgzDMMwY0RIRERFxBDpnSURERKQKKksiIiIiVVBZEhEREamCypKIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJRBq0sLAw3njjDbNjiEgdprIkIg5r1KhRDBo0qNLvrVmzBovFwqZNm+ycSkTqG5UlEXFYd955J8uWLWP//v1nfO+jjz6iW7du9OjRw4RkIlKfqCyJiMMaOXIk/v7+zJ07t8LzeXl5fPXVV9x55518/fXXdOzYEXd3d8LCwnj11VfP+nrJyclYLBbi4uLKn8vMzMRisbBixQoAVqxYgcVi4eeff6Z79+40atSIq666isOHD/PTTz8RERGBt7c3N998M3l5eeWvYxgGL730Em3atKFRo0Z07dqVBQsW1OThEJFaorIkIg7LxcWFCRMmMHfuXP54T/D58+dTWFhIVFQUN954IzfddBPbtm1jxowZPPnkk2eUq+qYMWMGs2fPZvXq1Rw8eJAbb7yRN954gy+++IIffviBJUuW8NZbb5Vv/8QTTzBnzhzeffddduzYwdSpU7ntttv47bffLjqLiNQui/HHTxgREQeza9cuIiIiWLZsGVdeeSUAAwYMoGXLllgsFo4cOcIvv/xSvv0jjzzCDz/8wI4dO4DSE7wfeOABHnjgAZKTk2ndujWbN2+mW7duQOnIUtOmTVm+fDkDBw5kxYoVXHnllSxdupSrr74agFmzZjF9+nT27NlDmzZtALjnnntITk4mJiaG3NxcfH19WbZsGVFRUeVZ7rrrLvLy8vjiiy/scahEpJo0siQiDi08PJx+/frx0UcfAbBnzx5+//137rjjDuLj47nssssqbH/ZZZeRlJRESUnJRf3cLl26lP//AQEBeHp6lhelsucOHz4MwM6dO8nPz2fw4ME0bty4/PHJJ5+wZ8+ei8ohIrXPxewAIiIX684772TKlCm8/fbbzJkzh9DQUK6++moMw8BisVTYtqrBdCcnpzO2KSoqqnRbV1fX8v/fYrFU+LrsOZvNBlD+f3/44QdatmxZYTt3d/dzvT0RMZlGlkTE4d144404OzvzxRdf8PHHHzNp0iQsFguRkZGsXLmywrarV6+mffv2ODs7n/E6fn5+AKSlpZU/98eTvasrMjISd3d3Dhw4QNu2bSs8QkJCLvr1RaR2aWRJRBxe48aNGT9+PI8//jhZWVlMnDgRgIceeohLL72UZ599lvHjx7NmzRpmz57NO++8U+nrNGrUiL59+zJr1izCwsI4evQoTzzxxEXna9KkCQ8//DBTp07FZrPRv39/srOzWb16NY0bN+b222+/6J8hIrVHI0siUi/ceeednDhxgkGDBtGqVSsAevTowX/+8x/mzZtHp06deOqpp3jmmWfKy1RlPvroI4qKiujVqxf3338/zz33XI3ke/bZZ3nqqaeYOXMmERERDB06lO+++47WrVvXyOuLSO3R1XAiIiIiVdDIkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgsiYiIiFRBZUlERESkCipLIiIiIlVQWRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEq/D8WwIub/1rFmwAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"markdown","source":"# Summary","metadata":{}},{"cell_type":"code","source":"pr.job_table()","metadata":{"trusted":true},"execution_count":14,"outputs":[{"execution_count":14,"output_type":"execute_result","data":{"text/plain":" id status chemicalformula \\\n0 1 finished None \n1 2 finished None \n2 3 finished None \n3 4 finished None \n4 5 finished None \n5 6 finished None \n6 7 finished None \n7 8 finished None \n\n job \\\n0 workflowdbcdde11bde789bfe23b268a60c426c2 \n1 job_qe_minimize \n2 generate_structuresffd5c51457c48a1cff1923a2d98eb48c \n3 job_strain_0 \n4 job_strain_1 \n5 job_strain_2 \n6 job_strain_3 \n7 job_strain_4 \n\n subjob projectpath \\\n0 /workflowdbcdde11bde789bfe23b268a60c426c2 None \n1 /job_qe_minimize None \n2 /generate_structuresffd5c51457c48a1cff1923a2d98eb48c None \n3 /job_strain_0 None \n4 /job_strain_1 None \n5 /job_strain_2 None \n6 /job_strain_3 None \n7 /job_strain_4 None \n\n project timestart timestop \\\n0 /home/jovyan/test/ 2024-03-27 18:09:12.391144 NaT \n1 /home/jovyan/test/ 2024-03-27 18:09:12.461873 2024-03-27 18:09:58.263945 \n2 /home/jovyan/test/ 2024-03-27 18:09:58.313609 NaT \n3 /home/jovyan/test/ 2024-03-27 18:09:58.477003 2024-03-27 18:10:07.059195 \n4 /home/jovyan/test/ 2024-03-27 18:10:07.429814 2024-03-27 18:10:17.057758 \n5 /home/jovyan/test/ 2024-03-27 18:10:17.833435 2024-03-27 18:10:28.145417 \n6 /home/jovyan/test/ 2024-03-27 18:10:28.190237 2024-03-27 18:10:40.343077 \n7 /home/jovyan/test/ 2024-03-27 18:10:40.400240 2024-03-27 18:10:53.349634 \n\n totalcputime \\\n0 NaN \n1 45.0 \n2 NaN \n3 8.0 \n4 9.0 \n5 10.0 \n6 12.0 \n7 12.0 \n\n computer \\\n0 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n1 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n2 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n3 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n4 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n5 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n6 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n7 pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1 \n\n hamilton hamversion parentid masterid \n0 PythonFunctionContainerJob 0.4 None None \n1 ExecutableContainerJob 0.4 None None \n2 PythonFunctionContainerJob 0.4 None None \n3 ExecutableContainerJob 0.4 None None \n4 ExecutableContainerJob 0.4 None None \n5 ExecutableContainerJob 0.4 None None \n6 ExecutableContainerJob 0.4 None None \n7 ExecutableContainerJob 0.4 None None ","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idstatuschemicalformulajobsubjobprojectpathprojecttimestarttimestoptotalcputimecomputerhamiltonhamversionparentidmasterid
01finishedNoneworkflowdbcdde11bde789bfe23b268a60c426c2/workflowdbcdde11bde789bfe23b268a60c426c2None/home/jovyan/test/2024-03-27 18:09:12.391144NaTNaNpyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1PythonFunctionContainerJob0.4NoneNone
12finishedNonejob_qe_minimize/job_qe_minimizeNone/home/jovyan/test/2024-03-27 18:09:12.4618732024-03-27 18:09:58.26394545.0pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1ExecutableContainerJob0.4NoneNone
23finishedNonegenerate_structuresffd5c51457c48a1cff1923a2d98eb48c/generate_structuresffd5c51457c48a1cff1923a2d98eb48cNone/home/jovyan/test/2024-03-27 18:09:58.313609NaTNaNpyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1PythonFunctionContainerJob0.4NoneNone
34finishedNonejob_strain_0/job_strain_0None/home/jovyan/test/2024-03-27 18:09:58.4770032024-03-27 18:10:07.0591958.0pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1ExecutableContainerJob0.4NoneNone
45finishedNonejob_strain_1/job_strain_1None/home/jovyan/test/2024-03-27 18:10:07.4298142024-03-27 18:10:17.0577589.0pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1ExecutableContainerJob0.4NoneNone
56finishedNonejob_strain_2/job_strain_2None/home/jovyan/test/2024-03-27 18:10:17.8334352024-03-27 18:10:28.14541710.0pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1ExecutableContainerJob0.4NoneNone
67finishedNonejob_strain_3/job_strain_3None/home/jovyan/test/2024-03-27 18:10:28.1902372024-03-27 18:10:40.34307712.0pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1ExecutableContainerJob0.4NoneNone
78finishedNonejob_strain_4/job_strain_4None/home/jovyan/test/2024-03-27 18:10:40.4002402024-03-27 18:10:53.34963412.0pyiron@jupyter-jan-2djanssen-2dqua-2dsso-5fpyiron-5fbase-2dtqm3r7gv#1ExecutableContainerJob0.4NoneNone
\n
"},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]} +{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.11.0","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# pyiron \nThe integrated development environment (IDE) for computational materials science `pyiron` accelerates the rapid prototyping and up-scaling of simulation protocols. Internally, it consists of two primary components the `pyiron_atomistics` package, which provides the interfaces for atomistic simulations codes and atomistic simulation workflows and the `pyiron_base` package, which defines the job management and data storage interface. The latter is independent of the atomistic scale and addresses the general challenge of coupling simulation codes in reproducible workflows. Simulation codes can be integrated in the `pyiron_base` package by either using existing python bindings or alternatively by writing the input files, executing the simulation code and parsing the output files. The following explanations focus on the `pyiron_base` package as a workflow manager, which constructs simulation workflows by combining `job` objects like building blocks.\n\n## Installation / Setup\nThe `pyiron_base` workflow manager can be installed via the python package index or the conda package manager. While no additional configuration is required to use `pyiron_base` on a workstation, the connection to an high performance computing (HPC) cluster requires some additional configuration. The `.pyiron` configuration file in the users home directory is used to specify the resource directory, which contains the configuration of the queuing system. \n\n## Implementation of a new simulation code\nThe `pyiron_base` workflow manager provides two interfaces to implement new simulation codes or simulation workflows. For simulation codes which already provide a python interface the `wrap_python_function()` function is used to convert any python function into a pyiron job object. In analogy external executables can be wrapped using the `wrap_executable()`. Based on these two functions any executable can be wrapped as `Job` object. By naming the `Job` object the user can easily reload the same calculation at any time. Furthermore, `pyiron_base` internally uses the name to generate a directory for each `Job` object to simplify locating the input and output of a given calculation for debugging: ","metadata":{}},{"cell_type":"code","source":"import os\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom ase.io import write\nfrom adis_tools.parsers import parse_pw","metadata":{"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"def write_input(input_dict, working_directory=\".\"):\n filename = os.path.join(working_directory, 'input.pwi')\n os.makedirs(working_directory, exist_ok=True)\n write(\n filename=filename, \n images=input_dict[\"structure\"], \n Crystal=True, \n kpts=input_dict[\"kpts\"], \n input_data={\n 'calculation': input_dict[\"calculation\"],\n 'occupations': 'smearing',\n 'degauss': input_dict[\"smearing\"],\n }, \n pseudopotentials=input_dict[\"pseudopotentials\"],\n tstress=True, \n tprnfor=True\n )","metadata":{"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"def collect_output(working_directory=\".\"):\n output = parse_pw(os.path.join(working_directory, 'pwscf.xml'))\n return {\n \"structure\": output['ase_structure'],\n \"energy\": output[\"energy\"],\n \"volume\": output['ase_structure'].get_volume(),\n }","metadata":{"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"raw","source":"job_test = pr.wrap_executable(\n job_name=\"job_test\",\n write_input_funct=write_input,\n collect_output_funct=collect_output,\n input_dict={\n \"structure\": structure, \n \"pseudopotentials\": pseudopotentials, \n \"kpts\": (3, 3, 3),\n \"calculation\": \"scf\",\n \"smearing\": 0.02,\n },\n executable_str=\"mpirun -np 1 pw.x -in input.pwi > output.pwo\",\n execute_job=False,\n)","metadata":{}},{"cell_type":"markdown","source":"Finally, multiple simulation can be combined in a simulation protocol. In this case the optimization of an Aluminium lattice structure, the calculation of an energy volume curve and the plotting of the resulting curve. ","metadata":{}},{"cell_type":"code","source":"def generate_structures(structure, strain_lst): \n structure_lst = []\n for strain in strain_lst:\n structure_strain = structure.copy()\n structure_strain.set_cell(\n structure_strain.cell * strain**(1/3), \n scale_atoms=True\n )\n structure_lst.append(structure_strain)\n return structure_lst","metadata":{"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"def workflow(project, structure, pseudopotentials): \n # Structure optimization \n job_qe_minimize = pr.wrap_executable(\n job_name=\"job_qe_minimize\",\n write_input_funct=write_input,\n collect_output_funct=collect_output,\n input_dict={\n \"structure\": structure, \n \"pseudopotentials\": pseudopotentials, \n \"kpts\": (3, 3, 3),\n \"calculation\": \"vc-relax\",\n \"smearing\": 0.02,\n },\n executable_str=\"mpirun -np 1 pw.x -in input.pwi > output.pwo\",\n execute_job=True,\n )\n\n # Generate Structures\n structure_lst = pr.wrap_python_function(generate_structures)(\n structure=job_qe_minimize.output.structure, \n strain_lst=np.linspace(0.9, 1.1, 5),\n )\n \n # Energy Volume Curve \n energy_lst, volume_lst = [], []\n for i, structure_strain in enumerate(structure_lst):\n job_strain = pr.wrap_executable(\n job_name=\"job_strain_\" + str(i),\n write_input_funct=write_input,\n collect_output_funct=collect_output,\n input_dict={\n \"structure\": structure_strain, \n \"pseudopotentials\": pseudopotentials, \n \"kpts\": (3, 3, 3),\n \"calculation\": \"scf\",\n \"smearing\": 0.02,\n },\n executable_str=\"mpirun -np 1 pw.x -in input.pwi > output.pwo\",\n execute_job=True,\n )\n energy_lst.append(job_strain.output.energy)\n volume_lst.append(job_strain.output.volume)\n \n return {\"volume\": volume_lst, \"energy\": energy_lst}","metadata":{"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"markdown","source":"As the quantum espresso calculations are the computationally expensive steps they are combined in a python function to be submitted to dedicated computing resources. In contrast the creation of the atomistic structure and the plotting of the energy volume curve are executed in the users process.\n\nThe remaining simulation protocol, can be summarized in a few lines. The required modules are imported, a `Project` object is created which represents a folder on the filesystem, the `wrap_python_function()` is used to convert the computationally expensive steps of the workflow into a single `Job` object and the resulting energy volume curve is plotted: ","metadata":{}},{"cell_type":"code","source":"from ase.build import bulk\nfrom pyiron_base import Project","metadata":{"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"pr = Project(\"test\")\njob_workflow = pr.wrap_python_function(workflow)\njob_workflow.input.project = pr\njob_workflow.input.structure = bulk('Al', a=4.05, cubic=True)\njob_workflow.input.pseudopotentials = {\"Al\": \"Al.pbe-n-kjpaw_psl.1.0.0.UPF\"}\njob_workflow.run()","metadata":{"trusted":true},"execution_count":7,"outputs":[{"name":"stdout","text":"The job workflow895ba469e3d888839622dab8177e3746 was saved and received the ID: 1\nThe job job_qe_minimize was saved and received the ID: 2\nThe job generate_structures81144f1592dde5715ec257eb7f425177 was saved and received the ID: 3\nThe job job_strain_0 was saved and received the ID: 4\nThe job job_strain_1 was saved and received the ID: 5\nThe job job_strain_2 was saved and received the ID: 6\nThe job job_strain_3 was saved and received the ID: 7\nThe job job_strain_4 was saved and received the ID: 8\n","output_type":"stream"}]},{"cell_type":"code","source":"def plot_energy_volume_curve(volume_lst, energy_lst):\n plt.plot(volume_lst, energy_lst)\n plt.xlabel(\"Volume\")\n plt.ylabel(\"Energy\")\n plt.savefig(\"evcurve.png\")","metadata":{"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"markdown","source":"This concludes the first version of the simulation workflow, in the following the submission to HPC resources, the different options for data storage and the publication of the workflow are briefly discussed.","metadata":{}},{"cell_type":"code","source":"plot_energy_volume_curve(\n volume_lst=job_workflow.output.result[\"volume\"], \n energy_lst=job_workflow.output.result[\"energy\"]\n)","metadata":{"trusted":true},"execution_count":9,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAAksAAAHACAYAAACyIiyEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABb8ElEQVR4nO3deVxVdcLH8c9lF5SLyiaCoLkA7ksqZmnlmktamW2YVk7NjC1WVva0OG3a3pRt05S222hatlGa2uSCO64IuODC5soiyHrP8wfCRCIqwj1c+L5fr/t6Hi7nXL73xFy+/n7n/I7FMAwDEREREamUk9kBREREROoylSURERGRKqgsiYiIiFRBZUlERESkCipLIiIiIlVQWRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEqqCyZ5Pnnn6dfv354enri4+NzXvsYhsGMGTMICgqiUaNGDBw4kB07dpR/Pzk5GYvFUulj/vz5Z7xeQUEB3bp1w2KxEBcXd0H53333Xbp06YK3tzfe3t5ERUXx008/XdBriIiIOAKVJZMUFhYybtw4/vrXv573Pi+99BKvvfYas2fPZv369QQGBjJ48GBycnIACAkJIS0trcLjH//4B15eXgwfPvyM13vkkUcICgqqVv7g4GBmzZrFhg0b2LBhA1dddRXXXntthfImIiJSLxhiqjlz5hhWq/Wc29lsNiMwMNCYNWtW+XP5+fmG1Wo13nvvvbPu161bN+OOO+444/kff/zRCA8PN3bs2GEAxubNmyt8f8eOHcbw4cMNLy8vw9/f37jtttuMI0eOVJmxadOmxr///e9zvhcRERFHopElB7Fv3z7S09MZMmRI+XPu7u4MGDCA1atXV7rPxo0biYuL484776zwfEZGBpMnT+bTTz/F09PzjP3S0tIYMGAA3bp1Y8OGDcTExJCRkcGNN95Y6c8pKSlh3rx55ObmEhUVdRHvUkREpO5xMTuAnJ/09HQAAgICKjwfEBDA/v37K93nww8/JCIign79+pU/ZxgGEydO5J577qFXr14kJyefsd+7775Ljx49eOGFF8qf++ijjwgJCSExMZH27dsDsG3bNqKiosjPz6dx48YsWrSIyMjIi32rIiIidYpGlmrQjBkzznqCddljw4YNF/UzLBZLha8NwzjjOYBTp07xxRdfnDGq9NZbb5Gd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JCIiIlIFlSUHlpKSwm233Ubz5s3x9PSkW7dubNy4sfz7hmEwY8YMgoKCaNSoEQMHDmTHjh0mJq5dVR2PoqIiHn30UTp37oyXlxdBQUFMmDCB1NRUk1PXrnP9jvzR3XffjcVi4Y033rBvSDs6n+MRHx/P6NGjsVqtNGnShL59+3LgwAGTEteucx2PkydPMmXKFIKDg2nUqBERERG8++67JiauPWFhYVgsljMef//734GG93la1fFoiJ+nKksO6sSJE1x22WW4urry008/sXPnTl599VV8fHzKt3nppZd47bXXmD17NuvXrycwMJDBgweX356lPjnX8cjLy2PTpk08+eSTbNq0iYULF5KYmMjo0aPNDV6Lzud3pMw333zD2rVrCQoKsn9QOzmf47Fnzx769+9PeHg4K1asYMuWLTz55JN4eHiYF7yWnM/xmDp1KjExMXz22WfEx8czdepU7r33Xr799lvzgteS9evXk5aWVv5YsmQJAOPGjQMa1ucpVH08GuLnKYY4pEcffdTo37//Wb9vs9mMwMBAY9asWeXP5efnG1ar1XjvvffsEdGuznU8KrNu3ToDMPbv319Lqcx1vsfk0KFDRsuWLY3t27cboaGhxuuvv1774UxwPsdj/Pjxxm233WanROY6n+PRsWNH45lnnqnwXI8ePYwnnniiNqPVCffff79xySWXGDabrcF9nlbmj8ejMvX981QjSw5q8eLF9OrVi3HjxuHv70/37t354IMPyr+/b98+0tPTy288DKVrYwwYMIDVq1ebEblWnet4VCYrKwuLxVLpSEt9cD7HxGazER0dzbRp0+jYsaNJSe3jXMfDZrPxww8/0L59e4YOHYq/vz99+vThm2++MS90LTqf34/+/fuzePFiUlJSMAyD5cuXk5iYyNChQ01KbR+FhYV89tln3HHHHVgslgb3efpnfz4elanvn6caWXJQ7u7uhru7uzF9+nRj06ZNxnvvvWd4eHgYH3/8sWEYhrFq1SoDMFJSUirsN3nyZGPIkCFmRK5V5zoef3bq1CmjZ8+exq233mrnpPZzPsfkhRdeMAYPHlz+r8X6PLJ0ruORlpZmAIanp6fx2muvGZs3bzZmzpxpWCwWY8WKFSanr3nn8/tRUFBgTJgwwQAMFxcXw83Nzfjkk09MTG0fX331leHs7Fz++dnQPk//7M/H488awuepypKDcnV1NaKioio8d++99xp9+/Y1DON//+NOTU2tsM1dd91lDB061G457eVcx+OPCgsLjWuvvdbo3r27kZWVZa+IdneuY7JhwwYjICCgwgdgfS5L5zoeKSkpBmDcfPPNFbYZNWqUcdNNN9ktp72cz/9mXn75ZaN9+/bG4sWLjS1bthhvvfWW0bhxY2PJkiX2jmtXQ4YMMUaOHFn+dUP7PP2zPx+PP2oon6eahnNQLVq0IDIyssJzERER5VftBAYGApCenl5hm8OHDxMQEGCfkHZ0ruNRpqioiBtvvJF9+/axZMmSenHH7LM51zH5/fffOXz4MK1atcLFxQUXFxf279/PQw89RFhYmAmJa9e5joevry8uLi7n9XtUH5zreJw6dYrHH3+c1157jVGjRtGlSxemTJnC+PHjeeWVV8yIbBf79+9n6dKl3HXXXeXPNbTP0z+q7HiUaUifpypLDuqyyy4jISGhwnOJiYmEhoYC0Lp1awIDA8uvYIDSeefffvuNfv362TWrPZzreMD//oedlJTE0qVLad68ub1j2tW5jkl0dDRbt24lLi6u/BEUFMS0adP4+eefzYhcq851PNzc3Lj00kvP+XtUX5zreBQVFVFUVISTU8U/E87OzthsNrvltLc5c+bg7+/PiBEjyp9raJ+nf1TZ8YCG93mqaTgHtW7dOsPFxcV4/vnnjaSkJOPzzz83PD09jc8++6x8m1mzZhlWq9VYuHChsW3bNuPmm282WrRoYWRnZ5uYvHac63gUFRUZo0ePNoKDg424uDgjLS2t/FFQUGBy+tpxPr8jf1afp+HO53gsXLjQcHV1Nf71r38ZSUlJxltvvWU4Ozsbv//+u4nJa8f5HI8BAwYYHTt2NJYvX27s3bvXmDNnjuHh4WG88847JiavPSUlJUarVq2MRx999IzvNaTP0zJnOx4N8fNUZcmBfffdd0anTp0Md3d3Izw83PjXv/5V4fs2m814+umnjcDAQMPd3d244oorjG3btpmUtvZVdTz27dtnAJU+li9fbl7oWnau35E/q89lyTDO73h8+OGHRtu2bQ0PDw+ja9euxjfffGNCUvs41/FIS0szJk6caAQFBRkeHh5Ghw4djFdfffWsl487up9//tkAjISEhDO+19A+Tw3j7MejIX6eWgzDMMwY0RIRERFxBDpnSURERKQKKksiIiIiVVBZEhEREamCypKIiIhIFVSWRERERKqgsiQiIiJSBZUlERERkSqoLImIiIhUQWVJRBq0sLAw3njjDbNjiEgdprIkIg5r1KhRDBo0qNLvrVmzBovFwqZNm+ycSkTqG5UlEXFYd955J8uWLWP//v1nfO+jjz6iW7du9OjRw4RkIlKfqCyJiMMaOXIk/v7+zJ07t8LzeXl5fPXVV9x55518/fXXdOzYEXd3d8LCwnj11VfP+nrJyclYLBbi4uLKn8vMzMRisbBixQoAVqxYgcVi4eeff6Z79+40atSIq666isOHD/PTTz8RERGBt7c3N998M3l5eeWvYxgGL730Em3atKFRo0Z07dqVBQsW1OThEJFaorIkIg7LxcWFCRMmMHfuXP54T/D58+dTWFhIVFQUN954IzfddBPbtm1jxowZPPnkk2eUq+qYMWMGs2fPZvXq1Rw8eJAbb7yRN954gy+++IIffviBJUuW8NZbb5Vv/8QTTzBnzhzeffddduzYwdSpU7ntttv47bffLjqLiNQui/HHTxgREQeza9cuIiIiWLZsGVdeeSUAAwYMoGXLllgsFo4cOcIvv/xSvv0jjzzCDz/8wI4dO4DSE7wfeOABHnjgAZKTk2ndujWbN2+mW7duQOnIUtOmTVm+fDkDBw5kxYoVXHnllSxdupSrr74agFmzZjF9+nT27NlDmzZtALjnnntITk4mJiaG3NxcfH19WbZsGVFRUeVZ7rrrLvLy8vjiiy/scahEpJo0siQiDi08PJx+/frx0UcfAbBnzx5+//137rjjDuLj47nssssqbH/ZZZeRlJRESUnJRf3cLl26lP//AQEBeHp6lhelsucOHz4MwM6dO8nPz2fw4ME0bty4/PHJJ5+wZ8+ei8ohIrXPxewAIiIX684772TKlCm8/fbbzJkzh9DQUK6++moMw8BisVTYtqrBdCcnpzO2KSoqqnRbV1fX8v/fYrFU+LrsOZvNBlD+f3/44QdatmxZYTt3d/dzvT0RMZlGlkTE4d144404OzvzxRdf8PHHHzNp0iQsFguRkZGsXLmywrarV6+mffv2ODs7n/E6fn5+AKSlpZU/98eTvasrMjISd3d3Dhw4QNu2bSs8QkJCLvr1RaR2aWRJRBxe48aNGT9+PI8//jhZWVlMnDgRgIceeohLL72UZ599lvHjx7NmzRpmz57NO++8U+nrNGrUiL59+zJr1izCwsI4evQoTzzxxEXna9KkCQ8//DBTp07FZrPRv39/srOzWb16NY0bN+b222+/6J8hIrVHI0siUi/ceeednDhxgkGDBtGqVSsAevTowX/+8x/mzZtHp06deOqpp3jmmWfKy1RlPvroI4qKiujVqxf3338/zz33XI3ke/bZZ3nqqaeYOXMmERERDB06lO+++47WrVvXyOuLSO3R1XAiIiIiVdDIkoiIiEgVVJZEREREqqCyJCIiIlIFlSURERGRKqgsiYiIiFRBZUlERESkCipLIiIiIlVQWRIRERGpgsqSiIiISBVUlkRERESqoLIkIiIiUgWVJREREZEq/D8WwIub/1rFmwAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"markdown","source":"## Submission to an HPC / Check pointing / Error handling\nWhile the local installation of the `pyiron_base` workflow manager requires no additional configuration, the connection to an HPC system is more evolved. The existing examples provided for specific HPC systems can be converted to jinja2 templates, by defining variables with double curly brackets. A minimalist template could be: \n```\n#!/bin/bash\n#SBATCH --job-name={{job_name}}\n#SBATCH --chdir={{working_directory}}\n#SBATCH --cpus-per-task={{cores}}\n\n{{command}}\n```\nHere the `job_name`, the `working_directory` and the number of compute `cores` can be specified as parameters. In the `pyiron_base` workflow manager such a submission script can then be selected based on its name as parameter of the `server` object:\n```python\njob_workflow.server.queue = \"my_queue\"\njob_workflow.server.cores = 64\n```\nThese lines are inserted before calling the `run()` function. The rest of the simulation protocol remains the same.\n\nWhen simulation protocols are up-scaling and iterated over a large number of parameters, certain parameter combinations might lead to poor conversion or even cause simulation code crashes. In the `pyiron_base` workflow manager these calculation are marked as `aborted`. This gives the user to inspect the calculation and in case the crash was not related to the parameter combination, individual jobs can be removed with the `remove_job()` function. Afterwards, the simulation protocol can be executed again. In this case the `pyiron_base` workflow manager recognizes the already completed calculation and only re-evaluates the removed broken calculation. \n\n## Data Storage / Data Sharing\nIn the `pyiron_base` workflow manager the input of the calculation as well as the output are stored in the hierachical data format (HDF). In addition, `pyiron_base` can use a Structured Query Language (SQL) database, which acts as an index of all the `Job` objects and their HDF5 files. This file-based approach allows the user easily to browse through the results and at the same time the compressed storage in HDF5 and the internal hierarchy of the data format, enable the efficient storage of large tensors, like atomistic trajectories. \n\n## Publication of the workflow\nThe `pyiron_base` workflow manager provides a publication template to publish simulation workflows on Github. This template enables both the publication of the workflow as well as the publication of the results generated with a given workflow. For reproduciblity this publication template is based on sharing a conda environment file `environment.yml` in combination with the Jupyter notebook containing the simulation protocol and the archived `Job` objects. The Jupyter notebook is then rendered as static website with links to enable interactive execution using Jupyterbook and the mybinder service. As the `pyiron_base` workflow manager reloads existing calculation from the archive, a user of the interactive mybinder environment does not have to recompute the computationally expensive steps and still has the opportunity to interact with the provided workflow and data. ","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]} \ No newline at end of file