Source code for pycalphad.mapping.starting_points
import logging
from typing import Union
import copy
import numpy as np
from pycalphad import Database, Workspace, variables as v
from pycalphad.mapping.primitives import Point
import pycalphad.mapping.utils as map_utils
_log = logging.getLogger(__name__)
[docs]
def point_from_equilibrium(dbf: Database, components: list[str], phases: list[str], conditions: dict[v.StateVariable, float], **eq_kwargs):
"""
Computes equilibrium to get a starting Point
Parameters
----------
dbf : Database
components : [str]
phases : [str]
conditions : dict[v.StateVariable, float]
eq_kwargs : dict
Additional arguments for Workspace (models, phase records, etc.)
"""
# Add v.N to conditions if not supplied
if v.N not in conditions:
conditions[v.N] = 1
wks = Workspace(dbf, components, phases, conditions, **eq_kwargs)
chemical_potentials = np.squeeze(wks.eq.MU)
comp_sets = wks.get_composition_sets()
if len(comp_sets) == 0:
return None
copy_conds = copy.deepcopy(conditions)
np_sum = sum([cs.NP for cs in comp_sets])
for cs in comp_sets:
map_utils.update_cs_phase_frac(cs, cs.NP/np_sum)
for key in copy_conds:
copy_conds[key] = key.compute_property(comp_sets, copy_conds, chemical_potentials)
point = Point(copy_conds, chemical_potentials, [cs for cs in comp_sets if cs.fixed], [cs for cs in comp_sets if not cs.fixed])
return point