diff --git a/analysis/scipy_optimizer.ipynb b/analysis/scipy_optimizer.ipynb index c6f3f65bd46486d5080cc00352cfbcc0da9ef4e5..681efa222d034c0734b00a3cb72bbb1acd704d9e 100644 --- a/analysis/scipy_optimizer.ipynb +++ b/analysis/scipy_optimizer.ipynb @@ -7,20 +7,7 @@ "metadata": { "tags": [] }, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'utils'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcodes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m utils, hf\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mscipy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01moptimize\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m anderson\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtqdm\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m tqdm\n", - "File \u001b[0;32m~/Sync/kwant-scf/analysis/codes/hf.py:3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mscipy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msignal\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m convolve2d\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[0;32m----> 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mutils\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mfunctools\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m partial\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mscipy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01moptimize\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m anderson, minimize\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'utils'" - ] - } - ], + "outputs": [], "source": [ "import kwant\n", "import numpy as np\n", @@ -56,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "9cc3b32d-404f-4bc5-a338-83571c9e4c4b", "metadata": { "tags": [] @@ -76,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "a341e0e5-330e-48d1-a20f-a0040688a9d7", "metadata": {}, "outputs": [], @@ -90,20 +77,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "d1ef154e-70bd-4f28-887f-72362d8533dd", "metadata": { "tags": [] }, "outputs": [], "source": [ - "Us = np.linspace(0, 4, 50)\n", - "Vs = np.linspace(0, 1.5, 20)" + "Us = np.linspace(0, 4, 10)\n", + "Vs = np.linspace(0, 1.5, 10)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "32b9e7c5-db12-44f9-930c-21e5494404b8", "metadata": { "tags": [] @@ -137,16 +124,13 @@ " hamiltonians_0 = utils.syst2hamiltonian(ks=ks, syst=wrapped_fsyst)\n", " # Generate guess on the same grid\n", " if guess is None:\n", - " guess = guess = utils.generate_guess(nk, 2, deltas, ndof=4, scale=1)\n", + " guess = utils.generate_guess(ks, deltas, ndof=hamiltonians_0.shape[-1], scale=1)\n", " else:\n", - " # guess *= 0.25\n", - " guess += np.max(guess) * utils.generate_guess(nk, 2, deltas, ndof=4, scale=0.1)\n", - " # guess = guess\n", + " guess += np.max(guess) * utils.generate_guess(ks, deltas, ndof=hamiltonians_0.shape[-1], scale=0.1)\n", " \n", " # Find groundstate Hamiltonian on the same grid\n", " hk = hf.find_groundstate_ham(\n", " H_int=H_int,\n", - " nk=nk,\n", " filling=filling,\n", " hamiltonians_0=hamiltonians_0,\n", " tol=tol,\n", @@ -158,14 +142,10 @@ " vals, vecs = np.linalg.eigh(hk)\n", " # Extract coarse-grid Fermi energy\n", " E_F = utils.get_fermi_energy(vals, 2)\n", - " # Generate kwant system with k-grid Hamiltonian\n", - " scf_syst = utils.hk2syst(deltas, hk, ks, dk, max_neighbor, norbs, lattice)\n", " # Generate dense-grid k-points\n", " ks_dense = np.linspace(0, 2 * np.pi, nk_dense, endpoint=False)\n", " # Compute groundstate Hamiltonian on a dense grid\n", - " scf_ham = utils.syst2hamiltonian(\n", - " ks=ks_dense, syst=scf_syst, params={}\n", - " )\n", + " scf_ham = utils.hk_densegrid(hk, ks, ks_dense, deltas)\n", " # Diagonalize groundstate Hamiltonian\n", " vals, vecs = np.linalg.eigh(scf_ham)\n", " # Extract dense-grid Fermi energy\n", @@ -215,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "6a8c08a9-7e31-420b-b6b4-709abfb26793", "metadata": { "tags": [] @@ -225,29 +205,7 @@ "name": "stderr", "output_type": "stream", "text": [ - " 22%|██■| 11/50 [02:33<07:34, 11.66s/it]/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=4.86112e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - "/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=1.11881e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - "/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=6.6988e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - "/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=1.04075e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - "/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=1.03848e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - "/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=1.08015e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - "/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=1.07054e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - " 32%|███■| 16/50 [03:37<06:44, 11.89s/it]/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=6.43375e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - " 34%|███■| 17/50 [03:58<08:05, 14.71s/it]/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=7.90352e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - " 54%|█████■| 27/50 [07:18<09:45, 25.48s/it]/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=3.27211e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - " 58%|█████▊ | 29/50 [09:18<15:24, 44.03s/it]/opt/conda/lib/python3.11/site-packages/scipy/optimize/_nonlin.py:1074: LinAlgWarning: Ill-conditioned matrix (rcond=5.90338e-17): result may not be accurate.\n", - " gamma = solve(self.a, df_f)\n", - "100%|██████████| 50/50 [22:03<00:00, 26.47s/it]\n" + " 70%|███████ | 7/10 [06:20<03:32, 70.75s/it]" ] } ], @@ -257,23 +215,23 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 10, "id": "39edbf19", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<matplotlib.colorbar.Colorbar at 0x7f12eff193d0>" + "<matplotlib.colorbar.Colorbar at 0x7fee6f0d48d0>" ] }, - "execution_count": 30, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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7V2E24Z4fBcVFRW67LLLNGDAAA0ZMkQ33nijDh603xc93t6Fk3bE2/tYvXq1Lr30Uv/mXEVFRXrxxRdD5om39yCF3454ew/BVFRUyOVyqbS0NGS6aL0Ply8yV7Tcdtttqq2t1ebNm7V582bV1taqpKTENt/111+vhoYG/7VpU+AxKKWlpdq4caPWr1+vV155RadOndLMmTPl9YY+X+iT4iIA2bBhg0pLS/Xggw+qpqZGU6ZM0fTp0wOW837c4cOHNWPGDE2ZMkU1NTV64IEHdM8996iqqirGNf9f4bahw8GDBwNe9MiRI2NU4+BOnz6t8ePH67HHHutW+nh8F+G2oUM8vYvt27fr7rvv1p49e1RdXa329nYVFxfr9OnTXeaJx3fhpB0d4uV9XHjhhfr3f/937du3T/v27dNnP/tZfeELX9Cbb74ZNH08vgcp/HZ0iJf38El79+7VmjVrdOmll4ZMF9X3Ecf7gLz99tvavHmzfv7zn6uoqEhFRUX62c9+pt/97ne2/whIS0tTdna2//r4lvYej0dr167Vj370I1177bWaMGGC1q1bpz/96U966aWXwqukFQcuv/xya/78+QH3Ro8ebd1///1B0y9atMgaPXp0wL1vfOMbVmFhYdTqaCfcNmzdutWSZB0/fjwGtXNGkrVx48aQaeLxXXxcd9qQCO+iqanJkmRt3769yzTx/i4sq3vtSIT3cf7551s///nPgz5LhPfQIVQ74vk9nDx50ho5cqRVXV1tXXXVVda9997bZdpovA+Px2NJsi678f9aRV9eZnRdduP/tSRZ9fX1lsfj8V9nzpxxXD/Lsqy1a9dabre703232209+eSTXeabPXu25Xa7rQsuuMAaOXKkNXfuXOv999/3P3/55ZctSdbf//73gHyXXnqp9f3vfz+sOvZ4D0hra6v279+v4uLigPvFxcXatWtX0Dy7d+/ulH7atGnat2+f2tpCH/EcDU7a0GHChAnKycnR1KlTtXXr1mhWMyri7V2YiOd34fF4JCnk4VqJ8C66044O8fg+vF6v1q9fr9OnT6uoqChomkR4D91pR4d4fA933323Pve5z+naa6+1TRvN99GxCsb0kqTc3Fz/XA23262KigqjujU2NmrIkCGd7g8ZMqTL0+slafr06XrmmWf0hz/8QT/60Y+0d+9effazn1VLS4u/3NTUVJ1//vkB+bKyskKWG0yPr4I5evSovF5vp8PsQjWmsbExaPr29nYdPXpUOTk5UatvME7akJOTozVr1ig/P18tLS16+umnNXXqVG3btk1XXnllLKodEfH2LpyI93dhWZbKysr0mc98RuPGjesyXby/i+62Ix7fx5/+9CcVFRXpzJkzOu+887Rx40ZdfPHFQdPG83sIpx3x+B4kaf369Tpw4ID27t3brfRRfR8R3AfkkycQd7WL6+LFi7VkyZKQRXb8bIKdOG/ZnF4/a9Ys/3+PGzdOBQUFGj58uF544QV98YtfDNGM0OUG0+MBSIdPVtyuMcHSB7sfS+G0YdSoURo1apT/c1FRkerr67Vs2bK4+EsvHPH4LsIR7+9iwYIFev311/XKK6/Ypo3nd9HddsTj+xg1apRqa2t14sQJVVVVafbs2dq+fXuXf3nH63sIpx3x+B7q6+t17733asuWLUpP7/4OpPH6Pj6uuycQL1iwQLfeemvINCNGjNDrr7+u999/v9OzDz74oMvT64PJycnR8OHDdejQIUlnT7hvbW3V8ePHA3pBmpqaujyUtis9PgSTmZmppKSkTj0FTU1NXf6QsrOzg6ZPTk7W4MGDo1bXrjhpQzCFhYX+l5wo4u1dREq8vItvfetb+u1vf6utW7fqwgsvDJk2nt9FOO0IpqffR2pqqj796U+roKBAFRUVGj9+vB599NGgaeP5PYTTjmB6+j3s379fTU1Nys/PV3JyspKTk7V9+3atXLlSycnJQVdhRPN9RHIIprsyMzM1evTokFd6erqKiork8Xj0xz/+0Z/31VdflcfjCStQOHbsmOrr6/09Rfn5+UpJSQk45b6hoUFvvPFG4gUgqampys/PD2iMJFVXV3fZmKKiok7pt2zZooKCAqWkpEStrl1x0oZgampqerybPFzx9i4ipaffhWVZWrBggX7961/rD3/4g/Ly8mzzxOO7cNKOYHr6fXySZVn+MfFPisf30JVQ7Qimp9/D1KlT9ac//Um1tbX+q6CgQLfffrtqa2uVlJTUKU9U30ccr4IZM2aMrr/+es2bN0979uzRnj17NG/ePM2cOTOgZ2v06NHauHGjJOnUqVNauHChdu/erb/+9a/atm2bbrjhBmVmZuqmm26SJLndbs2ZM0ff/va39fLLL6umpkZf+cpXdMkll3RrTk6AsKasRsn69eutlJQU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", + "image/png": "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", "text/plain": [ "<Figure size 640x480 with 2 Axes>" ] @@ -289,23 +247,23 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 8, "id": "27f9d0d8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<matplotlib.colorbar.Colorbar at 0x7f12effcd650>" + "<matplotlib.colorbar.Colorbar at 0x7f717551ca90>" ] }, - "execution_count": 31, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "<Figure size 640x480 with 2 Axes>" ] diff --git a/codes/hf.py b/codes/hf.py index 1c57bc167bfd2e74e6bc94da62e66ebc2fa0988a..e07f5d67a6b6a71b5ed40017bebc701a3bad42ca 100644 --- a/codes/hf.py +++ b/codes/hf.py @@ -69,20 +69,29 @@ def compute_mf(vals, vecs, filling, H_int): H0_int = H_int[*[0 for i in range(dim)]] # note the k-grid starts at k_x = k_y = 0 E_F = utils.get_fermi_energy(vals, filling) - F = mean_field_F(vals, vecs, E_F=E_F) + F = mean_field_F(vals=vals, vecs=vecs, E_F=E_F) rho = np.diag(np.average(F, axis=tuple([i for i in range(dim)]))) exchange_mf = convolution(F, H_int) * nk ** (-dim) direct_mf = np.diag(np.einsum("i,ij->j", rho, H0_int)) return direct_mf - exchange_mf - -def scf_loop(mf, H_int, filling, hamiltonians_0): +def scf_loop(mf, H_int, filling, hamiltonians_0, tol): + if np.linalg.norm(mf) < tol: + return 0 # Generate the Hamiltonian hamiltonians = hamiltonians_0 + mf vals, vecs = np.linalg.eigh(hamiltonians) vecs = np.linalg.qr(vecs)[0] + mf_new = compute_mf(vals=vals, vecs=vecs, filling=filling, H_int=H_int) - return np.array(np.abs(mf_new - mf), dtype=complex) + + diff = mf_new - mf + + if np.linalg.norm(mf_new) < tol: + return 0 + else: + return diff + def find_groundstate_ham( @@ -92,7 +101,8 @@ def find_groundstate_ham( scf_loop, H_int=H_int, filling=filling, - hamiltonians_0=hamiltonians_0 + hamiltonians_0=hamiltonians_0, + tol=tol ) - mf = anderson(fun, guess, f_rtol=tol, w0=mixing, M=order, verbose=verbose) + mf = anderson(fun, guess, f_tol=tol, w0=mixing, M=order, verbose=verbose) return hamiltonians_0 + mf diff --git a/codes/utils.py b/codes/utils.py index 5b07c07cca1e7aac94976ae49420b9c678701334..2549872f690143c9d573d0ff47511def446fa886 100644 --- a/codes/utils.py +++ b/codes/utils.py @@ -19,9 +19,11 @@ def get_fermi_energy(vals, filling): return fermi -def syst2hamiltonian(ks, syst, params={}, coordinate_names='xyz'): - momenta = ['k_{}'.format(coordinate_names[i]) - for i in range(len(syst._wrapped_symmetry.periods))] +def syst2hamiltonian(ks, syst, params={}, coordinate_names="xyz"): + momenta = [ + "k_{}".format(coordinate_names[i]) + for i in range(len(syst._wrapped_symmetry.periods)) + ] def h_k(k): _k_dict = {} @@ -29,7 +31,7 @@ def syst2hamiltonian(ks, syst, params={}, coordinate_names='xyz'): _k_dict[k_n] = k[i] return syst.hamiltonian_submatrix(params={**params, **_k_dict}) - k_pts = np.tile(ks, len(momenta)).reshape(len(momenta),len(ks)) + k_pts = np.tile(ks, len(momenta)).reshape(len(momenta), len(ks)) ham = [] for k in product(*k_pts): @@ -39,6 +41,7 @@ def syst2hamiltonian(ks, syst, params={}, coordinate_names='xyz'): return ham.reshape(*shape) + def potential2hamiltonian( syst, lattice, func_onsite, func_hop, ks, params={}, max_neighbor=1 ): @@ -51,30 +54,29 @@ def potential2hamiltonian( def assign_kdependence( - nk, dim, ndof, hopping_vecs, content -): # goal and content are bad names, suggestions welcome - klenlist = [nk for i in range(dim)] - goal = np.zeros((klenlist + [ndof, ndof]), dtype=complex) - reshape_order = [1 for i in range(dim)] # could use a better name + ks, hopping_vecs, hopping_matrices +): + ndof = hopping_matrices[0].shape[0] + dim = len(hopping_vecs[0]) + nks = [len(ks) for i in range(dim)] + bloch_matrix = np.zeros((nks + [ndof, ndof]), dtype=complex) kgrid = ( - np.asarray(np.meshgrid(*[np.linspace(-np.pi, np.pi, nk) for i in range(dim)])) + np.asarray(np.meshgrid(*[ks for i in range(dim)])) .reshape(dim, -1) .T ) - for hop, hop2 in zip(hopping_vecs, content): - k_dependence = np.exp(1j * np.dot(kgrid, hop)).reshape(klenlist + [1, 1]) - goal += hop2.reshape(reshape_order + [ndof, ndof]) * k_dependence + for vec, matrix in zip(hopping_vecs, hopping_matrices): + bloch_phase = np.exp(1j * np.dot(kgrid, vec)).reshape(nks + [1, 1]) + bloch_matrix += matrix.reshape([1 for i in range(dim)] + [ndof, ndof]) * bloch_phase - return goal + return bloch_matrix -def generate_guess(nk, dim, hopping_vecs, ndof, scale=0.1): +def generate_guess(nk, hopping_vecs, ndof, scale=0.1): """ nk : int number of k points - dim : int - dimension of the system hopping_vecs : np.array hopping vectors as obtained from extract_hopping_vectors ndof : int @@ -89,6 +91,7 @@ def generate_guess(nk, dim, hopping_vecs, ndof, scale=0.1): Assumes that the desired max nearest neighbour distance is included in the hopping_vecs information. Creates a square grid by definition, might still want to change that """ + dim = len(hopping_vecs[0]) all_rand_hermitians = [] for n in hopping_vecs: amplitude = np.random.rand(ndof, ndof) @@ -99,7 +102,7 @@ def generate_guess(nk, dim, hopping_vecs, ndof, scale=0.1): all_rand_hermitians.append(rand_hermitian) all_rand_hermitians = np.asarray(all_rand_hermitians) - guess = assign_kdependence(nk, dim, ndof, hopping_vecs, all_rand_hermitians) + guess = assign_kdependence(nk, hopping_vecs, all_rand_hermitians) return guess * scale @@ -139,28 +142,32 @@ def generate_scf_syst(max_neighbor, syst, lattice): return wrapped_scf, deltas -def hk2hop(hk, deltas, ks, dk): +def hk2hop(hk, deltas, ks): ndim = len(hk.shape) - 2 - k_pts = np.tile(ks, ndim).reshape(ndim,len(ks)) + dk = np.diff(ks)[0] + nk = len(ks) + k_pts = np.tile(ks, ndim).reshape(ndim, nk) k_grid = np.array(np.meshgrid(*k_pts)) k_grid = k_grid.reshape(k_grid.shape[0], np.prod(k_grid.shape[1:])) # Can probably flatten this object to make einsum simpler hk = hk.reshape(np.prod(hk.shape[:ndim]), *hk.shape[-2:]) - hopps = np.einsum( - "ij,jkl->ikl", - np.exp(1j * np.einsum("ij,jk->ik", deltas, k_grid)), - hk, - ) * (dk / (2 * np.pi)) ** ndim + hopps = ( + np.einsum( + "ij,jkl->ikl", + np.exp(1j * np.einsum("ij,jk->ik", deltas, k_grid)), + hk, + ) + * (dk / (2 * np.pi)) ** ndim + ) return hopps -def hktohamiltonian(hk, nk, ks, dk, dim, hopping_vecs, ndof): +def hk_densegrid(hk, ks, ks_dense, hopping_vecs): """function is basically tiny so maybe don't separapetly create it""" - hops = hk2hop(hk, hopping_vecs, ks, dk) - hamil = assign_kdependence(nk, dim, ndof, hopping_vecs, hops) - return hamil + hops = hk2hop(hk, hopping_vecs, ks) + return assign_kdependence(ks_dense, hopping_vecs, hops) def hk2syst(deltas, hk, ks, dk, max_neighbor, norbs, lattice):