Exemple #1
0
    def run(self, verbose=False):
        if verbose:
            print ("#%11s" + "%14s"*4) % ("T", "E_0", "B_0", "B'_0", "V_0")

        for i in range(self._max_t_index + 2):
            t = self._temperatures[i]
            fe = []
            for j, e in enumerate(self._electronic_energies):
                fe.append(e + self._fe_phonon[i][j])
            self._free_energies.append(fe)
    
            ee, eb, ebp, ev = fit_to_eos(self._volumes, fe, self._eos)
            ep = [ee, eb, ebp, ev]
            self._equiv_volumes.append(ev)
            self._equiv_energies.append(ee)
            self._equiv_bulk_modulus.append(eb * EVAngstromToGPa)
            self._equiv_parameters.append(ep)

            if verbose:
                print "%14.6f"*5 % (t,
                                    ep[0],
                                    ep[1] * EVAngstromToGPa,
                                    ep[2],
                                    ep[3])

        self._set_volume_expansion()
        self._set_thermal_expansion() # len = len(t) - 1
        self._set_heat_capacity_P_numerical() # len = len(t) - 2
        self._set_heat_capacity_P_polyfit()
        self._set_gruneisen_parameter() # To be run after thermal expansion.
Exemple #2
0
    def run(self, verbose=False):
        if verbose:
            print(("#%11s" + "%14s" * 4) % ("T", "E_0", "B_0", "B'_0", "V_0"))

        max_t_index = self._get_max_t_index(self._all_temperatures)

        for i in range(max_t_index + 2):
            t = self._all_temperatures[i]
            fe = []
            for j, e in enumerate(self._electronic_energies):
                fe.append(e + self._fe_phonon[i][j])
            self._free_energies.append(fe)

            ee, eb, ebp, ev = fit_to_eos(self._volumes, fe, self._eos)
            if ee is None:
                continue
            else:
                ep = [ee, eb, ebp, ev]
                self._temperatures.append(t)
                self._equiv_volumes.append(ev)
                self._equiv_energies.append(ee)
                self._equiv_bulk_modulus.append(eb * EVAngstromToGPa)
                self._equiv_parameters.append(ep)

                if verbose:
                    print(("%14.6f" * 5) %
                          (t, ep[0], ep[1] * EVAngstromToGPa, ep[2], ep[3]))

        self._max_t_index = self._get_max_t_index(self._temperatures)
        self._set_volume_expansion()
        self._set_thermal_expansion()  # len = len(t) - 1
        self._set_heat_capacity_P_numerical()  # len = len(t) - 2
        self._set_heat_capacity_P_polyfit()
        self._set_gruneisen_parameter()  # To be run after thermal expansion.
Exemple #3
0
 def __init__(self, volumes, electronic_energies, eos="vinet"):
     self._volumes = volumes
     self._electronic_energies = electronic_energies
     self._eos = get_eos(eos)
     (self._energy, self._bulk_modulus, self._b_prime, self._volume) = fit_to_eos(
         volumes, electronic_energies, self._eos
     )
Exemple #4
0
    def __init__(self,
                 volumes,
                 electronic_energies,
                 eos='vinet'):
        self._volumes = volumes
        if np.array(electronic_energies).ndim == 1:
            self._electronic_energies = electronic_energies
        else:
            self._electronic_energies = electronic_energies[0]
        self._eos = get_eos(eos)

        self._energy = None
        self._bulk_modulus = None
        self._b_prime = None

        try:
            (self._energy,
             self._bulk_modulus,
             self._b_prime,
             self._volume) = fit_to_eos(volumes,
                                        self._electronic_energies,
                                        self._eos)
        except TypeError:
            msg = ["Failed to fit to \"%s\" equation of states." % eos]
            if len(volumes) < 4:
                msg += ["At least 4 volume points are needed for the fitting."]
            msg += ["Careful choice of volume points is recommended."]
            raise RuntimeError("\n".join(msg))
Exemple #5
0
    def __init__(self, volumes, electronic_energies, eos='vinet'):
        self._volumes = volumes
        if electronic_energies.ndim == 1:
            self._electronic_energies = electronic_energies
        else:
            self._electronic_energies = electronic_energies[0]
        self._eos = get_eos(eos)

        (self._energy, self._bulk_modulus, self._b_prime,
         self._volume) = fit_to_eos(volumes, self._electronic_energies,
                                    self._eos)
Exemple #6
0
    def __init__(self, volumes, electronic_energies, eos='vinet'):
        self._volumes = volumes
        if np.array(electronic_energies).ndim == 1:
            self._electronic_energies = electronic_energies
        else:
            self._electronic_energies = electronic_energies[0]
        self._eos = get_eos(eos)

        self._energy = None
        self._bulk_modulus = None
        self._b_prime = None

        try:
            (self._energy, self._bulk_modulus, self._b_prime,
             self._volume) = fit_to_eos(volumes, self._electronic_energies,
                                        self._eos)
        except TypeError:
            msg = ["Failed to fit to \"%s\" equation of states." % eos]
            if len(volumes) < 4:
                msg += ["At least 4 volume points are needed for the fitting."]
            msg += ["Careful choice of volume points is recommended."]
            raise RuntimeError("\n".join(msg))
