Esempio n. 1
0
def hse_get_eigenval():
    num_kpt_all, num_kpt_hk = hse_get_kpt_bandnum()
    num_high_k_num, high_kpt_point = hse_get_num_high_symmetry_points("KPATH.in")
    num_remove = num_kpt_all - num_kpt_hk
    fermi = initial.get_fermiLevel()
    nbd = initial.get_NBANDS() + 2
    ispin = initial.get_ispin()
    eigenval_lines = open('EIGENVAL', 'r').read().splitlines()
    if ispin == 1:
        energy_kpt = np.zeros(shape=(num_kpt_hk, nbd - 2))
        for flag_index_k_num in range(0, num_kpt_hk):
            for flag_index_orbital in range(0, nbd-2):
                energy_kpt[flag_index_k_num][flag_index_orbital] = \
                    float(eigenval_lines[int(8 + (num_remove + flag_index_k_num) * nbd + flag_index_orbital)].split()[1])-fermi
        return energy_kpt
    elif ispin == 2:
        energy_kpt_up = np.zeros(shape=(num_kpt_hk, nbd - 2))
        energy_kpt_dw = np.zeros(shape=(num_kpt_hk, nbd - 2))
        for flag_index_k_num in range(0, num_kpt_hk):
            for flag_index_orbital in range(0, nbd-2):
                energy_kpt_up[flag_index_k_num][flag_index_orbital] = \
                    float(eigenval_lines[int(8 + (num_remove + flag_index_k_num) * nbd + flag_index_orbital)].split()[1])-fermi
                energy_kpt_dw[flag_index_k_num][flag_index_orbital] = \
                    float(eigenval_lines[int(8 + (num_remove + flag_index_k_num) * nbd + flag_index_orbital)].split()[2])-fermi
        return energy_kpt_up, energy_kpt_dw
    else:
        return "No Ispin Information Obtained !"
Esempio n. 2
0
def hse_output_band():
    bd.output_klines("KPATH.in")
    num_kpt_all, num_kpt_hk = hse_get_kpt_bandnum()
    num_high_k_num, high_kpt_point = hse_get_num_high_symmetry_points("KPATH.in")
    kpt = hse_cal_klength(hse_get_kpt_coordinate())
    num_remove = num_kpt_all - num_kpt_hk
    fermi = initial.get_fermiLevel()
    nbd = initial.get_NBANDS()
    ispin = initial.get_ispin()
    if ispin == 1:
        energy_kpt = hse_get_eigenval()
        with open("band.dat", "w", encoding='utf-8') as band:
            band.write("Band Data for HSE" + "\n")
            for k_num in range(0, num_kpt_hk):
                band.write(str(kpt[k_num])[:8].ljust(8, '0') + "  ")
                for flag_nbd in range(0, nbd):
                    band.write(str(energy_kpt[k_num][flag_nbd])[:10].ljust(10, '0') + "  ")
                band.write("\n")
        band.close()
    elif ispin ==2:
        energy_kpt_up, energy_kpt_dw = hse_get_eigenval()
        with open("band.dat", "w", encoding='utf-8') as band:
            band.write("Band Data for HSE" + "\n")
            for k_num in range(0, num_kpt_hk):
                band.write(str(kpt[k_num])[:8].ljust(8, '0') + "  ")
                for flag_nbd in range(0, nbd):
                    band.write(str(energy_kpt_up[k_num][flag_nbd])[:10].ljust(10, '0') + "  ")
                    band.write(str(energy_kpt_dw[k_num][flag_nbd])[:10].ljust(10, '0') + "  ")
                band.write("\n")
        band.close()
        print("Wait !")
    else:
        print("Wait !")
Esempio n. 3
0
def _dos_tot():
    element, num_ele = _get_element()
    doscar = open('DOSCAR', 'r')
    dos = doscar.readlines()
    line_6 = dos[5].lstrip().split()
    eng_max = float(line_6[0])
    eng_min = float(line_6[1])
    nedos = int(line_6[2])
    fermi_eng = float(line_6[3])
    print(fermi_eng)
    ispin = initial.get_ispin()
    if ispin == 1:
        with open("Tdos.dat", "w", encoding='utf-8') as tdos:
            tdos.write("Total density of state" + "\n")
            tdos.write("Energy".ljust(13, " ") + "TDOS".ljust(13, " ") +
                       "IDOS".ljust(13, " ") + "\n")
            for flag_line in range(0, nedos):
                tdos.write(
                    str(float(dos[6 + flag_line].split()[0]) -
                        fermi_eng)[:10].ljust(10, " ") + "   " +
                    str(dos[6 + flag_line].split()[1]) + "   " +
                    str(dos[6 + flag_line].split()[2]) + "\n")
        tdos.close()
    elif ispin == 2:
        with open("Tdos_SpinUp.dat", "w", encoding='utf-8') as tdos_up:
            tdos_up.write("Tdos_spinUP" + "\n")
            tdos_up.write("Energy".ljust(13, " ") + "TDOS".ljust(13, " ") +
                          "IDOS".ljust(13, " ") + "\n")
            for flag_line in range(0, nedos):
                tdos_up.write(
                    str(float(dos[6 + flag_line].split()[0]) -
                        fermi_eng)[:10].ljust(10, " ") + "   " +
                    str(dos[6 + flag_line].split()[1]) + "   " +
                    str(dos[6 + flag_line].split()[3]) + "\n")
        tdos_up.close()
        with open("Tdos_SpinDw.dat", "w", encoding='utf-8') as tdos_dw:
            tdos_dw.write("Tdos_spinDW" + "\n")
            tdos_dw.write("Energy".ljust(13, " ") + "TDOS".ljust(13, " ") +
                          "IDOS".ljust(13, " ") + "\n")
            for flag_line in range(0, nedos):
                tdos_dw.write(
                    str(float(dos[6 + flag_line].split()[0]) -
                        fermi_eng)[:10].ljust(10, " ") + "   " +
                    str("-" + dos[6 + flag_line].split()[2]) + "   " +
                    str("-" + dos[6 + flag_line].split()[4]) + "\n")
        tdos_dw.close()
    else:
        print("No ispin information obtained !")
