MultiOptPy 1.20.2__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.
Files changed (246) hide show
  1. multioptpy/Calculator/__init__.py +0 -0
  2. multioptpy/Calculator/ase_calculation_tools.py +424 -0
  3. multioptpy/Calculator/ase_tools/__init__.py +0 -0
  4. multioptpy/Calculator/ase_tools/fairchem.py +28 -0
  5. multioptpy/Calculator/ase_tools/gamess.py +19 -0
  6. multioptpy/Calculator/ase_tools/gaussian.py +165 -0
  7. multioptpy/Calculator/ase_tools/mace.py +28 -0
  8. multioptpy/Calculator/ase_tools/mopac.py +19 -0
  9. multioptpy/Calculator/ase_tools/nwchem.py +31 -0
  10. multioptpy/Calculator/ase_tools/orca.py +22 -0
  11. multioptpy/Calculator/ase_tools/pygfn0.py +37 -0
  12. multioptpy/Calculator/dxtb_calculation_tools.py +344 -0
  13. multioptpy/Calculator/emt_calculation_tools.py +458 -0
  14. multioptpy/Calculator/gpaw_calculation_tools.py +183 -0
  15. multioptpy/Calculator/lj_calculation_tools.py +314 -0
  16. multioptpy/Calculator/psi4_calculation_tools.py +334 -0
  17. multioptpy/Calculator/pwscf_calculation_tools.py +189 -0
  18. multioptpy/Calculator/pyscf_calculation_tools.py +327 -0
  19. multioptpy/Calculator/sqm1_calculation_tools.py +611 -0
  20. multioptpy/Calculator/sqm2_calculation_tools.py +376 -0
  21. multioptpy/Calculator/tblite_calculation_tools.py +352 -0
  22. multioptpy/Calculator/tersoff_calculation_tools.py +818 -0
  23. multioptpy/Constraint/__init__.py +0 -0
  24. multioptpy/Constraint/constraint_condition.py +834 -0
  25. multioptpy/Coordinate/__init__.py +0 -0
  26. multioptpy/Coordinate/polar_coordinate.py +199 -0
  27. multioptpy/Coordinate/redundant_coordinate.py +638 -0
  28. multioptpy/IRC/__init__.py +0 -0
  29. multioptpy/IRC/converge_criteria.py +28 -0
  30. multioptpy/IRC/dvv.py +544 -0
  31. multioptpy/IRC/euler.py +439 -0
  32. multioptpy/IRC/hpc.py +564 -0
  33. multioptpy/IRC/lqa.py +540 -0
  34. multioptpy/IRC/modekill.py +662 -0
  35. multioptpy/IRC/rk4.py +579 -0
  36. multioptpy/Interpolation/__init__.py +0 -0
  37. multioptpy/Interpolation/adaptive_interpolation.py +283 -0
  38. multioptpy/Interpolation/binomial_interpolation.py +179 -0
  39. multioptpy/Interpolation/geodesic_interpolation.py +785 -0
  40. multioptpy/Interpolation/interpolation.py +156 -0
  41. multioptpy/Interpolation/linear_interpolation.py +473 -0
  42. multioptpy/Interpolation/savitzky_golay_interpolation.py +252 -0
  43. multioptpy/Interpolation/spline_interpolation.py +353 -0
  44. multioptpy/MD/__init__.py +0 -0
  45. multioptpy/MD/thermostat.py +185 -0
  46. multioptpy/MEP/__init__.py +0 -0
  47. multioptpy/MEP/pathopt_bneb_force.py +443 -0
  48. multioptpy/MEP/pathopt_dmf_force.py +448 -0
  49. multioptpy/MEP/pathopt_dneb_force.py +130 -0
  50. multioptpy/MEP/pathopt_ewbneb_force.py +207 -0
  51. multioptpy/MEP/pathopt_gpneb_force.py +512 -0
  52. multioptpy/MEP/pathopt_lup_force.py +113 -0
  53. multioptpy/MEP/pathopt_neb_force.py +225 -0
  54. multioptpy/MEP/pathopt_nesb_force.py +205 -0
  55. multioptpy/MEP/pathopt_om_force.py +153 -0
  56. multioptpy/MEP/pathopt_qsm_force.py +174 -0
  57. multioptpy/MEP/pathopt_qsmv2_force.py +304 -0
  58. multioptpy/ModelFunction/__init__.py +7 -0
  59. multioptpy/ModelFunction/avoiding_model_function.py +29 -0
  60. multioptpy/ModelFunction/binary_image_ts_search_model_function.py +47 -0
  61. multioptpy/ModelFunction/conical_model_function.py +26 -0
  62. multioptpy/ModelFunction/opt_meci.py +50 -0
  63. multioptpy/ModelFunction/opt_mesx.py +47 -0
  64. multioptpy/ModelFunction/opt_mesx_2.py +49 -0
  65. multioptpy/ModelFunction/seam_model_function.py +27 -0
  66. multioptpy/ModelHessian/__init__.py +0 -0
  67. multioptpy/ModelHessian/approx_hessian.py +147 -0
  68. multioptpy/ModelHessian/calc_params.py +227 -0
  69. multioptpy/ModelHessian/fischer.py +236 -0
  70. multioptpy/ModelHessian/fischerd3.py +360 -0
  71. multioptpy/ModelHessian/fischerd4.py +398 -0
  72. multioptpy/ModelHessian/gfn0xtb.py +633 -0
  73. multioptpy/ModelHessian/gfnff.py +709 -0
  74. multioptpy/ModelHessian/lindh.py +165 -0
  75. multioptpy/ModelHessian/lindh2007d2.py +707 -0
  76. multioptpy/ModelHessian/lindh2007d3.py +822 -0
  77. multioptpy/ModelHessian/lindh2007d4.py +1030 -0
  78. multioptpy/ModelHessian/morse.py +106 -0
  79. multioptpy/ModelHessian/schlegel.py +144 -0
  80. multioptpy/ModelHessian/schlegeld3.py +322 -0
  81. multioptpy/ModelHessian/schlegeld4.py +559 -0
  82. multioptpy/ModelHessian/shortrange.py +346 -0
  83. multioptpy/ModelHessian/swartd2.py +496 -0
  84. multioptpy/ModelHessian/swartd3.py +706 -0
  85. multioptpy/ModelHessian/swartd4.py +918 -0
  86. multioptpy/ModelHessian/tshess.py +40 -0
  87. multioptpy/Optimizer/QHAdam.py +61 -0
  88. multioptpy/Optimizer/__init__.py +0 -0
  89. multioptpy/Optimizer/abc_fire.py +83 -0
  90. multioptpy/Optimizer/adabelief.py +58 -0
  91. multioptpy/Optimizer/adabound.py +68 -0
  92. multioptpy/Optimizer/adadelta.py +65 -0
  93. multioptpy/Optimizer/adaderivative.py +56 -0
  94. multioptpy/Optimizer/adadiff.py +68 -0
  95. multioptpy/Optimizer/adafactor.py +70 -0
  96. multioptpy/Optimizer/adam.py +65 -0
  97. multioptpy/Optimizer/adamax.py +62 -0
  98. multioptpy/Optimizer/adamod.py +83 -0
  99. multioptpy/Optimizer/adamw.py +65 -0
  100. multioptpy/Optimizer/adiis.py +523 -0
  101. multioptpy/Optimizer/afire_neb.py +282 -0
  102. multioptpy/Optimizer/block_hessian_update.py +709 -0
  103. multioptpy/Optimizer/c2diis.py +491 -0
  104. multioptpy/Optimizer/component_wise_scaling.py +405 -0
  105. multioptpy/Optimizer/conjugate_gradient.py +82 -0
  106. multioptpy/Optimizer/conjugate_gradient_neb.py +345 -0
  107. multioptpy/Optimizer/coordinate_locking.py +405 -0
  108. multioptpy/Optimizer/dic_rsirfo.py +1015 -0
  109. multioptpy/Optimizer/ediis.py +417 -0
  110. multioptpy/Optimizer/eve.py +76 -0
  111. multioptpy/Optimizer/fastadabelief.py +61 -0
  112. multioptpy/Optimizer/fire.py +77 -0
  113. multioptpy/Optimizer/fire2.py +249 -0
  114. multioptpy/Optimizer/fire_neb.py +92 -0
  115. multioptpy/Optimizer/gan_step.py +486 -0
  116. multioptpy/Optimizer/gdiis.py +609 -0
  117. multioptpy/Optimizer/gediis.py +203 -0
  118. multioptpy/Optimizer/geodesic_step.py +433 -0
  119. multioptpy/Optimizer/gpmin.py +633 -0
  120. multioptpy/Optimizer/gpr_step.py +364 -0
  121. multioptpy/Optimizer/gradientdescent.py +78 -0
  122. multioptpy/Optimizer/gradientdescent_neb.py +52 -0
  123. multioptpy/Optimizer/hessian_update.py +433 -0
  124. multioptpy/Optimizer/hybrid_rfo.py +998 -0
  125. multioptpy/Optimizer/kdiis.py +625 -0
  126. multioptpy/Optimizer/lars.py +21 -0
  127. multioptpy/Optimizer/lbfgs.py +253 -0
  128. multioptpy/Optimizer/lbfgs_neb.py +355 -0
  129. multioptpy/Optimizer/linesearch.py +236 -0
  130. multioptpy/Optimizer/lookahead.py +40 -0
  131. multioptpy/Optimizer/nadam.py +64 -0
  132. multioptpy/Optimizer/newton.py +200 -0
  133. multioptpy/Optimizer/prodigy.py +70 -0
  134. multioptpy/Optimizer/purtubation.py +16 -0
  135. multioptpy/Optimizer/quickmin_neb.py +245 -0
  136. multioptpy/Optimizer/radam.py +75 -0
  137. multioptpy/Optimizer/rfo_neb.py +302 -0
  138. multioptpy/Optimizer/ric_rfo.py +842 -0
  139. multioptpy/Optimizer/rl_step.py +627 -0
  140. multioptpy/Optimizer/rmspropgrave.py +65 -0
  141. multioptpy/Optimizer/rsirfo.py +1647 -0
  142. multioptpy/Optimizer/rsprfo.py +1056 -0
  143. multioptpy/Optimizer/sadam.py +60 -0
  144. multioptpy/Optimizer/samsgrad.py +63 -0
  145. multioptpy/Optimizer/tr_lbfgs.py +678 -0
  146. multioptpy/Optimizer/trim.py +273 -0
  147. multioptpy/Optimizer/trust_radius.py +207 -0
  148. multioptpy/Optimizer/trust_radius_neb.py +121 -0
  149. multioptpy/Optimizer/yogi.py +60 -0
  150. multioptpy/OtherMethod/__init__.py +0 -0
  151. multioptpy/OtherMethod/addf.py +1150 -0
  152. multioptpy/OtherMethod/dimer.py +895 -0
  153. multioptpy/OtherMethod/elastic_image_pair.py +629 -0
  154. multioptpy/OtherMethod/modelfunction.py +456 -0
  155. multioptpy/OtherMethod/newton_traj.py +454 -0
  156. multioptpy/OtherMethod/twopshs.py +1095 -0
  157. multioptpy/PESAnalyzer/__init__.py +0 -0
  158. multioptpy/PESAnalyzer/calc_irc_curvature.py +125 -0
  159. multioptpy/PESAnalyzer/cmds_analysis.py +152 -0
  160. multioptpy/PESAnalyzer/koopman_analysis.py +268 -0
  161. multioptpy/PESAnalyzer/pca_analysis.py +314 -0
  162. multioptpy/Parameters/__init__.py +0 -0
  163. multioptpy/Parameters/atomic_mass.py +20 -0
  164. multioptpy/Parameters/atomic_number.py +22 -0
  165. multioptpy/Parameters/covalent_radii.py +44 -0
  166. multioptpy/Parameters/d2.py +61 -0
  167. multioptpy/Parameters/d3.py +63 -0
  168. multioptpy/Parameters/d4.py +103 -0
  169. multioptpy/Parameters/dreiding.py +34 -0
  170. multioptpy/Parameters/gfn0xtb_param.py +137 -0
  171. multioptpy/Parameters/gfnff_param.py +315 -0
  172. multioptpy/Parameters/gnb.py +104 -0
  173. multioptpy/Parameters/parameter.py +22 -0
  174. multioptpy/Parameters/uff.py +72 -0
  175. multioptpy/Parameters/unit_values.py +20 -0
  176. multioptpy/Potential/AFIR_potential.py +55 -0
  177. multioptpy/Potential/LJ_repulsive_potential.py +345 -0
  178. multioptpy/Potential/__init__.py +0 -0
  179. multioptpy/Potential/anharmonic_keep_potential.py +28 -0
  180. multioptpy/Potential/asym_elllipsoidal_potential.py +718 -0
  181. multioptpy/Potential/electrostatic_potential.py +69 -0
  182. multioptpy/Potential/flux_potential.py +30 -0
  183. multioptpy/Potential/gaussian_potential.py +101 -0
  184. multioptpy/Potential/idpp.py +516 -0
  185. multioptpy/Potential/keep_angle_potential.py +146 -0
  186. multioptpy/Potential/keep_dihedral_angle_potential.py +105 -0
  187. multioptpy/Potential/keep_outofplain_angle_potential.py +70 -0
  188. multioptpy/Potential/keep_potential.py +99 -0
  189. multioptpy/Potential/mechano_force_potential.py +74 -0
  190. multioptpy/Potential/nanoreactor_potential.py +52 -0
  191. multioptpy/Potential/potential.py +896 -0
  192. multioptpy/Potential/spacer_model_potential.py +221 -0
  193. multioptpy/Potential/switching_potential.py +258 -0
  194. multioptpy/Potential/universal_potential.py +34 -0
  195. multioptpy/Potential/value_range_potential.py +36 -0
  196. multioptpy/Potential/void_point_potential.py +25 -0
  197. multioptpy/SQM/__init__.py +0 -0
  198. multioptpy/SQM/sqm1/__init__.py +0 -0
  199. multioptpy/SQM/sqm1/sqm1_core.py +1792 -0
  200. multioptpy/SQM/sqm2/__init__.py +0 -0
  201. multioptpy/SQM/sqm2/calc_tools.py +95 -0
  202. multioptpy/SQM/sqm2/sqm2_basis.py +850 -0
  203. multioptpy/SQM/sqm2/sqm2_bond.py +119 -0
  204. multioptpy/SQM/sqm2/sqm2_core.py +303 -0
  205. multioptpy/SQM/sqm2/sqm2_data.py +1229 -0
  206. multioptpy/SQM/sqm2/sqm2_disp.py +65 -0
  207. multioptpy/SQM/sqm2/sqm2_eeq.py +243 -0
  208. multioptpy/SQM/sqm2/sqm2_overlapint.py +704 -0
  209. multioptpy/SQM/sqm2/sqm2_qm.py +578 -0
  210. multioptpy/SQM/sqm2/sqm2_rep.py +66 -0
  211. multioptpy/SQM/sqm2/sqm2_srb.py +70 -0
  212. multioptpy/Thermo/__init__.py +0 -0
  213. multioptpy/Thermo/normal_mode_analyzer.py +865 -0
  214. multioptpy/Utils/__init__.py +0 -0
  215. multioptpy/Utils/bond_connectivity.py +264 -0
  216. multioptpy/Utils/calc_tools.py +884 -0
  217. multioptpy/Utils/oniom.py +96 -0
  218. multioptpy/Utils/pbc.py +48 -0
  219. multioptpy/Utils/riemann_curvature.py +208 -0
  220. multioptpy/Utils/symmetry_analyzer.py +482 -0
  221. multioptpy/Visualization/__init__.py +0 -0
  222. multioptpy/Visualization/visualization.py +156 -0
  223. multioptpy/WFAnalyzer/MO_analysis.py +104 -0
  224. multioptpy/WFAnalyzer/__init__.py +0 -0
  225. multioptpy/Wrapper/__init__.py +0 -0
  226. multioptpy/Wrapper/autots.py +1239 -0
  227. multioptpy/Wrapper/ieip_wrapper.py +93 -0
  228. multioptpy/Wrapper/md_wrapper.py +92 -0
  229. multioptpy/Wrapper/neb_wrapper.py +94 -0
  230. multioptpy/Wrapper/optimize_wrapper.py +76 -0
  231. multioptpy/__init__.py +5 -0
  232. multioptpy/entrypoints.py +916 -0
  233. multioptpy/fileio.py +660 -0
  234. multioptpy/ieip.py +340 -0
  235. multioptpy/interface.py +1086 -0
  236. multioptpy/irc.py +529 -0
  237. multioptpy/moleculardynamics.py +432 -0
  238. multioptpy/neb.py +1267 -0
  239. multioptpy/optimization.py +1553 -0
  240. multioptpy/optimizer.py +709 -0
  241. multioptpy-1.20.2.dist-info/METADATA +438 -0
  242. multioptpy-1.20.2.dist-info/RECORD +246 -0
  243. multioptpy-1.20.2.dist-info/WHEEL +5 -0
  244. multioptpy-1.20.2.dist-info/entry_points.txt +9 -0
  245. multioptpy-1.20.2.dist-info/licenses/LICENSE +674 -0
  246. multioptpy-1.20.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,96 @@
