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,352 @@
1
+ import glob
2
+ import os
3
+ import copy
4
+
5
+ import numpy as np
6
+ from abc import ABC, abstractmethod
7
+
8
+
9
+ try:
10
+ from tblite.interface import Calculator
11
+ except:
12
+ pass
13
+
14
+ from multioptpy.Utils.calc_tools import Calculationtools
15
+ from multioptpy.Parameters.parameter import UnitValueLib, element_number
16
+ from multioptpy.fileio import xyz2list
17
+ from multioptpy.Visualization.visualization import NEBVisualizer
18
+ """
19
+
20
+ GFN2-xTB(tblite)
21
+ J. Chem. Theory Comput. 2019, 15, 3, 1652–1671
22
+ GFN1-xTB(tblite, dxtb)
23
+ J. Chem. Theory Comput. 2017, 13, 5, 1989–2009
24
+ """
25
+ class Calculation:
26
+ def __init__(self, **kwarg):
27
+ UVL = UnitValueLib()
28
+
29
+ self.bohr2angstroms = UVL.bohr2angstroms
30
+
31
+ self.START_FILE = kwarg["START_FILE"]
32
+ self.N_THREAD = kwarg["N_THREAD"]
33
+ self.SET_MEMORY = kwarg["SET_MEMORY"]
34
+ self.FUNCTIONAL = kwarg["FUNCTIONAL"]
35
+ self.FC_COUNT = kwarg["FC_COUNT"]
36
+ self.BPA_FOLDER_DIRECTORY = kwarg["BPA_FOLDER_DIRECTORY"]
37
+ self.Model_hess = kwarg["Model_hess"]
38
+ self.unrestrict = kwarg["unrestrict"]
39
+ self.dft_grid = kwarg["dft_grid"]
40
+ self.hessian_flag = False
41
+ self.cpcm_solv_model = None
42
+ self.alpb_solv_model = None
43
+
44
+ def numerical_hessian(self, geom_num_list, element_list, method, electric_charge_and_multiplicity):#geom_num_list: 3*N (Bohr)
45
+ numerical_delivative_delta = 0.0001
46
+
47
+ count = 0
48
+ hessian = np.zeros((3*len(geom_num_list), 3*len(geom_num_list)))
49
+ for atom_num in range(len(geom_num_list)):
50
+ for i in range(3):
51
+ for atom_num_2 in range(len(geom_num_list)):
52
+ for j in range(3):
53
+ tmp_grad = []
54
+ if count > 3 * atom_num_2 + j:
55
+ continue
56
+
57
+ for direction in [1, -1]:
58
+ geom_num_list = np.array(geom_num_list, dtype="float64")
59
+ max_scf_iteration = len(element_list) * 50 + 1000
60
+ copy_geom_num_list = copy.copy(geom_num_list)
61
+ copy_geom_num_list[atom_num][i] += direction * numerical_delivative_delta
62
+
63
+ if int(electric_charge_and_multiplicity[1]) > 1 or self.unrestrict:
64
+ calc = Calculator(method, element_list, copy_geom_num_list, charge=int(electric_charge_and_multiplicity[0]), uhf=int(electric_charge_and_multiplicity[1]))
65
+ else:
66
+ calc = Calculator(method, element_list, copy_geom_num_list, charge=int(electric_charge_and_multiplicity[0]))
67
+
68
+ calc.set("max-iter", max_scf_iteration)
69
+ calc.set("verbosity", 0)
70
+ if not self.cpcm_solv_model is None:
71
+ calc.add("cpcm-solvation", self.cpcm_solv_model)
72
+ if not self.alpb_solv_model is None:
73
+ calc.add("alpb-solvation", self.alpb_solv_model)
74
+ res = calc.singlepoint()
75
+ g = res.get("gradient") #hartree/Bohr
76
+ tmp_grad.append(g[atom_num_2][j])
77
+
78
+ hessian[3*atom_num+i][3*atom_num_2+j] = (tmp_grad[0] - tmp_grad[1]) / (2*numerical_delivative_delta)
79
+ hessian[3*atom_num_2+j][3*atom_num+i] = (tmp_grad[0] - tmp_grad[1]) / (2*numerical_delivative_delta)
80
+
81
+ count += 1
82
+
83
+
84
+ return hessian
85
+
86
+ def single_point(self, file_directory, element_number_list, iter, electric_charge_and_multiplicity, method, geom_num_list=None):
87
+ """execute extended tight binding method calclation."""
88
+ gradient_list = []
89
+ energy_list = []
90
+ geometry_num_list = []
91
+ geometry_optimized_num_list = []
92
+ finish_frag = False
93
+
94
+ if type(element_number_list[0]) is str:
95
+ tmp = copy.copy(element_number_list)
96
+ element_number_list = []
97
+
98
+ for elem in tmp:
99
+ element_number_list.append(element_number(elem))
100
+ element_number_list = np.array(element_number_list)
101
+
102
+ try:
103
+ os.mkdir(file_directory)
104
+ except:
105
+ pass
106
+
107
+ if file_directory is None:
108
+ file_list = ["dummy"]
109
+ else:
110
+ file_list = glob.glob(file_directory+"/*_[0-9].xyz")
111
+
112
+ for num, input_file in enumerate(file_list):
113
+ try:
114
+ if geom_num_list is None:
115
+
116
+ positions, _, electric_charge_and_multiplicity = xyz2list(input_file, electric_charge_and_multiplicity)
117
+
118
+ else:
119
+ positions = geom_num_list
120
+
121
+ positions = np.array(positions, dtype="float64") / self.bohr2angstroms
122
+ max_scf_iteration = len(element_number_list) * 50 + 1000
123
+ if int(electric_charge_and_multiplicity[1]) > 1:
124
+
125
+ calc = Calculator(method, element_number_list, positions, charge=int(electric_charge_and_multiplicity[0]), uhf=int(electric_charge_and_multiplicity[1]))
126
+ else:
127
+ calc = Calculator(method, element_number_list, positions, charge=int(electric_charge_and_multiplicity[0]))
128
+
129
+ calc.set("max-iter", max_scf_iteration)
130
+ calc.set("verbosity", 0)
131
+ calc.set("save-integrals", 1)
132
+ if not self.cpcm_solv_model is None:
133
+ print("Apply CPCM solvation model")
134
+ calc.add("cpcm-solvation", self.cpcm_solv_model)
135
+ if not self.alpb_solv_model is None:
136
+ print("Apply ALPB solvation model")
137
+ calc.add("alpb-solvation", self.alpb_solv_model)
138
+
139
+ res = calc.singlepoint()
140
+
141
+ e = float(res.get("energy")) #hartree
142
+ g = res.get("gradient") #hartree/Bohr
143
+
144
+ self.orbital_coefficients = copy.deepcopy(res.get("orbital-coefficients"))
145
+ self.overlap_matrix = copy.deepcopy(res.get("overlap-matrix"))
146
+ self.density_matrix = copy.deepcopy(res.get("density-matrix"))
147
+ self.orbital_energies = copy.deepcopy(res.get("orbital-energies"))
148
+ self.orbital_occupations = copy.deepcopy(res.get("orbital-occupations"))
149
+ self.charges = copy.deepcopy(res.get("charges"))
150
+
151
+ #print("Orbital_energies :", self.orbital_energies)
152
+ #print("Orbital_occupations :", self.orbital_occupations)
153
+ tmp = list(map(str, self.orbital_energies.tolist()))
154
+ with open(self.BPA_FOLDER_DIRECTORY+"orbital-energies.csv" ,"a") as f:
155
+ f.write(",".join(tmp)+"\n")
156
+ tmp = list(map(str, self.orbital_occupations.tolist()))
157
+ with open(self.BPA_FOLDER_DIRECTORY+"orbital_occupations.csv" ,"a") as f:
158
+ f.write(",".join(tmp)+"\n")
159
+ tmp = list(map(str, self.charges.tolist()))
160
+ with open(self.BPA_FOLDER_DIRECTORY+"charges.csv" ,"a") as f:
161
+ f.write(",".join(tmp)+"\n")
162
+
163
+ if self.FC_COUNT == -1 or type(iter) is str:
164
+ if self.hessian_flag:
165
+ self.exact_hessian(element_number_list, electric_charge_and_multiplicity, method, positions)
166
+
167
+
168
+ elif iter % self.FC_COUNT == 0 or self.hessian_flag:
169
+ self.exact_hessian(element_number_list, electric_charge_and_multiplicity, method, positions)
170
+
171
+ except Exception as error:
172
+ print(error)
173
+ print("This molecule could not be optimized.")
174
+ print("Input file: ",file_list,"\n")
175
+ finish_frag = True
176
+ return np.array([0]), np.array([0]), positions, finish_frag
177
+
178
+ self.energy = e
179
+ self.gradient = g
180
+ self.coordinate = positions
181
+
182
+ return e, g, positions, finish_frag
183
+
184
+ def exact_hessian(self, element_number_list, electric_charge_and_multiplicity, method, positions):
185
+ """exact numerical hessian"""
186
+ exact_hess = self.numerical_hessian(positions, element_number_list, method, electric_charge_and_multiplicity)
187
+
188
+ #eigenvalues, _ = np.linalg.eigh(exact_hess)
189
+ #print("=== hessian (before add bias potential) ===")
190
+ #print("eigenvalues: ", eigenvalues)
191
+
192
+ exact_hess = Calculationtools().project_out_hess_tr_and_rot_for_coord(exact_hess, element_number_list.tolist(), positions, display_eigval=False)
193
+ self.Model_hess = exact_hess
194
+
195
+ def single_point_no_directory(self, positions, element_number_list, electric_charge_and_multiplicity, method):#positions:Bohr
196
+ """execute extended tight binding method calclation."""
197
+ gradient_list = []
198
+ energy_list = []
199
+ geometry_num_list = []
200
+ geometry_optimized_num_list = []
201
+ finish_frag = False
202
+
203
+ if type(element_number_list[0]) is str:
204
+ tmp = copy.copy(element_number_list)
205
+ element_number_list = []
206
+
207
+ for elem in tmp:
208
+ element_number_list.append(element_number(elem))
209
+ element_number_list = np.array(element_number_list)
210
+
211
+
212
+ try:
213
+
214
+ positions = np.array(positions, dtype="float64")
215
+ max_scf_iteration = len(element_number_list) * 50 + 1000
216
+ if int(electric_charge_and_multiplicity[1]) > 1:
217
+ calc = Calculator(method, element_number_list, positions, charge=int(electric_charge_and_multiplicity[0]), uhf=int(electric_charge_and_multiplicity[1]))
218
+ else:
219
+ calc = Calculator(method, element_number_list, positions, charge=int(electric_charge_and_multiplicity[0]))
220
+
221
+ calc.set("max-iter", max_scf_iteration)
222
+ calc.set("verbosity", 0)
223
+ calc.set("save-integrals", 1)
224
+
225
+ res = calc.singlepoint()
226
+
227
+ e = float(res.get("energy")) #hartree
228
+ g = res.get("gradient") #hartree/Bohr
229
+ self.orbital_coefficients = res.get("orbital-coefficients")
230
+ self.overlap_matrix = res.get("overlap-matrix")
231
+ self.density_matrix = res.get("density-matrix")
232
+ self.orbital_energies = copy.deepcopy(res.get("orbital-energies"))
233
+ print("\n")
234
+
235
+ except Exception as error:
236
+ print(error)
237
+ print("This molecule could not be optimized.")
238
+ finish_frag = True
239
+ return np.array([0]), np.array([0]), finish_frag
240
+
241
+ self.energy = e
242
+ self.gradient = g
243
+
244
+ return e, g, finish_frag
245
+
246
+
247
+ class CalculationEngine(ABC):
248
+ """Base class for calculation engines"""
249
+
250
+ @abstractmethod
251
+ def calculate(self, file_directory, optimize_num, pre_total_velocity, config):
252
+ """Calculate energy and gradients"""
253
+ pass
254
+
255
+ def _get_file_list(self, file_directory):
256
+ """Get list of input files"""
257
+ return sum([sorted(glob.glob(os.path.join(file_directory, f"*_" + "[0-9]" * i + ".xyz")))
258
+ for i in range(1, 7)], [])
259
+
260
+ def _process_visualization(self, energy_list, gradient_list, num_list, optimize_num, config):
261
+ """Process common visualization tasks"""
262
+ try:
263
+ if config.save_pict:
264
+ visualizer = NEBVisualizer(config)
265
+ tmp_ene_list = np.array(energy_list, dtype="float64") * config.hartree2kcalmol
266
+ visualizer.plot_energy(num_list, tmp_ene_list - tmp_ene_list[0], optimize_num)
267
+ print("energy graph plotted.")
268
+
269
+ gradient_norm_list = [np.sqrt(np.linalg.norm(g)**2/(len(g)*3)) for g in gradient_list]
270
+ visualizer.plot_gradient(num_list, gradient_norm_list, optimize_num)
271
+ print("gradient graph plotted.")
272
+ except Exception as e:
273
+ print(f"Visualization error: {e}")
274
+
275
+
276
+
277
+
278
+ class TBLiteEngine(CalculationEngine):
279
+ """TBLite (extended tight binding) calculation engine"""
280
+
281
+ def calculate(self, file_directory, optimize_num, pre_total_velocity, config):
282
+ gradient_list = []
283
+ energy_list = []
284
+ geometry_num_list = []
285
+ gradient_norm_list = []
286
+ delete_pre_total_velocity = []
287
+ num_list = []
288
+ method = config.usextb
289
+
290
+ os.makedirs(file_directory, exist_ok=True)
291
+ file_list = self._get_file_list(file_directory)
292
+
293
+ # Get element number list from the first file
294
+ geometry_list_tmp, element_list, _ = xyz2list(file_list[0], None)
295
+ element_number_list = []
296
+ for elem in element_list:
297
+ element_number_list.append(element_number(elem))
298
+ element_number_list = np.array(element_number_list, dtype="int")
299
+
300
+ for num, input_file in enumerate(file_list):
301
+ try:
302
+ print(input_file)
303
+
304
+ positions, _, electric_charge_and_multiplicity = xyz2list(input_file, None)
305
+
306
+ positions = np.array(positions, dtype="float64") / config.bohr2angstroms
307
+ if int(electric_charge_and_multiplicity[1]) > 1 or config.unrestrict:
308
+ calc = Calculator(method, element_number_list, positions,
309
+ charge=int(electric_charge_and_multiplicity[0]),
310
+ uhf=int(electric_charge_and_multiplicity[1]))
311
+ else:
312
+ calc = Calculator(method, element_number_list, positions,
313
+ charge=int(electric_charge_and_multiplicity[0]))
314
+ calc.set("max-iter", 500)
315
+ calc.set("verbosity", 0)
316
+ if not config.cpcm_solv_model is None:
317
+ print("Apply CPCM solvation model")
318
+ calc.add("cpcm-solvation", config.cpcm_solv_model)
319
+ if not config.alpb_solv_model is None:
320
+ print("Apply ALPB solvation model")
321
+ calc.add("alpb-solvation", config.alpb_solv_model)
322
+
323
+ res = calc.singlepoint()
324
+ e = float(res.get("energy")) # hartree
325
+ g = res.get("gradient") # hartree/Bohr
326
+
327
+ print("\n")
328
+ energy_list.append(e)
329
+ gradient_list.append(g)
330
+ gradient_norm_list.append(np.sqrt(np.linalg.norm(g)**2/(len(g)*3))) # RMS
331
+ geometry_num_list.append(positions)
332
+ num_list.append(num)
333
+ except Exception as error:
334
+ print(error)
335
+ print("This molecule could not be optimized.")
336
+ if optimize_num != 0:
337
+ delete_pre_total_velocity.append(num)
338
+
339
+ self._process_visualization(energy_list, gradient_list, num_list, optimize_num, config)
340
+
341
+ if optimize_num != 0 and len(pre_total_velocity) != 0:
342
+ pre_total_velocity = np.array(pre_total_velocity, dtype="float64")
343
+ pre_total_velocity = pre_total_velocity.tolist()
344
+ for i in sorted(delete_pre_total_velocity, reverse=True):
345
+ pre_total_velocity.pop(i)
346
+ pre_total_velocity = np.array(pre_total_velocity, dtype="float64")
347
+
348
+ return (np.array(energy_list, dtype="float64"),
349
+ np.array(gradient_list, dtype="float64"),
350
+ np.array(geometry_num_list, dtype="float64"),
351
+ pre_total_velocity)
352
+