.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "api/gallery/models/plot_save_load.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_api_gallery_models_plot_save_load.py: Saving and Reloading Models: a Kane-Mele Model on Disk ========================================================= :func:`tbkit.io.save_model` writes a :class:`~tbkit.lattice.Lattice`, :class:`~tbkit.system.System` or :class:`~tbkit.kspace.KSpace` to a versioned ``.npz`` archive -- plain NumPy arrays, no pickle -- and :func:`tbkit.io.load_model` reads it back. Onsite terms, hoppings, overlaps and spin are stored in binary, so the reloaded model reproduces the Hamiltonians bit for bit. The example saves a spinful Kane-Mele model (a KSpace with 2x2 spin blocks) and a disordered real-space flake (a System, whose random hoppings could not be regenerated), reloads both, and checks that every matrix and spectrum is identical. .. GENERATED FROM PYTHON SOURCE LINES 17-30 .. code-block:: Python import os import tempfile import numpy as np import matplotlib.pyplot as plt from tbkit import lattices from tbkit.io import save_model, load_model from tbkit.kspace import KSpace, PAULI from tbkit.plot import Plot from tbkit.system import System .. GENERATED FROM PYTHON SOURCE LINES 31-37 A spinful Bloch model --------------------------- Graphene with the intrinsic spin-orbit coupling of Kane and Mele: :math:`i\lambda\nu_{ij}\sigma_z` on second neighbours (:math:`\nu = +1` for the sublattice-a bonds at 0, 120 and 240 degrees, conjugate for the stored 60-degree bond, the opposite on sublattice b). .. GENERATED FROM PYTHON SOURCE LINES 37-47 .. code-block:: Python t, lam = 1., 0.06 so, so_c = 1j * lam * PAULI['z'], -1j * lam * PAULI['z'] km = KSpace(lattices.honeycomb(), spin=True) km.set_hopping([{'n': 1, 't': t}, {'n': 2, 'tag': 'aa', 'ang': 0., 't': so}, {'n': 2, 'tag': 'aa', 'ang': 60., 't': so_c}, {'n': 2, 'tag': 'aa', 'ang': 120., 't': so}, {'n': 2, 'tag': 'bb', 'ang': 0., 't': so_c}, {'n': 2, 'tag': 'bb', 'ang': 60., 't': so}, {'n': 2, 'tag': 'bb', 'ang': 120., 't': so_c}]) .. GENERATED FROM PYTHON SOURCE LINES 48-52 Its bonds on a patch of the honeycomb lattice (sublattices a and b in two colours): the nearest-neighbour hopping :math:`t` (thick) and the second-neighbour spin-orbit bonds (thin, not to scale; their spin matrices :math:`\pm i\lambda\sigma_z` are not drawn). .. GENERATED FROM PYTHON SOURCE LINES 52-59 .. code-block:: Python patch = lattices.honeycomb() patch.get_lattice(n1=5, n2=4) vis = System(patch) vis.set_hopping([{'n': 1, 't': t}, {'n': 2, 't': 5 * lam}]) fig_lat = Plot(vis).lattice(plt_hop=True, ms=12, figsize=(5.5, 4.5)) .. image-sg:: /api/gallery/models/images/sphx_glr_plot_save_load_001.png :alt: plot save load :srcset: /api/gallery/models/images/sphx_glr_plot_save_load_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 60-62 A disordered flake ------------------------ .. GENERATED FROM PYTHON SOURCE LINES 62-72 .. code-block:: Python lat = lattices.honeycomb() lat.get_lattice(10, 10) flake = System(lat) flake.set_hopping([{'n': 1, 't': t}]) flake.set_onsite({'a': 0., 'b': 0.}) flake.set_onsite_dis(0.5) flake.get_ham() flake.get_eig() .. GENERATED FROM PYTHON SOURCE LINES 73-75 Save, reload, compare --------------------------- .. GENERATED FROM PYTHON SOURCE LINES 75-93 .. code-block:: Python with tempfile.TemporaryDirectory() as tmp: km_path = save_model(km, os.path.join(tmp, 'kane_mele')) flake_path = save_model(flake, os.path.join(tmp, 'flake.npz')) print('wrote', os.path.basename(km_path), 'and', os.path.basename(flake_path)) with np.load(km_path) as archive: print('archive entries:', sorted(archive.files)) km2 = load_model(km_path) flake2 = load_model(flake_path) rng = np.random.default_rng(0) for k in rng.uniform(-4., 4., (50, 2)): assert np.array_equal(km2.get_ham(k), km.get_ham(k)) flake2.get_ham() flake2.get_eig() assert np.array_equal(flake2.ham.toarray(), flake.ham.toarray()) assert np.array_equal(flake2.en, flake.en) .. rst-class:: sphx-glr-script-out .. code-block:: none wrote kane_mele.npz and flake.npz archive entries: ['coor', 'format', 'hop_R', 'hop_i', 'hop_j', 'hop_t', 'kind', 'n_cells', 'nonreciprocal', 'onsite', 'onsite_offdiag', 'ovl_R', 'ovl_i', 'ovl_j', 'ovl_t', 'prim_vec', 'spin', 'tbkit_version', 'uc_r0', 'uc_tag', 'version'] .. GENERATED FROM PYTHON SOURCE LINES 94-97 The reloaded Kane-Mele model is still a quantum spin Hall insulator: a gap :math:`6\sqrt{3}\lambda` at K and a nontrivial :math:`\mathbb{Z}_2` invariant. .. GENERATED FROM PYTHON SOURCE LINES 97-107 .. code-block:: Python b1, b2 = np.array(km2.rec_vec) K = (b1 - b2) / 3 en_K = km2.get_bands(K)[0] gap = en_K[2] - en_K[1] z2 = km2.z2_invariant(bands=[0, 1], nk=24) print('gap at K = {:.6f} (6 sqrt(3) lambda = {:.6f}), Z2 = {}'.format(gap, 6 * np.sqrt(3) * lam, z2)) assert abs(gap - 6 * np.sqrt(3) * lam) < 1e-12 assert z2 == 1 .. rst-class:: sphx-glr-script-out .. code-block:: none gap at K = 0.623538 (6 sqrt(3) lambda = 0.623538), Z2 = 1 .. GENERATED FROM PYTHON SOURCE LINES 108-109 Bands of the reloaded model, and spectrum of the reloaded flake. .. GENERATED FROM PYTHON SOURCE LINES 109-125 .. code-block:: Python Gamma, M = np.zeros(2), b1 / 2 dist, en = km2.k_path([Gamma, K, M, Gamma], nk=80) fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 4)) ax1.plot(dist, en, color='C0') ax1.set_xticks(km2.nodes) ax1.set_xticklabels([r'$\Gamma$', 'K', 'M', r'$\Gamma$']) ax1.set_ylabel('$E$') ax1.set_title('Kane-Mele bands, reloaded from disk') ax2.plot(flake.en, 'o', ms=4, mfc='none', label='saved flake') ax2.plot(flake2.en, '.', ms=2, label='reloaded flake') ax2.set_xlabel('state index') ax2.set_title('Disordered flake: identical spectra') ax2.legend(fontsize=8) fig.tight_layout() plt.show() .. image-sg:: /api/gallery/models/images/sphx_glr_plot_save_load_002.png :alt: Kane-Mele bands, reloaded from disk, Disordered flake: identical spectra :srcset: /api/gallery/models/images/sphx_glr_plot_save_load_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.112 seconds) .. _sphx_glr_download_api_gallery_models_plot_save_load.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_save_load.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_save_load.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_save_load.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_