mini-pole


Namemini-pole JSON
Version 0.2 PyPI version JSON
download
home_pagehttps://github.com/Green-Phys/MiniPole
SummaryThe Python code provided implements the matrix-valued version of the Minimal Pole Method (MPM) as described in arXiv:2410.14000.
upload_time2024-12-05 00:34:58
maintainerNone
docs_urlNone
authorLei Zhang
requires_python>=3.8
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 1. MiniPole
The Python code provided implements the matrix-valued version of the Minimal Pole Method (MPM) as described in [arXiv:2410.14000](https://arxiv.org/abs/2410.14000), extending the scalar-valued method introduced in [Phys. Rev. B 110, 035154 (2024)](https://doi.org/10.1103/PhysRevB.110.035154).

The input of the simulation is the Matsubara data $G(i \omega_n)$ sampled on a uniform grid $\lbrace i\omega_{0}, i\omega_{1}, \cdots, i\omega_{n_{\omega}-1} \rbrace$, where  $\omega_n=\frac{(2n+1)\pi}{\beta}$ for fermions and $\frac{2n\pi}{\beta}$ for bosons, and $n_{\omega}$ is the total number of sampling points.

## i) The standard MPM is performed using the following command:

**p = MiniPole(G_w, w, n0 = "auto", n0_shift = 0, err = None, err_type = "abs", M = None, symmetry = False, G_symmetric = False, compute_const = False, plane = None, include_n0 = True, k_max = 999, ratio_max = 10)**
        
    Parameters
    ----------
    1. G_w : ndarray
        An (n_w, n_orb, n_orb) or (n_w,) array containing the Matsubara data.
    2. w : ndarray
        An (n_w,) array containing the corresponding real-valued Matsubara grid.
    3. n0 : int or str, default="auto"
        If "auto", n0 is automatically selected with an additional shift specified by n0_shift.
        If a non-negative integer is provided, n0 is fixed at that value.
    4. n0_shift : int, default=0
        The shift applied to the automatically determined n0.
    5. err : float
        Error tolerance for calculations.
    6. err_type : str, default="abs"
        Specifies the type of error: "abs" for absolute error or "rel" for relative error.
    7. M : int, optional
        The number of poles in the final result. If not specified, the precision from the first ESPRIT is used to extract poles in the second ESPRIT.
    8. symmetry : bool, default=False
        Determines whether to preserve up-down symmetry.
    9. G_symmetric : bool, default=False
        If True, the Matsubara data will be symmetrized such that G_{ij}(z) = G_{ji}(z).
    10. compute_const : bool, default=False
        Determines whether to compute the constant term in G(z) = sum_l Al / (z - xl) + const.
        If False, the constant term is fixed at 0.
    11. plane : str, optional
        Specifies whether to use the original z-plane or the mapped w-plane to compute pole weights.
    12. include_n0 : bool, default=True
        Determines whether to include the first n0 input points when weights are calculated in the z-plane.
    13. k_max : int, default=999
        The maximum number of contour integrals.
    14. ratio_max : float, default=10
        The maximum ratio of oscillation when automatically choosing n0.
    
    Returns
    -------
    Minimal pole representation of the given data.
    Pole weights are stored in p.pole_weight, a numpy array of shape (M, n_orb, n_orb).
    Shared pole locations are stored in p.pole_location, a numpy array of shape (M,).

## ii) The MPM-DLR algorithm is performed using the following command:

**p = MiniPoleDLR(Al_dlr, xl_dlr, beta, n0, nmax = None, err = None, err_type = "abs", M = None, symmetry = False, k_max=200, Lfactor = 0.4)**

    Parameters
    ----------
    1. Al_dlr (numpy.ndarray): DLR coefficients, either of shape (r,) or (r, n_orb, n_orb).
    2. xl_dlr (numpy.ndarray): DLR grid for the real frequency, an array of shape (r,).
    3. beta (float): Inverse temperature of the system (1/kT).
    4. n0 (int): Number of initial points to discard, typically in the range (0, 10).
    5. nmax (int): Cutoff for the Matsubara frequency when symmetry is False.
    6. err (float): Error tolerance for calculations.
    7. err_type (str): Specifies the type of error, "abs" for absolute error or "rel" for relative error.
    8. M (int): Specifies the number of poles to be recovered.
    9. symmetry (bool): Whether to impose up-down symmetry (True or False).
    10. k_max (int): Number of moments to be calculated.
    11. Lfactor (float): Ratio of L/N in the ESPRIT algorithm.
    
    Returns
    -------
    Minimal pole representation of the given data.
    Pole weights are stored in p.pole_weight, a numpy array of shape (M, n_orb, n_orb).
    Shared pole locations are stored in p.pole_location, a numpy array of shape (M,).

# 2. Examples

The scripts in the *examples* folder demonstrate the usage of MPM and MPM-DLR.

## i) MPM-DLR Algorithm

The *examples/MPM_DLR* folder contains scripts to recover the band structure of Si, as shown in the middle panel of Fig. 8 in [arXiv:2410.14000](https://arxiv.org/abs/2410.14000).

### Steps:

a) Download the input data file [Si_dlr.h5](https://drive.google.com/file/d/1_bNvbgOHewiujHYEcf-CCpGxlZP9cRw_/view?usp=drive_link) to the *examples/MPM_DLR/* directory.

b) Obtain the recovered poles by running **python3 cal_band_dlr.py --obs=`<option>`**, where **`<option>`** can be "S" (self-energy), "Gii" (scalar-valued Green's function), or "G" (matrix-valued Green's function).

c) Plot the band structure by running **python3 plt_band_dlr.py --obs=`<option>`**.

