From 21e7b7a65d40191cfbcc96d7ca96a61c88792c4b Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Sun, 14 Jun 2026 21:02:46 -0700 Subject: [PATCH 1/3] update: fix cluster --- examples/workflow/qe_scf_calculation.ipynb | 701 ++++++++++----------- 1 file changed, 350 insertions(+), 351 deletions(-) diff --git a/examples/workflow/qe_scf_calculation.ipynb b/examples/workflow/qe_scf_calculation.ipynb index c5fbe6ec6..e9249c252 100644 --- a/examples/workflow/qe_scf_calculation.ipynb +++ b/examples/workflow/qe_scf_calculation.ipynb @@ -1,354 +1,353 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "92673fc2-8999-415b-a866-7692a3e7d682", - "metadata": {}, - "source": [ - "# Quantum Espresso SCF calculation via API\n" - ] - }, - { - "cell_type": "markdown", - "id": "18ab15f36f745138", - "metadata": {}, - "source": [ - "## Authenticate and initialize API client\n", - "\n", - "### Authenticate\n", - "Authenticate in the browser (OIDC device flow) or via JupyterLite host injection. Credentials are stored in environment variables.\n", - "\n", - "### Initialize API client\n", - "Create an authenticated API client and resolve the owner account ID." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "217a4b2343d42164", - "metadata": {}, - "outputs": [], - "source": [ - "from mat3ra.notebooks_utils.packages import install_packages\n", - "\n", - "await install_packages(\"api_examples\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e443d7a7285cb297", - "metadata": {}, - "outputs": [], - "source": [ - "from mat3ra.notebooks_utils.auth import authenticate\n", - "\n", - "await authenticate()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5d6dedce801ba651", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "from mat3ra.api_client import APIClient\n", - "\n", - "client = APIClient.authenticate()\n", - "selected_account = client.my_account\n", - "OWNER_ID = os.getenv(\"ORGANIZATION_ID\") or selected_account.id" - ] - }, - { - "cell_type": "markdown", - "id": "5dca0feaf2c1b284", - "metadata": {}, - "source": [ - "#### Compute\n", - "\n", - "Setup compute parameters. See [this](https://docs.mat3ra.com/infrastructure/compute/parameters/) for more information about compute parameters.\n", - "\n", - "- **CLUSTER_NAME**: The full qualified domain name (FQDN) or alias of the cluster to submit the jobs into.\n", - "- **PPN**: Number of MPI processes per each node, Defaults to 1.\n", - "- **NODES**: Number of nodes. Defaults to 1.\n", - "- **QUEUE_NAME**: The name of queue to submit the jobs into. Defaults to \"D\".\n", - "- **TIME_LIMIT**: Job walltime. Defaults to \"01:00:00\" (one hour).\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6b645d1149740c3f", - "metadata": { - "id": "wiudje4-2Qxc" - }, - "outputs": [], - "source": [ - "import json\n", - "\n", - "# using the first available cluster and queue in the list\n", - "cluster_config = next(iter(json.loads(os.getenv(\"CLUSTERS\"))), {})\n", - "queue_configs = cluster_config.get(\"queues\", [])\n", - "\n", - "CLUSTER_NAME = cluster_config.get(\"displayName\", \"cluster-001\")\n", - "PPN = 1\n", - "NODES = 1\n", - "QUEUE_NAME = next(iter(queue_configs), {}).get(\"NAME\", \"D\")\n", - "TIME_LIMIT = \"01:00:00\"" - ] - }, - { - "cell_type": "markdown", - "id": "d15bb26d", - "metadata": {}, - "source": [ - "#### Create a Quantum Espresso workflow for SCF calculation\n", - "\n", - "Below we provide our Quantum Espresso input file via a bash script.\n", - "\n", - "Note that we provide the pseudo potential file via a downloadable url. We are working on supporting direct uploading of pseudo potential file from local file system, but it is currently not available. Below are some of the sources to find pseudo potentials:\n", - "\n", - "- [Pseudopotentials library at Quantum Espresso](https://www.quantum-espresso.org/pseudopotentials/)\n", - "- [Standard solid-state pseudopotentials (SSSP) library](https://www.materialscloud.org/discover/sssp/table/efficiency)\n", - "- [Pseudo dojo library](http://www.pseudo-dojo.org)\n", - "- [GBRV pseudo potential library](https://www.physics.rutgers.edu/gbrv/)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d757b708a4dad8db", - "metadata": {}, - "outputs": [], - "source": [ - "# user modifiable part\n", - "script = r\"\"\"#!/bin/bash\n", - "\n", - "# switch to the job working directory\n", - "cd $PBS_O_WORKDIR\n", - "\n", - "# ----------------------- QUANTUM ESPRESSO INPUT FILE ------------------------ #\n", - "cat > pw.in << EOF\n", - "&CONTROL\n", - " calculation = 'scf',\n", - " prefix = 'silicon',\n", - " outdir = './tmp/'\n", - " pseudo_dir = './'\n", - "/\n", - "\n", - "&SYSTEM\n", - " ibrav = 2,\n", - " celldm(1) = 10.26,\n", - " nat = 2,\n", - " ntyp = 1,\n", - " ecutwfc = 30\n", - " nbnd = 8\n", - "/\n", - "\n", - "&ELECTRONS\n", - " conv_thr = 1e-8,\n", - " mixing_beta = 0.6\n", - "/\n", - "\n", - "ATOMIC_SPECIES\n", - " Si 28.086 Si.pz-vbc.UPF\n", - "\n", - "ATOMIC_POSITIONS (alat)\n", - " Si 0.0 0.0 0.0\n", - " Si 0.25 0.25 0.25\n", - "\n", - "K_POINTS (automatic)\n", - " 3 3 3 0 0 0\n", - "EOF\n", - "# -------------------------- PSEUDO POTENTIAL FILE --------------------------- #\n", - "# provide a downloadable link for the pseudo potential file\n", - "curl https://media.githubusercontent.com/media/exabyte-io/api-examples/dev/examples/assets/Si.pz-vbc.UPF >> Si.pz-vbc.UPF\n", - "# --------------------------------- RUN JOB ---------------------------------- #\n", - "# load default espresso module\n", - "module add espresso\n", - "\n", - "# go to the job working directory\n", - "cd $PBS_O_WORKDIR\n", - "\n", - "# EXEC_CMD is set via `module add` above\n", - "# EXEC_CMD=\"apptainer exec --bind /export,/scratch,/dropbox,/cluster-001-share /export/compute/software/applications/espresso/6.3-gcc-openmpi-openblas/image.sif\"\n", - "\n", - "# run the calculation\n", - "mpirun -np $PBS_NP $EXEC_CMD pw.x -in pw.in > pw.out\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba6e839f7b2b89a", - "metadata": {}, - "outputs": [], - "source": [ - "# populate workflow from a template\n", - "from mat3ra.standata.workflows import WorkflowStandata\n", - "\n", - "SHELL_WORKFLOW_FILENAME = r\"shell/hello_world\\.json\"\n", - "\n", - "WORKFLOW_BODY = WorkflowStandata.get_by_name_first_match(SHELL_WORKFLOW_FILENAME)\n", - "WORKFLOW_BODY[\"subworkflows\"][0][\"units\"][0][\"input\"][0][\"template\"][\"content\"] = script\n", - "WORKFLOW_BODY[\"subworkflows\"][0][\"units\"][0][\"input\"][0][\"rendered\"] = script" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "efd8f489cb62b540", - "metadata": {}, - "outputs": [], - "source": [ - "# create workflow\n", - "OWNER_ID = os.getenv(\"ORGANIZATION_ID\") or selected_account.id\n", - "WORKFLOW_RESP = client.workflows.create(WORKFLOW_BODY, owner_id=OWNER_ID)" - ] - }, - { - "cell_type": "markdown", - "id": "bf82d280-4a16-4051-b87b-a57e38d71623", - "metadata": {}, - "source": [ - "### Create and submit job\n", - "\n", - "Below user can specify the project name and compute parameters such as `queue`, number of `nodes` and number of processors `ppn` per node. Find more about compute parameters [here](https://docs.mat3ra.com/infrastructure/compute/parameters/)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d46c9b6af183c0ae", - "metadata": {}, - "outputs": [], - "source": [ - "compute = client.jobs.build_compute_config(CLUSTER_NAME, PPN, NODES, QUEUE_NAME, TIME_LIMIT)\n", - "# job creation payload\n", - "JOB_BODY = {\n", - " \"owner\": {\"_id\": OWNER_ID},\n", - " \"name\": \"SCF Calculation\",\n", - " \"compute\": compute,\n", - " \"workflow\": {\"_id\": WORKFLOW_RESP[\"_id\"]},\n", - " \"_material\": \"null\",\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "db8210080031a5eb", - "metadata": {}, - "outputs": [], - "source": [ - "# create job\n", - "JOB_RESP = client.jobs.create(JOB_BODY)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a7497cebb7dda473", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO: NOT SUPPORTED YET, upload pseudo potential file\n", - "# with open('../assets/Si.pz-vbc.UPF', 'r') as f:\n", - "# PP_FILE = f.read()\n", - "# data = json.dumps({\"files\": PP_FILE})\n", - "# FILE_RESP=client.jobs.insert_output_files(JOB_RESP[\"_id\"], data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aa65092c-a30a-402e-85c2-506746e4664c", - "metadata": {}, - "outputs": [], - "source": [ - "# submit job to run\n", - "client.jobs.submit(JOB_RESP[\"_id\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5129a629-a46a-4a4c-8de9-98228611aa87", - "metadata": {}, - "outputs": [], - "source": [ - "# monitor job and wait for it to be finished\n", - "from mat3ra.notebooks_utils.api.job import wait_for_jobs_to_finish_async\n", - "\n", - "await wait_for_jobs_to_finish_async(client.jobs, [JOB_RESP[\"_id\"]])" - ] - }, - { - "cell_type": "markdown", - "id": "a0a57e12", - "metadata": {}, - "source": [ - "#### Get output file, perform post processing, and make plots" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "87b8fa4b-39cb-4a11-b8da-b07303b9d42c", - "metadata": {}, - "outputs": [], - "source": [ - "from mat3ra.notebooks_utils.io import read_from_url\n", - "\n", - "files = client.jobs.list_files(JOB_RESP[\"_id\"])\n", - "for file in files:\n", - " if \"pw.out\" in file[\"key\"]:\n", - " output_file_metadata = file\n", - "\n", - "# TODO: unresolved import from mat3ra.notebooks_utils.pyodide.io: read_from_url\n", - "\n", - "output_file = await read_from_url(output_file_metadata[\"signedUrl\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c160fc04-48c2-40da-b21a-db6706b93dd7", - "metadata": {}, - "outputs": [], - "source": [ - "energy = []\n", - "len_energy = len(\"total energy\")\n", - "for line in output_file.split(\"\\n\"):\n", - " if line.strip().lstrip(\"!\")[:len_energy] == \"total energy\":\n", - " energy.append(float(line.split(\"=\")[1].rstrip(\"Ry\")))\n", - "print(\"Total energy (Ry):\", energy[-1])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.6" - } + "cells": [ + { + "cell_type": "markdown", + "id": "92673fc2-8999-415b-a866-7692a3e7d682", + "metadata": {}, + "source": [ + "# Quantum Espresso SCF calculation via API\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 + { + "cell_type": "markdown", + "id": "18ab15f36f745138", + "metadata": {}, + "source": [ + "## Authenticate and initialize API client\n", + "\n", + "### Authenticate\n", + "Authenticate in the browser (OIDC device flow) or via JupyterLite host injection. Credentials are stored in environment variables.\n", + "\n", + "### Initialize API client\n", + "Create an authenticated API client and resolve the owner account ID." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "217a4b2343d42164", + "metadata": {}, + "outputs": [], + "source": [ + "from mat3ra.notebooks_utils.packages import install_packages\n", + "\n", + "await install_packages(\"api_examples\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e443d7a7285cb297", + "metadata": {}, + "outputs": [], + "source": [ + "from mat3ra.notebooks_utils.auth import authenticate\n", + "\n", + "await authenticate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d6dedce801ba651", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "from mat3ra.api_client import APIClient\n", + "\n", + "client = APIClient.authenticate()\n", + "selected_account = client.my_account\n", + "OWNER_ID = os.getenv(\"ORGANIZATION_ID\") or selected_account.id" + ] + }, + { + "cell_type": "markdown", + "id": "5dca0feaf2c1b284", + "metadata": {}, + "source": [ + "#### Compute\n", + "\n", + "Setup compute parameters. See [this](https://docs.mat3ra.com/infrastructure/compute/parameters/) for more information about compute parameters.\n", + "\n", + "- **CLUSTER_NAME**: The full qualified domain name (FQDN) or alias of the cluster to submit the jobs into.\n", + "- **PPN**: Number of MPI processes per each node, Defaults to 1.\n", + "- **NODES**: Number of nodes. Defaults to 1.\n", + "- **QUEUE_NAME**: The name of queue to submit the jobs into. Defaults to \"D\".\n", + "- **TIME_LIMIT**: Job walltime. Defaults to \"01:00:00\" (one hour).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b645d1149740c3f", + "metadata": { + "id": "wiudje4-2Qxc" + }, + "outputs": [], + "source": [ + "import json\n", + "\n", + "# using the first available cluster and queue in the list\n", + "cluster_config = next(iter(json.loads(os.getenv(\"CLUSTERS\"))), {})\n", + "queue_configs = cluster_config.get(\"queues\", [])\n", + "\n", + "CLUSTER_NAME = cluster_config.get(\"hostName\", \"cluster-001\")\n", + "PPN = 1\n", + "NODES = 1\n", + "QUEUE_NAME = next(iter(queue_configs), {}).get(\"NAME\", \"D\")\n", + "TIME_LIMIT = \"01:00:00\"" + ] + }, + { + "cell_type": "markdown", + "id": "d15bb26d", + "metadata": {}, + "source": [ + "#### Create a Quantum Espresso workflow for SCF calculation\n", + "\n", + "Below we provide our Quantum Espresso input file via a bash script.\n", + "\n", + "Note that we provide the pseudo potential file via a downloadable url. We are working on supporting direct uploading of pseudo potential file from local file system, but it is currently not available. Below are some of the sources to find pseudo potentials:\n", + "\n", + "- [Pseudopotentials library at Quantum Espresso](https://www.quantum-espresso.org/pseudopotentials/)\n", + "- [Standard solid-state pseudopotentials (SSSP) library](https://www.materialscloud.org/discover/sssp/table/efficiency)\n", + "- [Pseudo dojo library](http://www.pseudo-dojo.org)\n", + "- [GBRV pseudo potential library](https://www.physics.rutgers.edu/gbrv/)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d757b708a4dad8db", + "metadata": {}, + "outputs": [], + "source": [ + "# user modifiable part\n", + "script = r\"\"\"#!/bin/bash\n", + "\n", + "# switch to the job working directory\n", + "cd $PBS_O_WORKDIR\n", + "\n", + "# ----------------------- QUANTUM ESPRESSO INPUT FILE ------------------------ #\n", + "cat > pw.in << EOF\n", + "&CONTROL\n", + " calculation = 'scf',\n", + " prefix = 'silicon',\n", + " outdir = './tmp/'\n", + " pseudo_dir = './'\n", + "/\n", + "\n", + "&SYSTEM\n", + " ibrav = 2,\n", + " celldm(1) = 10.26,\n", + " nat = 2,\n", + " ntyp = 1,\n", + " ecutwfc = 30\n", + " nbnd = 8\n", + "/\n", + "\n", + "&ELECTRONS\n", + " conv_thr = 1e-8,\n", + " mixing_beta = 0.6\n", + "/\n", + "\n", + "ATOMIC_SPECIES\n", + " Si 28.086 Si.pz-vbc.UPF\n", + "\n", + "ATOMIC_POSITIONS (alat)\n", + " Si 0.0 0.0 0.0\n", + " Si 0.25 0.25 0.25\n", + "\n", + "K_POINTS (automatic)\n", + " 3 3 3 0 0 0\n", + "EOF\n", + "# -------------------------- PSEUDO POTENTIAL FILE --------------------------- #\n", + "# provide a downloadable link for the pseudo potential file\n", + "curl https://media.githubusercontent.com/media/exabyte-io/api-examples/dev/examples/assets/Si.pz-vbc.UPF >> Si.pz-vbc.UPF\n", + "# --------------------------------- RUN JOB ---------------------------------- #\n", + "# load default espresso module\n", + "module add espresso\n", + "\n", + "# go to the job working directory\n", + "cd $PBS_O_WORKDIR\n", + "\n", + "# EXEC_CMD is set via `module add` above\n", + "# EXEC_CMD=\"apptainer exec --bind /export,/scratch,/dropbox,/cluster-001-share /export/compute/software/applications/espresso/6.3-gcc-openmpi-openblas/image.sif\"\n", + "\n", + "# run the calculation\n", + "mpirun -np $PBS_NP $EXEC_CMD pw.x -in pw.in > pw.out\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba6e839f7b2b89a", + "metadata": {}, + "outputs": [], + "source": [ + "# populate workflow from a template\n", + "from mat3ra.standata.workflows import WorkflowStandata\n", + "\n", + "SHELL_WORKFLOW_FILENAME = r\"shell/hello_world\\.json\"\n", + "\n", + "WORKFLOW_BODY = WorkflowStandata.get_by_name_first_match(SHELL_WORKFLOW_FILENAME)\n", + "WORKFLOW_BODY[\"subworkflows\"][0][\"units\"][0][\"input\"][0][\"template\"][\"content\"] = script" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efd8f489cb62b540", + "metadata": {}, + "outputs": [], + "source": [ + "# create workflow\n", + "OWNER_ID = os.getenv(\"ORGANIZATION_ID\") or selected_account.id\n", + "WORKFLOW_RESP = client.workflows.create(WORKFLOW_BODY, owner_id=OWNER_ID)" + ] + }, + { + "cell_type": "markdown", + "id": "bf82d280-4a16-4051-b87b-a57e38d71623", + "metadata": {}, + "source": [ + "### Create and submit job\n", + "\n", + "Below user can specify the project name and compute parameters such as `queue`, number of `nodes` and number of processors `ppn` per node. Find more about compute parameters [here](https://docs.mat3ra.com/infrastructure/compute/parameters/)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d46c9b6af183c0ae", + "metadata": {}, + "outputs": [], + "source": [ + "compute = client.jobs.build_compute_config(CLUSTER_NAME, PPN, NODES, QUEUE_NAME, TIME_LIMIT)\n", + "# job creation payload\n", + "JOB_BODY = {\n", + " \"owner\": {\"_id\": OWNER_ID},\n", + " \"name\": \"SCF Calculation\",\n", + " \"compute\": compute,\n", + " \"workflow\": {\"_id\": WORKFLOW_RESP[\"_id\"]},\n", + " \"_material\": \"null\",\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db8210080031a5eb", + "metadata": {}, + "outputs": [], + "source": [ + "# create job\n", + "JOB_RESP = client.jobs.create(JOB_BODY)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7497cebb7dda473", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: NOT SUPPORTED YET, upload pseudo potential file\n", + "# with open('../assets/Si.pz-vbc.UPF', 'r') as f:\n", + "# PP_FILE = f.read()\n", + "# data = json.dumps({\"files\": PP_FILE})\n", + "# FILE_RESP=client.jobs.insert_output_files(JOB_RESP[\"_id\"], data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa65092c-a30a-402e-85c2-506746e4664c", + "metadata": {}, + "outputs": [], + "source": [ + "# submit job to run\n", + "client.jobs.submit(JOB_RESP[\"_id\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5129a629-a46a-4a4c-8de9-98228611aa87", + "metadata": {}, + "outputs": [], + "source": [ + "# monitor job and wait for it to be finished\n", + "from mat3ra.notebooks_utils.api.job import wait_for_jobs_to_finish_async\n", + "\n", + "await wait_for_jobs_to_finish_async(client.jobs, [JOB_RESP[\"_id\"]])" + ] + }, + { + "cell_type": "markdown", + "id": "a0a57e12", + "metadata": {}, + "source": [ + "#### Get output file, perform post processing, and make plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87b8fa4b-39cb-4a11-b8da-b07303b9d42c", + "metadata": {}, + "outputs": [], + "source": [ + "from mat3ra.notebooks_utils.io import read_from_url\n", + "\n", + "files = client.jobs.list_files(JOB_RESP[\"_id\"])\n", + "for file in files:\n", + " if \"pw.out\" in file[\"key\"]:\n", + " output_file_metadata = file\n", + "\n", + "# TODO: unresolved import from mat3ra.notebooks_utils.pyodide.io: read_from_url\n", + "\n", + "output_file = await read_from_url(output_file_metadata[\"signedUrl\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c160fc04-48c2-40da-b21a-db6706b93dd7", + "metadata": {}, + "outputs": [], + "source": [ + "energy = []\n", + "len_energy = len(\"total energy\")\n", + "for line in output_file.split(\"\\n\"):\n", + " if line.strip().lstrip(\"!\")[:len_energy] == \"total energy\":\n", + " energy.append(float(line.split(\"=\")[1].rstrip(\"Ry\")))\n", + "print(\"Total energy (Ry):\", energy[-1])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } From 7148ba7f195e55b645231d678e36bcb6ed443979 Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Sun, 14 Jun 2026 21:03:45 -0700 Subject: [PATCH 2/3] update: content --- examples/workflow/qe_scf_calculation.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/workflow/qe_scf_calculation.ipynb b/examples/workflow/qe_scf_calculation.ipynb index e9249c252..309451d8d 100644 --- a/examples/workflow/qe_scf_calculation.ipynb +++ b/examples/workflow/qe_scf_calculation.ipynb @@ -194,7 +194,7 @@ "SHELL_WORKFLOW_FILENAME = r\"shell/hello_world\\.json\"\n", "\n", "WORKFLOW_BODY = WorkflowStandata.get_by_name_first_match(SHELL_WORKFLOW_FILENAME)\n", - "WORKFLOW_BODY[\"subworkflows\"][0][\"units\"][0][\"input\"][0][\"template\"][\"content\"] = script" + "WORKFLOW_BODY[\"subworkflows\"][0][\"units\"][0][\"input\"][0][\"content\"] = script" ] }, { From caf2e669011c69e54bce902d32a33842ff1bd45c Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Sun, 14 Jun 2026 21:09:21 -0700 Subject: [PATCH 3/3] chore: config --- config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.yml b/config.yml index 1a9fa1bdd..1ec13a630 100644 --- a/config.yml +++ b/config.yml @@ -51,7 +51,7 @@ notebooks: - emfs:/drive/packages/watchdog-2.3.1-py3-none-any.whl - name: specific_examples packages_pyodide: - - mat3ra-standata + - mat3ra-standata==2026.5.15.post0 # - mat3ra-notebooks-utils[utils_standata] - name: api packages_pyodide: @@ -73,7 +73,7 @@ notebooks: - jinja2 - emfs:/drive/packages/pydantic_core-2.18.2-py3-none-any.whl - emfs:/drive/packages/pydantic-2.7.1-py3-none-any.whl - - mat3ra-standata + - mat3ra-standata==2026.5.15.post0 - mat3ra-ide - mat3ra-api-client - requests