1
+ import numpy as np
2
+ from multioptpy.Parameters.parameter import covalent_radii_lib
3
+
4
+ def link_number_high_layer_and_low_layer(high_layer_atom_num):
5
+ """
6
+ Create mapping dictionaries between high layer atom indices and full system indices.
7
+
8
+ Args:
9
+ high_layer_atom_num: List of atom indices in the high layer (1-indexed)
10
+
11
+ Returns:
12
+ Tuple of two dictionaries:
13
+ real_2_highlayer_label_connect_dict: Maps full system indices to high layer indices
14
+ highlayer_2_real_label_connect_dict: Maps high layer indices to full system indices
15
+ """
16
+ real_2_highlayer_label_connect_dict = {}
17
+ highlayer_2_real_label_connect_dict = {}
18
+ for i in range(len(high_layer_atom_num)):
19
+ real_2_highlayer_label_connect_dict[high_layer_atom_num[i]] = i + 1
20
+ highlayer_2_real_label_connect_dict[i + 1] = high_layer_atom_num[i]
21
+
22
+ return real_2_highlayer_label_connect_dict, highlayer_2_real_label_connect_dict
23
+
24
+
25
+ def specify_link_atom_pairs(mol_list, element_list, high_layer_atom_num, link_atom_num, covalent_radii_threshold_scale=1.2):
26
+ """
27
+ Identify pairs of atoms that form the boundary between high and low layer.
28
+
29
+ Args:
30
+ mol_list: Coordinates of all atoms in the system (Bohr)
31
+ element_list: List of element symbols for all atoms
32
+ high_layer_atom_num: List of atom indices in the high layer (1-indexed)
33
+ link_atom_num: List of atom indices that are linked to high layer (1-indexed)
34
+ covalent_radii_threshold_scale: Scale factor for covalent radii threshold
35
+
36
+ Returns:
37
+ List of pairs [high_layer_atom_index, linker_atom_index]
38
+ """
39
+ # Handle case where no link atoms are specified
40
+ if link_atom_num == "none":
41
+ return []
42
+
43
+ linker_atom_pair_num = []
44
+ for link_atom in link_atom_num:
45
+ min_dist = 1e+10
46
+ min_dist_atom_num = None
47
+ for high_layer_atom in high_layer_atom_num:
48
+ dist = np.linalg.norm(mol_list[high_layer_atom-1] - mol_list[link_atom-1])
49
+ if dist < min_dist:
50
+ min_dist = dist
51
+ min_dist_atom_num = high_layer_atom
52
+
53
+ if min_dist_atom_num is not None:
54
+ linker_atom_pair_num.append([min_dist_atom_num, link_atom])
55
+
56
+ return linker_atom_pair_num # [[high_layer_atom_number, linker_atom_num] ...]
57
+
58
+
59
+ def separate_high_layer_and_low_layer(mol_list, linker_atom_pair_num, high_layer_atom_num, element_list):
60
+ """
61
+ Create high-layer geometry and element lists, adding link atoms where needed.
62
+
63
+ Args:
64
+ mol_list: Coordinates of all atoms in the system (Bohr)
65
+ linker_atom_pair_num: List of pairs [high_layer_atom_index, linker_atom_index]
66
+ high_layer_atom_num: List of atom indices in the high layer (1-indexed)
67
+ element_list: List of element symbols for all atoms
68
+
69
+ Returns:
70
+ Tuple of:
71
+ high_layer_geom_num_list: Coordinates of high layer atoms (Bohr)
72
+ high_layer_element_list: List of element symbols for high layer atoms
73
+ """
74
+ # Extract high layer atoms
75
+ high_layer_geom_num_list = []
76
+ high_layer_element_list = []
77
+
78
+ for i in range(len(high_layer_atom_num)):
79
+ high_layer_geom_num_list.append(mol_list[high_layer_atom_num[i]-1])
80
+ high_layer_element_list.append(element_list[high_layer_atom_num[i]-1])
81
+
82
+ high_layer_geom_num_list = np.array(high_layer_geom_num_list, dtype="float64")
83
+
84
+ # Add link atoms (hydrogen atoms at appropriate positions)
85
+ for base, link in linker_atom_pair_num:
86
+ # Calculate unit vector from base atom to link atom
87
+ vector = mol_list[link-1] - mol_list[base-1]
88
+ distance = np.linalg.norm(vector)
89
+ if distance > 0: # Avoid division by zero
90
+ unit_vec = vector / distance
91
+ # Position link atom at appropriate distance from base atom
92
+ link_atom_position = mol_list[base-1] + unit_vec * (covalent_radii_lib(element_list[base-1]) + covalent_radii_lib("H"))
93
+ high_layer_geom_num_list = np.append(high_layer_geom_num_list, [link_atom_position], axis=0)
94
+ high_layer_element_list.append("H")
95
+
96
+ return high_layer_geom_num_list, high_layer_element_list
@@ -0,0 +1,48 @@
1
+ import copy
2
+ import numpy as np
3
+ from multioptpy.Utils.calc_tools import Calculationtools, fragment_check
4
+
5
+
6
+ def apply_periodic_boundary_condition(geom_num_list, element_list, box, fragm_check=True):
7
+ #geom_num_list: ndarray 3 × N, Bohr.
8
+ #box: ndarray, [x, y, z]
9
+ if fragm_check:
10
+ fragm_list = fragment_check(geom_num_list, element_list)
11
+ center_of_mass_list = []
12
+
13
+
14
+ for fragm in fragm_list:
15
+ tmp_elem_list = [element_list[i] for i in fragm]
16
+ center_of_mass = Calculationtools().calc_center_of_mass(geom_num_list[fragm], tmp_elem_list)
17
+ center_of_mass_list.append(center_of_mass)
18
+
19
+ for i in range(len(center_of_mass_list)):
20
+
21
+ for j in range(3):
22
+ if center_of_mass_list[i][j] < 0:
23
+ tmp_center_of_mass_point = center_of_mass_list[i][j] % box[j]
24
+ dist = abs(center_of_mass_list[i][j] - tmp_center_of_mass_point)
25
+
26
+
27
+ for k in range(len(fragm_list[i])):
28
+
29
+ geom_num_list[fragm_list[i][k]][j] = copy.copy(geom_num_list[fragm_list[i][k]][j] + dist)
30
+
31
+
32
+ elif center_of_mass_list[i][j] > box[j]:
33
+ tmp_center_of_mass_point = center_of_mass_list[i][j] % box[j]
34
+ dist = abs(center_of_mass_list[i][j] - tmp_center_of_mass_point)
35
+
36
+ for k in range(len(fragm_list[i])):
37
+
38
+ geom_num_list[fragm_list[i][k]][j] = copy.copy(geom_num_list[fragm_list[i][k]][j] - dist)
39
+
40
+
41
+ else:
42
+ pass
43
+ else:
44
+ geom_num_list[:, 0] = geom_num_list[:, 0] % box[0]
45
+ geom_num_list[:, 1] = geom_num_list[:, 1] % box[1]
46
+ geom_num_list[:, 2] = geom_num_list[:, 2] % box[2]
47
+
48
+ return geom_num_list
@@ -0,0 +1,208 @@
1
+ import numpy as np
2
+ import glob
3
+
4
+ from multioptpy.Utils.calc_tools import Calculationtools
5
+ from multioptpy.fileio import FileIO
6
+ from multioptpy.Visualization.visualization import Graph
7
+
8
+ class ReactionPathRicciCurvature:
9
+ def __init__(self, three_jacobian_mat, three_geodesic_dist_mat, three_euclidean_dist_mat):
10
+ #doi:10.1002/jcc.27030
11
+ self.jacob_mat = three_jacobian_mat
12
+ self.geod_mat = three_geodesic_dist_mat
13
+ self.eucl_mat = three_euclidean_dist_mat
14
+ return
15
+
16
+
17
+
18
+ def calc_Riemann_metric(self, k, i, j):
19
+ tmp_mat = self.jacob_mat[k].T
20
+ g_list = tmp_mat[i] * tmp_mat[j]
21
+
22
+ #g_list = [self.jacob_mat[k][n][i] * self.jacob_mat[k][n][j] for n in range(len(self.jacob_mat[k]))]
23
+
24
+ return np.sum(g_list)
25
+
26
+ def calc_Riemann_inv_metric(self, k, i, j):
27
+ tmp_mat = self.jacob_mat[k].T
28
+ g_inv_list = 1 / tmp_mat[i] * 1 / tmp_mat[j]
29
+
30
+ #g_list = [self.jacob_mat[k][n][i] * self.jacob_mat[k][n][j] for n in range(len(self.jacob_mat[k]))]
31
+
32
+ return np.sum(g_inv_list)
33
+
34
+ def calc_Riemann_1st_derivative_metric(self, i, j, a):
35
+ dg_dt = 0.0
36
+ if i == j and j == a:
37
+ dg_dt = (self.calc_Riemann_metric(2, i, j) - self.calc_Riemann_metric(0, i, j)) / (self.geod_mat[2][a] - self.geod_mat[0][a])
38
+ elif a != i and a != j:
39
+ pass
40
+ elif a == i and a != j:
41
+
42
+ #dg_dt_list = [((self.jacob_mat[2][n][a] - self.jacob_mat[0][n][a]) * self.jacob_mat[1][n][j]) / (self.geod_mat[2][a] - self.geod_mat[0][a]) for n in range(len(self.jacob_mat[1]))]
43
+ dg_dt_list = ((self.jacob_mat[2].T[a] - self.jacob_mat[0].T[a]) * self.jacob_mat[1].T[j]) / (self.geod_mat[2][a] - self.geod_mat[0][a])
44
+ dg_dt = np.sum(dg_dt_list)
45
+
46
+ else:
47
+ #dg_dt_list = [((self.jacob_mat[2][n][a] - self.jacob_mat[0][n][a]) * self.jacob_mat[1][n][i]) / (self.geod_mat[2][a] - self.geod_mat[0][a]) for n in range(len(self.jacob_mat[1]))]
48
+ dg_dt_list = ((self.jacob_mat[2].T[a] - self.jacob_mat[0].T[a]) * self.jacob_mat[1].T[i]) / (self.geod_mat[2][a] - self.geod_mat[0][a])
49
+ dg_dt = np.sum(dg_dt_list)
50
+
51
+ return dg_dt
52
+
53
+ def calc_Riemann_2nd_derivative_metric(self, i, j, a, b):
54
+ d2g_dt2 = 0.0
55
+ if (b == i and b == j) or (a == i and a == j):
56
+ pass
57
+
58
+ elif a == b and b == i and i == j:
59
+ d2g_dt2 = ((self.calc_Riemann_metric(2, i, j) + self.calc_Riemann_metric(0, i, j))) / ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a]))
60
+
61
+ elif a == b and b == i and b != j:
62
+ #d2g_dt2_list = [((self.jacob_mat[2][n][a] - self.jacob_mat[0][n][a]) * self.jacob_mat[1][n][j]) / ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a])) for n in range(len(self.jacob_mat[1]))]
63
+ d2g_dt2_list = ((self.jacob_mat[2].T[a] - self.jacob_mat[0].T[a]) * self.jacob_mat[1].T[j]) / ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a]))
64
+ d2g_dt2 = np.sum(d2g_dt2_list)
65
+
66
+ elif i == b and b != j and a == j:
67
+ #d2g_dt2_list = [(((self.jacob_mat[2][n][b] - self.jacob_mat[1][n][b]) * self.jacob_mat[1][n][a]) - ((self.jacob_mat[2][n][b] - self.jacob_mat[1][n][b]) * self.jacob_mat[0][n][a])) / ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a])) for n in range(len(self.jacob_mat[1]))]
68
+ d2g_dt2_list = (((self.jacob_mat[2].T[b] - self.jacob_mat[1].T[b]) * self.jacob_mat[1].T[a]) - ((self.jacob_mat[2].T[b] - self.jacob_mat[1].T[b]) * self.jacob_mat[0].T[a])) / ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a]))
69
+ d2g_dt2 = np.sum(d2g_dt2_list)
70
+
71
+ elif b != i and a == b and b == j:
72
+ d2g_dt2_list = ((self.jacob_mat[2].T[a] - self.jacob_mat[0].T[a]) * self.jacob_mat[1].T[i]) / ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a]))
73
+ d2g_dt2 = np.sum(d2g_dt2_list)
74
+ else:
75
+ #d2g_dt2_list = [(((self.jacob_mat[2][n][b] - self.jacob_mat[1][n][b]) * self.jacob_mat[1][n][a]) - ((self.jacob_mat[2][n][b] - self.jacob_mat[1][n][b]) * self.jacob_mat[0][n][a]))/ ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a])) for n in range(len(self.jacob_mat[1]))]
76
+ d2g_dt2_list = (((self.jacob_mat[2].T[b] - self.jacob_mat[1].T[b]) * self.jacob_mat[1].T[a]) - ((self.jacob_mat[2].T[b] - self.jacob_mat[1].T[b]) * self.jacob_mat[0].T[a]))/ ((self.geod_mat[2][a] - self.geod_mat[1][a]) * (self.geod_mat[1][a] - self.geod_mat[0][a]))
77
+
78
+ d2g_dt2 = np.sum(d2g_dt2_list)
79
+ return d2g_dt2
80
+
81
+
82
+
83
+ def calc_Riemann_inv_1st_derivative_metric(self, i, j, a):
84
+ #dg_inv_dt_list = [((1/self.jacob_mat[2][n][i]) * (1/self.jacob_mat[2][n][j]) - (1/self.jacob_mat[0][n][i]) * (1/self.jacob_mat[0][n][j])) / (self.geod_mat[2][a] - self.geod_mat[0][a]) for n in range(len(self.jacob_mat[1]))]
85
+ dg_inv_dt_list = ((1/self.jacob_mat[2].T[i]) * (1/self.jacob_mat[2].T[j]) - (1/self.jacob_mat[0].T[i]) * (1/self.jacob_mat[0].T[j])) / (self.geod_mat[2][a] - self.geod_mat[0][a])
86
+
87
+ return np.sum(dg_inv_dt_list)
88
+
89
+
90
+ def calc_Christoffel_symbol(self, a, b, c):#Γ_a_bc
91
+ #tmp_array = np.arange(0, len(self.jacob_mat[0]), 1)
92
+ #a_array = np.ones(len(self.jacob_mat[0])) * a
93
+ #b_array = np.ones(len(self.jacob_mat[0])) * b
94
+ #c_array = np.ones(len(self.jacob_mat[0])) * c
95
+ #one_array = np.ones(len(self.jacob_mat[0]))
96
+
97
+ christoffel_symbol_list = [0.5 * (self.calc_Riemann_inv_metric(1, a, i) * (self.calc_Riemann_1st_derivative_metric(i, b, c) + self.calc_Riemann_1st_derivative_metric(i, c, b) - self.calc_Riemann_1st_derivative_metric(b, c, i))) for i in range(len(self.jacob_mat[0]))]
98
+ #christoffel_symbol_list = 0.5 * (self.calc_Riemann_inv_metric(one_array, a_array, tmp_array) * (self.calc_Riemann_1st_derivative_metric(tmp_array, b_array, c_array) + self.calc_Riemann_1st_derivative_metric(tmp_array, c_array, b_array) - self.calc_Riemann_1st_derivative_metric(b_array, c_array, tmp_array)))
99
+
100
+ return sum(christoffel_symbol_list)
101
+
102
+ def calc_1st_derivative_Christoffel_symbol(self, a, b, c, d):#dΓ_a_bc/dζ_d
103
+ first_derivative_christoffel_symbol_list = [0.5 * (self.calc_Riemann_inv_1st_derivative_metric(a, i, d) * (self.calc_Riemann_1st_derivative_metric(i, b, c) + self.calc_Riemann_1st_derivative_metric(i, c, b) - self.calc_Riemann_1st_derivative_metric(b, c, i)) + self.calc_Riemann_inv_metric(1, a, i) * (self.calc_Riemann_2nd_derivative_metric(i, b, c, d) + self.calc_Riemann_2nd_derivative_metric(i, c, b, d) - self.calc_Riemann_2nd_derivative_metric(b, c, i, d))) for i in range(len(self.jacob_mat[0]))]
104
+
105
+
106
+ return sum(first_derivative_christoffel_symbol_list)
107
+
108
+ def calc_Riemann_curvature_tensor(self, a, b, c, d):#R_a_bcd
109
+ riemann_curvature = self.calc_1st_derivative_Christoffel_symbol(a, c, d, b) - self.calc_1st_derivative_Christoffel_symbol(a, b, d, c)
110
+
111
+ tmp_list = [self.calc_Christoffel_symbol(i, c, d) * self.calc_Christoffel_symbol(a, b, i) -1 * self.calc_Christoffel_symbol(i, b, d) * self.calc_Christoffel_symbol(a, c, i) for i in range(len(self.jacob_mat[0]))]
112
+ riemann_curvature += sum(tmp_list)
113
+ return riemann_curvature
114
+
115
+ def calc_Ricci_curvature(self):
116
+ size = len(self.jacob_mat[0])
117
+ ricci_scalar = sum(self.calc_Riemann_inv_metric(1, i, j) * self.calc_Riemann_curvature_tensor(n, i, n, j) for n in range(size) for i in range(size) for j in range(size))
118
+ return ricci_scalar
119
+
120
+ #------------
121
+ #This implementation must be wrong.
122
+ #------------
123
+ class CalculationCurvature:
124
+ def __init__(self, file_directory):
125
+ self.BPA_FOLDER_DIRECTORY = file_directory
126
+ self.dummy_args_electric_charge_and_multiplicity = [0, 1]
127
+ return
128
+
129
+ def main(self):
130
+ print("Calculate Ricci scalar of calculated aprrox. reaction path.")
131
+ file_list = sorted(glob.glob(self.BPA_FOLDER_DIRECTORY+"samples_*_[0-9]/*.xyz")) + sorted(glob.glob(self.BPA_FOLDER_DIRECTORY+"samples_*_[0-9][0-9]/*.xyz")) + sorted(glob.glob(self.BPA_FOLDER_DIRECTORY+"samples_*_[0-9][0-9][0-9]/*.xyz")) + sorted(glob.glob(self.BPA_FOLDER_DIRECTORY+"samples_*_[0-9][0-9][0-9][0-9]/*.xyz")) + sorted(glob.glob(self.BPA_FOLDER_DIRECTORY+"samples_*_[0-9][0-9][0-9][0-9][0-9]/*.xyz")) + sorted(glob.glob(self.BPA_FOLDER_DIRECTORY+"samples_*_[0-9][0-9][0-9][0-9][0-9][0-9]/*.xyz"))
132
+ step_num = len(file_list)
133
+
134
+ rxn_path_ricci_curvature_list = []
135
+ num_list = []
136
+
137
+
138
+
139
+ for i in range(2, step_num - 3):
140
+ print("# NODE", i)
141
+ mFIO = FileIO(self.BPA_FOLDER_DIRECTORY, file_list[i-1])
142
+ FIO = FileIO(self.BPA_FOLDER_DIRECTORY, file_list[i])
143
+ pFIO = FileIO(self.BPA_FOLDER_DIRECTORY, file_list[i+1])
144
+ p2FIO = FileIO(self.BPA_FOLDER_DIRECTORY, file_list[i+2])
145
+ m_geometry_list, element_list, _ = mFIO.make_geometry_list(self.dummy_args_electric_charge_and_multiplicity)
146
+ geometry_list, element_list, _ = FIO.make_geometry_list(self.dummy_args_electric_charge_and_multiplicity)
147
+ p_geometry_list, element_list, _ = pFIO.make_geometry_list(self.dummy_args_electric_charge_and_multiplicity)
148
+ p2_geometry_list, element_list, _ = p2FIO.make_geometry_list(self.dummy_args_electric_charge_and_multiplicity)
149
+ m_geom_num_list = []
150
+ geom_num_list = []
151
+ p_geom_num_list = []
152
+ p2_geom_num_list = []
153
+
154
+ for j in range(len(element_list)):
155
+ m_geom_num_list.append(m_geometry_list[0][j+1][1:4])
156
+ geom_num_list.append(geometry_list[0][j+1][1:4])
157
+ p_geom_num_list.append(p_geometry_list[0][j+1][1:4])
158
+ p2_geom_num_list.append(p2_geometry_list[0][j+1][1:4])
159
+ p_geom_num_list = np.array(p_geom_num_list, dtype="float64")
160
+ p2_geom_num_list = np.array(p2_geom_num_list, dtype="float64")
161
+ geom_num_list = np.array(geom_num_list, dtype="float64")
162
+ m_geom_num_list = np.array(m_geom_num_list, dtype="float64")
163
+
164
+ if i == 2:
165
+ base_geodesic_dist_mat = geom_num_list.reshape(len(element_list)*3, 1) * 0.0
166
+ base_euclidean_mat = geom_num_list.reshape(len(element_list)*3, 1) * 0.0
167
+
168
+ m_geodesic_dist_mat = Calculationtools().calc_geodesic_distance(m_geom_num_list, geom_num_list).reshape(len(element_list)*3, 1) + base_geodesic_dist_mat
169
+ geodesic_dist_mat = Calculationtools().calc_geodesic_distance(geom_num_list, p_geom_num_list).reshape(len(element_list)*3, 1) + m_geodesic_dist_mat
170
+ p_geodesic_dist_mat = Calculationtools().calc_geodesic_distance(p_geom_num_list, p2_geom_num_list).reshape(len(element_list)*3, 1) + geodesic_dist_mat
171
+
172
+ m_euclidean_dist_mat = Calculationtools().calc_euclidean_distance(m_geom_num_list, geom_num_list).reshape(len(element_list)*3, 1) + base_euclidean_mat
173
+ euclidean_dist_mat = Calculationtools().calc_euclidean_distance(geom_num_list, p_geom_num_list).reshape(len(element_list)*3, 1) + m_euclidean_dist_mat
174
+ p_euclidean_dist_mat = Calculationtools().calc_euclidean_distance(p_geom_num_list, p2_geom_num_list).reshape(len(element_list)*3, 1) + euclidean_dist_mat
175
+
176
+ m_jacob_mat = Calculationtools().gen_n_dinensional_rot_matrix(m_geodesic_dist_mat, m_euclidean_dist_mat)
177
+ jacob_mat = Calculationtools().gen_n_dinensional_rot_matrix(geodesic_dist_mat, euclidean_dist_mat)
178
+ p_jacob_mat = Calculationtools().gen_n_dinensional_rot_matrix(p_geodesic_dist_mat, p_euclidean_dist_mat)
179
+
180
+ three_geodesic_dist_mat = [m_geodesic_dist_mat, geodesic_dist_mat, p_geodesic_dist_mat]
181
+ three_euclidean_dist_mat = [m_euclidean_dist_mat, euclidean_dist_mat, p_euclidean_dist_mat]
182
+ three_jacobian_mat = [m_jacob_mat, jacob_mat, p_jacob_mat]
183
+
184
+ RPRC = ReactionPathRicciCurvature(three_jacobian_mat, three_geodesic_dist_mat, three_euclidean_dist_mat)
185
+
186
+ ricci_curvature = RPRC.calc_Ricci_curvature()
187
+ print("Ricci curvature:", ricci_curvature)
188
+ rxn_path_ricci_curvature_list.append(ricci_curvature)
189
+ num_list.append(i)
190
+ base_geodesic_dist_mat = m_geodesic_dist_mat
191
+ base_euclidean_mat = m_euclidean_dist_mat
192
+
193
+ rxn_path_ricci_curvature_list = np.array(rxn_path_ricci_curvature_list, dtype="float64")
194
+ num_list = np.array(num_list)
195
+ G = Graph(self.BPA_FOLDER_DIRECTORY)
196
+ G.single_plot(num_list, rxn_path_ricci_curvature_list, "", 0, axis_name_1="ITR. ", axis_name_2="Ricci_curvature", name="Ricci_curvature_R")
197
+ G.single_plot(num_list, np.log10(np.abs(rxn_path_ricci_curvature_list)), "", 0, axis_name_1="ITR. ", axis_name_2="Ricci_curvature (log10|R|)", name="Ricci_curvature_logR")
198
+
199
+ with open(self.BPA_FOLDER_DIRECTORY+"ricci_curvature.csv", "w") as f:
200
+ f.write("iter., Ricci curvature R\n")
201
+ for i in range(len(num_list)):
202
+ f.write(str(num_list[i])+","+str(float(rxn_path_ricci_curvature_list[i]))+"\n")
203
+
204
+ return
205
+
206
+ def main_for_neb(self, geometry_list):
207
+ #TODO: implementation for neb method
208
+ return