Skip to content

Commit 3dd66f0

Browse files
committed
Added normalization to calc_salc_projection
Added _normalize_salcs_expr() to normalize SALCs from the projection operator method. This simplifies the output from [4*a + 4*b + 4*c] to [a + b + c], for example.
1 parent ce889b7 commit 3dd66f0

File tree

2 files changed

+41
-14
lines changed

2 files changed

+41
-14
lines changed

chempy/symmetry/salcs.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,35 @@ def _expand_irreducible(irred, group):
8383
return expanded_irred
8484

8585

86+
def _normalize_salcs_expr(salcs):
87+
"""
88+
Normalize SALC composed of sympy expresions.
89+
90+
Normalizes SALC by dividing each SALC through by the largest value in
91+
that SALC.
92+
93+
Parameters
94+
----------
95+
salcs : List or nested list of sympy expressions.
96+
Nested list of SALCs.
97+
98+
Returns
99+
-------
100+
np.array
101+
102+
"""
103+
normalized_values = []
104+
for salc in salcs:
105+
if isinstance(salc, list):
106+
normalized_values.append(_normalize_salcs_expr(salc))
107+
elif salc == 0:
108+
normalized_values.append(salc)
109+
else:
110+
normalized_values.append(salc.as_poly().monic().as_expr())
111+
112+
return normalized_values
113+
114+
86115
@return_dict
87116
def calc_salcs_projection(projection, group, to_dict=False):
88117
"""
@@ -116,9 +145,9 @@ def calc_salcs_projection(projection, group, to_dict=False):
116145
>>> import sympy
117146
>>> a, b, c = sympy.symbols('a b c')
118147
>>> calc_salcs_projection([a, b, c, a, b, c], 'c3v')
119-
[2*a + 2*b + 2*c, 0, 2*a - b - c]
148+
[a + b + c, 0, a - b/2 - c/2]
120149
>>> calc_salcs_projection([a, b, c, a, b, c], 'c3v', to_dict=True)
121-
{'A1': 2*a + 2*b + 2*c, 'A2': 0, 'E': 2*a - b - c}
150+
{'A1': a + b + c, 'A2': 0, 'E': a - b/2 - c/2}
122151
123152
"""
124153
salcs = []
@@ -128,7 +157,7 @@ def calc_salcs_projection(projection, group, to_dict=False):
128157
np.array(projection))
129158
salcs.append(np.sum(product))
130159

131-
return salcs
160+
return _normalize_salcs_expr(salcs)
132161

133162

134163
# USING SYMMETRY FUNCTIONS

chempy/symmetry/tests/test_salcs.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,42 +13,40 @@ def test_calc_salcs_projection():
1313
# ammonia hydrogens
1414
a, b, c = sympy.symbols('a b c')
1515
assert (calc_salcs_projection([a, b, c, a, b, c], 'c3v') ==
16-
[2*a + 2*b + 2*c, 0, 2*a - b - c])
16+
[a + b + c, 0, a - b/2 - c/2])
1717

1818
# trigonal bipyramidal
1919
a1, a2, e1, e2, e3 = sympy.symbols('a1, a2, e1, e2, e3')
2020
assert (calc_salcs_projection([e1, e2, e3, -e1, -e2, -e3, -e1,
2121
-e2, -e3, e1, e2, e3], 'd3h') ==
22-
[0, 0, 0, 0, 4*e1 + 4*e2 + 4*e3, 4*e1 - 2*e2 - 2*e3])
22+
[0, 0, 0, 0, e1 + e2 + e3, e1 - e2/2 - e3/2])
2323
assert (calc_salcs_projection([a1, a1, a1, -a2, -a2, -a2, -a2,
2424
-a2, -a2, a1, a1, a1], 'd3h') ==
25-
[6*a1 - 6*a2, 0, 0, 0, 6*a1 + 6*a2, 0])
25+
[a1 - a2, 0, 0, 0, a1 + a2, 0])
2626

2727
# square planar s-orbitals
2828
a, b, c, d = sympy.symbols('a b c d')
2929
after_trans = [a, b, d, c, c, a, d, b, c, b, d, a, c, a, d, b]
3030
assert (calc_salcs_projection(after_trans, 'd4h') ==
31-
[4*a + 4*b + 4*c + 4*d, 0, 4*a - 4*b + 4*c - 4*d,
32-
0, 0, 0, 0, 0, 0, 4*a - 4*c])
31+
[a + b + c + d, 0, a - b + c - d, 0, 0, 0, 0, 0, 0, a - c])
3332

3433
# benzene p-orbitals
3534
a, b, c, d, e, f = sympy.symbols('a b c d e f')
3635
after_trans = [a, b, f, c, e, d, -a, -c, -e, -b, -d, -f, -d, -c, -e, -b,
3736
-f, -a, b, d, f, a, c, e]
3837
assert (calc_salcs_projection(after_trans, 'd6h') ==
39-
[0, 0, 0, 4*a - 4*b + 4*c - 4*d + 4*e - 4*f,
40-
4*a + 2*b - 2*c - 4*d - 2*e + 2*f, 0, 0,
41-
4*a + 4*b + 4*c + 4*d + 4*e + 4*f, 0, 0, 0,
42-
4*a - 2*b - 2*c + 4*d - 2*e - 2*f])
38+
[0, 0, 0, a - b + c - d + e - f, a + b/2 - c/2 - d - e/2 + f/2,
39+
0, 0, a + b + c + d + e + f, 0, 0, 0,
40+
a - b/2 - c/2 + d - e/2 - f/2])
4341

4442
# butadiene p-orbitals - inequivalent p-orbitals are treated separately
4543
a, b, c, d = sympy.symbols('a b c d')
4644
after_trans_outer = [a, -d, -a, d]
4745
after_trans_inner = [b, -c, -b, c]
4846
assert (calc_salcs_projection(after_trans_outer, 'c2v') ==
49-
[0, 2*a - 2*d, 0, 2*a + 2*d])
47+
[0, a - d, 0, a + d])
5048
assert (calc_salcs_projection(after_trans_inner, 'c2v') ==
51-
[0, 2*b - 2*c, 0, 2*b + 2*c])
49+
[0, b - c, 0, b + c])
5250

5351

5452
def test_calc_salcs_func():

0 commit comments

Comments
 (0)