In [1]:
from pycalphad.tests.datasets import *
from pycalphad.core.solver import InteriorPointSolver
from pycalphad import equilibrium, Database, variables as v
ALFE_DBF = Database(ALFE_TDB)
ISSUE43_DBF = Database('issue43.tdb')
class ProblemSaver(InteriorPointSolver):
saved_problem = [None]
def solve(self, prob):
self.saved_problem[0] = prob
self.verbose = True
return super(ProblemSaver, self).solve(prob)
ISSUE43_DBF._parameters.purge_tables()
#eq = equilibrium(ALFE_DBF, ['AL', 'FE', 'VA'], ['FCC_A1', 'AL13FE4'],
# {v.MU('FE'): -123110, v.T: 300, v.P: 1e5}, solver=ProblemSaver())
#eq = equilibrium(ISSUE43_DBF, ['AL', 'NI', 'CR', 'VA'], ['FCC_A1'],
# {v.X('AL'): 0.1, v.MU('CR'): -47269.29002414, v.T: 1273, v.P: 101325},
# solver=ProblemSaver(), global_min=True, verbose=True)
eq = equilibrium(ISSUE43_DBF, ['AL', 'NI', 'CR', 'VA'], ['FCC_A1', 'GAMMA_PRIME'],
{v.X('AL'): 0.3, v.X('CR'): 0.3, v.T: 800, v.P: 101325}, global_min=False,
user_starting_point=[('FCC_A1', [1, 1e5, 800, 1.18776923e-01, 8.80237725e-01, 9.85352235e-04, 1.00000000e+00]),
('GAMMA_PRIME', [1, 1e5, 800, 1.74048875e-01, 5.63475647e-02, 7.69603560e-01, 9.99778534e-01, 2.21458528e-04, 7.35394612e-09])],
solver=ProblemSaver())
In [2]:
import numpy as np
#soln = np.array(
#[1.00000000e+00, 1.01325000e+05, 1.27300000e+03, 1.96247274e-01,
# 3.89967388e-01, 4.13785338e-01, 1.00000000e+00, 1.00000000e+00]
#)
#soln = np.array(
#[1.00000000e+00, 1.01325000e+05, 1.27300000e+03, 2.72418536e-06,
# 1.14936909e-02, 9.88503585e-01, 1.00000000e+00, 1.00000000e+00]
#)
soln = np.array(
[1.00000000e+00, 1.01325000e+05, 8.00000000e+02, 1.18776923e-01,
8.80237725e-01, 9.85352235e-04, 1.00000000e+00, 1.74048875e-01,
5.63475647e-02, 7.69603560e-01, 9.99778534e-01, 2.21458528e-04,
7.35394612e-09, 3.07527500e-01, 6.92472500e-01]
)
In [3]:
selected_index = 5
step = 1e-2
inputs = np.arange(1e-12,1-1e-12,step)
obj = np.zeros_like(inputs)
obj_single0 = np.zeros_like(inputs)
obj_single1 = np.zeros_like(inputs)
error = np.zeros_like(inputs)
for idx, val in enumerate(inputs):
copy_of_soln = np.array(soln)
copy_of_soln[selected_index] = val
copy_of_soln[selected_index-1] = 0.5 - val/2
copy_of_soln[selected_index-2] = 0.5 - val/2
obj[idx] = ProblemSaver.saved_problem[0].chemical_potentials(copy_of_soln, selected_phase_idx=None)[1]
obj_single0[idx] = ProblemSaver.saved_problem[0].chemical_potentials(copy_of_soln, selected_phase_idx=0)[1]
obj_single1[idx] = ProblemSaver.saved_problem[0].chemical_potentials(copy_of_soln, selected_phase_idx=1)[1]
In [4]:
%matplotlib inline
import matplotlib.pyplot as plt
#plt.semilogy(inputs, error)
plt.plot(inputs, obj_single0, label='single 0')
plt.plot(inputs, obj_single1, label='single 1')
plt.plot(inputs, obj, label='all')
plt.legend(loc='best')
#plt.ylim((1e-13,1e-6))
Out[4]:
In [5]:
ProblemSaver.saved_problem[0].constraints(copy_of_soln)
Out[5]:
In [6]:
ProblemSaver.saved_problem[0].chemical_potentials(copy_of_soln, selected_phase_idx=None)
Out[6]:
In [7]:
obj
Out[7]:
In [ ]: