{ "cells": [ { "cell_type": "markdown", "id": "31a94bbd-34ef-404b-a9be-4f3a216a8c3c", "metadata": {}, "source": [ "# POD from pointclouds \n", "\n", "We will now proceed to explain how to perform POD from point clouds. In this instance, we test only for POD in serial, as to perform in parallel, a parallel reader/writer is needed.\n", "\n", "If you have saved information in hdf5 and have habilitated mpi4py compilation of it, then you could use this code in parallel." ] }, { "cell_type": "markdown", "id": "f9ad6337-6ba4-47c7-b687-0bf119a5b637", "metadata": {}, "source": [ "#### Import general modules" ] }, { "cell_type": "code", "execution_count": 1, "id": "8b4ca2be-46e8-443b-ab44-6d1a60abfec4", "metadata": {}, "outputs": [], "source": [ "# Import required modules\n", "from mpi4py import MPI #equivalent to the use of MPI_init() in C\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import h5py\n", "\n", "# Get mpi info\n", "comm = MPI.COMM_WORLD\n", "\n", "# Hide the log for the notebook. Not recommended when running in clusters as it is better you see what happens\n", "import os\n", "os.environ[\"PYSEMTOOLS_HIDE_LOG\"] = 'true'" ] }, { "cell_type": "markdown", "id": "ae925826", "metadata": {}, "source": [ "## Set up the input parameters" ] }, { "cell_type": "code", "execution_count": 2, "id": "f77a66fc", "metadata": {}, "outputs": [], "source": [ "file_sequence = [f\"../4-interpolation/interpolated_fields{str(1+i).zfill(5)}.hdf5\" for i in range(0, 48)]\n", "pod_fields = [\"u\", \"v\", \"w\"]\n", "mesh_fname = \"../4-interpolation/points.hdf5\"\n", "mass_matrix_fname = \"../4-interpolation/points.hdf5\"\n", "mass_matrix_key = \"mass\"\n", "k = len(file_sequence)\n", "p = len(file_sequence)" ] }, { "cell_type": "markdown", "id": "62da10be", "metadata": {}, "source": [ "## Call the pysemtools routines" ] }, { "cell_type": "code", "execution_count": 3, "id": "e6c7262d", "metadata": {}, "outputs": [], "source": [ "from pysemtools.rom.phy_pod_wrappers import pod_from_files\n", "# Output\n", "from pyevtk.hl import gridToVTK\n", "\n", "pod, ioh, field3d_shape = pod_from_files(comm, file_sequence, pod_fields, mass_matrix_fname, mass_matrix_key, k, p)" ] }, { "cell_type": "markdown", "id": "5908c2f7", "metadata": {}, "source": [ "## Write out the data\n", "\n", "In this case we can easily write the modes from vtk" ] }, { "cell_type": "code", "execution_count": 4, "id": "7d692101", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing ./phys_pod__mode0.vtk\n", "Writing ./phys_pod__mode1.vtk\n", "Writing ./phys_pod__mode2.vtk\n", "Writing ./phys_pod__mode3.vtk\n", "Writing ./phys_pod__mode4.vtk\n", "Writing ./phys_pod_reconstructed_data_0\n", "Writing ./phys_pod_reconstructed_data_1\n", "Writing ./phys_pod_reconstructed_data_2\n", "Writing ./phys_pod_reconstructed_data_3\n", "Writing ./phys_pod_reconstructed_data_4\n", "Writing ./phys_pod_reconstructed_data_5\n", "Writing ./phys_pod_reconstructed_data_6\n", "Writing ./phys_pod_reconstructed_data_7\n", "Writing ./phys_pod_reconstructed_data_8\n", "Writing ./phys_pod_reconstructed_data_9\n", "Writing ./phys_pod_reconstructed_data_10\n", "Writing ./phys_pod_reconstructed_data_11\n", "Writing ./phys_pod_reconstructed_data_12\n", "Writing ./phys_pod_reconstructed_data_13\n", "Writing ./phys_pod_reconstructed_data_14\n", "Writing ./phys_pod_reconstructed_data_15\n", "Writing ./phys_pod_reconstructed_data_16\n", "Writing ./phys_pod_reconstructed_data_17\n", "Writing ./phys_pod_reconstructed_data_18\n", "Writing ./phys_pod_reconstructed_data_19\n", "Writing ./phys_pod_reconstructed_data_20\n", "Writing ./phys_pod_reconstructed_data_21\n", "Writing ./phys_pod_reconstructed_data_22\n", "Writing ./phys_pod_reconstructed_data_23\n", "Writing ./phys_pod_reconstructed_data_24\n", "Writing ./phys_pod_reconstructed_data_25\n", "Writing ./phys_pod_reconstructed_data_26\n", "Writing ./phys_pod_reconstructed_data_27\n", "Writing ./phys_pod_reconstructed_data_28\n", "Writing ./phys_pod_reconstructed_data_29\n", "Writing ./phys_pod_reconstructed_data_30\n", "Writing ./phys_pod_reconstructed_data_31\n", "Writing ./phys_pod_reconstructed_data_32\n", "Writing ./phys_pod_reconstructed_data_33\n", "Writing ./phys_pod_reconstructed_data_34\n", "Writing ./phys_pod_reconstructed_data_35\n", "Writing ./phys_pod_reconstructed_data_36\n", "Writing ./phys_pod_reconstructed_data_37\n", "Writing ./phys_pod_reconstructed_data_38\n", "Writing ./phys_pod_reconstructed_data_39\n", "Writing ./phys_pod_reconstructed_data_40\n", "Writing ./phys_pod_reconstructed_data_41\n", "Writing ./phys_pod_reconstructed_data_42\n", "Writing ./phys_pod_reconstructed_data_43\n", "Writing ./phys_pod_reconstructed_data_44\n", "Writing ./phys_pod_reconstructed_data_45\n", "Writing ./phys_pod_reconstructed_data_46\n", "Writing ./phys_pod_reconstructed_data_47\n" ] } ], "source": [ "# Load the mesh\n", "with h5py.File(mesh_fname, 'r') as f:\n", " x = f[\"x\"][:]\n", " y = f[\"y\"][:]\n", " z = f[\"z\"][:]\n", "\n", "from pysemtools.rom.phy_pod_wrappers import write_3dfield_to_file\n", "\n", "# Load the mesh\n", "with h5py.File(mesh_fname, 'r') as f:\n", " x = f[\"x\"][:]\n", " y = f[\"y\"][:]\n", " z = f[\"z\"][:]\n", "\n", "# Write out 5 modes\n", "write_3dfield_to_file(\"phys_pod.vtk\", x, y, z, pod, ioh, modes=[i for i in range(0, 5)], field_shape=field3d_shape, field_names=pod_fields)\n", "\n", "# Reconstruct all the snapshots with 5 modes\n", "write_3dfield_to_file(\"phys_pod.vtk\", x, y, z, pod, ioh, modes=[i for i in range(0, 5)], field_shape=field3d_shape, field_names=pod_fields, snapshots=[i for i in range(0, len(file_sequence))])" ] }, { "cell_type": "markdown", "id": "7a46985b", "metadata": {}, "source": [ "## Save the data as numpy arrays" ] }, { "cell_type": "code", "execution_count": 5, "id": "3266b6ed", "metadata": {}, "outputs": [], "source": [ "from pysemtools.rom.phy_pod_wrappers import save_pod_state\n", "\n", "save_pod_state(\"pod_state.hdf5\", pod)" ] }, { "cell_type": "markdown", "id": "c02ed241", "metadata": {}, "source": [ "## Perform tests" ] }, { "cell_type": "code", "execution_count": 6, "id": "0b04d7a4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Testing snapshot 0: ../4-interpolation/interpolated_fields00001.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 3.698958237844183e-05\n", "Reconstruction energy: 3.698959791995519e-05\n", "=======================================\n", "Testing snapshot 1: ../4-interpolation/interpolated_fields00002.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 3.8898814924962444e-05\n", "Reconstruction energy: 3.8898829611720724e-05\n", "=======================================\n", "Testing snapshot 2: ../4-interpolation/interpolated_fields00003.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.153454569587408e-05\n", "Reconstruction energy: 4.153456122670148e-05\n", "=======================================\n", "Testing snapshot 3: ../4-interpolation/interpolated_fields00004.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.4425076415412405e-05\n", "Reconstruction energy: 4.442509363710398e-05\n", "=======================================\n", "Testing snapshot 4: ../4-interpolation/interpolated_fields00005.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.688317219673442e-05\n", "Reconstruction energy: 4.688319417681433e-05\n", "=======================================\n", "Testing snapshot 5: ../4-interpolation/interpolated_fields00006.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.878401448156997e-05\n", "Reconstruction energy: 4.8784037017177103e-05\n", "=======================================\n", "Testing snapshot 6: ../4-interpolation/interpolated_fields00007.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 5.026805630070726e-05\n", "Reconstruction energy: 5.026807862059571e-05\n", "=======================================\n", "Testing snapshot 7: ../4-interpolation/interpolated_fields00008.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 5.149475955390006e-05\n", "Reconstruction energy: 5.149478153993227e-05\n", "=======================================\n", "Testing snapshot 8: ../4-interpolation/interpolated_fields00009.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 5.237488647324383e-05\n", "Reconstruction energy: 5.237490538075368e-05\n", "=======================================\n", "Testing snapshot 9: ../4-interpolation/interpolated_fields00010.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 5.263423351722945e-05\n", "Reconstruction energy: 5.263424808861043e-05\n", "=======================================\n", "Testing snapshot 10: ../4-interpolation/interpolated_fields00011.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 5.187294605439943e-05\n", "Reconstruction energy: 5.187296300851487e-05\n", "=======================================\n", "Testing snapshot 11: ../4-interpolation/interpolated_fields00012.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.988241310699623e-05\n", "Reconstruction energy: 4.98824339321701e-05\n", "=======================================\n", "Testing snapshot 12: ../4-interpolation/interpolated_fields00013.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.697643854683935e-05\n", "Reconstruction energy: 4.697645923683903e-05\n", "=======================================\n", "Testing snapshot 13: ../4-interpolation/interpolated_fields00014.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.3863242905911426e-05\n", "Reconstruction energy: 4.386325835715201e-05\n", "=======================================\n", "Testing snapshot 14: ../4-interpolation/interpolated_fields00015.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 4.04654975068024e-05\n", "Reconstruction energy: 4.046551073804368e-05\n", "=======================================\n", "Testing snapshot 15: ../4-interpolation/interpolated_fields00016.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 3.708331604360593e-05\n", "Reconstruction energy: 3.70833306496177e-05\n", "=======================================\n", "Testing snapshot 16: ../4-interpolation/interpolated_fields00017.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 3.361937142993228e-05\n", "Reconstruction energy: 3.3619385479765e-05\n", "=======================================\n", "Testing snapshot 17: ../4-interpolation/interpolated_fields00018.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 3.042199960394419e-05\n", "Reconstruction energy: 3.042201288840405e-05\n", "=======================================\n", "Testing snapshot 18: ../4-interpolation/interpolated_fields00019.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.764625401122964e-05\n", "Reconstruction energy: 2.7646265699721833e-05\n", "=======================================\n", "Testing snapshot 19: ../4-interpolation/interpolated_fields00020.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.5278143358328515e-05\n", "Reconstruction energy: 2.527815340611091e-05\n", "=======================================\n", "Testing snapshot 20: ../4-interpolation/interpolated_fields00021.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.3436562845034242e-05\n", "Reconstruction energy: 2.3436571745893377e-05\n", "=======================================\n", "Testing snapshot 21: ../4-interpolation/interpolated_fields00022.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.2002654602291965e-05\n", "Reconstruction energy: 2.200266188237421e-05\n", "=======================================\n", "Testing snapshot 22: ../4-interpolation/interpolated_fields00023.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.0920245682595327e-05\n", "Reconstruction energy: 2.0920252797345817e-05\n", "=======================================\n", "Testing snapshot 23: ../4-interpolation/interpolated_fields00024.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.013654268431107e-05\n", "Reconstruction energy: 2.0136550044303895e-05\n", "=======================================\n", "Testing snapshot 24: ../4-interpolation/interpolated_fields00025.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 1.9632578477660025e-05\n", "Reconstruction energy: 1.9632586126642394e-05\n", "=======================================\n", "Testing snapshot 25: ../4-interpolation/interpolated_fields00026.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 1.933656650853822e-05\n", "Reconstruction energy: 1.9336575494338164e-05\n", "=======================================\n", "Testing snapshot 26: ../4-interpolation/interpolated_fields00027.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 1.9193896285463495e-05\n", "Reconstruction energy: 1.9193905632897007e-05\n", "=======================================\n", "Testing snapshot 27: ../4-interpolation/interpolated_fields00028.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 1.9209913696544347e-05\n", "Reconstruction energy: 1.9209922552457982e-05\n", "=======================================\n", "Testing snapshot 28: ../4-interpolation/interpolated_fields00029.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 1.9433633251162603e-05\n", "Reconstruction energy: 1.9433641564702733e-05\n", "=======================================\n", "Testing snapshot 29: ../4-interpolation/interpolated_fields00030.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 1.9843626264053833e-05\n", "Reconstruction energy: 1.984363462420495e-05\n", "=======================================\n", "Testing snapshot 30: ../4-interpolation/interpolated_fields00031.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.0264037570696985e-05\n", "Reconstruction energy: 2.026404726721621e-05\n", "=======================================\n", "Testing snapshot 31: ../4-interpolation/interpolated_fields00032.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.061492121971811e-05\n", "Reconstruction energy: 2.0614930665485913e-05\n", "=======================================\n", "Testing snapshot 32: ../4-interpolation/interpolated_fields00033.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.0873392702196558e-05\n", "Reconstruction energy: 2.0873401695293363e-05\n", "=======================================\n", "Testing snapshot 33: ../4-interpolation/interpolated_fields00034.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.100146581923816e-05\n", "Reconstruction energy: 2.1001474879010305e-05\n", "=======================================\n", "Testing snapshot 34: ../4-interpolation/interpolated_fields00035.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1002631484979843e-05\n", "Reconstruction energy: 2.1002640205096e-05\n", "=======================================\n", "Testing snapshot 35: ../4-interpolation/interpolated_fields00036.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.0926017391762055e-05\n", "Reconstruction energy: 2.0926025698532318e-05\n", "=======================================\n", "Testing snapshot 36: ../4-interpolation/interpolated_fields00037.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.0846074698639117e-05\n", "Reconstruction energy: 2.0846082378820277e-05\n", "=======================================\n", "Testing snapshot 37: ../4-interpolation/interpolated_fields00038.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.0866571618859654e-05\n", "Reconstruction energy: 2.086657965562247e-05\n", "=======================================\n", "Testing snapshot 38: ../4-interpolation/interpolated_fields00039.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.101439294141517e-05\n", "Reconstruction energy: 2.1014401790563164e-05\n", "=======================================\n", "Testing snapshot 39: ../4-interpolation/interpolated_fields00040.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1135889588706728e-05\n", "Reconstruction energy: 2.1135897678024467e-05\n", "=======================================\n", "Testing snapshot 40: ../4-interpolation/interpolated_fields00041.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1184459915354247e-05\n", "Reconstruction energy: 2.1184468317008704e-05\n", "=======================================\n", "Testing snapshot 41: ../4-interpolation/interpolated_fields00042.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1250999040067878e-05\n", "Reconstruction energy: 2.1251006836458486e-05\n", "=======================================\n", "Testing snapshot 42: ../4-interpolation/interpolated_fields00043.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1377532850036896e-05\n", "Reconstruction energy: 2.1377540941763505e-05\n", "=======================================\n", "Testing snapshot 43: ../4-interpolation/interpolated_fields00044.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1529543422705357e-05\n", "Reconstruction energy: 2.1529553102361603e-05\n", "=======================================\n", "Testing snapshot 44: ../4-interpolation/interpolated_fields00045.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.161399267113895e-05\n", "Reconstruction energy: 2.1614003298549693e-05\n", "=======================================\n", "Testing snapshot 45: ../4-interpolation/interpolated_fields00046.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1637133597399283e-05\n", "Reconstruction energy: 2.163714439898288e-05\n", "=======================================\n", "Testing snapshot 46: ../4-interpolation/interpolated_fields00047.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.1440817225395135e-05\n", "Reconstruction energy: 2.1440827260570388e-05\n", "=======================================\n", "Testing snapshot 47: ../4-interpolation/interpolated_fields00048.hdf5\n", "Field u passed: True\n", "Field v passed: True\n", "Field w passed: True\n", "Snapshot energy: 2.0948984478946528e-05\n", "Reconstruction energy: 2.0948993077000546e-05\n", "=======================================\n", "total snapshot energy: 0.001434071843040977\n", "Total POD energy: 0.0014340724222272252\n", "=======================================\n" ] } ], "source": [ "from pysemtools.rom.phy_pod_wrappers import physical_space\n", "\n", "# Load the mass matrix\n", "with h5py.File(mass_matrix_fname, 'r') as f:\n", " bm_v = f[\"mass\"][:]\n", "\n", "# Go through the snapshots in the file sequence\n", "total_snapshot_energy = 0\n", "for j, fname in enumerate(file_sequence):\n", " print(f\"Testing snapshot {j}: {fname}\")\n", " \n", " with h5py.File(fname, 'r') as f:\n", "\n", " # Check one snapshot at a time\n", " # Here one could also just use the phys that has been previously computed.\n", " phys = physical_space(pod, ioh, modes=[i for i in range(0, k)], field_shape=field3d_shape, field_names=pod_fields, snapshots=[j])\n", "\n", " # Check if the reconstruction is accurate\n", " for field in pod_fields:\n", " passed = np.allclose(phys[j][field], f[field][:])\n", " print(f\"Field {field} passed: {passed}\")\n", "\n", " # Check if the energy was accurately captured\n", " snapshot_energy = 0\n", " for field in pod_fields:\n", " snapshot_energy += np.sum(f[field][:]**2*bm_v)\n", " total_snapshot_energy += snapshot_energy\n", "\n", " reconstruction_energy = 0\n", " a_i = np.diag(pod.d_1t)@pod.vt_1t[:,j]\n", " reconstruction_energy += np.sum(np.abs(a_i)**2)\n", "\n", " print(f\"Snapshot energy: {snapshot_energy}\")\n", " print(f\"Reconstruction energy: {reconstruction_energy}\")\n", " \n", " print(\"=======================================\")\n", "\n", "# Check if the total energy is kept in the singular values\n", "print(f\"total snapshot energy: {total_snapshot_energy}\")\n", "\n", "total_pod_energy = 0\n", "total_pod_energy += np.sum(pod.d_1t**2)\n", "print(f\"Total POD energy: {total_pod_energy}\")\n", "print(\"=======================================\") \n" ] } ], "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.10.14" } }, "nbformat": 4, "nbformat_minor": 5 }