In [1]:
from pycalphad.tests.datasets import *
from pycalphad.core.solver import InteriorPointSolver
from pycalphad import equilibrium, Database, variables as v

dbf = Database('alzn_mey.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)

my_phases = ['LIQUID', 'FCC_A1']
comps = ['AL', 'ZN']
conds = dict({v.T: 800, v.P: 101325, v.X('ZN'): 0.2, v.N: 1})
eqx = equilibrium(dbf, comps, my_phases, conds, verbose=False, solver=ProblemSaver())


Chemical Potentials [-31050.17389708 -45108.31869308]
[9.09090900e-06 8.97202970e-11 1.13636364e-08 1.09709723e-05
 5.30493336e-05 1.65429632e-05 2.01810891e-05 1.01301778e-05
 8.86145246e-05]
[1.00000000e+00 1.01325000e+05 8.00000000e+02 8.28635590e-01
 1.71364410e-01 5.49538512e-01 4.50461488e-01 8.97399176e-01
 1.02600824e-01]
Status: 0 b'Algorithm terminated successfully at a locally optimal point, satisfying the convergence tolerances (can be specified by options).'

In [2]:
import numpy as np
soln = np.array(
[1.00000000e+00, 1.01325000e+05, 8.00000000e+02, 8.28635470e-01,
 1.71364530e-01, 5.49537239e-01, 4.50462761e-01, 8.97400030e-01,
 1.02599970e-01]
)

temps = np.arange(300,1000,1e-1)
obj = np.zeros_like(temps)
grad = np.zeros_like(temps)
error = np.zeros_like(temps)
for idx, temp in enumerate(temps):
    copy_of_soln = np.array(soln)
    copy_of_soln[2] = temp
    obj[idx] = ProblemSaver.saved_problem[0].objective(copy_of_soln)
    grad[idx] = ProblemSaver.saved_problem[0].gradient(copy_of_soln)[2]
error = np.abs(np.gradient(obj, 1e-1) - grad)

In [3]:
ProblemSaver.saved_problem[0].jacobian(soln)


Out[3]:
array([[ 1.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  1.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         1.00000000e+06,  1.00000000e+06,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  1.00000000e+06,
         1.00000000e+06,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00,  0.00000000e+00,  5.69544245e-12,
         5.69544245e-12,  1.00000000e+06,  1.00000000e+06],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
        -1.53782534e+05,  7.43617496e+05, -4.62174658e+04,
         5.63825042e+04,  1.71364530e+05,  4.50462761e+05]])

In [ ]:


In [5]:
np.unravel_index(np.arange(9*9), (9, 9))


Out[5]:
(array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
        2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
        4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7,
        7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8]),
 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3,
        4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7,
        8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2,
        3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8]))

In [ ]: