diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml new file mode 100644 index 0000000..af911fd --- /dev/null +++ b/.github/workflows/pipeline.yml @@ -0,0 +1,84 @@ +name: Pipeline + +on: + push: + branches: [ main ] + pull_request: + +jobs: + nfdi4ing: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v6 + - name: Conda config + run: echo -e "channels:\n - conda-forge\n" > .condarc + - uses: conda-incubator/setup-miniconda@v4 + with: + python-version: "3.12" + miniforge-version: latest + condarc-file: .condarc + environment-file: environment.yml + - name: Installation and setup + shell: bash -l {0} + run: | + conda install -c conda-forge jupyter papermill + sudo apt-get install -y $(cat apt.txt) + - name: Create Additional Conda Environments + shell: bash -l {0} + run: | + conda env create -n preprocessing -f nfdi/source/envs/preprocessing.yaml -y + conda env create -n processing -f nfdi/source/envs/processing.yaml -y + conda env create -n postprocessing -f nfdi/source/envs/postprocessing.yaml -y + - name: Tests + shell: bash -l {0} + run: | + cd nfdi/ + papermill pyironflow.ipynb pyironflow_out.ipynb -k "python3" + + quantumespresso: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Setup environment + shell: bash -l {0} + run: echo -e "channels:\n - conda-forge\n" > .condarc + - uses: conda-incubator/setup-miniconda@v4 + with: + python-version: "3.12" + miniforge-version: latest + condarc-file: .condarc + environment-file: environment.yml + - name: Installation and setup + shell: bash -l {0} + run: | + pip install --no-deps --no-build-isolation -e quantum_espresso/qe_xml_parser + conda install -c conda-forge jupyter papermill + - name: Tests + shell: bash -l {0} + run: | + export ESPRESSO_PSEUDO=$(pwd)/espresso/pseudo + cp -r quantum_espresso/espresso . + cd quantum_espresso + papermill pyironflow.ipynb pyironflow_out.ipynb -k "python3" + + arithmetic: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Conda config + run: echo -e "channels:\n - conda-forge\n" > .condarc + - uses: conda-incubator/setup-miniconda@v4 + with: + python-version: "3.12" + miniforge-version: latest + condarc-file: .condarc + environment-file: environment.yml + - name: Installation and setup + shell: bash -l {0} + run: | + conda install -c conda-forge jupyter papermill + - name: Tests + shell: bash -l {0} + run: | + cd arithmetic + papermill pyironflow.ipynb pyironflow_out.ipynb -k "python3" diff --git a/apt.txt b/apt.txt new file mode 100644 index 0000000..c91b950 --- /dev/null +++ b/apt.txt @@ -0,0 +1,2 @@ +libgl1-mesa-glx +libegl1-mesa \ No newline at end of file diff --git a/arithmetic/workflow.json b/arithmetic/workflow.json index 24b1d52..7aa94a8 100644 --- a/arithmetic/workflow.json +++ b/arithmetic/workflow.json @@ -1,75 +1,19 @@ { "version": "0.1.0", "nodes": [ - { - "id": 0, - "type": "function", - "value": "workflow.get_prod_and_div" - }, - { - "id": 1, - "type": "function", - "value": "workflow.get_sum" - }, - { - "id": 2, - "type": "function", - "value": "workflow.get_square" - }, - { - "id": 3, - "type": "input", - "name": "x", - "value": 1 - }, - { - "id": 4, - "type": "input", - "name": "y", - "value": 2 - }, - { - "id": 5, - "type": "output", - "name": "result" - } + {"id": 0, "type": "function", "value": "workflow.get_prod_and_div"}, + {"id": 1, "type": "function", "value": "workflow.get_sum"}, + {"id": 2, "type": "function", "value": "workflow.get_square"}, + {"id": 3, "type": "input", "value": 1, "name": "x"}, + {"id": 4, "type": "input", "value": 2, "name": "y"}, + {"id": 5, "type": "output", "name": "result"} ], "edges": [ - { - "target": 1, - "targetPort": "y", - "source": 0, - "sourcePort": "div" - }, - { - "target": 1, - "targetPort": "x", - "source": 0, - "sourcePort": "prod" - }, - { - "target": 2, - "targetPort": "x", - "source": 1, - "sourcePort": null - }, - { - "target": 0, - "targetPort": "x", - "source": 3, - "sourcePort": null - }, - { - "target": 0, - "targetPort": "y", - "source": 4, - "sourcePort": null - }, - { - "target": 5, - "targetPort": null, - "source": 2, - "sourcePort": null - } + {"target": 0, "targetPort": "x", "source": 3, "sourcePort": null}, + {"target": 0, "targetPort": "y", "source": 4, "sourcePort": null}, + {"target": 1, "targetPort": "x", "source": 0, "sourcePort": "prod"}, + {"target": 1, "targetPort": "y", "source": 0, "sourcePort": "div"}, + {"target": 2, "targetPort": "x", "source": 1, "sourcePort": null}, + {"target": 5, "targetPort": null, "source": 2, "sourcePort": null} ] } \ No newline at end of file diff --git a/environment.yml b/environment.yml index f7b95fb..47967b5 100644 --- a/environment.yml +++ b/environment.yml @@ -2,6 +2,7 @@ channels: - conda-forge dependencies: - python =3.12 +- hatchling =1.32.4 - pyiron_workflow =0.17.0 - pyironflow =0.0.24 - python-workflow-definition =0.1.5 diff --git a/nfdi/workflow.json b/nfdi/workflow.json index 8803901..b9135dc 100644 --- a/nfdi/workflow.json +++ b/nfdi/workflow.json @@ -1,156 +1,33 @@ { "version": "0.1.0", "nodes": [ - { - "id": 0, - "type": "function", - "value": "workflow.generate_mesh" - }, - { - "id": 1, - "type": "function", - "value": "workflow.convert_to_xdmf" - }, - { - "id": 2, - "type": "function", - "value": "workflow.poisson" - }, - { - "id": 3, - "type": "function", - "value": "workflow.plot_over_line" - }, - { - "id": 4, - "type": "function", - "value": "workflow.substitute_macros" - }, - { - "id": 5, - "type": "function", - "value": "workflow.compile_paper" - }, - { - "id": 6, - "type": "input", - "name": "domain_size", - "value": 2.0 - }, - { - "id": 7, - "type": "input", - "name": "source_directory", - "value": "/home/jan/Desktop/visual-programming-with-pyironflow/nfdi/source" - }, - { - "id": 8, - "type": "output", - "name": "result" - } + {"id": 0, "type": "function", "value": "workflow.generate_mesh"}, + {"id": 1, "type": "function", "value": "workflow.convert_to_xdmf"}, + {"id": 2, "type": "function", "value": "workflow.poisson"}, + {"id": 3, "type": "function", "value": "workflow.plot_over_line"}, + {"id": 4, "type": "function", "value": "workflow.substitute_macros"}, + {"id": 5, "type": "function", "value": "workflow.compile_paper"}, + {"id": 6, "type": "input", "value": 2.0, "name": "domain_size"}, + {"id": 7, "type": "input", "value": "source", "name": "source_directory"}, + {"id": 8, "type": "output", "name": "result"} ], "edges": [ - { - "target": 2, - "targetPort": "meshio_output_h5", - "source": 1, - "sourcePort": "h5_file" - }, - { - "target": 2, - "targetPort": "meshio_output_xdmf", - "source": 1, - "sourcePort": "xdmf_file" - }, - { - "target": 4, - "targetPort": "ndofs", - "source": 2, - "sourcePort": "numdofs" - }, - { - "target": 3, - "targetPort": "poisson_output_vtu_file", - "source": 2, - "sourcePort": "vtu_file" - }, - { - "target": 3, - "targetPort": "poisson_output_pvd_file", - "source": 2, - "sourcePort": "pvd_file" - }, - { - "target": 1, - "targetPort": "gmsh_output_file", - "source": 0, - "sourcePort": null - }, - { - "target": 5, - "targetPort": "plot_file", - "source": 3, - "sourcePort": null - }, - { - "target": 4, - "targetPort": "pvbatch_output_file", - "source": 3, - "sourcePort": null - }, - { - "target": 5, - "targetPort": "macros_tex", - "source": 4, - "sourcePort": null - }, - { - "target": 0, - "targetPort": "domain_size", - "source": 6, - "sourcePort": null - }, - { - "target": 0, - "targetPort": "source_directory", - "source": 7, - "sourcePort": null - }, - { - "target": 2, - "targetPort": "source_directory", - "source": 7, - "sourcePort": null - }, - { - "target": 3, - "targetPort": "source_directory", - "source": 7, - "sourcePort": null - }, - { - "target": 4, - "targetPort": "domain_size", - "source": 6, - "sourcePort": null - }, - { - "target": 4, - "targetPort": "source_directory", - "source": 7, - "sourcePort": null - }, - { - "target": 5, - "targetPort": "source_directory", - "source": 7, - "sourcePort": null - }, - { - "target": 8, - "targetPort": null, - "source": 5, - "sourcePort": null - } + {"target": 0, "targetPort": "domain_size", "source": 6, "sourcePort": null}, + {"target": 0, "targetPort": "source_directory", "source": 7, "sourcePort": null}, + {"target": 1, "targetPort": "gmsh_output_file", "source": 0, "sourcePort": null}, + {"target": 2, "targetPort": "meshio_output_xdmf", "source": 1, "sourcePort": "xdmf_file"}, + {"target": 2, "targetPort": "meshio_output_h5", "source": 1, "sourcePort": "h5_file"}, + {"target": 2, "targetPort": "source_directory", "source": 7, "sourcePort": null}, + {"target": 3, "targetPort": "poisson_output_pvd_file", "source": 2, "sourcePort": "pvd_file"}, + {"target": 3, "targetPort": "poisson_output_vtu_file", "source": 2, "sourcePort": "vtu_file"}, + {"target": 3, "targetPort": "source_directory", "source": 7, "sourcePort": null}, + {"target": 4, "targetPort": "pvbatch_output_file", "source": 3, "sourcePort": null}, + {"target": 4, "targetPort": "ndofs", "source": 2, "sourcePort": "numdofs"}, + {"target": 4, "targetPort": "domain_size", "source": 6, "sourcePort": null}, + {"target": 4, "targetPort": "source_directory", "source": 7, "sourcePort": null}, + {"target": 5, "targetPort": "macros_tex", "source": 4, "sourcePort": null}, + {"target": 5, "targetPort": "plot_file", "source": 3, "sourcePort": null}, + {"target": 5, "targetPort": "source_directory", "source": 7, "sourcePort": null}, + {"target": 8, "targetPort": null, "source": 5, "sourcePort": null} ] } \ No newline at end of file diff --git a/postBuild b/postBuild new file mode 100644 index 0000000..6680e1f --- /dev/null +++ b/postBuild @@ -0,0 +1,5 @@ +conda env create -n preprocessing -f nfdi/source/envs/preprocessing.yaml -y +conda env create -n processing -f nfdi/source/envs/processing.yaml -y +conda env create -n postprocessing -f nfdi/source/envs/postprocessing.yaml -y +pip install -e quantum_espresso/qe_xml_parser +mv quantum_espresso/espresso ~ \ No newline at end of file diff --git a/quantum_espresso/workflow.json b/quantum_espresso/workflow.json index 078d9e7..e653d59 100644 --- a/quantum_espresso/workflow.json +++ b/quantum_espresso/workflow.json @@ -1,559 +1,100 @@ { "version": "0.1.0", "nodes": [ - { - "id": 0, - "type": "function", - "value": "workflow.get_bulk_structure" - }, - { - "id": 1, - "type": "function", - "value": "python_workflow_definition.shared.get_dict" - }, - { - "id": 2, - "type": "function", - "value": "workflow.calculate_qe" - }, - { - "id": 3, - "type": "function", - "value": "workflow.generate_structures" - }, - { - "id": 4, - "type": "function", - "value": "python_workflow_definition.shared.get_dict" - }, - { - "id": 5, - "type": "function", - "value": "workflow.calculate_qe" - }, - { - "id": 6, - "type": "function", - "value": "python_workflow_definition.shared.get_dict" - }, - { - "id": 7, - "type": "function", - "value": "workflow.calculate_qe" - }, - { - "id": 8, - "type": "function", - "value": "python_workflow_definition.shared.get_dict" - }, - { - "id": 9, - "type": "function", - "value": "workflow.calculate_qe" - }, - { - "id": 10, - "type": "function", - "value": "python_workflow_definition.shared.get_dict" - }, - { - "id": 11, - "type": "function", - "value": "workflow.calculate_qe" - }, - { - "id": 12, - "type": "function", - "value": "python_workflow_definition.shared.get_dict" - }, - { - "id": 13, - "type": "function", - "value": "workflow.calculate_qe" - }, - { - "id": 14, - "type": "function", - "value": "python_workflow_definition.shared.get_list" - }, - { - "id": 15, - "type": "function", - "value": "python_workflow_definition.shared.get_list" - }, - { - "id": 16, - "type": "function", - "value": "workflow.plot_energy_volume_curve" - }, - { - "id": 17, - "type": "input", - "name": "element", - "value": "Al" - }, - { - "id": 18, - "type": "input", - "name": "a", - "value": 4.04 - }, - { - "id": 19, - "type": "input", - "name": "cubic", - "value": true - }, - { - "id": 20, - "type": "input", - "name": "pseudopotentials", - "value": { - "Al": "Al.pbe-n-kjpaw_psl.1.0.0.UPF" - } - }, - { - "id": 21, - "type": "input", - "name": "kpts", - "value": [ - 3, - 3, - 3 - ] - }, - { - "id": 22, - "type": "input", - "name": "calculation_0", - "value": "vc-relax" - }, - { - "id": 23, - "type": "input", - "name": "smearing", - "value": 0.02 - }, - { - "id": 24, - "type": "input", - "name": "working_directory_0", - "value": "mini" - }, - { - "id": 25, - "type": "input", - "name": "strain_lst", - "value": [ - 0.9, - 0.9500000000000001, - 1.0, - 1.05, - 1.1 - ] - }, - { - "id": 26, - "type": "input", - "name": "calculation_1", - "value": "scf" - }, - { - "id": 27, - "type": "input", - "name": "working_directory_1", - "value": "strain_0" - }, - { - "id": 28, - "type": "input", - "name": "working_directory_2", - "value": "strain_1" - }, - { - "id": 29, - "type": "input", - "name": "working_directory_3", - "value": "strain_2" - }, - { - "id": 30, - "type": "input", - "name": "working_directory_4", - "value": "strain_3" - }, - { - "id": 31, - "type": "input", - "name": "working_directory_5", - "value": "strain_4" - }, - { - "id": 32, - "type": "output", - "name": "result" - } + {"id": 0, "type": "function", "value": "workflow.get_bulk_structure"}, + {"id": 1, "type": "function", "value": "workflow.calculate_qe"}, + {"id": 2, "type": "function", "value": "workflow.generate_structures"}, + {"id": 3, "type": "function", "value": "workflow.calculate_qe"}, + {"id": 4, "type": "function", "value": "workflow.calculate_qe"}, + {"id": 5, "type": "function", "value": "workflow.calculate_qe"}, + {"id": 6, "type": "function", "value": "workflow.calculate_qe"}, + {"id": 7, "type": "function", "value": "workflow.calculate_qe"}, + {"id": 8, "type": "function", "value": "workflow.plot_energy_volume_curve"}, + {"id": 9, "type": "input", "value": "Al", "name": "element"}, + {"id": 10, "type": "input", "value": 4.05, "name": "a"}, + {"id": 11, "type": "input", "value": true, "name": "cubic"}, + {"id": 12, "type": "input", "value": "mini", "name": "working_directory_0"}, + {"id": 13, "type": "function", "value": "python_workflow_definition.shared.get_dict"}, + {"id": 14, "type": "input", "value": {"Al": "Al.pbe-n-kjpaw_psl.1.0.0.UPF"}, "name": "pseudopotentials"}, + {"id": 15, "type": "input", "value": [3, 3, 3], "name": "kpts"}, + {"id": 16, "type": "input", "value": "vc-relax", "name": "calculation_0"}, + {"id": 17, "type": "input", "value": 0.02, "name": "smearing"}, + {"id": 18, "type": "input", "value": [0.9, 0.95, 1.0, 1.05, 1.1], "name": "strain_lst"}, + {"id": 19, "type": "input", "value": "strain_0", "name": "working_directory_1"}, + {"id": 20, "type": "function", "value": "python_workflow_definition.shared.get_dict"}, + {"id": 21, "type": "input", "value": "scf", "name": "calculation_1"}, + {"id": 22, "type": "input", "value": "strain_1", "name": "working_directory_2"}, + {"id": 23, "type": "function", "value": "python_workflow_definition.shared.get_dict"}, + {"id": 24, "type": "input", "value": "strain_2", "name": "working_directory_3"}, + {"id": 25, "type": "function", "value": "python_workflow_definition.shared.get_dict"}, + {"id": 26, "type": "input", "value": "strain_3", "name": "working_directory_4"}, + {"id": 27, "type": "function", "value": "python_workflow_definition.shared.get_dict"}, + {"id": 28, "type": "input", "value": "strain_4", "name": "working_directory_5"}, + {"id": 29, "type": "function", "value": "python_workflow_definition.shared.get_dict"}, + {"id": 30, "type": "function", "value": "python_workflow_definition.shared.get_list"}, + {"id": 31, "type": "function", "value": "python_workflow_definition.shared.get_list"}, + {"id": 32, "type": "output", "name": "result"} ], "edges": [ - { - "target": 3, - "targetPort": "structure", - "source": 2, - "sourcePort": "structure" - }, - { - "target": 12, - "targetPort": "structure", - "source": 3, - "sourcePort": "s_4" - }, - { - "target": 10, - "targetPort": "structure", - "source": 3, - "sourcePort": "s_3" - }, - { - "target": 8, - "targetPort": "structure", - "source": 3, - "sourcePort": "s_2" - }, - { - "target": 6, - "targetPort": "structure", - "source": 3, - "sourcePort": "s_1" - }, - { - "target": 4, - "targetPort": "structure", - "source": 3, - "sourcePort": "s_0" - }, - { - "target": 15, - "targetPort": "0", - "source": 5, - "sourcePort": "energy" - }, - { - "target": 14, - "targetPort": "0", - "source": 5, - "sourcePort": "volume" - }, - { - "target": 15, - "targetPort": "1", - "source": 7, - "sourcePort": "energy" - }, - { - "target": 14, - "targetPort": "1", - "source": 7, - "sourcePort": "volume" - }, - { - "target": 15, - "targetPort": "2", - "source": 9, - "sourcePort": "energy" - }, - { - "target": 14, - "targetPort": "2", - "source": 9, - "sourcePort": "volume" - }, - { - "target": 15, - "targetPort": "3", - "source": 11, - "sourcePort": "energy" - }, - { - "target": 14, - "targetPort": "3", - "source": 11, - "sourcePort": "volume" - }, - { - "target": 15, - "targetPort": "4", - "source": 13, - "sourcePort": "energy" - }, - { - "target": 14, - "targetPort": "4", - "source": 13, - "sourcePort": "volume" - }, - { - "target": 1, - "targetPort": "structure", - "source": 0, - "sourcePort": null - }, - { - "target": 2, - "targetPort": "input_dict", - "source": 1, - "sourcePort": null - }, - { - "target": 5, - "targetPort": "input_dict", - "source": 4, - "sourcePort": null - }, - { - "target": 7, - "targetPort": "input_dict", - "source": 6, - "sourcePort": null - }, - { - "target": 9, - "targetPort": "input_dict", - "source": 8, - "sourcePort": null - }, - { - "target": 11, - "targetPort": "input_dict", - "source": 10, - "sourcePort": null - }, - { - "target": 13, - "targetPort": "input_dict", - "source": 12, - "sourcePort": null - }, - { - "target": 16, - "targetPort": "volume_lst", - "source": 14, - "sourcePort": null - }, - { - "target": 16, - "targetPort": "energy_lst", - "source": 15, - "sourcePort": null - }, - { - "target": 0, - "targetPort": "element", - "source": 17, - "sourcePort": null - }, - { - "target": 0, - "targetPort": "a", - "source": 18, - "sourcePort": null - }, - { - "target": 0, - "targetPort": "cubic", - "source": 19, - "sourcePort": null - }, - { - "target": 1, - "targetPort": "pseudopotentials", - "source": 20, - "sourcePort": null - }, - { - "target": 1, - "targetPort": "kpts", - "source": 21, - "sourcePort": null - }, - { - "target": 1, - "targetPort": "calculation", - "source": 22, - "sourcePort": null - }, - { - "target": 1, - "targetPort": "smearing", - "source": 23, - "sourcePort": null - }, - { - "target": 2, - "targetPort": "working_directory", - "source": 24, - "sourcePort": null - }, - { - "target": 3, - "targetPort": "strain_lst", - "source": 25, - "sourcePort": null - }, - { - "target": 4, - "targetPort": "pseudopotentials", - "source": 20, - "sourcePort": null - }, - { - "target": 4, - "targetPort": "kpts", - "source": 21, - "sourcePort": null - }, - { - "target": 4, - "targetPort": "calculation", - "source": 26, - "sourcePort": null - }, - { - "target": 4, - "targetPort": "smearing", - "source": 23, - "sourcePort": null - }, - { - "target": 5, - "targetPort": "working_directory", - "source": 27, - "sourcePort": null - }, - { - "target": 6, - "targetPort": "pseudopotentials", - "source": 20, - "sourcePort": null - }, - { - "target": 6, - "targetPort": "kpts", - "source": 21, - "sourcePort": null - }, - { - "target": 6, - "targetPort": "calculation", - "source": 26, - "sourcePort": null - }, - { - "target": 6, - "targetPort": "smearing", - "source": 23, - "sourcePort": null - }, - { - "target": 7, - "targetPort": "working_directory", - "source": 28, - "sourcePort": null - }, - { - "target": 8, - "targetPort": "pseudopotentials", - "source": 20, - "sourcePort": null - }, - { - "target": 8, - "targetPort": "kpts", - "source": 21, - "sourcePort": null - }, - { - "target": 8, - "targetPort": "calculation", - "source": 26, - "sourcePort": null - }, - { - "target": 8, - "targetPort": "smearing", - "source": 23, - "sourcePort": null - }, - { - "target": 9, - "targetPort": "working_directory", - "source": 29, - "sourcePort": null - }, - { - "target": 10, - "targetPort": "pseudopotentials", - "source": 20, - "sourcePort": null - }, - { - "target": 10, - "targetPort": "kpts", - "source": 21, - "sourcePort": null - }, - { - "target": 10, - "targetPort": "calculation", - "source": 26, - "sourcePort": null - }, - { - "target": 10, - "targetPort": "smearing", - "source": 23, - "sourcePort": null - }, - { - "target": 11, - "targetPort": "working_directory", - "source": 30, - "sourcePort": null - }, - { - "target": 12, - "targetPort": "pseudopotentials", - "source": 20, - "sourcePort": null - }, - { - "target": 12, - "targetPort": "kpts", - "source": 21, - "sourcePort": null - }, - { - "target": 12, - "targetPort": "calculation", - "source": 26, - "sourcePort": null - }, - { - "target": 12, - "targetPort": "smearing", - "source": 23, - "sourcePort": null - }, - { - "target": 13, - "targetPort": "working_directory", - "source": 31, - "sourcePort": null - }, - { - "target": 32, - "targetPort": null, - "source": 16, - "sourcePort": null - } + {"target": 0, "targetPort": "element", "source": 9, "sourcePort": null}, + {"target": 0, "targetPort": "a", "source": 10, "sourcePort": null}, + {"target": 0, "targetPort": "cubic", "source": 11, "sourcePort": null}, + {"target": 1, "targetPort": "working_directory", "source": 12, "sourcePort": null}, + {"target": 13, "targetPort": "structure", "source": 0, "sourcePort": null}, + {"target": 13, "targetPort": "pseudopotentials", "source": 14, "sourcePort": null}, + {"target": 13, "targetPort": "kpts", "source": 15, "sourcePort": null}, + {"target": 13, "targetPort": "calculation", "source": 16, "sourcePort": null}, + {"target": 13, "targetPort": "smearing", "source": 17, "sourcePort": null}, + {"target": 1, "targetPort": "input_dict", "source": 13, "sourcePort": null}, + {"target": 2, "targetPort": "structure", "source": 1, "sourcePort": "structure"}, + {"target": 2, "targetPort": "strain_lst", "source": 18, "sourcePort": null}, + {"target": 3, "targetPort": "working_directory", "source": 19, "sourcePort": null}, + {"target": 20, "targetPort": "structure", "source": 2, "sourcePort": "s_0"}, + {"target": 20, "targetPort": "pseudopotentials", "source": 14, "sourcePort": null}, + {"target": 20, "targetPort": "kpts", "source": 15, "sourcePort": null}, + {"target": 20, "targetPort": "calculation", "source": 21, "sourcePort": null}, + {"target": 20, "targetPort": "smearing", "source": 17, "sourcePort": null}, + {"target": 3, "targetPort": "input_dict", "source": 20, "sourcePort": null}, + {"target": 4, "targetPort": "working_directory", "source": 22, "sourcePort": null}, + {"target": 23, "targetPort": "structure", "source": 2, "sourcePort": "s_1"}, + {"target": 23, "targetPort": "pseudopotentials", "source": 14, "sourcePort": null}, + {"target": 23, "targetPort": "kpts", "source": 15, "sourcePort": null}, + {"target": 23, "targetPort": "calculation", "source": 21, "sourcePort": null}, + {"target": 23, "targetPort": "smearing", "source": 17, "sourcePort": null}, + {"target": 4, "targetPort": "input_dict", "source": 23, "sourcePort": null}, + {"target": 5, "targetPort": "working_directory", "source": 24, "sourcePort": null}, + {"target": 25, "targetPort": "structure", "source": 2, "sourcePort": "s_2"}, + {"target": 25, "targetPort": "pseudopotentials", "source": 14, "sourcePort": null}, + {"target": 25, "targetPort": "kpts", "source": 15, "sourcePort": null}, + {"target": 25, "targetPort": "calculation", "source": 21, "sourcePort": null}, + {"target": 25, "targetPort": "smearing", "source": 17, "sourcePort": null}, + {"target": 5, "targetPort": "input_dict", "source": 25, "sourcePort": null}, + {"target": 6, "targetPort": "working_directory", "source": 26, "sourcePort": null}, + {"target": 27, "targetPort": "structure", "source": 2, "sourcePort": "s_3"}, + {"target": 27, "targetPort": "pseudopotentials", "source": 14, "sourcePort": null}, + {"target": 27, "targetPort": "kpts", "source": 15, "sourcePort": null}, + {"target": 27, "targetPort": "calculation", "source": 21, "sourcePort": null}, + {"target": 27, "targetPort": "smearing", "source": 17, "sourcePort": null}, + {"target": 6, "targetPort": "input_dict", "source": 27, "sourcePort": null}, + {"target": 7, "targetPort": "working_directory", "source": 28, "sourcePort": null}, + {"target": 29, "targetPort": "structure", "source": 2, "sourcePort": "s_4"}, + {"target": 29, "targetPort": "pseudopotentials", "source": 14, "sourcePort": null}, + {"target": 29, "targetPort": "kpts", "source": 15, "sourcePort": null}, + {"target": 29, "targetPort": "calculation", "source": 21, "sourcePort": null}, + {"target": 29, "targetPort": "smearing", "source": 17, "sourcePort": null}, + {"target": 7, "targetPort": "input_dict", "source": 29, "sourcePort": null}, + {"target": 30, "targetPort": "0", "source": 3, "sourcePort": "volume"}, + {"target": 30, "targetPort": "1", "source": 4, "sourcePort": "volume"}, + {"target": 30, "targetPort": "2", "source": 5, "sourcePort": "volume"}, + {"target": 30, "targetPort": "3", "source": 6, "sourcePort": "volume"}, + {"target": 30, "targetPort": "4", "source": 7, "sourcePort": "volume"}, + {"target": 8, "targetPort": "volume_lst", "source": 30, "sourcePort": null}, + {"target": 31, "targetPort": "0", "source": 3, "sourcePort": "energy"}, + {"target": 31, "targetPort": "1", "source": 4, "sourcePort": "energy"}, + {"target": 31, "targetPort": "2", "source": 5, "sourcePort": "energy"}, + {"target": 31, "targetPort": "3", "source": 6, "sourcePort": "energy"}, + {"target": 31, "targetPort": "4", "source": 7, "sourcePort": "energy"}, + {"target": 8, "targetPort": "energy_lst", "source": 31, "sourcePort": null}, + {"target": 32, "targetPort": null, "source": 8, "sourcePort": null} ] } \ No newline at end of file