From 0741936f014e79f4ab89a25d47da6d564fd87439 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Sat, 18 Apr 2020 02:13:59 +0900 Subject: [PATCH 01/49] Implement HPhi interface (WIP: generate model files) --- python/impurity_solvers/__init__.py | 2 + python/impurity_solvers/hphi.py | 242 ++++++++++++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 python/impurity_solvers/hphi.py diff --git a/python/impurity_solvers/__init__.py b/python/impurity_solvers/__init__.py index 2015a7c8..92964923 100644 --- a/python/impurity_solvers/__init__.py +++ b/python/impurity_solvers/__init__.py @@ -4,6 +4,7 @@ from .null_solver import NullSolver from .alps_cthyb_seg import ALPSCTHYBSEGSolver from .pomerol import PomerolSolver +from .hphi import HPhiSolver solver_classes = { 'TRIQS/cthyb': TRIQSCTHYBSolver, @@ -12,4 +13,5 @@ 'null': NullSolver, 'ALPS/cthyb-seg': ALPSCTHYBSEGSolver, 'pomerol': PomerolSolver, + 'HPhi': HPhiSolver, } diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py new file mode 100644 index 00000000..4a9959c5 --- /dev/null +++ b/python/impurity_solvers/hphi.py @@ -0,0 +1,242 @@ +# +# DCore -- Integrated DMFT software for correlated electrons +# Copyright (C) 2017 The University of Tokyo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +from __future__ import print_function + +import numpy +from itertools import product +import os + +from ..pytriqs_gf_compat import * +# from pytriqs.archive import HDFArchive +from pytriqs.operators import * + +from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, extract_bath_params +from .base import SolverBase + + + +class HPhiSolver(SolverBase): + + def __init__(self, beta, gf_struct, u_mat, n_iw=1025): + """ + Initialize the solver. + """ + + super(HPhiSolver, self).__init__(beta, gf_struct, u_mat, n_iw) + + def solve(self, rot, mpirun_command, params_kw): + """ + In addition to the parameters described in the docstring of SolverBase, + one can pass solver-dependent parameters using params_kw. For example, + exec_path : str, path to an executable, mandatory + dry_run : bool, actual computation is not performed if dry_run is True, optional + """ + + # (1) Set configuration for the impurity solver + # input: + # self.beta + # self.set_G0_iw + # self.u_mat + # + # Additionally, the following variables may be used: + # self.n_orb + # self.n_flavor + # self.gf_struct + # self.use_spin_orbit + + exec_path = os.path.expandvars(params_kw['exec_path']) + + # bath fitting + n_bath = params_kw.get('n_bath', 0) # 0 for Hubbard-I approximation + fit_params = {} + for key in ['fit_gtol',]: + if key in params_kw: + fit_params[key] = params_kw[key] + + n_site = self.n_orb + n_bath + +# ------------------------------------------------------------------------- + + with open('./namelist.def', 'w') as f: + print("""\ +ModPara modpara.def +CalcMod calcmod.def +LocSpin locspn.def +Trans trans.def +InterAll interall.def + """, file=f) + +# ------------------------------------------------------------------------- + + with open('./modpara.def', 'w') as f: + print("""\ +-------------------- +Model_Parameters 0 +-------------------- +HPhi_Cal_Parameters +-------------------- +CDataFileHead zvo +CParaFileHead zqp +-------------------- +Nsite {0} +Lanczos_max 2000 +initial_iv -1 +exct 1 +LanczosEps 14 +LanczosTarget 2 +LargeValue 4.000000000000000e+00 +NumAve 5 +ExpecInterval 20 +NOmega 200 +OmegaMax 1.200000000000000e+01 4.000000000000000e-02 +OmegaMin -1.200000000000000e+01 4.000000000000000e-02 +OmegaOrg 0.000000000000000e+00 0.000000000000000e+00\ +""".format(n_site), file=f) + +# ------------------------------------------------------------------------- + + with open('./calcmod.def', 'w') as f: + print("""\ +#CalcType = 0:Lanczos, 1:TPQCalc, 2:FullDiag, 3:CG, 4:Time-evolution +#CalcModel = 0:Hubbard, 1:Spin, 2:Kondo, 3:HubbardGC, 4:SpinGC, 5:KondoGC +#Restart = 0:None, 1:Save, 2:Restart&Save, 3:Restart +#CalcSpec = 0:None, 1:Normal, 2:No H*Phi, 3:Save, 4:Restart, 5:Restart&Save +CalcType 3 +CalcModel 3 +ReStart 0 +CalcSpec 0 +CalcEigenVec 0 +InitialVecType 0 +InputEigenVec 0 +OutputEigenVec 0 +InputHam 0 +OutputHam 0 +OutputExVec 0\ +""", file=f) + +# ------------------------------------------------------------------------- + + with open('./locspn.def', 'w') as f: + print("""\ +================================ +NlocalSpin 0 +================================ +========i_0LocSpn_1IteElc ====== +================================\ +""", file=f) + for i in range(n_site): + print("{0} 0".format(i), file=f) + +# ------------------------------------------------------------------------- + + # (1a) If H0 is necessary: + # Non-interacting part of the local Hamiltonian including chemical potential + # Make sure H0 is hermite. + # Ordering of index in H0 is spin1, spin1, ..., spin2, spin2, ... + h0_mat = extract_H0(self._G0_iw, self.block_names) + assert h0_mat.shape == (self.n_flavors, self.n_flavors) + + # (1b) If Delta(iw) and/or Delta(tau) are necessary: + # Compute the hybridization function from G0: + # Delta(iwn_n) = iw_n - H0 - G0^{-1}(iw_n) + # H0 is extracted from the tail of the Green's function. + self._Delta_iw = delta(self._G0_iw) + + bath_levels, bath_hyb = extract_bath_params(self._Delta_iw, self.beta, self.block_names, n_bath, **fit_params) + assert bath_levels.shape == (2*n_bath,) + assert bath_hyb.shape == (self.n_flavors, 2*n_bath) + + # number of hopping terms + n_trans = (2*self.n_orb)**2 # correlated sites + n_trans += (2*n_bath) # bath levels + n_trans += 2*(2*self.n_orb)*(2*n_bath) # hopping between correlated sites and bath sites + + with open('./trans.def', 'w') as f: + print("""\ +======================== +NTransfer {0} +======================== +========i_j_s_tijs====== +======================== +""".format(n_trans), file=f) + + # correlated sites + h0_isjs = h0_mat.reshape((2, self.n_orb, 2, self.n_orb)) + for s1, s2 in product(range(2), repeat=2): + for i1, i2 in product(range(self.n_orb), repeat=2): + t = -h0_isjs[s1, i1, s2, i2] + print(i1, s1, i2, s2, t.real, t.imag, file=f) + + # bath levels + bath_levels_is = bath_levels.reshape((2, n_bath)) + for s1 in range(2): + for i1 in range(n_bath): + j1 = self.n_orb + i1 + eps = -bath_levels_is[s1, i1] + print(j1, s1, j1, s1, eps.real, eps.imag, file=f) + + # hopping between correlated sites and bath sites + bath_hyb_is = bath_hyb.reshape((2, self.n_orb, 2, n_bath)) + for s1 in range(2): + for i1 in range(self.n_orb): + for s2 in range(2): + for i2 in range(n_bath): + j1 = i1 + j2 = self.n_orb + i2 + v = -bath_hyb_is[s1, i1, s2, i2] + print(j1, s1, j2, s2, v.real, v.imag, file=f) + print(j2, s2, j1, s1, v.real, -v.imag, file=f) + + # ------------------------------------------------------------------------- + + # (1c) Set U_{ijkl} for the solver + # for i, j, k, l in product(range(self.n_flavors), repeat=4): + # self.u_mat[i, j, k, l] + + n_inter = (2*self.n_orb)**4 + + with open('./interall.def', 'w') as f: + print("""\ +====================== +NInterAll {0} +====================== +========zInterAll===== +====================== +""".format(n_inter), file=f) + + # (1/2) U_{1234} c_1^+ c_2^+ c_4 c_3 + # = I_{1324} c_1^+ c_3 c_2^+ c_4 + + u_1234 = self.u_mat.reshape((2, self.n_orb, 2, self.n_orb, 2, self.n_orb, 2, self.n_orb)) + for s1, s2, s3, s4 in product(range(2), repeat=4): + for o1, o2, o3, o4 in product(range(self.n_orb), repeat=4): + u = u_1234[s1, o1, s2, o2, s3, o3, s4, o4] / 2. + if s1==s2==s3==s4 and o1==o2==o3==o4: + u = 0.0 + print(o1, s1, o3, s3, o2, s2, o4, s4, u.real, u.imag, file=f) + + # (2) Run a working horse + with open('./stdout.log', 'w') as output_f: + launch_mpi_subprocesses(mpirun_command, [exec_path, '-e', 'namelist.def'], output_f) + + # (3) Copy results into + # self._Sigma_iw + # self._Gimp_iw + + def name(self): + return "HPhi" From c09f77bd619dd38844a2b2581f1d8e64e91b5280 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Mon, 20 Apr 2020 17:48:40 +0900 Subject: [PATCH 02/49] Do not output zero matrix elements --- python/impurity_solvers/hphi.py | 148 ++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 65 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index 4a9959c5..2069bd9e 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -20,6 +20,7 @@ import numpy from itertools import product import os +from collections import namedtuple from ..pytriqs_gf_compat import * # from pytriqs.archive import HDFArchive @@ -63,6 +64,8 @@ def solve(self, rot, mpirun_command, params_kw): # bath fitting n_bath = params_kw.get('n_bath', 0) # 0 for Hubbard-I approximation + exct = params_kw.get('exct', 1) # number of states to be computed + fit_params = {} for key in ['fit_gtol',]: if key in params_kw: @@ -70,8 +73,7 @@ def solve(self, rot, mpirun_command, params_kw): n_site = self.n_orb + n_bath -# ------------------------------------------------------------------------- - + # Output namelist.def with open('./namelist.def', 'w') as f: print("""\ ModPara modpara.def @@ -79,10 +81,9 @@ def solve(self, rot, mpirun_command, params_kw): LocSpin locspn.def Trans trans.def InterAll interall.def - """, file=f) - -# ------------------------------------------------------------------------- +""", end="", file=f) + # Output modpara.def with open('./modpara.def', 'w') as f: print("""\ -------------------- @@ -96,7 +97,7 @@ def solve(self, rot, mpirun_command, params_kw): Nsite {0} Lanczos_max 2000 initial_iv -1 -exct 1 +exct {1} LanczosEps 14 LanczosTarget 2 LargeValue 4.000000000000000e+00 @@ -105,11 +106,10 @@ def solve(self, rot, mpirun_command, params_kw): NOmega 200 OmegaMax 1.200000000000000e+01 4.000000000000000e-02 OmegaMin -1.200000000000000e+01 4.000000000000000e-02 -OmegaOrg 0.000000000000000e+00 0.000000000000000e+00\ -""".format(n_site), file=f) - -# ------------------------------------------------------------------------- +OmegaOrg 0.000000000000000e+00 0.000000000000000e+00 +""".format(n_site, exct), end="", file=f) + # Output calcmod.def with open('./calcmod.def', 'w') as f: print("""\ #CalcType = 0:Lanczos, 1:TPQCalc, 2:FullDiag, 3:CG, 4:Time-evolution @@ -123,26 +123,26 @@ def solve(self, rot, mpirun_command, params_kw): CalcEigenVec 0 InitialVecType 0 InputEigenVec 0 -OutputEigenVec 0 +OutputEigenVec 1 InputHam 0 OutputHam 0 -OutputExVec 0\ -""", file=f) - -# ------------------------------------------------------------------------- +OutputExVec 0 +""", end="", file=f) + # Output locspn.def with open('./locspn.def', 'w') as f: print("""\ ================================ NlocalSpin 0 ================================ ========i_0LocSpn_1IteElc ====== -================================\ -""", file=f) +================================ +""", end="", file=f) + for i in range(n_site): print("{0} 0".format(i), file=f) -# ------------------------------------------------------------------------- + # ------------------------------------------------------------------------- # (1a) If H0 is necessary: # Non-interacting part of the local Hamiltonian including chemical potential @@ -161,11 +161,45 @@ def solve(self, rot, mpirun_command, params_kw): assert bath_levels.shape == (2*n_bath,) assert bath_hyb.shape == (self.n_flavors, 2*n_bath) - # number of hopping terms - n_trans = (2*self.n_orb)**2 # correlated sites - n_trans += (2*n_bath) # bath levels - n_trans += 2*(2*self.n_orb)*(2*n_bath) # hopping between correlated sites and bath sites - + # make hopping matrix + Transfer = namedtuple('Transfer', ('i1', 's1', 'i2', 's2', 't')) + transfer = [] + + # A. correlated sites + h0_isjs = h0_mat.reshape((2, self.n_orb, 2, self.n_orb)) + for s1, s2 in product(range(2), repeat=2): + for i1, i2 in product(range(self.n_orb), repeat=2): + t = -h0_isjs[s1, i1, s2, i2] + # print(i1, s1, i2, s2, t.real, t.imag, file=f) + if t != 0: + transfer.append(Transfer(i1, s1, i2, s2, t)) + + # B. bath levels + bath_levels_is = bath_levels.reshape((2, n_bath)) + for s1 in range(2): + for i1 in range(n_bath): + j1 = self.n_orb + i1 + eps = -bath_levels_is[s1, i1] + # print(j1, s1, j1, s1, eps.real, eps.imag, file=f) + if eps != 0: + transfer.append(Transfer(j1, s1, j1, s1, eps)) + + # C. hopping between correlated sites and bath sites + bath_hyb_is = bath_hyb.reshape((2, self.n_orb, 2, n_bath)) + for s1 in range(2): + for i1 in range(self.n_orb): + for s2 in range(2): + for i2 in range(n_bath): + j1 = i1 + j2 = self.n_orb + i2 + v = -bath_hyb_is[s1, i1, s2, i2] + # print(j1, s1, j2, s2, v.real, v.imag, file=f) + # print(j2, s2, j1, s1, v.real, -v.imag, file=f) + if v != 0: + transfer.append(Transfer(j1, s1, j2, s2, v)) + transfer.append(Transfer(j2, s2, j1, s1, numpy.conj(v))) + + # Output trans.def with open('./trans.def', 'w') as f: print("""\ ======================== @@ -173,34 +207,10 @@ def solve(self, rot, mpirun_command, params_kw): ======================== ========i_j_s_tijs====== ======================== -""".format(n_trans), file=f) - - # correlated sites - h0_isjs = h0_mat.reshape((2, self.n_orb, 2, self.n_orb)) - for s1, s2 in product(range(2), repeat=2): - for i1, i2 in product(range(self.n_orb), repeat=2): - t = -h0_isjs[s1, i1, s2, i2] - print(i1, s1, i2, s2, t.real, t.imag, file=f) - - # bath levels - bath_levels_is = bath_levels.reshape((2, n_bath)) - for s1 in range(2): - for i1 in range(n_bath): - j1 = self.n_orb + i1 - eps = -bath_levels_is[s1, i1] - print(j1, s1, j1, s1, eps.real, eps.imag, file=f) - - # hopping between correlated sites and bath sites - bath_hyb_is = bath_hyb.reshape((2, self.n_orb, 2, n_bath)) - for s1 in range(2): - for i1 in range(self.n_orb): - for s2 in range(2): - for i2 in range(n_bath): - j1 = i1 - j2 = self.n_orb + i2 - v = -bath_hyb_is[s1, i1, s2, i2] - print(j1, s1, j2, s2, v.real, v.imag, file=f) - print(j2, s2, j1, s1, v.real, -v.imag, file=f) +""".format(len(transfer)), end="", file=f) + + for t in transfer: + print(t.i1, t.s1, t.i2, t.s2, t.t.real, t.t.imag, file=f) # ------------------------------------------------------------------------- @@ -208,8 +218,24 @@ def solve(self, rot, mpirun_command, params_kw): # for i, j, k, l in product(range(self.n_flavors), repeat=4): # self.u_mat[i, j, k, l] - n_inter = (2*self.n_orb)**4 - + # make U matrix + InterAll = namedtuple('InterAll', ('i1', 's1', 'i2', 's2', 'i3', 's3', 'i4', 's4', 'U')) + interall = [] + + # (1/2) U_{1234} c_1^+ c_2^+ c_4 c_3 # Dcore + # = I_{1324} c_1^+ c_3 c_2^+ c_4 # Hphi + u_1234 = self.u_mat.reshape((2, self.n_orb, 2, self.n_orb, 2, self.n_orb, 2, self.n_orb)) + for s1, s2, s3, s4 in product(range(2), repeat=4): + for o1, o2, o3, o4 in product(range(self.n_orb), repeat=4): + u = u_1234[s1, o1, s2, o2, s3, o3, s4, o4] / 2. + if s1==s2==s3==s4 and o1==o2==o3==o4: + continue + # u = 0.0 + # print(o1, s1, o3, s3, o2, s2, o4, s4, u.real, u.imag, file=f) + if u != 0: + interall.append(InterAll(o1, s1, o3, s3, o2, s2, o4, s4, u)) + + # Output interall.def with open('./interall.def', 'w') as f: print("""\ ====================== @@ -217,18 +243,10 @@ def solve(self, rot, mpirun_command, params_kw): ====================== ========zInterAll===== ====================== -""".format(n_inter), file=f) - - # (1/2) U_{1234} c_1^+ c_2^+ c_4 c_3 - # = I_{1324} c_1^+ c_3 c_2^+ c_4 - - u_1234 = self.u_mat.reshape((2, self.n_orb, 2, self.n_orb, 2, self.n_orb, 2, self.n_orb)) - for s1, s2, s3, s4 in product(range(2), repeat=4): - for o1, o2, o3, o4 in product(range(self.n_orb), repeat=4): - u = u_1234[s1, o1, s2, o2, s3, o3, s4, o4] / 2. - if s1==s2==s3==s4 and o1==o2==o3==o4: - u = 0.0 - print(o1, s1, o3, s3, o2, s2, o4, s4, u.real, u.imag, file=f) +""".format(len(interall)), end="", file=f) + + for u in interall: + print(u.i1, u.s1, u.i2, u.s2, u.i3, u.s3, u.i4, u.s4, u.U.real, u.U.imag, file=f) # (2) Run a working horse with open('./stdout.log', 'w') as output_f: From ab3b06c3a3ff12778b07fdc6099f08b802ba4092 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Mon, 4 May 2020 16:44:28 +0900 Subject: [PATCH 03/49] Add a wrapper class for computing spectrum by HPhi --- python/impurity_solvers/hphi_spectrum.py | 210 +++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 python/impurity_solvers/hphi_spectrum.py diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py new file mode 100644 index 00000000..168f8e71 --- /dev/null +++ b/python/impurity_solvers/hphi_spectrum.py @@ -0,0 +1,210 @@ +import subprocess +import itertools +import numpy as np +import os +import sys + +class CalcSpectrum: + def __init__(self, filename, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): + self.filename = filename + self.T_list = T_list + self.exct = exct + self.header = header + self.output_dir = output_dir + self.nomega = 0 + self.path_to_HPhi = path_to_HPhi + + def Make_Spectrum_Input(self, spectrum_type="single"): + for idx in range(self.exct): + with open("calcmod.def") as f: + lines = f.readlines() + with open("calcmod_ex.def", "w") as fex: + for line in lines: + words = line.split() + if words[0] == "CalcSpec" or words[0] == "OutputExVec" or words[0] == "OutputEigenVec": + continue + fex.write(line) + fex.write("CalcSpec 1\n") + with open("namelist.def") as f: + lines = f.readlines() + with open("namelist_ex_{}.def".format(idx), "w") as fex: + for line in lines: + words = line.split() + if len(words) == 0: + continue + if words[0] == "CalcMod" or words[0] == "SpectrumVec": + continue + if words[0] == "SingleExcitation": + continue + if words[0] == "PairExciation": + continue + fex.write(line) + + fex.write("CalcMod calcmod_ex.def\n") + fex.write("SpectrumVec {}_eigenvec_{}\n".format(self.header, idx)) + if spectrum_type == "single": + fex.write("SingleExcitation single_ex.def\n") + elif spectrum_type == "pair": + fex.write("PairExcitation pair_ex.def\n") + + with open("modpara.def", "r") as fr: + lines = fr.readlines() + for line in lines: + words = line.split() + if words[0] == "NOmega": + self.nomega = int(words[1]) + if self.nomega == 0: + print("Error: Please set NOmega in modpara file") + sys.exit(1) + + def read_spectrum(self): + spectrum_dict={} + frequencies =[] + for idx in range(self.exct): + path_to_DG = os.path.join(self.output_dir, "{}_DynamicalGreen_{}.dat".format(header,idx)) + spectrum = np.loadtxt(path_to_DG) + spectrum_dict[idx] = spectrum[:,2] + 1J*spectrum[:,3] + if idx == 0 : + frequencies = spectrum[:, 0] + 1J*spectrum[:, 1] + self.spectrums_dict = spectrum_dict + self.frequencies = frequencies + return spectrum_dict + + def get_energies(self): + energy_list = [] + with open(os.path.join(output_dir, "{}_energy.dat".format(header))) as f: + lines = f.readlines() + for line in lines: + words = line.split() + if len(words) != 0 and words[0] == "Energy": + energy_list.append(float(words[1])) + self.energy_list = energy_list + self.ene_min = energy_list[0] + self.ene_max = energy_list[len(energy_list)-1] + for T in T_list: + eta_ene = np.exp(-(self.ene_max-self.ene_min)/T) + print("T = {}: exp[-beta(ene_max-ene_mix)] = {}".format(T, eta_ene)) + if eta_ene > eta: + print("Warning: At T = {}, eta_ene is larger than eta.".format(T)) + return energy_list + + def _calc_Z(self, T): + Z = 0 + for ene in self.energy_list: + ene_diff = ene-self.ene_min + Z += np.exp(-ene_diff/T) + return Z + + def get_finite_T_spectrum(self): + self.read_spectrum() + finite_T_spectrum_dict ={} + for T in self.T_list: + Z = self._calc_Z(T) + spectrum = np.zeros_like(self.spectrums_dict[0]) + for idx in range(self.exct): + spectrum += np.exp(-(self.energy_list[idx]-self.ene_min)/T)*self.spectrums_dict[idx] + spectrum /= Z + finite_T_spectrum_dict[T]=spectrum + self.finite_T_spectrum_dict = finite_T_spectrum_dict + return self.frequencies, finite_T_spectrum_dict + + def print_finite_T_spectrum(self, file_name = "Dynamical_Green"): + for key, spectrum in self.finite_T_spectrum_dict.items(): + file_name_T = self.header + "_" + file_name + "_T_{}.dat".format(key) + with open(os.path.join(self.output_dir, file_name_T), "w") as fw: + for idx, value in enumerate(spectrum): + fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) + + + def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = "single_ex.def", ex_state=0, flg_complex = True): + # c_{i sigma_i} or c_{i sigma_i} + i c_{j sigma_j} + nsingle = 2 + if (2 * site_i + sigma_i) == ( 2 * site_j + sigma_j): + nsingle = 1 + + with open(file_name, "w") as fw: + fw.write("===============================\n") + fw.write("NSingle {}\n".format(nsingle)) + fw.write("===============================\n") + fw.write("===============================\n") + fw.write("===============================\n") + if nsingle == 1: + fw.write("{} {} {} 1.0 0.0\n".format(site_i, sigma_i, ex_state)) + else: + if flg_complex is True: + fw.write("{} {} {} 1.0 0.0\n".format(site_i, sigma_i, ex_state)) + fw.write("{} {} {} 0.0 1.0\n".format(site_j, sigma_j, ex_state)) + else: + fw.write("{} {} {} 1.0 0.0\n".format(site_i, sigma_i, ex_state)) + fw.write("{} {} {} 1.0 0.0\n".format(site_j, sigma_j, ex_state)) + + + + def _run_HPhi(self, exct_cut): + for idx in range(exct_cut): + #print("Process: {}/{}".format(idx, exct_cut)) + input_path = "namelist_ex_{}.def".format(idx) + cmd = "{} -e {} > std_{}.out".format(self.path_to_HPhi, input_path, idx) + subprocess.call(cmd, shell=True) + cmd = "mv ./output/{}_DynamicalGreen.dat ./output/{}_DynamicalGreen_{}.dat".format(header, header, idx) + subprocess.call(cmd, shell=True) + + def get_one_body_green(self, n_site, exct_cut): + self.Make_Spectrum_Input() + one_body_green = {} + for T in self.T_list: + one_body_green[T] = np.zeros((n_site, 2, n_site, 2, self.nomega), dtype=np.complex) + #diagonal + print("Calculate Diagonal Green function") + for sitei, sigmai in itertools.product(range(n_site), range(2)): + print("G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitei, "u" if sigmai == 0 else "d")) + self._make_single_excitation(sitei, sigmai, sitei, sigmai) + #Run HPhi + self._run_HPhi(exct_cut) + #Get Finite-T Green + frequencies, finite_spectrum_list = calcspectrum.get_finite_T_spectrum() + for T in self.T_list: + one_body_green[T][sitei][sigmai][sitei][sigmai] = finite_spectrum_list[T] + + #off diagonal + print("Calculate Off-Diagonal Green function") + + one_body_green_tmp = [{}, {}] + for T in self.T_list: + one_body_green_tmp[0][T] = np.zeros((self.nomega), dtype=np.complex) + one_body_green_tmp[1][T] = np.zeros((self.nomega), dtype=np.complex) + + for sitei, sigmai in itertools.product(range(n_site), range(2)): + sitei_idx = 2 * sitei + sigmai + for sitej, sigmaj in itertools.product(range(n_site), range(2)): + sitej_idx = 2 * sitej + sigmaj + if sitei_idx >= sitej_idx: + continue + print("G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitej, "u" if sigmaj == 0 else "d")) + #True c_i + c_j, False: c_i + i c_j + for idx, flg in enumerate([True, False]): + self._make_single_excitation(sitei, sigmai, sitej, sigmaj, flg_complex=flg) + #Run HPhi + self._run_HPhi(exct_cut) + #Get Finite-T Green + frequencies, finite_spectrum_list = calcspectrum.get_finite_T_spectrum() + for T in self.T_list: + one_body_green_tmp[idx][T] = finite_spectrum_list[T] - one_body_green[T][sitei][sigmai][sitei][sigmai]-one_body_green[T][sitej][sigmaj][sitej][sigmaj] + #Get Offdiagonal Green + for T in self.T_list: + one_body_green[T][sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0][T] + 1J * one_body_green_tmp[1][T] )/2.0 + one_body_green[T][sitej][sigmaj][sitei][sigmai] = (one_body_green_tmp[0][T] - 1J * one_body_green_tmp[1][T] )/2.0 + return one_body_green + +output_dir = "./output" +filename = "TEST" +header = "zvo" +T_list = [0.01] +exct = 2 +eta = 1e-4 + +print("Check Energy") +calcspectrum=CalcSpectrum(filename, T_list, exct, eta, "./HPhi", header) +energy_list = calcspectrum.get_energies() +one_body_g = calcspectrum.get_one_body_green(n_site=2, exct_cut = exct) +print(one_body_g) From f60d96676b997be852dbbc5dd3e20b40fac5d53f Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Tue, 5 May 2020 19:54:06 +0900 Subject: [PATCH 04/49] Compute Gimp(iw) in HPhi --- python/impurity_solvers/hphi.py | 56 +++++++++++++++++++++--- python/impurity_solvers/hphi_spectrum.py | 31 ++++--------- 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index 2069bd9e..ba80d78d 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -28,7 +28,8 @@ from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, extract_bath_params from .base import SolverBase - +from .hphi_spectrum import CalcSpectrum +from .pomerol import assign_from_numpy_array, set_tail class HPhiSolver(SolverBase): @@ -62,6 +63,10 @@ def solve(self, rot, mpirun_command, params_kw): exec_path = os.path.expandvars(params_kw['exec_path']) + # Matsubara frequencies + omega_min = numpy.pi / self.beta # n=0 + omega_max = (2*self.n_iw - 1) * numpy.pi / self.beta # n=n_iw-1 + # bath fitting n_bath = params_kw.get('n_bath', 0) # 0 for Hubbard-I approximation exct = params_kw.get('exct', 1) # number of states to be computed @@ -103,11 +108,11 @@ def solve(self, rot, mpirun_command, params_kw): LargeValue 4.000000000000000e+00 NumAve 5 ExpecInterval 20 -NOmega 200 -OmegaMax 1.200000000000000e+01 4.000000000000000e-02 -OmegaMin -1.200000000000000e+01 4.000000000000000e-02 -OmegaOrg 0.000000000000000e+00 0.000000000000000e+00 -""".format(n_site, exct), end="", file=f) +NOmega {2} +OmegaMax 0.0 {3} +OmegaMin 0.0 {4} +OmegaOrg 0.0 0.0 +""".format(n_site, exct, self.n_iw, omega_min, omega_max), end="", file=f) # Output calcmod.def with open('./calcmod.def', 'w') as f: @@ -252,9 +257,48 @@ def solve(self, rot, mpirun_command, params_kw): with open('./stdout.log', 'w') as output_f: launch_mpi_subprocesses(mpirun_command, [exec_path, '-e', 'namelist.def'], output_f) + # + # output_dir = "./output" + prefix = "TEST" + header = "zvo" + T_list = [1./self.beta] + # exct = 2 + eta = 1e-4 + + print("Check Energy") + calcspectrum = CalcSpectrum(prefix, T_list, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) + energy_list = calcspectrum.get_energies() + one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) + + # print(len(energy_list)) + # print(energy_list) + + # print(one_body_g) + gf = one_body_g[T_list[0]] + # (3) Copy results into # self._Sigma_iw # self._Gimp_iw + # Change data structure of gf from [o1, s1, o2, s2, iw] + print(gf.shape) + assert gf.shape == (self.n_orb, 2, self.n_orb, 2, self.n_iw) + if self.use_spin_orbit: + # to [1, (o1,s1), (o2,s2), iw] + gf = gf.reshape((1, 2*norb, 2*norb, self.n_iw)) + assert gf.shape == (1, 2*self.n_orb, 2*self.n_orb, self.n_iw) + else: + # to [s, o1, o2, iw] + gf = numpy.einsum("isjsw->sijw", gf) + assert gf.shape == (2, self.n_orb, self.n_orb, self.n_iw) + print(gf.shape) + + assign_from_numpy_array(self._Gimp_iw, gf, self.block_names) + + if triqs_major_version == 1: + set_tail(self._Gimp_iw) + + + def name(self): return "HPhi" diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 168f8e71..5eae87bf 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -9,6 +9,7 @@ def __init__(self, filename, T_list, exct, eta, path_to_HPhi="./HPhi", header="z self.filename = filename self.T_list = T_list self.exct = exct + self.eta = eta self.header = header self.output_dir = output_dir self.nomega = 0 @@ -61,7 +62,7 @@ def read_spectrum(self): spectrum_dict={} frequencies =[] for idx in range(self.exct): - path_to_DG = os.path.join(self.output_dir, "{}_DynamicalGreen_{}.dat".format(header,idx)) + path_to_DG = os.path.join(self.output_dir, "{}_DynamicalGreen_{}.dat".format(self.header,idx)) spectrum = np.loadtxt(path_to_DG) spectrum_dict[idx] = spectrum[:,2] + 1J*spectrum[:,3] if idx == 0 : @@ -72,7 +73,7 @@ def read_spectrum(self): def get_energies(self): energy_list = [] - with open(os.path.join(output_dir, "{}_energy.dat".format(header))) as f: + with open(os.path.join(self.output_dir, "{}_energy.dat".format(self.header))) as f: lines = f.readlines() for line in lines: words = line.split() @@ -81,10 +82,10 @@ def get_energies(self): self.energy_list = energy_list self.ene_min = energy_list[0] self.ene_max = energy_list[len(energy_list)-1] - for T in T_list: + for T in self.T_list: eta_ene = np.exp(-(self.ene_max-self.ene_min)/T) print("T = {}: exp[-beta(ene_max-ene_mix)] = {}".format(T, eta_ene)) - if eta_ene > eta: + if eta_ene > self.eta: print("Warning: At T = {}, eta_ene is larger than eta.".format(T)) return energy_list @@ -115,7 +116,6 @@ def print_finite_T_spectrum(self, file_name = "Dynamical_Green"): for idx, value in enumerate(spectrum): fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) - def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = "single_ex.def", ex_state=0, flg_complex = True): # c_{i sigma_i} or c_{i sigma_i} + i c_{j sigma_j} nsingle = 2 @@ -137,8 +137,6 @@ def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = else: fw.write("{} {} {} 1.0 0.0\n".format(site_i, sigma_i, ex_state)) fw.write("{} {} {} 1.0 0.0\n".format(site_j, sigma_j, ex_state)) - - def _run_HPhi(self, exct_cut): for idx in range(exct_cut): @@ -146,7 +144,7 @@ def _run_HPhi(self, exct_cut): input_path = "namelist_ex_{}.def".format(idx) cmd = "{} -e {} > std_{}.out".format(self.path_to_HPhi, input_path, idx) subprocess.call(cmd, shell=True) - cmd = "mv ./output/{}_DynamicalGreen.dat ./output/{}_DynamicalGreen_{}.dat".format(header, header, idx) + cmd = "mv ./output/{0}_DynamicalGreen.dat ./output/{0}_DynamicalGreen_{1}.dat".format(self.header, idx) subprocess.call(cmd, shell=True) def get_one_body_green(self, n_site, exct_cut): @@ -162,7 +160,7 @@ def get_one_body_green(self, n_site, exct_cut): #Run HPhi self._run_HPhi(exct_cut) #Get Finite-T Green - frequencies, finite_spectrum_list = calcspectrum.get_finite_T_spectrum() + frequencies, finite_spectrum_list = self.get_finite_T_spectrum() for T in self.T_list: one_body_green[T][sitei][sigmai][sitei][sigmai] = finite_spectrum_list[T] @@ -187,7 +185,7 @@ def get_one_body_green(self, n_site, exct_cut): #Run HPhi self._run_HPhi(exct_cut) #Get Finite-T Green - frequencies, finite_spectrum_list = calcspectrum.get_finite_T_spectrum() + frequencies, finite_spectrum_list = self.get_finite_T_spectrum() for T in self.T_list: one_body_green_tmp[idx][T] = finite_spectrum_list[T] - one_body_green[T][sitei][sigmai][sitei][sigmai]-one_body_green[T][sitej][sigmaj][sitej][sigmaj] #Get Offdiagonal Green @@ -195,16 +193,3 @@ def get_one_body_green(self, n_site, exct_cut): one_body_green[T][sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0][T] + 1J * one_body_green_tmp[1][T] )/2.0 one_body_green[T][sitej][sigmaj][sitei][sigmai] = (one_body_green_tmp[0][T] - 1J * one_body_green_tmp[1][T] )/2.0 return one_body_green - -output_dir = "./output" -filename = "TEST" -header = "zvo" -T_list = [0.01] -exct = 2 -eta = 1e-4 - -print("Check Energy") -calcspectrum=CalcSpectrum(filename, T_list, exct, eta, "./HPhi", header) -energy_list = calcspectrum.get_energies() -one_body_g = calcspectrum.get_one_body_green(n_site=2, exct_cut = exct) -print(one_body_g) From 3989e02e9c2b3afd3bffaebaea8ad92f1be1f219 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Wed, 6 May 2020 14:38:39 +0900 Subject: [PATCH 05/49] Fix a bug --- python/impurity_solvers/hphi.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index ba80d78d..b49bbebf 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -78,6 +78,11 @@ def solve(self, rot, mpirun_command, params_kw): n_site = self.n_orb + n_bath + exct_max = 4**n_site + if exct > exct_max: + print("Warning: exct={0} is larger than {1}. exct is set to {1}".format(exct, exct_max)) + exct = exct_max + # Output namelist.def with open('./namelist.def', 'w') as f: print("""\ @@ -112,7 +117,7 @@ def solve(self, rot, mpirun_command, params_kw): OmegaMax 0.0 {3} OmegaMin 0.0 {4} OmegaOrg 0.0 0.0 -""".format(n_site, exct, self.n_iw, omega_min, omega_max), end="", file=f) +""".format(n_site, exct, self.n_iw, omega_max, omega_min), end="", file=f) # Output calcmod.def with open('./calcmod.def', 'w') as f: @@ -284,8 +289,8 @@ def solve(self, rot, mpirun_command, params_kw): print(gf.shape) assert gf.shape == (self.n_orb, 2, self.n_orb, 2, self.n_iw) if self.use_spin_orbit: - # to [1, (o1,s1), (o2,s2), iw] - gf = gf.reshape((1, 2*norb, 2*norb, self.n_iw)) + # to [1, (s1,o1), (s2,o2), iw] + gf = gf.transpose((1, 0, 3, 2, 4)).reshape((1, 2*norb, 2*norb, self.n_iw)) assert gf.shape == (1, 2*self.n_orb, 2*self.n_orb, self.n_iw) else: # to [s, o1, o2, iw] From 5cf8ad426f08b5879637d85880c5780134ad4387 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Wed, 6 May 2020 23:08:08 +0900 Subject: [PATCH 06/49] Compute Sigma(iw) in HPhi --- python/impurity_solvers/hphi.py | 46 ++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index b49bbebf..801df497 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -280,20 +280,20 @@ def solve(self, rot, mpirun_command, params_kw): # print(one_body_g) gf = one_body_g[T_list[0]] + print(gf.shape) + assert gf.shape == (self.n_orb, 2, self.n_orb, 2, self.n_iw) # (3) Copy results into # self._Sigma_iw # self._Gimp_iw - # Change data structure of gf from [o1, s1, o2, s2, iw] - print(gf.shape) - assert gf.shape == (self.n_orb, 2, self.n_orb, 2, self.n_iw) + # Change data structure of gf from [o1, s1, o2, s2, iw] to ... if self.use_spin_orbit: - # to [1, (s1,o1), (s2,o2), iw] - gf = gf.transpose((1, 0, 3, 2, 4)).reshape((1, 2*norb, 2*norb, self.n_iw)) + # [1, (s1,o1), (s2,o2), iw] + gf = gf.transpose((1, 0, 3, 2, 4)).reshape((1, 2*self.n_orb, 2*self.n_orb, self.n_iw)) assert gf.shape == (1, 2*self.n_orb, 2*self.n_orb, self.n_iw) else: - # to [s, o1, o2, iw] + # [s, o1, o2, iw] gf = numpy.einsum("isjsw->sijw", gf) assert gf.shape == (2, self.n_orb, self.n_orb, self.n_iw) print(gf.shape) @@ -303,7 +303,39 @@ def solve(self, rot, mpirun_command, params_kw): if triqs_major_version == 1: set_tail(self._Gimp_iw) - + if self.use_spin_orbit: + print("Sigma is not implemented for SOC") + raise NotImplementedError + + # Make H0 matrix + h0_full = numpy.zeros((2, n_site, 2, n_site), dtype=complex) + for t in transfer: + h0_full[t.s1, t.i1, t.s2, t.i2] = t.t + h0_full = h0_full.reshape((2*n_site, 2*n_site)) + + # TODO: move into a function -- begin + # Cut H0 into block structure + n_block = len(self.gf_struct) + n_inner = h0_full.shape[0] / n_block + h0_block = [h0_full[s*n_inner:(s+1)*n_inner, s*n_inner:(s+1)*n_inner] for s in range(n_block)] + + # Construct G0 including bath sites + bath_names = ["bath" + str(i_bath) for i_bath in range(n_bath)] + gf_struct_full = {block: list(inner_names) + bath_names for block, inner_names in self.gf_struct.items()} + g0_full = make_block_gf(GfImFreq, gf_struct_full, self.beta, self.n_iw) + g0_full << iOmega_n + for i, block in enumerate(self.block_names): + g0_full[block] -= h0_block[i] + g0_full.invert() + + # Project G0 onto impurity site + g0_imp = make_block_gf(GfImFreq, self.gf_struct, self.beta, self.n_iw) + for block in self.block_names: + for o1, o2 in product(self.gf_struct[block], repeat=2): + g0_imp[block][o1, o2] << g0_full[block][o1, o2] + # TODO: move into a function -- end + + self._Sigma_iw << inverse(g0_imp) - inverse(self._Gimp_iw) def name(self): return "HPhi" From ba158d83de899dce75af95647b17284ac4796e0b Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Mon, 11 May 2020 22:39:38 +0900 Subject: [PATCH 07/49] fix spell --- python/impurity_solvers/hphi_spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 5eae87bf..95d68251 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -37,7 +37,7 @@ def Make_Spectrum_Input(self, spectrum_type="single"): continue if words[0] == "SingleExcitation": continue - if words[0] == "PairExciation": + if words[0] == "PairExcitation": continue fex.write(line) From 85f139b965942c22ed6414749984256eb26ea224 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Tue, 19 May 2020 13:23:13 +0900 Subject: [PATCH 08/49] [temporary] Save G(iw) and Sigma(iw) in dmft loop --- python/dmft_core.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/python/dmft_core.py b/python/dmft_core.py index 2d98399b..b82dc080 100644 --- a/python/dmft_core.py +++ b/python/dmft_core.py @@ -723,6 +723,11 @@ def quantities_to_check(): new_Sigma_iw, new_Gimp_iw = self.solve_impurity_models(Gloc_iw_sh, iteration_number) + numpy.savetxt("test_gimp_up.dat", new_Gimp_iw[0]['up'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) + numpy.savetxt("test_gimp_dn.dat", new_Gimp_iw[0]['down'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) + numpy.savetxt("test_sigma_up.dat", new_Sigma_iw[0]['up'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) + numpy.savetxt("test_sigma_dn.dat", new_Sigma_iw[0]['down'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) + print("\nWall Time : %.1f sec" % (time.time() - t0)) sys.stdout.flush() From ebc252371b32db19c9453338910bf190d521ab33 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Tue, 19 May 2020 17:44:53 +0900 Subject: [PATCH 09/49] update to use launchmpi_subprocess in hphi_spectrum --- python/impurity_solvers/hphi_spectrum.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 95d68251..4e049bb8 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -3,6 +3,8 @@ import numpy as np import os import sys +from ..tools import launch_mpi_subprocesses + class CalcSpectrum: def __init__(self, filename, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): @@ -142,8 +144,9 @@ def _run_HPhi(self, exct_cut): for idx in range(exct_cut): #print("Process: {}/{}".format(idx, exct_cut)) input_path = "namelist_ex_{}.def".format(idx) - cmd = "{} -e {} > std_{}.out".format(self.path_to_HPhi, input_path, idx) - subprocess.call(cmd, shell=True) + exec_path = self.path_to_HPhi + with open('./stdout_{}.log'.format(idx), 'w') as output_f: + launch_mpi_subprocesses(mpirun_command, [exec_path, '-e', input_path], output_f) cmd = "mv ./output/{0}_DynamicalGreen.dat ./output/{0}_DynamicalGreen_{1}.dat".format(self.header, idx) subprocess.call(cmd, shell=True) @@ -192,4 +195,11 @@ def get_one_body_green(self, n_site, exct_cut): for T in self.T_list: one_body_green[T][sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0][T] + 1J * one_body_green_tmp[1][T] )/2.0 one_body_green[T][sitej][sigmaj][sitei][sigmai] = (one_body_green_tmp[0][T] - 1J * one_body_green_tmp[1][T] )/2.0 + + for key, greens in one_body_green[0].items(): + for sitei, sigmai in itertools.product(range(n_site), range(2)): + for sitej, sigmaj in itertools.product(range(n_site), range(2)): + with open("green_{}{}{}{}_T{}.dat".format(sitei, sigmai, sitej, sigmaj, key), "w") as fw: + for idx, value in enumerate(greens[sitei][sigmai][sitej][sigmaj]): + fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) return one_body_green From 991750bd35302d2f9f0cf1453dafb39a153d8a49 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Tue, 19 May 2020 17:47:45 +0900 Subject: [PATCH 10/49] use mpirun_command --- python/impurity_solvers/hphi.py | 2 +- python/impurity_solvers/hphi_spectrum.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index 801df497..bee0e904 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -271,7 +271,7 @@ def solve(self, rot, mpirun_command, params_kw): eta = 1e-4 print("Check Energy") - calcspectrum = CalcSpectrum(prefix, T_list, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) + calcspectrum = CalcSpectrum(prefix, T_list, mpirun_command, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) energy_list = calcspectrum.get_energies() one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 4e049bb8..4f61c442 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -7,7 +7,7 @@ class CalcSpectrum: - def __init__(self, filename, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): + def __init__(self, filename, T_list, exct, eta, mpirun_command="", path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): self.filename = filename self.T_list = T_list self.exct = exct @@ -16,6 +16,7 @@ def __init__(self, filename, T_list, exct, eta, path_to_HPhi="./HPhi", header="z self.output_dir = output_dir self.nomega = 0 self.path_to_HPhi = path_to_HPhi + self.mpirun_command = mpirun_command def Make_Spectrum_Input(self, spectrum_type="single"): for idx in range(self.exct): @@ -146,7 +147,7 @@ def _run_HPhi(self, exct_cut): input_path = "namelist_ex_{}.def".format(idx) exec_path = self.path_to_HPhi with open('./stdout_{}.log'.format(idx), 'w') as output_f: - launch_mpi_subprocesses(mpirun_command, [exec_path, '-e', input_path], output_f) + launch_mpi_subprocesses(self.mpirun_command, [exec_path, '-e', input_path], output_f) cmd = "mv ./output/{0}_DynamicalGreen.dat ./output/{0}_DynamicalGreen_{1}.dat".format(self.header, idx) subprocess.call(cmd, shell=True) From 42dd82b2c20218ca5e4ee273c59f27214083bd80 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Tue, 19 May 2020 18:11:29 +0900 Subject: [PATCH 11/49] consider retarded and advanced Green's function --- python/impurity_solvers/hphi.py | 2 +- python/impurity_solvers/hphi_spectrum.py | 44 +++++++++++------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index bee0e904..3a38ea51 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -271,7 +271,7 @@ def solve(self, rot, mpirun_command, params_kw): eta = 1e-4 print("Check Energy") - calcspectrum = CalcSpectrum(prefix, T_list, mpirun_command, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) + calcspectrum = CalcSpectrum(prefix, T_list, mpirun_command=mpirun_command, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) energy_list = calcspectrum.get_energies() one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 4f61c442..97219772 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -124,7 +124,6 @@ def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = nsingle = 2 if (2 * site_i + sigma_i) == ( 2 * site_j + sigma_j): nsingle = 1 - with open(file_name, "w") as fw: fw.write("===============================\n") fw.write("NSingle {}\n".format(nsingle)) @@ -160,13 +159,14 @@ def get_one_body_green(self, n_site, exct_cut): print("Calculate Diagonal Green function") for sitei, sigmai in itertools.product(range(n_site), range(2)): print("G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitei, "u" if sigmai == 0 else "d")) - self._make_single_excitation(sitei, sigmai, sitei, sigmai) - #Run HPhi - self._run_HPhi(exct_cut) - #Get Finite-T Green - frequencies, finite_spectrum_list = self.get_finite_T_spectrum() - for T in self.T_list: - one_body_green[T][sitei][sigmai][sitei][sigmai] = finite_spectrum_list[T] + for ex_state in range(2): + self._make_single_excitation(sitei, sigmai, sitei, sigmai, ex_state=ex_state) + #Run HPhi + self._run_HPhi(exct_cut) + #Get Finite-T Green + frequencies, finite_spectrum_list = self.get_finite_T_spectrum() + for T in self.T_list: + one_body_green[T][sitei][sigmai][sitei][sigmai] += finite_spectrum_list[T] #off diagonal print("Calculate Off-Diagonal Green function") @@ -183,24 +183,20 @@ def get_one_body_green(self, n_site, exct_cut): if sitei_idx >= sitej_idx: continue print("G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitej, "u" if sigmaj == 0 else "d")) - #True c_i + c_j, False: c_i + i c_j - for idx, flg in enumerate([True, False]): - self._make_single_excitation(sitei, sigmai, sitej, sigmaj, flg_complex=flg) - #Run HPhi - self._run_HPhi(exct_cut) - #Get Finite-T Green - frequencies, finite_spectrum_list = self.get_finite_T_spectrum() - for T in self.T_list: - one_body_green_tmp[idx][T] = finite_spectrum_list[T] - one_body_green[T][sitei][sigmai][sitei][sigmai]-one_body_green[T][sitej][sigmaj][sitej][sigmaj] + for ex_state in range(2): + #True c_i + c_j, False: c_i + i c_j + for idx, flg in enumerate([True, False]): + self._make_single_excitation(sitei, sigmai, sitej, sigmaj, ex_state=ex_state, flg_complex=flg) + #Run HPhi + self._run_HPhi(exct_cut) + #Get Finite-T Green + frequencies, finite_spectrum_list = self.get_finite_T_spectrum() + for T in self.T_list: + one_body_green_tmp[idx][T] += finite_spectrum_list[T] + for T in self.T_list: + one_body_green_tmp[idx][T] -= one_body_green[T][sitei][sigmai][sitei][sigmai]+one_body_green[T][sitej][sigmaj][sitej][sigmaj] #Get Offdiagonal Green for T in self.T_list: one_body_green[T][sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0][T] + 1J * one_body_green_tmp[1][T] )/2.0 one_body_green[T][sitej][sigmaj][sitei][sigmai] = (one_body_green_tmp[0][T] - 1J * one_body_green_tmp[1][T] )/2.0 - - for key, greens in one_body_green[0].items(): - for sitei, sigmai in itertools.product(range(n_site), range(2)): - for sitej, sigmaj in itertools.product(range(n_site), range(2)): - with open("green_{}{}{}{}_T{}.dat".format(sitei, sigmai, sitej, sigmaj, key), "w") as fw: - for idx, value in enumerate(greens[sitei][sigmai][sitej][sigmaj]): - fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) return one_body_green From b9762b63814ede59fc63f745a5cf35caf39e70c8 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Wed, 20 May 2020 11:55:49 +0900 Subject: [PATCH 12/49] update to consider omega_org for spectrum calculation --- python/impurity_solvers/hphi_spectrum.py | 30 +++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 4f61c442..b050cef0 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -36,7 +36,7 @@ def Make_Spectrum_Input(self, spectrum_type="single"): words = line.split() if len(words) == 0: continue - if words[0] == "CalcMod" or words[0] == "SpectrumVec": + if words[0] in ["CalcMod", "SpectrumVec", "ModPara"]: continue if words[0] == "SingleExcitation": continue @@ -44,6 +44,7 @@ def Make_Spectrum_Input(self, spectrum_type="single"): continue fex.write(line) + fex.write("ModPara modpara_ex.def\n") fex.write("CalcMod calcmod_ex.def\n") fex.write("SpectrumVec {}_eigenvec_{}\n".format(self.header, idx)) if spectrum_type == "single": @@ -119,6 +120,25 @@ def print_finite_T_spectrum(self, file_name = "Dynamical_Green"): for idx, value in enumerate(spectrum): fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) + def _update_modpara(self, exct): + dict_mod={} + header = [] + with open("modpara.def", "r") as fr: + lines = fr.readlines() + header = lines[:8] + for line in lines[8:]: + words = line.split() + dict_mod[words[0]] = words[1:] + dict_mod["OmegaOrg"] = [-self.energy_list[exct], 0] + with open("modpara_ex.def", "w") as fw: + for line in header: + fw.write(line) + for key, value in dict_mod.items(): + if len(value) == 1: + fw.write("{} {}\n".format(key, value[0])) + else: + fw.write("{} {} {}\n".format(key, value[0], value[1])) + def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = "single_ex.def", ex_state=0, flg_complex = True): # c_{i sigma_i} or c_{i sigma_i} + i c_{j sigma_j} nsingle = 2 @@ -144,6 +164,7 @@ def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = def _run_HPhi(self, exct_cut): for idx in range(exct_cut): #print("Process: {}/{}".format(idx, exct_cut)) + self._update_modpara(idx) input_path = "namelist_ex_{}.def".format(idx) exec_path = self.path_to_HPhi with open('./stdout_{}.log'.format(idx), 'w') as output_f: @@ -196,11 +217,4 @@ def get_one_body_green(self, n_site, exct_cut): for T in self.T_list: one_body_green[T][sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0][T] + 1J * one_body_green_tmp[1][T] )/2.0 one_body_green[T][sitej][sigmaj][sitei][sigmai] = (one_body_green_tmp[0][T] - 1J * one_body_green_tmp[1][T] )/2.0 - - for key, greens in one_body_green[0].items(): - for sitei, sigmai in itertools.product(range(n_site), range(2)): - for sitej, sigmaj in itertools.product(range(n_site), range(2)): - with open("green_{}{}{}{}_T{}.dat".format(sitei, sigmai, sitej, sigmaj, key), "w") as fw: - for idx, value in enumerate(greens[sitei][sigmai][sitej][sigmaj]): - fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) return one_body_green From 413820e8780655c18835d190c574817735f7c8bc Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Wed, 20 May 2020 21:22:25 +0900 Subject: [PATCH 13/49] Improve the appearance of hphi.py --- python/impurity_solvers/hphi.py | 154 ++++++++++++++++++-------------- 1 file changed, 86 insertions(+), 68 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index 3a38ea51..b50546b8 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -32,6 +32,86 @@ from .pomerol import assign_from_numpy_array, set_tail +namelist_def = """\ +ModPara modpara.def +CalcMod calcmod.def +LocSpin locspn.def +Trans trans.def +InterAll interall.def +""" + + +modpara_def = """\ +-------------------- +Model_Parameters 0 +-------------------- +HPhi_Cal_Parameters +-------------------- +CDataFileHead zvo +CParaFileHead zqp +-------------------- +Nsite {0} +Lanczos_max 2000 +initial_iv -1 +exct {1} +LanczosEps 14 +LanczosTarget 2 +LargeValue 4.000000000000000e+00 +NumAve 5 +ExpecInterval 20 +NOmega {2} +OmegaMax 2.5 {3} +OmegaMin 2.5 {4} +OmegaOrg 0.0 0.0 +""" + + +calcmod_def = """\ +#CalcType = 0:Lanczos, 1:TPQCalc, 2:FullDiag, 3:CG, 4:Time-evolution +#CalcModel = 0:Hubbard, 1:Spin, 2:Kondo, 3:HubbardGC, 4:SpinGC, 5:KondoGC +#Restart = 0:None, 1:Save, 2:Restart&Save, 3:Restart +#CalcSpec = 0:None, 1:Normal, 2:No H*Phi, 3:Save, 4:Restart, 5:Restart&Save +CalcType 3 +CalcModel 3 +ReStart 0 +CalcSpec 0 +CalcEigenVec 0 +InitialVecType 0 +InputEigenVec 0 +OutputEigenVec 1 +InputHam 0 +OutputHam 0 +OutputExVec 0 +""" + + +locspn_def = """\ +================================ +NlocalSpin 0 +================================ +========i_0LocSpn_1IteElc ====== +================================ +""" + + +trans_def = """\ +======================== +NTransfer {0} +======================== +========i_j_s_tijs====== +======================== +""" + + +interall_def = """\ +====================== +NInterAll {0} +====================== +========zInterAll===== +====================== +""" + + class HPhiSolver(SolverBase): def __init__(self, beta, gf_struct, u_mat, n_iw=1025): @@ -85,69 +165,19 @@ def solve(self, rot, mpirun_command, params_kw): # Output namelist.def with open('./namelist.def', 'w') as f: - print("""\ -ModPara modpara.def -CalcMod calcmod.def -LocSpin locspn.def -Trans trans.def -InterAll interall.def -""", end="", file=f) + print(namelist_def, end="", file=f) # Output modpara.def with open('./modpara.def', 'w') as f: - print("""\ --------------------- -Model_Parameters 0 --------------------- -HPhi_Cal_Parameters --------------------- -CDataFileHead zvo -CParaFileHead zqp --------------------- -Nsite {0} -Lanczos_max 2000 -initial_iv -1 -exct {1} -LanczosEps 14 -LanczosTarget 2 -LargeValue 4.000000000000000e+00 -NumAve 5 -ExpecInterval 20 -NOmega {2} -OmegaMax 0.0 {3} -OmegaMin 0.0 {4} -OmegaOrg 0.0 0.0 -""".format(n_site, exct, self.n_iw, omega_max, omega_min), end="", file=f) + print(modpara_def.format(n_site, exct, self.n_iw, omega_max, omega_min), end="", file=f) # Output calcmod.def with open('./calcmod.def', 'w') as f: - print("""\ -#CalcType = 0:Lanczos, 1:TPQCalc, 2:FullDiag, 3:CG, 4:Time-evolution -#CalcModel = 0:Hubbard, 1:Spin, 2:Kondo, 3:HubbardGC, 4:SpinGC, 5:KondoGC -#Restart = 0:None, 1:Save, 2:Restart&Save, 3:Restart -#CalcSpec = 0:None, 1:Normal, 2:No H*Phi, 3:Save, 4:Restart, 5:Restart&Save -CalcType 3 -CalcModel 3 -ReStart 0 -CalcSpec 0 -CalcEigenVec 0 -InitialVecType 0 -InputEigenVec 0 -OutputEigenVec 1 -InputHam 0 -OutputHam 0 -OutputExVec 0 -""", end="", file=f) + print(calcmod_def, end="", file=f) # Output locspn.def with open('./locspn.def', 'w') as f: - print("""\ -================================ -NlocalSpin 0 -================================ -========i_0LocSpn_1IteElc ====== -================================ -""", end="", file=f) + print(locspn_def, end="", file=f) for i in range(n_site): print("{0} 0".format(i), file=f) @@ -211,13 +241,7 @@ def solve(self, rot, mpirun_command, params_kw): # Output trans.def with open('./trans.def', 'w') as f: - print("""\ -======================== -NTransfer {0} -======================== -========i_j_s_tijs====== -======================== -""".format(len(transfer)), end="", file=f) + print(trans_def.format(len(transfer)), end="", file=f) for t in transfer: print(t.i1, t.s1, t.i2, t.s2, t.t.real, t.t.imag, file=f) @@ -247,13 +271,7 @@ def solve(self, rot, mpirun_command, params_kw): # Output interall.def with open('./interall.def', 'w') as f: - print("""\ -====================== -NInterAll {0} -====================== -========zInterAll===== -====================== -""".format(len(interall)), end="", file=f) + print(interall_def.format(len(interall)), end="", file=f) for u in interall: print(u.i1, u.s1, u.i2, u.s2, u.i3, u.s3, u.i4, u.s4, u.U.real, u.U.imag, file=f) From 24dac84a1e6036266d1eb2e736580c23cf871fe0 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Wed, 20 May 2020 21:35:28 +0900 Subject: [PATCH 14/49] Cancel temporal changes --- python/impurity_solvers/hphi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index b50546b8..80693471 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -60,8 +60,8 @@ NumAve 5 ExpecInterval 20 NOmega {2} -OmegaMax 2.5 {3} -OmegaMin 2.5 {4} +OmegaMax 0.0 {3} +OmegaMin 0.0 {4} OmegaOrg 0.0 0.0 """ From 3010aa101ae7d9bc4d448b1bc672017f553784c8 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Wed, 20 May 2020 22:31:05 +0900 Subject: [PATCH 15/49] Replace np with 4^m if not --- python/impurity_solvers/hphi.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index 80693471..1e4b6762 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -21,6 +21,9 @@ from itertools import product import os from collections import namedtuple +from warnings import warn +import shlex +import math from ..pytriqs_gf_compat import * # from pytriqs.archive import HDFArchive @@ -143,6 +146,16 @@ def solve(self, rot, mpirun_command, params_kw): exec_path = os.path.expandvars(params_kw['exec_path']) + # The number of process (np) must be 4^m in HPhi + mpirun_command_power4 = mpirun_command + commands = shlex.split(mpirun_command) + np = int(commands[-1]) + if not math.log(np, 4).is_integer(): # check if np = 4^m + np_new = 4**int(math.log(np, 4)) + warn("np must be a power of 4 in HPhi. np is set to {}.".format(np_new)) + commands[-1] = str(np_new) + mpirun_command_power4 = " ".join(commands) + # Matsubara frequencies omega_min = numpy.pi / self.beta # n=0 omega_max = (2*self.n_iw - 1) * numpy.pi / self.beta # n=n_iw-1 @@ -160,7 +173,7 @@ def solve(self, rot, mpirun_command, params_kw): exct_max = 4**n_site if exct > exct_max: - print("Warning: exct={0} is larger than {1}. exct is set to {1}".format(exct, exct_max)) + warn("exct={0} is larger than {1}. exct is set to {1}".format(exct, exct_max)) exct = exct_max # Output namelist.def @@ -278,7 +291,7 @@ def solve(self, rot, mpirun_command, params_kw): # (2) Run a working horse with open('./stdout.log', 'w') as output_f: - launch_mpi_subprocesses(mpirun_command, [exec_path, '-e', 'namelist.def'], output_f) + launch_mpi_subprocesses(mpirun_command_power4, [exec_path, '-e', 'namelist.def'], output_f) # # output_dir = "./output" @@ -289,7 +302,7 @@ def solve(self, rot, mpirun_command, params_kw): eta = 1e-4 print("Check Energy") - calcspectrum = CalcSpectrum(prefix, T_list, mpirun_command=mpirun_command, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) + calcspectrum = CalcSpectrum(prefix, T_list, mpirun_command=mpirun_command_power4, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) energy_list = calcspectrum.get_energies() one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) From 856df4e4aefe096f994ec3dce9cf4225d9347d91 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Fri, 22 May 2020 01:24:22 +0900 Subject: [PATCH 16/49] bugfix --- python/impurity_solvers/hphi_spectrum.py | 40 ++++++++++++++---------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 45173bb3..e0fb7727 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -62,7 +62,7 @@ def Make_Spectrum_Input(self, spectrum_type="single"): print("Error: Please set NOmega in modpara file") sys.exit(1) - def read_spectrum(self): + def _read_spectrum(self): spectrum_dict={} frequencies =[] for idx in range(self.exct): @@ -71,9 +71,9 @@ def read_spectrum(self): spectrum_dict[idx] = spectrum[:,2] + 1J*spectrum[:,3] if idx == 0 : frequencies = spectrum[:, 0] + 1J*spectrum[:, 1] - self.spectrums_dict = spectrum_dict - self.frequencies = frequencies - return spectrum_dict + spectrums_dict = spectrum_dict + frequencies = frequencies + return frequencies, spectrum_dict def get_energies(self): energy_list = [] @@ -101,7 +101,7 @@ def _calc_Z(self, T): return Z def get_finite_T_spectrum(self): - self.read_spectrum() + frequencies, self.spectrums_dict = self._read_spectrum() finite_T_spectrum_dict ={} for T in self.T_list: Z = self._calc_Z(T) @@ -111,7 +111,7 @@ def get_finite_T_spectrum(self): spectrum /= Z finite_T_spectrum_dict[T]=spectrum self.finite_T_spectrum_dict = finite_T_spectrum_dict - return self.frequencies, finite_T_spectrum_dict + return frequencies, finite_T_spectrum_dict def print_finite_T_spectrum(self, file_name = "Dynamical_Green"): for key, spectrum in self.finite_T_spectrum_dict.items(): @@ -120,7 +120,7 @@ def print_finite_T_spectrum(self, file_name = "Dynamical_Green"): for idx, value in enumerate(spectrum): fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) - def _update_modpara(self, exct): + def _update_modpara(self, exct, ex_state = 0): dict_mod={} header = [] with open("modpara.def", "r") as fr: @@ -129,7 +129,12 @@ def _update_modpara(self, exct): for line in lines[8:]: words = line.split() dict_mod[words[0]] = words[1:] - dict_mod["OmegaOrg"] = [-self.energy_list[exct], 0] + dict_mod["OmegaOrg"] = [self.energy_list[exct], 0] + if ex_state == 0: + omega_max = dict_mod["OmegaMax"] + dict_mod["OmegaMax"] = [-1.0*float(omega_max[0]), -1.0*float(omega_max[1])] + omega_min = dict_mod["OmegaMin"] + dict_mod["OmegaMin"] = [-1.0*float(omega_min[0]), -1.0*float(omega_min[1])] with open("modpara_ex.def", "w") as fw: for line in header: fw.write(line) @@ -160,10 +165,10 @@ def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = fw.write("{} {} {} 1.0 0.0\n".format(site_i, sigma_i, ex_state)) fw.write("{} {} {} 1.0 0.0\n".format(site_j, sigma_j, ex_state)) - def _run_HPhi(self, exct_cut): + def _run_HPhi(self, exct_cut, ex_state=0): for idx in range(exct_cut): #print("Process: {}/{}".format(idx, exct_cut)) - self._update_modpara(idx) + self._update_modpara(idx, ex_state) input_path = "namelist_ex_{}.def".format(idx) exec_path = self.path_to_HPhi with open('./stdout_{}.log'.format(idx), 'w') as output_f: @@ -183,15 +188,17 @@ def get_one_body_green(self, n_site, exct_cut): for ex_state in range(2): self._make_single_excitation(sitei, sigmai, sitei, sigmai, ex_state=ex_state) #Run HPhi - self._run_HPhi(exct_cut) + self._run_HPhi(exct_cut, ex_state) #Get Finite-T Green - frequencies, finite_spectrum_list = self.get_finite_T_spectrum() + frequencies, finite_spectrum_list = calcspectrum.get_finite_T_spectrum() + if ex_state == 1: + self.frequencies = frequencies + sign = 1.0 if ex_state ==1 else -1.0 for T in self.T_list: - one_body_green[T][sitei][sigmai][sitei][sigmai] += finite_spectrum_list[T] + one_body_green[T][sitei][sigmai][sitei][sigmai] += sign*finite_spectrum_list[T] #off diagonal print("Calculate Off-Diagonal Green function") - one_body_green_tmp = [{}, {}] for T in self.T_list: one_body_green_tmp[0][T] = np.zeros((self.nomega), dtype=np.complex) @@ -209,11 +216,12 @@ def get_one_body_green(self, n_site, exct_cut): for idx, flg in enumerate([True, False]): self._make_single_excitation(sitei, sigmai, sitej, sigmaj, ex_state=ex_state, flg_complex=flg) #Run HPhi - self._run_HPhi(exct_cut) + self._run_HPhi(exct_cut, ex_state) #Get Finite-T Green frequencies, finite_spectrum_list = self.get_finite_T_spectrum() + sign = 1.0 if ex_state ==1 else -1.0 for T in self.T_list: - one_body_green_tmp[idx][T] += finite_spectrum_list[T] + one_body_green_tmp[idx][T] += sign*finite_spectrum_list[T] for T in self.T_list: one_body_green_tmp[idx][T] -= one_body_green[T][sitei][sigmai][sitei][sigmai]+one_body_green[T][sitej][sigmaj][sitej][sigmaj] #Get Offdiagonal Green From c9f641e68a1ab8e3615fcf1f574fbd2dcabae103 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Fri, 22 May 2020 01:46:59 +0900 Subject: [PATCH 17/49] bugfix --- python/impurity_solvers/hphi_spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index e0fb7727..337ad6bb 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -190,7 +190,7 @@ def get_one_body_green(self, n_site, exct_cut): #Run HPhi self._run_HPhi(exct_cut, ex_state) #Get Finite-T Green - frequencies, finite_spectrum_list = calcspectrum.get_finite_T_spectrum() + frequencies, finite_spectrum_list = self.get_finite_T_spectrum() if ex_state == 1: self.frequencies = frequencies sign = 1.0 if ex_state ==1 else -1.0 From 7944adecb5ef5a1a581219fef30629480851186a Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 May 2020 14:17:51 +0900 Subject: [PATCH 18/49] Fix a bug --- python/impurity_solvers/hphi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index 1e4b6762..a0548a9a 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -341,7 +341,7 @@ def solve(self, rot, mpirun_command, params_kw): # Make H0 matrix h0_full = numpy.zeros((2, n_site, 2, n_site), dtype=complex) for t in transfer: - h0_full[t.s1, t.i1, t.s2, t.i2] = t.t + h0_full[t.s1, t.i1, t.s2, t.i2] = -t.t h0_full = h0_full.reshape((2*n_site, 2*n_site)) # TODO: move into a function -- begin From 06ad4445011af35204f432905091eb134389dbfc Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 May 2020 14:36:30 +0900 Subject: [PATCH 19/49] Handle exception in checking np --- python/impurity_solvers/hphi.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index a0548a9a..18f1a8f0 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -149,12 +149,16 @@ def solve(self, rot, mpirun_command, params_kw): # The number of process (np) must be 4^m in HPhi mpirun_command_power4 = mpirun_command commands = shlex.split(mpirun_command) - np = int(commands[-1]) - if not math.log(np, 4).is_integer(): # check if np = 4^m - np_new = 4**int(math.log(np, 4)) - warn("np must be a power of 4 in HPhi. np is set to {}.".format(np_new)) - commands[-1] = str(np_new) - mpirun_command_power4 = " ".join(commands) + try: + np = int(commands[-1]) + except ValueError: + print("A check of np is skipped.") + else: + if not math.log(np, 4).is_integer(): # check if np = 4^m + np_new = 4**int(math.log(np, 4)) + warn("np must be a power of 4 in HPhi. np is set to {}.".format(np_new)) + commands[-1] = str(np_new) + mpirun_command_power4 = " ".join(commands) # Matsubara frequencies omega_min = numpy.pi / self.beta # n=0 From c6de4501f31b807a936d14698f08833f40265d2d Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 May 2020 17:39:50 +0900 Subject: [PATCH 20/49] Fix a bug: omega_max is not calculated in HPhi --- python/impurity_solvers/hphi.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/impurity_solvers/hphi.py b/python/impurity_solvers/hphi.py index 18f1a8f0..bd6fd9e1 100644 --- a/python/impurity_solvers/hphi.py +++ b/python/impurity_solvers/hphi.py @@ -160,9 +160,12 @@ def solve(self, rot, mpirun_command, params_kw): commands[-1] = str(np_new) mpirun_command_power4 = " ".join(commands) - # Matsubara frequencies + # Matsubara frequencies omega_n = (2*n+1)*pi*T omega_min = numpy.pi / self.beta # n=0 - omega_max = (2*self.n_iw - 1) * numpy.pi / self.beta # n=n_iw-1 + omega_max = (2*self.n_iw + 1) * numpy.pi / self.beta # n=n_iw + # NOTE: omega_max is NOT included in the omega mesh. + # omega_n = (omega_max - omega_min) / n_iw * n + # for n=[0:n_iw) # bath fitting n_bath = params_kw.get('n_bath', 0) # 0 for Hubbard-I approximation From cdad3eaa887372136e200e99206238c1d5670fd7 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 5 Jun 2020 16:48:13 +0900 Subject: [PATCH 21/49] Delete debug output in dmft_core --- python/dmft_core.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/python/dmft_core.py b/python/dmft_core.py index b82dc080..2d98399b 100644 --- a/python/dmft_core.py +++ b/python/dmft_core.py @@ -723,11 +723,6 @@ def quantities_to_check(): new_Sigma_iw, new_Gimp_iw = self.solve_impurity_models(Gloc_iw_sh, iteration_number) - numpy.savetxt("test_gimp_up.dat", new_Gimp_iw[0]['up'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) - numpy.savetxt("test_gimp_dn.dat", new_Gimp_iw[0]['down'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) - numpy.savetxt("test_sigma_up.dat", new_Sigma_iw[0]['up'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) - numpy.savetxt("test_sigma_dn.dat", new_Sigma_iw[0]['down'].data[self._n_iw:,0,0].view(float).reshape(-1,2)) - print("\nWall Time : %.1f sec" % (time.time() - t0)) sys.stdout.flush() From 471dc129c0ba90dd18a7ceda0557bc59ee76a047 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Mon, 28 Dec 2020 14:06:42 +0900 Subject: [PATCH 22/49] tmp --- python/impurity_solvers/hphi_spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 337ad6bb..82a36746 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -120,7 +120,7 @@ def print_finite_T_spectrum(self, file_name = "Dynamical_Green"): for idx, value in enumerate(spectrum): fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) - def _update_modpara(self, exct, ex_state = 0): + def _update_modpara(self, exct, ex_state=0): dict_mod={} header = [] with open("modpara.def", "r") as fr: From c58b3485e7aa48c503bf2d06aba3dad7edbad005 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Mon, 28 Dec 2020 17:07:44 +0900 Subject: [PATCH 23/49] Add a test for hphi --- test/CMakeLists.txt | 1 + test/hphi/CMakeLists.txt | 5 + test/hphi/hphi.ini | 35 + test/hphi/hphi.py | 37 + test/hphi/sigma.dat.ref | 2007 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 2085 insertions(+) create mode 100644 test/hphi/CMakeLists.txt create mode 100644 test/hphi/hphi.ini create mode 100644 test/hphi/hphi.py create mode 100644 test/hphi/sigma.dat.ref diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9155e3d3..79ecb459 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -30,6 +30,7 @@ if(TEST_DEV) message(STATUS "Activated developers' test") add_subdirectory(bse_chi0) add_subdirectory(bse_sparse) + add_subdirectory(hphi) message(AUTHOR_WARNING "Be sure to include 'bse_home/python' in PYTHONPATH or set 'bse_home' by -DBSE_PATH option") endif() diff --git a/test/hphi/CMakeLists.txt b/test/hphi/CMakeLists.txt new file mode 100644 index 00000000..ef37f27e --- /dev/null +++ b/test/hphi/CMakeLists.txt @@ -0,0 +1,5 @@ +FILE(COPY hphi.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +# FILE(COPY square.out.h5.ref DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +FILE(COPY sigma.dat.ref DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +add_python_test(hphi) diff --git a/test/hphi/hphi.ini b/test/hphi/hphi.ini new file mode 100644 index 00000000..dcdba5ec --- /dev/null +++ b/test/hphi/hphi.ini @@ -0,0 +1,35 @@ +[model] +seedname = square +lattice = square +norb = 1 +nelec = 1.0 +t = -1.0 +kanamori = [(4.0, 0.0, 0.0)] +nk = 8 + +[system] +T = 0.1 +n_iw = 1000 +mu = 2.0 +fix_mu = True + +[impurity_solver] +name = HPhi +exec_path{str} = HPhi +exct{int} = 10 +n_bath{int} = 03 +fit_gtol{float} = 1e-6 + +[control] +max_step = 1 +sigma_mix = 1.0 +# time_reversal = True +converge_tol = 1e-5 + +# [tool] +# broadening = 0.4 +# knode = [(G,0.0,0.0,0.0),(X,0.5,0.0,0.0),(M,0.5,0.5,0.0),(G,0.0,0.0,0.0)] +# nk_line = 100 +# omega_max =6.0 +# omega_min =-5.0 +# Nomega = 400 diff --git a/test/hphi/hphi.py b/test/hphi/hphi.py new file mode 100644 index 00000000..83d49c4c --- /dev/null +++ b/test/hphi/hphi.py @@ -0,0 +1,37 @@ +# +# DCore -- Integrated DMFT software for correlated electrons +# Copyright (C) 2017 The University of Tokyo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +from __future__ import print_function +from dcore.dcore_pre import dcore_pre +from dcore.dcore import dcore +from dcore.dcore_check import dcore_check +# from dcore.tools import h5diff +import numpy + +input_ini = "hphi.ini" + +dcore_pre(input_ini) +dcore(input_ini) + +# A direct comparison of HDF5 file does not work +# h5diff("square.out.h5", "square.out.h5.ref", "dmft_out/Sigma_iw", precision=1e-5) + +# Use sigma.dat generated by dcore_check +dcore_check(input_ini, 'check/', 'png', '100') # generate sigma.dat +sigma = numpy.loadtxt("check/sigma.dat") +sigma_ref = numpy.loadtxt("sigma.dat.ref") +numpy.allclose(sigma, sigma_ref, atol=1e-5) diff --git a/test/hphi/sigma.dat.ref b/test/hphi/sigma.dat.ref new file mode 100644 index 00000000..04870da3 --- /dev/null +++ b/test/hphi/sigma.dat.ref @@ -0,0 +1,2007 @@ +# Local self energy at imaginary frequency +# [Column] Data +# [1] Frequency +# [2] Re(Sigma_{shell=0, spin=up, 0, 0}) +# [3] Im(Sigma_{shell=0, spin=up, 0, 0}) +# [4] Re(Sigma_{shell=0, spin=down, 0, 0}) +# [5] Im(Sigma_{shell=0, spin=down, 0, 0}) +-628.004371 1.869452 0.006341 1.869432 0.006341 +-627.376053 1.869458 0.006356 1.869438 0.006356 +-626.747734 1.869474 0.006370 1.869454 0.006354 +-626.119416 1.869450 0.006371 1.869430 0.006363 +-625.491097 1.869452 0.006363 1.869432 0.006401 +-624.862779 1.869453 0.006395 1.869433 0.006365 +-624.234460 1.869456 0.006381 1.869436 0.006381 +-623.606142 1.869445 0.006399 1.869425 0.006375 +-622.977823 1.869456 0.006399 1.869436 0.006392 +-622.349505 1.869454 0.006394 1.869434 0.006402 +-621.721186 1.869467 0.006411 1.869440 0.006403 +-621.092868 1.869467 0.006414 1.869447 0.006414 +-620.464549 1.869458 0.006400 1.869438 0.006423 +-619.836231 1.869460 0.006426 1.869440 0.006426 +-619.207912 1.869438 0.006420 1.869418 0.006457 +-618.579593 1.869448 0.006453 1.869428 0.006431 +-617.951275 1.869451 0.006447 1.869431 0.006463 +-617.322956 1.869469 0.006436 1.869449 0.006467 +-616.694638 1.869459 0.006476 1.869439 0.006453 +-616.066319 1.869473 0.006488 1.869453 0.006458 +-615.438001 1.869456 0.006461 1.869436 0.006477 +-614.809682 1.869463 0.006482 1.869443 0.006475 +-614.181364 1.869463 0.006472 1.869443 0.006480 +-613.553045 1.869450 0.006502 1.869430 0.006494 +-612.924727 1.869444 0.006501 1.869424 0.006494 +-612.296408 1.869462 0.006504 1.869442 0.006481 +-611.668090 1.869467 0.006498 1.869447 0.006521 +-611.039771 1.869441 0.006512 1.869421 0.006534 +-610.411453 1.869454 0.006503 1.869434 0.006525 +-609.783134 1.869460 0.006550 1.869440 0.006520 +-609.154816 1.869452 0.006554 1.869432 0.006531 +-608.526497 1.869446 0.006562 1.869426 0.006533 +-607.898178 1.869440 0.006543 1.869420 0.006542 +-607.269860 1.869472 0.006557 1.869451 0.006557 +-606.641541 1.869452 0.006580 1.869432 0.006552 +-606.013223 1.869449 0.006560 1.869429 0.006582 +-605.384904 1.869446 0.006593 1.869426 0.006570 +-604.756586 1.869452 0.006580 1.869432 0.006594 +-604.128267 1.869474 0.006594 1.869454 0.006594 +-603.499949 1.869458 0.006601 1.869438 0.006592 +-602.871630 1.869459 0.006597 1.869439 0.006596 +-602.243312 1.869461 0.006614 1.869441 0.006615 +-601.614993 1.869464 0.006610 1.869444 0.006632 +-600.986675 1.869446 0.006615 1.869426 0.006636 +-600.358356 1.869442 0.006640 1.869422 0.006625 +-599.730038 1.869442 0.006639 1.869422 0.006646 +-599.101719 1.869461 0.006646 1.869441 0.006631 +-598.473401 1.869469 0.006656 1.869448 0.006656 +-597.845082 1.869448 0.006674 1.869428 0.006653 +-597.216763 1.869463 0.006683 1.869443 0.006670 +-596.588445 1.869452 0.006675 1.869432 0.006681 +-595.960126 1.869448 0.006686 1.869428 0.006686 +-595.331808 1.869459 0.006700 1.869439 0.006700 +-594.703489 1.869450 0.006694 1.869430 0.006694 +-594.075171 1.869442 0.006707 1.869422 0.006686 +-593.446852 1.869456 0.006708 1.869436 0.006714 +-592.818534 1.869449 0.006707 1.869429 0.006729 +-592.190215 1.869444 0.006724 1.869424 0.006745 +-591.561897 1.869461 0.006742 1.869441 0.006742 +-590.933578 1.869470 0.006743 1.869450 0.006743 +-590.305260 1.869440 0.006747 1.869420 0.006747 +-589.676941 1.869460 0.006736 1.869440 0.006763 +-589.048623 1.869451 0.006763 1.869431 0.006763 +-588.420304 1.869437 0.006777 1.869417 0.006757 +-587.791985 1.869459 0.006775 1.869439 0.006762 +-587.163667 1.869468 0.006770 1.869448 0.006777 +-586.535348 1.869444 0.006784 1.869423 0.006805 +-585.907030 1.869454 0.006790 1.869433 0.006797 +-585.278711 1.869452 0.006805 1.869432 0.006811 +-584.650393 1.869457 0.006817 1.869437 0.006811 +-584.022074 1.869443 0.006821 1.869423 0.006821 +-583.393756 1.869450 0.006832 1.869430 0.006832 +-582.765437 1.869437 0.006828 1.869417 0.006834 +-582.137119 1.869454 0.006854 1.869434 0.006854 +-581.508800 1.869451 0.006847 1.869431 0.006847 +-580.880482 1.869447 0.006852 1.869427 0.006872 +-580.252163 1.869453 0.006859 1.869433 0.006854 +-579.623845 1.869465 0.006874 1.869445 0.006868 +-578.995526 1.869439 0.006880 1.869419 0.006854 +-578.367208 1.869447 0.006881 1.869427 0.006901 +-577.738889 1.869443 0.006897 1.869423 0.006897 +-577.110570 1.869445 0.006917 1.869425 0.006890 +-576.482252 1.869456 0.006912 1.869436 0.006906 +-575.853933 1.869454 0.006922 1.869434 0.006915 +-575.225615 1.869447 0.006916 1.869427 0.006935 +-574.597296 1.869448 0.006932 1.869428 0.006932 +-573.968978 1.869448 0.006922 1.869428 0.006942 +-573.340659 1.869470 0.006944 1.869450 0.006944 +-572.712341 1.869473 0.006950 1.869453 0.006969 +-572.084022 1.869451 0.006962 1.869431 0.006974 +-571.455704 1.869456 0.006979 1.869436 0.006973 +-570.827385 1.869462 0.006962 1.869442 0.006987 +-570.199067 1.869462 0.006991 1.869442 0.006984 +-569.570748 1.869470 0.007000 1.869450 0.007006 +-568.942430 1.869453 0.006993 1.869433 0.007000 +-568.314111 1.869443 0.007009 1.869423 0.007015 +-567.685793 1.869448 0.007012 1.869428 0.007018 +-567.057474 1.869459 0.007026 1.869439 0.007026 +-566.429155 1.869452 0.007042 1.869432 0.007031 +-565.800837 1.869434 0.007017 1.869414 0.007042 +-565.172518 1.869449 0.007035 1.869429 0.007053 +-564.544200 1.869464 0.007044 1.869444 0.007063 +-563.915881 1.869449 0.007056 1.869429 0.007069 +-563.287563 1.869447 0.007074 1.869427 0.007075 +-562.659244 1.869465 0.007086 1.869445 0.007067 +-562.030926 1.869440 0.007083 1.869420 0.007083 +-561.402607 1.869454 0.007087 1.869434 0.007093 +-560.774289 1.869456 0.007106 1.869436 0.007093 +-560.145970 1.869459 0.007097 1.869439 0.007098 +-559.517652 1.869452 0.007137 1.869432 0.007112 +-558.889333 1.869451 0.007128 1.869431 0.007110 +-558.261015 1.869451 0.007127 1.869431 0.007128 +-557.632696 1.869457 0.007150 1.869437 0.007150 +-557.004377 1.869454 0.007165 1.869434 0.007152 +-556.376059 1.869457 0.007156 1.869437 0.007156 +-555.747740 1.869473 0.007162 1.869453 0.007162 +-555.119422 1.869454 0.007186 1.869434 0.007167 +-554.491103 1.869459 0.007178 1.869439 0.007178 +-553.862785 1.869443 0.007197 1.869423 0.007179 +-553.234466 1.869444 0.007200 1.869424 0.007200 +-552.606148 1.869447 0.007198 1.869427 0.007216 +-551.977829 1.869440 0.007232 1.869420 0.007207 +-551.349511 1.869450 0.007239 1.869430 0.007221 +-550.721192 1.869444 0.007237 1.869424 0.007232 +-550.092874 1.869445 0.007256 1.869425 0.007238 +-549.464555 1.869459 0.007258 1.869439 0.007245 +-548.836237 1.869457 0.007264 1.869436 0.007258 +-548.207918 1.869454 0.007259 1.869434 0.007252 +-547.579600 1.869454 0.007268 1.869434 0.007273 +-546.951281 1.869472 0.007285 1.869452 0.007267 +-546.322962 1.869467 0.007286 1.869447 0.007280 +-545.694644 1.869470 0.007294 1.869450 0.007294 +-545.066325 1.869455 0.007307 1.869435 0.007307 +-544.438007 1.869454 0.007301 1.869434 0.007330 +-543.809688 1.869460 0.007321 1.869440 0.007333 +-543.181370 1.869472 0.007333 1.869452 0.007333 +-542.553051 1.869456 0.007330 1.869436 0.007340 +-541.924733 1.869459 0.007344 1.869439 0.007355 +-541.296414 1.869463 0.007346 1.869443 0.007358 +-540.668096 1.869450 0.007360 1.869430 0.007360 +-540.039777 1.869450 0.007372 1.869430 0.007372 +-539.411459 1.869463 0.007377 1.869443 0.007383 +-538.783140 1.869454 0.007396 1.869434 0.007378 +-538.154822 1.869451 0.007400 1.869431 0.007393 +-537.526503 1.869468 0.007416 1.869448 0.007410 +-536.898184 1.869462 0.007416 1.869442 0.007416 +-536.269866 1.869457 0.007422 1.869437 0.007434 +-535.641547 1.869458 0.007428 1.869438 0.007446 +-535.013229 1.869456 0.007445 1.869436 0.007445 +-534.384910 1.869460 0.007449 1.869440 0.007449 +-533.756592 1.869459 0.007462 1.869439 0.007462 +-533.128273 1.869454 0.007467 1.869434 0.007484 +-532.499955 1.869450 0.007463 1.869430 0.007486 +-531.871636 1.869448 0.007491 1.869428 0.007485 +-531.243318 1.869463 0.007491 1.869443 0.007503 +-530.614999 1.869462 0.007511 1.869442 0.007511 +-529.986681 1.869452 0.007515 1.869432 0.007520 +-529.358362 1.869465 0.007519 1.869439 0.007525 +-528.730044 1.869445 0.007535 1.869425 0.007530 +-528.101725 1.869449 0.007552 1.869429 0.007535 +-527.473407 1.869438 0.007541 1.869418 0.007541 +-526.845088 1.869460 0.007557 1.869440 0.007546 +-526.216769 1.869440 0.007573 1.869420 0.007556 +-525.588451 1.869454 0.007588 1.869434 0.007567 +-524.960132 1.869457 0.007597 1.869437 0.007581 +-524.331814 1.869452 0.007589 1.869432 0.007590 +-523.703495 1.869453 0.007596 1.869433 0.007596 +-523.075177 1.869454 0.007614 1.869434 0.007619 +-522.446858 1.869452 0.007624 1.869432 0.007619 +-521.818540 1.869445 0.007639 1.869425 0.007618 +-521.190221 1.869445 0.007642 1.869425 0.007642 +-520.561903 1.869452 0.007649 1.869432 0.007655 +-519.933584 1.869465 0.007661 1.869445 0.007661 +-519.305266 1.869452 0.007662 1.869432 0.007683 +-518.676947 1.869446 0.007671 1.869426 0.007677 +-518.048629 1.869462 0.007691 1.869442 0.007692 +-517.420310 1.869453 0.007690 1.869433 0.007690 +-516.791992 1.869450 0.007709 1.869430 0.007709 +-516.163673 1.869460 0.007707 1.869440 0.007712 +-515.535354 1.869459 0.007716 1.869439 0.007742 +-514.907036 1.869439 0.007725 1.869419 0.007741 +-514.278717 1.869457 0.007745 1.869437 0.007735 +-513.650399 1.869455 0.007757 1.869435 0.007757 +-513.022080 1.869459 0.007758 1.869439 0.007759 +-512.393762 1.869449 0.007772 1.869429 0.007772 +-511.765443 1.869456 0.007799 1.869436 0.007783 +-511.137125 1.869459 0.007802 1.869439 0.007787 +-510.508806 1.869447 0.007813 1.869427 0.007787 +-509.880488 1.869457 0.007803 1.869437 0.007828 +-509.252169 1.869469 0.007826 1.869449 0.007816 +-508.623851 1.869441 0.007829 1.869421 0.007829 +-507.995532 1.869450 0.007831 1.869430 0.007847 +-507.367214 1.869449 0.007855 1.869429 0.007850 +-506.738895 1.869460 0.007865 1.869440 0.007854 +-506.110576 1.869457 0.007876 1.869437 0.007866 +-505.482258 1.869445 0.007879 1.869425 0.007879 +-504.853939 1.869460 0.007886 1.869440 0.007895 +-504.225621 1.869440 0.007896 1.869420 0.007901 +-503.597302 1.869462 0.007911 1.869442 0.007906 +-502.968984 1.869466 0.007911 1.869446 0.007926 +-502.340665 1.869455 0.007932 1.869435 0.007927 +-501.712347 1.869450 0.007940 1.869430 0.007925 +-501.084028 1.869452 0.007936 1.869432 0.007961 +-500.455710 1.869461 0.007955 1.869441 0.007955 +-499.827391 1.869444 0.007965 1.869424 0.007965 +-499.199073 1.869450 0.007984 1.869430 0.007984 +-498.570754 1.869447 0.007975 1.869427 0.007990 +-497.942436 1.869460 0.007994 1.869440 0.007989 +-497.314117 1.869460 0.008011 1.869440 0.008010 +-496.685799 1.869450 0.008013 1.869430 0.008032 +-496.057480 1.869443 0.008025 1.869423 0.008025 +-495.429161 1.869461 0.008029 1.869441 0.008053 +-494.800843 1.869446 0.008055 1.869426 0.008055 +-494.172524 1.869447 0.008057 1.869427 0.008062 +-493.544206 1.869458 0.008073 1.869438 0.008078 +-492.915887 1.869448 0.008087 1.869428 0.008087 +-492.287569 1.869457 0.008093 1.869437 0.008078 +-491.659250 1.869449 0.008099 1.869429 0.008089 +-491.030932 1.869461 0.008105 1.869441 0.008105 +-490.402613 1.869445 0.008117 1.869425 0.008117 +-489.774295 1.869455 0.008124 1.869435 0.008129 +-489.145976 1.869452 0.008140 1.869432 0.008140 +-488.517658 1.869455 0.008147 1.869435 0.008162 +-487.889339 1.869455 0.008162 1.869435 0.008162 +-487.261021 1.869441 0.008172 1.869421 0.008181 +-486.632702 1.869444 0.008182 1.869424 0.008182 +-486.004384 1.869452 0.008195 1.869432 0.008195 +-485.376065 1.869447 0.008203 1.869427 0.008203 +-484.747746 1.869449 0.008212 1.869429 0.008212 +-484.119428 1.869456 0.008227 1.869436 0.008227 +-483.491109 1.869451 0.008232 1.869431 0.008233 +-482.862791 1.869447 0.008248 1.869427 0.008244 +-482.234472 1.869449 0.008263 1.869429 0.008249 +-481.606154 1.869448 0.008263 1.869428 0.008272 +-480.977835 1.869461 0.008283 1.869441 0.008278 +-480.349517 1.869463 0.008302 1.869443 0.008288 +-479.721198 1.869447 0.008298 1.869427 0.008303 +-479.092880 1.869456 0.008320 1.869436 0.008302 +-478.464561 1.869453 0.008328 1.869433 0.008315 +-477.836243 1.869451 0.008333 1.869430 0.008333 +-477.207924 1.869459 0.008355 1.869439 0.008351 +-476.579606 1.869455 0.008355 1.869435 0.008355 +-475.951287 1.869452 0.008355 1.869432 0.008368 +-475.322968 1.869447 0.008372 1.869426 0.008376 +-474.694650 1.869447 0.008383 1.869427 0.008387 +-474.066331 1.869457 0.008393 1.869437 0.008407 +-473.438013 1.869447 0.008406 1.869427 0.008420 +-472.809694 1.869447 0.008432 1.869427 0.008419 +-472.181376 1.869453 0.008433 1.869433 0.008438 +-471.553057 1.869460 0.008439 1.869440 0.008452 +-470.924739 1.869447 0.008455 1.869427 0.008468 +-470.296420 1.869456 0.008458 1.869436 0.008466 +-469.668102 1.869450 0.008485 1.869430 0.008476 +-469.039783 1.869449 0.008494 1.869429 0.008494 +-468.411465 1.869459 0.008509 1.869439 0.008496 +-467.783146 1.869457 0.008521 1.869437 0.008512 +-467.154828 1.869453 0.008526 1.869433 0.008526 +-466.526509 1.869458 0.008536 1.869438 0.008545 +-465.898191 1.869452 0.008554 1.869432 0.008550 +-465.269872 1.869451 0.008557 1.869431 0.008557 +-464.641553 1.869456 0.008567 1.869436 0.008588 +-464.013235 1.869451 0.008584 1.869431 0.008592 +-463.384916 1.869463 0.008596 1.869443 0.008595 +-462.756598 1.869455 0.008607 1.869435 0.008607 +-462.128279 1.869449 0.008628 1.869429 0.008611 +-461.499961 1.869449 0.008619 1.869429 0.008632 +-460.871642 1.869454 0.008646 1.869434 0.008646 +-460.243324 1.869449 0.008649 1.869429 0.008649 +-459.615005 1.869457 0.008668 1.869437 0.008672 +-458.986687 1.869446 0.008668 1.869426 0.008681 +-458.358368 1.869449 0.008686 1.869429 0.008699 +-457.730050 1.869457 0.008704 1.869437 0.008704 +-457.101731 1.869442 0.008724 1.869422 0.008711 +-456.473413 1.869454 0.008719 1.869434 0.008715 +-455.845094 1.869454 0.008736 1.869434 0.008744 +-455.216776 1.869460 0.008743 1.869428 0.008743 +-454.588457 1.869463 0.008760 1.869443 0.008760 +-453.960138 1.869453 0.008774 1.869433 0.008769 +-453.331820 1.869451 0.008783 1.869431 0.008791 +-452.703501 1.869443 0.008795 1.869423 0.008799 +-452.075183 1.869456 0.008820 1.869436 0.008813 +-451.446864 1.869451 0.008818 1.869431 0.008831 +-450.818546 1.869459 0.008829 1.869439 0.008837 +-450.190227 1.869449 0.008859 1.869429 0.008851 +-449.561909 1.869453 0.008862 1.869433 0.008858 +-448.933590 1.869450 0.008880 1.869430 0.008880 +-448.305272 1.869445 0.008890 1.869425 0.008874 +-447.676953 1.869444 0.008893 1.869424 0.008889 +-447.048635 1.869450 0.008919 1.869430 0.008907 +-446.420316 1.869461 0.008913 1.869441 0.008921 +-445.791998 1.869443 0.008933 1.869423 0.008933 +-445.163679 1.869449 0.008948 1.869429 0.008955 +-444.535360 1.869449 0.008963 1.869429 0.008967 +-443.907042 1.869451 0.008976 1.869431 0.008976 +-443.278723 1.869446 0.008986 1.869426 0.008986 +-442.650405 1.869443 0.008997 1.869423 0.008997 +-442.022086 1.869457 0.009007 1.869437 0.009004 +-441.393768 1.869461 0.009018 1.869441 0.009034 +-440.765449 1.869459 0.009029 1.869439 0.009041 +-440.137131 1.869459 0.009044 1.869439 0.009044 +-439.508812 1.869448 0.009069 1.869428 0.009065 +-438.880494 1.869455 0.009072 1.869435 0.009075 +-438.252175 1.869452 0.009089 1.869432 0.009089 +-437.623857 1.869443 0.009098 1.869423 0.009098 +-436.995538 1.869443 0.009111 1.869423 0.009114 +-436.367220 1.869452 0.009120 1.869432 0.009119 +-435.738901 1.869459 0.009140 1.869439 0.009140 +-435.110583 1.869457 0.009153 1.869437 0.009153 +-434.482264 1.869444 0.009166 1.869424 0.009163 +-433.853945 1.869453 0.009177 1.869433 0.009177 +-433.225627 1.869455 0.009189 1.869435 0.009189 +-432.597308 1.869444 0.009198 1.869424 0.009209 +-431.968990 1.869450 0.009229 1.869430 0.009214 +-431.340671 1.869454 0.009232 1.869434 0.009232 +-430.712353 1.869452 0.009245 1.869432 0.009238 +-430.084034 1.869459 0.009258 1.869439 0.009258 +-429.455716 1.869446 0.009276 1.869426 0.009283 +-428.827397 1.869449 0.009283 1.869429 0.009283 +-428.199079 1.869450 0.009304 1.869430 0.009300 +-427.570760 1.869441 0.009316 1.869421 0.009316 +-426.942442 1.869449 0.009328 1.869429 0.009328 +-426.314123 1.869456 0.009344 1.869436 0.009348 +-425.685805 1.869449 0.009347 1.869429 0.009347 +-425.057486 1.869445 0.009360 1.869425 0.009371 +-424.429167 1.869449 0.009380 1.869429 0.009387 +-423.800849 1.869455 0.009397 1.869435 0.009397 +-423.172530 1.869455 0.009415 1.869435 0.009412 +-422.544212 1.869461 0.009419 1.869441 0.009423 +-421.915893 1.869451 0.009445 1.869431 0.009442 +-421.287575 1.869449 0.009452 1.869429 0.009452 +-420.659256 1.869449 0.009465 1.869429 0.009465 +-420.030938 1.869445 0.009486 1.869425 0.009486 +-419.402619 1.869452 0.009491 1.869432 0.009495 +-418.774301 1.869454 0.009511 1.869434 0.009500 +-418.145982 1.869451 0.009521 1.869431 0.009525 +-417.517664 1.869443 0.009538 1.869423 0.009531 +-416.889345 1.869454 0.009556 1.869434 0.009549 +-416.261027 1.869453 0.009566 1.869433 0.009566 +-415.632708 1.869444 0.009590 1.869424 0.009584 +-415.004390 1.869450 0.009597 1.869430 0.009597 +-414.376071 1.869451 0.009611 1.869431 0.009611 +-413.747752 1.869454 0.009624 1.869434 0.009624 +-413.119434 1.869451 0.009641 1.869431 0.009645 +-412.491115 1.869454 0.009651 1.869434 0.009648 +-411.862797 1.869449 0.009669 1.869429 0.009675 +-411.234478 1.869442 0.009683 1.869422 0.009686 +-410.606160 1.869447 0.009702 1.869427 0.009702 +-409.977841 1.869451 0.009715 1.869431 0.009718 +-409.349523 1.869450 0.009733 1.869430 0.009733 +-408.721204 1.869454 0.009737 1.869434 0.009737 +-408.092886 1.869446 0.009757 1.869426 0.009767 +-407.464567 1.869448 0.009770 1.869428 0.009766 +-406.836249 1.869444 0.009787 1.869424 0.009787 +-406.207930 1.869449 0.009808 1.869429 0.009808 +-405.579612 1.869456 0.009821 1.869436 0.009815 +-404.951293 1.869452 0.009841 1.869432 0.009834 +-404.322975 1.869452 0.009851 1.869432 0.009851 +-403.694656 1.869445 0.009862 1.869425 0.009862 +-403.066337 1.869447 0.009876 1.869427 0.009876 +-402.438019 1.869453 0.009898 1.869433 0.009892 +-401.809700 1.869452 0.009907 1.869432 0.009910 +-401.181382 1.869450 0.009926 1.869430 0.009926 +-400.553063 1.869452 0.009939 1.869432 0.009946 +-399.924745 1.869453 0.009957 1.869433 0.009954 +-399.296426 1.869447 0.009980 1.869427 0.009967 +-398.668108 1.869456 0.009991 1.869436 0.009991 +-398.039789 1.869454 0.010008 1.869434 0.009998 +-397.411471 1.869441 0.010018 1.869421 0.010030 +-396.783152 1.869455 0.010036 1.869435 0.010036 +-396.154834 1.869456 0.010058 1.869436 0.010058 +-395.526515 1.869452 0.010069 1.869432 0.010069 +-394.898197 1.869448 0.010086 1.869428 0.010086 +-394.269878 1.869448 0.010106 1.869428 0.010106 +-393.641559 1.869453 0.010120 1.869433 0.010123 +-393.013241 1.869443 0.010130 1.869423 0.010139 +-392.384922 1.869449 0.010141 1.869429 0.010141 +-391.756604 1.869445 0.010160 1.869425 0.010160 +-391.128285 1.869455 0.010179 1.869435 0.010179 +-390.499967 1.869447 0.010200 1.869427 0.010197 +-389.871648 1.869449 0.010206 1.869429 0.010215 +-389.243330 1.869451 0.010232 1.869431 0.010232 +-388.615011 1.869448 0.010248 1.869428 0.010248 +-387.986693 1.869448 0.010267 1.869428 0.010267 +-387.358374 1.869446 0.010280 1.869426 0.010280 +-386.730056 1.869450 0.010290 1.869430 0.010290 +-386.101737 1.869447 0.010313 1.869427 0.010316 +-385.473419 1.869454 0.010330 1.869434 0.010333 +-384.845100 1.869450 0.010349 1.869430 0.010346 +-384.216782 1.869450 0.010367 1.869430 0.010367 +-383.588463 1.869455 0.010387 1.869435 0.010387 +-382.960144 1.869451 0.010396 1.869431 0.010396 +-382.331826 1.869449 0.010415 1.869429 0.010419 +-381.703507 1.869452 0.010430 1.869432 0.010428 +-381.075189 1.869442 0.010444 1.869422 0.010447 +-380.446870 1.869449 0.010467 1.869429 0.010469 +-379.818552 1.869444 0.010486 1.869424 0.010486 +-379.190233 1.869453 0.010503 1.869433 0.010503 +-378.561915 1.869444 0.010517 1.869424 0.010520 +-377.933596 1.869446 0.010535 1.869425 0.010538 +-377.305278 1.869441 0.010551 1.869421 0.010553 +-376.676959 1.869449 0.010571 1.869429 0.010571 +-376.048641 1.869452 0.010590 1.869432 0.010590 +-375.420322 1.869453 0.010604 1.869433 0.010604 +-374.792004 1.869457 0.010623 1.869437 0.010629 +-374.163685 1.869444 0.010644 1.869424 0.010644 +-373.535367 1.869445 0.010664 1.869425 0.010653 +-372.907048 1.869444 0.010678 1.869424 0.010678 +-372.278729 1.869441 0.010695 1.869421 0.010695 +-371.650411 1.869447 0.010721 1.869427 0.010713 +-371.022092 1.869454 0.010732 1.869434 0.010738 +-370.393774 1.869454 0.010757 1.869434 0.010759 +-369.765455 1.869448 0.010774 1.869428 0.010771 +-369.137137 1.869445 0.010788 1.869425 0.010788 +-368.508818 1.869453 0.010804 1.869433 0.010804 +-367.880500 1.869449 0.010824 1.869429 0.010827 +-367.252181 1.869450 0.010841 1.869430 0.010841 +-366.623863 1.869448 0.010862 1.869428 0.010862 +-365.995544 1.869451 0.010875 1.869431 0.010875 +-365.367226 1.869448 0.010897 1.869428 0.010904 +-364.738907 1.869448 0.010918 1.869428 0.010918 +-364.110589 1.869447 0.010935 1.869427 0.010937 +-363.482270 1.869449 0.010959 1.869429 0.010959 +-362.853951 1.869450 0.010974 1.869430 0.010974 +-362.225633 1.869452 0.010992 1.869432 0.010992 +-361.597314 1.869442 0.011014 1.869422 0.011011 +-360.968996 1.869448 0.011040 1.869428 0.011038 +-360.340677 1.869444 0.011051 1.869424 0.011046 +-359.712359 1.869450 0.011071 1.869430 0.011071 +-359.084040 1.869450 0.011091 1.869430 0.011091 +-358.455722 1.869448 0.011114 1.869428 0.011112 +-357.827403 1.869450 0.011135 1.869430 0.011130 +-357.199085 1.869440 0.011153 1.869420 0.011151 +-356.570766 1.869450 0.011175 1.869430 0.011167 +-355.942448 1.869452 0.011192 1.869432 0.011189 +-355.314129 1.869445 0.011207 1.869425 0.011207 +-354.685811 1.869444 0.011222 1.869424 0.011229 +-354.057492 1.869444 0.011248 1.869424 0.011250 +-353.429174 1.869449 0.011269 1.869429 0.011274 +-352.800855 1.869446 0.011285 1.869426 0.011282 +-352.172536 1.869443 0.011301 1.869423 0.011308 +-351.544218 1.869448 0.011325 1.869428 0.011322 +-350.915899 1.869446 0.011352 1.869426 0.011345 +-350.287581 1.869443 0.011368 1.869423 0.011368 +-349.659262 1.869446 0.011392 1.869426 0.011392 +-349.030944 1.869449 0.011404 1.869429 0.011402 +-348.402625 1.869449 0.011426 1.869429 0.011429 +-347.774307 1.869450 0.011449 1.869430 0.011449 +-347.145988 1.869446 0.011467 1.869426 0.011469 +-346.517670 1.869451 0.011493 1.869424 0.011493 +-345.889351 1.869445 0.011513 1.869425 0.011516 +-345.261033 1.869442 0.011535 1.869422 0.011533 +-344.632714 1.869446 0.011552 1.869426 0.011552 +-344.004396 1.869446 0.011578 1.869426 0.011576 +-343.376077 1.869450 0.011601 1.869430 0.011603 +-342.747759 1.869446 0.011616 1.869426 0.011616 +-342.119440 1.869449 0.011632 1.869429 0.011632 +-341.491121 1.869452 0.011660 1.869432 0.011658 +-340.862803 1.869442 0.011677 1.869422 0.011684 +-340.234484 1.869448 0.011704 1.869428 0.011704 +-339.606166 1.869448 0.011726 1.869428 0.011728 +-338.977847 1.869443 0.011747 1.869423 0.011747 +-338.349529 1.869451 0.011773 1.869424 0.011774 +-337.721210 1.869447 0.011793 1.869427 0.011795 +-337.092892 1.869446 0.011808 1.869426 0.011808 +-336.464573 1.869448 0.011834 1.869428 0.011832 +-335.836255 1.869446 0.011857 1.869426 0.011857 +-335.207936 1.869445 0.011880 1.869425 0.011875 +-334.579618 1.869444 0.011909 1.869424 0.011907 +-333.951299 1.869444 0.011924 1.869424 0.011924 +-333.322981 1.869446 0.011951 1.869426 0.011949 +-332.694662 1.869447 0.011966 1.869427 0.011967 +-332.066343 1.869446 0.011990 1.869426 0.011990 +-331.438025 1.869448 0.012013 1.869428 0.012013 +-330.809706 1.869443 0.012040 1.869423 0.012040 +-330.181388 1.869442 0.012060 1.869422 0.012058 +-329.553069 1.869446 0.012080 1.869426 0.012080 +-328.924751 1.869442 0.012106 1.869422 0.012106 +-328.296432 1.869452 0.012131 1.869432 0.012131 +-327.668114 1.869448 0.012156 1.869428 0.012154 +-327.039795 1.869440 0.012174 1.869420 0.012174 +-326.411477 1.869448 0.012193 1.869428 0.012199 +-325.783158 1.869448 0.012223 1.869428 0.012224 +-325.154840 1.869445 0.012251 1.869425 0.012246 +-324.526521 1.869442 0.012265 1.869422 0.012263 +-323.898203 1.869445 0.012295 1.869425 0.012293 +-323.269884 1.869438 0.012314 1.869418 0.012314 +-322.641566 1.869445 0.012341 1.869425 0.012341 +-322.013247 1.869446 0.012362 1.869426 0.012368 +-321.384928 1.869444 0.012392 1.869424 0.012388 +-320.756610 1.869444 0.012416 1.869424 0.012418 +-320.128291 1.869448 0.012434 1.869428 0.012436 +-319.499973 1.869441 0.012463 1.869421 0.012463 +-318.871654 1.869443 0.012489 1.869423 0.012486 +-318.243336 1.869442 0.012512 1.869422 0.012514 +-317.615017 1.869449 0.012536 1.869429 0.012536 +-316.986699 1.869444 0.012561 1.869424 0.012563 +-316.358380 1.869444 0.012584 1.869424 0.012592 +-315.730062 1.869442 0.012610 1.869422 0.012610 +-315.101743 1.869443 0.012636 1.869423 0.012634 +-314.473425 1.869441 0.012662 1.869421 0.012660 +-313.845106 1.869442 0.012686 1.869422 0.012688 +-313.216788 1.869444 0.012711 1.869424 0.012711 +-312.588469 1.869444 0.012744 1.869424 0.012738 +-311.960151 1.869443 0.012765 1.869423 0.012765 +-311.331832 1.869449 0.012794 1.869429 0.012794 +-310.703513 1.869444 0.012818 1.869424 0.012818 +-310.075195 1.869446 0.012843 1.869426 0.012843 +-309.446876 1.869447 0.012868 1.869427 0.012866 +-308.818558 1.869441 0.012899 1.869421 0.012898 +-308.190239 1.869444 0.012920 1.869424 0.012918 +-307.561921 1.869445 0.012947 1.869425 0.012946 +-306.933602 1.869447 0.012974 1.869427 0.012968 +-306.305284 1.869445 0.013000 1.869425 0.012998 +-305.676965 1.869447 0.013027 1.869427 0.013027 +-305.048647 1.869439 0.013053 1.869419 0.013051 +-304.420328 1.869443 0.013078 1.869423 0.013084 +-303.792010 1.869443 0.013105 1.869423 0.013110 +-303.163691 1.869442 0.013132 1.869422 0.013131 +-302.535373 1.869445 0.013162 1.869425 0.013161 +-301.907054 1.869443 0.013192 1.869423 0.013187 +-301.278735 1.869444 0.013215 1.869424 0.013215 +-300.650417 1.869445 0.013245 1.869425 0.013244 +-300.022098 1.869441 0.013271 1.869421 0.013271 +-299.393780 1.869442 0.013299 1.869422 0.013299 +-298.765461 1.869446 0.013328 1.869426 0.013328 +-298.137143 1.869447 0.013356 1.869421 0.013356 +-297.508824 1.869439 0.013382 1.869419 0.013384 +-296.880506 1.869441 0.013413 1.869421 0.013413 +-296.252187 1.869444 0.013442 1.869424 0.013444 +-295.623869 1.869446 0.013469 1.869426 0.013469 +-294.995550 1.869440 0.013498 1.869420 0.013498 +-294.367232 1.869445 0.013527 1.869425 0.013522 +-293.738913 1.869443 0.013556 1.869423 0.013556 +-293.110595 1.869444 0.013587 1.869424 0.013582 +-292.482276 1.869446 0.013614 1.869426 0.013614 +-291.853958 1.869441 0.013643 1.869421 0.013643 +-291.225639 1.869441 0.013670 1.869421 0.013675 +-290.597320 1.869441 0.013702 1.869421 0.013704 +-289.969002 1.869447 0.013731 1.869427 0.013737 +-289.340683 1.869445 0.013766 1.869425 0.013768 +-288.712365 1.869442 0.013789 1.869422 0.013789 +-288.084046 1.869442 0.013820 1.869422 0.013819 +-287.455728 1.869444 0.013849 1.869424 0.013848 +-286.827409 1.869442 0.013885 1.869422 0.013877 +-286.199091 1.869444 0.013913 1.869418 0.013911 +-285.570772 1.869442 0.013944 1.869422 0.013943 +-284.942454 1.869439 0.013973 1.869419 0.013975 +-284.314135 1.869440 0.014004 1.869420 0.014006 +-283.685817 1.869441 0.014034 1.869421 0.014034 +-283.057498 1.869440 0.014062 1.869420 0.014063 +-282.429180 1.869441 0.014096 1.869421 0.014095 +-281.800861 1.869443 0.014126 1.869421 0.014127 +-281.172542 1.869442 0.014160 1.869422 0.014165 +-280.544224 1.869446 0.014195 1.869426 0.014195 +-279.915905 1.869442 0.014223 1.869422 0.014224 +-279.287587 1.869443 0.014261 1.869423 0.014257 +-278.659268 1.869441 0.014288 1.869421 0.014289 +-278.030950 1.869440 0.014319 1.869420 0.014324 +-277.402631 1.869442 0.014357 1.869422 0.014352 +-276.774313 1.869440 0.014383 1.869420 0.014383 +-276.145994 1.869438 0.014420 1.869418 0.014415 +-275.517676 1.869443 0.014453 1.869423 0.014448 +-274.889357 1.869440 0.014481 1.869420 0.014485 +-274.261039 1.869439 0.014517 1.869419 0.014517 +-273.632720 1.869440 0.014552 1.869420 0.014552 +-273.004402 1.869440 0.014583 1.869420 0.014587 +-272.376083 1.869442 0.014618 1.869422 0.014617 +-271.747765 1.869439 0.014650 1.869419 0.014650 +-271.119446 1.869442 0.014684 1.869421 0.014686 +-270.491127 1.869443 0.014717 1.869423 0.014720 +-269.862809 1.869439 0.014754 1.869419 0.014754 +-269.234490 1.869440 0.014789 1.869420 0.014789 +-268.606172 1.869440 0.014826 1.869420 0.014819 +-267.977853 1.869441 0.014857 1.869421 0.014859 +-267.349535 1.869439 0.014896 1.869419 0.014896 +-266.721216 1.869441 0.014929 1.869421 0.014923 +-266.092898 1.869440 0.014965 1.869420 0.014965 +-265.464579 1.869437 0.014996 1.869417 0.014996 +-264.836261 1.869435 0.015036 1.869415 0.015032 +-264.207942 1.869442 0.015070 1.869422 0.015070 +-263.579624 1.869433 0.015107 1.869413 0.015103 +-262.951305 1.869435 0.015141 1.869415 0.015141 +-262.322987 1.869442 0.015176 1.869422 0.015180 +-261.694668 1.869438 0.015219 1.869418 0.015214 +-261.066350 1.869440 0.015249 1.869420 0.015249 +-260.438031 1.869436 0.015287 1.869416 0.015287 +-259.809712 1.869441 0.015322 1.869421 0.015326 +-259.181394 1.869440 0.015359 1.869420 0.015361 +-258.553075 1.869440 0.015401 1.869420 0.015401 +-257.924757 1.869441 0.015439 1.869421 0.015436 +-257.296438 1.869439 0.015474 1.869419 0.015474 +-256.668120 1.869435 0.015515 1.869415 0.015511 +-256.039801 1.869441 0.015551 1.869421 0.015548 +-255.411483 1.869436 0.015587 1.869416 0.015587 +-254.783164 1.869438 0.015630 1.869418 0.015625 +-254.154846 1.869436 0.015667 1.869416 0.015667 +-253.526527 1.869440 0.015702 1.869420 0.015702 +-252.898209 1.869437 0.015740 1.869417 0.015744 +-252.269890 1.869436 0.015781 1.869416 0.015784 +-251.641572 1.869436 0.015820 1.869416 0.015824 +-251.013253 1.869438 0.015859 1.869418 0.015863 +-250.384934 1.869438 0.015901 1.869418 0.015902 +-249.756616 1.869439 0.015939 1.869419 0.015942 +-249.128297 1.869435 0.015982 1.869415 0.015982 +-248.499979 1.869435 0.016023 1.869415 0.016020 +-247.871660 1.869437 0.016062 1.869417 0.016065 +-247.243342 1.869438 0.016102 1.869418 0.016102 +-246.615023 1.869434 0.016144 1.869414 0.016144 +-245.986705 1.869437 0.016186 1.869417 0.016184 +-245.358386 1.869435 0.016225 1.869415 0.016226 +-244.730068 1.869436 0.016269 1.869416 0.016269 +-244.101749 1.869436 0.016307 1.869416 0.016310 +-243.473431 1.869437 0.016352 1.869413 0.016352 +-242.845112 1.869433 0.016396 1.869413 0.016394 +-242.216794 1.869436 0.016435 1.869416 0.016435 +-241.588475 1.869438 0.016477 1.869418 0.016481 +-240.960157 1.869435 0.016522 1.869415 0.016522 +-240.331838 1.869435 0.016562 1.869415 0.016566 +-239.703519 1.869435 0.016612 1.869415 0.016608 +-239.075201 1.869435 0.016651 1.869415 0.016654 +-238.446882 1.869433 0.016697 1.869413 0.016698 +-237.818564 1.869435 0.016739 1.869415 0.016740 +-237.190245 1.869434 0.016785 1.869414 0.016785 +-236.561927 1.869434 0.016828 1.869414 0.016832 +-235.933608 1.869432 0.016874 1.869412 0.016874 +-235.305290 1.869433 0.016918 1.869413 0.016918 +-234.676971 1.869432 0.016966 1.869412 0.016963 +-234.048653 1.869434 0.017011 1.869414 0.017011 +-233.420334 1.869433 0.017055 1.869413 0.017056 +-232.792016 1.869431 0.017102 1.869411 0.017099 +-232.163697 1.869434 0.017148 1.869414 0.017144 +-231.535379 1.869434 0.017192 1.869414 0.017192 +-230.907060 1.869430 0.017239 1.869410 0.017242 +-230.278742 1.869434 0.017285 1.869414 0.017288 +-229.650423 1.869432 0.017335 1.869412 0.017334 +-229.022104 1.869432 0.017386 1.869412 0.017383 +-228.393786 1.869430 0.017429 1.869410 0.017432 +-227.765467 1.869432 0.017480 1.869412 0.017477 +-227.137149 1.869429 0.017526 1.869409 0.017526 +-226.508830 1.869431 0.017577 1.869411 0.017574 +-225.880512 1.869432 0.017624 1.869412 0.017624 +-225.252193 1.869430 0.017673 1.869410 0.017674 +-224.623875 1.869433 0.017724 1.869413 0.017724 +-223.995556 1.869431 0.017774 1.869411 0.017774 +-223.367238 1.869431 0.017823 1.869411 0.017821 +-222.738919 1.869433 0.017874 1.869413 0.017871 +-222.110601 1.869432 0.017923 1.869412 0.017920 +-221.482282 1.869430 0.017973 1.869410 0.017973 +-220.853964 1.869431 0.018022 1.869411 0.018025 +-220.225645 1.869433 0.018077 1.869413 0.018073 +-219.597326 1.869430 0.018128 1.869410 0.018131 +-218.969008 1.869431 0.018180 1.869411 0.018180 +-218.340689 1.869429 0.018230 1.869409 0.018232 +-217.712371 1.869430 0.018284 1.869410 0.018284 +-217.084052 1.869428 0.018337 1.869408 0.018337 +-216.455734 1.869427 0.018392 1.869407 0.018390 +-215.827415 1.869429 0.018445 1.869409 0.018445 +-215.199097 1.869430 0.018500 1.869410 0.018496 +-214.570778 1.869431 0.018553 1.869411 0.018552 +-213.942460 1.869429 0.018607 1.869409 0.018606 +-213.314141 1.869428 0.018660 1.869408 0.018661 +-212.685823 1.869429 0.018717 1.869409 0.018717 +-212.057504 1.869428 0.018769 1.869408 0.018771 +-211.429186 1.869428 0.018829 1.869408 0.018828 +-210.800867 1.869427 0.018882 1.869407 0.018882 +-210.172549 1.869428 0.018940 1.869408 0.018941 +-209.544230 1.869428 0.018996 1.869408 0.018996 +-208.915911 1.869429 0.019054 1.869409 0.019054 +-208.287593 1.869426 0.019111 1.869406 0.019112 +-207.659274 1.869426 0.019169 1.869406 0.019170 +-207.030956 1.869427 0.019228 1.869407 0.019225 +-206.402637 1.869428 0.019286 1.869408 0.019286 +-205.774319 1.869426 0.019345 1.869406 0.019344 +-205.146000 1.869425 0.019404 1.869405 0.019402 +-204.517682 1.869427 0.019462 1.869407 0.019462 +-203.889363 1.869428 0.019524 1.869408 0.019524 +-203.261045 1.869426 0.019584 1.869406 0.019584 +-202.632726 1.869426 0.019644 1.869406 0.019645 +-202.004408 1.869427 0.019704 1.869404 0.019703 +-201.376089 1.869426 0.019768 1.869406 0.019765 +-200.747771 1.869424 0.019829 1.869404 0.019825 +-200.119452 1.869425 0.019891 1.869405 0.019889 +-199.491134 1.869427 0.019950 1.869404 0.019953 +-198.862815 1.869427 0.020016 1.869404 0.020013 +-198.234496 1.869424 0.020081 1.869404 0.020079 +-197.606178 1.869425 0.020143 1.869405 0.020142 +-196.977859 1.869423 0.020206 1.869403 0.020207 +-196.349541 1.869424 0.020271 1.869404 0.020271 +-195.721222 1.869423 0.020337 1.869403 0.020337 +-195.092904 1.869423 0.020402 1.869403 0.020402 +-194.464585 1.869423 0.020467 1.869403 0.020467 +-193.836267 1.869422 0.020536 1.869402 0.020533 +-193.207948 1.869425 0.020600 1.869405 0.020600 +-192.579630 1.869421 0.020666 1.869401 0.020666 +-191.951311 1.869423 0.020735 1.869403 0.020738 +-191.322993 1.869421 0.020803 1.869401 0.020803 +-190.694674 1.869421 0.020872 1.869401 0.020872 +-190.066356 1.869421 0.020942 1.869401 0.020942 +-189.438037 1.869421 0.021010 1.869401 0.021009 +-188.809718 1.869421 0.021079 1.869401 0.021079 +-188.181400 1.869420 0.021150 1.869400 0.021150 +-187.553081 1.869420 0.021221 1.869400 0.021219 +-186.924763 1.869420 0.021292 1.869400 0.021293 +-186.296444 1.869420 0.021364 1.869400 0.021364 +-185.668126 1.869421 0.021438 1.869401 0.021437 +-185.039807 1.869421 0.021509 1.869401 0.021508 +-184.411489 1.869419 0.021581 1.869399 0.021581 +-183.783170 1.869420 0.021654 1.869400 0.021655 +-183.154852 1.869418 0.021730 1.869398 0.021731 +-182.526533 1.869418 0.021803 1.869398 0.021802 +-181.898215 1.869418 0.021879 1.869398 0.021878 +-181.269896 1.869418 0.021955 1.869398 0.021955 +-180.641578 1.869418 0.022032 1.869398 0.022031 +-180.013259 1.869417 0.022107 1.869397 0.022107 +-179.384941 1.869416 0.022186 1.869396 0.022185 +-178.756622 1.869417 0.022264 1.869397 0.022263 +-178.128303 1.869418 0.022340 1.869398 0.022341 +-177.499985 1.869417 0.022420 1.869397 0.022420 +-176.871666 1.869414 0.022500 1.869394 0.022500 +-176.243348 1.869416 0.022580 1.869396 0.022580 +-175.615029 1.869415 0.022661 1.869395 0.022660 +-174.986711 1.869415 0.022741 1.869395 0.022743 +-174.358392 1.869414 0.022823 1.869394 0.022823 +-173.730074 1.869415 0.022907 1.869395 0.022907 +-173.101755 1.869414 0.022991 1.869394 0.022988 +-172.473437 1.869414 0.023073 1.869393 0.023073 +-171.845118 1.869413 0.023157 1.869393 0.023156 +-171.216800 1.869413 0.023242 1.869393 0.023243 +-170.588481 1.869413 0.023328 1.869393 0.023328 +-169.960163 1.869413 0.023414 1.869392 0.023415 +-169.331844 1.869411 0.023499 1.869391 0.023499 +-168.703525 1.869412 0.023587 1.869390 0.023587 +-168.075207 1.869410 0.023675 1.869390 0.023676 +-167.446888 1.869411 0.023765 1.869391 0.023765 +-166.818570 1.869411 0.023853 1.869391 0.023853 +-166.190251 1.869409 0.023943 1.869389 0.023943 +-165.561933 1.869411 0.024035 1.869390 0.024034 +-164.933614 1.869409 0.024125 1.869389 0.024127 +-164.305296 1.869409 0.024218 1.869389 0.024217 +-163.676977 1.869408 0.024312 1.869388 0.024310 +-163.048659 1.869408 0.024404 1.869388 0.024405 +-162.420340 1.869407 0.024499 1.869387 0.024499 +-161.792022 1.869409 0.024593 1.869389 0.024594 +-161.163703 1.869408 0.024690 1.869388 0.024690 +-160.535385 1.869407 0.024785 1.869387 0.024785 +-159.907066 1.869405 0.024883 1.869385 0.024882 +-159.278748 1.869406 0.024980 1.869386 0.024982 +-158.650429 1.869404 0.025079 1.869384 0.025079 +-158.022110 1.869405 0.025178 1.869385 0.025178 +-157.393792 1.869405 0.025279 1.869385 0.025279 +-156.765473 1.869403 0.025380 1.869383 0.025380 +-156.137155 1.869403 0.025483 1.869383 0.025481 +-155.508836 1.869403 0.025584 1.869383 0.025584 +-154.880518 1.869402 0.025687 1.869382 0.025688 +-154.252199 1.869403 0.025793 1.869383 0.025792 +-153.623881 1.869402 0.025898 1.869381 0.025897 +-152.995562 1.869402 0.026004 1.869382 0.026005 +-152.367244 1.869401 0.026112 1.869381 0.026111 +-151.738925 1.869401 0.026219 1.869381 0.026218 +-151.110607 1.869399 0.026329 1.869379 0.026328 +-150.482288 1.869400 0.026437 1.869380 0.026438 +-149.853970 1.869400 0.026547 1.869380 0.026549 +-149.225651 1.869398 0.026660 1.869378 0.026660 +-148.597333 1.869397 0.026772 1.869377 0.026771 +-147.969014 1.869397 0.026886 1.869377 0.026884 +-147.340695 1.869397 0.027000 1.869377 0.027001 +-146.712377 1.869396 0.027115 1.869376 0.027116 +-146.084058 1.869396 0.027231 1.869376 0.027232 +-145.455740 1.869396 0.027349 1.869376 0.027349 +-144.827421 1.869394 0.027468 1.869374 0.027466 +-144.199103 1.869394 0.027587 1.869374 0.027586 +-143.570784 1.869395 0.027707 1.869375 0.027708 +-142.942466 1.869392 0.027829 1.869372 0.027828 +-142.314147 1.869392 0.027952 1.869372 0.027951 +-141.685829 1.869391 0.028075 1.869371 0.028076 +-141.057510 1.869391 0.028199 1.869371 0.028200 +-140.429192 1.869390 0.028325 1.869370 0.028325 +-139.800873 1.869390 0.028452 1.869369 0.028452 +-139.172555 1.869389 0.028581 1.869369 0.028580 +-138.544236 1.869389 0.028710 1.869369 0.028709 +-137.915917 1.869388 0.028840 1.869368 0.028840 +-137.287599 1.869388 0.028972 1.869368 0.028970 +-136.659280 1.869387 0.029105 1.869367 0.029105 +-136.030962 1.869387 0.029238 1.869367 0.029238 +-135.402643 1.869386 0.029373 1.869366 0.029373 +-134.774325 1.869385 0.029510 1.869365 0.029510 +-134.146006 1.869385 0.029648 1.869365 0.029648 +-133.517688 1.869383 0.029787 1.869363 0.029787 +-132.889369 1.869384 0.029929 1.869364 0.029927 +-132.261051 1.869382 0.030069 1.869362 0.030069 +-131.632732 1.869382 0.030213 1.869362 0.030212 +-131.004414 1.869381 0.030357 1.869361 0.030357 +-130.376095 1.869381 0.030503 1.869361 0.030503 +-129.747777 1.869379 0.030650 1.869359 0.030650 +-129.119458 1.869378 0.030799 1.869358 0.030798 +-128.491140 1.869377 0.030949 1.869357 0.030949 +-127.862821 1.869377 0.031101 1.869357 0.031101 +-127.234502 1.869376 0.031253 1.869356 0.031253 +-126.606184 1.869375 0.031409 1.869355 0.031409 +-125.977865 1.869375 0.031565 1.869355 0.031565 +-125.349547 1.869374 0.031722 1.869354 0.031722 +-124.721228 1.869373 0.031882 1.869353 0.031881 +-124.092910 1.869372 0.032042 1.869352 0.032041 +-123.464591 1.869371 0.032205 1.869351 0.032205 +-122.836273 1.869370 0.032369 1.869350 0.032369 +-122.207954 1.869369 0.032535 1.869349 0.032535 +-121.579636 1.869367 0.032703 1.869347 0.032702 +-120.951317 1.869368 0.032872 1.869348 0.032871 +-120.322999 1.869367 0.033043 1.869347 0.033043 +-119.694680 1.869365 0.033216 1.869345 0.033216 +-119.066362 1.869365 0.033390 1.869345 0.033390 +-118.438043 1.869363 0.033566 1.869343 0.033567 +-117.809725 1.869363 0.033745 1.869343 0.033745 +-117.181406 1.869361 0.033926 1.869341 0.033925 +-116.553087 1.869361 0.034107 1.869341 0.034107 +-115.924769 1.869360 0.034292 1.869340 0.034292 +-115.296450 1.869358 0.034477 1.869338 0.034477 +-114.668132 1.869357 0.034666 1.869337 0.034666 +-114.039813 1.869357 0.034856 1.869336 0.034856 +-113.411495 1.869355 0.035048 1.869335 0.035048 +-112.783176 1.869354 0.035243 1.869334 0.035242 +-112.154858 1.869352 0.035440 1.869332 0.035440 +-111.526539 1.869351 0.035638 1.869331 0.035638 +-110.898221 1.869350 0.035840 1.869330 0.035840 +-110.269902 1.869349 0.036043 1.869329 0.036043 +-109.641584 1.869348 0.036248 1.869328 0.036249 +-109.013265 1.869346 0.036457 1.869326 0.036457 +-108.384947 1.869345 0.036667 1.869325 0.036667 +-107.756628 1.869344 0.036879 1.869324 0.036879 +-107.128309 1.869343 0.037095 1.869322 0.037095 +-106.499991 1.869342 0.037313 1.869322 0.037313 +-105.871672 1.869340 0.037533 1.869320 0.037533 +-105.243354 1.869339 0.037756 1.869318 0.037756 +-104.615035 1.869337 0.037982 1.869317 0.037982 +-103.986717 1.869335 0.038210 1.869315 0.038210 +-103.358398 1.869334 0.038442 1.869314 0.038441 +-102.730080 1.869333 0.038676 1.869313 0.038675 +-102.101761 1.869331 0.038912 1.869311 0.038912 +-101.473443 1.869329 0.039152 1.869309 0.039153 +-100.845124 1.869327 0.039395 1.869307 0.039395 +-100.216806 1.869326 0.039641 1.869306 0.039641 +-99.588487 1.869324 0.039889 1.869304 0.039889 +-98.960169 1.869323 0.040141 1.869303 0.040141 +-98.331850 1.869321 0.040396 1.869301 0.040397 +-97.703532 1.869319 0.040655 1.869299 0.040655 +-97.075213 1.869317 0.040916 1.869297 0.040916 +-96.446894 1.869316 0.041181 1.869296 0.041182 +-95.818576 1.869314 0.041450 1.869294 0.041450 +-95.190257 1.869312 0.041722 1.869292 0.041722 +-94.561939 1.869310 0.041997 1.869290 0.041997 +-93.933620 1.869308 0.042277 1.869288 0.042277 +-93.305302 1.869306 0.042560 1.869286 0.042560 +-92.676983 1.869304 0.042847 1.869284 0.042846 +-92.048665 1.869302 0.043138 1.869281 0.043137 +-91.420346 1.869300 0.043432 1.869279 0.043432 +-90.792028 1.869297 0.043731 1.869277 0.043731 +-90.163709 1.869295 0.044034 1.869275 0.044033 +-89.535391 1.869293 0.044340 1.869273 0.044340 +-88.907072 1.869290 0.044652 1.869270 0.044652 +-88.278754 1.869287 0.044967 1.869267 0.044968 +-87.650435 1.869285 0.045288 1.869265 0.045288 +-87.022117 1.869283 0.045613 1.869263 0.045613 +-86.393798 1.869280 0.045942 1.869260 0.045942 +-85.765479 1.869278 0.046277 1.869258 0.046276 +-85.137161 1.869275 0.046615 1.869255 0.046615 +-84.508842 1.869272 0.046959 1.869252 0.046959 +-83.880524 1.869270 0.047308 1.869250 0.047308 +-83.252205 1.869267 0.047663 1.869247 0.047663 +-82.623887 1.869264 0.048023 1.869244 0.048022 +-81.995568 1.869261 0.048388 1.869241 0.048387 +-81.367250 1.869258 0.048759 1.869237 0.048758 +-80.738931 1.869255 0.049135 1.869234 0.049135 +-80.110613 1.869251 0.049517 1.869231 0.049517 +-79.482294 1.869248 0.049906 1.869228 0.049906 +-78.853976 1.869245 0.050300 1.869225 0.050300 +-78.225657 1.869241 0.050700 1.869221 0.050701 +-77.597339 1.869238 0.051107 1.869218 0.051107 +-76.969020 1.869234 0.051521 1.869214 0.051521 +-76.340701 1.869231 0.051941 1.869210 0.051941 +-75.712383 1.869226 0.052368 1.869206 0.052369 +-75.084064 1.869222 0.052803 1.869202 0.052802 +-74.455746 1.869219 0.053244 1.869199 0.053244 +-73.827427 1.869214 0.053693 1.869194 0.053693 +-73.199109 1.869210 0.054149 1.869190 0.054150 +-72.570790 1.869206 0.054614 1.869186 0.054614 +-71.942472 1.869201 0.055086 1.869181 0.055086 +-71.314153 1.869197 0.055566 1.869177 0.055566 +-70.685835 1.869192 0.056055 1.869172 0.056055 +-70.057516 1.869187 0.056553 1.869167 0.056553 +-69.429198 1.869182 0.057059 1.869162 0.057059 +-68.800879 1.869177 0.057574 1.869157 0.057574 +-68.172561 1.869172 0.058099 1.869152 0.058099 +-67.544242 1.869167 0.058634 1.869147 0.058634 +-66.915924 1.869161 0.059178 1.869141 0.059178 +-66.287605 1.869155 0.059732 1.869135 0.059732 +-65.659286 1.869150 0.060297 1.869129 0.060297 +-65.030968 1.869144 0.060873 1.869124 0.060872 +-64.402649 1.869137 0.061459 1.869117 0.061459 +-63.774331 1.869131 0.062057 1.869111 0.062057 +-63.146012 1.869124 0.062667 1.869104 0.062666 +-62.517694 1.869117 0.063288 1.869097 0.063288 +-61.889375 1.869110 0.063922 1.869090 0.063922 +-61.261057 1.869103 0.064569 1.869083 0.064569 +-60.632738 1.869096 0.065229 1.869076 0.065228 +-60.004420 1.869088 0.065902 1.869068 0.065902 +-59.376101 1.869080 0.066589 1.869060 0.066589 +-58.747783 1.869072 0.067291 1.869052 0.067291 +-58.119464 1.869063 0.068007 1.869043 0.068007 +-57.491146 1.869055 0.068739 1.869035 0.068739 +-56.862827 1.869046 0.069487 1.869026 0.069486 +-56.234508 1.869036 0.070250 1.869016 0.070250 +-55.606190 1.869027 0.071031 1.869006 0.071031 +-54.977871 1.869016 0.071829 1.868996 0.071829 +-54.349553 1.869006 0.072645 1.868986 0.072645 +-53.721234 1.868995 0.073480 1.868975 0.073480 +-53.092916 1.868984 0.074334 1.868964 0.074334 +-52.464597 1.868972 0.075207 1.868952 0.075207 +-51.836279 1.868961 0.076102 1.868940 0.076102 +-51.207960 1.868948 0.077018 1.868928 0.077017 +-50.579642 1.868935 0.077955 1.868915 0.077955 +-49.951323 1.868922 0.078916 1.868901 0.078916 +-49.323005 1.868908 0.079900 1.868888 0.079900 +-48.694686 1.868893 0.080909 1.868873 0.080909 +-48.066368 1.868878 0.081944 1.868858 0.081944 +-47.438049 1.868863 0.083005 1.868842 0.083004 +-46.809731 1.868846 0.084093 1.868826 0.084093 +-46.181412 1.868829 0.085210 1.868809 0.085210 +-45.553093 1.868812 0.086357 1.868791 0.086357 +-44.924775 1.868793 0.087535 1.868773 0.087534 +-44.296456 1.868774 0.088744 1.868753 0.088744 +-43.668138 1.868753 0.089987 1.868733 0.089987 +-43.039819 1.868732 0.091265 1.868712 0.091265 +-42.411501 1.868710 0.092580 1.868690 0.092580 +-41.783182 1.868687 0.093932 1.868667 0.093932 +-41.154864 1.868663 0.095324 1.868643 0.095323 +-40.526545 1.868638 0.096756 1.868617 0.096756 +-39.898227 1.868611 0.098232 1.868591 0.098232 +-39.269908 1.868583 0.099753 1.868563 0.099753 +-38.641590 1.868554 0.101321 1.868534 0.101321 +-38.013271 1.868523 0.102938 1.868503 0.102938 +-37.384953 1.868490 0.104606 1.868470 0.104606 +-36.756634 1.868456 0.106329 1.868436 0.106328 +-36.128316 1.868420 0.108107 1.868400 0.108107 +-35.499997 1.868382 0.109946 1.868362 0.109946 +-34.871678 1.868342 0.111846 1.868322 0.111846 +-34.243360 1.868300 0.113812 1.868280 0.113812 +-33.615041 1.868255 0.115847 1.868235 0.115847 +-32.986723 1.868207 0.117954 1.868187 0.117953 +-32.358404 1.868157 0.120137 1.868137 0.120136 +-31.730086 1.868103 0.122400 1.868083 0.122400 +-31.101767 1.868046 0.124748 1.868026 0.124748 +-30.473449 1.867985 0.127185 1.867965 0.127185 +-29.845130 1.867921 0.129717 1.867901 0.129716 +-29.216812 1.867852 0.132348 1.867831 0.132348 +-28.588493 1.867778 0.135085 1.867758 0.135085 +-27.960175 1.867699 0.137933 1.867678 0.137933 +-27.331856 1.867614 0.140901 1.867594 0.140900 +-26.703538 1.867523 0.143994 1.867502 0.143993 +-26.075219 1.867424 0.147220 1.867404 0.147220 +-25.446900 1.867319 0.150589 1.867298 0.150589 +-24.818582 1.867204 0.154109 1.867184 0.154109 +-24.190263 1.867080 0.157790 1.867060 0.157790 +-23.561945 1.866946 0.161643 1.866926 0.161643 +-22.933626 1.866800 0.165680 1.866780 0.165680 +-22.305308 1.866641 0.169913 1.866621 0.169912 +-21.676989 1.866468 0.174356 1.866447 0.174355 +-21.048671 1.866277 0.179023 1.866257 0.179023 +-20.420352 1.866068 0.183932 1.866048 0.183932 +-19.792034 1.865838 0.189100 1.865818 0.189100 +-19.163715 1.865584 0.194547 1.865564 0.194546 +-18.535397 1.865302 0.200292 1.865282 0.200292 +-17.907078 1.864989 0.206360 1.864968 0.206360 +-17.278760 1.864639 0.212775 1.864619 0.212775 +-16.650441 1.864247 0.219564 1.864227 0.219564 +-16.022123 1.863806 0.226757 1.863785 0.226757 +-15.393804 1.863307 0.234385 1.863287 0.234385 +-14.765485 1.862741 0.242483 1.862721 0.242483 +-14.137167 1.862096 0.251088 1.862076 0.251087 +-13.508848 1.861356 0.260237 1.861335 0.260237 +-12.880530 1.860502 0.269973 1.860482 0.269973 +-12.252211 1.859512 0.280338 1.859492 0.280337 +-11.623893 1.858357 0.291372 1.858336 0.291372 +-10.995574 1.856999 0.303117 1.856979 0.303117 +-10.367256 1.855393 0.315608 1.855372 0.315607 +-9.738937 1.853478 0.328870 1.853458 0.328869 +-9.110619 1.851179 0.342912 1.851159 0.342911 +-8.482300 1.848397 0.357715 1.848377 0.357714 +-7.853982 1.845003 0.373215 1.844983 0.373214 +-7.225663 1.840832 0.389277 1.840812 0.389276 +-6.597345 1.835671 0.405658 1.835651 0.405657 +-5.969026 1.829250 0.421942 1.829230 0.421941 +-5.340708 1.821241 0.437450 1.821221 0.437449 +-4.712389 1.811275 0.451102 1.811255 0.451100 +-4.084070 1.799004 0.461202 1.798985 0.461201 +-3.455752 1.784265 0.465134 1.784245 0.465132 +-2.827433 1.767418 0.458905 1.767399 0.458903 +-2.199115 1.749925 0.436493 1.749907 0.436491 +-1.570796 1.734848 0.388794 1.734831 0.388792 +-0.942478 1.725654 0.301619 1.725638 0.301619 +-0.314159 1.711643 0.152561 1.711629 0.152569 +0.314159 1.711643 -0.152561 1.711629 -0.152569 +0.942478 1.725654 -0.301619 1.725638 -0.301619 +1.570796 1.734848 -0.388794 1.734831 -0.388792 +2.199115 1.749925 -0.436493 1.749907 -0.436491 +2.827433 1.767418 -0.458905 1.767399 -0.458903 +3.455752 1.784265 -0.465134 1.784245 -0.465132 +4.084070 1.799004 -0.461202 1.798985 -0.461201 +4.712389 1.811275 -0.451102 1.811255 -0.451100 +5.340708 1.821241 -0.437450 1.821221 -0.437449 +5.969026 1.829250 -0.421942 1.829230 -0.421941 +6.597345 1.835671 -0.405658 1.835651 -0.405657 +7.225663 1.840832 -0.389277 1.840812 -0.389276 +7.853982 1.845003 -0.373215 1.844983 -0.373214 +8.482300 1.848397 -0.357715 1.848377 -0.357714 +9.110619 1.851179 -0.342912 1.851159 -0.342911 +9.738937 1.853478 -0.328870 1.853458 -0.328869 +10.367256 1.855393 -0.315608 1.855372 -0.315607 +10.995574 1.856999 -0.303117 1.856979 -0.303117 +11.623893 1.858357 -0.291372 1.858336 -0.291372 +12.252211 1.859512 -0.280338 1.859492 -0.280337 +12.880530 1.860502 -0.269973 1.860482 -0.269973 +13.508848 1.861356 -0.260237 1.861335 -0.260237 +14.137167 1.862096 -0.251088 1.862076 -0.251087 +14.765485 1.862741 -0.242483 1.862721 -0.242483 +15.393804 1.863307 -0.234385 1.863287 -0.234385 +16.022123 1.863806 -0.226757 1.863785 -0.226757 +16.650441 1.864247 -0.219564 1.864227 -0.219564 +17.278760 1.864639 -0.212775 1.864619 -0.212775 +17.907078 1.864989 -0.206360 1.864968 -0.206360 +18.535397 1.865302 -0.200292 1.865282 -0.200292 +19.163715 1.865584 -0.194547 1.865564 -0.194546 +19.792034 1.865838 -0.189100 1.865818 -0.189100 +20.420352 1.866068 -0.183932 1.866048 -0.183932 +21.048671 1.866277 -0.179023 1.866257 -0.179023 +21.676989 1.866468 -0.174356 1.866447 -0.174355 +22.305308 1.866641 -0.169913 1.866621 -0.169912 +22.933626 1.866800 -0.165680 1.866780 -0.165680 +23.561945 1.866946 -0.161643 1.866926 -0.161643 +24.190263 1.867080 -0.157790 1.867060 -0.157790 +24.818582 1.867204 -0.154109 1.867184 -0.154109 +25.446900 1.867319 -0.150589 1.867298 -0.150589 +26.075219 1.867424 -0.147220 1.867404 -0.147220 +26.703538 1.867523 -0.143994 1.867502 -0.143993 +27.331856 1.867614 -0.140901 1.867594 -0.140900 +27.960175 1.867699 -0.137933 1.867678 -0.137933 +28.588493 1.867778 -0.135085 1.867758 -0.135085 +29.216812 1.867852 -0.132348 1.867831 -0.132348 +29.845130 1.867921 -0.129717 1.867901 -0.129716 +30.473449 1.867985 -0.127185 1.867965 -0.127185 +31.101767 1.868046 -0.124748 1.868026 -0.124748 +31.730086 1.868103 -0.122400 1.868083 -0.122400 +32.358404 1.868157 -0.120137 1.868137 -0.120136 +32.986723 1.868207 -0.117954 1.868187 -0.117953 +33.615041 1.868255 -0.115847 1.868235 -0.115847 +34.243360 1.868300 -0.113812 1.868280 -0.113812 +34.871678 1.868342 -0.111846 1.868322 -0.111846 +35.499997 1.868382 -0.109946 1.868362 -0.109946 +36.128316 1.868420 -0.108107 1.868400 -0.108107 +36.756634 1.868456 -0.106329 1.868436 -0.106328 +37.384953 1.868490 -0.104606 1.868470 -0.104606 +38.013271 1.868523 -0.102938 1.868503 -0.102938 +38.641590 1.868554 -0.101321 1.868534 -0.101321 +39.269908 1.868583 -0.099753 1.868563 -0.099753 +39.898227 1.868611 -0.098232 1.868591 -0.098232 +40.526545 1.868638 -0.096756 1.868617 -0.096756 +41.154864 1.868663 -0.095324 1.868643 -0.095323 +41.783182 1.868687 -0.093932 1.868667 -0.093932 +42.411501 1.868710 -0.092580 1.868690 -0.092580 +43.039819 1.868732 -0.091265 1.868712 -0.091265 +43.668138 1.868753 -0.089987 1.868733 -0.089987 +44.296456 1.868774 -0.088744 1.868753 -0.088744 +44.924775 1.868793 -0.087535 1.868773 -0.087534 +45.553093 1.868812 -0.086357 1.868791 -0.086357 +46.181412 1.868829 -0.085210 1.868809 -0.085210 +46.809731 1.868846 -0.084093 1.868826 -0.084093 +47.438049 1.868863 -0.083005 1.868842 -0.083004 +48.066368 1.868878 -0.081944 1.868858 -0.081944 +48.694686 1.868893 -0.080909 1.868873 -0.080909 +49.323005 1.868908 -0.079900 1.868888 -0.079900 +49.951323 1.868922 -0.078916 1.868901 -0.078916 +50.579642 1.868935 -0.077955 1.868915 -0.077955 +51.207960 1.868948 -0.077018 1.868928 -0.077017 +51.836279 1.868961 -0.076102 1.868940 -0.076102 +52.464597 1.868972 -0.075207 1.868952 -0.075207 +53.092916 1.868984 -0.074334 1.868964 -0.074334 +53.721234 1.868995 -0.073480 1.868975 -0.073480 +54.349553 1.869006 -0.072645 1.868986 -0.072645 +54.977871 1.869016 -0.071829 1.868996 -0.071829 +55.606190 1.869027 -0.071031 1.869006 -0.071031 +56.234508 1.869036 -0.070250 1.869016 -0.070250 +56.862827 1.869046 -0.069487 1.869026 -0.069486 +57.491146 1.869055 -0.068739 1.869035 -0.068739 +58.119464 1.869063 -0.068007 1.869043 -0.068007 +58.747783 1.869072 -0.067291 1.869052 -0.067291 +59.376101 1.869080 -0.066589 1.869060 -0.066589 +60.004420 1.869088 -0.065902 1.869068 -0.065902 +60.632738 1.869096 -0.065229 1.869076 -0.065228 +61.261057 1.869103 -0.064569 1.869083 -0.064569 +61.889375 1.869110 -0.063922 1.869090 -0.063922 +62.517694 1.869117 -0.063288 1.869097 -0.063288 +63.146012 1.869124 -0.062667 1.869104 -0.062666 +63.774331 1.869131 -0.062057 1.869111 -0.062057 +64.402649 1.869137 -0.061459 1.869117 -0.061459 +65.030968 1.869144 -0.060873 1.869124 -0.060872 +65.659286 1.869150 -0.060297 1.869129 -0.060297 +66.287605 1.869155 -0.059732 1.869135 -0.059732 +66.915924 1.869161 -0.059178 1.869141 -0.059178 +67.544242 1.869167 -0.058634 1.869147 -0.058634 +68.172561 1.869172 -0.058099 1.869152 -0.058099 +68.800879 1.869177 -0.057574 1.869157 -0.057574 +69.429198 1.869182 -0.057059 1.869162 -0.057059 +70.057516 1.869187 -0.056553 1.869167 -0.056553 +70.685835 1.869192 -0.056055 1.869172 -0.056055 +71.314153 1.869197 -0.055566 1.869177 -0.055566 +71.942472 1.869201 -0.055086 1.869181 -0.055086 +72.570790 1.869206 -0.054614 1.869186 -0.054614 +73.199109 1.869210 -0.054149 1.869190 -0.054150 +73.827427 1.869214 -0.053693 1.869194 -0.053693 +74.455746 1.869219 -0.053244 1.869199 -0.053244 +75.084064 1.869222 -0.052803 1.869202 -0.052802 +75.712383 1.869226 -0.052368 1.869206 -0.052369 +76.340701 1.869231 -0.051941 1.869210 -0.051941 +76.969020 1.869234 -0.051521 1.869214 -0.051521 +77.597339 1.869238 -0.051107 1.869218 -0.051107 +78.225657 1.869241 -0.050700 1.869221 -0.050701 +78.853976 1.869245 -0.050300 1.869225 -0.050300 +79.482294 1.869248 -0.049906 1.869228 -0.049906 +80.110613 1.869251 -0.049517 1.869231 -0.049517 +80.738931 1.869255 -0.049135 1.869234 -0.049135 +81.367250 1.869258 -0.048759 1.869237 -0.048758 +81.995568 1.869261 -0.048388 1.869241 -0.048387 +82.623887 1.869264 -0.048023 1.869244 -0.048022 +83.252205 1.869267 -0.047663 1.869247 -0.047663 +83.880524 1.869270 -0.047308 1.869250 -0.047308 +84.508842 1.869272 -0.046959 1.869252 -0.046959 +85.137161 1.869275 -0.046615 1.869255 -0.046615 +85.765479 1.869278 -0.046277 1.869258 -0.046276 +86.393798 1.869280 -0.045942 1.869260 -0.045942 +87.022117 1.869283 -0.045613 1.869263 -0.045613 +87.650435 1.869285 -0.045288 1.869265 -0.045288 +88.278754 1.869287 -0.044967 1.869267 -0.044968 +88.907072 1.869290 -0.044652 1.869270 -0.044652 +89.535391 1.869293 -0.044340 1.869273 -0.044340 +90.163709 1.869295 -0.044034 1.869275 -0.044033 +90.792028 1.869297 -0.043731 1.869277 -0.043731 +91.420346 1.869300 -0.043432 1.869279 -0.043432 +92.048665 1.869302 -0.043138 1.869281 -0.043137 +92.676983 1.869304 -0.042847 1.869284 -0.042846 +93.305302 1.869306 -0.042560 1.869286 -0.042560 +93.933620 1.869308 -0.042277 1.869288 -0.042277 +94.561939 1.869310 -0.041997 1.869290 -0.041997 +95.190257 1.869312 -0.041722 1.869292 -0.041722 +95.818576 1.869314 -0.041450 1.869294 -0.041450 +96.446894 1.869316 -0.041181 1.869296 -0.041182 +97.075213 1.869317 -0.040916 1.869297 -0.040916 +97.703532 1.869319 -0.040655 1.869299 -0.040655 +98.331850 1.869321 -0.040396 1.869301 -0.040397 +98.960169 1.869323 -0.040141 1.869303 -0.040141 +99.588487 1.869324 -0.039889 1.869304 -0.039889 +100.216806 1.869326 -0.039641 1.869306 -0.039641 +100.845124 1.869327 -0.039395 1.869307 -0.039395 +101.473443 1.869329 -0.039152 1.869309 -0.039153 +102.101761 1.869331 -0.038912 1.869311 -0.038912 +102.730080 1.869333 -0.038676 1.869313 -0.038675 +103.358398 1.869334 -0.038442 1.869314 -0.038441 +103.986717 1.869335 -0.038210 1.869315 -0.038210 +104.615035 1.869337 -0.037982 1.869317 -0.037982 +105.243354 1.869339 -0.037756 1.869318 -0.037756 +105.871672 1.869340 -0.037533 1.869320 -0.037533 +106.499991 1.869342 -0.037313 1.869322 -0.037313 +107.128309 1.869343 -0.037095 1.869322 -0.037095 +107.756628 1.869344 -0.036879 1.869324 -0.036879 +108.384947 1.869345 -0.036667 1.869325 -0.036667 +109.013265 1.869346 -0.036457 1.869326 -0.036457 +109.641584 1.869348 -0.036248 1.869328 -0.036249 +110.269902 1.869349 -0.036043 1.869329 -0.036043 +110.898221 1.869350 -0.035840 1.869330 -0.035840 +111.526539 1.869351 -0.035638 1.869331 -0.035638 +112.154858 1.869352 -0.035440 1.869332 -0.035440 +112.783176 1.869354 -0.035243 1.869334 -0.035242 +113.411495 1.869355 -0.035048 1.869335 -0.035048 +114.039813 1.869357 -0.034856 1.869336 -0.034856 +114.668132 1.869357 -0.034666 1.869337 -0.034666 +115.296450 1.869358 -0.034477 1.869338 -0.034477 +115.924769 1.869360 -0.034292 1.869340 -0.034292 +116.553087 1.869361 -0.034107 1.869341 -0.034107 +117.181406 1.869361 -0.033926 1.869341 -0.033925 +117.809725 1.869363 -0.033745 1.869343 -0.033745 +118.438043 1.869363 -0.033566 1.869343 -0.033567 +119.066362 1.869365 -0.033390 1.869345 -0.033390 +119.694680 1.869365 -0.033216 1.869345 -0.033216 +120.322999 1.869367 -0.033043 1.869347 -0.033043 +120.951317 1.869368 -0.032872 1.869348 -0.032871 +121.579636 1.869367 -0.032703 1.869347 -0.032702 +122.207954 1.869369 -0.032535 1.869349 -0.032535 +122.836273 1.869370 -0.032369 1.869350 -0.032369 +123.464591 1.869371 -0.032205 1.869351 -0.032205 +124.092910 1.869372 -0.032042 1.869352 -0.032041 +124.721228 1.869373 -0.031882 1.869353 -0.031881 +125.349547 1.869374 -0.031722 1.869354 -0.031722 +125.977865 1.869375 -0.031565 1.869355 -0.031565 +126.606184 1.869375 -0.031409 1.869355 -0.031409 +127.234502 1.869376 -0.031253 1.869356 -0.031253 +127.862821 1.869377 -0.031101 1.869357 -0.031101 +128.491140 1.869377 -0.030949 1.869357 -0.030949 +129.119458 1.869378 -0.030799 1.869358 -0.030798 +129.747777 1.869379 -0.030650 1.869359 -0.030650 +130.376095 1.869381 -0.030503 1.869361 -0.030503 +131.004414 1.869381 -0.030357 1.869361 -0.030357 +131.632732 1.869382 -0.030213 1.869362 -0.030212 +132.261051 1.869382 -0.030069 1.869362 -0.030069 +132.889369 1.869384 -0.029929 1.869364 -0.029927 +133.517688 1.869383 -0.029787 1.869363 -0.029787 +134.146006 1.869385 -0.029648 1.869365 -0.029648 +134.774325 1.869385 -0.029510 1.869365 -0.029510 +135.402643 1.869386 -0.029373 1.869366 -0.029373 +136.030962 1.869387 -0.029238 1.869367 -0.029238 +136.659280 1.869387 -0.029105 1.869367 -0.029105 +137.287599 1.869388 -0.028972 1.869368 -0.028970 +137.915917 1.869388 -0.028840 1.869368 -0.028840 +138.544236 1.869389 -0.028710 1.869369 -0.028709 +139.172555 1.869389 -0.028581 1.869369 -0.028580 +139.800873 1.869390 -0.028452 1.869369 -0.028452 +140.429192 1.869390 -0.028325 1.869370 -0.028325 +141.057510 1.869391 -0.028199 1.869371 -0.028200 +141.685829 1.869391 -0.028075 1.869371 -0.028076 +142.314147 1.869392 -0.027952 1.869372 -0.027951 +142.942466 1.869392 -0.027829 1.869372 -0.027828 +143.570784 1.869395 -0.027707 1.869375 -0.027708 +144.199103 1.869394 -0.027587 1.869374 -0.027586 +144.827421 1.869394 -0.027468 1.869374 -0.027466 +145.455740 1.869396 -0.027349 1.869376 -0.027349 +146.084058 1.869396 -0.027231 1.869376 -0.027232 +146.712377 1.869396 -0.027115 1.869376 -0.027116 +147.340695 1.869397 -0.027000 1.869377 -0.027001 +147.969014 1.869397 -0.026886 1.869377 -0.026884 +148.597333 1.869397 -0.026772 1.869377 -0.026771 +149.225651 1.869398 -0.026660 1.869378 -0.026660 +149.853970 1.869400 -0.026547 1.869380 -0.026549 +150.482288 1.869400 -0.026437 1.869380 -0.026438 +151.110607 1.869399 -0.026329 1.869379 -0.026328 +151.738925 1.869401 -0.026219 1.869381 -0.026218 +152.367244 1.869401 -0.026112 1.869381 -0.026111 +152.995562 1.869402 -0.026004 1.869382 -0.026005 +153.623881 1.869402 -0.025898 1.869381 -0.025897 +154.252199 1.869403 -0.025793 1.869383 -0.025792 +154.880518 1.869402 -0.025687 1.869382 -0.025688 +155.508836 1.869403 -0.025584 1.869383 -0.025584 +156.137155 1.869403 -0.025483 1.869383 -0.025481 +156.765473 1.869403 -0.025380 1.869383 -0.025380 +157.393792 1.869405 -0.025279 1.869385 -0.025279 +158.022110 1.869405 -0.025178 1.869385 -0.025178 +158.650429 1.869404 -0.025079 1.869384 -0.025079 +159.278748 1.869406 -0.024980 1.869386 -0.024982 +159.907066 1.869405 -0.024883 1.869385 -0.024882 +160.535385 1.869407 -0.024785 1.869387 -0.024785 +161.163703 1.869408 -0.024690 1.869388 -0.024690 +161.792022 1.869409 -0.024593 1.869389 -0.024594 +162.420340 1.869407 -0.024499 1.869387 -0.024499 +163.048659 1.869408 -0.024404 1.869388 -0.024405 +163.676977 1.869408 -0.024312 1.869388 -0.024310 +164.305296 1.869409 -0.024218 1.869389 -0.024217 +164.933614 1.869409 -0.024125 1.869389 -0.024127 +165.561933 1.869411 -0.024035 1.869390 -0.024034 +166.190251 1.869409 -0.023943 1.869389 -0.023943 +166.818570 1.869411 -0.023853 1.869391 -0.023853 +167.446888 1.869411 -0.023765 1.869391 -0.023765 +168.075207 1.869410 -0.023675 1.869390 -0.023676 +168.703525 1.869412 -0.023587 1.869390 -0.023587 +169.331844 1.869411 -0.023499 1.869391 -0.023499 +169.960163 1.869413 -0.023414 1.869392 -0.023415 +170.588481 1.869413 -0.023328 1.869393 -0.023328 +171.216800 1.869413 -0.023242 1.869393 -0.023243 +171.845118 1.869413 -0.023157 1.869393 -0.023156 +172.473437 1.869414 -0.023073 1.869393 -0.023073 +173.101755 1.869414 -0.022991 1.869394 -0.022988 +173.730074 1.869415 -0.022907 1.869395 -0.022907 +174.358392 1.869414 -0.022823 1.869394 -0.022823 +174.986711 1.869415 -0.022741 1.869395 -0.022743 +175.615029 1.869415 -0.022661 1.869395 -0.022660 +176.243348 1.869416 -0.022580 1.869396 -0.022580 +176.871666 1.869414 -0.022500 1.869394 -0.022500 +177.499985 1.869417 -0.022420 1.869397 -0.022420 +178.128303 1.869418 -0.022340 1.869398 -0.022341 +178.756622 1.869417 -0.022264 1.869397 -0.022263 +179.384941 1.869416 -0.022186 1.869396 -0.022185 +180.013259 1.869417 -0.022107 1.869397 -0.022107 +180.641578 1.869418 -0.022032 1.869398 -0.022031 +181.269896 1.869418 -0.021955 1.869398 -0.021955 +181.898215 1.869418 -0.021879 1.869398 -0.021878 +182.526533 1.869418 -0.021803 1.869398 -0.021802 +183.154852 1.869418 -0.021730 1.869398 -0.021731 +183.783170 1.869420 -0.021654 1.869400 -0.021655 +184.411489 1.869419 -0.021581 1.869399 -0.021581 +185.039807 1.869421 -0.021509 1.869401 -0.021508 +185.668126 1.869421 -0.021438 1.869401 -0.021437 +186.296444 1.869420 -0.021364 1.869400 -0.021364 +186.924763 1.869420 -0.021292 1.869400 -0.021293 +187.553081 1.869420 -0.021221 1.869400 -0.021219 +188.181400 1.869420 -0.021150 1.869400 -0.021150 +188.809718 1.869421 -0.021079 1.869401 -0.021079 +189.438037 1.869421 -0.021010 1.869401 -0.021009 +190.066356 1.869421 -0.020942 1.869401 -0.020942 +190.694674 1.869421 -0.020872 1.869401 -0.020872 +191.322993 1.869421 -0.020803 1.869401 -0.020803 +191.951311 1.869423 -0.020735 1.869403 -0.020738 +192.579630 1.869421 -0.020666 1.869401 -0.020666 +193.207948 1.869425 -0.020600 1.869405 -0.020600 +193.836267 1.869422 -0.020536 1.869402 -0.020533 +194.464585 1.869423 -0.020467 1.869403 -0.020467 +195.092904 1.869423 -0.020402 1.869403 -0.020402 +195.721222 1.869423 -0.020337 1.869403 -0.020337 +196.349541 1.869424 -0.020271 1.869404 -0.020271 +196.977859 1.869423 -0.020206 1.869403 -0.020207 +197.606178 1.869425 -0.020143 1.869405 -0.020142 +198.234496 1.869424 -0.020081 1.869404 -0.020079 +198.862815 1.869427 -0.020016 1.869404 -0.020013 +199.491134 1.869427 -0.019950 1.869404 -0.019953 +200.119452 1.869425 -0.019891 1.869405 -0.019889 +200.747771 1.869424 -0.019829 1.869404 -0.019825 +201.376089 1.869426 -0.019768 1.869406 -0.019765 +202.004408 1.869427 -0.019704 1.869404 -0.019703 +202.632726 1.869426 -0.019644 1.869406 -0.019645 +203.261045 1.869426 -0.019584 1.869406 -0.019584 +203.889363 1.869428 -0.019524 1.869408 -0.019524 +204.517682 1.869427 -0.019462 1.869407 -0.019462 +205.146000 1.869425 -0.019404 1.869405 -0.019402 +205.774319 1.869426 -0.019345 1.869406 -0.019344 +206.402637 1.869428 -0.019286 1.869408 -0.019286 +207.030956 1.869427 -0.019228 1.869407 -0.019225 +207.659274 1.869426 -0.019169 1.869406 -0.019170 +208.287593 1.869426 -0.019111 1.869406 -0.019112 +208.915911 1.869429 -0.019054 1.869409 -0.019054 +209.544230 1.869428 -0.018996 1.869408 -0.018996 +210.172549 1.869428 -0.018940 1.869408 -0.018941 +210.800867 1.869427 -0.018882 1.869407 -0.018882 +211.429186 1.869428 -0.018829 1.869408 -0.018828 +212.057504 1.869428 -0.018769 1.869408 -0.018771 +212.685823 1.869429 -0.018717 1.869409 -0.018717 +213.314141 1.869428 -0.018660 1.869408 -0.018661 +213.942460 1.869429 -0.018607 1.869409 -0.018606 +214.570778 1.869431 -0.018553 1.869411 -0.018552 +215.199097 1.869430 -0.018500 1.869410 -0.018496 +215.827415 1.869429 -0.018445 1.869409 -0.018445 +216.455734 1.869427 -0.018392 1.869407 -0.018390 +217.084052 1.869428 -0.018337 1.869408 -0.018337 +217.712371 1.869430 -0.018284 1.869410 -0.018284 +218.340689 1.869429 -0.018230 1.869409 -0.018232 +218.969008 1.869431 -0.018180 1.869411 -0.018180 +219.597326 1.869430 -0.018128 1.869410 -0.018131 +220.225645 1.869433 -0.018077 1.869413 -0.018073 +220.853964 1.869431 -0.018022 1.869411 -0.018025 +221.482282 1.869430 -0.017973 1.869410 -0.017973 +222.110601 1.869432 -0.017923 1.869412 -0.017920 +222.738919 1.869433 -0.017874 1.869413 -0.017871 +223.367238 1.869431 -0.017823 1.869411 -0.017821 +223.995556 1.869431 -0.017774 1.869411 -0.017774 +224.623875 1.869433 -0.017724 1.869413 -0.017724 +225.252193 1.869430 -0.017673 1.869410 -0.017674 +225.880512 1.869432 -0.017624 1.869412 -0.017624 +226.508830 1.869431 -0.017577 1.869411 -0.017574 +227.137149 1.869429 -0.017526 1.869409 -0.017526 +227.765467 1.869432 -0.017480 1.869412 -0.017477 +228.393786 1.869430 -0.017429 1.869410 -0.017432 +229.022104 1.869432 -0.017386 1.869412 -0.017383 +229.650423 1.869432 -0.017335 1.869412 -0.017334 +230.278742 1.869434 -0.017285 1.869414 -0.017288 +230.907060 1.869430 -0.017239 1.869410 -0.017242 +231.535379 1.869434 -0.017192 1.869414 -0.017192 +232.163697 1.869434 -0.017148 1.869414 -0.017144 +232.792016 1.869431 -0.017102 1.869411 -0.017099 +233.420334 1.869433 -0.017055 1.869413 -0.017056 +234.048653 1.869434 -0.017011 1.869414 -0.017011 +234.676971 1.869432 -0.016966 1.869412 -0.016963 +235.305290 1.869433 -0.016918 1.869413 -0.016918 +235.933608 1.869432 -0.016874 1.869412 -0.016874 +236.561927 1.869434 -0.016828 1.869414 -0.016832 +237.190245 1.869434 -0.016785 1.869414 -0.016785 +237.818564 1.869435 -0.016739 1.869415 -0.016740 +238.446882 1.869433 -0.016697 1.869413 -0.016698 +239.075201 1.869435 -0.016651 1.869415 -0.016654 +239.703519 1.869435 -0.016612 1.869415 -0.016608 +240.331838 1.869435 -0.016562 1.869415 -0.016566 +240.960157 1.869435 -0.016522 1.869415 -0.016522 +241.588475 1.869438 -0.016477 1.869418 -0.016481 +242.216794 1.869436 -0.016435 1.869416 -0.016435 +242.845112 1.869433 -0.016396 1.869413 -0.016394 +243.473431 1.869437 -0.016352 1.869413 -0.016352 +244.101749 1.869436 -0.016307 1.869416 -0.016310 +244.730068 1.869436 -0.016269 1.869416 -0.016269 +245.358386 1.869435 -0.016225 1.869415 -0.016226 +245.986705 1.869437 -0.016186 1.869417 -0.016184 +246.615023 1.869434 -0.016144 1.869414 -0.016144 +247.243342 1.869438 -0.016102 1.869418 -0.016102 +247.871660 1.869437 -0.016062 1.869417 -0.016065 +248.499979 1.869435 -0.016023 1.869415 -0.016020 +249.128297 1.869435 -0.015982 1.869415 -0.015982 +249.756616 1.869439 -0.015939 1.869419 -0.015942 +250.384934 1.869438 -0.015901 1.869418 -0.015902 +251.013253 1.869438 -0.015859 1.869418 -0.015863 +251.641572 1.869436 -0.015820 1.869416 -0.015824 +252.269890 1.869436 -0.015781 1.869416 -0.015784 +252.898209 1.869437 -0.015740 1.869417 -0.015744 +253.526527 1.869440 -0.015702 1.869420 -0.015702 +254.154846 1.869436 -0.015667 1.869416 -0.015667 +254.783164 1.869438 -0.015630 1.869418 -0.015625 +255.411483 1.869436 -0.015587 1.869416 -0.015587 +256.039801 1.869441 -0.015551 1.869421 -0.015548 +256.668120 1.869435 -0.015515 1.869415 -0.015511 +257.296438 1.869439 -0.015474 1.869419 -0.015474 +257.924757 1.869441 -0.015439 1.869421 -0.015436 +258.553075 1.869440 -0.015401 1.869420 -0.015401 +259.181394 1.869440 -0.015359 1.869420 -0.015361 +259.809712 1.869441 -0.015322 1.869421 -0.015326 +260.438031 1.869436 -0.015287 1.869416 -0.015287 +261.066350 1.869440 -0.015249 1.869420 -0.015249 +261.694668 1.869438 -0.015219 1.869418 -0.015214 +262.322987 1.869442 -0.015176 1.869422 -0.015180 +262.951305 1.869435 -0.015141 1.869415 -0.015141 +263.579624 1.869433 -0.015107 1.869413 -0.015103 +264.207942 1.869442 -0.015070 1.869422 -0.015070 +264.836261 1.869435 -0.015036 1.869415 -0.015032 +265.464579 1.869437 -0.014996 1.869417 -0.014996 +266.092898 1.869440 -0.014965 1.869420 -0.014965 +266.721216 1.869441 -0.014929 1.869421 -0.014923 +267.349535 1.869439 -0.014896 1.869419 -0.014896 +267.977853 1.869441 -0.014857 1.869421 -0.014859 +268.606172 1.869440 -0.014826 1.869420 -0.014819 +269.234490 1.869440 -0.014789 1.869420 -0.014789 +269.862809 1.869439 -0.014754 1.869419 -0.014754 +270.491127 1.869443 -0.014717 1.869423 -0.014720 +271.119446 1.869442 -0.014684 1.869421 -0.014686 +271.747765 1.869439 -0.014650 1.869419 -0.014650 +272.376083 1.869442 -0.014618 1.869422 -0.014617 +273.004402 1.869440 -0.014583 1.869420 -0.014587 +273.632720 1.869440 -0.014552 1.869420 -0.014552 +274.261039 1.869439 -0.014517 1.869419 -0.014517 +274.889357 1.869440 -0.014481 1.869420 -0.014485 +275.517676 1.869443 -0.014453 1.869423 -0.014448 +276.145994 1.869438 -0.014420 1.869418 -0.014415 +276.774313 1.869440 -0.014383 1.869420 -0.014383 +277.402631 1.869442 -0.014357 1.869422 -0.014352 +278.030950 1.869440 -0.014319 1.869420 -0.014324 +278.659268 1.869441 -0.014288 1.869421 -0.014289 +279.287587 1.869443 -0.014261 1.869423 -0.014257 +279.915905 1.869442 -0.014223 1.869422 -0.014224 +280.544224 1.869446 -0.014195 1.869426 -0.014195 +281.172542 1.869442 -0.014160 1.869422 -0.014165 +281.800861 1.869443 -0.014126 1.869421 -0.014127 +282.429180 1.869441 -0.014096 1.869421 -0.014095 +283.057498 1.869440 -0.014062 1.869420 -0.014063 +283.685817 1.869441 -0.014034 1.869421 -0.014034 +284.314135 1.869440 -0.014004 1.869420 -0.014006 +284.942454 1.869439 -0.013973 1.869419 -0.013975 +285.570772 1.869442 -0.013944 1.869422 -0.013943 +286.199091 1.869444 -0.013913 1.869418 -0.013911 +286.827409 1.869442 -0.013885 1.869422 -0.013877 +287.455728 1.869444 -0.013849 1.869424 -0.013848 +288.084046 1.869442 -0.013820 1.869422 -0.013819 +288.712365 1.869442 -0.013789 1.869422 -0.013789 +289.340683 1.869445 -0.013766 1.869425 -0.013768 +289.969002 1.869447 -0.013731 1.869427 -0.013737 +290.597320 1.869441 -0.013702 1.869421 -0.013704 +291.225639 1.869441 -0.013670 1.869421 -0.013675 +291.853958 1.869441 -0.013643 1.869421 -0.013643 +292.482276 1.869446 -0.013614 1.869426 -0.013614 +293.110595 1.869444 -0.013587 1.869424 -0.013582 +293.738913 1.869443 -0.013556 1.869423 -0.013556 +294.367232 1.869445 -0.013527 1.869425 -0.013522 +294.995550 1.869440 -0.013498 1.869420 -0.013498 +295.623869 1.869446 -0.013469 1.869426 -0.013469 +296.252187 1.869444 -0.013442 1.869424 -0.013444 +296.880506 1.869441 -0.013413 1.869421 -0.013413 +297.508824 1.869439 -0.013382 1.869419 -0.013384 +298.137143 1.869447 -0.013356 1.869421 -0.013356 +298.765461 1.869446 -0.013328 1.869426 -0.013328 +299.393780 1.869442 -0.013299 1.869422 -0.013299 +300.022098 1.869441 -0.013271 1.869421 -0.013271 +300.650417 1.869445 -0.013245 1.869425 -0.013244 +301.278735 1.869444 -0.013215 1.869424 -0.013215 +301.907054 1.869443 -0.013192 1.869423 -0.013187 +302.535373 1.869445 -0.013162 1.869425 -0.013161 +303.163691 1.869442 -0.013132 1.869422 -0.013131 +303.792010 1.869443 -0.013105 1.869423 -0.013110 +304.420328 1.869443 -0.013078 1.869423 -0.013084 +305.048647 1.869439 -0.013053 1.869419 -0.013051 +305.676965 1.869447 -0.013027 1.869427 -0.013027 +306.305284 1.869445 -0.013000 1.869425 -0.012998 +306.933602 1.869447 -0.012974 1.869427 -0.012968 +307.561921 1.869445 -0.012947 1.869425 -0.012946 +308.190239 1.869444 -0.012920 1.869424 -0.012918 +308.818558 1.869441 -0.012899 1.869421 -0.012898 +309.446876 1.869447 -0.012868 1.869427 -0.012866 +310.075195 1.869446 -0.012843 1.869426 -0.012843 +310.703513 1.869444 -0.012818 1.869424 -0.012818 +311.331832 1.869449 -0.012794 1.869429 -0.012794 +311.960151 1.869443 -0.012765 1.869423 -0.012765 +312.588469 1.869444 -0.012744 1.869424 -0.012738 +313.216788 1.869444 -0.012711 1.869424 -0.012711 +313.845106 1.869442 -0.012686 1.869422 -0.012688 +314.473425 1.869441 -0.012662 1.869421 -0.012660 +315.101743 1.869443 -0.012636 1.869423 -0.012634 +315.730062 1.869442 -0.012610 1.869422 -0.012610 +316.358380 1.869444 -0.012584 1.869424 -0.012592 +316.986699 1.869444 -0.012561 1.869424 -0.012563 +317.615017 1.869449 -0.012536 1.869429 -0.012536 +318.243336 1.869442 -0.012512 1.869422 -0.012514 +318.871654 1.869443 -0.012489 1.869423 -0.012486 +319.499973 1.869441 -0.012463 1.869421 -0.012463 +320.128291 1.869448 -0.012434 1.869428 -0.012436 +320.756610 1.869444 -0.012416 1.869424 -0.012418 +321.384928 1.869444 -0.012392 1.869424 -0.012388 +322.013247 1.869446 -0.012362 1.869426 -0.012368 +322.641566 1.869445 -0.012341 1.869425 -0.012341 +323.269884 1.869438 -0.012314 1.869418 -0.012314 +323.898203 1.869445 -0.012295 1.869425 -0.012293 +324.526521 1.869442 -0.012265 1.869422 -0.012263 +325.154840 1.869445 -0.012251 1.869425 -0.012246 +325.783158 1.869448 -0.012223 1.869428 -0.012224 +326.411477 1.869448 -0.012193 1.869428 -0.012199 +327.039795 1.869440 -0.012174 1.869420 -0.012174 +327.668114 1.869448 -0.012156 1.869428 -0.012154 +328.296432 1.869452 -0.012131 1.869432 -0.012131 +328.924751 1.869442 -0.012106 1.869422 -0.012106 +329.553069 1.869446 -0.012080 1.869426 -0.012080 +330.181388 1.869442 -0.012060 1.869422 -0.012058 +330.809706 1.869443 -0.012040 1.869423 -0.012040 +331.438025 1.869448 -0.012013 1.869428 -0.012013 +332.066343 1.869446 -0.011990 1.869426 -0.011990 +332.694662 1.869447 -0.011966 1.869427 -0.011967 +333.322981 1.869446 -0.011951 1.869426 -0.011949 +333.951299 1.869444 -0.011924 1.869424 -0.011924 +334.579618 1.869444 -0.011909 1.869424 -0.011907 +335.207936 1.869445 -0.011880 1.869425 -0.011875 +335.836255 1.869446 -0.011857 1.869426 -0.011857 +336.464573 1.869448 -0.011834 1.869428 -0.011832 +337.092892 1.869446 -0.011808 1.869426 -0.011808 +337.721210 1.869447 -0.011793 1.869427 -0.011795 +338.349529 1.869451 -0.011773 1.869424 -0.011774 +338.977847 1.869443 -0.011747 1.869423 -0.011747 +339.606166 1.869448 -0.011726 1.869428 -0.011728 +340.234484 1.869448 -0.011704 1.869428 -0.011704 +340.862803 1.869442 -0.011677 1.869422 -0.011684 +341.491121 1.869452 -0.011660 1.869432 -0.011658 +342.119440 1.869449 -0.011632 1.869429 -0.011632 +342.747759 1.869446 -0.011616 1.869426 -0.011616 +343.376077 1.869450 -0.011601 1.869430 -0.011603 +344.004396 1.869446 -0.011578 1.869426 -0.011576 +344.632714 1.869446 -0.011552 1.869426 -0.011552 +345.261033 1.869442 -0.011535 1.869422 -0.011533 +345.889351 1.869445 -0.011513 1.869425 -0.011516 +346.517670 1.869451 -0.011493 1.869424 -0.011493 +347.145988 1.869446 -0.011467 1.869426 -0.011469 +347.774307 1.869450 -0.011449 1.869430 -0.011449 +348.402625 1.869449 -0.011426 1.869429 -0.011429 +349.030944 1.869449 -0.011404 1.869429 -0.011402 +349.659262 1.869446 -0.011392 1.869426 -0.011392 +350.287581 1.869443 -0.011368 1.869423 -0.011368 +350.915899 1.869446 -0.011352 1.869426 -0.011345 +351.544218 1.869448 -0.011325 1.869428 -0.011322 +352.172536 1.869443 -0.011301 1.869423 -0.011308 +352.800855 1.869446 -0.011285 1.869426 -0.011282 +353.429174 1.869449 -0.011269 1.869429 -0.011274 +354.057492 1.869444 -0.011248 1.869424 -0.011250 +354.685811 1.869444 -0.011222 1.869424 -0.011229 +355.314129 1.869445 -0.011207 1.869425 -0.011207 +355.942448 1.869452 -0.011192 1.869432 -0.011189 +356.570766 1.869450 -0.011175 1.869430 -0.011167 +357.199085 1.869440 -0.011153 1.869420 -0.011151 +357.827403 1.869450 -0.011135 1.869430 -0.011130 +358.455722 1.869448 -0.011114 1.869428 -0.011112 +359.084040 1.869450 -0.011091 1.869430 -0.011091 +359.712359 1.869450 -0.011071 1.869430 -0.011071 +360.340677 1.869444 -0.011051 1.869424 -0.011046 +360.968996 1.869448 -0.011040 1.869428 -0.011038 +361.597314 1.869442 -0.011014 1.869422 -0.011011 +362.225633 1.869452 -0.010992 1.869432 -0.010992 +362.853951 1.869450 -0.010974 1.869430 -0.010974 +363.482270 1.869449 -0.010959 1.869429 -0.010959 +364.110589 1.869447 -0.010935 1.869427 -0.010937 +364.738907 1.869448 -0.010918 1.869428 -0.010918 +365.367226 1.869448 -0.010897 1.869428 -0.010904 +365.995544 1.869451 -0.010875 1.869431 -0.010875 +366.623863 1.869448 -0.010862 1.869428 -0.010862 +367.252181 1.869450 -0.010841 1.869430 -0.010841 +367.880500 1.869449 -0.010824 1.869429 -0.010827 +368.508818 1.869453 -0.010804 1.869433 -0.010804 +369.137137 1.869445 -0.010788 1.869425 -0.010788 +369.765455 1.869448 -0.010774 1.869428 -0.010771 +370.393774 1.869454 -0.010757 1.869434 -0.010759 +371.022092 1.869454 -0.010732 1.869434 -0.010738 +371.650411 1.869447 -0.010721 1.869427 -0.010713 +372.278729 1.869441 -0.010695 1.869421 -0.010695 +372.907048 1.869444 -0.010678 1.869424 -0.010678 +373.535367 1.869445 -0.010664 1.869425 -0.010653 +374.163685 1.869444 -0.010644 1.869424 -0.010644 +374.792004 1.869457 -0.010623 1.869437 -0.010629 +375.420322 1.869453 -0.010604 1.869433 -0.010604 +376.048641 1.869452 -0.010590 1.869432 -0.010590 +376.676959 1.869449 -0.010571 1.869429 -0.010571 +377.305278 1.869441 -0.010551 1.869421 -0.010553 +377.933596 1.869446 -0.010535 1.869425 -0.010538 +378.561915 1.869444 -0.010517 1.869424 -0.010520 +379.190233 1.869453 -0.010503 1.869433 -0.010503 +379.818552 1.869444 -0.010486 1.869424 -0.010486 +380.446870 1.869449 -0.010467 1.869429 -0.010469 +381.075189 1.869442 -0.010444 1.869422 -0.010447 +381.703507 1.869452 -0.010430 1.869432 -0.010428 +382.331826 1.869449 -0.010415 1.869429 -0.010419 +382.960144 1.869451 -0.010396 1.869431 -0.010396 +383.588463 1.869455 -0.010387 1.869435 -0.010387 +384.216782 1.869450 -0.010367 1.869430 -0.010367 +384.845100 1.869450 -0.010349 1.869430 -0.010346 +385.473419 1.869454 -0.010330 1.869434 -0.010333 +386.101737 1.869447 -0.010313 1.869427 -0.010316 +386.730056 1.869450 -0.010290 1.869430 -0.010290 +387.358374 1.869446 -0.010280 1.869426 -0.010280 +387.986693 1.869448 -0.010267 1.869428 -0.010267 +388.615011 1.869448 -0.010248 1.869428 -0.010248 +389.243330 1.869451 -0.010232 1.869431 -0.010232 +389.871648 1.869449 -0.010206 1.869429 -0.010215 +390.499967 1.869447 -0.010200 1.869427 -0.010197 +391.128285 1.869455 -0.010179 1.869435 -0.010179 +391.756604 1.869445 -0.010160 1.869425 -0.010160 +392.384922 1.869449 -0.010141 1.869429 -0.010141 +393.013241 1.869443 -0.010130 1.869423 -0.010139 +393.641559 1.869453 -0.010120 1.869433 -0.010123 +394.269878 1.869448 -0.010106 1.869428 -0.010106 +394.898197 1.869448 -0.010086 1.869428 -0.010086 +395.526515 1.869452 -0.010069 1.869432 -0.010069 +396.154834 1.869456 -0.010058 1.869436 -0.010058 +396.783152 1.869455 -0.010036 1.869435 -0.010036 +397.411471 1.869441 -0.010018 1.869421 -0.010030 +398.039789 1.869454 -0.010008 1.869434 -0.009998 +398.668108 1.869456 -0.009991 1.869436 -0.009991 +399.296426 1.869447 -0.009980 1.869427 -0.009967 +399.924745 1.869453 -0.009957 1.869433 -0.009954 +400.553063 1.869452 -0.009939 1.869432 -0.009946 +401.181382 1.869450 -0.009926 1.869430 -0.009926 +401.809700 1.869452 -0.009907 1.869432 -0.009910 +402.438019 1.869453 -0.009898 1.869433 -0.009892 +403.066337 1.869447 -0.009876 1.869427 -0.009876 +403.694656 1.869445 -0.009862 1.869425 -0.009862 +404.322975 1.869452 -0.009851 1.869432 -0.009851 +404.951293 1.869452 -0.009841 1.869432 -0.009834 +405.579612 1.869456 -0.009821 1.869436 -0.009815 +406.207930 1.869449 -0.009808 1.869429 -0.009808 +406.836249 1.869444 -0.009787 1.869424 -0.009787 +407.464567 1.869448 -0.009770 1.869428 -0.009766 +408.092886 1.869446 -0.009757 1.869426 -0.009767 +408.721204 1.869454 -0.009737 1.869434 -0.009737 +409.349523 1.869450 -0.009733 1.869430 -0.009733 +409.977841 1.869451 -0.009715 1.869431 -0.009718 +410.606160 1.869447 -0.009702 1.869427 -0.009702 +411.234478 1.869442 -0.009683 1.869422 -0.009686 +411.862797 1.869449 -0.009669 1.869429 -0.009675 +412.491115 1.869454 -0.009651 1.869434 -0.009648 +413.119434 1.869451 -0.009641 1.869431 -0.009645 +413.747752 1.869454 -0.009624 1.869434 -0.009624 +414.376071 1.869451 -0.009611 1.869431 -0.009611 +415.004390 1.869450 -0.009597 1.869430 -0.009597 +415.632708 1.869444 -0.009590 1.869424 -0.009584 +416.261027 1.869453 -0.009566 1.869433 -0.009566 +416.889345 1.869454 -0.009556 1.869434 -0.009549 +417.517664 1.869443 -0.009538 1.869423 -0.009531 +418.145982 1.869451 -0.009521 1.869431 -0.009525 +418.774301 1.869454 -0.009511 1.869434 -0.009500 +419.402619 1.869452 -0.009491 1.869432 -0.009495 +420.030938 1.869445 -0.009486 1.869425 -0.009486 +420.659256 1.869449 -0.009465 1.869429 -0.009465 +421.287575 1.869449 -0.009452 1.869429 -0.009452 +421.915893 1.869451 -0.009445 1.869431 -0.009442 +422.544212 1.869461 -0.009419 1.869441 -0.009423 +423.172530 1.869455 -0.009415 1.869435 -0.009412 +423.800849 1.869455 -0.009397 1.869435 -0.009397 +424.429167 1.869449 -0.009380 1.869429 -0.009387 +425.057486 1.869445 -0.009360 1.869425 -0.009371 +425.685805 1.869449 -0.009347 1.869429 -0.009347 +426.314123 1.869456 -0.009344 1.869436 -0.009348 +426.942442 1.869449 -0.009328 1.869429 -0.009328 +427.570760 1.869441 -0.009316 1.869421 -0.009316 +428.199079 1.869450 -0.009304 1.869430 -0.009300 +428.827397 1.869449 -0.009283 1.869429 -0.009283 +429.455716 1.869446 -0.009276 1.869426 -0.009283 +430.084034 1.869459 -0.009258 1.869439 -0.009258 +430.712353 1.869452 -0.009245 1.869432 -0.009238 +431.340671 1.869454 -0.009232 1.869434 -0.009232 +431.968990 1.869450 -0.009229 1.869430 -0.009214 +432.597308 1.869444 -0.009198 1.869424 -0.009209 +433.225627 1.869455 -0.009189 1.869435 -0.009189 +433.853945 1.869453 -0.009177 1.869433 -0.009177 +434.482264 1.869444 -0.009166 1.869424 -0.009163 +435.110583 1.869457 -0.009153 1.869437 -0.009153 +435.738901 1.869459 -0.009140 1.869439 -0.009140 +436.367220 1.869452 -0.009120 1.869432 -0.009119 +436.995538 1.869443 -0.009111 1.869423 -0.009114 +437.623857 1.869443 -0.009098 1.869423 -0.009098 +438.252175 1.869452 -0.009089 1.869432 -0.009089 +438.880494 1.869455 -0.009072 1.869435 -0.009075 +439.508812 1.869448 -0.009069 1.869428 -0.009065 +440.137131 1.869459 -0.009044 1.869439 -0.009044 +440.765449 1.869459 -0.009029 1.869439 -0.009041 +441.393768 1.869461 -0.009018 1.869441 -0.009034 +442.022086 1.869457 -0.009007 1.869437 -0.009004 +442.650405 1.869443 -0.008997 1.869423 -0.008997 +443.278723 1.869446 -0.008986 1.869426 -0.008986 +443.907042 1.869451 -0.008976 1.869431 -0.008976 +444.535360 1.869449 -0.008963 1.869429 -0.008967 +445.163679 1.869449 -0.008948 1.869429 -0.008955 +445.791998 1.869443 -0.008933 1.869423 -0.008933 +446.420316 1.869461 -0.008913 1.869441 -0.008921 +447.048635 1.869450 -0.008919 1.869430 -0.008907 +447.676953 1.869444 -0.008893 1.869424 -0.008889 +448.305272 1.869445 -0.008890 1.869425 -0.008874 +448.933590 1.869450 -0.008880 1.869430 -0.008880 +449.561909 1.869453 -0.008862 1.869433 -0.008858 +450.190227 1.869449 -0.008859 1.869429 -0.008851 +450.818546 1.869459 -0.008829 1.869439 -0.008837 +451.446864 1.869451 -0.008818 1.869431 -0.008831 +452.075183 1.869456 -0.008820 1.869436 -0.008813 +452.703501 1.869443 -0.008795 1.869423 -0.008799 +453.331820 1.869451 -0.008783 1.869431 -0.008791 +453.960138 1.869453 -0.008774 1.869433 -0.008769 +454.588457 1.869463 -0.008760 1.869443 -0.008760 +455.216776 1.869460 -0.008743 1.869428 -0.008743 +455.845094 1.869454 -0.008736 1.869434 -0.008744 +456.473413 1.869454 -0.008719 1.869434 -0.008715 +457.101731 1.869442 -0.008724 1.869422 -0.008711 +457.730050 1.869457 -0.008704 1.869437 -0.008704 +458.358368 1.869449 -0.008686 1.869429 -0.008699 +458.986687 1.869446 -0.008668 1.869426 -0.008681 +459.615005 1.869457 -0.008668 1.869437 -0.008672 +460.243324 1.869449 -0.008649 1.869429 -0.008649 +460.871642 1.869454 -0.008646 1.869434 -0.008646 +461.499961 1.869449 -0.008619 1.869429 -0.008632 +462.128279 1.869449 -0.008628 1.869429 -0.008611 +462.756598 1.869455 -0.008607 1.869435 -0.008607 +463.384916 1.869463 -0.008596 1.869443 -0.008595 +464.013235 1.869451 -0.008584 1.869431 -0.008592 +464.641553 1.869456 -0.008567 1.869436 -0.008588 +465.269872 1.869451 -0.008557 1.869431 -0.008557 +465.898191 1.869452 -0.008554 1.869432 -0.008550 +466.526509 1.869458 -0.008536 1.869438 -0.008545 +467.154828 1.869453 -0.008526 1.869433 -0.008526 +467.783146 1.869457 -0.008521 1.869437 -0.008512 +468.411465 1.869459 -0.008509 1.869439 -0.008496 +469.039783 1.869449 -0.008494 1.869429 -0.008494 +469.668102 1.869450 -0.008485 1.869430 -0.008476 +470.296420 1.869456 -0.008458 1.869436 -0.008466 +470.924739 1.869447 -0.008455 1.869427 -0.008468 +471.553057 1.869460 -0.008439 1.869440 -0.008452 +472.181376 1.869453 -0.008433 1.869433 -0.008438 +472.809694 1.869447 -0.008432 1.869427 -0.008419 +473.438013 1.869447 -0.008406 1.869427 -0.008420 +474.066331 1.869457 -0.008393 1.869437 -0.008407 +474.694650 1.869447 -0.008383 1.869427 -0.008387 +475.322968 1.869447 -0.008372 1.869426 -0.008376 +475.951287 1.869452 -0.008355 1.869432 -0.008368 +476.579606 1.869455 -0.008355 1.869435 -0.008355 +477.207924 1.869459 -0.008355 1.869439 -0.008351 +477.836243 1.869451 -0.008333 1.869430 -0.008333 +478.464561 1.869453 -0.008328 1.869433 -0.008315 +479.092880 1.869456 -0.008320 1.869436 -0.008302 +479.721198 1.869447 -0.008298 1.869427 -0.008303 +480.349517 1.869463 -0.008302 1.869443 -0.008288 +480.977835 1.869461 -0.008283 1.869441 -0.008278 +481.606154 1.869448 -0.008263 1.869428 -0.008272 +482.234472 1.869449 -0.008263 1.869429 -0.008249 +482.862791 1.869447 -0.008248 1.869427 -0.008244 +483.491109 1.869451 -0.008232 1.869431 -0.008233 +484.119428 1.869456 -0.008227 1.869436 -0.008227 +484.747746 1.869449 -0.008212 1.869429 -0.008212 +485.376065 1.869447 -0.008203 1.869427 -0.008203 +486.004384 1.869452 -0.008195 1.869432 -0.008195 +486.632702 1.869444 -0.008182 1.869424 -0.008182 +487.261021 1.869441 -0.008172 1.869421 -0.008181 +487.889339 1.869455 -0.008162 1.869435 -0.008162 +488.517658 1.869455 -0.008147 1.869435 -0.008162 +489.145976 1.869452 -0.008140 1.869432 -0.008140 +489.774295 1.869455 -0.008124 1.869435 -0.008129 +490.402613 1.869445 -0.008117 1.869425 -0.008117 +491.030932 1.869461 -0.008105 1.869441 -0.008105 +491.659250 1.869449 -0.008099 1.869429 -0.008089 +492.287569 1.869457 -0.008093 1.869437 -0.008078 +492.915887 1.869448 -0.008087 1.869428 -0.008087 +493.544206 1.869458 -0.008073 1.869438 -0.008078 +494.172524 1.869447 -0.008057 1.869427 -0.008062 +494.800843 1.869446 -0.008055 1.869426 -0.008055 +495.429161 1.869461 -0.008029 1.869441 -0.008053 +496.057480 1.869443 -0.008025 1.869423 -0.008025 +496.685799 1.869450 -0.008013 1.869430 -0.008032 +497.314117 1.869460 -0.008011 1.869440 -0.008010 +497.942436 1.869460 -0.007994 1.869440 -0.007989 +498.570754 1.869447 -0.007975 1.869427 -0.007990 +499.199073 1.869450 -0.007984 1.869430 -0.007984 +499.827391 1.869444 -0.007965 1.869424 -0.007965 +500.455710 1.869461 -0.007955 1.869441 -0.007955 +501.084028 1.869452 -0.007936 1.869432 -0.007961 +501.712347 1.869450 -0.007940 1.869430 -0.007925 +502.340665 1.869455 -0.007932 1.869435 -0.007927 +502.968984 1.869466 -0.007911 1.869446 -0.007926 +503.597302 1.869462 -0.007911 1.869442 -0.007906 +504.225621 1.869440 -0.007896 1.869420 -0.007901 +504.853939 1.869460 -0.007886 1.869440 -0.007895 +505.482258 1.869445 -0.007879 1.869425 -0.007879 +506.110576 1.869457 -0.007876 1.869437 -0.007866 +506.738895 1.869460 -0.007865 1.869440 -0.007854 +507.367214 1.869449 -0.007855 1.869429 -0.007850 +507.995532 1.869450 -0.007831 1.869430 -0.007847 +508.623851 1.869441 -0.007829 1.869421 -0.007829 +509.252169 1.869469 -0.007826 1.869449 -0.007816 +509.880488 1.869457 -0.007803 1.869437 -0.007828 +510.508806 1.869447 -0.007813 1.869427 -0.007787 +511.137125 1.869459 -0.007802 1.869439 -0.007787 +511.765443 1.869456 -0.007799 1.869436 -0.007783 +512.393762 1.869449 -0.007772 1.869429 -0.007772 +513.022080 1.869459 -0.007758 1.869439 -0.007759 +513.650399 1.869455 -0.007757 1.869435 -0.007757 +514.278717 1.869457 -0.007745 1.869437 -0.007735 +514.907036 1.869439 -0.007725 1.869419 -0.007741 +515.535354 1.869459 -0.007716 1.869439 -0.007742 +516.163673 1.869460 -0.007707 1.869440 -0.007712 +516.791992 1.869450 -0.007709 1.869430 -0.007709 +517.420310 1.869453 -0.007690 1.869433 -0.007690 +518.048629 1.869462 -0.007691 1.869442 -0.007692 +518.676947 1.869446 -0.007671 1.869426 -0.007677 +519.305266 1.869452 -0.007662 1.869432 -0.007683 +519.933584 1.869465 -0.007661 1.869445 -0.007661 +520.561903 1.869452 -0.007649 1.869432 -0.007655 +521.190221 1.869445 -0.007642 1.869425 -0.007642 +521.818540 1.869445 -0.007639 1.869425 -0.007618 +522.446858 1.869452 -0.007624 1.869432 -0.007619 +523.075177 1.869454 -0.007614 1.869434 -0.007619 +523.703495 1.869453 -0.007596 1.869433 -0.007596 +524.331814 1.869452 -0.007589 1.869432 -0.007590 +524.960132 1.869457 -0.007597 1.869437 -0.007581 +525.588451 1.869454 -0.007588 1.869434 -0.007567 +526.216769 1.869440 -0.007573 1.869420 -0.007556 +526.845088 1.869460 -0.007557 1.869440 -0.007546 +527.473407 1.869438 -0.007541 1.869418 -0.007541 +528.101725 1.869449 -0.007552 1.869429 -0.007535 +528.730044 1.869445 -0.007535 1.869425 -0.007530 +529.358362 1.869465 -0.007519 1.869439 -0.007525 +529.986681 1.869452 -0.007515 1.869432 -0.007520 +530.614999 1.869462 -0.007511 1.869442 -0.007511 +531.243318 1.869463 -0.007491 1.869443 -0.007503 +531.871636 1.869448 -0.007491 1.869428 -0.007485 +532.499955 1.869450 -0.007463 1.869430 -0.007486 +533.128273 1.869454 -0.007467 1.869434 -0.007484 +533.756592 1.869459 -0.007462 1.869439 -0.007462 +534.384910 1.869460 -0.007449 1.869440 -0.007449 +535.013229 1.869456 -0.007445 1.869436 -0.007445 +535.641547 1.869458 -0.007428 1.869438 -0.007446 +536.269866 1.869457 -0.007422 1.869437 -0.007434 +536.898184 1.869462 -0.007416 1.869442 -0.007416 +537.526503 1.869468 -0.007416 1.869448 -0.007410 +538.154822 1.869451 -0.007400 1.869431 -0.007393 +538.783140 1.869454 -0.007396 1.869434 -0.007378 +539.411459 1.869463 -0.007377 1.869443 -0.007383 +540.039777 1.869450 -0.007372 1.869430 -0.007372 +540.668096 1.869450 -0.007360 1.869430 -0.007360 +541.296414 1.869463 -0.007346 1.869443 -0.007358 +541.924733 1.869459 -0.007344 1.869439 -0.007355 +542.553051 1.869456 -0.007330 1.869436 -0.007340 +543.181370 1.869472 -0.007333 1.869452 -0.007333 +543.809688 1.869460 -0.007321 1.869440 -0.007333 +544.438007 1.869454 -0.007301 1.869434 -0.007330 +545.066325 1.869455 -0.007307 1.869435 -0.007307 +545.694644 1.869470 -0.007294 1.869450 -0.007294 +546.322962 1.869467 -0.007286 1.869447 -0.007280 +546.951281 1.869472 -0.007285 1.869452 -0.007267 +547.579600 1.869454 -0.007268 1.869434 -0.007273 +548.207918 1.869454 -0.007259 1.869434 -0.007252 +548.836237 1.869457 -0.007264 1.869436 -0.007258 +549.464555 1.869459 -0.007258 1.869439 -0.007245 +550.092874 1.869445 -0.007256 1.869425 -0.007238 +550.721192 1.869444 -0.007237 1.869424 -0.007232 +551.349511 1.869450 -0.007239 1.869430 -0.007221 +551.977829 1.869440 -0.007232 1.869420 -0.007207 +552.606148 1.869447 -0.007198 1.869427 -0.007216 +553.234466 1.869444 -0.007200 1.869424 -0.007200 +553.862785 1.869443 -0.007197 1.869423 -0.007179 +554.491103 1.869459 -0.007178 1.869439 -0.007178 +555.119422 1.869454 -0.007186 1.869434 -0.007167 +555.747740 1.869473 -0.007162 1.869453 -0.007162 +556.376059 1.869457 -0.007156 1.869437 -0.007156 +557.004377 1.869454 -0.007165 1.869434 -0.007152 +557.632696 1.869457 -0.007150 1.869437 -0.007150 +558.261015 1.869451 -0.007127 1.869431 -0.007128 +558.889333 1.869451 -0.007128 1.869431 -0.007110 +559.517652 1.869452 -0.007137 1.869432 -0.007112 +560.145970 1.869459 -0.007097 1.869439 -0.007098 +560.774289 1.869456 -0.007106 1.869436 -0.007093 +561.402607 1.869454 -0.007087 1.869434 -0.007093 +562.030926 1.869440 -0.007083 1.869420 -0.007083 +562.659244 1.869465 -0.007086 1.869445 -0.007067 +563.287563 1.869447 -0.007074 1.869427 -0.007075 +563.915881 1.869449 -0.007056 1.869429 -0.007069 +564.544200 1.869464 -0.007044 1.869444 -0.007063 +565.172518 1.869449 -0.007035 1.869429 -0.007053 +565.800837 1.869434 -0.007017 1.869414 -0.007042 +566.429155 1.869452 -0.007042 1.869432 -0.007031 +567.057474 1.869459 -0.007026 1.869439 -0.007026 +567.685793 1.869448 -0.007012 1.869428 -0.007018 +568.314111 1.869443 -0.007009 1.869423 -0.007015 +568.942430 1.869453 -0.006993 1.869433 -0.007000 +569.570748 1.869470 -0.007000 1.869450 -0.007006 +570.199067 1.869462 -0.006991 1.869442 -0.006984 +570.827385 1.869462 -0.006962 1.869442 -0.006987 +571.455704 1.869456 -0.006979 1.869436 -0.006973 +572.084022 1.869451 -0.006962 1.869431 -0.006974 +572.712341 1.869473 -0.006950 1.869453 -0.006969 +573.340659 1.869470 -0.006944 1.869450 -0.006944 +573.968978 1.869448 -0.006922 1.869428 -0.006942 +574.597296 1.869448 -0.006932 1.869428 -0.006932 +575.225615 1.869447 -0.006916 1.869427 -0.006935 +575.853933 1.869454 -0.006922 1.869434 -0.006915 +576.482252 1.869456 -0.006912 1.869436 -0.006906 +577.110570 1.869445 -0.006917 1.869425 -0.006890 +577.738889 1.869443 -0.006897 1.869423 -0.006897 +578.367208 1.869447 -0.006881 1.869427 -0.006901 +578.995526 1.869439 -0.006880 1.869419 -0.006854 +579.623845 1.869465 -0.006874 1.869445 -0.006868 +580.252163 1.869453 -0.006859 1.869433 -0.006854 +580.880482 1.869447 -0.006852 1.869427 -0.006872 +581.508800 1.869451 -0.006847 1.869431 -0.006847 +582.137119 1.869454 -0.006854 1.869434 -0.006854 +582.765437 1.869437 -0.006828 1.869417 -0.006834 +583.393756 1.869450 -0.006832 1.869430 -0.006832 +584.022074 1.869443 -0.006821 1.869423 -0.006821 +584.650393 1.869457 -0.006817 1.869437 -0.006811 +585.278711 1.869452 -0.006805 1.869432 -0.006811 +585.907030 1.869454 -0.006790 1.869433 -0.006797 +586.535348 1.869444 -0.006784 1.869423 -0.006805 +587.163667 1.869468 -0.006770 1.869448 -0.006777 +587.791985 1.869459 -0.006775 1.869439 -0.006762 +588.420304 1.869437 -0.006777 1.869417 -0.006757 +589.048623 1.869451 -0.006763 1.869431 -0.006763 +589.676941 1.869460 -0.006736 1.869440 -0.006763 +590.305260 1.869440 -0.006747 1.869420 -0.006747 +590.933578 1.869470 -0.006743 1.869450 -0.006743 +591.561897 1.869461 -0.006742 1.869441 -0.006742 +592.190215 1.869444 -0.006724 1.869424 -0.006745 +592.818534 1.869449 -0.006707 1.869429 -0.006729 +593.446852 1.869456 -0.006708 1.869436 -0.006714 +594.075171 1.869442 -0.006707 1.869422 -0.006686 +594.703489 1.869450 -0.006694 1.869430 -0.006694 +595.331808 1.869459 -0.006700 1.869439 -0.006700 +595.960126 1.869448 -0.006686 1.869428 -0.006686 +596.588445 1.869452 -0.006675 1.869432 -0.006681 +597.216763 1.869463 -0.006683 1.869443 -0.006670 +597.845082 1.869448 -0.006674 1.869428 -0.006653 +598.473401 1.869469 -0.006656 1.869448 -0.006656 +599.101719 1.869461 -0.006646 1.869441 -0.006631 +599.730038 1.869442 -0.006639 1.869422 -0.006646 +600.358356 1.869442 -0.006640 1.869422 -0.006625 +600.986675 1.869446 -0.006615 1.869426 -0.006636 +601.614993 1.869464 -0.006610 1.869444 -0.006632 +602.243312 1.869461 -0.006614 1.869441 -0.006615 +602.871630 1.869459 -0.006597 1.869439 -0.006596 +603.499949 1.869458 -0.006601 1.869438 -0.006592 +604.128267 1.869474 -0.006594 1.869454 -0.006594 +604.756586 1.869452 -0.006580 1.869432 -0.006594 +605.384904 1.869446 -0.006593 1.869426 -0.006570 +606.013223 1.869449 -0.006560 1.869429 -0.006582 +606.641541 1.869452 -0.006580 1.869432 -0.006552 +607.269860 1.869472 -0.006557 1.869451 -0.006557 +607.898178 1.869440 -0.006543 1.869420 -0.006542 +608.526497 1.869446 -0.006562 1.869426 -0.006533 +609.154816 1.869452 -0.006554 1.869432 -0.006531 +609.783134 1.869460 -0.006550 1.869440 -0.006520 +610.411453 1.869454 -0.006503 1.869434 -0.006525 +611.039771 1.869441 -0.006512 1.869421 -0.006534 +611.668090 1.869467 -0.006498 1.869447 -0.006521 +612.296408 1.869462 -0.006504 1.869442 -0.006481 +612.924727 1.869444 -0.006501 1.869424 -0.006494 +613.553045 1.869450 -0.006502 1.869430 -0.006494 +614.181364 1.869463 -0.006472 1.869443 -0.006480 +614.809682 1.869463 -0.006482 1.869443 -0.006475 +615.438001 1.869456 -0.006461 1.869436 -0.006477 +616.066319 1.869473 -0.006488 1.869453 -0.006458 +616.694638 1.869459 -0.006476 1.869439 -0.006453 +617.322956 1.869469 -0.006436 1.869449 -0.006467 +617.951275 1.869451 -0.006447 1.869431 -0.006463 +618.579593 1.869448 -0.006453 1.869428 -0.006431 +619.207912 1.869438 -0.006420 1.869418 -0.006457 +619.836231 1.869460 -0.006426 1.869440 -0.006426 +620.464549 1.869458 -0.006400 1.869438 -0.006423 +621.092868 1.869467 -0.006414 1.869447 -0.006414 +621.721186 1.869467 -0.006411 1.869440 -0.006403 +622.349505 1.869454 -0.006394 1.869434 -0.006402 +622.977823 1.869456 -0.006399 1.869436 -0.006392 +623.606142 1.869445 -0.006399 1.869425 -0.006375 +624.234460 1.869456 -0.006381 1.869436 -0.006381 +624.862779 1.869453 -0.006395 1.869433 -0.006365 +625.491097 1.869452 -0.006363 1.869432 -0.006401 +626.119416 1.869450 -0.006371 1.869430 -0.006363 +626.747734 1.869474 -0.006370 1.869454 -0.006354 +627.376053 1.869458 -0.006356 1.869438 -0.006356 +628.004371 1.869452 -0.006341 1.869432 -0.006341 From 05aa8ab5de9da05ff1c8dd2a2065a0d728c44aed Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Mon, 28 Dec 2020 17:49:48 +0900 Subject: [PATCH 24/49] add main function --- python/impurity_solvers/hphi_spectrum.py | 37 +++++++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/python/impurity_solvers/hphi_spectrum.py b/python/impurity_solvers/hphi_spectrum.py index 82a36746..34c49eff 100644 --- a/python/impurity_solvers/hphi_spectrum.py +++ b/python/impurity_solvers/hphi_spectrum.py @@ -3,12 +3,9 @@ import numpy as np import os import sys -from ..tools import launch_mpi_subprocesses - class CalcSpectrum: - def __init__(self, filename, T_list, exct, eta, mpirun_command="", path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): - self.filename = filename + def __init__(self, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): self.T_list = T_list self.exct = exct self.eta = eta @@ -16,7 +13,6 @@ def __init__(self, filename, T_list, exct, eta, mpirun_command="", path_to_HPhi= self.output_dir = output_dir self.nomega = 0 self.path_to_HPhi = path_to_HPhi - self.mpirun_command = mpirun_command def Make_Spectrum_Input(self, spectrum_type="single"): for idx in range(self.exct): @@ -167,12 +163,11 @@ def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = def _run_HPhi(self, exct_cut, ex_state=0): for idx in range(exct_cut): - #print("Process: {}/{}".format(idx, exct_cut)) self._update_modpara(idx, ex_state) input_path = "namelist_ex_{}.def".format(idx) exec_path = self.path_to_HPhi - with open('./stdout_{}.log'.format(idx), 'w') as output_f: - launch_mpi_subprocesses(self.mpirun_command, [exec_path, '-e', input_path], output_f) + cmd = "{} -e {} > std_{}.log".format(exec_path, input_path, idx) + subprocess.call(cmd, shell=True) cmd = "mv ./output/{0}_DynamicalGreen.dat ./output/{0}_DynamicalGreen_{1}.dat".format(self.header, idx) subprocess.call(cmd, shell=True) @@ -229,3 +224,29 @@ def get_one_body_green(self, n_site, exct_cut): one_body_green[T][sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0][T] + 1J * one_body_green_tmp[1][T] )/2.0 one_body_green[T][sitej][sigmaj][sitei][sigmai] = (one_body_green_tmp[0][T] - 1J * one_body_green_tmp[1][T] )/2.0 return one_body_green + +if __name__ == "__main__": + + args = sys.argv + if len(args) != 2: + print("Error: Wrong argument.") + print("Usage: python hphi_spectrum.py filename") + exit(1) + + file_name = sys.argv[1] + import toml + dict_toml = toml.load(open(file_name)) + #def __init__(T_list, exct, eta, mpirun_command="", path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): + + T_list = dict_toml.get("T_list", [1.0]) + exct = dict_toml.get("exct", 10) + eta = dict_toml.get("eta", 1e-4) + path_to_HPhi = dict_toml.get("path_to_HPhi", "./HPhi") + header = dict_toml.get("header", "zvo") + output_dir = dict_toml.get("output_dir", "./output") + n_site = dict_toml.get("n_site", 2) + calcspectrum = CalcSpectrum(T_list, exct, eta, path_to_HPhi, header, output_dir) + energy_list = calcspectrum.get_energies() + one_body_g = calcspectrum.get_one_body_green(n_site=n_site, exct_cut=exct) + np.save(one_body_g) + print(one_body_g) \ No newline at end of file From e2ce5b5f377aeb65a478e0ab4ab24bf87de4b1f6 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Thu, 16 Dec 2021 16:03:01 +0900 Subject: [PATCH 25/49] Port hphi into dcore3; Pass a test --- src/dcore/impurity_solvers/hphi.py | 16 +++++++--------- tests/non-mpi/hphi/hphi.py | 3 +-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index ef401252..87e6e9d0 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -15,8 +15,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -from __future__ import print_function - import numpy from itertools import product import os @@ -32,7 +30,7 @@ from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, extract_bath_params from .base import SolverBase from .hphi_spectrum import CalcSpectrum -from .pomerol import assign_from_numpy_array, set_tail +from .pomerol import assign_from_numpy_array namelist_def = """\ @@ -302,14 +300,14 @@ def solve(self, rot, mpirun_command, params_kw): # # output_dir = "./output" - prefix = "TEST" + # prefix = "TEST" header = "zvo" T_list = [1./self.beta] # exct = 2 eta = 1e-4 print("Check Energy") - calcspectrum = CalcSpectrum(prefix, T_list, mpirun_command=mpirun_command_power4, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) + calcspectrum = CalcSpectrum(T_list, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) energy_list = calcspectrum.get_energies() one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) @@ -338,8 +336,8 @@ def solve(self, rot, mpirun_command, params_kw): assign_from_numpy_array(self._Gimp_iw, gf, self.block_names) - if triqs_major_version == 1: - set_tail(self._Gimp_iw) + # if triqs_major_version == 1: + # set_tail(self._Gimp_iw) if self.use_spin_orbit: print("Sigma is not implemented for SOC") @@ -354,7 +352,7 @@ def solve(self, rot, mpirun_command, params_kw): # TODO: move into a function -- begin # Cut H0 into block structure n_block = len(self.gf_struct) - n_inner = h0_full.shape[0] / n_block + n_inner = h0_full.shape[0] // n_block h0_block = [h0_full[s*n_inner:(s+1)*n_inner, s*n_inner:(s+1)*n_inner] for s in range(n_block)] # Construct G0 including bath sites @@ -370,7 +368,7 @@ def solve(self, rot, mpirun_command, params_kw): g0_imp = make_block_gf(GfImFreq, self.gf_struct, self.beta, self.n_iw) for block in self.block_names: for o1, o2 in product(self.gf_struct[block], repeat=2): - g0_imp[block][o1, o2] << g0_full[block][o1, o2] + g0_imp[block].data[:, o1, o2] = g0_full[block].data[:, o1, o2] # TODO: move into a function -- end self._Sigma_iw << inverse(g0_imp) - inverse(self._Gimp_iw) diff --git a/tests/non-mpi/hphi/hphi.py b/tests/non-mpi/hphi/hphi.py index 83d49c4c..5b644133 100644 --- a/tests/non-mpi/hphi/hphi.py +++ b/tests/non-mpi/hphi/hphi.py @@ -15,7 +15,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -from __future__ import print_function from dcore.dcore_pre import dcore_pre from dcore.dcore import dcore from dcore.dcore_check import dcore_check @@ -31,7 +30,7 @@ # h5diff("square.out.h5", "square.out.h5.ref", "dmft_out/Sigma_iw", precision=1e-5) # Use sigma.dat generated by dcore_check -dcore_check(input_ini, 'check/', 'png', '100') # generate sigma.dat +dcore_check(input_ini, 'check/', 'png', 100) # generate sigma.dat sigma = numpy.loadtxt("check/sigma.dat") sigma_ref = numpy.loadtxt("sigma.dat.ref") numpy.allclose(sigma, sigma_ref, atol=1e-5) From 8951d03e8bbb196efbaa858e32b4e5e086549016 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Thu, 10 Feb 2022 10:26:51 +0900 Subject: [PATCH 26/49] minor fix --- tests/non-mpi/hphi/hphi.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/non-mpi/hphi/hphi.ini b/tests/non-mpi/hphi/hphi.ini index dcdba5ec..9532de0d 100644 --- a/tests/non-mpi/hphi/hphi.ini +++ b/tests/non-mpi/hphi/hphi.ini @@ -5,7 +5,9 @@ norb = 1 nelec = 1.0 t = -1.0 kanamori = [(4.0, 0.0, 0.0)] -nk = 8 +nk0 = 8 +nk1 = 8 +nk2 = 1 [system] T = 0.1 From e1e38b09b5c868156058b40e1cf885225aa81134 Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Thu, 21 Apr 2022 10:48:07 +0900 Subject: [PATCH 27/49] update hphi_spectrum.py to use ProcessPoolExecutor --- src/dcore/impurity_solvers/hphi.py | 4 +- src/dcore/impurity_solvers/hphi_spectrum.py | 243 +++++++++++++------- 2 files changed, 166 insertions(+), 81 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index ef401252..d73bd8d5 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -309,8 +309,7 @@ def solve(self, rot, mpirun_command, params_kw): eta = 1e-4 print("Check Energy") - calcspectrum = CalcSpectrum(prefix, T_list, mpirun_command=mpirun_command_power4, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) - energy_list = calcspectrum.get_energies() + calcspectrum = CalcSpectrum(prefix, T_list, n_iw=self.n_iw, mpirun_command=mpirun_command_power4, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) # print(len(energy_list)) @@ -359,6 +358,7 @@ def solve(self, rot, mpirun_command, params_kw): # Construct G0 including bath sites bath_names = ["bath" + str(i_bath) for i_bath in range(n_bath)] + bath_names = ["bath" + str(i_bath) for i_bath in range(n_bath)] gf_struct_full = {block: list(inner_names) + bath_names for block, inner_names in self.gf_struct.items()} g0_full = make_block_gf(GfImFreq, gf_struct_full, self.beta, self.n_iw) g0_full << iOmega_n diff --git a/src/dcore/impurity_solvers/hphi_spectrum.py b/src/dcore/impurity_solvers/hphi_spectrum.py index 8bc06256..d98917ad 100644 --- a/src/dcore/impurity_solvers/hphi_spectrum.py +++ b/src/dcore/impurity_solvers/hphi_spectrum.py @@ -4,7 +4,114 @@ import os import sys +# T_list, n_iw, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output" + +def calc_one_body_green_core_parallel(p_common): + n_sigma = 2 + n_flg = 2 + n_excitation = 2 + n_site, T_list, exct, eta, path_to_HPhi, header, output_dir, exct_cut = p_common + + def gen_p(): + for sitei, sigmai in itertools.product(range(n_site), range(n_sigma)): + for sitej, sigmaj in itertools.product(range(n_site), range(n_sigma)): + for idx, flg in enumerate([True, False]): + for ex_state in range(n_excitation): + yield sitei, sigmai, sitej, sigmaj, idx, ex_state, p_common + + from concurrent.futures import ProcessPoolExecutor + with ProcessPoolExecutor(max_workers=max_workers) as executor: + one_body_g_tmp = np.array(list(executor.map(calc_one_body_green_core, gen_p()))) + + one_body_green_core = one_body_g_tmp.reshape((n_site, n_sigma, n_site, n_sigma, n_flg, n_excitation, len(T_list), NOmega)) + one_body_green = calc_one_body_green(one_body_green_core) + + import shutil + for sitei, sigmai in itertools.product(range(n_site), range(n_sigma)): + for sitej, sigmaj in itertools.product(range(n_site), range(n_sigma)): + for idx in range(n_flg): + for ex_state in range(n_excitation): + dir_path = "{}_{}_{}_{}_{}_{}".format(sitei, sigmai, sitej, sigmaj, ex_state, idx) + shutil.rmtree(dir_path) + + return one_body_green + +def calc_one_body_green_core(p): + #unpack parameters + sitei, sigmai, sitej, sigmaj, i_flg, ex_state, p_common = p + n_site, T_list, exct, eta, path_to_HPhi, header, output_dir, exct_cut = p_common + calc_spectrum_core = CalcSpectrumCore(T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", + output_dir="./output") + + calc_spectrum_core.set_energies() + flg = True if i_flg == 0 else False + return calc_spectrum_core.get_one_body_green_core(sitei, sigmai, sitej, sigmaj, ex_state, flg, exct_cut) + +def calc_one_body_green(one_body_green_core): + n_site, n_sigma, n_site, n_sigma, n_excitation, n_flg, n_T, n_omega = one_body_green_core.shape + n_excitation = 2 + n_flg = 2 + n_sigma = 2 + one_body_green = np.zeros((n_site, n_sigma, n_site, n_sigma, n_T, n_omega), dtype=np.complex128) + # Diagonal + for sitei, sigmai, ex_state in itertools.product(range(n_site), range(n_sigma), range(n_excitation)): + one_body_green[sitei][sigmai][sitei][sigmai] += one_body_green_core[sitei][sigmai][sitei][sigmai][0][ex_state] + + # Off diagonal + for sitei, sigmai, sitej, sigmaj in itertools.product(range(n_site), range(n_sigma), range(n_site), range(n_sigma)): + one_body_green_tmp = np.zeros((n_flg, n_T, n_omega), dtype=np.complex128) + for idx in range(n_flg): + for ex_state in range(n_excitation): + one_body_green_tmp[idx] += one_body_green_core[sitei][sigmai][sitej][sigmaj][idx][ex_state] + one_body_green_tmp[1] -= one_body_green[sitei][sigmai][sitei][sigmai] + \ + one_body_green[sitej][sigmaj][sitej][sigmaj] + one_body_green[sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0] + 1J * one_body_green_tmp[ + 1]) / 2.0 + one_body_green[sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0] - 1J * one_body_green_tmp[ + 1]) / 2.0 + return one_body_green + + class CalcSpectrum: + def __init__(self, T_list, n_iw, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): + self.T_list = T_list + self.exct = exct + self.eta = eta + self.header = header + self.output_dir = output_dir + self.path_to_HPhi = path_to_HPhi + self.calc_spectrum_core = CalcSpectrumCore(T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output") + self.nomega = n_iw + + def get_one_body_green_core(self, n_site, exct_cut): + self.calc_spectrum_core.set_energies() + n_excitation = 2 # type of excitation operator + n_flg = 2 + n_sigma = 2 + one_body_green = np.zeros((n_site, n_sigma, n_site, n_sigma, len(self.T_list), self.nomega), dtype=np.complex128) + one_body_green_core = np.zeros((n_site, n_sigma, n_site, n_sigma, n_flg, n_excitation, len(self.T_list), self.nomega), dtype=np.complex128) + + for sitei, sigmai, sitej, sigmaj in itertools.product(range(n_site), range(n_sigma), range(n_site), range(n_sigma)): + for idx, flg in enumerate([True, False]): + for ex_state in range(n_excitation): + one_body_green_core[sitei][sigmai][sitej][sigmaj][idx][ex_state] = self.calc_spectrum_core.get_one_body_green_core(sitei, sigmai, sitej, sigmaj, ex_state, flg, exct_cut) + + #Diagonal + for sitei, sigmai, ex_state in itertools.product(range(n_site), range(n_sigma), range(n_excitation)): + one_body_green[sitei][sigmai][sitei][sigmai] += one_body_green_core[sitei][sigmai][sitei][sigmai][0][ex_state] + + # Off diagonal + for sitei, sigmai, sitej, sigmaj in itertools.product(range(n_site), range(n_sigma),range(n_site), range(n_sigma)): + one_body_green_tmp = np.zeros((n_flg, len(self.T_list), self.nomega), dtype=np.complex128) + for idx in range(n_flg): + for ex_state in range(n_excitation): + one_body_green_tmp[idx] += one_body_green_core[sitei][sigmai][sitej][sigmaj][idx][ex_state] + one_body_green_tmp[1] -= one_body_green[sitei][sigmai][sitei][sigmai] + one_body_green[sitej][sigmaj][sitej][sigmaj] + one_body_green[sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0] + 1J * one_body_green_tmp[1]) / 2.0 + one_body_green[sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0] - 1J * one_body_green_tmp[1]) / 2.0 + return one_body_green + +class CalcSpectrumCore: def __init__(self, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): self.T_list = T_list self.exct = exct @@ -12,22 +119,25 @@ def __init__(self, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", outpu self.header = header self.output_dir = output_dir self.nomega = 0 - self.path_to_HPhi = path_to_HPhi + self.parent_dir = os.getcwd() + self.path_to_HPhi = os.path.join(self.parent_dir, path_to_HPhi) + + def Make_Spectrum_Input(self, calc_dir="./", spectrum_type="single"): - def Make_Spectrum_Input(self, spectrum_type="single"): + rel_path_org = os.path.relpath(self.parent_dir, calc_dir) for idx in range(self.exct): - with open("calcmod.def") as f: + with open(os.path.join(self.parent_dir, "calcmod.def")) as f: lines = f.readlines() - with open("calcmod_ex.def", "w") as fex: + with open(os.path.join(calc_dir, "calcmod_ex.def"), "w") as fex: for line in lines: words = line.split() if words[0] == "CalcSpec" or words[0] == "OutputExVec" or words[0] == "OutputEigenVec": continue fex.write(line) fex.write("CalcSpec 1\n") - with open("namelist.def") as f: + with open(os.path.join(self.parent_dir, "namelist.def")) as f: lines = f.readlines() - with open("namelist_ex_{}.def".format(idx), "w") as fex: + with open(os.path.join(calc_dir, "namelist_ex_{}.def".format(idx)), "w") as fex: for line in lines: words = line.split() if len(words) == 0: @@ -38,22 +148,23 @@ def Make_Spectrum_Input(self, spectrum_type="single"): continue if words[0] == "PairExcitation": continue - fex.write(line) - + fex.write("{} {}\n".format(words[0], os.path.join(rel_path_org, words[1]))) fex.write("ModPara modpara_ex.def\n") fex.write("CalcMod calcmod_ex.def\n") - fex.write("SpectrumVec {}_eigenvec_{}\n".format(self.header, idx)) + rel_path = os.path.relpath(os.path.join(self.parent_dir, "output"), calc_dir) + fex.write("SpectrumVec {}_eigenvec_{}\n".format(os.path.join("../", rel_path, self.header), idx)) if spectrum_type == "single": fex.write("SingleExcitation single_ex.def\n") elif spectrum_type == "pair": fex.write("PairExcitation pair_ex.def\n") - with open("modpara.def", "r") as fr: + with open(os.path.join(self.parent_dir,"modpara.def"), "r") as fr: lines = fr.readlines() for line in lines: words = line.split() if words[0] == "NOmega": self.nomega = int(words[1]) + if self.nomega == 0: print("Error: Please set NOmega in modpara file") sys.exit(1) @@ -71,7 +182,7 @@ def _read_spectrum(self): frequencies = frequencies return frequencies, spectrum_dict - def get_energies(self): + def set_energies(self): energy_list = [] with open(os.path.join(self.output_dir, "{}_energy.dat".format(self.header))) as f: lines = f.readlines() @@ -87,7 +198,6 @@ def get_energies(self): print("T = {}: exp[-beta(ene_max-ene_mix)] = {}".format(T, eta_ene)) if eta_ene > self.eta: print("Warning: At T = {}, eta_ene is larger than eta.".format(T)) - return energy_list def _calc_Z(self, T): Z = 0 @@ -116,10 +226,10 @@ def print_finite_T_spectrum(self, file_name = "Dynamical_Green"): for idx, value in enumerate(spectrum): fw.write("{} {} {} {}\n".format(self.frequencies[idx].real, self.frequencies[idx].imag, value.real, value.imag)) - def _update_modpara(self, exct, ex_state=0): + def _update_modpara(self, exct, ex_state=0, calc_dir="./"): dict_mod={} header = [] - with open("modpara.def", "r") as fr: + with open(os.path.join(self.parent_dir, "modpara.def"), "r") as fr: lines = fr.readlines() header = lines[:8] for line in lines[8:]: @@ -131,7 +241,7 @@ def _update_modpara(self, exct, ex_state=0): dict_mod["OmegaMax"] = [-1.0*float(omega_max[0]), -1.0*float(omega_max[1])] omega_min = dict_mod["OmegaMin"] dict_mod["OmegaMin"] = [-1.0*float(omega_min[0]), -1.0*float(omega_min[1])] - with open("modpara_ex.def", "w") as fw: + with open(os.path.join(calc_dir, "modpara_ex.def"), "w") as fw: for line in header: fw.write(line) for key, value in dict_mod.items(): @@ -140,12 +250,12 @@ def _update_modpara(self, exct, ex_state=0): else: fw.write("{} {} {}\n".format(key, value[0], value[1])) - def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = "single_ex.def", ex_state=0, flg_complex = True): + def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = "single_ex.def", ex_state=0, flg_complex = True, calc_dir="./"): # c_{i sigma_i} or c_{i sigma_i} + i c_{j sigma_j} nsingle = 2 if (2 * site_i + sigma_i) == ( 2 * site_j + sigma_j): nsingle = 1 - with open(file_name, "w") as fw: + with open(os.path.join(calc_dir, file_name), "w") as fw: fw.write("===============================\n") fw.write("NSingle {}\n".format(nsingle)) fw.write("===============================\n") @@ -161,68 +271,34 @@ def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = fw.write("{} {} {} 1.0 0.0\n".format(site_i, sigma_i, ex_state)) fw.write("{} {} {} 1.0 0.0\n".format(site_j, sigma_j, ex_state)) - def _run_HPhi(self, exct_cut, ex_state=0): + def _run_HPhi(self, exct_cut, ex_state=0, calc_dir="./"): + os.chdir(calc_dir) for idx in range(exct_cut): - self._update_modpara(idx, ex_state) - input_path = "namelist_ex_{}.def".format(idx) + self._update_modpara(idx, ex_state, calc_dir) + input_path = os.path.join(calc_dir, "namelist_ex_{}.def".format(idx)) exec_path = self.path_to_HPhi cmd = "{} -e {} > std_{}.log".format(exec_path, input_path, idx) subprocess.call(cmd, shell=True) cmd = "mv ./output/{0}_DynamicalGreen.dat ./output/{0}_DynamicalGreen_{1}.dat".format(self.header, idx) subprocess.call(cmd, shell=True) + os.chdir(self.parent_dir) - def get_one_body_green(self, n_site, exct_cut): - self.Make_Spectrum_Input() - one_body_green = {} - for T in self.T_list: - one_body_green[T] = np.zeros((n_site, 2, n_site, 2, self.nomega), dtype=np.complex) - #diagonal - print("Calculate Diagonal Green function") - for sitei, sigmai in itertools.product(range(n_site), range(2)): - print("G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitei, "u" if sigmai == 0 else "d")) - for ex_state in range(2): - self._make_single_excitation(sitei, sigmai, sitei, sigmai, ex_state=ex_state) - #Run HPhi - self._run_HPhi(exct_cut, ex_state) - #Get Finite-T Green - frequencies, finite_spectrum_list = self.get_finite_T_spectrum() - if ex_state == 1: - self.frequencies = frequencies - sign = 1.0 if ex_state ==1 else -1.0 - for T in self.T_list: - one_body_green[T][sitei][sigmai][sitei][sigmai] += sign*finite_spectrum_list[T] - - #off diagonal - print("Calculate Off-Diagonal Green function") - one_body_green_tmp = [{}, {}] - for T in self.T_list: - one_body_green_tmp[0][T] = np.zeros((self.nomega), dtype=np.complex) - one_body_green_tmp[1][T] = np.zeros((self.nomega), dtype=np.complex) - - for sitei, sigmai in itertools.product(range(n_site), range(2)): - sitei_idx = 2 * sitei + sigmai - for sitej, sigmaj in itertools.product(range(n_site), range(2)): - sitej_idx = 2 * sitej + sigmaj - if sitei_idx >= sitej_idx: - continue - print("G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitej, "u" if sigmaj == 0 else "d")) - for ex_state in range(2): - #True c_i + c_j, False: c_i + i c_j - for idx, flg in enumerate([True, False]): - self._make_single_excitation(sitei, sigmai, sitej, sigmaj, ex_state=ex_state, flg_complex=flg) - #Run HPhi - self._run_HPhi(exct_cut, ex_state) - #Get Finite-T Green - frequencies, finite_spectrum_list = self.get_finite_T_spectrum() - sign = 1.0 if ex_state ==1 else -1.0 - for T in self.T_list: - one_body_green_tmp[idx][T] += sign*finite_spectrum_list[T] - for T in self.T_list: - one_body_green_tmp[1][T] -= one_body_green[T][sitei][sigmai][sitei][sigmai]+one_body_green[T][sitej][sigmaj][sitej][sigmaj] - #Get Offdiagonal Green - for T in self.T_list: - one_body_green[T][sitei][sigmai][sitej][sigmaj] = (one_body_green_tmp[0][T] + 1J * one_body_green_tmp[1][T] )/2.0 - one_body_green[T][sitej][sigmaj][sitei][sigmai] = (one_body_green_tmp[0][T] - 1J * one_body_green_tmp[1][T] )/2.0 + def get_one_body_green_core(self, sitei, sigmai, sitej, sigmaj, ex_state, flg, exct_cut): + calc_dir = os.path.join(self.parent_dir, "{}_{}_{}_{}_{}_{}".format(sitei,sigmai,sitej,sigmaj, ex_state, 0 if flg is True else 1)) + os.makedirs(calc_dir, exist_ok=True) + self.Make_Spectrum_Input(calc_dir) + one_body_green = np.zeros((len(self.T_list), self.nomega), dtype=np.complex) + print("Calculate G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitej, "u" if sigmaj == 0 else "d")) + self._make_single_excitation(sitei, sigmai, sitej, sigmaj, ex_state=ex_state, flg_complex=flg, calc_dir=calc_dir) + # Run HPhi + self._run_HPhi(exct_cut, ex_state, calc_dir) + # Get Finite-T Green + frequencies, finite_spectrum_list = self.get_finite_T_spectrum() + if ex_state == 1: + self.frequencies = frequencies + sign = 1.0 if ex_state == 1 else -1.0 + for idx, T in enumerate(self.T_list): + one_body_green[idx] = sign * finite_spectrum_list[T] return one_body_green if __name__ == "__main__": @@ -236,8 +312,7 @@ def get_one_body_green(self, n_site, exct_cut): file_name = sys.argv[1] import toml dict_toml = toml.load(open(file_name)) - #def __init__(T_list, exct, eta, mpirun_command="", path_to_HPhi="./HPhi", header="zvo", output_dir="./output"): - + NOmega = 200 T_list = dict_toml.get("T_list", [1.0]) exct = dict_toml.get("exct", 10) eta = dict_toml.get("eta", 1e-4) @@ -245,8 +320,18 @@ def get_one_body_green(self, n_site, exct_cut): header = dict_toml.get("header", "zvo") output_dir = dict_toml.get("output_dir", "./output") n_site = dict_toml.get("n_site", 2) - calcspectrum = CalcSpectrum(T_list, exct, eta, path_to_HPhi, header, output_dir) - energy_list = calcspectrum.get_energies() - one_body_g = calcspectrum.get_one_body_green(n_site=n_site, exct_cut=exct) - np.save(one_body_g) - print(one_body_g) \ No newline at end of file + max_workers=4 + + #Calculate one body Green's functions directly + # calcg = CalcSpectrum(T_list, NOmega, exct, eta, path_to_HPhi, header, output_dir) + # one_body_g_direct = calcg.get_one_body_green(n_site, exct) + # print(one_body_g_direct) + # exit(0) + + #Calculate one body Green's functions using parallel + n_sigma = 2 + n_flg = 2 + n_excitation = 2 + p_common = (n_site, T_list, exct, eta, path_to_HPhi, header, output_dir, exct) + one_body_green = calc_one_body_green_core_parallel(p_common) + np.save("test_g", one_body_green) \ No newline at end of file From e5b6a92763715dae580c541b9c66dbfce01dfb8f Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Thu, 21 Apr 2022 10:53:52 +0900 Subject: [PATCH 28/49] update to call calc_one_body_green_core_parallel in hphi.py --- src/dcore/impurity_solvers/hphi.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index a50c748c..67c9b12c 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -29,7 +29,7 @@ from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, extract_bath_params from .base import SolverBase -from .hphi_spectrum import CalcSpectrum +from .hphi_spectrum import calc_one_body_green_core_parallel from .pomerol import assign_from_numpy_array @@ -307,9 +307,13 @@ def solve(self, rot, mpirun_command, params_kw): eta = 1e-4 #print("Check Energy") - calcspectrum = CalcSpectrum(T_list, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) - #energy_list = calcspectrum.get_energies() - one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) + output_dir = "./output" + p_common = (self.n_orb, T_list, exct, eta, exec_path, header, output_dir, exct) + one_body_g = calc_one_body_green_core_parallel(p_common) + + # calcspectrum = CalcSpectrum(T_list, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) + # energy_list = calcspectrum.get_energies() + # one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) # print(len(energy_list)) # print(energy_list) From ce29340740f363146368754029a5ab2fdcc3ac8c Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Thu, 21 Apr 2022 21:21:40 +0900 Subject: [PATCH 29/49] Fix some bugs (still test not pass) --- src/dcore/impurity_solvers/hphi.py | 4 ++-- src/dcore/impurity_solvers/hphi_spectrum.py | 23 +++++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index 67c9b12c..0ec60d00 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -27,7 +27,7 @@ # from pytriqs.archive import HDFArchive from triqs.operators import * -from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, extract_bath_params +from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, extract_bath_params, expand_path from .base import SolverBase from .hphi_spectrum import calc_one_body_green_core_parallel from .pomerol import assign_from_numpy_array @@ -142,7 +142,7 @@ def solve(self, rot, mpirun_command, params_kw): # self.gf_struct # self.use_spin_orbit - exec_path = os.path.expandvars(params_kw['exec_path']) + exec_path = expand_path(params_kw['exec_path']) # The number of process (np) must be 4^m in HPhi mpirun_command_power4 = mpirun_command diff --git a/src/dcore/impurity_solvers/hphi_spectrum.py b/src/dcore/impurity_solvers/hphi_spectrum.py index d98917ad..50c6cb17 100644 --- a/src/dcore/impurity_solvers/hphi_spectrum.py +++ b/src/dcore/impurity_solvers/hphi_spectrum.py @@ -20,7 +20,8 @@ def gen_p(): yield sitei, sigmai, sitej, sigmaj, idx, ex_state, p_common from concurrent.futures import ProcessPoolExecutor - with ProcessPoolExecutor(max_workers=max_workers) as executor: + # with ProcessPoolExecutor(max_workers=max_workers) as executor: + with ProcessPoolExecutor() as executor: # FIXME: tentative; max_workers should be provided through p_common one_body_g_tmp = np.array(list(executor.map(calc_one_body_green_core, gen_p()))) one_body_green_core = one_body_g_tmp.reshape((n_site, n_sigma, n_site, n_sigma, n_flg, n_excitation, len(T_list), NOmega)) @@ -40,8 +41,8 @@ def calc_one_body_green_core(p): #unpack parameters sitei, sigmai, sitej, sigmaj, i_flg, ex_state, p_common = p n_site, T_list, exct, eta, path_to_HPhi, header, output_dir, exct_cut = p_common - calc_spectrum_core = CalcSpectrumCore(T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", - output_dir="./output") + calc_spectrum_core = CalcSpectrumCore(T_list, exct, eta, path_to_HPhi=path_to_HPhi, header=header, + output_dir=output_dir) calc_spectrum_core.set_energies() flg = True if i_flg == 0 else False @@ -120,7 +121,8 @@ def __init__(self, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", outpu self.output_dir = output_dir self.nomega = 0 self.parent_dir = os.getcwd() - self.path_to_HPhi = os.path.join(self.parent_dir, path_to_HPhi) + # self.path_to_HPhi = os.path.join(self.parent_dir, path_to_HPhi) + self.path_to_HPhi = path_to_HPhi # converted to full path in DCore def Make_Spectrum_Input(self, calc_dir="./", spectrum_type="single"): @@ -238,7 +240,7 @@ def _update_modpara(self, exct, ex_state=0, calc_dir="./"): dict_mod["OmegaOrg"] = [self.energy_list[exct], 0] if ex_state == 0: omega_max = dict_mod["OmegaMax"] - dict_mod["OmegaMax"] = [-1.0*float(omega_max[0]), -1.0*float(omega_max[1])] + dict_mod["OmegaMax"] = [-1.0*float(omega_max[0]), -1.0*float(omega_max[1])] omega_min = dict_mod["OmegaMin"] dict_mod["OmegaMin"] = [-1.0*float(omega_min[0]), -1.0*float(omega_min[1])] with open(os.path.join(calc_dir, "modpara_ex.def"), "w") as fw: @@ -252,12 +254,12 @@ def _update_modpara(self, exct, ex_state=0, calc_dir="./"): def _make_single_excitation(self, site_i, sigma_i, site_j, sigma_j, file_name = "single_ex.def", ex_state=0, flg_complex = True, calc_dir="./"): # c_{i sigma_i} or c_{i sigma_i} + i c_{j sigma_j} - nsingle = 2 + nsingle = 2 if (2 * site_i + sigma_i) == ( 2 * site_j + sigma_j): nsingle = 1 with open(os.path.join(calc_dir, file_name), "w") as fw: fw.write("===============================\n") - fw.write("NSingle {}\n".format(nsingle)) + fw.write("NSingle {}\n".format(nsingle)) fw.write("===============================\n") fw.write("===============================\n") fw.write("===============================\n") @@ -301,8 +303,8 @@ def get_one_body_green_core(self, sitei, sigmai, sitej, sigmaj, ex_state, flg, e one_body_green[idx] = sign * finite_spectrum_list[T] return one_body_green -if __name__ == "__main__": +def test_main(): args = sys.argv if len(args) != 2: print("Error: Wrong argument.") @@ -334,4 +336,7 @@ def get_one_body_green_core(self, sitei, sigmai, sitej, sigmaj, ex_state, flg, e n_excitation = 2 p_common = (n_site, T_list, exct, eta, path_to_HPhi, header, output_dir, exct) one_body_green = calc_one_body_green_core_parallel(p_common) - np.save("test_g", one_body_green) \ No newline at end of file + np.save("test_g", one_body_green) + +if __name__ == "__main__": + test_main() From 2eb0c2589c66f8f39fe452b0b158499c275a5d8a Mon Sep 17 00:00:00 2001 From: k-yoshimi Date: Thu, 21 Apr 2022 22:52:45 +0900 Subject: [PATCH 30/49] fix bug for reading spectrum data --- src/dcore/impurity_solvers/hphi_spectrum.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi_spectrum.py b/src/dcore/impurity_solvers/hphi_spectrum.py index 50c6cb17..18222f46 100644 --- a/src/dcore/impurity_solvers/hphi_spectrum.py +++ b/src/dcore/impurity_solvers/hphi_spectrum.py @@ -23,8 +23,8 @@ def gen_p(): # with ProcessPoolExecutor(max_workers=max_workers) as executor: with ProcessPoolExecutor() as executor: # FIXME: tentative; max_workers should be provided through p_common one_body_g_tmp = np.array(list(executor.map(calc_one_body_green_core, gen_p()))) - - one_body_green_core = one_body_g_tmp.reshape((n_site, n_sigma, n_site, n_sigma, n_flg, n_excitation, len(T_list), NOmega)) + n_omega = one_body_g_tmp.shape[2] + one_body_green_core = one_body_g_tmp.reshape((n_site, n_sigma, n_site, n_sigma, n_flg, n_excitation, len(T_list), n_omega)) one_body_green = calc_one_body_green(one_body_green_core) import shutil @@ -80,7 +80,7 @@ def __init__(self, T_list, n_iw, exct, eta, path_to_HPhi="./HPhi", header="zvo", self.eta = eta self.header = header self.output_dir = output_dir - self.path_to_HPhi = path_to_HPhi + self.path_to_HPhi = os.path.abspath(path_to_HPhi) self.calc_spectrum_core = CalcSpectrumCore(T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output") self.nomega = n_iw @@ -122,7 +122,7 @@ def __init__(self, T_list, exct, eta, path_to_HPhi="./HPhi", header="zvo", outpu self.nomega = 0 self.parent_dir = os.getcwd() # self.path_to_HPhi = os.path.join(self.parent_dir, path_to_HPhi) - self.path_to_HPhi = path_to_HPhi # converted to full path in DCore + self.path_to_HPhi = os.path.abspath(path_to_HPhi) # converted to full path in DCore def Make_Spectrum_Input(self, calc_dir="./", spectrum_type="single"): @@ -171,16 +171,16 @@ def Make_Spectrum_Input(self, calc_dir="./", spectrum_type="single"): print("Error: Please set NOmega in modpara file") sys.exit(1) - def _read_spectrum(self): + def _read_spectrum(self, calc_dir="./"): spectrum_dict={} frequencies =[] for idx in range(self.exct): - path_to_DG = os.path.join(self.output_dir, "{}_DynamicalGreen_{}.dat".format(self.header,idx)) + path_to_spectrum_dir = os.path.join(calc_dir, self.output_dir) + path_to_DG = os.path.join(path_to_spectrum_dir, "{}_DynamicalGreen_{}.dat".format(self.header,idx)) spectrum = np.loadtxt(path_to_DG) spectrum_dict[idx] = spectrum[:,2] + 1J*spectrum[:,3] if idx == 0 : frequencies = spectrum[:, 0] + 1J*spectrum[:, 1] - spectrums_dict = spectrum_dict frequencies = frequencies return frequencies, spectrum_dict @@ -208,8 +208,8 @@ def _calc_Z(self, T): Z += np.exp(-ene_diff/T) return Z - def get_finite_T_spectrum(self): - frequencies, self.spectrums_dict = self._read_spectrum() + def get_finite_T_spectrum(self, calc_dir="./"): + frequencies, self.spectrums_dict = self._read_spectrum(calc_dir) finite_T_spectrum_dict ={} for T in self.T_list: Z = self._calc_Z(T) @@ -295,7 +295,7 @@ def get_one_body_green_core(self, sitei, sigmai, sitej, sigmaj, ex_state, flg, e # Run HPhi self._run_HPhi(exct_cut, ex_state, calc_dir) # Get Finite-T Green - frequencies, finite_spectrum_list = self.get_finite_T_spectrum() + frequencies, finite_spectrum_list = self.get_finite_T_spectrum(calc_dir) if ex_state == 1: self.frequencies = frequencies sign = 1.0 if ex_state == 1 else -1.0 From ea33e43ddfcbca472d8734037951d3c9a76dd1a1 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 Apr 2022 11:05:59 +0900 Subject: [PATCH 31/49] Fix a bug (pass the test) --- src/dcore/impurity_solvers/hphi.py | 6 +++++- src/dcore/impurity_solvers/hphi_spectrum.py | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index 0ec60d00..c44f5d6b 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -318,8 +318,12 @@ def solve(self, rot, mpirun_command, params_kw): # print(len(energy_list)) # print(energy_list) + print(one_body_g.shape) + assert isinstance(one_body_g, numpy.ndarray) + assert one_body_g.shape == (self.n_orb, 2, self.n_orb, 2, 1, self.n_iw) + # print(one_body_g) - gf = one_body_g[T_list[0]] + gf = one_body_g[..., 0, :] print(gf.shape) assert gf.shape == (self.n_orb, 2, self.n_orb, 2, self.n_iw) diff --git a/src/dcore/impurity_solvers/hphi_spectrum.py b/src/dcore/impurity_solvers/hphi_spectrum.py index 18222f46..d8c9048c 100644 --- a/src/dcore/impurity_solvers/hphi_spectrum.py +++ b/src/dcore/impurity_solvers/hphi_spectrum.py @@ -7,6 +7,11 @@ # T_list, n_iw, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output" def calc_one_body_green_core_parallel(p_common): + """ + Return: + numpy.ndarray(n_site, n_sigma, n_site, n_sigma, n_T, n_omega) + """ + n_sigma = 2 n_flg = 2 n_excitation = 2 From bf0afc1957d758cfcf8925312166354fe1a70cb8 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 Apr 2022 13:15:04 +0900 Subject: [PATCH 32/49] Print eta outside of process parallel --- src/dcore/impurity_solvers/hphi.py | 13 +++++++---- src/dcore/impurity_solvers/hphi_spectrum.py | 26 +++++++++++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index c44f5d6b..f6cd6f5a 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -18,6 +18,7 @@ import numpy from itertools import product import os +import sys from collections import namedtuple from warnings import warn import shlex @@ -154,7 +155,7 @@ def solve(self, rot, mpirun_command, params_kw): else: if not math.log(np, 4).is_integer(): # check if np = 4^m np_new = 4**int(math.log(np, 4)) - warn("np must be a power of 4 in HPhi. np is set to {}.".format(np_new)) + print(f"Warning: np must be a power of 4 in HPhi. np is set to {np_new}.", file=sys.stderr) commands[-1] = str(np_new) mpirun_command_power4 = " ".join(commands) @@ -295,9 +296,11 @@ def solve(self, rot, mpirun_command, params_kw): print(u.i1, u.s1, u.i2, u.s2, u.i3, u.s3, u.i4, u.s4, u.U.real, u.U.imag, file=f) # (2) Run a working horse + print("\nComputing eigeneneries ...") with open('./stdout.log', 'w') as output_f: launch_mpi_subprocesses(mpirun_command_power4, [exec_path, '-e', 'namelist.def'], output_f) + print("\nComputing Gf ...") # # output_dir = "./output" # prefix = "TEST" @@ -311,6 +314,8 @@ def solve(self, rot, mpirun_command, params_kw): p_common = (self.n_orb, T_list, exct, eta, exec_path, header, output_dir, exct) one_body_g = calc_one_body_green_core_parallel(p_common) + print("\nFinish Gf calc.") + # calcspectrum = CalcSpectrum(T_list, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) # energy_list = calcspectrum.get_energies() # one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) @@ -318,13 +323,13 @@ def solve(self, rot, mpirun_command, params_kw): # print(len(energy_list)) # print(energy_list) - print(one_body_g.shape) + # print(one_body_g.shape) assert isinstance(one_body_g, numpy.ndarray) assert one_body_g.shape == (self.n_orb, 2, self.n_orb, 2, 1, self.n_iw) # print(one_body_g) gf = one_body_g[..., 0, :] - print(gf.shape) + # print(gf.shape) assert gf.shape == (self.n_orb, 2, self.n_orb, 2, self.n_iw) # (3) Copy results into @@ -340,7 +345,7 @@ def solve(self, rot, mpirun_command, params_kw): # [s, o1, o2, iw] gf = numpy.einsum("isjsw->sijw", gf) assert gf.shape == (2, self.n_orb, self.n_orb, self.n_iw) - print(gf.shape) + # print(gf.shape) assign_from_numpy_array(self._Gimp_iw, gf, self.block_names) diff --git a/src/dcore/impurity_solvers/hphi_spectrum.py b/src/dcore/impurity_solvers/hphi_spectrum.py index d8c9048c..87a6e65c 100644 --- a/src/dcore/impurity_solvers/hphi_spectrum.py +++ b/src/dcore/impurity_solvers/hphi_spectrum.py @@ -17,6 +17,8 @@ def calc_one_body_green_core_parallel(p_common): n_excitation = 2 n_site, T_list, exct, eta, path_to_HPhi, header, output_dir, exct_cut = p_common + check_eta(p_common) + def gen_p(): for sitei, sigmai in itertools.product(range(n_site), range(n_sigma)): for sitej, sigmaj in itertools.product(range(n_site), range(n_sigma)): @@ -53,6 +55,12 @@ def calc_one_body_green_core(p): flg = True if i_flg == 0 else False return calc_spectrum_core.get_one_body_green_core(sitei, sigmai, sitej, sigmaj, ex_state, flg, exct_cut) +def check_eta(p_common): + _, T_list, exct, eta, path_to_HPhi, header, output_dir, _ = p_common + calc_spectrum_core = CalcSpectrumCore(T_list, exct, eta, path_to_HPhi=path_to_HPhi, header=header, + output_dir=output_dir) + calc_spectrum_core.set_energies(check_eta=True) + def calc_one_body_green(one_body_green_core): n_site, n_sigma, n_site, n_sigma, n_excitation, n_flg, n_T, n_omega = one_body_green_core.shape n_excitation = 2 @@ -189,7 +197,7 @@ def _read_spectrum(self, calc_dir="./"): frequencies = frequencies return frequencies, spectrum_dict - def set_energies(self): + def set_energies(self, check_eta=False): energy_list = [] with open(os.path.join(self.output_dir, "{}_energy.dat".format(self.header))) as f: lines = f.readlines() @@ -200,11 +208,15 @@ def set_energies(self): self.energy_list = energy_list self.ene_min = energy_list[0] self.ene_max = energy_list[len(energy_list)-1] - for T in self.T_list: - eta_ene = np.exp(-(self.ene_max-self.ene_min)/T) - print("T = {}: exp[-beta(ene_max-ene_mix)] = {}".format(T, eta_ene)) - if eta_ene > self.eta: - print("Warning: At T = {}, eta_ene is larger than eta.".format(T)) + + if check_eta: + print(f"\n Check eta:=exp[-beta(ene_max-ene_mix)] < {self.eta:.1e}") + for T in self.T_list: + eta_ene = np.exp(-(self.ene_max-self.ene_min)/T) + # print(" T = {}: exp[-beta(ene_max-ene_mix)] = {}".format(T, eta_ene)) + print(f" T = {T}: eta = {eta_ene:.2e}") + if eta_ene > self.eta: + print(f"Warning: At T = {T}, exp[-beta(ene_max-ene_mix)]={eta_ene:.2e} is larger than eta={self.eta}.", file=sys.stderr) def _calc_Z(self, T): Z = 0 @@ -295,7 +307,7 @@ def get_one_body_green_core(self, sitei, sigmai, sitej, sigmaj, ex_state, flg, e os.makedirs(calc_dir, exist_ok=True) self.Make_Spectrum_Input(calc_dir) one_body_green = np.zeros((len(self.T_list), self.nomega), dtype=np.complex) - print("Calculate G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitej, "u" if sigmaj == 0 else "d")) + # print("Calculate G[{},{}][{},{}]".format(sitei, "u" if sigmai == 0 else "d", sitej, "u" if sigmaj == 0 else "d")) self._make_single_excitation(sitei, sigmai, sitej, sigmaj, ex_state=ex_state, flg_complex=flg, calc_dir=calc_dir) # Run HPhi self._run_HPhi(exct_cut, ex_state, calc_dir) From 3e3b3055abd5444e1400ebe3d21dbbd670389e1b Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 Apr 2022 15:09:07 +0900 Subject: [PATCH 33/49] Enable max_workers in hphy_spectrum; Add tests/mpi/hphi --- src/dcore/impurity_solvers/hphi.py | 5 +-- src/dcore/impurity_solvers/hphi_spectrum.py | 5 ++- tests/mpi/hphi/test_hphi_parallel.py | 36 ++++++++++++++++++++ tests/non-mpi/hphi/{hphi.py => test_hphi.py} | 0 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 tests/mpi/hphi/test_hphi_parallel.py rename tests/non-mpi/hphi/{hphi.py => test_hphi.py} (100%) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index f6cd6f5a..facfaa3f 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -151,11 +151,12 @@ def solve(self, rot, mpirun_command, params_kw): try: np = int(commands[-1]) except ValueError: + np = None print("A check of np is skipped.") else: if not math.log(np, 4).is_integer(): # check if np = 4^m np_new = 4**int(math.log(np, 4)) - print(f"Warning: np must be a power of 4 in HPhi. np is set to {np_new}.", file=sys.stderr) + print(f"Warning: np must be a power of 4 in HPhi. np is set to {np_new} in eigenenergies calculations. Note that np={np} is used for Gf calculations.", file=sys.stderr) commands[-1] = str(np_new) mpirun_command_power4 = " ".join(commands) @@ -312,7 +313,7 @@ def solve(self, rot, mpirun_command, params_kw): #print("Check Energy") output_dir = "./output" p_common = (self.n_orb, T_list, exct, eta, exec_path, header, output_dir, exct) - one_body_g = calc_one_body_green_core_parallel(p_common) + one_body_g = calc_one_body_green_core_parallel(p_common, max_workers=np) print("\nFinish Gf calc.") diff --git a/src/dcore/impurity_solvers/hphi_spectrum.py b/src/dcore/impurity_solvers/hphi_spectrum.py index 87a6e65c..25a545a2 100644 --- a/src/dcore/impurity_solvers/hphi_spectrum.py +++ b/src/dcore/impurity_solvers/hphi_spectrum.py @@ -6,7 +6,7 @@ # T_list, n_iw, exct, eta, path_to_HPhi="./HPhi", header="zvo", output_dir="./output" -def calc_one_body_green_core_parallel(p_common): +def calc_one_body_green_core_parallel(p_common, max_workers=None): """ Return: numpy.ndarray(n_site, n_sigma, n_site, n_sigma, n_T, n_omega) @@ -27,8 +27,7 @@ def gen_p(): yield sitei, sigmai, sitej, sigmaj, idx, ex_state, p_common from concurrent.futures import ProcessPoolExecutor - # with ProcessPoolExecutor(max_workers=max_workers) as executor: - with ProcessPoolExecutor() as executor: # FIXME: tentative; max_workers should be provided through p_common + with ProcessPoolExecutor(max_workers=max_workers) as executor: one_body_g_tmp = np.array(list(executor.map(calc_one_body_green_core, gen_p()))) n_omega = one_body_g_tmp.shape[2] one_body_green_core = one_body_g_tmp.reshape((n_site, n_sigma, n_site, n_sigma, n_flg, n_excitation, len(T_list), n_omega)) diff --git a/tests/mpi/hphi/test_hphi_parallel.py b/tests/mpi/hphi/test_hphi_parallel.py new file mode 100644 index 00000000..9d70b1b5 --- /dev/null +++ b/tests/mpi/hphi/test_hphi_parallel.py @@ -0,0 +1,36 @@ +# +# DCore -- Integrated DMFT software for correlated electrons +# Copyright (C) 2017 The University of Tokyo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +from dcore.dcore_pre import dcore_pre +from dcore.dcore import dcore +from dcore.dcore_check import dcore_check +# from dcore.tools import h5diff +import numpy + +input_ini = "../../non-mpi/hphi/hphi.ini" + +dcore_pre(input_ini) +dcore(input_ini, np=2) + +# A direct comparison of HDF5 file does not work +# h5diff("square.out.h5", "square.out.h5.ref", "dmft_out/Sigma_iw", precision=1e-5) + +# Use sigma.dat generated by dcore_check +dcore_check(input_ini, 'check/', 'png', 100) # generate sigma.dat +sigma = numpy.loadtxt("check/sigma.dat") +sigma_ref = numpy.loadtxt("../../non-mpi/hphi/sigma.dat.ref") +numpy.allclose(sigma, sigma_ref, atol=1e-5) diff --git a/tests/non-mpi/hphi/hphi.py b/tests/non-mpi/hphi/test_hphi.py similarity index 100% rename from tests/non-mpi/hphi/hphi.py rename to tests/non-mpi/hphi/test_hphi.py From d179e32abeec6c8788aebda52ba0961dfe4ac9a5 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 Apr 2022 15:21:07 +0900 Subject: [PATCH 34/49] Clean up --- src/dcore/impurity_solvers/hphi.py | 17 ++--------------- src/dcore/impurity_solvers/hphi_spectrum.py | 3 +-- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index facfaa3f..11fb7dd9 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -20,7 +20,6 @@ import os import sys from collections import namedtuple -from warnings import warn import shlex import math @@ -180,7 +179,7 @@ def solve(self, rot, mpirun_command, params_kw): exct_max = 4**n_site if exct > exct_max: - warn("exct={0} is larger than {1}. exct is set to {1}".format(exct, exct_max)) + print(f"Warning: exct={exct} is larger than {exct_max}. exct is set to {exct_max}", file=sys.stderr) exct = exct_max # Output namelist.def @@ -302,35 +301,24 @@ def solve(self, rot, mpirun_command, params_kw): launch_mpi_subprocesses(mpirun_command_power4, [exec_path, '-e', 'namelist.def'], output_f) print("\nComputing Gf ...") - # - # output_dir = "./output" - # prefix = "TEST" header = "zvo" T_list = [1./self.beta] - # exct = 2 eta = 1e-4 - - #print("Check Energy") output_dir = "./output" p_common = (self.n_orb, T_list, exct, eta, exec_path, header, output_dir, exct) one_body_g = calc_one_body_green_core_parallel(p_common, max_workers=np) - print("\nFinish Gf calc.") - # calcspectrum = CalcSpectrum(T_list, exct=exct, eta=eta, path_to_HPhi=exec_path, header=header) # energy_list = calcspectrum.get_energies() # one_body_g = calcspectrum.get_one_body_green(n_site=self.n_orb, exct_cut=exct) - # print(len(energy_list)) - # print(energy_list) + print("\nFinish Gf calc.") # print(one_body_g.shape) assert isinstance(one_body_g, numpy.ndarray) assert one_body_g.shape == (self.n_orb, 2, self.n_orb, 2, 1, self.n_iw) - # print(one_body_g) gf = one_body_g[..., 0, :] - # print(gf.shape) assert gf.shape == (self.n_orb, 2, self.n_orb, 2, self.n_iw) # (3) Copy results into @@ -346,7 +334,6 @@ def solve(self, rot, mpirun_command, params_kw): # [s, o1, o2, iw] gf = numpy.einsum("isjsw->sijw", gf) assert gf.shape == (2, self.n_orb, self.n_orb, self.n_iw) - # print(gf.shape) assign_from_numpy_array(self._Gimp_iw, gf, self.block_names) diff --git a/src/dcore/impurity_solvers/hphi_spectrum.py b/src/dcore/impurity_solvers/hphi_spectrum.py index 25a545a2..2f587857 100644 --- a/src/dcore/impurity_solvers/hphi_spectrum.py +++ b/src/dcore/impurity_solvers/hphi_spectrum.py @@ -9,7 +9,7 @@ def calc_one_body_green_core_parallel(p_common, max_workers=None): """ Return: - numpy.ndarray(n_site, n_sigma, n_site, n_sigma, n_T, n_omega) + np.ndarray(n_site, n_sigma, n_site, n_sigma, n_T, n_omega) """ n_sigma = 2 @@ -212,7 +212,6 @@ def set_energies(self, check_eta=False): print(f"\n Check eta:=exp[-beta(ene_max-ene_mix)] < {self.eta:.1e}") for T in self.T_list: eta_ene = np.exp(-(self.ene_max-self.ene_min)/T) - # print(" T = {}: exp[-beta(ene_max-ene_mix)] = {}".format(T, eta_ene)) print(f" T = {T}: eta = {eta_ene:.2e}") if eta_ene > self.eta: print(f"Warning: At T = {T}, exp[-beta(ene_max-ene_mix)]={eta_ene:.2e} is larger than eta={self.eta}.", file=sys.stderr) From c9c77efff3078f35e02713fa050593b36c6c4fe7 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 Apr 2022 15:36:05 +0900 Subject: [PATCH 35/49] Delete CMakeLists.txt --- test/CMakeLists.txt | 36 ------------------------------- tests/non-mpi/hphi/CMakeLists.txt | 5 ----- 2 files changed, 41 deletions(-) delete mode 100644 test/CMakeLists.txt delete mode 100644 tests/non-mpi/hphi/CMakeLists.txt diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt deleted file mode 100644 index 79ecb459..00000000 --- a/test/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -function(add_python_test test) - add_test(NAME ${test} COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${test}.py) - set_tests_properties(${test} PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}:${CMAKE_BINARY_DIR}/python:${TRIQS_SITE_PACKAGES}:$ENV{PYTHONPATH}") -endfunction() - -add_subdirectory(typed_parser) -add_subdirectory(tools) -add_subdirectory(openmx) -add_subdirectory(respack) -add_subdirectory(pre_preset) -add_subdirectory(pre_wannier) -add_subdirectory(pre_wannier_so) -add_subdirectory(pre_respack) -add_subdirectory(pre_respack_so) -add_subdirectory(pre_external) -add_subdirectory(alps_cthyb) -if (TRIQS_VERSION STREQUAL "1.4") - add_subdirectory(chain_hubbardI_so) - add_subdirectory(chain_hubbardI) -endif() - -if (NOT MPIEXEC) - set(MPIEXEC "mpirun -np \#") -endif() -message(STATUS "Using ${MPIEXEC} for running MPI-dependent tests") -unset(MPIEXEC CACHE) - -option(TEST_DEV "Activate developers' test" OFF) -if(TEST_DEV) - message(STATUS "Activated developers' test") - add_subdirectory(bse_chi0) - add_subdirectory(bse_sparse) - add_subdirectory(hphi) - - message(AUTHOR_WARNING "Be sure to include 'bse_home/python' in PYTHONPATH or set 'bse_home' by -DBSE_PATH option") -endif() diff --git a/tests/non-mpi/hphi/CMakeLists.txt b/tests/non-mpi/hphi/CMakeLists.txt deleted file mode 100644 index ef37f27e..00000000 --- a/tests/non-mpi/hphi/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -FILE(COPY hphi.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -# FILE(COPY square.out.h5.ref DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -FILE(COPY sigma.dat.ref DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - -add_python_test(hphi) From 49218a2c74eef2d583eb8f213f8d245d76d289cc Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 Apr 2022 17:07:23 +0900 Subject: [PATCH 36/49] Change import statement triqs.gf -> _dispatcher --- src/dcore/impurity_solvers/hphi.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index 11fb7dd9..c6c2ab25 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -23,9 +23,7 @@ import shlex import math -from triqs.gf import * -# from pytriqs.archive import HDFArchive -from triqs.operators import * +from dcore._dispatcher import * from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, extract_bath_params, expand_path from .base import SolverBase From c2dc070f54ee4960d7de0d89bbea643d31b4c0f8 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Fri, 22 Apr 2022 17:32:13 +0900 Subject: [PATCH 37/49] Fix test (chdir) --- tests/mpi/hphi/test_hphi_parallel.py | 36 ---------------------------- tests/non-mpi/hphi/test_hphi.py | 26 ++++++++++++-------- 2 files changed, 16 insertions(+), 46 deletions(-) delete mode 100644 tests/mpi/hphi/test_hphi_parallel.py diff --git a/tests/mpi/hphi/test_hphi_parallel.py b/tests/mpi/hphi/test_hphi_parallel.py deleted file mode 100644 index 9d70b1b5..00000000 --- a/tests/mpi/hphi/test_hphi_parallel.py +++ /dev/null @@ -1,36 +0,0 @@ -# -# DCore -- Integrated DMFT software for correlated electrons -# Copyright (C) 2017 The University of Tokyo -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -from dcore.dcore_pre import dcore_pre -from dcore.dcore import dcore -from dcore.dcore_check import dcore_check -# from dcore.tools import h5diff -import numpy - -input_ini = "../../non-mpi/hphi/hphi.ini" - -dcore_pre(input_ini) -dcore(input_ini, np=2) - -# A direct comparison of HDF5 file does not work -# h5diff("square.out.h5", "square.out.h5.ref", "dmft_out/Sigma_iw", precision=1e-5) - -# Use sigma.dat generated by dcore_check -dcore_check(input_ini, 'check/', 'png', 100) # generate sigma.dat -sigma = numpy.loadtxt("check/sigma.dat") -sigma_ref = numpy.loadtxt("../../non-mpi/hphi/sigma.dat.ref") -numpy.allclose(sigma, sigma_ref, atol=1e-5) diff --git a/tests/non-mpi/hphi/test_hphi.py b/tests/non-mpi/hphi/test_hphi.py index 5b644133..809d784d 100644 --- a/tests/non-mpi/hphi/test_hphi.py +++ b/tests/non-mpi/hphi/test_hphi.py @@ -20,17 +20,23 @@ from dcore.dcore_check import dcore_check # from dcore.tools import h5diff import numpy +import os -input_ini = "hphi.ini" -dcore_pre(input_ini) -dcore(input_ini) +def test_hphi(request): + org_dir = os.getcwd() + os.chdir(request.fspath.dirname) -# A direct comparison of HDF5 file does not work -# h5diff("square.out.h5", "square.out.h5.ref", "dmft_out/Sigma_iw", precision=1e-5) + input_ini = "hphi.ini" -# Use sigma.dat generated by dcore_check -dcore_check(input_ini, 'check/', 'png', 100) # generate sigma.dat -sigma = numpy.loadtxt("check/sigma.dat") -sigma_ref = numpy.loadtxt("sigma.dat.ref") -numpy.allclose(sigma, sigma_ref, atol=1e-5) + dcore_pre(input_ini) + dcore(input_ini) + + # A direct comparison of HDF5 file does not work + # h5diff("square.out.h5", "square.out.h5.ref", "dmft_out/Sigma_iw", precision=1e-5) + + # Use sigma.dat generated by dcore_check + dcore_check(input_ini, 'check/', 'png', 100) # generate sigma.dat + sigma = numpy.loadtxt("check/sigma.dat") + sigma_ref = numpy.loadtxt("sigma.dat.ref") + numpy.allclose(sigma, sigma_ref, atol=1e-5) From 4252b03931da28fba5995c6e6b163c0db53e1e41 Mon Sep 17 00:00:00 2001 From: Hiroshi Shinaoka Date: Fri, 22 Apr 2022 21:45:09 +0900 Subject: [PATCH 38/49] Add HPhi to GA Actions --- .github/workflows/ci.yml | 2 +- .github/workflows/ci_dcorelib.yml | 28 ++++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1244e637..a49a81eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Run all tests +name: Run tests with triqs on: [push, pull_request] jobs: all-tests: diff --git a/.github/workflows/ci_dcorelib.yml b/.github/workflows/ci_dcorelib.yml index b39a21c4..aacf5fc7 100644 --- a/.github/workflows/ci_dcorelib.yml +++ b/.github/workflows/ci_dcorelib.yml @@ -1,4 +1,4 @@ -name: Build/test suite +name: Run tests with dcorelib on: [push, pull_request] jobs: build: @@ -19,6 +19,11 @@ jobs: steps: - uses: actions/checkout@v2 + - name: apt + if: ${{ runner.os == 'Linux' }} + run: | + sudo apt update + sudo apt install liblapack-dev openmpi-bin libopenmpi-dev libscalapack-openmpi-dev - uses: mpi4py/setup-mpi@v1 - name: Set up python ${{ matrix.python }} @@ -35,8 +40,27 @@ jobs: run: | pip install .[dev] + - name: make workspace [HPhi] + run: | + pwd + cmake -E make_directory ${{runner.workspace}}/HPhi/build + + - name: download [HPhi] + working-directory: ${{runner.workspace}}/HPhi + run: | + wget https://github.com/issp-center-dev/HPhi/releases/download/v3.5.0/HPhi-3.5.0.tar.gz + tar zxvf HPhi-3.5.0.tar.gz + + - name: cmake [HPhi] + working-directory: ${{runner.workspace}}/HPhi/build + shell: bash + run: | + cmake -DCMAKE_VERBOSE_MAKEFILE=ON $GITHUB_WORKSPACE ../HPhi-3.5.0 -DCMAKE_INSTALL_PREFIX=${{runner.workspace}}/HPhi + make install + - name: Test with pytest run: | export DCORE_TRIQS_COMPAT=1 + export PATH=${{runner.workspace}}/HPhi/bin:$PATH pytest tests/non-mpi/*/*.py - mpirun -np 2 pytest tests/mpi/*/*.py \ No newline at end of file + mpirun -np 2 pytest tests/mpi/*/*.py From 55b1373de21f86b457ba7b8e54701254deeef4e1 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Sun, 24 Apr 2022 02:01:46 +0900 Subject: [PATCH 39/49] Each process stores only a part of hopping array --- src/dcore/sumkdft_opt.py | 198 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 3 deletions(-) diff --git a/src/dcore/sumkdft_opt.py b/src/dcore/sumkdft_opt.py index 48d0d509..1bc16325 100644 --- a/src/dcore/sumkdft_opt.py +++ b/src/dcore/sumkdft_opt.py @@ -1,3 +1,4 @@ +from os import readlink import numpy import copy from warnings import warn @@ -216,7 +217,10 @@ def print_time(txt): for ibl in range(self.n_spin_blocks[self.SO]): ind = ntoi[spn[ibl]] n_orb = self.n_orbitals[ik, ind] - M[ibl] = self.hopping[ik, ind, 0:n_orb, 0:n_orb] - \ + # M[ibl] = self.hopping[ik, ind, 0:n_orb, 0:n_orb] - \ + # (idmat[ibl] * mu) - (idmat[ibl] * self.h_field * (1 - 2 * ibl)) + # +++REPLACED + M[ibl] = self.hopping_part[ik][ind, 0:n_orb, 0:n_orb] - \ (idmat[ibl] * mu) - (idmat[ibl] * self.h_field * (1 - 2 * ibl)) G_latt -= M print_time("G_latt -= M") @@ -529,6 +533,100 @@ def total_density_matsubara(self, mu=None, iw_or_w="iw", with_Sigma=True, with_d mpi.report("Warning: Imaginary part in density will be ignored ({})".format(str(abs(dens.imag)))) return dens.real + def density_matrix(self, method='using_gf', beta=40.0): + """Calculate density matrices in one of two ways. + + Parameters + ---------- + method : string, optional + + - if 'using_gf': First get lattice gf (g_loc is not set up), then density matrix. + It is useful for Hubbard I, and very quick. + No assumption on the hopping structure is made (ie diagonal or not). + - if 'using_point_integration': Only works for diagonal hopping matrix (true in wien2k). + + beta : float, optional + Inverse temperature. + + Returns + ------- + dens_mat : list of dicts + Density matrix for each spin in each correlated shell. + """ + dens_mat = [{} for icrsh in range(self.n_corr_shells)] + for icrsh in range(self.n_corr_shells): + for sp in self.spin_block_names[self.corr_shells[icrsh]['SO']]: + dens_mat[icrsh][sp] = numpy.zeros( + [self.corr_shells[icrsh]['dim'], self.corr_shells[icrsh]['dim']], numpy.complex_) + + ikarray = numpy.array(list(range(self.n_k))) + for ik in mpi.slice_array(ikarray): + + if method == "using_gf": + + G_latt_iw = self.lattice_gf( + ik=ik, mu=self.chemical_potential, iw_or_w="iw", beta=beta) + G_latt_iw *= self.bz_weights[ik] + dm = G_latt_iw.density() + MMat = [dm[sp] for sp in self.spin_block_names[self.SO]] + + elif method == "using_point_integration": + + ntoi = self.spin_names_to_ind[self.SO] + spn = self.spin_block_names[self.SO] + dims = {sp:self.n_orbitals[ik, ntoi[sp]] for sp in spn} + MMat = [numpy.zeros([dims[sp], dims[sp]], numpy.complex_) for sp in spn] + + for isp, sp in enumerate(spn): + ind = ntoi[sp] + for inu in range(self.n_orbitals[ik, ind]): + # only works for diagonal hopping matrix (true in + # wien2k) + # if (self.hopping[ik, ind, inu, inu] - self.h_field * (1 - 2 * isp)) < 0.0: + # +++REPLACED + if (self.hopping_part[ik][ind, inu, inu] - self.h_field * (1 - 2 * isp)) < 0.0: + MMat[isp][inu, inu] = 1.0 + else: + MMat[isp][inu, inu] = 0.0 + + else: + raise ValueError("density_matrix: the method '%s' is not supported." % method) + + for icrsh in range(self.n_corr_shells): + for isp, sp in enumerate(self.spin_block_names[self.corr_shells[icrsh]['SO']]): + ind = self.spin_names_to_ind[ + self.corr_shells[icrsh]['SO']][sp] + dim = self.corr_shells[icrsh]['dim'] + n_orb = self.n_orbitals[ik, ind] + projmat = self.proj_mat[ik, ind, icrsh, 0:dim, 0:n_orb] + if method == "using_gf": + dens_mat[icrsh][sp] += numpy.dot(numpy.dot(projmat, MMat[isp]), + projmat.transpose().conjugate()) + elif method == "using_point_integration": + dens_mat[icrsh][sp] += self.bz_weights[ik] * numpy.dot(numpy.dot(projmat, MMat[isp]), + projmat.transpose().conjugate()) + + # get data from nodes: + for icrsh in range(self.n_corr_shells): + for sp in dens_mat[icrsh]: + dens_mat[icrsh][sp] = mpi.all_reduce( + mpi.world, dens_mat[icrsh][sp], lambda x, y: x + y) + mpi.barrier() + + if self.symm_op != 0: + dens_mat = self.symmcorr.symmetrize(dens_mat) + + # Rotate to local coordinate system: + if self.use_rotations: + for icrsh in range(self.n_corr_shells): + for sp in dens_mat[icrsh]: + if self.rot_mat_time_inv[icrsh] == 1: + dens_mat[icrsh][sp] = dens_mat[icrsh][sp].conjugate() + dens_mat[icrsh][sp] = numpy.dot(numpy.dot(self.rot_mat[icrsh].conjugate().transpose(), dens_mat[icrsh][sp]), + self.rot_mat[icrsh]) + + return dens_mat + def density_matrix_matsubara(self, method='using_gf', beta=40.0): """Calculate density matrices in one of two ways. @@ -578,7 +676,9 @@ def density_matrix_matsubara(self, method='using_gf', beta=40.0): for inu in range(self.n_orbitals[ik, ind]): # only works for diagonal hopping matrix (true in # wien2k) - if (self.hopping[ik, ind, inu, inu] - self.h_field * (1 - 2 * isp)) < 0.0: + # if (self.hopping[ik, ind, inu, inu] - self.h_field * (1 - 2 * isp)) < 0.0: + # +++REPLACED + if (self.hopping_part[ik][ind, inu, inu] - self.h_field * (1 - 2 * isp)) < 0.0: MMat[isp][inu, inu] = 1.0 else: MMat[isp][inu, inu] = 0.0 @@ -621,12 +721,22 @@ def density_matrix_matsubara(self, method='using_gf', beta=40.0): return dens_mat + ############################################################### + # hopping is a large array ([n_k, n_spin, n_bands, n_bands]), + # so broadcasting it to all nodes could cause out of memory. + # To avoid this, each process stores minimum set of hopping + # that is actually used in k-loop. + ############################################################### ############################################################### - # OVERRIDE FUNCTIONS # mpi.bcast is replaced with the split transfer version # to avoid OverFlowError when object size exceeds ~2GB + ############################################################### + + ############################################################### + # OVERRIDE FUNCTIONS # Replaced parts are indicated by "+++REPLACED" + # Added parts are indicated by "+++ADDED" ############################################################### def read_input_from_hdf(self, subgrp, things_to_read): @@ -675,10 +785,92 @@ def read_input_from_hdf(self, subgrp, things_to_read): # now do the broadcasting: for it in things_to_read: + # +++ADDED + # do not broadcast hopping + if it == 'hopping': + continue # setattr(self, it, mpi.bcast(getattr(self, it))) # +++REPLACED setattr(self, it, dcore_mpi.bcast(getattr(self, it))) # split transfer version subgroup_present = mpi.bcast(subgroup_present) values_not_read = mpi.bcast(values_not_read) + # +++ADDED + # distribute slice of hopping + if 'hopping' in things_to_read: + self.slice_hopping() + return subgroup_present, values_not_read + + ############################################################### + # ADDED FUNCTIONS + ############################################################### + + def slice_hopping(self): + """Distribute slice of hopping array. Each process (rank) stores only a part of hopping array in hopping_part. + + hopping : (numpy.ndarray) [ik, sp, orb1, orb2] + hopping_part : (dict(numpy.ndarray)) [ik][sp, orb1, orb2] + """ + + ikarray = numpy.array(list(range(self.n_k))) + ikarray_part = numpy.array(mpi.slice_array(ikarray)) + + rank_assigned = np.zeros(self.n_k, dtype=int) + rank_assigned[ikarray_part] = mpi.rank + rank_assigned = mpi.all_reduce(mpi.world, rank_assigned, lambda x, y: x + y) + + self.hopping_part = {} + for ik in ikarray: + dest = rank_assigned[ik] + if dest == 0: + if mpi.rank == 0: + self.hopping_part[ik] = self.hopping[ik, ...] + else: + # Send hopping[ik] from rank=0 to rank=dest + if mpi.rank == 0: + # mpi.Send(self.hopping[ik, ...], dest=dest, tag=ik) + mpi.send(self.hopping[ik, ...], dest=dest) + elif mpi.rank == dest: + # self.hopping_part[ik] = mpi.Recv(source=0, tag=ik) + self.hopping_part[ik] = mpi.recv(source=0) + + # Check if hopping_part is properly set + assert len(self.hopping_part) == ikarray_part.size + assert set(self.hopping_part.keys()) == set(ikarray_part) + + ############################################################### + # OVERRIDE FUNCTIONS + # Replaced parts are indicated by "+++REPLACED" + ############################################################### + + # This method uses hopping but is not parallelized. + # Wrap the original method so that only the master node calculates. + def eff_atomic_levels(self): + if mpi.is_master_node(): + eff_atlevels = super().eff_atomic_levels() + else: + eff_atlevels = None + return mpi.bcast(eff_atlevels) + + def calculate_min_max_band_energies(self): + # hop = self.hopping + # diag_hop = numpy.zeros(hop.shape[:-1]) + # hop_slice = mpi.slice_array(hop) + # +++REPLACED + hop_slice = numpy.array([hop_ik for hop_ik in self.hopping_part.values()]) # dict(ndarray) to ndarray + diag_hop = numpy.zeros((self.n_k,) + hop_slice.shape[1:3]) + + diag_hop_slice = mpi.slice_array(diag_hop) + diag_hop_slice[:] = numpy.linalg.eigvalsh(hop_slice) + diag_hop = mpi.all_reduce(mpi.world, diag_hop, lambda x, y: x + y) + min_band_energy = diag_hop.min().real + max_band_energy = diag_hop.max().real + self.min_band_energy = min_band_energy + self.max_band_energy = max_band_energy + return min_band_energy, max_band_energy + + # This method is not used for the moment. + # Actually, replacement is simple. + def calc_density_correction(self, filename=None, dm_type='wien2k'): + raise Exception("hopping must be replaced with hopping_part") From e468dc5244891c2b77e19b496443bebb8c5d1400 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Mon, 25 Apr 2022 23:09:01 +0900 Subject: [PATCH 40/49] Print message to show that hopping_part is used --- src/dcore/sumkdft_opt.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dcore/sumkdft_opt.py b/src/dcore/sumkdft_opt.py index 1bc16325..88df8759 100644 --- a/src/dcore/sumkdft_opt.py +++ b/src/dcore/sumkdft_opt.py @@ -724,7 +724,7 @@ def density_matrix_matsubara(self, method='using_gf', beta=40.0): ############################################################### # hopping is a large array ([n_k, n_spin, n_bands, n_bands]), # so broadcasting it to all nodes could cause out of memory. - # To avoid this, each process stores minimum set of hopping + # To avoid this, each process stores a part of hopping array # that is actually used in k-loop. ############################################################### @@ -807,12 +807,14 @@ def read_input_from_hdf(self, subgrp, things_to_read): ############################################################### def slice_hopping(self): - """Distribute slice of hopping array. Each process (rank) stores only a part of hopping array in hopping_part. + """hopping array is sliced and distributed as hopping_part. Each process (rank) stores only a part of hopping array. hopping : (numpy.ndarray) [ik, sp, orb1, orb2] hopping_part : (dict(numpy.ndarray)) [ik][sp, orb1, orb2] """ + mpi.report("hopping array is sliced and distributed as hopping_part.") + ikarray = numpy.array(list(range(self.n_k))) ikarray_part = numpy.array(mpi.slice_array(ikarray)) From 97e9aef0ea0f33935b5c2d47a2270632d16fecc2 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Tue, 26 Jul 2022 18:29:42 +0900 Subject: [PATCH 41/49] minor change --- src/dcore/sumkdft_opt.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dcore/sumkdft_opt.py b/src/dcore/sumkdft_opt.py index 88df8759..7f9e2805 100644 --- a/src/dcore/sumkdft_opt.py +++ b/src/dcore/sumkdft_opt.py @@ -1,4 +1,3 @@ -from os import readlink import numpy import copy from warnings import warn From 168d38de8724945b5180c23b540e6a9d42a98fa3 Mon Sep 17 00:00:00 2001 From: Hiroshi Shinaoka Date: Tue, 9 Aug 2022 15:36:26 +0900 Subject: [PATCH 42/49] Fixed runtime error in ALPS/CT-HYB interface without TRIQS --- setup.py | 2 +- src/dcore/impurity_solvers/alps_cthyb.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index f2347cb4..7c415243 100644 --- a/setup.py +++ b/setup.py @@ -47,7 +47,7 @@ # Import h5py imports mpi4py automatically. 'h5py!=2.10.0', 'toml>=0.10', - 'dcorelib>=0.7.1', + 'dcorelib>=0.9.1', 'sympy', ], diff --git a/src/dcore/impurity_solvers/alps_cthyb.py b/src/dcore/impurity_solvers/alps_cthyb.py index ceab892d..e8ff821f 100644 --- a/src/dcore/impurity_solvers/alps_cthyb.py +++ b/src/dcore/impurity_solvers/alps_cthyb.py @@ -299,9 +299,9 @@ def conv(i): G_l = make_block_gf(GfLegendre, self.gf_struct, self.beta, n_points=Nl) assign_from_numpy_array_legendre(G_l, gl_data, self.block_names) - # G_iw with 1/iwn tail + # G_iw for name in self.block_names: - self._Gimp_iw[name] << LegendreToMatsubara(G_l[name]) + legendre_to_matsubara(G_l[name], self._Gimp_iw[name]) make_hermite_conjugate(self._Gimp_iw) # Two-particle GF From ccdf1dfa120571f68ba68e852c3d95e42e7f255c Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Wed, 24 Aug 2022 11:23:04 +0900 Subject: [PATCH 43/49] minor fix in HPhi interface --- src/dcore/impurity_solvers/hphi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dcore/impurity_solvers/hphi.py b/src/dcore/impurity_solvers/hphi.py index c6c2ab25..c8b4a81d 100644 --- a/src/dcore/impurity_solvers/hphi.py +++ b/src/dcore/impurity_solvers/hphi.py @@ -283,7 +283,7 @@ def solve(self, rot, mpirun_command, params_kw): continue # u = 0.0 # print(o1, s1, o3, s3, o2, s2, o4, s4, u.real, u.imag, file=f) - if u != 0: + if numpy.abs(u) > 1e-10: interall.append(InterAll(o1, s1, o3, s3, o2, s2, o4, s4, u)) # Output interall.def From 60ee63e7fc14aa92bf590b5c20cafa75df929189 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Wed, 24 Aug 2022 21:16:07 +0900 Subject: [PATCH 44/49] Add another CTHYB-SEG solver --- src/dcore/impurity_solvers/__init__.py | 2 + src/dcore/impurity_solvers/jo_cthyb_seg.py | 555 +++++++++++++++++++++ 2 files changed, 557 insertions(+) create mode 100644 src/dcore/impurity_solvers/jo_cthyb_seg.py diff --git a/src/dcore/impurity_solvers/__init__.py b/src/dcore/impurity_solvers/__init__.py index 22a1f759..7368182d 100644 --- a/src/dcore/impurity_solvers/__init__.py +++ b/src/dcore/impurity_solvers/__init__.py @@ -6,6 +6,7 @@ from .alps_cthyb_seg import ALPSCTHYBSEGSolver from .pomerol import PomerolSolver from .hphi import HPhiSolver +from .jo_cthyb_seg import JOCTHYBSEGSolver from .base import compute_basis_rot solver_classes = { @@ -17,4 +18,5 @@ 'ALPS/cthyb-seg': ALPSCTHYBSEGSolver, 'pomerol': PomerolSolver, 'HPhi': HPhiSolver, + 'JO/cthyb-seg': JOCTHYBSEGSolver, } diff --git a/src/dcore/impurity_solvers/jo_cthyb_seg.py b/src/dcore/impurity_solvers/jo_cthyb_seg.py new file mode 100644 index 00000000..0b187673 --- /dev/null +++ b/src/dcore/impurity_solvers/jo_cthyb_seg.py @@ -0,0 +1,555 @@ +# +# DCore -- Integrated DMFT software for correlated electrons +# Copyright (C) 2017 The University of Tokyo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +import numpy +import os +import shutil +import sys +from itertools import product +from collections import OrderedDict +from dcore._dispatcher import * +from ..tools import make_block_gf, launch_mpi_subprocesses, extract_H0, umat2dd, get_block_size, expand_path +from .base import SolverBase, rotate_basis + + +def to_numpy_array(g, names): + """ + Convert BlockGf object to numpy. + Rearrange spins and orbitals so that up and down spins appear alternatively. + If there is a single block, we assume that spin and down spins appear alternatively. + If there are two blocks, we assume that they are spin1 and spin2 sectors. + """ + + if g.n_blocks > 2: + raise RuntimeError("n_blocks={} must be 1 or 2.".format(g.n_blocks)) + + n_spin_orbital = numpy.sum([get_block_size(block) for _, block in g]) + + # FIXME: Bit ugly + n_data = g[names[0]].data.shape[0] + + data = numpy.zeros((n_data, n_spin_orbital, n_spin_orbital), dtype=complex) + offset = 0 + for name in names: + block = g[name] + block_dim = get_block_size(block) + data[:, offset:offset + block_dim, offset:offset + block_dim] = block.data + offset += block_dim + + # from (spin, orb) : (up,orb1), (up,orb2), ..., (down,orb1), (down,orb2), ... + # to (orb, spin) : (up,orb1), (down,orb1), (up,orb2), (down,orb2), ... + norb = n_spin_orbital//2 + index = numpy.zeros(n_spin_orbital, dtype=int) + index[0::2] = numpy.arange(norb) + index[1::2] = numpy.arange(norb) + norb + # Swap cols and rows + return (data[:, :, index])[:, index, :] + + +# def assign_from_numpy_array(g, data, names): +# """ +# Does inversion of to_numpy_array +# data[spin,orb,iw] +# g[spin].data[iw,orb1,orb2] +# """ +# # print(g.n_blocks) +# if g.n_blocks != 2: +# raise RuntimeError("n_blocks={} must be 1 or 2.".format(g.n_blocks)) +# +# norb = data.shape[1] +# niw = data.shape[2] +# # print(data.shape) +# # print("norb:", norb) +# +# # check number of Matsubara frequency +# assert data.shape[2]*2 == g[names[0]].data.shape[0] +# # print(g[names[0]].data.shape) +# +# for spin in range(2): +# for orb in range(norb): +# # print(orb, spin, names[spin]) +# # positive frequency +# g[names[spin]].data[niw:, orb, orb] = data[spin][orb][:] +# # negative frequency +# g[names[spin]].data[:niw, orb, orb] = numpy.conj(data[spin][orb][::-1]) + + +def assign_from_numpy_array(g, data, names): + """ + Does inversion of to_numpy_array + + assign from + data[iw, i] (i=(orb,spin)) + to + g[spin].data[iw,orb1,orb2] (w/o SO) (spin='up', 'down') + g['ud'].data[iw,i1,i2] (w/ SO) + + """ + + if g.n_blocks > 2: + raise RuntimeError("n_blocks={} must be 1 or 2.".format(g.n_blocks)) + + # (n_sp, n_inner) = (2, n_orb) w/o SO + # (1, 2*n_orb) w/ SO + n_sp = g.n_blocks + n_inner = data.shape[1] // n_sp + niw = data.shape[0] + + # array which data are assigned from + # (orb, spin, iw) -> (spin, orb, iw) -> (spin, orb, iw) w/o SO + # (1, inner, iw) w/ SO + # data_from = data.reshape((-1, 2, niw)).transpose((1, 0, 2)).reshape(n_sp, n_inner, niw) + + # (iw, orb, spin) -> (iw, spin, orb) -> (iw, spin, orb) w/o SO + # (iw, 1, inner) w/ SO + data_from = data.reshape((niw, -1, 2)).transpose((0, 2, 1)).reshape(niw, n_sp, n_inner) + + # assign data_from to g + for sp, name in enumerate(names): + # array which data are assigned to + data_to = g[name].data + assert data_to.shape == (2*niw, n_inner, n_inner) + for i in range(n_inner): + # positive frequency + data_to[niw:, i, i] = data_from[:, sp, i] + # negative frequency + data_to[:niw, i, i] = numpy.conj(data_from[::-1, sp, i]) + + +def dcore2alpscore(dcore_U): + + dcore_U_len = len(dcore_U) + alps_U = numpy.zeros((dcore_U_len, dcore_U_len), dtype=float) + alps_Uprime = numpy.zeros((dcore_U_len, dcore_U_len), dtype=float) + alps_J = numpy.zeros((dcore_U_len, dcore_U_len), dtype=float) + + # m_range = range(size) + for i, j in product(range(dcore_U_len), range(dcore_U_len)): + alps_U[i, j] = dcore_U[i, j, i, j].real - dcore_U[i, j, j, i].real + alps_Uprime[i, j] = dcore_U[i, j, i, j].real + alps_J[i, j] = dcore_U[i, j, j, i].real + return alps_U, alps_Uprime, alps_J + +def convert_Umatrix(U, Uprime, J, norb): + Uout = numpy.zeros((norb, 2, norb, 2)) + + # from (up,orb1), (up,orb2), ..., (down,orb1), (down,orb2), ... + # to (up,orb1), (down,orb1), (up,orb2), (down,orb2), ... + def func(u): + uout = u.reshape((2, norb, 2, norb)).transpose(1, 0, 3, 2) + return uout + + U_four = func(U) + Uprime_four = func(Uprime) + J_four = func(J) + + for a1, a2 in product(range(norb), repeat=2): + for s1, s2 in product(range(2), repeat=2): # spin-1/2 + if a1 == a2: + Uout[a1, s1, a2, s2] = U_four[a1, s1, a2, s2] + else: + Uout[a1, s1, a2, s2] = Uprime_four[a1, s1, a2, s2] - J_four[a1, s1, a2, s2] + + return Uout.reshape((2*norb, 2*norb)) + + # Uout = Uout.reshape((2*norb, 2*norb)) + # with open('./Umatrix', 'w') as f: + # for i in range(2*norb): + # for j in range(2*norb): + # print('{:.15e} '.format(Uout[i, j].real), file=f, end="") + # print("", file=f) + + +def eval_tail(g_iw, beta, n_ave=10): + # array_iw[iw, flavor] + assert g_iw.ndim == 2 + + n_iw, n_flavors = g_iw.shape + iw = (2*numpy.arange(n_iw) + 1) * numpy.pi / beta + + tails = numpy.mean(g_iw[-n_ave:, :] * iw[-n_ave:, None], axis=0).real + assert tails.shape == (n_flavors,) + + return tails + + +class JOCTHYBSEGSolver(SolverBase): + + def __init__(self, beta, gf_struct, u_mat, n_iw=1025): + """ + Initialize the solver. + """ + + super().__init__(beta, gf_struct, u_mat, n_iw) + + # self.n_tau = max(10001, 5 * n_iw) + + def _get_occupation(self): + """ + Read the spin-orbital-dependent occupation number from HDF5 file + + Returns + ------- + numpy.ndarray of size (2*self.n_orb) + + """ + + array = numpy.zeros(2*self.n_orb, dtype=float) + with HDFArchive('sim.h5', 'r') as f: + results = f["simulation"]["results"] + for i1 in range(2*self.n_orb): + group = "density_%d" % i1 + if group in results: + array[i1] = results[group]["mean"]["value"] + + # [(o1,s1)] -> [o1, s1] -> [s1, o1] -> [(s1, o1)] + array = array.reshape((self.n_orb, 2))\ + .transpose((1, 0))\ + .reshape((2*self.n_orb)) + return array + + def _get_results(self, group_prefix, n_data, orbital_symmetrize, dtype=float, stop_if_data_not_exist=True): + """ + Read results with two spin-orbital indices from HDF5 file + + Returns + ------- + numpy.ndarray of size (2*self.n_orb, 2*self.n_orb, n_data) + + """ + + data_shape = (2*self.n_orb, 2*self.n_orb, n_data) + + array = numpy.zeros(data_shape, dtype=dtype) + with HDFArchive('sim.h5', 'r') as f: + results = f["simulation"]["results"] + for i1, i2 in product(range(2*self.n_orb), repeat=2): + group = "%s_%d_%d" % (group_prefix, i1, i2) + if group in results: + array[i1, i2, :] = results[group]["mean"]["value"] + if orbital_symmetrize: # Only i1>i2 is computed in CTQMC. + array[i2, i1, :] = array[i1, i2, :] + elif stop_if_data_not_exist: + raise Exception("data does not exist in sim.h5/simulation/results/{}. alps_cthyb might be old.".format(group)) + + + # [(o1,s1), (o2,s2)] -> [o1, s1, o2, s2] -> [s1, o1, s2, o2] -> [(s1,o1), (s2,o2)] + array = array.reshape((self.n_orb, 2, self.n_orb, 2, -1))\ + .transpose((1, 0, 3, 2, 4))\ + .reshape((2*self.n_orb, 2*self.n_orb, -1)) + return array + + def solve(self, rot, mpirun_command, params_kw): + """ + In addition to the parameters described in the docstring of SolverBase, + one can pass solver-dependent parameters using params_kw. For example, + exec_path : str, path to an executable, mandatory + dry_run : bool, actual computation is not performed if dry_run is True, optional + """ + internal_params = { + 'exec_path' : '', + 'dry_run' : False, + 'neglect_offdiagonal' : True, + } + + def _read(key): + if key in params_kw: + return params_kw[key] + else: + return internal_params[key] + print (params_kw) + + umat_check = umat2dd(self.u_mat) + assert numpy.allclose(umat_check, self.u_mat), "Please set density_density = True when you run ALPS/cthyb-seg!" + + # (0) Rotate H0 and Delta_tau if rot is given + g0_iw_rotated = self._G0_iw.copy() + if rot is None: + u_mat_rotated = self.u_mat + else: + assert isinstance(rot, dict) + u_mat_rotated = rotate_basis(rot, self.use_spin_orbit, self.u_mat, [g0_iw_rotated,], direction='forward') + + # (1) Set configuration for the impurity solver + # input: + # self.beta + # self.set_G0_iw + # self.u_mat + # + # Additionally, the following variables may used: + # self.n_orb + # self.n_flavors + # self.gf_struct + + # (1a) If H0 is necessary: + # Non-interacting part of the local Hamiltonian including chemical potential + # Make sure H0 is hermite. + # Ordering of index in H0 is spin1, spin1, ..., spin2, spin2, ... + H0 = extract_H0(g0_iw_rotated, self.block_names) + + # from (up,orb1), (up,orb2), ..., (down,orb1), (down,orb2), ... + # to (up,orb1), (down,orb1), (up,orb2), (down,orb2), ... + index = numpy.zeros((2*self.n_orb), dtype=int) + index[0::2] = numpy.arange(self.n_orb) + index[1::2] = numpy.arange(self.n_orb) + self.n_orb + # Swap cols and rows + # H0 = (H0[:, index])[index, :] + H0 = H0[numpy.ix_(index, index)] + + # check if H0 is diagonal + H0_offdiag = H0.copy() + for i in range(H0_offdiag.shape[0]): + H0_offdiag[i, i] = 0 + if numpy.linalg.norm(H0_offdiag) > 1e-6: + print("\nWARNING: The local Hamiltonian is not diagonal", file=sys.stderr) + print("H0_loc =\n{}".format(H0), file=sys.stderr) + if _read('neglect_offdiagonal'): + print("--> continue. To stop calculation, set neglect_offdiagonal{bool}=False", file=sys.stderr) + else: + print("--> exit. To neglect this warning, set neglect_offdiagonal{bool}=True", file=sys.stderr) + sys.exit(1) + + with open('./ef.in', 'w') as f: + for i in range(2*self.n_orb): + print('{:.15e}'.format(H0[i, i].real), file=f) + + + # (1b) If Delta(iw) and/or Delta(tau) are necessary: + # Compute the hybridization function from G0: + # Delta(iwn_n) = iw_n - H0 - G0^{-1}(iw_n) + + # H0 is extracted from the tail of the Green's function. + self._Delta_iw = delta(g0_iw_rotated) + # Delta_tau = make_block_gf(GfImTime, self.gf_struct, self.beta, self.n_tau) + # for name in self.block_names: + # Delta_tau[name] << Fourier(self._Delta_iw[name]) + # Delta_tau_data = to_numpy_array(Delta_tau, self.block_names) + delta_iw = to_numpy_array(self._Delta_iw, self.block_names) + print(delta_iw.shape) + assert delta_iw.shape == (self.n_iw * 2, self.n_orb * 2, self.n_orb * 2) + delta_iw = delta_iw[self.n_iw:, :, :] # only positive frequency + print(delta_iw.shape) + if self.n_iw % 2 != 0: + sys.exit(f"Invalid value n_iw={self.n_iw}: Only even number is allowed for n_iw in JO/cthyb-seg solver") + + # TODO: check delta_iw + # Delta_{ab}(iw) must be diagonal + + print(delta_iw.shape) + delta_iw_diagonal = numpy.einsum("wii->wi", delta_iw) + print(delta_iw_diagonal.shape) + + with open('./delta.in', 'w') as f: + for iw in range(self.n_iw): + for f1 in range(self.n_flavors): + val = delta_iw_diagonal[iw, f1] + print(' {:.15e} {:.15e}'.format(val.real, val.imag), file=f, end="") + print("", file=f) + + # tail of Delta(iw) + vsq = eval_tail(delta_iw_diagonal, self.beta) + with open('./vsq.in', 'w') as f: + for i in range(self.n_flavors): + print('{:.15e}'.format(vsq[i]), file=f) + + + # (1c) Set U_{ijkl} for the solver + # Set up input parameters and files for ALPS/CTHYB-SEG + + U, Uprime, J = dcore2alpscore(u_mat_rotated) + # write_Umatrix(U, Uprime, J, self.n_orb) + Udd = convert_Umatrix(U, Uprime, J, self.n_orb) + assert Udd.shape == (self.n_flavors, self.n_flavors) + + with open('./u.in', 'w') as f: + for i in range(self.n_flavors): + for j in range(self.n_flavors): + print(' {:.15e}'.format(Udd[i, j].real), file=f, end="") + print("", file=f) + + + # (1d) Set parameters for the solver + + params_solver = OrderedDict() + params_solver['model'] = { + 'n_s' : self.n_orb*2, + 'file_Delta' : 'delta.in', + 'file_Vsq' : 'vsq.in', + 'file_U' : 'u.in', + 'file_ef' : 'ef.in', + 'beta' : self.beta, + } + params_solver['control'] = { + 'n_tau' : self.n_iw * 2, + } + params_solver['MC'] = {} + + # Set parameters specified by the user + for prefix in ['control', 'MC']: + for k, v in params_kw.items(): + # Convert, e.g., MC.n_msr -> n_msr + if k.startswith(prefix + '.'): + key = k[len(prefix)+1:] + if key in params_solver[prefix]: + sys.exit(f"ERROR: Cannot override parameter '{key}'") + params_solver[prefix][key] = v + + with open('./input.ini', 'w') as f: + for prefix, params in params_solver.items(): + print(f"\n[{prefix}]", file=f) + for k, v in params.items(): + print(f"{k} = {v}", file=f) + + if _read('dry_run'): + return + + # (2) Run a working horse + exec_path = expand_path(_read('exec_path')) + with open('./output', 'w') as output_f: + launch_mpi_subprocesses(mpirun_command, [exec_path, './input.ini'], output_f) + + with open('./output', 'r') as output_f: + for line in output_f: + print(line, end='') + + # (3) Copy results into + # self._Sigma_iw + # self._Gimp_iw + + data = numpy.loadtxt("self_w.dat") + print(data.shape) + sigma_data = data[:, 1::2] + 1j * data[:, 2::2] + print(sigma_data.shape) + assert sigma_data.shape == (self.n_iw, self.n_flavors) + assign_from_numpy_array(self._Sigma_iw, sigma_data, self.block_names) + + data = numpy.loadtxt("Gf_w.dat") + print(data.shape) + gf_data = data[:, 1::2] + 1j * data[:, 2::2] + print(gf_data.shape) + assert gf_data.shape == (self.n_iw, self.n_flavors) + assign_from_numpy_array(self._Gimp_iw, gf_data, self.block_names) + + # Rotate Sigma and Gimp back to the original basis + if rot is not None: + rotate_basis(rot, self.use_spin_orbit, None, [self._Sigma_iw, self._Gimp_iw], direction='backward') + # rotate_basis(rot, self.use_spin_orbit, None, self._Gimp_iw, direction='backward') + + # self.quant_to_save['nn_equal_time'] + # nn_equal_time = self._get_results("nn", 1, orbital_symmetrize=True, stop_if_data_not_exist=False) + # [(s1,o1), (s2,o2), 0] + # self.quant_to_save['nn_equal_time'] = nn_equal_time[:, :, 0] # copy + + def calc_Xloc_ph(self, rot, mpirun_command, num_wf, num_wb, params_kw): + """ + compute local G2 in p-h channel + X_loc = < c_{i1}^+ ; c_{i2} ; c_{i4}^+ ; c_{i3} > + + Parameters + ---------- + rot + mpirun_command + num_wf + num_wb + params_kw + + Returns + ------- + G2_loc : dict + key = (i1, i2, i3, i4) + val = numpy.ndarray(n_w2b, 2*n_w2f, 2*n_w2f) + + chi_loc : dict (None if not computed) + key = (i1, i2, i3, i4) + val = numpy.ndarray(n_w2b) + """ + raise NotImplementedError + + if rot is not None: + # TODO + raise NotImplementedError + + use_chi_loc = False + + params_kw['cthyb.MEASURE_g2w'] = 1 + params_kw['cthyb.N_w2'] = num_wf + params_kw['cthyb.N_W'] = num_wb + if use_chi_loc: + params_kw['cthyb.MEASURE_nnw'] = 1 + + self.solve(rot, mpirun_command, params_kw) + + # Save G2(wb, wf, wf') + # [(s1,o1), (s2,o2), (wb,wf,wf')] + g2_re = self._get_results("g2w_re", 4*num_wf*num_wf*num_wb, orbital_symmetrize=False) + g2_im = self._get_results("g2w_im", 4*num_wf*num_wf*num_wb, orbital_symmetrize=False) + g2_loc = (g2_re + g2_im * 1.0J) / self.beta + g2_loc = g2_loc.reshape((2*self.n_orb, 2*self.n_orb) + (num_wb, 2*num_wf, 2*num_wf)) + # assign to dict + g2_dict = {} + for i1, i2 in product(range(2*self.n_orb), repeat=2): + g2_dict[(i1, i1, i2, i2)] = g2_loc[i1, i2] + + # return g2_loc for arbitrary wb including wb<0 + def get_g2(_i, _j, _wb, _wf1, _wf2): + try: + if _wb >= 0: + return g2_loc[_i, _j, _wb, _wf1, _wf2] + else: + # G2_iijj(wb, wf, wf') = G2_jjii(-wb, -wf', -wf)^* + return numpy.conj(g2_loc[_j, _i, -_wb, -(1+_wf2), -(1+_wf1)]) + except IndexError: + return 0 + + # Convert G2_iijj -> G2_ijij + g2_loc_tr = numpy.zeros(g2_loc.shape, dtype=complex) + for i1, i2 in product(range(2*self.n_orb), repeat=2): + for wb in range(num_wb): + for wf1, wf2 in product(range(2 * num_wf), repeat=2): + # G2_ijij(wb, wf, wf') = -G2_iijj(wf-wf', wf'+wb, wf')^* + g2_loc_tr[i1, i2, wb, wf1, wf2] = -get_g2(i1, i2, wf1-wf2, wf2+wb, wf2) + # assign to dict + for i1, i2 in product(range(2*self.n_orb), repeat=2): + # exclude i1=i2, which was already assigned by g2_loc + if i1 != i2: + g2_dict[(i1, i2, i1, i2)] = g2_loc_tr[i1, i2] + + # Occupation number + # [(s1,o1)] + occup = self._get_occupation() + + # Save chi(wb) + # [(s1,o1), (s2,o2), wb] + chi_dict = None + if use_chi_loc: + chi_re = self._get_results("nnw_re", num_wb, orbital_symmetrize=True) + chi_im = self._get_results("nnw_im", num_wb, orbital_symmetrize=True) + chi_loc = chi_re + chi_im * 1.0J + # subtract + chi_loc[:, :, 0] -= occup[:, None] * occup[None, :] * self.beta + # assign to dict + chi_dict = {} + for i1, i2 in product(range(2*self.n_orb), repeat=2): + chi_dict[(i1, i1, i2, i2)] = chi_loc[i1, i2] + + return g2_dict, chi_dict + + def calc_G2loc_ph_sparse(self, rot, mpirun_command, freqs_ph, num_wb, params_kw): + raise Exception("This solver does not support the sparse sampling.") + + def name(self): + return "JO/cthyb-seg" From 1f1aaa4466d60de5d04b8e65aaef9dfe4b7f3748 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Mon, 29 Aug 2022 13:41:37 +0900 Subject: [PATCH 45/49] Delete debug output; Clean up --- src/dcore/impurity_solvers/jo_cthyb_seg.py | 132 +++------------------ src/dcore/tools.py | 2 +- 2 files changed, 18 insertions(+), 116 deletions(-) diff --git a/src/dcore/impurity_solvers/jo_cthyb_seg.py b/src/dcore/impurity_solvers/jo_cthyb_seg.py index 0b187673..dbb43567 100644 --- a/src/dcore/impurity_solvers/jo_cthyb_seg.py +++ b/src/dcore/impurity_solvers/jo_cthyb_seg.py @@ -60,34 +60,6 @@ def to_numpy_array(g, names): return (data[:, :, index])[:, index, :] -# def assign_from_numpy_array(g, data, names): -# """ -# Does inversion of to_numpy_array -# data[spin,orb,iw] -# g[spin].data[iw,orb1,orb2] -# """ -# # print(g.n_blocks) -# if g.n_blocks != 2: -# raise RuntimeError("n_blocks={} must be 1 or 2.".format(g.n_blocks)) -# -# norb = data.shape[1] -# niw = data.shape[2] -# # print(data.shape) -# # print("norb:", norb) -# -# # check number of Matsubara frequency -# assert data.shape[2]*2 == g[names[0]].data.shape[0] -# # print(g[names[0]].data.shape) -# -# for spin in range(2): -# for orb in range(norb): -# # print(orb, spin, names[spin]) -# # positive frequency -# g[names[spin]].data[niw:, orb, orb] = data[spin][orb][:] -# # negative frequency -# g[names[spin]].data[:niw, orb, orb] = numpy.conj(data[spin][orb][::-1]) - - def assign_from_numpy_array(g, data, names): """ Does inversion of to_numpy_array @@ -110,10 +82,6 @@ def assign_from_numpy_array(g, data, names): niw = data.shape[0] # array which data are assigned from - # (orb, spin, iw) -> (spin, orb, iw) -> (spin, orb, iw) w/o SO - # (1, inner, iw) w/ SO - # data_from = data.reshape((-1, 2, niw)).transpose((1, 0, 2)).reshape(n_sp, n_inner, niw) - # (iw, orb, spin) -> (iw, spin, orb) -> (iw, spin, orb) w/o SO # (iw, 1, inner) w/ SO data_from = data.reshape((niw, -1, 2)).transpose((0, 2, 1)).reshape(niw, n_sp, n_inner) @@ -166,16 +134,18 @@ def func(u): return Uout.reshape((2*norb, 2*norb)) - # Uout = Uout.reshape((2*norb, 2*norb)) - # with open('./Umatrix', 'w') as f: - # for i in range(2*norb): - # for j in range(2*norb): - # print('{:.15e} '.format(Uout[i, j].real), file=f, end="") - # print("", file=f) - def eval_tail(g_iw, beta, n_ave=10): - # array_iw[iw, flavor] + """Evaluate the coeeficients of 1/iw + + Args: + g_iw (ndarray(n_iw, n_flavors)): Matsubara Green's function G(iw) for w>0. + beta (float): Inverse temperature + n_ave (int, optional): The number of frequency points to average. Defaults to 10. + + Returns: + ndarray(n_flavors,): The coefficients of 1/iw + """ assert g_iw.ndim == 2 n_iw, n_flavors = g_iw.shape @@ -198,61 +168,6 @@ def __init__(self, beta, gf_struct, u_mat, n_iw=1025): # self.n_tau = max(10001, 5 * n_iw) - def _get_occupation(self): - """ - Read the spin-orbital-dependent occupation number from HDF5 file - - Returns - ------- - numpy.ndarray of size (2*self.n_orb) - - """ - - array = numpy.zeros(2*self.n_orb, dtype=float) - with HDFArchive('sim.h5', 'r') as f: - results = f["simulation"]["results"] - for i1 in range(2*self.n_orb): - group = "density_%d" % i1 - if group in results: - array[i1] = results[group]["mean"]["value"] - - # [(o1,s1)] -> [o1, s1] -> [s1, o1] -> [(s1, o1)] - array = array.reshape((self.n_orb, 2))\ - .transpose((1, 0))\ - .reshape((2*self.n_orb)) - return array - - def _get_results(self, group_prefix, n_data, orbital_symmetrize, dtype=float, stop_if_data_not_exist=True): - """ - Read results with two spin-orbital indices from HDF5 file - - Returns - ------- - numpy.ndarray of size (2*self.n_orb, 2*self.n_orb, n_data) - - """ - - data_shape = (2*self.n_orb, 2*self.n_orb, n_data) - - array = numpy.zeros(data_shape, dtype=dtype) - with HDFArchive('sim.h5', 'r') as f: - results = f["simulation"]["results"] - for i1, i2 in product(range(2*self.n_orb), repeat=2): - group = "%s_%d_%d" % (group_prefix, i1, i2) - if group in results: - array[i1, i2, :] = results[group]["mean"]["value"] - if orbital_symmetrize: # Only i1>i2 is computed in CTQMC. - array[i2, i1, :] = array[i1, i2, :] - elif stop_if_data_not_exist: - raise Exception("data does not exist in sim.h5/simulation/results/{}. alps_cthyb might be old.".format(group)) - - - # [(o1,s1), (o2,s2)] -> [o1, s1, o2, s2] -> [s1, o1, s2, o2] -> [(s1,o1), (s2,o2)] - array = array.reshape((self.n_orb, 2, self.n_orb, 2, -1))\ - .transpose((1, 0, 3, 2, 4))\ - .reshape((2*self.n_orb, 2*self.n_orb, -1)) - return array - def solve(self, rot, mpirun_command, params_kw): """ In addition to the parameters described in the docstring of SolverBase, @@ -271,11 +186,14 @@ def _read(key): return params_kw[key] else: return internal_params[key] - print (params_kw) + # print (params_kw) umat_check = umat2dd(self.u_mat) assert numpy.allclose(umat_check, self.u_mat), "Please set density_density = True when you run ALPS/cthyb-seg!" + if self.n_iw % 2 != 0: + sys.exit(f"Invalid value n_iw={self.n_iw}: Only even number is allowed for n_iw in JO/cthyb-seg solver") + # (0) Rotate H0 and Delta_tau if rot is given g0_iw_rotated = self._G0_iw.copy() if rot is None: @@ -307,7 +225,6 @@ def _read(key): index[0::2] = numpy.arange(self.n_orb) index[1::2] = numpy.arange(self.n_orb) + self.n_orb # Swap cols and rows - # H0 = (H0[:, index])[index, :] H0 = H0[numpy.ix_(index, index)] # check if H0 is diagonal @@ -334,24 +251,16 @@ def _read(key): # H0 is extracted from the tail of the Green's function. self._Delta_iw = delta(g0_iw_rotated) - # Delta_tau = make_block_gf(GfImTime, self.gf_struct, self.beta, self.n_tau) - # for name in self.block_names: - # Delta_tau[name] << Fourier(self._Delta_iw[name]) - # Delta_tau_data = to_numpy_array(Delta_tau, self.block_names) delta_iw = to_numpy_array(self._Delta_iw, self.block_names) - print(delta_iw.shape) assert delta_iw.shape == (self.n_iw * 2, self.n_orb * 2, self.n_orb * 2) delta_iw = delta_iw[self.n_iw:, :, :] # only positive frequency - print(delta_iw.shape) - if self.n_iw % 2 != 0: - sys.exit(f"Invalid value n_iw={self.n_iw}: Only even number is allowed for n_iw in JO/cthyb-seg solver") + assert delta_iw.shape == (self.n_iw, self.n_orb * 2, self.n_orb * 2) # TODO: check delta_iw # Delta_{ab}(iw) must be diagonal - print(delta_iw.shape) delta_iw_diagonal = numpy.einsum("wii->wi", delta_iw) - print(delta_iw_diagonal.shape) + assert delta_iw_diagonal.shape == (self.n_iw, self.n_orb * 2) with open('./delta.in', 'w') as f: for iw in range(self.n_iw): @@ -366,12 +275,10 @@ def _read(key): for i in range(self.n_flavors): print('{:.15e}'.format(vsq[i]), file=f) - # (1c) Set U_{ijkl} for the solver # Set up input parameters and files for ALPS/CTHYB-SEG U, Uprime, J = dcore2alpscore(u_mat_rotated) - # write_Umatrix(U, Uprime, J, self.n_orb) Udd = convert_Umatrix(U, Uprime, J, self.n_orb) assert Udd.shape == (self.n_flavors, self.n_flavors) @@ -381,7 +288,6 @@ def _read(key): print(' {:.15e}'.format(Udd[i, j].real), file=f, end="") print("", file=f) - # (1d) Set parameters for the solver params_solver = OrderedDict() @@ -431,16 +337,12 @@ def _read(key): # self._Gimp_iw data = numpy.loadtxt("self_w.dat") - print(data.shape) sigma_data = data[:, 1::2] + 1j * data[:, 2::2] - print(sigma_data.shape) assert sigma_data.shape == (self.n_iw, self.n_flavors) assign_from_numpy_array(self._Sigma_iw, sigma_data, self.block_names) data = numpy.loadtxt("Gf_w.dat") - print(data.shape) gf_data = data[:, 1::2] + 1j * data[:, 2::2] - print(gf_data.shape) assert gf_data.shape == (self.n_iw, self.n_flavors) assign_from_numpy_array(self._Gimp_iw, gf_data, self.block_names) @@ -450,7 +352,7 @@ def _read(key): # rotate_basis(rot, self.use_spin_orbit, None, self._Gimp_iw, direction='backward') # self.quant_to_save['nn_equal_time'] - # nn_equal_time = self._get_results("nn", 1, orbital_symmetrize=True, stop_if_data_not_exist=False) + # nn_equal_time = # [(s1,o1), (s2,o2), 0] # self.quant_to_save['nn_equal_time'] = nn_equal_time[:, :, 0] # copy diff --git a/src/dcore/tools.py b/src/dcore/tools.py index 3cf7b674..5ad75c9e 100644 --- a/src/dcore/tools.py +++ b/src/dcore/tools.py @@ -908,7 +908,7 @@ def expand_path(exec_path): full_path = os.path.expandvars(exec_path) # expand environment variables full_path = shutil.which(full_path) # return full path if full_path is None: - print(f"ERROR: {exec_path} does not exist. Set exec_path properly!", file=sys.stderr) + print(f"ERROR: '{exec_path}' does not exist. Set exec_path properly!", file=sys.stderr) sys.exit(1) return full_path From 9aa079c23a521edf397a0559c9efea90c213f57d Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Mon, 29 Aug 2022 17:25:30 +0900 Subject: [PATCH 46/49] Fix a bug in evaluation of tail of Delta(iw) --- src/dcore/impurity_solvers/jo_cthyb_seg.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dcore/impurity_solvers/jo_cthyb_seg.py b/src/dcore/impurity_solvers/jo_cthyb_seg.py index dbb43567..75066e41 100644 --- a/src/dcore/impurity_solvers/jo_cthyb_seg.py +++ b/src/dcore/impurity_solvers/jo_cthyb_seg.py @@ -149,9 +149,10 @@ def eval_tail(g_iw, beta, n_ave=10): assert g_iw.ndim == 2 n_iw, n_flavors = g_iw.shape - iw = (2*numpy.arange(n_iw) + 1) * numpy.pi / beta + wn = (2*numpy.arange(n_iw) + 1) * numpy.pi / beta - tails = numpy.mean(g_iw[-n_ave:, :] * iw[-n_ave:, None], axis=0).real + # average of Re[ G(iw) * iw ] + tails = numpy.mean(-g_iw[-n_ave:, :].imag * wn[-n_ave:, None], axis=0) assert tails.shape == (n_flavors,) return tails From 4cb6d36987b51c3f5e9412adf820bbdb00778296 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Tue, 30 Aug 2022 19:43:37 +0900 Subject: [PATCH 47/49] follow the change in solver interface --- src/dcore/impurity_solvers/jo_cthyb_seg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dcore/impurity_solvers/jo_cthyb_seg.py b/src/dcore/impurity_solvers/jo_cthyb_seg.py index 75066e41..8e0c9a2a 100644 --- a/src/dcore/impurity_solvers/jo_cthyb_seg.py +++ b/src/dcore/impurity_solvers/jo_cthyb_seg.py @@ -263,7 +263,7 @@ def _read(key): delta_iw_diagonal = numpy.einsum("wii->wi", delta_iw) assert delta_iw_diagonal.shape == (self.n_iw, self.n_orb * 2) - with open('./delta.in', 'w') as f: + with open('./delta_w.in', 'w') as f: for iw in range(self.n_iw): for f1 in range(self.n_flavors): val = delta_iw_diagonal[iw, f1] @@ -294,7 +294,7 @@ def _read(key): params_solver = OrderedDict() params_solver['model'] = { 'n_s' : self.n_orb*2, - 'file_Delta' : 'delta.in', + 'file_Delta_iw' : 'delta_w.in', 'file_Vsq' : 'vsq.in', 'file_U' : 'u.in', 'file_ef' : 'ef.in', From dbe5a79ea90cdb5b13146dc199e302ff08f7f751 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Thu, 1 Sep 2022 20:42:17 +0900 Subject: [PATCH 48/49] Calc total charge in calc_Gloc when fix_mu=True --- src/dcore/dcore_bse.py | 2 +- src/dcore/dcore_post.py | 2 +- src/dcore/dmft_core.py | 7 +++++-- src/dcore/sumkdft_workers/gloc_worker.py | 3 +++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/dcore/dcore_bse.py b/src/dcore/dcore_bse.py index 4e43ea9a..a9467aa9 100644 --- a/src/dcore/dcore_bse.py +++ b/src/dcore/dcore_bse.py @@ -482,7 +482,7 @@ def calc_num_flavors(_ish): print(" skip") return - Gloc_iw_sh, _ = self.calc_Gloc() + Gloc_iw_sh, _, _ = self.calc_Gloc() solver_name = self._params['impurity_solver']['name'] # generate sampling points of Matsubara frequencies diff --git a/src/dcore/dcore_post.py b/src/dcore/dcore_post.py index 220b6e11..23ef2fb9 100644 --- a/src/dcore/dcore_post.py +++ b/src/dcore/dcore_post.py @@ -134,7 +134,7 @@ def calc_Sigma_w(self, mesh): solver_name = self._params['impurity_solver']['name'] Solver = impurity_solvers.solver_classes[solver_name] if Solver.is_gf_realomega_available(): - Gloc_iw_sh, _ = self.calc_Gloc() + Gloc_iw_sh, _, _ = self.calc_Gloc() _, _, sigma_w = self.solve_impurity_models(Gloc_iw_sh, -1, mesh) return sigma_w else: diff --git a/src/dcore/dmft_core.py b/src/dcore/dmft_core.py index a663b74a..65478438 100644 --- a/src/dcore/dmft_core.py +++ b/src/dcore/dmft_core.py @@ -615,7 +615,7 @@ def calc_Gloc(self): diff = make_hermite_conjugate(g) if diff > 1e-8: print('Warning Gloc_iw at ish {} is not hermite conjugate: {}'.format(ish, diff)) - return r['Gloc_iw_sh'], r['dm_sh'] + return r['Gloc_iw_sh'], r['dm_sh'], r['total_charge'] def print_density_matrix(self, dm_sh, smoment_sh): @@ -821,7 +821,10 @@ def print_time(comment): sys.stdout.flush() # Compute Gloc_iw where the chemical potential is adjusted if needed - Gloc_iw_sh, dm_sh = self.calc_Gloc() + Gloc_iw_sh, dm_sh, total_charge = self.calc_Gloc() + print("\n Total charge : %.6f" % total_charge) + self._quant_to_save_history['total_charge'] = total_charge + smoment_sh = spin_moments_sh(dm_sh) self.print_density_matrix(dm_sh, smoment_sh) self._quant_to_save_history['density_matrix'] = dm_sh diff --git a/src/dcore/sumkdft_workers/gloc_worker.py b/src/dcore/sumkdft_workers/gloc_worker.py index a77cd6ff..35407920 100644 --- a/src/dcore/sumkdft_workers/gloc_worker.py +++ b/src/dcore/sumkdft_workers/gloc_worker.py @@ -29,6 +29,9 @@ def run(self): sys.exit("ERROR: Failed in adjusting chemical potential") if mpi.is_master_node(): results['mu'] = float(sk.chemical_potential) + results['total_charge'] = sk.density_required + else: + results['total_charge'] = sk.total_density() + sk.charge_below # Local Green's function and Density matrix Gloc = sk.extract_G_loc(with_dc=with_dc) From 9f211b4be92034defb4ffa8d7827ca5123a8b2e1 Mon Sep 17 00:00:00 2001 From: Junya Otsuki Date: Tue, 6 Sep 2022 17:55:30 +0900 Subject: [PATCH 49/49] Add a comment --- src/dcore/sumkdft_workers/gloc_worker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dcore/sumkdft_workers/gloc_worker.py b/src/dcore/sumkdft_workers/gloc_worker.py index 35407920..f551bf6c 100644 --- a/src/dcore/sumkdft_workers/gloc_worker.py +++ b/src/dcore/sumkdft_workers/gloc_worker.py @@ -26,6 +26,7 @@ def run(self): sk.calc_mu(self.params['prec_mu']) # calc_mu returns None when it failed in adjusting chemical potential if sk.chemical_potential is None: + # TODO: sys.exit is not MPI safe. replace with MPI.COMM_WORLD.Abort(1)? sys.exit("ERROR: Failed in adjusting chemical potential") if mpi.is_master_node(): results['mu'] = float(sk.chemical_potential)