From ad0f2b54b99ca5395e1dbcebb6f7410dfa54e4a6 Mon Sep 17 00:00:00 2001 From: aichhorn Date: Mon, 24 Feb 2020 15:42:28 +0100 Subject: [PATCH] Reshuffled doc on SOC and Basisrotations --- doc/documentation.rst | 12 +++- doc/guide/BasisRotation.rst | 24 ++++---- doc/guide/Sr2MgOsO6/Sr2MgOsO6.indmftpr | 21 +++++++ doc/guide/Sr2MgOsO6/Sr2MgOsO6.struct | 72 ++++++++++++++++++++++ doc/guide/Sr2MgOsO6/Sr2MgOsO6_SOC.indmftpr | 21 +++++++ doc/guide/Sr2RuO4.rst | 40 ------------ doc/guide/removeorbitals.rst | 6 ++ doc/guide/soc.rst | 41 ++++++++++++ 8 files changed, 183 insertions(+), 54 deletions(-) create mode 100644 doc/guide/Sr2MgOsO6/Sr2MgOsO6.indmftpr create mode 100644 doc/guide/Sr2MgOsO6/Sr2MgOsO6.struct create mode 100644 doc/guide/Sr2MgOsO6/Sr2MgOsO6_SOC.indmftpr delete mode 100644 doc/guide/Sr2RuO4.rst create mode 100644 doc/guide/removeorbitals.rst create mode 100644 doc/guide/soc.rst diff --git a/doc/documentation.rst b/doc/documentation.rst index 93119a5e..86e22f76 100644 --- a/doc/documentation.rst +++ b/doc/documentation.rst @@ -33,8 +33,16 @@ DFT+DMFT guide/dftdmft_singleshot guide/dftdmft_selfcons - guide/Sr2RuO4 - guide/BasisRotation + +Advanced Topics +--------------- + +.. toctree:: + :maxdepth: 2 + + guide/basisrotation + guide/soc + guide/removeorbitals Postprocessing -------------- diff --git a/doc/guide/BasisRotation.rst b/doc/guide/BasisRotation.rst index dda0a573..55826f5d 100644 --- a/doc/guide/BasisRotation.rst +++ b/doc/guide/BasisRotation.rst @@ -1,16 +1,15 @@ -.. _plovasp: +.. _basisrotation: Numerical Treatment of the Sign-Problem: Basis Rotations ======= -When performing calculations with off-diagonal complex hybridisation or local Hamiltonian, one is -often limited by the fermionic sign-problem. However, as the sign is no -physical observable, one can try to improve the calculation by rotating -to another basis. +When performing calculations with off-diagonal terms in the hybridisation function or in the local Hamiltonian, one is +often limited by the fermionic sign-problem slowing down the QMC calculations significantly. This can occur for instance if the crystal shows locally rotated or distorted cages, or when spin-orbit coupling is included. The examples for this are included in the :ref:`tutorials` of this documentation. -While the choice of basis to perform the calculation in can be chosen -arbitrarily, two choices which have shown good results are the basis -which diagonalizes the local Hamiltonian or the density matrix of then +However, as the fermonic sign in the QMC calculation is no +physical observable, one can try to improve the calculation by rotating +to another basis. While this basis can in principle be chosen arbitrarily, +two choices which have shown good results; name the basis sets that diagonalize the local Hamiltonian or the local density matrix of the system. The transformation matrix can be stored in the :class:`BlockStructure` and the @@ -21,7 +20,7 @@ and :meth:`put_Sigma` (see below). Finding the Transformation Matrix ----------------- -The :class:`TransBasis` class offers a simple mehod to calculate the transformation +The :class:`TransBasis` class offers a simple method to calculate the transformation matrices to a basis where either the local Hamiltonian or the density matrix is diagonal:: @@ -46,9 +45,10 @@ One can transform Green's functions manually using the :meth:`convert_gf` method Automatic transformation during the DMFT loop ----------------- -During a DMFT loop one is switching back and forth between Sumk-Space and Solver-Space -in each iteration. Once the block_structure.transformation property is set, this can be -done automatically:: +During a DMFT loop one is often switching back and forth between the unrotated basis (Sumk-Space) and the rotated basis that is used by the QMC Solver. However, this need not be done manually each time. Instead, +once the block_structure.transformation property is set as shown above, this is +done automatically, meaning that :class:`SumkDFT`'s :meth:`extract_G_loc` +and :meth:`put_Sigma` are doing the transformations by default:: for it in range(iteration_offset, iteration_offset + n_iterations): # every GF is in solver space here diff --git a/doc/guide/Sr2MgOsO6/Sr2MgOsO6.indmftpr b/doc/guide/Sr2MgOsO6/Sr2MgOsO6.indmftpr new file mode 100644 index 00000000..ed0a6b56 --- /dev/null +++ b/doc/guide/Sr2MgOsO6/Sr2MgOsO6.indmftpr @@ -0,0 +1,21 @@ +5 ! Nsort +2 1 1 4 2 ! Mult(Nsort) +3 ! lmax +complex ! choice of angular harmonics +0 0 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +cubic ! choice of angular harmonics +0 0 2 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +0 ! SO flag +complex ! choice of angular harmonics +0 0 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +complex ! choice of angular harmonics +0 0 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +complex +0 0 0 0 +0 0 0 0 +-0.088 0.43 ! 0.40 gives warnings, 0.043 gives occ 1.996 +0.04301 diff --git a/doc/guide/Sr2MgOsO6/Sr2MgOsO6.struct b/doc/guide/Sr2MgOsO6/Sr2MgOsO6.struct new file mode 100644 index 00000000..2078143b --- /dev/null +++ b/doc/guide/Sr2MgOsO6/Sr2MgOsO6.struct @@ -0,0 +1,72 @@ +Sr2MgOsO6 s-o calc. M|| 0.00 0.00 1.00 +B 5 87 + RELA + 10.507954 10.507954 14.968880 90.000000 90.000000 90.000000 +ATOM -1: X=0.00000000 Y=0.50000000 Z=0.75000000 + MULT= 2 ISPLIT=-2 + -1: X=0.50000000 Y=0.00000000 Z=0.75000000 +Sr 2+ NPT= 781 R0=.000010000 RMT= 2.50000 Z: 38.00000 +LOCAL ROT MATRIX: 1.0000000 0.0000000 0.0000000 + 0.0000000 1.0000000 0.0000000 + 0.0000000 0.0000000 1.0000000 +ATOM -2: X=0.00000000 Y=0.00000000 Z=0.00000000 + MULT= 1 ISPLIT=-2 +Os 6+ NPT= 781 R0=.000005000 RMT= 1.94 Z: 76.00000 +LOCAL ROT MATRIX: 1.0000000 0.0000000 0.0000000 + 0.0000000 1.0000000 0.0000000 + 0.0000000 0.0000000 1.0000000 +ATOM -3: X=0.00000000 Y=0.00000000 Z=0.50000000 + MULT= 1 ISPLIT=-2 +Mg 2+ NPT= 781 R0=.000100000 RMT= 1.89 Z: 12.00000 +LOCAL ROT MATRIX: 1.0000000 0.0000000 0.0000000 + 0.0000000 1.0000000 0.0000000 + 0.0000000 0.0000000 1.0000000 +ATOM -4: X=0.74270000 Y=0.21790000 Z=0.00000000 + MULT= 4 ISPLIT= 8 + -4: X=0.25730000 Y=0.78210000 Z=0.00000000 + -4: X=0.21790000 Y=0.25730000 Z=0.00000000 + -4: X=0.78210000 Y=0.74270000 Z=0.00000000 +O 2- NPT= 781 R0=.000100000 RMT= 1.58 Z: 8.00000 +LOCAL ROT MATRIX: 1.0000000 0.0000000 0.0000000 + 0.0000000 1.0000000 0.0000000 + 0.0000000 0.0000000 1.0000000 +ATOM -5: X=0.00000000 Y=0.00000000 Z=0.75390000 + MULT= 2 ISPLIT=-2 + -5: X=0.00000000 Y=0.00000000 Z=0.24610000 +O 2- NPT= 781 R0=.000100000 RMT= 1.58 Z: 8.00000 +LOCAL ROT MATRIX: 1.0000000 0.0000000 0.0000000 + 0.0000000 1.0000000 0.0000000 + 0.0000000 0.0000000 1.0000000 + 8 NUMBER OF SYMMETRY OPERATIONS + 0-1 0 0.00000000 + 1 0 0 0.00000000 + 0 0-1 0.00000000 + 1 +-1 0 0 0.00000000 + 0-1 0 0.00000000 + 0 0-1 0.00000000 + 2 + 1 0 0 0.00000000 + 0 1 0 0.00000000 + 0 0-1 0.00000000 + 3 + 0-1 0 0.00000000 + 1 0 0 0.00000000 + 0 0 1 0.00000000 + 4 + 0 1 0 0.00000000 +-1 0 0 0.00000000 + 0 0-1 0.00000000 + 5 +-1 0 0 0.00000000 + 0-1 0 0.00000000 + 0 0 1 0.00000000 + 6 + 1 0 0 0.00000000 + 0 1 0 0.00000000 + 0 0 1 0.00000000 + 7 + 0 1 0 0.00000000 +-1 0 0 0.00000000 + 0 0 1 0.00000000 + 8 diff --git a/doc/guide/Sr2MgOsO6/Sr2MgOsO6_SOC.indmftpr b/doc/guide/Sr2MgOsO6/Sr2MgOsO6_SOC.indmftpr new file mode 100644 index 00000000..253cda1a --- /dev/null +++ b/doc/guide/Sr2MgOsO6/Sr2MgOsO6_SOC.indmftpr @@ -0,0 +1,21 @@ +5 ! Nsort +2 1 1 4 2 ! Mult(Nsort) +3 ! lmax +complex ! choice of angular harmonics +0 0 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +cubic ! choice of angular harmonics +0 0 2 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +1 ! SO flag +complex ! choice of angular harmonics +0 0 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +complex ! choice of angular harmonics +0 0 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +complex +0 0 0 0 +0 0 0 0 +-0.088 0.43 ! 0.40 gives warnings, 0.043 gives occ 1.996 +0.04301 diff --git a/doc/guide/Sr2RuO4.rst b/doc/guide/Sr2RuO4.rst deleted file mode 100644 index a1e3c8b9..00000000 --- a/doc/guide/Sr2RuO4.rst +++ /dev/null @@ -1,40 +0,0 @@ -.. _Sr2RuO4: - -Spin-orbit coupled calculations (single-shot) -============================================= - -There are two main ways of including the spin-orbit coupling (SO) term into -DFT+DMFT calculations: - -- by performing a DFT calculation including SO and then doing a DMFT calculation on top, or -- by performing a DFT calculation without SO and then adding the SO term on the model level. - -Treatment of SO in DFT ----------------------- - -For now, TRIQS/DFTTools does only work with Wien2k when performing calculations with SO. -Of course, the general Hk framework is also possible. -But the way VASP treats SO is fundamentally different to the way Wien2k treats it and the interface does not handle that at the moment. - -Therefore, this guide assumes that Wien2k is being used. - -First, a Wien2k calculation including SO has to be performed. -For details, we refer the reader to the documentation of Wien2k. -The interface to Wien2k only works when the DFT calculation is done both spin-polarized and with SO (that means that you have to initialize the Wien2k calculation accordingly and then run with ``runsp -sp``). - -Performing the projection -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Note that the final ``x lapw2 -almd -so -up`` and ``x lapw2 -almd -so -dn`` have to be run *on a single core*, which implies that, before, ``x lapw1 -up``, ``x lapw2 -dn``, and ``x lapwso -up`` have to be run in single-core mode (once). - -In the ``case.indmftpr`` file, the spin-orbit flag has to be set to ``1`` for the correlated atoms. -For example, for the compound Sr\ :sub:`2`\ RuO\ :sub:`4`, with the struct file :download:`Sr2RuO4.struct `, we would e.g. use the ``indmftpr`` file :download:`found here `. -Then, ``dmftproj -sp -so`` has to be called. -As usual, it is important to check for warnings (e.g., about eigenvalues of the overlap matrix) in the output of ``dmftproj`` and adapt the window until these warnings disappear. - -Note that in presence of SO, it is not possible to project only onto the :math:`t_{2g}` subshell because it is not an irreducible representation. -A redesign of the orthonormalization procedure might happen in the long term, which might allow that. - -We strongly suggest using the :py:meth:`.dos_wannier_basis` functionality of the :py:class:`.SumkDFTTools` class (see :download:`calculate_dos_wannier_basis.py `) and compare the Wannier-projected orbitals to the original DFT DOS (they should be more or less equal). -Note that, with SO, there are usually off-diagonal elements of the spectral function, which can also be imaginary. -The imaginary part can be found in the third column of the files ``DOS_wann_...``. diff --git a/doc/guide/removeorbitals.rst b/doc/guide/removeorbitals.rst new file mode 100644 index 00000000..b9ddd384 --- /dev/null +++ b/doc/guide/removeorbitals.rst @@ -0,0 +1,6 @@ +.. _removeorbitals: + +Reducing the number of orbitals for the Solver +============================================== + +To be done... \ No newline at end of file diff --git a/doc/guide/soc.rst b/doc/guide/soc.rst new file mode 100644 index 00000000..bedaf13d --- /dev/null +++ b/doc/guide/soc.rst @@ -0,0 +1,41 @@ +.. _soc: + +Spin-orbit coupled calculations (single-shot) +============================================= + +There are two main ways of including the spin-orbit coupling (SOC) term into +DFT+DMFT calculations: + +- by performing a DFT calculation including SOC and then doing a DMFT calculation on top, or +- by performing a DFT calculation without SOC and then adding the SOC term on the model level. + +Treatment of SOC in DFT +----------------------- + +For now, TRIQS/DFTTools does only work with Wien2k when performing calculations with SO. +The treatment of SOC in the VASP package is fundamentally different to the way Wien2k treats it, and the interface does not handle that at the moment. +Therefore, this guide describes how to do an AOC calculation using the Wien2k DFT package. + +First, a Wien2k calculation including SOC has to be performed. +For details, we refer the reader to the documentation of Wien2k. As a matter of fact, we need the output for the DFT band structure for both spin directions explicitly. That means that one needs to do a spin-polarised DFT calculation with SOC, but, however, with magnetic moment set to zero. In the Wien2k initialisation procedure, one can choose for the option -nom when ``lstart`` is called. This means that the charge densities are initialised without magnetic splitting. The SOC calculation is then performed in a standard way as described in the Wien2k manual. + +Performing the projection +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Note that the final ``x lapw2 -almd -so -up`` and ``x lapw2 -almd -so -dn`` have to be run *on a single core*, which implies that, before, ``x lapw2 -up``, ``x lapw2 -dn``, and ``x lapwso -up`` have to be run in single-core mode (at least once). + +In the ``case.indmftpr`` file, the spin-orbit flag has to be set to ``1`` for the correlated atoms. +For example, for the compound Sr\ :sub:`2`\ MgOsO\ :sub:`6`, with the struct file :download:`Sr2MgOsO6.struct `, we would, e.g., use the ``indmftpr`` file :download:`found here `. +Then, ``dmftproj -sp -so`` has to be called. +As usual, it is important to check for warnings (e.g., about eigenvalues of the overlap matrix) in the output of ``dmftproj`` and adapt the window until these warnings disappear. + +Note that in presence of SOC, it is not possible to project only onto the :math:`t_{2g}` subshell because it is not an irreducible representation. + + +We strongly suggest using the :py:meth:`.dos_wannier_basis` functionality of the :py:class:`.SumkDFTTools` class (see :download:`calculate_dos_wannier_basis.py `) and compare the Wannier-projected orbitals to the original DFT DOS (they should be more or less equal). +Note that, with SOC, there are usually off-diagonal elements of the spectral function, which can also be imaginary. +The imaginary part can be found in the third column of the files ``DOS_wann_...``. + +After the projection, one can proceed with the DMFT calculation. However, two things need to be noted here. First, since the spin is not a good quantum number any more, there are off-diagonal elements in the hybridisation function and the local Hamiltonian coupling the two spin directions. This will eventually lead to a fermonic sign problem when QMC is used as a impurity solver. Second, although the :math:`e_{g}` subshell needs to be included in the projection, it can in many cases be neglected in the solution of the Anderson impurity model, after a transformation to a rotated local basis is done. This basis diagonalising the local Hamiltonian in the presence of SOC, is often called the numerical j-Basis. How rotations are performed is described in :ref:`basisrotation`, and the cutting of the orbitals in :ref:`removeorbitals`. + +A DMFT calculation including SOC for Sr2MgOsO6 is included in the :ref:`tutorials`.