-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathfree-energies.py
74 lines (57 loc) · 1.95 KB
/
free-energies.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# -*- coding: utf-8 -*-
# Numerical libraries
# Thermodynamics and computer-algebra libraries
from sympy import Matrix, diff, pprint, symbols
from sympy.abc import x, y
from sympy.utilities.codegen import codegen
from sympy.solvers import solve_linear_system
# Define SymPy variables
x1, x2 = symbols('x1 x2')
xo, xb, xc, xd = symbols('xo xb xc xd')
yo, yb, yc, yd = symbols('yo yb yc yd')
# Define paraboloid origins
xe1A, xe2A = (0.20, 0.20)
xe1B, xe2B = (0.60, 0.20)
xe1C, xe2C = (0.20, 0.60)
# Free Energies
skew = 0.001
GA = (x1 - xe1A)**2 + 1 * (x1 - xe1A) * (x2 - xe2A) + (x2 - xe2A)**2
GB = (x1 - xe1B)**2 + (1+skew) * (x1 - xe1B) * (x2 - xe2B) + (x2 - xe2B)**2
GC = (x1 - xe1C)**2 + (1-skew) * (x1 - xe1C) * (x2 - xe2C) + (x2 - xe2C)**2
# First Derivatives
dGAdx1 = diff(GA, x1)
dGAdx2 = diff(GA, x2)
dGBdx1 = diff(GB, x1)
dGBdx2 = diff(GB, x2)
dGCdx1 = diff(GC, x1)
dGCdx2 = diff(GC, x2)
# Second Derivatives
d2GAdx11 = diff(GA, x1, x1)
d2GAdx12 = diff(GA, x1, x2)
d2GAdx22 = diff(GA, x2, x2)
d2GBdx11 = diff(GB, x1, x1)
d2GBdx12 = diff(GB, x1, x2)
d2GBdx22 = diff(GB, x2, x2)
d2GCdx11 = diff(GC, x1, x1)
d2GCdx12 = diff(GC, x1, x2)
d2GCdx22 = diff(GC, x2, x2)
# Generate numerically efficient C-code
codegen(
[ # Single-phase minima
('xe1A', xe1A), ('xe2A', xe2A),
('xe1B', xe1B), ('xe2B', xe2B),
('xe1C', xe1C), ('xe2C', xe2C),
# Free energies
('GA', GA),
('GB', GB),
('GC', GC),
# First derivatives
('dGAdx1', dGAdx1), ('dGAdx2', dGAdx2),
('dGBdx1', dGBdx1), ('dGBdx2', dGBdx2),
('dGCdx1', dGCdx1), ('dGCdx2', dGCdx2),
# Second derivatives
('d2GAdx11', d2GAdx11), ('d2GAdx12', d2GAdx12), ('d2GAdx22', d2GAdx22),
('d2GBdx11', d2GBdx11), ('d2GBdx12', d2GBdx12), ('d2GBdx22', d2GBdx22),
('d2GCdx11', d2GCdx11), ('d2GCdx12', d2GCdx12), ('d2GCdx22', d2GCdx22)
],
language='C', prefix='paraboloids', project='paraboloids', to_files=True)