### Note:

a) Reference runtime on a single core of a laptop (using the M1 Max Apple chip as an example): 13 seconds for "Gii" and 160 seconds for both "G" and "S".

b) Parallel computation is supported in **cal_band_dlr.py** to speed up the process on multiple cores. Use the following command: **mpirun -n `<num_cores>` python3 cal_band_dlr.py --obs=`<option>`**, where **`<num_cores>`** is the number of cores and **`<option>`** is "S," "Gii," or "G".

c) Full Parameters for **cal_band_dlr.py**:

   - `--obs` (str): Observation type used in the script. Default is `"S"`.
   - `--n0` (int): Parameter $n_0$ as described in [arXiv:2410.14000](https://arxiv.org/abs/2410.14000).
   - `--err` (float): Error tolerance for computations. Default is `1.e-10`.
   - `--symmetry` (bool): Specifies whether to preserve up-down symmetry in calculations.

d) Full Parameters for **plt_band_dlr.py**:

   - `--obs` (str): Observation type used in the script. Default is `"S"`.
   - `--w_min` (float): Lower bound of the real frequency in eV. Default is `-12`.
   - `--w_max` (float): Upper bound of the real frequency in eV. Default is `12`.
   - `--n_w` (int): Number of frequencies between `w_min` and `w_max`. Default is `200`.
   - `--eta` (float): Broadening parameter. Default is `0.005`.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Green-Phys/MiniPole",
    "name": "mini-pole",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": null,
    "author": "Lei Zhang",
    "author_email": "lzphy@umich.edu",
    "download_url": null,
    "platform": null,
    "description": "# 1. MiniPole\nThe Python code provided implements the matrix-valued version of the Minimal Pole Method (MPM) as described in [arXiv:2410.14000](https://arxiv.org/abs/2410.14000), extending the scalar-valued method introduced in [Phys. Rev. B 110, 035154 (2024)](https://doi.org/10.1103/PhysRevB.110.035154).\n\nThe input of the simulation is the Matsubara data $G(i \\omega_n)$ sampled on a uniform grid $\\lbrace i\\omega_{0}, i\\omega_{1}, \\cdots, i\\omega_{n_{\\omega}-1} \\rbrace$, where  $\\omega_n=\\frac{(2n+1)\\pi}{\\beta}$ for fermions and $\\frac{2n\\pi}{\\beta}$ for bosons, and $n_{\\omega}$ is the total number of sampling points.\n\n## i) The standard MPM is performed using the following command:\n\n**p = MiniPole(G_w, w, n0 = \"auto\", n0_shift = 0, err = None, err_type = \"abs\", M = None, symmetry = False, G_symmetric = False, compute_const = False, plane = None, include_n0 = True, k_max = 999, ratio_max = 10)**\n        \n    Parameters\n    ----------\n    1. G_w : ndarray\n        An (n_w, n_orb, n_orb) or (n_w,) array containing the Matsubara data.\n    2. w : ndarray\n        An (n_w,) array containing the corresponding real-valued Matsubara grid.\n    3. n0 : int or str, default=\"auto\"\n        If \"auto\", n0 is automatically selected with an additional shift specified by n0_shift.\n        If a non-negative integer is provided, n0 is fixed at that value.\n    4. n0_shift : int, default=0\n        The shift applied to the automatically determined n0.\n    5. err : float\n        Error tolerance for calculations.\n    6. err_type : str, default=\"abs\"\n        Specifies the type of error: \"abs\" for absolute error or \"rel\" for relative error.\n    7. M : int, optional\n        The number of poles in the final result. If not specified, the precision from the first ESPRIT is used to extract poles in the second ESPRIT.\n    8. symmetry : bool, default=False\n        Determines whether to preserve up-down symmetry.\n    9. G_symmetric : bool, default=False\n        If True, the Matsubara data will be symmetrized such that G_{ij}(z) = G_{ji}(z).\n    10. compute_const : bool, default=False\n        Determines whether to compute the constant term in G(z) = sum_l Al / (z - xl) + const.\n        If False, the constant term is fixed at 0.\n    11. plane : str, optional\n        Specifies whether to use the original z-plane or the mapped w-plane to compute pole weights.\n    12. include_n0 : bool, default=True\n        Determines whether to include the first n0 input points when weights are calculated in the z-plane.\n    13. k_max : int, default=999\n        The maximum number of contour integrals.\n    14. ratio_max : float, default=10\n        The maximum ratio of oscillation when automatically choosing n0.\n    \n    Returns\n    -------\n    Minimal pole representation of the given data.\n    Pole weights are stored in p.pole_weight, a numpy array of shape (M, n_orb, n_orb).\n    Shared pole locations are stored in p.pole_location, a numpy array of shape (M,).\n\n## ii) The MPM-DLR algorithm is performed using the following command:\n\n**p = MiniPoleDLR(Al_dlr, xl_dlr, beta, n0, nmax = None, err = None, err_type = \"abs\", M = None, symmetry = False, k_max=200, Lfactor = 0.4)**\n\n    Parameters\n    ----------\n    1. Al_dlr (numpy.ndarray): DLR coefficients, either of shape (r,) or (r, n_orb, n_orb).\n    2. xl_dlr (numpy.ndarray): DLR grid for the real frequency, an array of shape (r,).\n    3. beta (float): Inverse temperature of the system (1/kT).\n    4. n0 (int): Number of initial points to discard, typically in the range (0, 10).\n    5. nmax (int): Cutoff for the Matsubara frequency when symmetry is False.\n    6. err (float): Error tolerance for calculations.\n    7. err_type (str): Specifies the type of error, \"abs\" for absolute error or \"rel\" for relative error.\n    8. M (int): Specifies the number of poles to be recovered.\n    9. symmetry (bool): Whether to impose up-down symmetry (True or False).\n    10. k_max (int): Number of moments to be calculated.\n    11. Lfactor (float): Ratio of L/N in the ESPRIT algorithm.\n    \n    Returns\n    -------\n    Minimal pole representation of the given data.\n    Pole weights are stored in p.pole_weight, a numpy array of shape (M, n_orb, n_orb).\n    Shared pole locations are stored in p.pole_location, a numpy array of shape (M,).\n\n# 2. Examples\n\nThe scripts in the *examples* folder demonstrate the usage of MPM and MPM-DLR.\n\n## i) MPM-DLR Algorithm\n\nThe *examples/MPM_DLR* folder contains scripts to recover the band structure of Si, as shown in the middle panel of Fig. 8 in [arXiv:2410.14000](https://arxiv.org/abs/2410.14000).\n\n### Steps:\n\na) Download the input data file [Si_dlr.h5](https://drive.google.com/file/d/1_bNvbgOHewiujHYEcf-CCpGxlZP9cRw_/view?usp=drive_link) to the *examples/MPM_DLR/* directory.\n\nb) Obtain the recovered poles by running **python3 cal_band_dlr.py --obs=`<option>`**, where **`<option>`** can be \"S\" (self-energy), \"Gii\" (scalar-valued Green's function), or \"G\" (matrix-valued Green's function).\n\nc) Plot the band structure by running **python3 plt_band_dlr.py --obs=`<option>`**.\n\n### Note:\n\na) Reference runtime on a single core of a laptop (using the M1 Max Apple chip as an example): 13 seconds for \"Gii\" and 160 seconds for both \"G\" and \"S\".\n\nb) Parallel computation is supported in **cal_band_dlr.py** to speed up the process on multiple cores. Use the following command: **mpirun -n `<num_cores>` python3 cal_band_dlr.py --obs=`<option>`**, where **`<num_cores>`** is the number of cores and **`<option>`** is \"S,\" \"Gii,\" or \"G\".\n\nc) Full Parameters for **cal_band_dlr.py**:\n\n   - `--obs` (str): Observation type used in the script. Default is `\"S\"`.\n   - `--n0` (int): Parameter $n_0$ as described in [arXiv:2410.14000](https://arxiv.org/abs/2410.14000).\n   - `--err` (float): Error tolerance for computations. Default is `1.e-10`.\n   - `--symmetry` (bool): Specifies whether to preserve up-down symmetry in calculations.\n\nd) Full Parameters for **plt_band_dlr.py**:\n\n   - `--obs` (str): Observation type used in the script. Default is `\"S\"`.\n   - `--w_min` (float): Lower bound of the real frequency in eV. Default is `-12`.\n   - `--w_max` (float): Upper bound of the real frequency in eV. Default is `12`.\n   - `--n_w` (int): Number of frequencies between `w_min` and `w_max`. Default is `200`.\n   - `--eta` (float): Broadening parameter. Default is `0.005`.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "The Python code provided implements the matrix-valued version of the Minimal Pole Method (MPM) as described in arXiv:2410.14000.",
    "version": "0.2",
    "project_urls": {
        "Homepage": "https://github.com/Green-Phys/MiniPole"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e280b4ccc703d97359613b8a87f37bb8e9478be9c3c0e1e84fcec261167fd4e4",
                "md5": "ec2fb81ae25551c5c5a92ac46833ab60",
                "sha256": "69ca37ba84907d329916fcb2c4804bce4b89a6b43d43739d239fff42fcc86374"
            },
            "downloads": -1,
            "filename": "mini_pole-0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ec2fb81ae25551c5c5a92ac46833ab60",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 17003,
            "upload_time": "2024-12-05T00:34:58",
            "upload_time_iso_8601": "2024-12-05T00:34:58.330470Z",
            "url": "https://files.pythonhosted.org/packages/e2/80/b4ccc703d97359613b8a87f37bb8e9478be9c3c0e1e84fcec261167fd4e4/mini_pole-0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-05 00:34:58",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Green-Phys",
    "github_project": "MiniPole",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "mini-pole"
}
        
Elapsed time: 0.38402s