You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
grogu/test.ipynb

1665 lines
149 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.14.3'"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"from tqdm import tqdm\n",
"from sys import getsizeof\n",
"from timeit import default_timer as timer\n",
"\n",
"os.environ[\"OMP_NUM_THREADS\"] = \"1\" # export OMP_NUM_THREADS=4\n",
"os.environ[\"OPENBLAS_NUM_THREADS\"] = \"1\" # export OPENBLAS_NUM_THREADS=4\n",
"os.environ[\"MKL_NUM_THREADS\"] = \"1\" # export MKL_NUM_THREADS=6\n",
"os.environ[\"VECLIB_MAXIMUM_THREADS\"] = \"1\" # export VECLIB_MAXIMUM_THREADS=4\n",
"os.environ[\"NUMEXPR_NUM_THREADS\"] = \"1\" # export NUMEXPR_NUM_THREADS=6\n",
"\n",
"import numpy as np\n",
"import sisl\n",
"from src.grogu_magn.useful import *\n",
"from mpi4py import MPI\n",
"import pickle\n",
"from numpy.linalg import inv\n",
"import warnings\n",
"\n",
"# runtime information\n",
"times = dict()\n",
"times[\"start_time\"] = timer()\n",
"########################\n",
"# it works if data is in downloads folder\n",
"########################\n",
"sisl.__version__"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 1000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 500\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Setup done. Elapsed time: 5447.39860525 s\n",
"================================================================================================================================================================\n"
]
}
],
"source": [
"# this cell mimicks an input file\n",
"fdf = sisl.get_sile(\n",
" \"/Users/danielpozsar/Downloads/nojij/Fe3GeTe2/monolayer/soc/lat3_791/Fe3GeTe2.fdf\"\n",
") # ./Jij_for_Marci_6p45ang/CrBr.fdf\n",
"\n",
"outfile = \"test\"\n",
"if not outfile.endswith(\".pickle\"):\n",
" outfile += \".pickle\"\n",
"# this information needs to be given at the input!!\n",
"scf_xcf_orientation = np.array([0, 0, 1]) # z\n",
"# list of reference directions for around which we calculate the derivatives\n",
"# o is the quantization axis, v and w are two axes perpendicular to it\n",
"# at this moment the user has to supply o,v,w on the input.\n",
"# we can have some default for this\n",
"ref_xcf_orientations = [\n",
" dict(o=np.array([1, 0, 0]), vw=[np.array([0, 1, 0]), np.array([0, 0, 1])]),\n",
" dict(o=np.array([0, 1, 0]), vw=[np.array([1, 0, 0]), np.array([0, 0, 1])]),\n",
" dict(o=np.array([0, 0, 1]), vw=[np.array([1, 0, 0]), np.array([0, 1, 0])]),\n",
"]\n",
"\n",
"\n",
"# human readable definition of magnetic entities ./lat3_791/Fe3GeTe2.fdf\n",
"magnetic_entities = [\n",
" dict(atom=3, l=2),\n",
" dict(atom=4, l=2),\n",
" dict(atom=5, l=2),\n",
"]\n",
"# pair information ./lat3_791/Fe3GeTe2.fdf\n",
"pairs = [\n",
" # isotropic should be -82 meV\n",
" dict(ai=0, aj=1, Ruc=np.array([0, 0, 0])),\n",
" dict(ai=1, aj=2, Ruc=np.array([0, 0, 0])),\n",
" # dict(ai=0, aj=2, Ruc=np.array([0, 0, 0])),\n",
"]\n",
"\n",
"\"\"\"\n",
"# human readable definition of magnetic entities ./Jij_for_Marci_6p45ang/CrBr.fdf\n",
"magnetic_entities = [\n",
" dict(atom=0, l=2),\n",
" dict(atom=1, l=2),\n",
" dict(atom=2, l=2),\n",
"]\n",
"# pair information ./Jij_for_Marci_6p45ang/CrBr.fdf\n",
"pairs = [\n",
" dict(ai=0, aj=1, Ruc=np.array([0, 0, 0])),\n",
" dict(ai=0, aj=2, Ruc=np.array([0, 0, 0])),\n",
" dict(ai=1, aj=2, Ruc=np.array([0, 0, 0])),\n",
" dict(ai=0, aj=1, Ruc=np.array([1, 0, 0])),\n",
" dict(ai=0, aj=2, Ruc=np.array([1, 0, 0])),\n",
" dict(ai=0, aj=1, Ruc=np.array([-1, 0, 0])),\n",
" dict(ai=0, aj=2, Ruc=np.array([-1, 0, 0])),\n",
" dict(ai=0, aj=1, Ruc=np.array([0, 1, 0])),\n",
" dict(ai=0, aj=2, Ruc=np.array([0, 1, 0])),\n",
" dict(ai=0, aj=1, Ruc=np.array([0, 1, 0])),\n",
" dict(ai=0, aj=2, Ruc=np.array([0, 1, 0])),\n",
"]\n",
"\"\"\"\n",
"\n",
"# Brilloun zone sampling and Green function contour integral\n",
"kset = 1000\n",
"kdirs = \"x\"\n",
"ebot = -13\n",
"eset = 500\n",
"esetp = 10000\n",
"\n",
"\n",
"# MPI parameters\n",
"comm = MPI.COMM_WORLD\n",
"size = comm.Get_size()\n",
"rank = comm.Get_rank()\n",
"root_node = 0\n",
"\n",
"simulation_parameters = dict(\n",
" path=\"Not yet specified.\",\n",
" outpath=outfile,\n",
" scf_xcf_orientation=scf_xcf_orientation,\n",
" ref_xcf_orientations=ref_xcf_orientations,\n",
" kset=kset,\n",
" kdirs=kdirs,\n",
" ebot=ebot,\n",
" eset=eset,\n",
" esetp=esetp,\n",
" parallel_size=size,\n",
")\n",
"\n",
"# digestion of the input\n",
"# read in hamiltonian\n",
"dh = fdf.read_hamiltonian()\n",
"simulation_parameters[\"cell\"] = fdf.read_geometry().cell\n",
"\n",
"# unit cell index\n",
"uc_in_sc_idx = dh.lattice.sc_index([0, 0, 0])\n",
"\n",
"if rank == root_node:\n",
" print_parameters(simulation_parameters)\n",
" times[\"setup_time\"] = timer()\n",
" print(f\"Setup done. Elapsed time: {times['setup_time']} s\")\n",
" print(\n",
" \"================================================================================================================================================================\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-12.806739\n",
"-0.01254111\n",
"xyz[-3:]: red, green, blue\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/danielpozsar/Documents/oktatás/elte/phd/grogu_project/.venv/lib/python3.9/site-packages/matplotlib/cbook.py:1762: ComplexWarning: Casting complex values to real discards the imaginary part\n",
" return math.isfinite(val)\n",
"/Users/danielpozsar/Documents/oktatás/elte/phd/grogu_project/.venv/lib/python3.9/site-packages/matplotlib/cbook.py:1398: ComplexWarning: Casting complex values to real discards the imaginary part\n",
" return np.asarray(x, float)\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABLwAAAGsCAYAAADXMb4GAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB3r0lEQVR4nO3deXxU9b3/8ffsM9lJgCwQdhAXXFFErNWKoLVWr3axtS1Vq+0VW5V7W6W32p9Wpdpby9Vaqf1Ze71XbeuvVm1rrUjdRUAQFUH2HZIAIZlkktnP74+ZTGayDEmY5Ewmr+fjwSMz55w5+c7XEU7e+Xw/x2IYhiEAAAAAAAAgR1jNHgAAAAAAAACQSQReAAAAAAAAyCkEXgAAAAAAAMgpBF4AAAAAAADIKQReAAAAAAAAyCkEXgAAAAAAAMgpBF4AAAAAAADIKXazB9BRNBrVvn37VFhYKIvFYvZwAADAIGEYhpqamlRVVSWrld/pZSOu8wAAQF/05Tov6wKvffv2qbq62uxhAACAQWr37t0aPXq02cNAF7jOAwAAR6M313lZF3gVFhZKir2JoqKijJ8/FArp5Zdf1pw5c+RwODJ+/sGO+UmP+UmP+UmP+UmP+UmP+UkvFArpueee07e+9a3EtQSyT39f5wEAgNzk9XpVXV3dq+u8rAu82srbi4qK+i3wysvLU1FRET8wdIH5SY/5SY/5SY/5SY/5SY/5Sa9tfiSxVC6L9fd1HgAAyG29uc6jwQUAAAAAAAByCoEXAAAAAAAAcgqBFwAAAAAAAHIKgRcAAAAAAAByCoEXAAAAAAAAcgqBFwAAAAAAAHIKgRcAAAAAAAByCoEXAAAAAAAAcgqBFwAAAAAAAHIKgRcAAAAAAAByCoEXAAAAAAAAcgqBFwAAAAAAAHIKgRcAAAAAAAByit3sAQAAgNxnGIaWbzskp82q6eNKzR4OctSWumbVNPo1pjRPY8ryzB4OAAAwERVeAACgX0Sjhmq9fv3fN7fp/J+/rq/+ZoX+8+WNZg8LOex372zX1x5boT+t2WP2UAAAgMmo8AIAABnhC4T10roaPf/BPm2qadLB5oDCUSOxP99p08QRBQpHorLb+J0bAAAA+g+BFwAAOGoPLdusX722Va2hSKd900YV6ytnjNHnT65SgYtLDwAAAPQ/rjoBAMBRe/TNbWoNRTR+eL7+5ZRROmfKCJUXuVSW75LTTjUXAAAABhaBFwAAOGr+eGXXk9+aoaoSj8mjAQAAwFDXq1+5RiIR3X777Ro/frw8Ho8mTpyon/zkJzKM9v4chmHojjvuUGVlpTwej2bPnq3NmzdnfOAAACA7RKOGQpHYtYCLai4AAABkgV5dld5333165JFH9Mtf/lIbNmzQfffdp/vvv18PPfRQ4pj7779fDz74oJYsWaIVK1YoPz9fc+fOld/vz/jgAQCA+YKRaOKxy2EzcSQAAABATK+WNL7zzju69NJLdfHFF0uSxo0bp6efflorV66UFKvuWrx4sX70ox/p0ksvlSQ98cQTKi8v13PPPacrr7yy0zkDgYACgUDiudfrlSSFQiGFQqG+vas02s7ZH+fOBcxPesxPesxPesxPesxPetk8P82t7WOyGhGFQkaao/tHNs4LAAAAzNOrwOuss87So48+qk2bNmnKlCn64IMP9NZbb+mBBx6QJG3fvl01NTWaPXt24jXFxcWaMWOGli9f3mXgtWjRIt15552dtr/88svKy8vr7fvpsaVLl/bbuXMB85Me85Me85Me85Me85NeNs5PY1CS7LLI0MsvvSSLxewRAQAAYKjrVeB12223yev1aurUqbLZbIpEIrrnnnt01VVXSZJqamokSeXl5SmvKy8vT+zraOHChVqwYEHiudfrVXV1tebMmaOioqJevZmeCIVCWrp0qS644AI5HI6Mn3+wY37SY37SY37SY37SY37Sy+b52XO4VVr9plwOmy6+eK4pYwiFQnr++edN+d4AAADIPr0KvP74xz/qySef1FNPPaXjjz9ea9eu1c0336yqqirNmzevTwNwuVxyuVydtjscjn69oO/v8w92zE96zE96zE96zE96zE962Tg/EcVaE7jstqwbGwAAAIamXgVe3//+93XbbbclliZOmzZNO3fu1KJFizRv3jxVVFRIkmpra1VZWZl4XW1trU4++eTMjRoAAGSNQDgiiTs0AgAAIHv06sq0paVFVmvqS2w2m6LR2N2Zxo8fr4qKCi1btiyx3+v1asWKFZo5c2YGhgsAALJNIBy7DnA5CLwAAACQHXpV4XXJJZfonnvu0ZgxY3T88cfr/fff1wMPPKBrrrlGkmSxWHTzzTfr7rvv1uTJkzV+/Hjdfvvtqqqq0mWXXdYf4wcAACYLhGKBl9NG4AUAAIDs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j0fTpk3Te++9l9hvGIbuuOMOVVZWyuPxaPbs2dq8eXNGBw0AAMwXSCxptJk8EgAAACBVrwKvw4cPa9asWXI4HPr73/+u9evX6+c//7mGDRuWOOb+++/Xgw8+qCVLlmjFihXKz8/X3Llz5ff7Mz54AABgnrYljVR4AQAAINvYe3Pwfffdp+rqaj3++OOJbePHj088NgxDixcv1o9+9CNdeumlkqQnnnhC5eXleu6553TllVdmaNgAAMBsbU3r6eEFAACAbNOrwOuFF17Q3Llz9cUvflGvv/66Ro0apRtuuEHXXXedJGn79u2qqanR7NmzE68pLi7WjBkztHz58i4Dr0AgoEAgkHju9XolSaFQSKFQqE9vKp22c/bHuXMB85Me85Me85Me85Me85NeNs5Piz82FqfNYvq4zP7+AAAAyC69Cry2bdumRx55RAsWLNAPf/hDrVq1St/73vfkdDo1b9481dTUSJLKy8tTXldeXp7Y19GiRYt05513dtr+8ssvKy8vrzfD65WlS5f227lzAfOTHvOTHvOTHvOTHvOTXjbNz5qDFkk2NTce1osvvmj2cAAAAICEXgVe0WhU06dP17333itJOuWUU7Ru3TotWbJE8+bN69MAFi5cqAULFiSee71eVVdXa86cOSoqKurTOdMJhUJaunSpLrjgAjkcjoyff7BjftJjftJjftJjftJjftLLxvlpXbNX2vyxqspH6rOfPdXUsYRCIT3//POmjgEAAADZo1eBV2VlpY477riUbccee6z+9Kc/SZIqKiokSbW1taqsrEwcU1tbq5NPPrnLc7pcLrlcrk7bHQ5Hv17Q9/f5BzvmJz3mJz3mJz3mJz3mJ71smp+ILJIkl8OWNWMCAAAApF7epXHWrFnauHFjyrZNmzZp7NixkmIN7CsqKrRs2bLEfq/XqxUrVmjmzJkZGC4AAMgWgVCsab3LYTN5JMiUvXv36mtf+5rKysrk8Xg0bdo0vffee4n9hmHojjvuUGVlpTwej2bPnq3NmzebOGIAAICu9SrwuuWWW/Tuu+/q3nvv1ZYtW/TUU0/p0Ucf1fz58yVJFotFN998s+6++2698MIL+uijj/SNb3xDVVVVuuyyy/pj/AAAwCSB+F0aXdylMSccPnxYs2bNksPh0N///netX79eP//5zzVs2LDEMffff78efPBBLVmyRCtWrFB+fr7mzp0rv99v4sgBAAA669WSxtNPP11//vOftXDhQt11110aP368Fi9erKuuuipxzA9+8AP5fD5df/31amho0Nlnn62XXnpJbrc744MHAADmCYQjkgi8csV9992n6upqPf7444lt48ePTzw2DEOLFy/Wj370I1166aWSpCeeeELl5eV67rnnenU3bgAAgP7W6yvUz33uc/roo4/k9/u1YcMGXXfddSn7LRaL7rrrLtXU1Mjv9+uVV17RlClTMjZgAACQHYKJCi+WNOaCF154QdOnT9cXv/hFjRw5Uqeccop+85vfJPZv375dNTU1mj17dmJbcXGxZsyYoeXLl3d5zkWLFqm4uDjxp7q6ut/fBwAAgNSHwAsAAEBqX9LopMIrJ2zbtk2PPPKIJk+erH/84x/613/9V33ve9/Tf//3f0uSampqJEnl5eUprysvL0/s62jhwoVqbGxM/Nm9e3f/vgkAAIC4Xi1pBAAAaMOSxtwSjUY1ffp03XvvvZKkU045RevWrdOSJUs0b968Pp2zu7txAwAA9DeuUAEAQJ+036WRy4lcUFlZqeOOOy5l27HHHqtdu3ZJkioqKiRJtbW1KcfU1tYm9gEAAGQLrlABAECfBOjhlVNmzZqljRs3pmzbtGmTxo4dKynWwL6iokLLli1L7Pd6vVqxYoVmzpw5oGMFAAA4EpY0AgCAPgnSwyun3HLLLTrrrLN077336ktf+pJWrlypRx99VI8++qik2I2Jbr75Zt19992aPHmyxo8fr9tvv11VVVW67LLLzB08AABABwReAACgT+jhlVtOP/10/fnPf9bChQt11113afz48Vq8eLGuuuqqxDE/+MEP5PP5dP3116uhoUFnn322XnrpJbndbhNHDgAA0BmBFwAA6JP2JY0EXrnic5/7nD73uc91u99iseiuu+7SXXfdNYCjAgAA6D2uUAEAQJ/QwwsAAADZigovAADQI3VNfv3u7R1atqFOtU1+NbSEJFHhBQAAgOxD4AUAADoxDENrdh3W3ga/DvuCWre3Uc+v3adgJJpyXGWxWyeMKjZplAAAAEDXCLwAAEAnv1+1Wwuf/ajT9uljh+mbs8bpmPJCjSh0qdjjkMViMWGEAAAAQPcIvAAAQIpo1NCjb2yTJB1fVaSxZXkaUeDS50+u0mljS00eHQAAAHBkBF4AACDFqxvrtP2gT0Vu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",
"text/plain": [
"<Figure size 1500x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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gjYAAAAAKICgDQAAAAAKIGgDAAAAgAII2gAAAACgAII2AAAAACiAoA0AAAAACiBoAwAAAIACCNoAAAAAoACCNgAAAAAogKANAAAAAAogaAMAAACAAgjaAAAAAKAAgjYAAAAAKICgDQAAAAAKIGgDAAAAgAII2gAAAACgAII2AAAAACiAoA0AAAAACiBoAwAAAIACCNoAAAAAoACCNgAAAAAogKANAAAAAAogaAMAAACAAgjaAAAAAKAAgjYAAAAAKICgDQAAAAAKIGgDAAAAgAII2gAAAACgAII2AAAAACiAoA0AAAAACiBoAwAAAIACCNoAAAAAoACCNgAAAAAogKANAAAAAAogaAMAAACAApQ1aLv33nszduzYDBkyJBUVFbn99tvbPX/rrbfm6KOPzvve975UVFRk0aJFHXrdm266KcOGDUt1dXUOOOCA3HXXXcUXD0C3p88AAABdqaxB2+rVqzN8+PDMnDlzk88fdthhueiiizr8mvfff39OOumknHzyyXnkkUcybty4jBs3Lr///e+LKhuAHkKfAQAAulJFqVQqlbuIJKmoqMhtt92WcePGbfDc0qVLs/vuu+eRRx7JiBEj3vF1xo8fn9WrV+fnP/9527qPfOQjGTFiRGbNmtWhWpqbm1NbW5umpqbU1NRszjQA2IjucFzVZwB6L8fVDdknAMXq6HG1112jbcGCBWloaGi3bsyYMVmwYMEmx6xZsybNzc3tFgDYGH0GAADYlF4XtDU2Nqaurq7durq6ujQ2Nm5yzPTp01NbW9u21NfXd3aZAPRQ+gwAALApvS5o2xJTp05NU1NT27J8+fJylwRAL6LPAADAtqFvuQso2qBBg7Jy5cp261auXJlBgwZtckxVVVWqqqo6uzQAegF9BgAA2JRed0bb6NGjM2/evHbr7r777owePbpMFQHQm+gzAADAppT1jLbXXnstixcvbnu8ZMmSLFq0KDvttFPe//735+WXX86yZcvy/PPPJ0mefPLJJOvPJnj7zIGJEydm6NChmT59epLk9NNPz+GHH55LL700xx13XK6//vo89NBD+eEPf9jFswOg3PQZAACgK5X1jLaHHnooI0eOzMiRI5MkU6ZMyciRI3PuuecmSe64446MHDkyxx13XJLkxBNPzMiRIzNr1qy211i2bFlWrFjR9vjQQw/NT3/60/zwhz/M8OHDc/PNN+f222/P/vvv34UzA6A70GcAAICuVFEqlUrlLqK7aW5uTm1tbZqamlJTU1PucgB6PMfV9uwPgGL1hOPqzJkzc8kll6SxsTHDhw/P5ZdfnkMOOWST28+YMSNXXHFFli1blp133jmf+tSnMn369FRXV3fo/XrCPgHoSTp6XO1112gDAADoTm644YZMmTIl06ZNy8MPP5zhw4dnzJgxeeGFFza6/U9/+tOcddZZmTZtWh5//PH86Ec/yg033JCvfe1rXVw5AJtL0AYAANCJLrvsspx66qmZPHly9t1338yaNSvbb799rr766o1uf//99+ejH/1oPv3pT2e33XbL0UcfnZNOOikPPvhgF1cOwOYStAEAAHSStWvXZuHChWloaGhbV1lZmYaGhixYsGCjYw499NAsXLiwLVh75plnctddd+XYY4/d5PusWbMmzc3N7RYAul5Z7zoKAADQm7300ktpaWlJXV1du/V1dXV54oknNjrm05/+dF566aUcdthhKZVKWbduXT73uc+941dHp0+fnm984xuF1g7A5nNGGwAAQDcyf/78XHjhhfnBD36Qhx9+OLfeemvuvPPOnH/++ZscM3Xq1DQ1NbUty5cv78KKAXibM9oAAAA6yc4775w+ffpk5cqV7davXLkygwYN2uiYc845JxMmTMgpp5ySJDnggAOyevXqfPazn83Xv/71VFZueL5EVVVVqqqqip8AAJvFGW0AAACdpF+/fjnooIMyb968tnWtra2ZN29eRo8evdExr7/++gZhWp8+fZIkpVKp84oFYKs5ow0AAKATTZkyJZMmTcrBBx+cQw45JDNmzMjq1aszefLkJMnEiRMzdOjQTJ8+PUkyduzYXHbZZRk5cmRGjRqVxYsX55xzzsnYsWPbAjcAuidBGwAAQCcaP358XnzxxZx77rlpbGzMiBEjMmfOnLYbJCxbtqzdGWxnn312KioqcvbZZ+e5557LLrvskrFjx+Zb3/pWuaYAQAdVlJx7vIHm5ubU1tamqakpNTU15S4HoMdzXG3P/gAoluPqhuwTgGJ19LjqGm0AAAAAUABBGwAAAAAUQNAGAAAAAAUQtAEAAABAAQRtAAAAAFAAQRsAAAAAFEDQBgAAAAAFELQBAAAAQAEEbQAAAABQAEEbAAAAABRA0AYAAAAABRC0AQAAAEABBG0AAAAAUABBGwAA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tAEAAABAAQRtAAAAAFAAQRsAAAAAFEDQBgAAAAAFELQBAAAAQAEEbQAAAABQAEEbAAAAABRA0AYAAAAABRC0AQAAAEABBG0AAAAAUABBGwAAAAAUQNAGAAAAAAUQtAEAAABAAQRtAAAAAFAAQRsAAAAAFEDQBgAAAAAFELQBAAAAQAEEbQAAAABQAEEbAAAAABRA0AYAAAAABRC0AQAAAEABBG0AAAAAUABBGwAAAAAUQNAGAAAAAAUQtAEAAABAAQRtAAAAAFAAQRsAAAAAFEDQBgAAAAAFELQBAAAAQAEEbQAAAABQAEEbAAAAABRA0AYAAAAABRC0AQAAAEABBG0AAAAAUIBuH7StWrUqZ5xxRnbdddf0798/hx56aH7729++45j58+fnQx/6UKqqqrLXXntl9uzZXVMsAD2SXgMAABSh2wdtp5xySu6+++5ce+21efTRR3P00UenoaEhzz333Ea3X7JkSY477rgceeSRWbRoUc4444yccsopmTt3bhdXDkBPodcAAABFqCiVSqVyF7Epb7zxRgYMGJCf/exnOe6449rWH3TQQTnmmGNywQUXbDDmq1/9au688878/ve/b1t34okn5tVXX82cOXM69L7Nzc2pra1NU1NTampqtn4iANu47nxcLUev6c77A6AnclzdkH0CUKyOHle79Rlt69atS0tLS6qrq9ut79+/f+67776NjlmwYEEaGhrarRszZkwWLFiwyfdZs2ZNmpub2y0AbBu6otfoMwAAsG3o1kHbgAEDMnr06Jx//vl5/vnn09LSkuuuuy4LFizIihUrNjqmsbExdXV17dbV1dWlubk5b7zxxkbHTJ8+PbW1tW1LfX194XMBoHvqil6jzwAAwLahWwdtSXLttdemVCpl6NChqaqqyve+972cdNJJqawsrvSpU6emqampbVm+fHlhrw1A99fZvUafAQCAbUPfchfwbvbcc8/86le/yurVq9Pc3JzBgwdn/Pjx2WOPPTa6/aBBg7Jy5cp261auXJmampr0799/o2OqqqpSVVVVeO0A9Ayd3Wv0GQAA2DZ0+zPa3vae97wngwcPziuvvJK5c+fm+OOP3+h2o0ePzrx589qtu/vuuzN69OiuKBOAHkyvAQAAtka3D9rmzp2bOXPmZMmSJbn77rtz5JFHZtiwYZk8eXKS9V/HmThxYtv2n/vc5/LM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nXbaaW2PW1paSkOGDClNnz59o9v//d//fem4445rt27UqFGlf/7nf+7UOru7zd2PP/7xj0u1tbVdVF3Pk6R02223veM2X/nKV0r77bdfu3Xjx48vjRkzphMr61k6sh9/+ctflpKUXnnllS6piW3PttBnNneOf2ndunWlAQMGlH7yk590VolbbUvmuG7dutKhhx5auuqqq0qTJk0qHX/88V1Q6ZbZ3PldccUVpT322KO0du3aripxq23uHE877bTSxz/+8XbrpkyZUvroRz/aqXUWxe8S245toc90BZ9niuc4VAyfacrLGW2bae3atVm4cGEaGhra1lVWVqahoSELFizY6JgFCxa02z5JxowZs8nttwVbsh+T5LXXXsuuu+6a+vr6HH/88Xnssce6otxew89isUaMGJHBgwfnqKOOym9+85tyl0MvsS30mS3tAf/T66+/nrfeeis77bRTZ5W5VbZ0jt/85jczcODAnHzyyV1R5hbbkvndcccdGT16dE477bTU1dVl//33z4UXXpiWlpauKnuzbMkcDz300CxcuLDtq2PPPPNM7rrrrhx77LFdUnNX6GnHGza0LfSZruDzTPn4eSyWzzTFE7RtppdeeiktLS2pq6trt76urm6T32VubGzcrO23BVuyH/fee+9cffXV+dnPfpbrrrsura2tOfTQQ/OnP/2pK0ruFTb1s9jc3Jw33nijTFX1PIMHD86sWbNyyy235JZbbkl9fX2OOOKIPPzww+UujV5gW+gzWzLHv/TVr341Q4YM2eAX7e5iS+Z433335Uc/+lGuvPLKrihxq2zJ/J555pncfPPNaWlpyV133ZVzzjknl156aS644IKuKHmzbckcP/3pT+eb3/xmDjvssGy33XbZc889c8QRR3Trr45uLr9L9HzbQp/pCj7PlI/jUDF8puk8fctdAHTU6NGjM3r06LbHhx56aPbZZ5/8+7//e84///wyVsa2Zu+9987ee+/d9vjQQw/N008/ne9+97u59tpry1gZbBu+/e1v5/rrr8/8+fN7zUWkV61alQkTJuTKK6/MzjvvXO5yOkVra2sGDhyYH/7wh+nTp08OOuigPPfcc7nkkksybdq0cpdXiPnz5+fCCy/MD37wg4waNSqLFy/O6aefnvPPPz/nnHNOucsDysznGboTn2k6j6BtM+28887p06dPVq5c2W79ypUrM2jQoI2OGTRo0GZtvy3Ykv34l7bbbruMHDkyixcv7owSe6VN/SzW1NSkf//+ZaqqdzjkkENy3333lbsMeoFtoc9sTQ/4zne+k29/+9u55557cuCBB3ZmmVtlc+f49NNPZ+nSpRk7dmzbutbW1iRJ37598+STT2bPPffs3KI3w5b8Gw4ePDjbbbdd+vTp07Zun332SWNjY9auXZt+/fp1as2ba0vmeM4552TChAk55ZRTkiQHHHBAVq9enc9+9rP5+te/nsrKnv9lEr9L9HzbQp/pCj7PlI/jUOfxmaYYPb/bd7F+/frloIMOyrx589rWtba2Zt68ee3+OvE/jR49ut32SXL33XdvcvttwZbsx7/U0tKSRx99NIMHD+6sMnsdP4udZ9GiRX4WKcS20Ge2tAdcfPHFOf/88zNnzpwcfPDBXVHqFtvcOQ4bNiyPPvpoFi1a1Lb87d/+bdsd1err67uy/He1Jf+GH/3oR7N48eK2ADFJ/vjHP2bw4MHdLmRLtmyOr7/++gZh2tvBYqlU6rxiu1BPO96woW2hz3QFn2fKx89j5/GZpiDlvhtDT3T99deXqqqqSrNnzy794Q9/KH32s58t7bDDDqXGxsZSqVQqTZgwoXTWWWe1bf+b3/ym1Ldv39J3vvOd0uOPP16aNm1aabvttis9+uij5ZpCt7C5+/Eb3/hGae7cuaWnn366tHDhwtKJJ55Yqq6uLj322GPlmkLZrVq1qvTII4+UHnnkkVKS0mWXXVZ65JFHSs8++2ypVCqVzjrrrNKECRPatn/mmWdK22+/fenLX/5y6fHHHy/NnDmz1KdPn9KcOXPKNYVuYXP343e/+93S7bffXnrqqadKjz76aOn0008vVVZWlu65555yTYFeZlvoM5s7x29/+9ulfv36lW6++ebSihUr2pZVq1aVawrvanPn+Je6+11HN3d+y5YtKw0YMKD0xS9+sfTkk0+Wfv7zn5cGDhxYuuCCC8o1hXe1uXOcNm1aacCAAaX/83/+T+mZZ54p/eIXvyjtueeepb//+78v1xTeld8ltk3bQp/pCj7PFMNxqBg+03QfgrYtdPnll5fe//73l/r161c65JBDSv/1X//V9tzhhx9emjRpUrvtb7zxxtIHP/jBUr9+/Ur77bdf6c477+ziirunzdmPZ5xxRtu2dXV1pWOPPbb08MMPl6Hq7uPtWzL/5fL2fps0aVLp8MMP32DMiBEjSv369SvtsccepR//+MddXnd3s7n78aKLLirtueeeperq6tJOO+1UOuKII0r/+Z//WZ7i6bW2hT6zOXPcddddN/r/02nTpnV94Zthc/8d/6fuHrSVSps/v/vvv780atSoUlVVVWmPPfYofetb3yqtW7eui6vePJszx7feeqt03nnntfWI+vr60he+8IXSK6+80vWFd5DfJbZd20Kf6Qo+z2w9x6Fi+EzTfVSUSr3kPHYAAAAAKCPXaAMAAACAAgjaAAAAAKAAgjYAAAAAKICgDQAAAAAKIGgDAAAAgAII2gAAAACgAII2AAAAACiAoA0AAAAACiBoAwAAAIACCNoAAAAAoACCNuhhXnzxxQwaNCgXXnhh27r7778//fr1y7x588pYGQC9xTXXXJP3ve99WbNmTbv148aNy4QJE8pUFQC9hc809GYVpVKpVO4igM1z1113Zdy4cbn//vuz9957Z8SIETn++ONz2WWXlbs0AHqBN954I4MHD86VV16ZE044IUnywgsvZOjQofnFL36RI488sswVAtDT+UxDbyVogx7qtNNOyz333JODDz44jz76aH7729+mqqqq3GUB0Et84QtfyNKlS3PXXXclSS677LLMnDkzixcvTkVFRZmrA6A38JmG3kjQBj3UG2+8kf333z/Lly/PwoULc8ABB5S7JAB6kUceeSQf/vCH8+yzz2bo0KE58MADc8IJJ+Scc84pd2kA9BI+09AbuUYb9FBPP/10nn/++bS2tmbp0qXlLgeAXmbkyJEZPnx4rrnmmixcuDCPPfZY/umf/qncZQHQi/hMQ2/kjDbogdauXZtDDjkkI0aMyN57750ZM2bk0UcfzcCBA8tdGgC9yBVXXJEZM2bkqKOOylNPPZW5c+eWuyQAegmfaeitBG3QA335y1/OzTffnN/97nd573vfm8MPPzy1tbX5+c9/Xu7SAOhFmpqaMmTIkKxbty7XXHNNxo8fX+6SAOglfKaht/LVUehh5s+fnxkzZuTaa69NTU1NKisrc+211+bXv/51rrjiinKXB0AvUltbm09+8pN573vfm3HjxpW7HAB6CZ9p6M2c0QYAwCZ94hOfyH777Zfvfe975S4FAKDbE7QBALCBV155JfPnz8+nPvWp/OEPf8jee+9d7pIAALq9vuUuAACA7mfkyJF55ZVXctFFFwnZAAA6yBltAAAAAFAAN0MAAAAAgAII2gAAAACgAII2AAAAACiAoA0AAAAACiBoAwAAAIACCNoAAAAAoACCNgAAAAAogKANAAAAAAogaAMAAACAAvz/e/gHozxT/KgAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1500x500 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.figure(figsize=(15, 5))\n",
"plt.subplot(121)\n",
"plt.plot(np.sort(dh.eig()))\n",
"plt.grid()\n",
"plt.subplot(122)\n",
"DOS = sisl.physics.electron.DOS(np.linspace(-15, 85, 50), dh.eig())\n",
"plt.plot(DOS, np.linspace(-15, 85, 50))\n",
"print(np.real(dh.eig()).min())\n",
"print(np.imag(dh.eig()).min())\n",
"\n",
"coords = dh.xyz[-3:]\n",
"\n",
"\n",
"plt.figure(figsize=(15, 5))\n",
"plt.subplot(131)\n",
"plt.scatter(coords[:, 0], coords[:, 2], color=[\"r\", \"g\", \"b\"])\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"z\")\n",
"plt.subplot(132)\n",
"plt.scatter(coords[:, 1], coords[:, 2], color=[\"r\", \"g\", \"b\"])\n",
"plt.xlabel(\"y\")\n",
"plt.ylabel(\"z\")\n",
"plt.subplot(133)\n",
"plt.scatter(coords[:, 0], coords[:, 1], color=[\"r\", \"g\", \"b\"])\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"y\")\n",
"print(\"xyz[-3:]: red, green, blue\")"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hamiltonian and exchange field rotated. Elapsed time: 5448.302713666 s\n",
"================================================================================================================================================================\n"
]
}
],
"source": [
"NO = dh.no # shorthand for number of orbitals in the unit cell\n",
"\n",
"# preprocessing Hamiltonian and overlap matrix elements\n",
"h11 = dh.tocsr(dh.M11r)\n",
"h11 += dh.tocsr(dh.M11i) * 1.0j\n",
"h11 = h11.toarray().reshape(NO, dh.n_s, NO).transpose(0, 2, 1).astype(\"complex128\")\n",
"\n",
"h22 = dh.tocsr(dh.M22r)\n",
"h22 += dh.tocsr(dh.M22i) * 1.0j\n",
"h22 = h22.toarray().reshape(NO, dh.n_s, NO).transpose(0, 2, 1).astype(\"complex128\")\n",
"\n",
"h12 = dh.tocsr(dh.M12r)\n",
"h12 += dh.tocsr(dh.M12i) * 1.0j\n",
"h12 = h12.toarray().reshape(NO, dh.n_s, NO).transpose(0, 2, 1).astype(\"complex128\")\n",
"\n",
"h21 = dh.tocsr(dh.M21r)\n",
"h21 += dh.tocsr(dh.M21i) * 1.0j\n",
"h21 = h21.toarray().reshape(NO, dh.n_s, NO).transpose(0, 2, 1).astype(\"complex128\")\n",
"\n",
"sov = (\n",
" dh.tocsr(dh.S_idx)\n",
" .toarray()\n",
" .reshape(NO, dh.n_s, NO)\n",
" .transpose(0, 2, 1)\n",
" .astype(\"complex128\")\n",
")\n",
"\n",
"\n",
"# Reorganization of Hamiltonian and overlap matrix elements to SPIN BOX representation\n",
"U = np.vstack(\n",
" [np.kron(np.eye(NO, dtype=int), [1, 0]), np.kron(np.eye(NO, dtype=int), [0, 1])]\n",
")\n",
"# This is the permutation that transforms ud1ud2 to u12d12\n",
"# That is this transforms FROM SPIN BOX to ORBITAL BOX => U\n",
"# the inverse transformation is U.T u12d12 to ud1ud2\n",
"# That is FROM ORBITAL BOX to SPIN BOX => U.T\n",
"\n",
"# From now on everything is in SPIN BOX!!\n",
"hh, ss = np.array(\n",
" [\n",
" U.T @ np.block([[h11[:, :, i], h12[:, :, i]], [h21[:, :, i], h22[:, :, i]]]) @ U\n",
" for i in range(dh.lattice.nsc.prod())\n",
" ]\n",
"), np.array(\n",
" [\n",
" U.T\n",
" @ np.block([[sov[:, :, i], sov[:, :, i] * 0], [sov[:, :, i] * 0, sov[:, :, i]]])\n",
" @ U\n",
" for i in range(dh.lattice.nsc.prod())\n",
" ]\n",
")\n",
"\n",
"\n",
"# symmetrizing Hamiltonian and overlap matrix to make them hermitian\n",
"for i in range(dh.lattice.sc_off.shape[0]):\n",
" j = dh.lattice.sc_index(-dh.lattice.sc_off[i])\n",
" h1, h1d = hh[i], hh[j]\n",
" hh[i], hh[j] = (h1 + h1d.T.conj()) / 2, (h1d + h1.T.conj()) / 2\n",
" s1, s1d = ss[i], ss[j]\n",
" ss[i], ss[j] = (s1 + s1d.T.conj()) / 2, (s1d + s1.T.conj()) / 2\n",
"\n",
"# identifying TRS and TRB parts of the Hamiltonian\n",
"TAUY = np.kron(np.eye(NO), tau_y)\n",
"hTR = np.array([TAUY @ hh[i].conj() @ TAUY for i in range(dh.lattice.nsc.prod())])\n",
"hTRS = (hh + hTR) / 2\n",
"hTRB = (hh - hTR) / 2\n",
"\n",
"# extracting the exchange field\n",
"traced = [spin_tracer(hTRB[i]) for i in range(dh.lattice.nsc.prod())] # equation 77\n",
"XCF = np.array(\n",
" [\n",
" np.array([f[\"x\"] for f in traced]),\n",
" np.array([f[\"y\"] for f in traced]),\n",
" np.array([f[\"z\"] for f in traced]),\n",
" ]\n",
") # equation 77\n",
"\n",
"# Check if exchange field has scalar part\n",
"max_xcfs = abs(np.array(np.array([f[\"c\"] for f in traced]))).max()\n",
"if max_xcfs > 1e-12:\n",
" warnings.warn(\n",
" f\"Exchange field has non negligible scalar part. Largest value is {max_xcfs}\"\n",
" )\n",
"\n",
"if rank == root_node:\n",
" times[\"H_and_XCF_time\"] = timer()\n",
" print(\n",
" f\"Hamiltonian and exchange field rotated. Elapsed time: {times['H_and_XCF_time']} s\"\n",
" )\n",
" print(\n",
" \"================================================================================================================================================================\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Site and pair dictionaries created. Elapsed time: 5448.330635 s\n",
"================================================================================================================================================================\n"
]
}
],
"source": [
"# for every site we have to store 3 Greens function (and the associated _tmp-s) in the 3 reference directions\n",
"for i, mag_ent in enumerate(magnetic_entities):\n",
" parsed = parse_magnetic_entity(dh, **mag_ent) # parse orbital indexes\n",
" magnetic_entities[i][\"orbital_indeces\"] = parsed\n",
" # calculate spin box indexes\n",
" magnetic_entities[i][\"spin_box_indeces\"] = blow_up_orbindx(parsed)\n",
" # if orbital is not set use all\n",
" if \"l\" not in mag_ent.keys():\n",
" mag_ent[\"l\"] = \"all\"\n",
" if isinstance(mag_ent[\"atom\"], int):\n",
" mag_ent[\"tags\"] = [\n",
" f\"[{mag_ent['atom']}]{dh.atoms[mag_ent['atom']].tag}({mag_ent['l']})\"\n",
" ]\n",
" mag_ent[\"xyz\"] = [dh.xyz[mag_ent[\"atom\"]]]\n",
" if isinstance(mag_ent[\"atom\"], list):\n",
" mag_ent[\"tags\"] = []\n",
" mag_ent[\"xyz\"] = []\n",
" # iterate over atoms\n",
" for atom_idx in mag_ent[\"atom\"]:\n",
" mag_ent[\"tags\"].append(\n",
" f\"[{atom_idx}]{dh.atoms[atom_idx].tag}({mag_ent['l']})\"\n",
" )\n",
" mag_ent[\"xyz\"].append(dh.xyz[atom_idx])\n",
"\n",
" # calculate size for Greens function generation\n",
" spin_box_shape = len(mag_ent[\"spin_box_indeces\"])\n",
"\n",
" mag_ent[\"energies\"] = [] # we will store the second order energy derivations here\n",
"\n",
" mag_ent[\"Gii\"] = [] # Greens function\n",
" mag_ent[\"Gii_tmp\"] = [] # Greens function for parallelization\n",
" # These will be the perturbed potentials from eq. 100\n",
" mag_ent[\"Vu1\"] = [list([]) for _ in range(len(ref_xcf_orientations))]\n",
" mag_ent[\"Vu2\"] = [list([]) for _ in range(len(ref_xcf_orientations))]\n",
" for i in ref_xcf_orientations:\n",
" # Greens functions for every quantization axis\n",
" mag_ent[\"Gii\"].append(\n",
" np.zeros((eset, spin_box_shape, spin_box_shape), dtype=\"complex128\")\n",
" )\n",
" mag_ent[\"Gii_tmp\"].append(\n",
" np.zeros((eset, spin_box_shape, spin_box_shape), dtype=\"complex128\")\n",
" )\n",
"\n",
"# for every site we have to store 2x3 Greens function (and the associated _tmp-s)\n",
"# in the 3 reference directions, because G_ij and G_ji are both needed\n",
"for pair in pairs:\n",
" # calculate size for Greens function generation\n",
" spin_box_shape_i = len(magnetic_entities[pair[\"ai\"]][\"spin_box_indeces\"])\n",
" spin_box_shape_j = len(magnetic_entities[pair[\"aj\"]][\"spin_box_indeces\"])\n",
" pair[\"tags\"] = []\n",
" for mag_ent in [magnetic_entities[pair[\"ai\"]], magnetic_entities[pair[\"aj\"]]]:\n",
" tag = \"\"\n",
" # get atoms of magnetic entity\n",
" atoms_idx = mag_ent[\"atom\"]\n",
" orbitals = mag_ent[\"l\"]\n",
"\n",
" # if magnetic entity contains one atoms\n",
" if isinstance(atoms_idx, int):\n",
" tag += f\"[{atoms_idx}]{dh.atoms[atoms_idx].tag}({orbitals})\"\n",
"\n",
" # if magnetic entity contains more than one atoms\n",
" if isinstance(atoms_idx, list):\n",
" # iterate over atoms\n",
" atom_group = \"{\"\n",
" for atom_idx in atoms_idx:\n",
" atom_group += f\"[{atom_idx}]{dh.atoms[atom_idx].tag}({orbitals})--\"\n",
" # end {} of the atoms in the magnetic entity\n",
" tag += atom_group[:-2] + \"}\"\n",
" pair[\"tags\"].append(tag)\n",
" pair[\"energies\"] = [] # we will store the second order energy derivations here\n",
"\n",
" pair[\"Gij\"] = [] # Greens function\n",
" pair[\"Gji\"] = []\n",
" pair[\"Gij_tmp\"] = [] # Greens function for parallelization\n",
" pair[\"Gji_tmp\"] = []\n",
" for i in ref_xcf_orientations:\n",
" # Greens functions for every quantization axis\n",
" pair[\"Gij\"].append(\n",
" np.zeros((eset, spin_box_shape_i, spin_box_shape_j), dtype=\"complex128\")\n",
" )\n",
" pair[\"Gij_tmp\"].append(\n",
" np.zeros((eset, spin_box_shape_i, spin_box_shape_j), dtype=\"complex128\")\n",
" )\n",
" pair[\"Gji\"].append(\n",
" np.zeros((eset, spin_box_shape_j, spin_box_shape_i), dtype=\"complex128\")\n",
" )\n",
" pair[\"Gji_tmp\"].append(\n",
" np.zeros((eset, spin_box_shape_j, spin_box_shape_i), dtype=\"complex128\")\n",
" )\n",
"\n",
"if rank == root_node:\n",
" times[\"site_and_pair_dictionaries_time\"] = timer()\n",
" print(\n",
" f\"Site and pair dictionaries created. Elapsed time: {times['site_and_pair_dictionaries_time']} s\"\n",
" )\n",
" print(\n",
" \"================================================================================================================================================================\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"k loop: 0%| | 0/1000 [00:00<?, ?it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"k set created. Elapsed time: 5448.339522166 s\n",
"================================================================================================================================================================\n"
]
}
],
"source": [
"kset = make_kset(dirs=kdirs, NUMK=kset) # generate k space sampling\n",
"wkset = np.ones(len(kset)) / len(kset) # generate weights for k points\n",
"kpcs = np.array_split(kset, size) # split the k points based on MPI size\n",
"kpcs[root_node] = tqdm(kpcs[root_node], desc=\"k loop\")\n",
"\n",
"if rank == root_node:\n",
" times[\"k_set_time\"] = timer()\n",
" print(f\"k set created. Elapsed time: {times['k_set_time']} s\")\n",
" print(\n",
" \"================================================================================================================================================================\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Rotations done perpendicular to quantization axis. Elapsed time: 5448.55170175 s\n",
"================================================================================================================================================================\n"
]
}
],
"source": [
"# this will contain the three hamiltonians in the reference directions needed to calculate the energy variations upon rotation\n",
"hamiltonians = []\n",
"\n",
"# iterate over the reference directions (quantization axes)\n",
"for i, orient in enumerate(ref_xcf_orientations):\n",
" # obtain rotated exchange field\n",
" R = RotMa2b(scf_xcf_orientation, orient[\"o\"])\n",
" rot_XCF = np.einsum(\"ij,jklm->iklm\", R, XCF)\n",
" rot_H_XCF = sum(\n",
" [np.kron(rot_XCF[i], tau) for i, tau in enumerate([tau_x, tau_y, tau_z])]\n",
" )\n",
" rot_H_XCF_uc = rot_H_XCF[uc_in_sc_idx]\n",
"\n",
" # obtain total Hamiltonian with the rotated exchange field\n",
" rot_H = (\n",
" hTRS + rot_H_XCF\n",
" ) # equation 76 #######################################################################################\n",
"\n",
" hamiltonians.append(\n",
" dict(orient=orient[\"o\"], H=rot_H)\n",
" ) # store orientation and rotated Hamiltonian\n",
"\n",
" # these are the rotations (for now) perpendicular to the quantization axis\n",
" for u in orient[\"vw\"]:\n",
" Tu = np.kron(np.eye(NO, dtype=int), tau_u(u)) # section 2.H\n",
"\n",
" Vu1 = 1j / 2 * commutator(rot_H_XCF_uc, Tu) # equation 100\n",
" Vu2 = 1 / 8 * commutator(commutator(Tu, rot_H_XCF_uc), Tu) # equation 100\n",
"\n",
" for mag_ent in magnetic_entities:\n",
" # fill up the perturbed potentials (for now) based on the on-site projections\n",
" mag_ent[\"Vu1\"][i].append(\n",
" Vu1[:, mag_ent[\"spin_box_indeces\"]][mag_ent[\"spin_box_indeces\"], :]\n",
" )\n",
" mag_ent[\"Vu2\"][i].append(\n",
" Vu2[:, mag_ent[\"spin_box_indeces\"]][mag_ent[\"spin_box_indeces\"], :]\n",
" )\n",
"\n",
"if rank == root_node:\n",
" times[\"reference_rotations_time\"] = timer()\n",
" print(\n",
" f\"Rotations done perpendicular to quantization axis. Elapsed time: {times['reference_rotations_time']} s\"\n",
" )\n",
" print(\n",
" \"================================================================================================================================================================\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Starting matrix inversions\n",
"Total number of k points: 1000\n",
"Number of energy samples per k point: 500\n",
"Total number of directions: 3\n",
"Total number of matrix inversions: 1500000\n",
"The shape of the Hamiltonian and the Greens function is 84x84=7056\n",
"Memory taken by a single Hamiltonian is: 0.015625 KB\n",
"Expected memory usage per matrix inversion: 0.5 KB\n",
"Expected memory usage per k point for parallel inversion: 750.0 KB\n",
"Expected memory usage on root node: 732.421875 MB\n",
"================================================================================================================================================================\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"k loop: 100%|██████████| 1000/1000 [39:28<00:00, 2.37s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Calculated Greens functions. Elapsed time: 7816.996438041 s\n",
"================================================================================================================================================================\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"if rank == root_node:\n",
" print(\"Starting matrix inversions\")\n",
" print(f\"Total number of k points: {kset.shape[0]}\")\n",
" print(f\"Number of energy samples per k point: {eset}\")\n",
" print(f\"Total number of directions: {len(hamiltonians)}\")\n",
" print(\n",
" f\"Total number of matrix inversions: {kset.shape[0] * len(hamiltonians) * eset}\"\n",
" )\n",
" print(f\"The shape of the Hamiltonian and the Greens function is {NO}x{NO}={NO*NO}\")\n",
" # https://stackoverflow.com/questions/70746660/how-to-predict-memory-requirement-for-np-linalg-inv\n",
" # memory is O(64 n**2) for complex matrices\n",
" memory_size = getsizeof(hamiltonians[0][\"H\"].base) / 1024\n",
" print(\n",
" f\"Memory taken by a single Hamiltonian is: {getsizeof(hamiltonians[0]['H'].base) / 1024} KB\"\n",
" )\n",
" print(f\"Expected memory usage per matrix inversion: {memory_size * 32} KB\")\n",
" print(\n",
" f\"Expected memory usage per k point for parallel inversion: {memory_size * len(hamiltonians) * eset * 32} KB\"\n",
" )\n",
" print(\n",
" f\"Expected memory usage on root node: {len(np.array_split(kset, size)[0]) * memory_size * len(hamiltonians) * eset * 32 / 1024} MB\"\n",
" )\n",
" print(\n",
" \"================================================================================================================================================================\"\n",
" )\n",
"\n",
"comm.Barrier()\n",
"# ----------------------------------------------------------------------\n",
"\n",
"# make energy contour\n",
"# we are working in eV now !\n",
"# and sisil shifts E_F to 0 !\n",
"cont = make_contour(emin=ebot, enum=eset, p=esetp)\n",
"eran = cont.ze\n",
"\n",
"# ----------------------------------------------------------------------\n",
"# sampling the integrand on the contour and the BZ\n",
"for k in kpcs[rank]:\n",
" wk = wkset[rank] # weight of k point in BZ integral\n",
" # iterate over reference directions\n",
" for i, hamiltonian_orientation in enumerate(hamiltonians):\n",
" # calculate Greens function\n",
" H = hamiltonian_orientation[\"H\"]\n",
" HK, SK = hsk(H, ss, dh.sc_off, k)\n",
" # Gk = inv(SK * eran.reshape(eset, 1, 1) - HK)\n",
"\n",
" # solve Greens function sequentially for the energies, because of memory bound\n",
" Gk = np.zeros(shape=(eset, HK.shape[0], HK.shape[1]), dtype=\"complex128\")\n",
" for j in range(eset):\n",
" Gk[j] = inv(SK * eran[j] - HK)\n",
"\n",
" # store the Greens function slice of the magnetic entities (for now) based on the on-site projections\n",
" for mag_ent in magnetic_entities:\n",
" mag_ent[\"Gii_tmp\"][i] += (\n",
" Gk[:, mag_ent[\"spin_box_indeces\"]][..., mag_ent[\"spin_box_indeces\"]]\n",
" * wk\n",
" )\n",
"\n",
" for pair in pairs:\n",
" # add phase shift based on the cell difference\n",
" phase = np.exp(1j * 2 * np.pi * k @ pair[\"Ruc\"].T)\n",
"\n",
" # get the pair orbital sizes from the magnetic entities\n",
" ai = magnetic_entities[pair[\"ai\"]][\"spin_box_indeces\"]\n",
" aj = magnetic_entities[pair[\"aj\"]][\"spin_box_indeces\"]\n",
"\n",
" # store the Greens function slice of the magnetic entities (for now) based on the on-site projections\n",
" pair[\"Gij_tmp\"][i] += Gk[:, ai][..., aj] * phase * wk\n",
" pair[\"Gji_tmp\"][i] += Gk[:, aj][..., ai] * phase * wk\n",
"\n",
"# summ reduce partial results of mpi nodes\n",
"for i in range(len(hamiltonians)):\n",
" for mag_ent in magnetic_entities:\n",
" comm.Reduce(mag_ent[\"Gii_tmp\"][i], mag_ent[\"Gii\"][i], root=root_node)\n",
"\n",
" for pair in pairs:\n",
" comm.Reduce(pair[\"Gij_tmp\"][i], pair[\"Gij\"][i], root=root_node)\n",
" comm.Reduce(pair[\"Gji_tmp\"][i], pair[\"Gji\"][i], root=root_node)\n",
"\n",
"if rank == root_node:\n",
" times[\"green_function_inversion_time\"] = timer()\n",
" print(\n",
" f\"Calculated Greens functions. Elapsed time: {times['green_function_inversion_time']} s\"\n",
" )\n",
" print(\n",
" \"================================================================================================================================================================\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Magnetic entities integrated.\n",
"Pairs integrated.\n",
"Magnetic parameters calculated.\n",
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 1000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 500\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -29.367092812942317\n",
"DMI: [-8.89792781e-01 4.16580540e+00 -3.59948517e-06]\n",
"Symmetric-anisotropy: [-4.56670448 1.17667365 0.33235705 4.15578143 -0.03089926]\n",
"Energies for debugging: \n",
"array([[-0.02819042, -0.00085889, 0.00092069, -0.02597706],\n",
" [-0.03690207, -0.00415578, 0.00417583, -0.0339338 ],\n",
" [-0.03160427, -0.00033236, -0.00033235, -0.03122101]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.0339338 , -0.03160427, -0.02819042])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.03393379729617979 -0.03122101431812066\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -74.98944973858333\n",
"DMI: [-6.82212886e+00 1.12891691e+01 5.77778279e-04]\n",
"Symmetric-anisotropy: [-1.03411109 0.63716653 -0.16031601 10.67952816 -0.32649278]\n",
"Energies for debugging: \n",
"array([[-0.07435228, -0.00649564, 0.00714862, -0.07459251],\n",
" [-0.07593353, -0.01067953, 0.01189881, -0.07602356],\n",
" [-0.0795701 , 0.00016089, 0.00015974, -0.07975458]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07602356, -0.0795701 , -0.07435228])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07602356083253432 -0.07975458355080561\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 2369.9501148750005 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.17246508400057792 s\n",
"Hamiltonian conversion and XC field extraction: 0.904 s\n",
"Pair and site datastructure creatrions: 0.028 s\n",
"k set cration and distribution: 0.009 s\n",
"Rotating XC potential: 0.212 s\n",
"Greens function inversion: 2368.445 s\n",
"Calculate energies and magnetic components: 0.180 s\n"
]
}
],
"source": [
"if rank == root_node:\n",
" # iterate over the magnetic entities\n",
" for tracker, mag_ent in enumerate(magnetic_entities):\n",
" # iterate over the quantization axes\n",
" for i, Gii in enumerate(mag_ent[\"Gii\"]):\n",
" storage = []\n",
" # iterate over the first and second order local perturbations\n",
" for Vu1, Vu2 in zip(mag_ent[\"Vu1\"][i], mag_ent[\"Vu2\"][i]):\n",
" # The Szunyogh-Lichtenstein formula\n",
" traced = np.trace((Vu2 @ Gii + 0.5 * Gii @ Vu1 @ Gii), axis1=1, axis2=2)\n",
" # evaluation of the contour integral\n",
" storage.append(np.trapz(-1 / np.pi * np.imag(traced * cont.we)))\n",
"\n",
" # fill up the magnetic entities dictionary with the energies\n",
" magnetic_entities[tracker][\"energies\"].append(storage)\n",
"\n",
" print(\"Magnetic entities integrated.\")\n",
"\n",
" # iterate over the pairs\n",
" for tracker, pair in enumerate(pairs):\n",
" # iterate over the quantization axes\n",
" for i, (Gij, Gji) in enumerate(zip(pair[\"Gij\"], pair[\"Gji\"])):\n",
" site_i = magnetic_entities[pair[\"ai\"]]\n",
" site_j = magnetic_entities[pair[\"aj\"]]\n",
"\n",
" storage = []\n",
" # iterate over the first order local perturbations in all possible orientations for the two sites\n",
" for Vui in site_i[\"Vu1\"][i]:\n",
" for Vuj in site_j[\"Vu1\"][i]:\n",
" # The Szunyogh-Lichtenstein formula\n",
" traced = np.trace((Vui @ Gij @ Vuj @ Gji), axis1=1, axis2=2)\n",
" # evaluation of the contour integral\n",
" storage.append(np.trapz(-1 / np.pi * np.imag(traced * cont.we)))\n",
" # fill up the pairs dictionary with the energies\n",
" pairs[tracker][\"energies\"].append(storage)\n",
"\n",
" print(\"Pairs integrated.\")\n",
"\n",
" # calculate magnetic parameters\n",
" for pair in pairs:\n",
" J_iso, J_S, D = calculate_exchange_tensor(pair)\n",
" pair[\"J_iso\"] = J_iso * sisl.unit_convert(\"eV\", \"meV\")\n",
" pair[\"J_S\"] = J_S * sisl.unit_convert(\"eV\", \"meV\")\n",
" pair[\"D\"] = D * sisl.unit_convert(\"eV\", \"meV\")\n",
"\n",
" print(\"Magnetic parameters calculated.\")\n",
"\n",
" times[\"end_time\"] = timer()\n",
" print(\n",
" \"##################################################################### GROGU OUTPUT #############################################################################\"\n",
" )\n",
"\n",
" print_parameters(simulation_parameters)\n",
" print_atoms_and_pairs(magnetic_entities, pairs)\n",
" print_runtime_information(times)\n",
"\n",
" # remove clutter from magnetic entities and pair information\n",
" for pair in pairs:\n",
" del pair[\"Gij\"]\n",
" del pair[\"Gij_tmp\"]\n",
" del pair[\"Gji\"]\n",
" del pair[\"Gji_tmp\"]\n",
" for mag_ent in magnetic_entities:\n",
" del mag_ent[\"Gii\"]\n",
" del mag_ent[\"Gii_tmp\"]\n",
" del mag_ent[\"Vu1\"]\n",
" del mag_ent[\"Vu2\"]\n",
" # create output dictionary with all the relevant data\n",
" results = dict(\n",
" parameters=simulation_parameters,\n",
" magnetic_entities=magnetic_entities,\n",
" pairs=pairs,\n",
" runtime=times,\n",
" )\n",
" # save dictionary\n",
" with open(outfile, \"wb\") as output_file:\n",
" pickle.dump(results, output_file)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"Magnetic entities integrated.\n",
"Pairs integrated.\n",
"Magnetic parameters calculated.\n",
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 1000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 500\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -29.367092812942317\n",
"DMI: [-8.89792781e-01 4.16580540e+00 -3.59948517e-06]\n",
"Symmetric-anisotropy: [-4.56670448 1.17667365 0.33235705 4.15578143 -0.03089926]\n",
"Energies for debugging: \n",
"array([[-0.02819042, -0.00085889, 0.00092069, -0.02597706],\n",
" [-0.03690207, -0.00415578, 0.00417583, -0.0339338 ],\n",
" [-0.03160427, -0.00033236, -0.00033235, -0.03122101]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.0339338 , -0.03160427, -0.02819042])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.03393379729617979 -0.03122101431812066\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -74.98944973858333\n",
"DMI: [-6.82212886e+00 1.12891691e+01 5.77778279e-04]\n",
"Symmetric-anisotropy: [-1.03411109 0.63716653 -0.16031601 10.67952816 -0.32649278]\n",
"Energies for debugging: \n",
"array([[-0.07435228, -0.00649564, 0.00714862, -0.07459251],\n",
" [-0.07593353, -0.01067953, 0.01189881, -0.07602356],\n",
" [-0.0795701 , 0.00016089, 0.00015974, -0.07975458]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07602356, -0.0795701 , -0.07435228])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07602356083253432 -0.07975458355080561\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 2369.9501148750005 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.17246508400057792 s\n",
"Hamiltonian conversion and XC field extraction: 0.904 s\n",
"Pair and site datastructure creatrions: 0.028 s\n",
"k set cration and distribution: 0.009 s\n",
"Rotating XC potential: 0.212 s\n",
"Greens function inversion: 2368.445 s\n",
"Calculate energies and magnetic components: 0.180 s"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (1614865498.py, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m Cell \u001b[0;32mIn[50], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m Magnetic entities integrated.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"Magnetic entities integrated.\n",
"Pairs integrated.\n",
"Magnetic parameters calculated.\n",
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 1000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 100\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -29.36445059067917\n",
"DMI: [-8.91784089e-01 4.16579134e+00 -3.59901207e-06]\n",
"Symmetric-anisotropy: [-4.5685362 1.18301202 0.3323615 4.15576769 -0.02915828]\n",
"Energies for debugging: \n",
"array([[-0.02818144, -0.00086263, 0.00092094, -0.02597893],\n",
" [-0.03690122, -0.00415577, 0.00417581, -0.03393299],\n",
" [-0.03160383, -0.00033237, -0.00033236, -0.03122058]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.03393299, -0.03160383, -0.02818144])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.03393298678958339 -0.031220578858898954\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -74.99083333178646\n",
"DMI: [-6.82222254e+00 1.12891474e+01 5.95795483e-04]\n",
"Symmetric-anisotropy: [-1.03214008 0.64046775 -0.16031723 10.67951504 -0.32709547]\n",
"Energies for debugging: \n",
"array([[-0.07435037, -0.00649513, 0.00714932, -0.07459916],\n",
" [-0.07593293, -0.01067952, 0.01189878, -0.07602297],\n",
" [-0.0795695 , 0.00016091, 0.00015972, -0.07975399]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07602297, -0.0795695 , -0.07435037])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07602297341278706 -0.07975398680085131\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 501.2763705420002 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.12531970899999578 s\n",
"Hamiltonian conversion and XC field extraction: 0.888 s\n",
"Pair and site datastructure creatrions: 0.062 s\n",
"k set cration and distribution: 0.024 s\n",
"Rotating XC potential: 0.245 s\n",
"Greens function inversion: 499.875 s\n",
"Calculate energies and magnetic components: 0.056 s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (1097899960.py, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m Cell \u001b[0;32mIn[40], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m Magnetic entities integrated.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"Magnetic entities integrated.\n",
"Pairs integrated.\n",
"Magnetic parameters calculated.\n",
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 1000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 50\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -29.359042196157713\n",
"DMI: [-8.93813379e-01 4.16574774e+00 -3.59758916e-06]\n",
"Symmetric-anisotropy: [-4.57147523 1.18770348 0.33237646 4.15572505 -0.02850636]\n",
"Energies for debugging: \n",
"array([[-0.02817134, -0.00086531, 0.00092232, -0.02597527],\n",
" [-0.03689861, -0.00415573, 0.00417577, -0.03393052],\n",
" [-0.03160252, -0.00033238, -0.00033237, -0.03121927]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.03393052, -0.03160252, -0.02817134])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.03393051742760642 -0.031219274782673133\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -74.98947011735306\n",
"DMI: [-6.82126017e+00 1.12890803e+01 6.51055432e-04]\n",
"Symmetric-anisotropy: [-1.03170277 0.64211178 -0.16032097 10.67947464 -0.32714492]\n",
"Energies for debugging: \n",
"array([[-0.07434736, -0.00649412, 0.00714841, -0.07459988],\n",
" [-0.07593108, -0.01067947, 0.01189869, -0.07602117],\n",
" [-0.07956766, 0.00016097, 0.00015967, -0.07975216]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07602117, -0.07956766, -0.07434736])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07602117288317486 -0.07975215648287909\n",
"\n",
"[3]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -75.04936117965987\n",
"DMI: [ 6.85701206e+00 -1.13051160e+01 6.39732773e-04]\n",
"Symmetric-anisotropy: [ -1.05318057 0.68103129 -0.16032 -10.70364791 0.31624841]\n",
"Energies for debugging: \n",
"array([[-0.07436833, 0.00654076, -0.00717326, -0.07467721],\n",
" [-0.07601601, 0.01070365, -0.01190658, -0.07610254],\n",
" [-0.07956796, 0.00016096, 0.00015968, -0.07975245]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07610254, -0.07956796, -0.07436833])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07610254174486064 -0.07975245001820208\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 261.890385875 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.1216103749998183 s\n",
"Hamiltonian conversion and XC field extraction: 1.045 s\n",
"Pair and site datastructure creatrions: 0.011 s\n",
"k set cration and distribution: 0.006 s\n",
"Rotating XC potential: 0.224 s\n",
"Greens function inversion: 260.450 s\n",
"Calculate energies and magnetic components: 0.033 s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (1463926646.py, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m Cell \u001b[0;32mIn[30], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m Magnetic entities integrated.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"Magnetic entities integrated.\n",
"Pairs integrated.\n",
"Magnetic parameters calculated.\n",
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 3000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 50\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -29.437239263932703\n",
"DMI: [-8.91096571e-01 4.16386016e+00 -3.68076797e-06]\n",
"Symmetric-anisotropy: [-4.68204753 1.22980695 0.33079224 4.15200152 -0.03180686]\n",
"Energies for debugging: \n",
"array([[-0.02820743, -0.00085929, 0.0009229 , -0.025985 ],\n",
" [-0.03707978, -0.004152 , 0.00417572, -0.03411929],\n",
" [-0.03167345, -0.0003308 , -0.00033079, -0.03129215]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.03411929, -0.03167345, -0.02820743])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.03411928679618277 -0.03129215156448653\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -74.98086703681366\n",
"DMI: [-6.81158085e+00 1.13265508e+01 5.68487147e-04]\n",
"Symmetric-anisotropy: [-1.03582622 0.63764125 -0.15959679 10.72110977 -0.32326625]\n",
"Energies for debugging: \n",
"array([[-0.07434323, -0.00648831, 0.00713485, -0.07458268],\n",
" [-0.07592777, -0.01072111, 0.01193199, -0.07601669],\n",
" [-0.07959289, 0.00016017, 0.00015903, -0.07977653]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07601669, -0.07959289, -0.07434323])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07601669325607426 -0.07977653333847946\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 808.34989875 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.1594020829999998 s\n",
"Hamiltonian conversion and XC field extraction: 0.995 s\n",
"Pair and site datastructure creatrions: 0.021 s\n",
"k set cration and distribution: 0.021 s\n",
"Rotating XC potential: 0.232 s\n",
"Greens function inversion: 806.884 s\n",
"Calculate energies and magnetic components: 0.037 s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"Magnetic entities integrated.\n",
"Pairs integrated.\n",
"Magnetic parameters calculated.\n",
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 2000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 50\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -29.313466612791018\n",
"DMI: [-8.85106686e-01 4.16843252e+00 -3.50602459e-06]\n",
"Symmetric-anisotropy: [-4.7530289 1.27630805 0.34469396 4.15760367 -0.03005581]\n",
"Energies for debugging: \n",
"array([[-0.02803716, -0.00085505, 0.00091516, -0.02583675],\n",
" [-0.03702114, -0.0041576 , 0.00417926, -0.0340665 ],\n",
" [-0.03178903, -0.0003447 , -0.00034469, -0.03139132]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.0340665 , -0.03178903, -0.02803716])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.03406649551707385 -0.031391324924774755\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -74.97640334609967\n",
"DMI: [-6.84069197e+00 1.12809486e+01 8.75098125e-04]\n",
"Symmetric-anisotropy: [-1.03102826 0.63307456 -0.16123618 10.67285449 -0.32447457]\n",
"Energies for debugging: \n",
"array([[-0.07434333, -0.00651622, 0.00716517, -0.07457845],\n",
" [-0.07591065, -0.01067285, 0.01188904, -0.07600743],\n",
" [-0.07959609, 0.00016211, 0.00016036, -0.07978159]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07600743, -0.07959609, -0.07434333])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07600743160328334 -0.07978158717380361\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 534.5927785000001 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.14542879100008577 s\n",
"Hamiltonian conversion and XC field extraction: 0.903 s\n",
"Pair and site datastructure creatrions: 0.016 s\n",
"k set cration and distribution: 0.014 s\n",
"Rotating XC potential: 0.242 s\n",
"Greens function inversion: 533.223 s\n",
"Calculate energies and magnetic components: 0.050 s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (577185453.py, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m Cell \u001b[0;32mIn[10], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m Magnetic entities integrated.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"Magnetic entities integrated.\n",
"Pairs integrated.\n",
"Magnetic parameters calculated.\n",
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 1000\n",
"k point directions: x\n",
"Ebot: -13\n",
"Eset: 50\n",
"Esetp: 10000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -29.359042196157713\n",
"DMI: [-8.93813379e-01 4.16574774e+00 -3.59758916e-06]\n",
"Symmetric-anisotropy: [-4.57147523 1.18770348 0.33237646 4.15572505 -0.02850636]\n",
"Energies for debugging: \n",
"array([[-0.02817134, -0.00086531, 0.00092232, -0.02597527],\n",
" [-0.03689861, -0.00415573, 0.00417577, -0.03393052],\n",
" [-0.03160252, -0.00033238, -0.00033237, -0.03121927]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.03393052, -0.03160252, -0.02817134])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.03393051742760642 -0.031219274782673133\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -74.98947011735306\n",
"DMI: [-6.82126017e+00 1.12890803e+01 6.51055432e-04]\n",
"Symmetric-anisotropy: [-1.03170277 0.64211178 -0.16032097 10.67947464 -0.32714492]\n",
"Energies for debugging: \n",
"array([[-0.07434736, -0.00649412, 0.00714841, -0.07459988],\n",
" [-0.07593108, -0.01067947, 0.01189869, -0.07602117],\n",
" [-0.07956766, 0.00016097, 0.00015967, -0.07975216]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.07602117, -0.07956766, -0.07434736])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.07602117288317486 -0.07975215648287909\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 272.760337666 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.13726933300000033 s\n",
"Hamiltonian conversion and XC field extraction: 0.970 s\n",
"Pair and site datastructure creatrions: 0.013 s\n",
"k set cration and distribution: 0.017 s\n",
"Rotating XC potential: 0.217 s\n",
"Greens function inversion: 271.373 s\n",
"Calculate energies and magnetic components: 0.034 s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (2508083104.py, line 2)",
"output_type": "error",
"traceback": [
"\u001b[0;36m Cell \u001b[0;32mIn[10], line 2\u001b[0;36m\u001b[0m\n\u001b[0;31m ================================================================================================================================================================\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"##################################################################### GROGU OUTPUT #############################################################################\n",
"================================================================================================================================================================\n",
"Input file: \n",
"Not yet specified.\n",
"Output file: \n",
"test.pickle\n",
"Number of nodes in the parallel cluster: 1\n",
"================================================================================================================================================================\n",
"Cell [Ang]: \n",
"[[ 3.79100000e+00 0.00000000e+00 0.00000000e+00]\n",
" [-1.89550000e+00 3.28310231e+00 0.00000000e+00]\n",
" [ 1.25954923e-15 2.18160327e-15 2.05700000e+01]]\n",
"================================================================================================================================================================\n",
"DFT axis: \n",
"[0 0 1]\n",
"Quantization axis and perpendicular rotation directions:\n",
"[1 0 0] --» [array([0, 1, 0]), array([0, 0, 1])]\n",
"[0 1 0] --» [array([1, 0, 0]), array([0, 0, 1])]\n",
"[0 0 1] --» [array([1, 0, 0]), array([0, 1, 0])]\n",
"================================================================================================================================================================\n",
"Parameters for the contour integral:\n",
"Number of k points: 20\n",
"k point directions: xy\n",
"Ebot: -15\n",
"Eset: 100\n",
"Esetp: 1000\n",
"================================================================================================================================================================\n",
"Atomic information: \n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[atom index]Element(orbitals) x [Ang] y [Ang] z [Ang] Sx Sy Sz Q Lx Ly Lz Jx Jy Jz\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) -7.339158738013707e-06 4.149278510690423e-06 11.657585837928032\n",
"\n",
"[4]Fe(2) -7.326987662162937e-06 4.158274523275774e-06 8.912422537596708\n",
"\n",
"[5]Fe(2) 1.8954667088117545 1.0943913231921656 10.285002698393109\n",
"\n",
"================================================================================================================================================================\n",
"Exchange [meV]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Magnetic entity1 Magnetic entity2 [i j k] d [Ang]\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"[3]Fe(2) [4]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -63.51146633376187\n",
"DMI: [-9.32966002e-01 -8.89800564e-04 -2.02862680e-06]\n",
"Symmetric-anisotropy: [-3.33721683e+00 1.29672703e+00 6.03687008e-04 -8.09695186e-04\n",
" -6.00702131e-06]\n",
"Energies for debugging: \n",
"array([[-6.22147393e-02, -9.32959995e-04, 9.32972009e-04,\n",
" -6.14709765e-02],\n",
" [-6.75755955e-02, 8.09695186e-07, -9.69905943e-07,\n",
" -6.68486832e-02],\n",
" [-5.36624493e-02, -6.05715634e-07, -6.01658381e-07,\n",
" -5.36632256e-02]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.06684868, -0.05366245, -0.06221474])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.06684868316242108 -0.053663225627735525\n",
"\n",
"[4]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -60.97776480541008\n",
"DMI: [-3.79946502e+00 6.15248803e+00 3.52644581e-03]\n",
"Symmetric-anisotropy: [0.09164177 0.11139034 0.07107136 6.24190815 0.03636875]\n",
"Energies for debugging: \n",
"array([[-6.08663745e-02, -3.83583377e-03, 3.76309627e-03,\n",
" -6.11807969e-02],\n",
" [-6.06347990e-02, -6.24190815e-03, 6.06306790e-03,\n",
" -6.08861230e-02],\n",
" [-5.98977554e-02, -6.75449092e-05, -7.45978008e-05,\n",
" -5.98154343e-02]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.06088612, -0.05989776, -0.06086637])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.060886123032493376 -0.05981543426889457\n",
"\n",
"[3]Fe(2) [5]Fe(2) [0 0 0] d [Ang] Not yet.\n",
"Isotropic: -60.9832595805832\n",
"DMI: [ 3.78505688e+00 -6.13845903e+00 3.52688440e-03]\n",
"Symmetric-anisotropy: [ 0.08120798 0.11261323 0.07107254 -6.23157554 -0.04249828]\n",
"Energies for debugging: \n",
"array([[-6.08706463e-02, 3.82755516e-03, -3.74255860e-03,\n",
" -6.11770808e-02],\n",
" [-6.06458648e-02, 6.23157554e-03, -6.04534251e-03,\n",
" -6.09020516e-02],\n",
" [-5.98977110e-02, -6.75456589e-05, -7.45994277e-05,\n",
" -5.98153841e-02]])\n",
"J_ii for debugging: (check if this is the same as in calculate_exchange_tensor)\n",
"array([-0.06090205, -0.05989771, -0.06087065])\n",
"Test J_xx = E(y,z) = E(z,y)\n",
"-0.060902051599344476 -0.05981538413498572\n",
"\n",
"================================================================================================================================================================\n",
"Runtime information: \n",
"Total runtime: 203.083672208 s\n",
"----------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Initial setup: 0.1483790410000001 s\n",
"Hamiltonian conversion and XC field extraction: 0.861 s\n",
"Pair and site datastructure creatrions: 0.017 s\n",
"k set cration and distribution: 0.022 s\n",
"Rotating XC potential: 0.247 s\n",
"Greens function inversion: 201.715 s\n",
"Calculate energies and magnetic components: 0.073 s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"========================================\n",
" \n",
"Atom Angstrom\n",
"# Label, x y z Sx Sy Sz #Q Lx Ly Lz Jx Jy Jz\n",
"--------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
"Te1 1.8955 1.0943 13.1698 -0.0000 0.0000 -0.1543 # 5.9345 -0.0000 0.0000 -0.0537 -0.0000 0.0000 -0.2080 \n",
"Te2 1.8955 1.0943 7.4002 0.0000 -0.0000 -0.1543 # 5.9345 0.0000 -0.0000 -0.0537 0.0000 -0.0000 -0.2080 \n",
"Ge3 -0.0000 2.1887 10.2850 0.0000 0.0000 -0.1605 # 3.1927 -0.0000 0.0000 0.0012 0.0000 0.0000 -0.1593 \n",
"Fe4 -0.0000 0.0000 11.6576 0.0001 -0.0001 2.0466 # 8.3044 0.0000 -0.0000 0.1606 0.0001 -0.0001 2.2072 \n",
"Fe5 -0.0000 0.0000 8.9124 -0.0001 0.0001 2.0466 # 8.3044 -0.0000 0.0000 0.1606 -0.0001 0.0001 2.2072 \n",
"Fe6 1.8955 1.0944 10.2850 0.0000 0.0000 1.5824 # 8.3296 -0.0000 -0.0000 0.0520 -0.0000 0.0000 1.6344 \n",
"==================================================================================================================================\n",
" \n",
"Exchange meV\n",
"--------------------------------------------------------------------------------\n",
"# at1 at2 i j k # d (Ang)\n",
"--------------------------------------------------------------------------------\n",
"Fe4 Fe5 0 0 0 # 2.7452\n",
"Isotropic -82.0854\n",
"DMI 0.12557 -0.00082199 6.9668e-08\n",
"Symmetric-anisotropy -0.60237 -0.83842 -0.00032278 -1.2166e-05 -3.3923e-05\n",
"--------------------------------------------------------------------------------\n",
"Fe4 Fe6 0 0 0 # 2.5835\n",
"Isotropic -41.9627\n",
"DMI 1.1205 -1.9532 0.0018386\n",
"Symmetric-anisotropy 0.26007 -0.00013243 0.12977 -0.069979 -0.042066\n",
"--------------------------------------------------------------------------------\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.9.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}