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.
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.
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 )
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))
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)
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))
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)
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)