Skip to content

Commit

Permalink
Merge pull request #92 from issp-center-dev/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
k-yoshimi authored Dec 28, 2020
2 parents becd32d + 4f344a6 commit d3d3597
Show file tree
Hide file tree
Showing 124 changed files with 532,739 additions and 34,213 deletions.
2 changes: 1 addition & 1 deletion .travis_scripts/deploy_docs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ elif [ "_${TRAVIS_BRANCH}" == "_master" ]; then
mkdir -p master
cp -r ${ROOTDIR}/dcore_doc/* master
git add master
elif [ -n ${TRAVIS_TAG}]; then
elif [ -n ${TRAVIS_TAG} ]; then
mkdir -p ${TRAVIS_TAG}
cp -r ${ROOTDIR}/dcore_doc/* ${TRAVIS_TAG}
git add ${TRAVIS_TAG}
Expand Down
2 changes: 1 addition & 1 deletion doc/conf.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ html_static_path = ['@CMAKE_SOURCE_DIR@/doc/_static']
html_sidebars = {'**': ['globaltoc.html', 'relations.html', 'searchbox.html']}

#html_title = "DMFT software"
html_logo = 'logo_dcore1.png'
#html_logo = 'logo_dcore1.png'

# no 'module' in the header
html_domain_indices = False
Expand Down
1 change: 1 addition & 0 deletions doc/reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ Reference Manual
reference/input
reference/output
impuritysolvers
tools
13 changes: 13 additions & 0 deletions doc/reference/gf_format.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
File format for Green's function and self-energy
==================================================

The structure of the HDF5 dataset for Green's function and self-energy are as follows.


.. csv-table::
:header: Data set, datatype, description
:widths: 8, 10, 20

__version, H5T_STRING, DCore_GfImFreq_v1
data, "H5T_IEEE_F64LE (2*niw, N, N, 2)", "The first index runs from -niw to niw. The last one indices the real and imaginary parts"
wn, "H5T_IEEE_F64LE (2*niw)", "Imaginary frequenceis wn = (2*n+1)*pi*T for n = -niw, -niw+1, ..., niw-1"
5 changes: 1 addition & 4 deletions doc/reference/output.rst
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,10 @@ Files that have empty Reference in this table are explained in the following.

All data are stored in ``dmft_out`` group.
The following list summarizes data structure in the ``dmft_out`` group:
See :doc:`gf_format` for the data structure of the Green's function and self-energy.

.. include:: dcore_out.txt

See
`TRIQS manual <https://triqs.ipht.cnrs.fr/1.x/reference/gfs/py/full.html#hdf5>`_
for the data structure of the Green's function and self-energy.

- solver_dependent_output

All solver-dependent output are stored in the working directory such as **work/imp_shell#_iter#** (#'s are replaced with numbers).
Expand Down
7 changes: 7 additions & 0 deletions doc/tools.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Tools
================

.. toctree::
:maxdepth: 1

tools/akw_converter/akw
104 changes: 104 additions & 0 deletions doc/tools/akw_converter/akw.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
A(k,w) converter
=========================================

DCore can generate four-dimensional data of :math:`A(\boldsymbol{k},\omega)` on a linear grid.
An auxiliary tool ``akw_converter`` converts these data into three-dimensional volumeric data with a fixed value of :math:`\omega` that is suitable for reading with existing 3D graphic softwares such as VESTA.

How to use
----------

The following steps should be done after all calculations are finished, namely, self-consistent calculation by ``dcore`` and even post calculations by ``dcore_post``.

#. **Modifying ini file**

A parameter ``nk_mesh`` is added to the ini file

::

[tools]
nk_mesh = 100

This parameter activates a grid calculation.
:math:`A(\boldsymbol{k},\omega)` is to be computed on a four-dimensional grid of size :math:`100^3 \times N_{\omega}`.
In order to reduce the data size, one could instead specify a set of 3 parameters as

::

[tools]
nk0_mesh = 100
nk1_mesh = 100
nk2_mesh = 4

In this case, :math:`k_z` is computed on 0, pi/2, pi and 3pi/3.
Note that the k-grid is generated in the *primitive* reciprocal space.
It is also highly recommended to reduce the number of frequency points. For example, if only the Fermi surface is of interest, one can set

::

Nomega = 3
omega_max = 1.0
omega_min = -1.0

Then, :math:`\omega=0` and two additional points are selected (``Nomega = 1`` is not allowed).
In this way, the data points are reduced to :math:`100^2 \times 4 \times 3`.

#. **Executing dcore\_post**

Now, ``dcore_post`` is (re-)executed by

::

dcore_post --np 4 --prefix post_grd/ square.ini

The number of processes in the ``--np`` option (4 above) should be changed according to your environment.
An output directory is specified by the ``--prefix`` option (default is 'post/').
In this case, the data are saved in 'post_grd' directory.
We recommend to use this option to have k-path data and k-grid data in separate directories.

The four-dimensional grid data are save in a file '*seed*\_akw\_mesh\_*sp*.dat', where *seed* is the seed name given in the ini file, and *sp* is the spin index ('up' and 'down' if spin-orbit coupling is not considered and 'ud' otherwise).

#. **Executing akw\_converter.py**

Finally, ``akw_converter`` is executed.
``akw_converter.py`` is installed in bin directory, where other executables such as ``dcore`` and ``dcore_post`` are installed.

::

akw_converter.py --omega 0.0 post_grd/square_akw_mesh_up.dat post_grd/akw_up.grd

The value of :math:`\omega` is given by the ``--omega`` option. If data do not exist just on this :math:`\omega`, :math:`A(\boldsymbol{k},\omega)` is interpolated using 2 points nearby (depending on the kind of interpolation method).
The first argument is the path to the four-dimensional data generated by ``dcore_post``. The second argument is the output file name. The default format is **GRD**, and the output filename should have extension 'grd'.

The full option of ``akw_converter`` can be seen by the command
::

akw_converter.py -h


Example
---------

As an example, we solve
:doc:`the square-lattice model in tutorial <../../tutorial/square/square>`.
The ini file is changed as below.

:download:`dmft_square_akw.ini <dmft_square_akw.ini>`

We use the CT-HYB solver to obtain a better spectrum.
The occupation number is changed from n=1 to n=0.8 to break the particle-hole symmetry.

A GRD file generated by the converter is opened by VESTA.
A two-dimensional plot is made by "Utilities --> 2D Data Display".
The plot clearly shows the Fermi surface in the square-lattice mode:

.. image:: vesta_2d_data_display.png
:width: 600
:align: center

We note that one needs to change some configuration to have the above plot.
One goes to "Slice" and change (1) "Distance from origin" from 0.5 to 0 to select :math:`k_z=0` plane, and (2) "Ranges of fractional coordinates" from [0:1] to [-0.5:0.5] to shift the Gamma point to the center of the plot.
The figure below shows the Slice panel:

.. image:: vesta_slice.png
:width: 300
:align: center
46 changes: 46 additions & 0 deletions doc/tools/akw_converter/dmft_square_akw.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
[model]
seedname = square
lattice = square
norb = 1
nelec = 0.8
t = -1.0
kanamori = [(4.0, 0.0, 0.0)]
nk = 32

[system]
T = 0.1
n_iw = 1024
prec_mu = 0.0001

[impurity_solver]
name = ALPS/cthyb-seg
exec_path{str} = /opt/ALPSCore-2.2.0/bin/alps_cthyb
cthyb.TEXT_OUTPUT{int} = 1
cthyb.MEASUREMENT_freq{int} = 1
MEASURE_gw{int} = 1
MAX_TIME{int} = 60
cthyb.N_MEAS{int} = 50
cthyb.THERMALIZATION{int}=100000
cthyb.SWEEPS{int}=100000000
cthyb.MEASURE_nn{int} = 1

[control]
max_step = 20
sigma_mix = 0.5
time_reversal = True

[tool]
broadening = 0.0
knode = [(G,0,0,0),(X,0.5,0,0),(M,0.5,0.5,0),(G,0,0,0)]
nk_line = 100
#----------------------- for k-path
# omega_max = 10.0
# omega_min = -10.0
# Nomega = 101
#----------------------- for k-grid
nk0_mesh = 100
nk1_mesh = 100
nk2_mesh = 4
omega_max = 1.0
omega_min = -1.0
Nomega = 3
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added doc/tools/akw_converter/vesta_slice.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
97 changes: 97 additions & 0 deletions doc/tutorial/afm.bak/afm.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
Antiferromagnetic state in 3D Hubbard model
============================================

In this tutorial, you will learn the following:

* How to define a lattice model using the Wannier90 interface
* How to calculate antiferromagnetic states
* How to set an initial guess for the self-energy

As a particular example, we consider the Hubbard model on a cubic lattice with nearest neighbor hopping of :math:`t=1`.
Within the single-site DMFT approximation, the model shows an antiferromagnetic transition at low temperature.
The transition temperature was estimated as :math:`T_\mathrm{c}/t\simeq 0.5` in `a previous study <https://link.aps.org/doi/10.1103/PhysRevB.72.060411>`_.
In this tutorial, we compute the antiferromagetic state below :math:`T_\mathrm{c}` using the ALPS/CT-HYB solver.
The complete input file is shown below.

.. literalinclude:: cubic.ini
:language: ini

Define lattice model
---------------------------

First, we define the hopping matrix of the 3D Hubbard model with a 2x2x2 unit cell.
Running :download:`mk_hr.py <mk_hr.py>` generates a text file (cubic_hr.dat) in the Wannier90 format.
The unit cell contains eight sites whose internal coordinates are (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1).

We now assume an antiferromagnetic order at :math:`q=(\pi, \pi, \pi)`.
To this end, we assign the eight sites (correlated shells) to two inequivalent shells by using the `corr_to_inequiv` parameter in the model section.

.. code-block:: bash
python mk_hr.py
Generate initial guess for self-energy
--------------------------------------

Second, we generate intial guesses for the (static) self-energies on the two inequivalent shells.
Running :download:`mk_init_se.py <mk_init_se.py>` generates `init_se_up.txt` and `init_se_down.txt`.

.. code-block:: bash
python mk_init_se.py
Self-consistent calculations
------------------------------
Now, DMFT calculations can be done as usual.

.. code-block:: bash
export MPIRUN="mpirun"
dcore_pre cubic.ini > output-pre
dcore cubic.ini --np 48 > output
dcore_post cubic.ini --np 48 > output-post
In the standard output of `dcore`, you will see that the magnetic moments converge to :math:`\simeq 0.43` (86 % of the saturated moment).

.. code-block:: bash
Density Matrix
Inequivalent Shell 0
Spin up
0.929-0.000j
Eigenvalues: [0.92877164]
Spin down
0.072-0.000j
Eigenvalues: [0.07229858]
Magnetic moment (only spin contribution, S=1/2 gives 0.5)
mx, my, mz : 0.0 0.0 0.428236533178
Inequivalent Shell 1
Spin up
0.078-0.000j
Eigenvalues: [0.0779467]
Spin down
0.930-0.000j
Eigenvalues: [0.92994248]
Magnetic moment (only spin contribution, S=1/2 gives 0.5)
mx, my, mz : 0.0 0.0 -0.425997888424
Inequivalent shell0

.. image:: check/iter_sigma-ish0.png
:width: 800
:align: center

Inequivalent shell1

.. image:: check/iter_sigma-ish1.png
:width: 800
:align: center
Binary file added doc/tutorial/afm.bak/check/iter_sigma-ish0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added doc/tutorial/afm.bak/check/iter_sigma-ish1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes.
File renamed without changes.
15 changes: 15 additions & 0 deletions doc/tutorial/afm.bak/mk_init_se.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from __future__ import print_function

import numpy
from itertools import product

norb = 1
mag = 1.0

with open('init_se_up.txt', 'w') as f:
for i, (isp, iorb) in enumerate(product(range(2), range(norb))):
print(isp, iorb, iorb, mag*(-1)**isp, 0.0, file=f)

with open('init_se_down.txt', 'w') as f:
for i, (isp, iorb) in enumerate(product(range(2), range(norb))):
print(isp, iorb, iorb, -mag*(-1)**isp, 0.0, file=f)
Loading

0 comments on commit d3d3597

Please sign in to comment.