Exemple #7
0
    def __init__(self, volumes, energies, eos="vinet"):
        """Init method.

        volumes : array_like
            Unit cell volumes where energies are obtained.
            shape=(volumes, ), dtype='double'.
        energies : array_like
            Energies obtained at volumes.
            shape=(volumes, ), dtype='double'.
        eos : str
            Identifier of equation of states function.

        """
        self._volumes = volumes
        if np.array(energies).ndim == 1:
            self._energies = energies
        else:
            self._energies = energies[0]
        self._eos = get_eos(eos)

        self._energy = None
        self._bulk_modulus = None
        self._b_prime = None

        try:
            (
                self._energy,
                self._bulk_modulus,
                self._b_prime,
                self._volume,
            ) = fit_to_eos(volumes, self._energies, self._eos)
        except TypeError:
            msg = ['Failed to fit to "%s" equation of states.' % eos]
            if len(volumes) < 4:
                msg += ["At least 4 volume points are needed for the fitting."]
            msg += ["Careful choice of volume points is recommended."]
            raise RuntimeError("\n".join(msg))
Exemple #8
0
    def run(self, verbose=False):
        """Fit parameters to EOS at temperatures

        Even if fitting failed, simply omit the volume point. In this case,
        the failed temperature point doesn't exist in the returned arrays.

        """

        if verbose:
            print(("#%11s" + "%14s" * 4) % ("T", "E_0", "B_0", "B'_0", "V_0"))

        # Plus one temperature point is necessary for computing e.g. beta.
        num_elems = self._get_num_elems(self._all_temperatures) + 1
        if num_elems > len(self._all_temperatures):
            num_elems -= 1

        temperatures = []
        parameters = []
        free_energies = []

        for i in range(num_elems):  # loop over temperaturs
            if self._electronic_energies.ndim == 1:
                el_energy = self._electronic_energies
            else:
                el_energy = self._electronic_energies[i]
            fe = [
                ph_e + el_e
                for ph_e, el_e in zip(self._fe_phonon[i], el_energy)
            ]

            try:
                ep = fit_to_eos(self._volumes, fe, self._eos)
            except TypeError:
                print("Fitting failure at T=%.1f" % self._all_temperatures[i])

            if ep is None:
                # Simply omit volume point where the fitting failed.
                continue
            else:
                [ee, eb, ebp, ev] = ep
                t = self._all_temperatures[i]
                temperatures.append(t)
                parameters.append(ep)
                free_energies.append(fe)

                if verbose:
                    print(("%14.6f" * 5) %
                          (t, ep[0], ep[1] * EVAngstromToGPa, ep[2], ep[3]))

        self._free_energies = np.array(free_energies)
        self._temperatures = np.array(temperatures)
        self._equiv_parameters = np.array(parameters)
        self._equiv_volumes = np.array(self._equiv_parameters[:, 3])
        self._equiv_energies = np.array(self._equiv_parameters[:, 0])
        self._equiv_bulk_modulus = np.array(self._equiv_parameters[:, 1] *
                                            EVAngstromToGPa)

        self._num_elems = len(self._temperatures)

        # For computing following values at temperatures, finite difference
        # method is used. Therefore number of temperature points are needed
        # larger than self._num_elems that nearly equals to the temparature
        # point we expect.
        self._set_thermal_expansion()
        self._set_heat_capacity_P_numerical()
        self._set_heat_capacity_P_polyfit()
        self._set_gruneisen_parameter()  # To be run after thermal expansion.

        self._len = len(self._thermal_expansions)
        assert (self._len + 1 == self._num_elems)
Exemple #9
0
    def run(self, verbose=False):
        """Fit parameters to EOS at temperatures

        Even if fitting failed, simply omit the volume point. In this case,
        the failed temperature point doesn't exist in the returned arrays.

        """

        if verbose:
            print(("#%11s" + "%14s" * 4) % ("T", "E_0", "B_0", "B'_0", "V_0"))

        # Plus one temperature point is necessary for computing e.g. beta.
        num_elems = self._get_num_elems(self._all_temperatures) + 1
        if num_elems > len(self._all_temperatures):
            num_elems -= 1

        temperatures = []
        parameters = []
        free_energies = []

        for i in range(num_elems):  # loop over temperaturs
            if self._electronic_energies.ndim == 1:
                el_energy = self._electronic_energies
            else:
                el_energy = self._electronic_energies[i]
            fe = [ph_e + el_e
                  for ph_e, el_e in zip(self._fe_phonon[i], el_energy)]

            try:
                ep = fit_to_eos(self._volumes, fe, self._eos)
            except TypeError:
                print("Fitting failure at T=%.1f" % self._all_temperatures[i])

            if ep is None:
                # Simply omit volume point where the fitting failed.
                continue
            else:
                [ee, eb, ebp, ev] = ep
                t = self._all_temperatures[i]
                temperatures.append(t)
                parameters.append(ep)
                free_energies.append(fe)

                if verbose:
                    print(("%14.6f" * 5) %
                          (t, ep[0], ep[1] * EVAngstromToGPa, ep[2], ep[3]))

        self._free_energies = np.array(free_energies)
        self._temperatures = np.array(temperatures)
        self._equiv_parameters = np.array(parameters)
        self._equiv_volumes = np.array(self._equiv_parameters[:, 3])
        self._equiv_energies = np.array(self._equiv_parameters[:, 0])
        self._equiv_bulk_modulus = np.array(
            self._equiv_parameters[:, 1] * EVAngstromToGPa)

        self._num_elems = len(self._temperatures)

        # For computing following values at temperatures, finite difference
        # method is used. Therefore number of temperature points are needed
        # larger than self._num_elems that nearly equals to the temparature
        # point we expect.
        self._set_thermal_expansion()
        self._set_heat_capacity_P_numerical()
        self._set_heat_capacity_P_polyfit()
        self._set_gruneisen_parameter()  # To be run after thermal expansion.

        self._len = len(self._thermal_expansions)
        assert(self._len + 1 == self._num_elems)