qrotor 4.0.2__py3-none-any.whl → 4.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of qrotor might be problematic. Click here for more details.
- qrotor/_version.py +2 -1
- qrotor/constants.py +9 -5
- qrotor/solve.py +1 -1
- qrotor/system.py +3 -3
- {qrotor-4.0.2.dist-info → qrotor-4.1.1.dist-info}/METADATA +1 -1
- qrotor-4.1.1.dist-info/RECORD +14 -0
- {qrotor-4.0.2.dist-info → qrotor-4.1.1.dist-info}/top_level.txt +0 -1
- qrotor-4.0.2.dist-info/RECORD +0 -20
- tests/__init__.py +0 -0
- tests/test_constants.py +0 -13
- tests/test_potential.py +0 -37
- tests/test_rotate.py +0 -53
- tests/test_solve.py +0 -28
- tests/test_system.py +0 -24
- {qrotor-4.0.2.dist-info → qrotor-4.1.1.dist-info}/WHEEL +0 -0
- {qrotor-4.0.2.dist-info → qrotor-4.1.1.dist-info}/licenses/LICENSE +0 -0
qrotor/_version.py
CHANGED
qrotor/constants.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""
|
|
2
2
|
# Description
|
|
3
3
|
|
|
4
|
-
Common constants and default inertia values used in
|
|
4
|
+
Common constants and default inertia values used in QRotor.
|
|
5
5
|
|
|
6
6
|
Bond lengths and angles were obtained from MAPbI3, see
|
|
7
7
|
[K. Drużbicki *et al*., Crystal Growth & Design 24, 391–404 (2024)](https://doi.org/10.1021/acs.cgd.3c01112).
|
|
@@ -75,11 +75,15 @@ In meV units.
|
|
|
75
75
|
|
|
76
76
|
# Quick conversion factors
|
|
77
77
|
Ry_to_eV = const.physical_constants['Rydberg constant times hc in eV'][0]
|
|
78
|
-
"""Quick conversion factor from
|
|
78
|
+
"""Quick conversion factor from Rydberg to eV energy."""
|
|
79
79
|
Ry_to_meV = Ry_to_eV * 1000
|
|
80
|
-
"""Quick conversion factor from
|
|
80
|
+
"""Quick conversion factor from Rydberg to meV energy."""
|
|
81
81
|
eV_to_Ry = 1 / Ry_to_eV
|
|
82
|
-
"""Quick conversion factor from
|
|
82
|
+
"""Quick conversion factor from eV to Rydberg."""
|
|
83
83
|
meV_to_Ry = 1 / Ry_to_meV
|
|
84
|
-
"""Quick conversion factor from
|
|
84
|
+
"""Quick conversion factor from meV to Rydberg."""
|
|
85
|
+
cm1_to_meV = (const.h * const.c * 100 / const.e) * 1000
|
|
86
|
+
"""Quick conversion factor from cm$^{-1}$ to meV."""
|
|
87
|
+
meV_to_cm1 = 1/cm1_to_meV
|
|
88
|
+
"""Quick conversion factor from meV to cm$^{-1}$."""
|
|
85
89
|
|
qrotor/solve.py
CHANGED
|
@@ -100,7 +100,7 @@ def schrodinger(system:System) -> System:
|
|
|
100
100
|
system.version = __version__
|
|
101
101
|
system.runtime = time.time() - time_start
|
|
102
102
|
system.eigenvalues = eigenvalues
|
|
103
|
-
system.
|
|
103
|
+
system.E_activation = max(V) - min(eigenvalues)
|
|
104
104
|
# Solve excitations and tunnel splittings, assuming triplet degeneracy
|
|
105
105
|
system = excitations(system)
|
|
106
106
|
# Do we really need to save eigenvectors?
|
qrotor/system.py
CHANGED
|
@@ -103,6 +103,8 @@ class System:
|
|
|
103
103
|
"""List of `eigenvalues` grouped by energy levels, found below `potential_max`."""
|
|
104
104
|
self.deg: float = None
|
|
105
105
|
"""Estimated degeneracy of the `E_levels` found below `potential_max`."""
|
|
106
|
+
self.E_activation: float = None
|
|
107
|
+
"""Activation energy or energy barrier, from the ground torsional state to the top of the potential barrier, `max(V) - min(eigenvalues)`"""
|
|
106
108
|
self.excitations: list = []
|
|
107
109
|
"""Torsional excitations, as the difference between each energy level with respect to the ground state.
|
|
108
110
|
|
|
@@ -115,8 +117,6 @@ class System:
|
|
|
115
117
|
the mean of the eigenvalues from A and the mean of the eigenvalues from E,
|
|
116
118
|
see [R. M. Dimeo, American Journal of Physics 71, 885–893 (2003)](https://doi.org/10.1119/1.1538575).
|
|
117
119
|
"""
|
|
118
|
-
self.energy_barrier: float = None
|
|
119
|
-
"""Activation energy or energy barrier, from the ground torsional state to the top of the potential barrier, `max(V) - min(eigenvalues)`"""
|
|
120
120
|
self.runtime: float = None
|
|
121
121
|
"""Time taken to solve the eigenvalues."""
|
|
122
122
|
|
|
@@ -269,7 +269,7 @@ class System:
|
|
|
269
269
|
'deg': self.deg,
|
|
270
270
|
'excitations': self.excitations,
|
|
271
271
|
'splittings': self.splittings,
|
|
272
|
-
'
|
|
272
|
+
'E_activation': self.E_activation,
|
|
273
273
|
'runtime': self.runtime,
|
|
274
274
|
}
|
|
275
275
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
qrotor/__init__.py,sha256=rG2dH4QjsVUOMBhFnv5gXs3QnrUg7fywd5pIDmMBXcQ,246
|
|
2
|
+
qrotor/_version.py,sha256=2MgvxBLj7nl20vruBp0VlxrcVaLnJcKclBipVBi68xM,198
|
|
3
|
+
qrotor/constants.py,sha256=XjKlaHnquVtrpt0vtNS1UoXeI9EWf-wzz2QAByJp_Ck,3376
|
|
4
|
+
qrotor/plot.py,sha256=th6eDoTB01KaVjfH2uiKMjU4VJMfdv0yK97PwCJydKI,13479
|
|
5
|
+
qrotor/potential.py,sha256=9NyekNIMbjiRtJ8G6CtCMHX5v-g7kKC8un2x3blq-2w,18320
|
|
6
|
+
qrotor/rotate.py,sha256=Wje9Q9SFhDvizz58MzNGBwsmgV-3wN9z2SnUNTIXzeg,8107
|
|
7
|
+
qrotor/solve.py,sha256=YkOR1SJlpk41PCNEhslv6X3wV1TWMNztT78qX3Pngf0,10722
|
|
8
|
+
qrotor/system.py,sha256=v6BFA9Pm1HbYdfm-XrPP7iWlbcvjxX7ynGBMOxDR7yc,11447
|
|
9
|
+
qrotor/systems.py,sha256=Hcx0QvMWpaPMfC6HWpkZPPWDyHk9rxWKdAxWNnD2NMg,8184
|
|
10
|
+
qrotor-4.1.1.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
|
11
|
+
qrotor-4.1.1.dist-info/METADATA,sha256=k0oAqJRLC6Rr8au36Lj_cmJYiFJVYtqfbTkEn94KOXM,8719
|
|
12
|
+
qrotor-4.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
13
|
+
qrotor-4.1.1.dist-info/top_level.txt,sha256=SFRMgcJiR1GiEtZ4aLo-x5TdfSCo7Igxezp2qyI0u5A,7
|
|
14
|
+
qrotor-4.1.1.dist-info/RECORD,,
|
qrotor-4.0.2.dist-info/RECORD
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
qrotor/__init__.py,sha256=rG2dH4QjsVUOMBhFnv5gXs3QnrUg7fywd5pIDmMBXcQ,246
|
|
2
|
-
qrotor/_version.py,sha256=WfMOkqINoRxtl94Yz6ro_Svh85CVtVc_kBhLMclRC4g,194
|
|
3
|
-
qrotor/constants.py,sha256=l25-YHxWQPr5RFGl8e0Hpdkc0E4ER03Gj-P9Jmbqelc,3203
|
|
4
|
-
qrotor/plot.py,sha256=th6eDoTB01KaVjfH2uiKMjU4VJMfdv0yK97PwCJydKI,13479
|
|
5
|
-
qrotor/potential.py,sha256=9NyekNIMbjiRtJ8G6CtCMHX5v-g7kKC8un2x3blq-2w,18320
|
|
6
|
-
qrotor/rotate.py,sha256=Wje9Q9SFhDvizz58MzNGBwsmgV-3wN9z2SnUNTIXzeg,8107
|
|
7
|
-
qrotor/solve.py,sha256=tnkE5JYT8wW85gNbOEMgHTnzOZCb8q5xPcJbDI4uOB0,10724
|
|
8
|
-
qrotor/system.py,sha256=onY3HfY2zpRLDJUjBJRX-nJu6YH_qhnPnCW6Uyam_Ws,11453
|
|
9
|
-
qrotor/systems.py,sha256=Hcx0QvMWpaPMfC6HWpkZPPWDyHk9rxWKdAxWNnD2NMg,8184
|
|
10
|
-
qrotor-4.0.2.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
|
11
|
-
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
tests/test_constants.py,sha256=YHKkPyZlzjchxxzON_VSNsQdKnpkknsFVoIA6TcUk70,399
|
|
13
|
-
tests/test_potential.py,sha256=_Vq9t9Xm59kNbyYwXlRnvKcxwL7vntD2j14W2aUtF6I,1302
|
|
14
|
-
tests/test_rotate.py,sha256=2On2d1E82hdisFC5DXpaqqYNnteX7ZP3PAnGa_oGm2M,1896
|
|
15
|
-
tests/test_solve.py,sha256=tEjLUZC7oe6LCQD5b2xf2aaK9lu-zI4lzuPXOGR2GAs,861
|
|
16
|
-
tests/test_system.py,sha256=36d-8AdoJdzq0O9_O3s8wwBPGa-M7A86YiHqhhAsCZ8,742
|
|
17
|
-
qrotor-4.0.2.dist-info/METADATA,sha256=T4uzj6bJ0bsRZ5pN5XO2i-i2SY1JoakroDGl1Za5zYU,8719
|
|
18
|
-
qrotor-4.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
19
|
-
qrotor-4.0.2.dist-info/top_level.txt,sha256=mLnYs07-amqX4TqbDV2_XvgdpHfgrYmzmYb7dwoh6EQ,13
|
|
20
|
-
qrotor-4.0.2.dist-info/RECORD,,
|
tests/__init__.py
DELETED
|
File without changes
|
tests/test_constants.py
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import qrotor as qr
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def test_constants():
|
|
5
|
-
assert round(qr.B_CH3, 5) == 0.64518
|
|
6
|
-
assert round(qr.B_CD3, 5) == 0.32289
|
|
7
|
-
assert round(qr.B_NH3, 5) == 0.73569
|
|
8
|
-
assert round(qr.B_ND3, 5) == 0.36819
|
|
9
|
-
assert round(qr.Ry_to_eV, 5) == 13.60569
|
|
10
|
-
assert round(qr.Ry_to_meV, 5) == 13605.69312
|
|
11
|
-
assert round(qr.eV_to_Ry, 5) == 0.07350
|
|
12
|
-
assert round(qr.meV_to_Ry, 10) == .0000734986
|
|
13
|
-
|
tests/test_potential.py
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import qrotor as qr
|
|
2
|
-
import aton
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
folder = 'tests/samples/'
|
|
6
|
-
structure = folder + 'CH3NH3.in'
|
|
7
|
-
structure_120 = folder + 'CH3NH3_120.in'
|
|
8
|
-
structure_60 = folder + 'CH3NH3_60.in'
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def test_save_and_load():
|
|
12
|
-
system = qr.System()
|
|
13
|
-
system.gridsize = 36
|
|
14
|
-
system.potential_name = 'sin'
|
|
15
|
-
system.B = 1
|
|
16
|
-
system.solve_potential()
|
|
17
|
-
potential_file = folder + '_temp_potential.csv'
|
|
18
|
-
# Remove the file if it exists
|
|
19
|
-
try:
|
|
20
|
-
aton.file.remove(potential_file)
|
|
21
|
-
except:
|
|
22
|
-
pass
|
|
23
|
-
qr.potential.save(system, comment='hi', filepath=potential_file)
|
|
24
|
-
system_new = qr.potential.load(potential_file)
|
|
25
|
-
assert system_new.gridsize == system.gridsize
|
|
26
|
-
assert round(system_new.potential_values[0], 5) == round(system.potential_values[0], 5)
|
|
27
|
-
assert round(system_new.potential_values[5], 5) == round(system.potential_values[5], 5)
|
|
28
|
-
assert round(system_new.potential_values[13], 5) == round(system.potential_values[13], 5)
|
|
29
|
-
assert system_new.comment == 'hi'
|
|
30
|
-
aton.file.remove(potential_file)
|
|
31
|
-
# If we don't provide a comment, it should be the name of the folder
|
|
32
|
-
system.comment = None
|
|
33
|
-
qr.potential.save(system, filepath=potential_file)
|
|
34
|
-
system_new = qr.potential.load(potential_file)
|
|
35
|
-
assert system_new.comment == 'samples'
|
|
36
|
-
aton.file.remove(potential_file)
|
|
37
|
-
|
tests/test_rotate.py
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import qrotor as qr
|
|
2
|
-
import aton.api as api
|
|
3
|
-
import aton.txt.extract as extract
|
|
4
|
-
import aton.file as file
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
folder = 'tests/samples/'
|
|
8
|
-
structure = folder + 'CH3NH3.in'
|
|
9
|
-
structure_120 = folder + 'CH3NH3_120.in'
|
|
10
|
-
structure_60 = folder + 'CH3NH3_60.in'
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def test_rotate():
|
|
14
|
-
CH3 = [
|
|
15
|
-
'0.100 0.183 0.316',
|
|
16
|
-
'0.151 0.532 0.842',
|
|
17
|
-
'0.118 0.816 0.277',
|
|
18
|
-
]
|
|
19
|
-
# 120 degrees (it should remain the same)
|
|
20
|
-
qr.rotate.structure_qe(filepath=structure, positions=CH3, angle=120, precision=2)
|
|
21
|
-
for coord in CH3:
|
|
22
|
-
rotated_coord = api.qe.get_atom(filepath=structure_120, position=coord, precision=2)
|
|
23
|
-
rotated_coord = extract.coords(rotated_coord)
|
|
24
|
-
coord = extract.coords(coord)
|
|
25
|
-
rotated_coord_rounded = []
|
|
26
|
-
coord_rounded = []
|
|
27
|
-
for i in rotated_coord:
|
|
28
|
-
rotated_coord_rounded.append(round(i, 2))
|
|
29
|
-
for i in coord:
|
|
30
|
-
coord_rounded.append(round(i, 2))
|
|
31
|
-
assert coord_rounded == rotated_coord_rounded
|
|
32
|
-
file.remove(structure_120)
|
|
33
|
-
|
|
34
|
-
# 60 degrees (it should change quite a lot)
|
|
35
|
-
ideal = [
|
|
36
|
-
'0.146468644022416 0.837865866372631 0.641449758215011',
|
|
37
|
-
'0.095062781582172 0.488975944606740 0.115053787468686',
|
|
38
|
-
'0.128156574395412 0.205890189020629 0.680672454316303',
|
|
39
|
-
]
|
|
40
|
-
qr.rotate.structure_qe(filepath=structure, positions=CH3, angle=60, precision=2)
|
|
41
|
-
for coord in ideal:
|
|
42
|
-
rotated_coord = api.qe.get_atom(filepath=structure_60, position=coord, precision=3)
|
|
43
|
-
rotated_coord = extract.coords(rotated_coord)
|
|
44
|
-
coord = extract.coords(coord)
|
|
45
|
-
rotated_coord_rounded = []
|
|
46
|
-
coord_rounded = []
|
|
47
|
-
for i in rotated_coord:
|
|
48
|
-
rotated_coord_rounded.append(round(i, 2))
|
|
49
|
-
for i in coord:
|
|
50
|
-
coord_rounded.append(round(i, 2))
|
|
51
|
-
assert coord_rounded == rotated_coord_rounded
|
|
52
|
-
file.remove(structure_60)
|
|
53
|
-
|
tests/test_solve.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import qrotor as qr
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def test_solve_zero():
|
|
5
|
-
system = qr.System()
|
|
6
|
-
system.gridsize = 50000
|
|
7
|
-
system.potential_name = 'zero'
|
|
8
|
-
system.B = 1
|
|
9
|
-
system.solve()
|
|
10
|
-
assert round(system.eigenvalues[0], 2) == 0.0
|
|
11
|
-
assert round(system.eigenvalues[1], 2) == 1.0
|
|
12
|
-
assert round(system.eigenvalues[2], 2) == 1.0
|
|
13
|
-
assert round(system.eigenvalues[3], 2) == 4.0
|
|
14
|
-
assert round(system.eigenvalues[4], 2) == 4.0
|
|
15
|
-
assert round(system.eigenvalues[5], 2) == 9.0
|
|
16
|
-
assert round(system.eigenvalues[6], 2) == 9.0
|
|
17
|
-
assert round(system.eigenvalues[7], 2) == 16.0
|
|
18
|
-
assert round(system.eigenvalues[8], 2) == 16.0
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def test_solve_potential():
|
|
22
|
-
system = qr.System()
|
|
23
|
-
system.gridsize = 500
|
|
24
|
-
system.potential_name = 'sin'
|
|
25
|
-
system.potential_constants = [0, 1, 3, 0]
|
|
26
|
-
system.solve_potential()
|
|
27
|
-
assert round(system.potential_max, 2) == 1.0
|
|
28
|
-
|
tests/test_system.py
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import qrotor as qr
|
|
2
|
-
import numpy as np
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
def test_phase():
|
|
6
|
-
sys = qr.System()
|
|
7
|
-
sys.B = 1.0
|
|
8
|
-
sys.potential_name = 'cos'
|
|
9
|
-
sys.gridsize = 10000
|
|
10
|
-
sys.solve()
|
|
11
|
-
# plus pi/2, which will be -3pi/2
|
|
12
|
-
sys.change_phase(0.5)
|
|
13
|
-
assert round(sys.grid[0], 2) == round(-np.pi * 3/2, 2)
|
|
14
|
-
# The first potential value should be 0,
|
|
15
|
-
# but remember that the potential offset is corrected
|
|
16
|
-
# so it should be half potential_max, so 1.0/2
|
|
17
|
-
assert round(sys.potential_values[0], 2) == 0.5
|
|
18
|
-
# minus pi, which will become -pi/2
|
|
19
|
-
sys.change_phase(-1)
|
|
20
|
-
assert round(sys.grid[0], 2) == round(-np.pi/2, 2)
|
|
21
|
-
assert round(sys.potential_values[0], 2) == 0.5
|
|
22
|
-
# Were eigenvalues calculated?
|
|
23
|
-
assert len(sys.eigenvalues) > 0
|
|
24
|
-
|
|
File without changes
|
|
File without changes
|