示例#1
0
def md_voldep(cutoff, wo_fit, vrange):
    """
    md 計算の体積依存性を plot する
    """
    path = "voldep/*/OSZICAR"
    dir_list = [os.path.dirname(x) for x in glob.glob(path)]
    average = []

    sb_dark = seaborn.dark_palette("skyblue", 10, reverse=True)
    # sb_dark = seaborn.dark_palette("seagreen", 10, reverse=True)
    # sb_dark = seaborn.dark_palette("purple", 10, reverse=True)
    seaborn.set(palette=sb_dark)
    fig, axes = pylab.subplots(2, 1, figsize=(5, 10))

    for dirc in dir_list:
        with open(os.path.join(dirc, 'OUTCAR')) as wfile:
            lines = wfile.readlines()
        meta = re.compile(r".*external pressure = \s*(.*)\s+kB.+")
        pressure = []
        for line in lines:
            match = meta.match(line)
            if match:
                pressure.append(float(match.group(1)))

        with open(os.path.join(dirc, 'OSZICAR')) as wfile:
            lines = wfile.readlines()
        meta = re.compile(r".+T=\s*(.*)\s+E=\s*(.*)\s+F=.+")
        energy = []
        for line in lines:
            match = meta.match(line)
            if match:
                energy.append(float(match.group(2)))
        data = [{'energy':e, 'pressure':p} for e, p in zip(energy, pressure)]
        dbox = DataBox(data)
        volume = float(dirc.split('_')[1])
        press_ave = dbox['pressure'][cutoff:].mean()
        energy_ave = dbox['energy'][cutoff:].mean()
        average.append({'volume':volume, 'p': press_ave, 'e': energy_ave})
        label = "V={0:.0f}".format(float(dirc.split("_")[-1]))
        seaborn.distplot(dbox['pressure'][cutoff:], label=label, ax=axes[0])

    axes[0].legend(loc='upper left')
    axes[0].set_ylabel("Frequency")
    axes[0].set_xlabel("Pressuer (kbar)")
    average_data = DataBox(average)
    average_data.sorted('volume')
    if vrange != (0, 0):
        average_data = average_data.trim_data_within_range('volume', vrange)
    axes[1].plot(average_data['volume'],
                 average_data['p'], 'p', color=sb_dark[-1])
    axes[1].set_ylabel(r"Pressuer (kbar)")
    axes[1].set_xlabel(r"Volume ($\AA^3$)")
    fig.subplots_adjust(left=0.20)
    if not wo_fit:
        xi, yi = FitData.Stineman_interp_fit(average_data['volume'],
                                             average_data['p'])
        axes[1].plot(xi, yi)
        idx = np.abs(yi).argmin()
        print("v0: {0}, p0: {1}".format(xi[idx], yi[idx]))
        print("v0**(1/3): {0}".format(xi[idx]**(1/3)))
        axes[1].plot(xi[idx], yi[idx], 'o')
    pylab.savefig("pressure.eps")