Esempio n. 4
0
def output_band():
    output_klines()
    ispin = initial.get_ispin()
    if ispin == 1:
        num_kpt, length, high_kpt_point, kpoints = get_kpt()
        nbd = initial.get_NBANDS()
        kpt = np.transpose(np.array(kpoints))
        # kpt = kpoints.astype(np.float)
        eng = np.array(get_eigenval())
        energy = eng.reshape(nbd, num_kpt)
        # reverse the sequence
        #    rev_kpt = kpt[::-1]
        with open("band.dat", "w", encoding='utf-8') as band:
            band.write("Band Data" + "\n")
            for k_num in range(0, num_kpt):
                band.write(str(kpt[k_num])[:10].ljust(10, ' ') + "  ")
                for flag_nbd in range(0, nbd):
                    band.write(str(energy[flag_nbd][k_num])[:10].ljust(10, ' ') + "  ")
                band.write("\n")
        band.close()
    elif ispin == 2:
        num_kpt, length, high_kpt_point, kpoints = get_kpt()
        nbd = initial.get_NBANDS()
        kpt = np.transpose(np.array(kpoints))
        eng_up, eng_dw = get_eigenval()
        eig_up = np.array(eng_up)
        eig_dw = np.array(eng_dw)
        energy_up = eig_up.reshape(nbd, num_kpt)
        energy_dw = eig_dw.reshape(nbd, num_kpt)
        with open("band_up.dat", "w", encoding='utf-8') as band_up:
            band_up.write("Band Data" + "\n")
            for k_num in range(0, num_kpt):
                band_up.write(str(kpt[k_num])[:10].ljust(10, ' ') + "    ")
                for flag_nbd in range(0, nbd):
                    band_up.write(str(energy_up[flag_nbd][k_num])[:10].ljust(10, ' ') + "    ")
                band_up.write("\n")
        band_up.close()
        with open("band_dw.dat", "w", encoding='utf-8') as band_dw:
            band_dw.write("Band Data" + "\n")
            for k_num in range(0, num_kpt):
                band_dw.write(str(kpt[k_num])[:10].ljust(10, ' ') + "    ")
                for flag_nbd in range(0, nbd):
                    band_dw.write(str(energy_dw[flag_nbd][k_num])[:10].ljust(10, ' ') + "    ")
                band_dw.write("\n")
        band_dw.close()
    else:
        print("No Ispin Information Obtained !")
Esempio n. 5
0
def get_eigenval():
    num_kpt, length, high_kpt_point, kpt = get_kpt()
    fermi = initial.get_fermiLevel()
    eig = []
    eig_up = []
    eig_dw = []
    energy_kpt = []
    energy_kpt_up = []
    energy_kpt_dw = []
#    energy = []
    nbd = initial.get_NBANDS() + 2
    ispin = initial.get_ispin()
    eigenval_lines = open('EIGENVAL', 'r').read().splitlines()
    if ispin == 1:
        for flag_nbd_num in range(0, nbd-2):
            for flag_k_num in range(0, int(num_kpt)+1):
                if flag_k_num < int(num_kpt):
                    flag_orbital = 8 + flag_nbd_num + flag_k_num * nbd
                    eig = float(eigenval_lines[flag_orbital].split()[1]) - fermi
                    round(float(eig), 6)
                    energy_kpt.append(eig)
        return energy_kpt
    elif ispin == 2:
        for flag_nbd_num in range(0, nbd-2):
            for flag_k_num in range(0, int(num_kpt)+1):
                if flag_k_num < int(num_kpt):
                    flag_orbital = 8 + flag_nbd_num + flag_k_num * nbd
                    eig_up = float(eigenval_lines[flag_orbital].split()[1]) - fermi
                    eig_dw = float(eigenval_lines[flag_orbital].split()[2]) - fermi
                    round(float(eig_up), 6)
                    round(float(eig_dw), 6)
                    energy_kpt_up.append(eig_up)
                    energy_kpt_dw.append(eig_dw)
        return energy_kpt_up, energy_kpt_dw
    else:
        return "No Ispin Information Obtained !"
