Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
property(lambda self: self.MIX_GM - v.T*self.MIX_GM.diff(v.T))
mixing_entropy = MIX_SM = property(lambda self: -self.MIX_GM.diff(v.T))
Examples
--------
None yet.
"""
if not broadcast:
raise NotImplementedError('Broadcasting cannot yet be disabled')
comps = sorted(unpack_components(dbf, comps))
phases = unpack_phases(phases) or sorted(dbf.phases.keys())
list_of_possible_phases = filter_phases(dbf, comps)
if len(list_of_possible_phases) == 0:
raise ConditionError('There are no phases in the Database that can be active with components {0}'.format(comps))
active_phases = {name: dbf.phases[name] for name in filter_phases(dbf, comps, phases)}
if len(active_phases) == 0:
raise ConditionError('None of the passed phases ({0}) are active. List of possible phases: {1}.'.format(phases, list_of_possible_phases))
if isinstance(comps, (str, v.Species)):
comps = [comps]
if len(set(comps) - set(dbf.species)) > 0:
raise EquilibriumError('Components not found in database: {}'
.format(','.join([c.name for c in (set(comps) - set(dbf.species))])))
calc_opts = calc_opts if calc_opts is not None else dict()
solver = solver if solver is not None else InteriorPointSolver(verbose=verbose)
parameters = parameters if parameters is not None else dict()
if isinstance(parameters, dict):
parameters = OrderedDict(sorted(parameters.items(), key=str))
models = instantiate_models(dbf, comps, active_phases, model=model, parameters=parameters)
# Temporary solution until constraint system improves
if conditions.get(v.N) is None:
conditions[v.N] = 1
if np.any(np.array(conditions[v.N]) != 1):
raise ConditionError('N!=1 is not yet supported, got N={}'.format(conditions[v.N]))
# Modify conditions values to be within numerical limits, e.g., X(AL)=0
break
current_potentials[...] = properties.MU.values
if verbose:
print('Refining convex hull')
# Insert extra dimensions for non-T,P conditions so GM broadcasts correctly
energy_broadcast_shape = grid.GM.values.shape[:len(indep_vals)] + \
(1,) * (len(str_conds) - len(indep_vals)) + (grid.GM.values.shape[-1],)
driving_forces = np.einsum('...i,...i',
properties.MU.values[..., np.newaxis, :].astype(np.float),
grid.X.values[np.index_exp[...] +
(np.newaxis,) * (len(str_conds) - len(indep_vals)) +
np.index_exp[:, :]].astype(np.float)) - \
grid.GM.values.view().reshape(energy_broadcast_shape)
for name in active_phases:
dof = len(models[name].energy.atoms(v.SiteFraction))
current_phase_indices = (grid.Phase.values == name).reshape(energy_broadcast_shape[:-1] + (-1,))
# Broadcast to capture all conditions
current_phase_indices = np.broadcast_arrays(current_phase_indices,
np.empty(driving_forces.shape))[0]
# This reshape is safe as long as phases have the same number of points at all indep. conditions
current_phase_driving_forces = driving_forces[current_phase_indices].reshape(
current_phase_indices.shape[:-1] + (-1,))
# Note: This works as long as all points are in the same phase order for all T, P
current_site_fractions = grid.Y.values[..., current_phase_indices[(0,) * len(str_conds)], :]
if np.sum(current_site_fractions[(0,) * len(indep_vals)][..., :dof]) == dof:
# All site fractions are 1, aka zero internal degrees of freedom
# Impossible to refine these points, so skip this phase
points_dict[name] = current_site_fractions[(0,) * len(indep_vals)][..., :dof]
continue
# Find the N points with largest driving force for a given set of conditions
# Remember that driving force has a sign, so we want the "most positive" values
def _axis_label(ax_var):
if isinstance(ax_var, v.Composition):
return 'X({})'.format(ax_var.species.name)
elif isinstance(ax_var, v.StateVariable):
return _plot_labels[ax_var]
else:
return ax_var
y_points.append(y_val)
# plot the tielines
if all([xx is not None and yy is not None for xx, yy in zip(x_points, y_points)]):
ax.plot(x_points, y_points, **updated_tieline_plot_kwargs)
elif projection == 'triangular':
scatter_kwargs = {'markersize': 4, 'markeredgewidth': 0.4}
# raise warnings if any of the aliased versions of the default values are used
possible_aliases = [('markersize', 'ms'), ('markeredgewidth', 'mew')]
for actual_arg, aliased_arg in possible_aliases:
if aliased_arg in plot_kwargs:
warnings.warn("'{0}' passed as plotting keyword argument to dataplot, but the alias '{1}' is already set to '{2}'. Use the full version of the keyword argument '{1}' to override the default.".format(aliased_arg, actual_arg, scatter_kwargs.get(actual_arg)))
scatter_kwargs.update(plot_kwargs)
eq_dict = ravel_zpf_values(desired_data, [x, y], {'T': conds[v.T]})
# two phase
updated_tieline_plot_kwargs = {'linewidth':1, 'color':'k'}
if tieline_plot_kwargs is not None:
updated_tieline_plot_kwargs.update(tieline_plot_kwargs)
for eq in eq_dict.get(2,[]): # list of things in equilibrium
# plot the scatter points for the right phases
x_points, y_points = [], []
for phase_name, comp_dict, ref_key in eq:
sym_ref = symbol_map[ref_key]
x_val, y_val = comp_dict[x], comp_dict[y]
if x_val is not None and y_val is not None:
ax.plot(x_val, y_val,
label=sym_ref['formatted'],
fillstyle=sym_ref['markers']['fillstyle'],
marker=sym_ref['markers']['marker'],