Esempio n. 6
0
def _dos_plot_tot(eng_range=[-10, 10, 2], integral=0):
    _dos_tot()
    ispin = initial.get_ispin()
    fig = plt.figure(figsize=(10, 6))
    ax = fig.add_subplot(111)
    if integral == 0:
        if ispin == 1:
            data = np.loadtxt("Tdos.dat", skiprows=2, dtype=float)
            plt.plot(data[:, 0], data[:, 1], ls="-", label="TDOS")
            ax.axvline(x=0,
                       ymin=0,
                       ymax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            ax.axhline(y=0,
                       xmin=0,
                       xmax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            plt.xlabel("E - " + "E$_\mathrm{{F}}$" + " (eV)",
                       fontsize=16,
                       fontname='arial')
            plt.xlim(eng_range[0], eng_range[1])
            xtick = np.arange(eng_range[0], eng_range[1] + 1, eng_range[2])
            plt.xticks(xtick)

            plt.ylabel("DOS (states/eV)", fontsize=16, fontname='arial')
            plt.yticks([])
            plt.legend(fontsize=12, loc="best")
            plt.savefig("Total_Tdos.png", dpi=300)
            plt.show()

        elif ispin == 2:
            data_up = np.loadtxt("Tdos_SpinUp.dat", skiprows=2, dtype=float)
            data_dw = np.loadtxt("Tdos_SpinDw.dat", skiprows=2, dtype=float)
            plt.plot(data_up[:, 0], data_up[:, 1], ls="-", label="TDOS_SpinUP")
            plt.plot(data_dw[:, 0], data_dw[:, 1], ls="-", label="TDOS_SpinDW")
            ax.axvline(x=0,
                       ymin=0,
                       ymax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            ax.axhline(y=0,
                       xmin=0,
                       xmax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            plt.xlabel("E - " + "E$_\mathrm{{F}}$" + " (eV)",
                       fontsize=16,
                       fontname='arial')
            plt.xlim(eng_range[0], eng_range[1])
            xtick = np.arange(eng_range[0], eng_range[1] + 1, eng_range[2])
            plt.xticks(xtick)

            plt.ylabel("DOS (states/eV)", fontsize=16, fontname='arial')
            plt.yticks([])
            plt.legend(fontsize=12, loc="best")
            plt.savefig("Total_Tdos.png", dpi=300)
            plt.show()

        else:
            print(
                "No Ispin Information Obtained !, Checking whether this path exist the INCAR file"
            )
    else:
        if ispin == 1:
            data = np.loadtxt("Tdos.dat", skiprows=2, dtype=float)
            plt.plot(data[:, 0], data[:, 1], ls="-", label="TDOS")
            plt.plot(data[:, 0], data[:, 2], ls="-", label="IDOS")
            ax.axvline(x=0,
                       ymin=0,
                       ymax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            ax.axhline(y=0,
                       xmin=0,
                       xmax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            plt.xlabel("E - " + "E$_\mathrm{{F}}$" + " (eV)",
                       fontsize=16,
                       fontname='arial')
            plt.xlim(eng_range[0], eng_range[1])
            xtick = np.arange(eng_range[0], eng_range[1] + 1, eng_range[2])
            plt.xticks(xtick)

            plt.ylabel("DOS (states/eV)", fontsize=16, fontname='arial')
            plt.yticks([])
            plt.legend(fontsize=12, loc="best")
            plt.savefig("Total_TIdos.png", dpi=300)
            plt.show()

        elif ispin == 2:
            data_up = np.loadtxt("Tdos_SpinUp.dat", skiprows=2, dtype=float)
            data_dw = np.loadtxt("Tdos_SpinDw.dat", skiprows=2, dtype=float)
            plt.plot(data_up[:, 0], data_up[:, 1], ls="-", label="TDOS_SpinUP")
            plt.plot(data_up[:, 0], data_up[:, 2], ls="-", label="IDOS_SpinUP")

            plt.plot(data_dw[:, 0], data_dw[:, 1], ls="-", label="TDOS_SpinDW")
            plt.plot(data_dw[:, 0], data_dw[:, 2], ls="-", label="IDOS_SpinDW")
            ax.axvline(x=0,
                       ymin=0,
                       ymax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            ax.axhline(y=0,
                       xmin=0,
                       xmax=1,
                       linestyle='--',
                       linewidth=1.5,
                       color='0.5')
            plt.xlabel("E - " + "E$_\mathrm{{F}}$" + " (eV)",
                       fontsize=16,
                       fontname='arial')
            plt.xlim(eng_range[0], eng_range[1])
            xtick = np.arange(eng_range[0], eng_range[1] + 1, eng_range[2])
            plt.xticks(xtick)

            plt.ylabel("DOS (states/eV)", fontsize=16, fontname='arial')
            plt.yticks([])
            plt.legend(fontsize=12, loc="best")
            plt.savefig("Total_TIdos.png", dpi=300)
            plt.show()
        else:
            print(
                "No Ispin Information Obtained !, Checking whether this path exist the INCAR file"
            )
Esempio n. 7
0
def _dos_plot_atom(eng_range=[-10, 10, 2]):
    _pdos_atom()
    orbitals_noispin = ["s", "p", "d"]
    orbitals_ispin = ["s_up", "s_dw", "p_up", "p_dw", "d_up", "d_dw"]
    ispin = initial.get_ispin()
    element, num_ele = _get_element()
    filename = [[] for i in range(0, len(element))]
    data = [[] for i in range(0, len(element))]
    for flag_atom_type in range(0, len(element)):
        filename[flag_atom_type] = "Pdos_" + element[flag_atom_type] + ".dat"
        data[flag_atom_type] = np.loadtxt(filename[flag_atom_type],
                                          skiprows=2,
                                          dtype=float)

    get_d_maxvalue = [[] for i in range(0, len(element))]
    fig = plt.figure(figsize=(10, 6))
    ax = fig.add_subplot(111)

    if ispin == 1:
        print(
            "    *************************** ISPIN is 1 ****************************"
        )
        for flag_atom_type in range(0, len(element)):
            get_d_maxvalue[flag_atom_type] = max(data[flag_atom_type][:, 3])

            if get_d_maxvalue[
                    flag_atom_type] == 0:  # if d orbitals have no values, plot the s p
                for flag_atom_orbital in range(1, 3):
                    plt.plot(
                        data[flag_atom_type][:, 0],
                        data[flag_atom_type][:, flag_atom_orbital],
                        ls="-",
                        label=str(element[flag_atom_type] + "_" +
                                  orbitals_noispin[flag_atom_orbital - 1]))
            else:
                for flag_atom_orbital in range(1, 4):
                    plt.plot(
                        data[flag_atom_type][:, 0],
                        data[flag_atom_type][:, flag_atom_orbital],
                        ls="-",
                        label=str(element[flag_atom_type] + "_" +
                                  orbitals_noispin[flag_atom_orbital - 1]))

        ax.axhline(y=0,
                   xmin=0,
                   xmax=1,
                   linestyle='--',
                   linewidth=1.5,
                   color='0.5')
        ax.axvline(x=0,
                   ymin=0,
                   ymax=1,
                   linestyle='--',
                   linewidth=1.5,
                   color='0.5')
        plt.xlabel("E - " + "E$_\mathrm{{F}}$" + " (eV)",
                   fontsize=16,
                   fontname='arial')
        plt.xlim(eng_range[0], eng_range[1])
        xtick = np.arange(eng_range[0], eng_range[1] + 1, eng_range[2])
        plt.xticks(xtick)

        plt.ylabel("DOS (states/eV)", fontsize=16, fontname='arial')
        plt.yticks([])
        plt.legend(fontsize=12, loc="best")
        plt.savefig("Pdos_atom.png", dpi=300)
        plt.show()
    elif ispin == 2:
        print(
            "    *************************** ISPIN is 2 ****************************"
        )
        for flag_atom_type in range(0, len(element)):
            get_d_maxvalue[flag_atom_type] = max(data[flag_atom_type][:, 5] +
                                                 data[flag_atom_type][:, 6])

            if get_d_maxvalue[
                    flag_atom_type] == 0:  # if d orbitals have no values, plot the s p
                for flag_atom_orbital in range(1, 5):
                    plt.plot(data[flag_atom_type][:, 0],
                             data[flag_atom_type][:, flag_atom_orbital],
                             ls="-",
                             label=str(element[flag_atom_type] + "_" +
                                       orbitals_ispin[flag_atom_orbital - 1]))
            else:
                for flag_atom_orbital in range(1, 7):
                    plt.plot(data[flag_atom_type][:, 0],
                             data[flag_atom_type][:, flag_atom_orbital],
                             ls="-",
                             label=str(element[flag_atom_type] + "_" +
                                       orbitals_ispin[flag_atom_orbital - 1]))

        ax.axhline(y=0,
                   xmin=0,
                   xmax=1,
                   linestyle='--',
                   linewidth=1.5,
                   color='0.5')
        ax.axvline(x=0,
                   ymin=0,
                   ymax=1,
                   linestyle='--',
                   linewidth=1.5,
                   color='0.5')
        plt.xlabel("E - " + "E$_\mathrm{{F}}$" + " (eV)",
                   fontsize=16,
                   fontname='arial')
        plt.xlim(eng_range[0], eng_range[1])
        xtick = np.arange(eng_range[0], eng_range[1] + 1, eng_range[2])
        plt.xticks(xtick)

        plt.ylabel("DOS (states/eV)", fontsize=16, fontname='arial')
        plt.yticks([])
        plt.legend(fontsize=12, loc="best")
        plt.savefig("Pdos_atom.png", dpi=300)
        plt.show()

    else:
        print(
            "No Ispin Information Obtained !, Checking whether this path exist the INCAR file"
        )
Esempio n. 8
0
def _pdos_atom():
    element, num_ele = _get_element()
    doscar = open('DOSCAR', 'r')
    dos = doscar.readlines()
    line_6 = dos[5].lstrip().split()
    eng_max = float(line_6[0])
    eng_min = float(line_6[1])
    nedos = int(line_6[2])
    fermi_eng = float(line_6[3])
    ispin = initial.get_ispin()
    if ispin == 1:
        judge_f = dos[nedos + 7]  # judge whether have the f orbitals.
        if len(judge_f.split()) > 20:
            print(
                "Exist f orbital, This script can't manipulate the f orbital !"
            )
        else:
            len_all_atoms = 0
            for atom_type in range(0, len(element)):
                len_all_atoms += num_ele[atom_type]
            data_dos_storage = np.zeros(shape=(len_all_atoms, nedos, 9))
            data_dos_storage_x = np.zeros(shape=(nedos))
            for flag_x in range(0, nedos):
                data_dos_storage_x[flag_x] = dos[6 + flag_x].split()[0]

            for atom_num in range(0, len_all_atoms):
                for flag_nedos in range(0, nedos):
                    for atom_orbital in range(1, 10):
                        data_dos_storage[atom_num][flag_nedos][atom_orbital-1] = \
                        dos[flag_nedos + (nedos + 1) * (atom_num + 1) + 6].split()[atom_orbital]

            data_dos_storage_orbitals = np.zeros(shape=(len(element), nedos,
                                                        9))
            num_flag_up = 0
            for flag_data_orbitals in range(0, len(element)):
                data_dos_storage_orbitals[flag_data_orbitals] = np.sum(
                    data_dos_storage[num_flag_up:num_flag_up +
                                     num_ele[flag_data_orbitals]],
                    axis=0)
                num_flag_up += num_ele[flag_data_orbitals]

            data_dos_storage_orbitals_tot = np.zeros(shape=(len(element),
                                                            nedos, 3))
            for flag_dos_tot in range(0, len(element)):
                data_dos_storage_orbitals_tot[flag_dos_tot, :,
                                              0] = data_dos_storage_orbitals[
                                                  flag_dos_tot, :, 0]
                data_dos_storage_orbitals_tot[flag_dos_tot, :, 1] = data_dos_storage_orbitals[
                                                                           flag_dos_tot, :,
                                                                           1] + data_dos_storage_orbitals[
                                                                                flag_dos_tot, :, 2] + \
                                                                           data_dos_storage_orbitals[
                                                                           flag_dos_tot, :, 3]
                data_dos_storage_orbitals_tot[flag_dos_tot, :, 2] = data_dos_storage_orbitals[
                                                                           flag_dos_tot, :,
                                                                           4] + data_dos_storage_orbitals[
                                                                                flag_dos_tot, :, 5] + \
                                                                           data_dos_storage_orbitals[
                                                                           flag_dos_tot, :,
                                                                           6] + data_dos_storage_orbitals[
                                                                                flag_dos_tot, :,
                                                                                7] + data_dos_storage_orbitals[
                                                                                     flag_dos_tot, :, 8]

            data_dos_storage_orbitals_tot = np.around(
                data_dos_storage_orbitals_tot, decimals=6)
        for ele in range(0, len(element)):
            with open("Pdos_" + str(element[ele]) + ".dat",
                      "w",
                      encoding='utf-8') as pdos:
                pdos.write("Pdos_" + str(element[ele]) + "\n")
                pdos.write("Energy   s   p   d" + "\n")
                for flag_line in range(0, nedos):
                    pdos.write(
                        str(
                            np.round(data_dos_storage_x[flag_line] -
                                     fermi_eng, 8))[0:8].ljust(8, ' ') + "   ")
                    for flag_data_orbitals in range(0, 3):
                        pdos.write(
                            str(data_dos_storage_orbitals_tot[ele][flag_line]
                                [flag_data_orbitals]).ljust(8, " ") + "   ")
                    pdos.write("\n")
            pdos.close()
    elif ispin == 2:
        judge_f = dos[nedos + 7]  # judge whether have the f orbitals.
        if len(judge_f.split()) > 20:
            print(
                "Exist f orbital, This script can't manipulate the f orbital !"
            )
        else:
            len_all_atoms = 0
            for atom_type in range(0, len(element)):
                len_all_atoms += num_ele[atom_type]
            data_dos_storage_spinUP = np.zeros(shape=(len_all_atoms, nedos, 9))
            data_dos_storage_spinDW = np.zeros(shape=(len_all_atoms, nedos, 9))
            data_dos_storage_x = np.zeros(shape=(nedos))
            for flag_x in range(0, nedos):
                data_dos_storage_x[flag_x] = dos[6 + flag_x].split()[0]

            for atom_num in range(0, len_all_atoms):
                for flag_nedos in range(0, nedos):
                    for atom_orbital in range(1, 19, 2):
                        data_dos_storage_spinUP[atom_num][flag_nedos][int(
                            (atom_orbital - 1) /
                            2)] = dos[flag_nedos + (nedos + 1) *
                                      (atom_num + 1) + 6].split()[atom_orbital]
                    for atom_orbital in range(2, 19, 2):
                        data_dos_storage_spinDW[atom_num][flag_nedos][int(
                            atom_orbital / 2 -
                            1)] = dos[flag_nedos + (nedos + 1) *
                                      (atom_num + 1) + 6].split()[atom_orbital]

            data_dos_storage_orbitals_spinUP = np.zeros(shape=(len(element),
                                                               nedos, 9))
            data_dos_storage_orbitals_spinDW = np.zeros(shape=(len(element),
                                                               nedos, 9))
            num_flag_up = 0
            for flag_data_orbitals in range(0, len(element)):
                data_dos_storage_orbitals_spinUP[flag_data_orbitals] = np.sum(
                    data_dos_storage_spinUP[num_flag_up:num_flag_up +
                                            num_ele[flag_data_orbitals]],
                    axis=0)
                num_flag_up += num_ele[flag_data_orbitals]
            num_flag_dw = 0
            for flag_data_orbitals in range(0, len(element)):
                data_dos_storage_orbitals_spinDW[flag_data_orbitals] = np.sum(
                    data_dos_storage_spinDW[num_flag_dw:num_flag_dw +
                                            num_ele[flag_data_orbitals]],
                    axis=0)
                num_flag_dw += num_ele[flag_data_orbitals]

            data_dos_storage_orbitals_spinUP_tot = np.zeros(
                shape=(len(element), nedos, 3))
            data_dos_storage_orbitals_spinDW_tot = np.zeros(
                shape=(len(element), nedos, 3))
            for flag_dos_tot in range(0, len(element)):
                data_dos_storage_orbitals_spinUP_tot[
                    flag_dos_tot, :,
                    0] = data_dos_storage_orbitals_spinUP[flag_dos_tot, :, 0]
                data_dos_storage_orbitals_spinUP_tot[flag_dos_tot, :, 1] = data_dos_storage_orbitals_spinUP[
                                                                           flag_dos_tot, :, 1] + data_dos_storage_orbitals_spinUP[flag_dos_tot, :, 2] + \
                                                                           data_dos_storage_orbitals_spinUP[flag_dos_tot, :, 3]
                data_dos_storage_orbitals_spinUP_tot[flag_dos_tot, :, 2] = data_dos_storage_orbitals_spinUP[
                                                                           flag_dos_tot, :, 4] + data_dos_storage_orbitals_spinUP[flag_dos_tot, :, 5] + \
                                                                           data_dos_storage_orbitals_spinUP[flag_dos_tot, :, 6] + data_dos_storage_orbitals_spinUP[flag_dos_tot, :, 7] + data_dos_storage_orbitals_spinUP[flag_dos_tot, :, 8]
                data_dos_storage_orbitals_spinDW_tot[
                    flag_dos_tot, :,
                    0] = data_dos_storage_orbitals_spinDW[flag_dos_tot, :, 0]
                data_dos_storage_orbitals_spinDW_tot[flag_dos_tot, :, 1] = data_dos_storage_orbitals_spinDW[
                                                                           flag_dos_tot, :, 1] + data_dos_storage_orbitals_spinDW[flag_dos_tot, :, 2] + \
                                                                           data_dos_storage_orbitals_spinDW[flag_dos_tot, :, 3]
                data_dos_storage_orbitals_spinDW_tot[flag_dos_tot, :, 2] = data_dos_storage_orbitals_spinDW[
                                                                           flag_dos_tot, :, 4] + data_dos_storage_orbitals_spinDW[flag_dos_tot, :, 5] + \
                                                                           data_dos_storage_orbitals_spinDW[flag_dos_tot, :, 6] + data_dos_storage_orbitals_spinDW[flag_dos_tot, :, 7] + data_dos_storage_orbitals_spinDW[flag_dos_tot, :, 8]

            data_dos_storage_orbitals_spinUP_tot = np.around(
                data_dos_storage_orbitals_spinUP_tot, decimals=6)
            data_dos_storage_orbitals_spinDW_tot = np.around(
                data_dos_storage_orbitals_spinDW_tot, decimals=6)
        for ele in range(0, len(element)):
            with open("Pdos_" + str(element[ele]) + ".dat",
                      "w",
                      encoding='utf-8') as pdos:
                pdos.write("Pdos_" + str(element[ele]) + "\n")
                pdos.write("Energy  s_up  s_dw  p_up  p_dw  d_up  d_dw" + "\n")
                for flag_line in range(0, nedos):
                    pdos.write(
                        str(
                            np.round(data_dos_storage_x[flag_line] -
                                     fermi_eng, 8))[0:8].ljust(8, ' ') + "   ")
                    for flag_data_orbitals in range(0, 3):
                        pdos.write(
                            str(data_dos_storage_orbitals_spinUP_tot[ele]
                                [flag_line][flag_data_orbitals]).ljust(8, " ")
                            + "   ")
                        pdos.write(
                            str(-data_dos_storage_orbitals_spinDW_tot[ele]
                                [flag_line][flag_data_orbitals]).ljust(8, " ")
                            + "   ")
                    pdos.write("\n")
            pdos.close()
    else:
        print(
            "Can't read the ISPIN information, check whether have INCAR file or not !"
        )
Esempio n. 9
0
def _pdos_atom_orbital():
    element, num_ele = _get_element()
    doscar = open('DOSCAR', 'r')
    dos = doscar.readlines()
    line_6 = dos[5].lstrip().split()
    eng_max = float(line_6[0])
    eng_min = float(line_6[1])
    nedos = int(line_6[2])
    fermi_eng = float(line_6[3])
    ispin = initial.get_ispin()
    if ispin == 1:
        judge_f = dos[nedos + 7]  # judge whether have the f orbitals.
        if len(judge_f.split()) > 10:
            print(
                "Exist f orbital, This script can't manipulate the f orbital !"
            )
        else:
            len_all_atoms = 0
            for atom_type in range(0, len(element)):
                len_all_atoms += num_ele[atom_type]
            data_dos_storage = np.zeros(shape=(len_all_atoms, nedos, 9))
            data_dos_storage_x = np.zeros(shape=(nedos))
            for flag_x in range(0, nedos):
                data_dos_storage_x[flag_x] = dos[6 + flag_x].split()[0]

            for atom_num in range(0, len_all_atoms):
                for flag_nedos in range(0, nedos):
                    for atom_orbital in range(1, 10):
                        data_dos_storage[atom_num][flag_nedos][
                            atom_orbital - 1] = dos[flag_nedos + (nedos + 1) *
                                                    (atom_num + 1) +
                                                    6].split()[atom_orbital]
            data_dos_storage_orbitals = np.zeros(shape=(len(element), nedos,
                                                        9))
            num_flag = 0
            for flag_data_orbitals in range(0, len(element)):
                data_dos_storage_orbitals[flag_data_orbitals] = np.sum(
                    data_dos_storage[num_flag:num_flag +
                                     num_ele[flag_data_orbitals]],
                    axis=0)
                num_flag += num_ele[flag_data_orbitals]
            np.set_printoptions(precision=4)
            data_dos_storage_orbitals = np.around(data_dos_storage_orbitals,
                                                  decimals=6)
        for ele in range(0, len(element)):
            with open("Pdos_" + str(element[ele]) + ".dat",
                      "w",
                      encoding='utf-8') as pdos:
                pdos.write("Pdos_" + str(element[ele]) + "\n")
                pdos.write("Energy  s  py  pz  px  dxy  dyz  dz2  dxz  dx2" +
                           "\n")
                for flag_line in range(0, nedos):
                    pdos.write(
                        str(
                            np.round(data_dos_storage_x[flag_line] -
                                     fermi_eng, 8)).ljust(8, ' ') + "   ")
                    for flag_data_orbitals in range(0, 9):
                        pdos.write(
                            str(data_dos_storage_orbitals[ele][flag_line]
                                [flag_data_orbitals]).ljust(8, " ") + "   ")
                    pdos.write("\n")
            pdos.close()

    elif ispin == 2:
        judge_f = dos[nedos + 7]  # judge whether have the f orbitals.
        if len(judge_f.split()) > 20:
            print(
                "Exist f orbital, This script can't manipulate the f orbital !"
            )
        else:
            len_all_atoms = 0
            for atom_type in range(0, len(element)):
                len_all_atoms += num_ele[atom_type]
            data_dos_storage_spinUP = np.zeros(shape=(len_all_atoms, nedos, 9))
            data_dos_storage_spinDW = np.zeros(shape=(len_all_atoms, nedos, 9))
            data_dos_storage_x = np.zeros(shape=(nedos))
            for flag_x in range(0, nedos):
                data_dos_storage_x[flag_x] = dos[6 + flag_x].split()[0]
            print(len(dos[6010].split()))
            for atom_num in range(0, len_all_atoms):
                for flag_nedos in range(0, nedos):
                    for atom_orbital in range(1, 19, 2):
                        data_dos_storage_spinUP[atom_num][flag_nedos][int(
                            (atom_orbital - 1) /
                            2)] = dos[flag_nedos + (nedos + 1) *
                                      (atom_num + 1) + 6].split()[atom_orbital]
                    for atom_orbital in range(2, 19, 2):
                        data_dos_storage_spinDW[atom_num][flag_nedos][int(
                            atom_orbital / 2 -
                            1)] = dos[flag_nedos + (nedos + 1) *
                                      (atom_num + 1) + 6].split()[atom_orbital]

            data_dos_storage_orbitals_spinUP = np.zeros(shape=(len(element),
                                                               nedos, 9))
            data_dos_storage_orbitals_spinDW = np.zeros(shape=(len(element),
                                                               nedos, 9))
            num_flag = 0
            for flag_data_orbitals in range(0, len(element)):
                data_dos_storage_orbitals_spinUP[flag_data_orbitals] = np.sum(
                    data_dos_storage_spinUP[num_flag:num_flag +
                                            num_ele[flag_data_orbitals]],
                    axis=0)
                num_flag += num_ele[flag_data_orbitals]
            num_flag = 0
            for flag_data_orbitals in range(0, len(element)):
                data_dos_storage_orbitals_spinDW[flag_data_orbitals] = np.sum(
                    data_dos_storage_spinDW[num_flag:num_flag +
                                            num_ele[flag_data_orbitals]],
                    axis=0)
                num_flag += num_ele[flag_data_orbitals]

            np.set_printoptions(precision=4)
            data_dos_storage_orbitals_spinUP = np.around(
                data_dos_storage_orbitals_spinUP, decimals=6)
            data_dos_storage_orbitals_spinDW = np.around(
                data_dos_storage_orbitals_spinDW, decimals=6)
        for ele in range(0, len(element)):
            with open("Pdos_" + str(element[ele]) + ".dat",
                      "w",
                      encoding='utf-8') as pdos:
                pdos.write("Pdos_" + str(element[ele]) + "\n")
                pdos.write(
                    "Energy  s_up  s_dw  py_up  py_dw  pz_up  pz_dw  px_up  px_dw  dxy_up  dxy_dw  dyz_up  dyz_dw  dz2_up  dz2_dw  dxz_up  dxz_dw  dx2_up  dx2_dw"
                    + "\n")
                for flag_line in range(0, nedos):
                    pdos.write(
                        str(
                            np.round(data_dos_storage_x[flag_line] -
                                     fermi_eng, 8))[0:8].ljust(8, ' ') + "   ")
                    for flag_data_orbitals in range(0, 9):
                        pdos.write(
                            str(data_dos_storage_orbitals_spinUP[ele]
                                [flag_line][flag_data_orbitals]).ljust(8, " ")
                            + "   ")
                        pdos.write(
                            str(-data_dos_storage_orbitals_spinDW[ele]
                                [flag_line][flag_data_orbitals]).ljust(8, " ")
                            + "   ")
                    pdos.write("\n")
            pdos.close()
Esempio n. 10
0
def manipulate_bandplot():
    print("    ****************************************************************")
    print("    *This is a code used to plot kinds of band structure,written by*")
    print("    *                          XY Ding                             *")
    print("    ****************************************************************")
    print("\n")
    print("                       (^o^)GOOD LUCK!(^o^)                         ")
    print("\n")
    ispin = initial.get_ispin()
    if ispin == 1:
        print("    *************************** ISPIN is 1 ****************************")
        print("(1) energy range")
        print("(2) color")
        print("(3) Use default setting")
        inint = int(input("Input number:"))
        if inint == 1:
            energy = []
            min_energy = float(input("minimum energy:"))
            max_energy = float(input("maximum energy:"))
            scale_energy = float(input("energy scale:"))
            energy = [min_energy, max_energy, scale_energy]
            print("(1) continue to setting color")
            print("(2) end setting")
            con_end = int(input("Input number:"))
            if con_end == 1:
                color = str(input("which color do you want:"))
                bandplot(energy, color)
            else:
                bandplot(energy, "black")
        elif inint == 2:
            color = str(input("which color do you want:"))
            print("(1) continue to setting energy range")
            print("(2) end setting")
            con_end = int(input("Input number:"))
            if con_end == 1:
                min_energy = float(input("minimum energy:"))
                max_energy = float(input("maximum energy:"))
                scale_energy = float(input("energy scale:"))
                energy = [min_energy, max_energy, scale_energy]
                bandplot(energy, color)
            else:
                bandplot([-10, 6, 2], color)
        else:
            bandplot([-10, 6, 2], "black")
    elif ispin == 2:
        print("    *************************** ISPIN is 2 ****************************")
        print("(1) energy range")
        print("(2) color")
        print("(3) Use default setting")
        inint = int(input("Input number:"))
        if inint == 1:
            energy = []
            min_energy = float(input("minimum energy:"))
            max_energy = float(input("maximum energy:"))
            scale_energy = float(input("energy scale:"))
            energy = [min_energy, max_energy, scale_energy]
            print("(1) continue to setting color")
            print("(2) end setting")
            con_end = int(input("Input number:"))
            if con_end == 1:
                color_up = str(input("color for Spin_UP:"))
                color_dw = str(input("color for Spin_DW:"))
                bandplot(energy, color_up, color_dw)
            else:
                bandplot(energy, "black", "red")
        elif inint == 2:
            color_up = str(input("color for Spin_UP:"))
            color_dw = str(input("color for Spin_DW:"))
            print("(1) continue to setting energy range")
            print("(2) end setting")
            con_end = int(input("Input number:"))
            if con_end == 1:
                min_energy = float(input("minimum energy:"))
                max_energy = float(input("maximum energy:"))
                scale_energy = float(input("energy scale:"))
                energy = [min_energy, max_energy, scale_energy]
                bandplot(energy, color_up, color_dw)
            else:
                bandplot([-10, 6, 2], color_up, color_dw)
        else:
            bandplot([-10, 6, 2], "black", "red")
    else:
        print("    ******************** ISPIN is not 1 or 2!  Good bye ! ********************")
Esempio n. 11
0
def bandplot(eng_r = [-10, 6, 2], color_noispin = "black", color_ispin = "red"):
    output_band()
    ispin = initial.get_ispin()
    if ispin == 1:
        num_kpt, length, high_kpt_point, kpoints = get_kpt()
        nbd = initial.get_NBANDS()
        banddata = np.loadtxt("band.dat", skiprows=1, dtype=np.float64)
        kpt = banddata[:, 0]
        len_high_k = 0
        for j in range(0, len(length) - 1):
            length[j] = length[j] + len_high_k
            len_high_k = length[j]
        fig, ax = plt.subplots()
        for i in range(1, nbd + 1):
            plt.plot(kpt, banddata[:, i], color=color_noispin)
        plt.xlim(0, max(length))
        x_group_label = []
        x_start = 0
        x_group_label.append(x_start)
        for k in range(0, len(length) - 1):
            x_group_label.append(length[k])
        plt.xticks(x_group_label)
        ax.set_xticklabels(high_kpt_point, rotation=0, fontsize=12, fontname='arial')
        # plt.yticks(eng_r[0], eng_r[1], eng_r[2])
        plt.ylim(eng_r[0], eng_r[1])
        plt.ylabel("E - " + "E$_\mathrm{{F}}$" + " (eV)", fontsize=14, fontname='arial')
        ytick = np.arange(eng_r[0], eng_r[1] + 1, eng_r[2])
        a = int(len(ytick) / 2)
        plt.yticks(np.insert(ytick, a, 0), fontsize=12, )

        ax.axhline(y=0, xmin=0, xmax=1, linestyle='--', linewidth=0.5, color='0.5')
        for i in length[0:-1]:
            ax.axvline(x=i, ymin=0, ymax=1, linestyle='--', linewidth=0.5, color='0.5')
        plt.savefig("band.png", dpi=300)
        plt.show()
    elif ispin == 2:
        num_kpt, length, high_kpt_point, kpoints = get_kpt()
        nbd = initial.get_NBANDS()
        banddata_up = np.loadtxt("band_up.dat", skiprows=1, dtype=np.float64)
        banddata_dw = np.loadtxt("band_dw.dat", skiprows=1, dtype=np.float64)
        kpt = banddata_up[:, 0]
        len_high_k = 0
        for j in range(0, len(length) - 1):
            length[j] = length[j] + len_high_k
            len_high_k = length[j]
        fig, ax = plt.subplots()
        for i in range(1, nbd + 1):
            plt.plot(kpt, banddata_up[:, i], color=color_noispin)
            plt.plot(kpt, banddata_dw[:, i], color=color_ispin)
        plt.xlim(0, max(length))
        ax.legend(("Spin_UP", "Spin_DW"), loc='best')
        x_group_label = []
        x_start = 0
        x_group_label.append(x_start)
        for k in range(0, len(length) - 1):
            x_group_label.append(length[k])
        plt.xticks(x_group_label)
        ax.set_xticklabels(high_kpt_point, rotation=0, fontsize=12, fontname='arial')
        # plt.yticks(eng_r[0], eng_r[1], eng_r[2])
        plt.ylim(eng_r[0], eng_r[1])
        plt.ylabel("E - " + "E$_\mathrm{{F}}$" + " (eV)", fontsize=14, fontname='arial')
        ytick = np.arange(eng_r[0], eng_r[1] + 1, eng_r[2])
        a = int(len(ytick) / 2)
        plt.yticks(np.insert(ytick, a, 0), fontsize=12, )

        ax.axhline(y=0, xmin=0, xmax=1, linestyle='--', linewidth=0.5, color='0.5')
        for i in length[0:-1]:
            ax.axvline(x=i, ymin=0, ymax=1, linestyle='--', linewidth=0.5, color='0.5')
        plt.savefig("band.png", dpi=300)
        plt.show()
    else:
        print("No Ispin Information Obtained !")