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,103 @@
1
+
2
+
3
+
4
+
5
+
6
+ class D4Parameters:
7
+ """Parameters class for D4 dispersion correction"""
8
+ def __init__(self, s6=1.0, s8=1.03683, s9=1.0, a1=0.4171, a2=4.5337):
9
+ # Default parameters for PBE0/def2-QZVP
10
+ self.s6 = s6 # Scaling constant for C6 term (typically 1.0)
11
+ self.s8 = s8 # Scaling constant for C8 term
12
+ self.s9 = s9 # Scaling constant for three-body term
13
+ self.a1 = a1 # Parameter for damping function of C6 term
14
+ self.a2 = a2 # Parameter for damping function of C8 term
15
+
16
+ # Charge scaling constants
17
+ self.ga = 3.0 # Charge scaling factor
18
+ self.gc = 2.0 # Three-body charge scaling factor
19
+
20
+ # Reference polarizabilities based on PBE0/def2-QZVP calculations
21
+ self.ref_polarizabilities = {
22
+ 'H': 4.50, 'He': 1.38,
23
+ 'Li': 164.20, 'Be': 38.40, 'B': 21.10, 'C': 12.00, 'N': 7.40, 'O': 5.40, 'F': 3.80, 'Ne': 2.67,
24
+ 'Na': 162.70, 'Mg': 71.00, 'Al': 57.80, 'Si': 37.00, 'P': 25.00, 'S': 19.60, 'Cl': 15.00, 'Ar': 11.10,
25
+ 'K': 292.80, 'Ca': 160.80, 'Sc': 120.00, 'Ti': 98.00, 'V': 84.00, 'Cr': 72.00, 'Mn': 63.00, 'Fe': 56.00,
26
+ 'Co': 50.00, 'Ni': 44.00, 'Cu': 42.00, 'Zn': 40.00, 'Ga': 60.00, 'Ge': 41.00, 'As': 29.00, 'Se': 25.00,
27
+ 'Br': 20.00, 'Kr': 16.80, 'Rb': 320.20, 'Sr': 199.30, 'Y': 126.70, 'Zr': 119.97, 'Nb': 101.60,
28
+ 'Mo': 88.42, 'Tc': 80.08, 'Ru': 65.89, 'Rh': 56.10, 'Pd': 23.68, 'Ag': 46.00, 'Cd': 39.72,
29
+ 'In': 70.22, 'Sn': 55.95, 'Sb': 43.67, 'Te': 37.65, 'I': 35.00, 'Xe': 27.30
30
+ }
31
+
32
+ # r4/r2 values from tad-dftd3 library
33
+ self.r4r2_values = {
34
+ # H, He
35
+ 'H': 8.0589, 'He': 3.4698,
36
+ # Li-Ne
37
+ 'Li': 29.0974, 'Be': 14.8517, 'B': 11.8799, 'C': 7.8715, 'N': 5.5588,
38
+ 'O': 4.7566, 'F': 3.8025, 'Ne': 3.1036,
39
+ # Na-Ar
40
+ 'Na': 26.1552, 'Mg': 17.2304, 'Al': 17.7210, 'Si': 12.7442, 'P': 9.5361,
41
+ 'S': 8.1652, 'Cl': 6.7463, 'Ar': 5.6004,
42
+ # K, Ca
43
+ 'K': 29.2012, 'Ca': 22.3934,
44
+ # Sc-Zn
45
+ 'Sc': 19.0598, 'Ti': 16.8590, 'V': 15.4023, 'Cr': 12.5589, 'Mn': 13.4788,
46
+ 'Fe': 12.2309, 'Co': 11.2809, 'Ni': 10.5569, 'Cu': 10.1428, 'Zn': 9.4907,
47
+ # Ga-Kr
48
+ 'Ga': 13.4606, 'Ge': 10.8544, 'As': 8.9386, 'Se': 8.1350, 'Br': 7.1251, 'Kr': 6.1971,
49
+ # Rb, Sr
50
+ 'Rb': 30.0162, 'Sr': 24.4103,
51
+ # Y-Cd
52
+ 'Y': 20.3537, 'Zr': 17.4780, 'Nb': 13.5528, 'Mo': 11.8451, 'Tc': 11.0355,
53
+ 'Ru': 10.1997, 'Rh': 9.5414, 'Pd': 9.0061, 'Ag': 8.6417, 'Cd': 8.9975,
54
+ # In-Xe
55
+ 'In': 14.0834, 'Sn': 11.8333, 'Sb': 10.0179, 'Te': 9.3844, 'I': 8.4110, 'Xe': 7.5152,
56
+ # Cs, Ba
57
+ 'Cs': 32.7622, 'Ba': 27.5708
58
+ }
59
+
60
+ # Electronegativity values used for charge scaling
61
+ self.electronegativity = {
62
+ 'H': 2.20, 'He': 0.00,
63
+ 'Li': 0.98, 'Be': 1.57, 'B': 2.04, 'C': 2.55, 'N': 3.04, 'O': 3.44, 'F': 3.98, 'Ne': 0.00,
64
+ 'Na': 0.93, 'Mg': 1.31, 'Al': 1.61, 'Si': 1.90, 'P': 2.19, 'S': 2.58, 'Cl': 3.16, 'Ar': 0.00,
65
+ 'K': 0.82, 'Ca': 1.00, 'Sc': 1.36, 'Ti': 1.54, 'V': 1.63, 'Cr': 1.66, 'Mn': 1.55, 'Fe': 1.83,
66
+ 'Co': 1.88, 'Ni': 1.91, 'Cu': 1.90, 'Zn': 1.65, 'Ga': 1.81, 'Ge': 2.01, 'As': 2.18, 'Se': 2.55,
67
+ 'Br': 2.96, 'Kr': 0.00, 'Rb': 0.82, 'Sr': 0.95, 'Y': 1.22, 'Zr': 1.33, 'Nb': 1.60, 'Mo': 2.16,
68
+ 'Tc': 1.90, 'Ru': 2.20, 'Rh': 2.28, 'Pd': 2.20, 'Ag': 1.93, 'Cd': 1.69, 'In': 1.78, 'Sn': 1.96,
69
+ 'Sb': 2.05, 'Te': 2.10, 'I': 2.66, 'Xe': 0.00, 'Cs': 0.79, 'Ba': 0.89
70
+ }
71
+
72
+ # Reference coordination numbers for different hybridization states
73
+ self.ref_cn = {
74
+ 'H': [0.0, 1.0],
75
+ 'C': [0.0, 2.0, 3.0, 4.0],
76
+ 'N': [0.0, 1.0, 2.0, 3.0],
77
+ 'O': [0.0, 1.0, 2.0],
78
+ 'P': [0.0, 1.0, 2.0, 3.0, 4.0, 5.0],
79
+ 'S': [0.0, 1.0, 2.0, 3.0, 4.0, 6.0]
80
+ }
81
+
82
+ # Default values for unlisted elements
83
+ self.default_r4r2 = 10.0
84
+ self.default_polarizability = 20.0
85
+ self.default_electronegativity = 2.0
86
+
87
+ def get_r4r2(self, element):
88
+ """Get r^4/r^2 ratio for each element"""
89
+ if element in self.r4r2_values:
90
+ return self.r4r2_values[element]
91
+ return self.default_r4r2
92
+
93
+ def get_polarizability(self, element):
94
+ """Get reference polarizability for an element"""
95
+ if element in self.ref_polarizabilities:
96
+ return self.ref_polarizabilities[element]
97
+ return self.default_polarizability
98
+
99
+ def get_electronegativity(self, element):
100
+ """Get electronegativity for an element"""
101
+ if element in self.electronegativity:
102
+ return self.electronegativity[element]
103
+ return self.default_electronegativity
@@ -0,0 +1,34 @@
1
+ from multioptpy.Parameters.atomic_number import number_element, element_number
2
+ from multioptpy.Parameters.unit_values import UnitValueLib
3
+
4
+
5
+
6
+ def DREIDING_VDW_distance_lib(element):#https://doi.org/10.1021/j100389a010
7
+ #Atoms for which no parameters exist use UFF parameters
8
+ if element is int:
9
+ element = number_element(element)
10
+ UFF_VDW_distance = {'H':3.195,'He':2.362 ,
11
+ 'Li' : 2.451 ,'Be': 2.745, 'B':4.02 ,'C': 3.8983, 'N':3.6621,'O':3.4046 , 'F':3.4720,'Ne': 3.243,
12
+ 'Na':3.1440,'Mg': 3.021 ,'Al':4.39 ,'Si': 4.27, 'P':4.1500, 'S':4.0300 ,'Cl':3.9503,'Ar':3.868 ,
13
+ 'K':3.812 ,'Ca':3.472 ,'Sc':3.295 ,'Ti':4.5400 ,'V': 3.144, 'Cr':3.023 ,'Mn': 2.961, 'Fe': 4.5400,'Co':2.872 ,'Ni':2.834 ,'Cu':3.495 ,'Zn':4.54 ,'Ga': 4.39,'Ge':4.27,'As':4.15 ,'Se':4.03,'Br':3.95,'Kr':4.141 ,
14
+ 'Rb':4.114 ,'Sr': 3.641,'Y':3.345 ,'Zr':3.124 ,'Nb':3.165 ,'Mo':3.052 ,'Tc':2.998 ,'Ru':4.5400 ,'Rh':2.929 ,'Pd':2.899 ,'Ag':3.148 ,'Cd':2.848 ,'In':4.59 ,'Sn':4.47 ,'Sb':4.35 ,'Te':4.23 , 'I':4.15, 'Xe':4.404 ,
15
+ 'Cs':4.517 ,'Ba':3.703 , 'La':3.522 , 'Ce':3.556 ,'Pr':3.606 ,'Nd':3.575 ,'Pm':3.547 ,'Sm':3.520 ,'Eu':3.493 ,'Gd':3.368 ,'Tb':3.451 ,'Dy':3.428 ,'Ho':3.409 ,'Er':3.391 ,'Tm':3.374 ,'Yb':3.355,'Lu':3.640 ,'Hf': 3.141,
16
+ 'Ta':3.170 ,'W':3.069 ,'Re':2.954 ,'Os':3.120 ,'Ir':2.840 ,'Pt':2.754 ,'Au':3.293 ,'Hg':2.705 ,'Tl':4.347 ,'Pb':4.297 ,'Bi':4.370 ,'Po':4.709 ,'At':4.750 ,'Rn': 4.765}#H...Rn J. Am. Chem. Soc., 1992, 114, 10024 #ang.
17
+
18
+ return UFF_VDW_distance[element] / UnitValueLib().bohr2angstroms#Bohr
19
+
20
+
21
+ def DREIDING_VDW_well_depth_lib(element):
22
+ #Atoms for which no parameters exist use UFF parameters
23
+ if element is int:
24
+ element = number_element(element)
25
+ UFF_VDW_well_depth = {'H':0.044, 'He':0.056 ,
26
+ 'Li':0.025 ,'Be':0.085 ,'B':0.180,'C': 0.105, 'N':0.069, 'O':0.060,'F':0.050,'Ne':0.042 ,
27
+ 'Na':0.030, 'Mg':0.111 ,'Al':0.505 ,'Si': 0.402, 'P':0.305, 'S':0.274, 'Cl':0.227, 'Ar':0.185 ,
28
+ 'K':0.035 ,'Ca':0.238 ,'Sc':0.019 ,'Ti':0.017 ,'V':0.016 , 'Cr':0.015, 'Mn':0.013 ,'Fe': 0.013,'Co':0.014 ,'Ni':0.015 ,'Cu':0.005 ,'Zn':0.124 ,'Ga':0.415 ,'Ge':0.379, 'As':0.309 ,'Se':0.291,'Br':0.251,'Kr':0.220 ,
29
+ 'Rb':0.04 ,'Sr':0.235 ,'Y':0.072 ,'Zr':0.069 ,'Nb':0.059 ,'Mo':0.056 ,'Tc':0.048 ,'Ru':0.056 ,'Rh':0.053 ,'Pd':0.048 ,'Ag':0.036 ,'Cd':0.228 ,'In':0.599 ,'Sn':0.567 ,'Sb':0.449 ,'Te':0.398 , 'I':0.339,'Xe':0.332 ,
30
+ 'Cs':0.045 ,'Ba':0.364 , 'La':0.017 , 'Ce':0.013 ,'Pr':0.010 ,'Nd':0.010 ,'Pm':0.009 ,'Sm':0.008 ,'Eu':0.008 ,'Gd':0.009 ,'Tb':0.007 ,'Dy':0.007 ,'Ho':0.007 ,'Er':0.007 ,'Tm':0.006 ,'Yb':0.228 ,'Lu':0.041 ,'Hf':0.072 ,
31
+ 'Ta':0.081 ,'W':0.067 ,'Re':0.066 ,'Os':0.037 ,'Ir':0.073 ,'Pt':0.080 ,'Au':0.039 ,'Hg':0.385 ,'Tl':0.680 ,'Pb':0.663 ,'Bi':0.518 ,'Po':0.325 ,'At':0.284 ,'Rn':0.248, 'X':0.010}#H...Rn J. Am. Chem. Soc., 1992, 114, 10024 # kcal/mol
32
+
33
+ return UFF_VDW_well_depth[element] / UnitValueLib().hartree2kcalmol #hartree
34
+
@@ -0,0 +1,137 @@
1
+ import numpy as np
2
+
3
+ from multioptpy.Parameters.atomic_number import number_element, element_number
4
+ from multioptpy.Parameters.unit_values import UnitValueLib
5
+
6
+
7
+ class GFN0Parameters:
8
+ """GFN0-xTB model parameters based on official implementation"""
9
+ def __init__(self):
10
+ # Unit conversion
11
+ self.bohr2ang = UnitValueLib().bohr2angstroms
12
+ self.kcalmol2hartree = 1.0 / UnitValueLib().hartree2kcalmol
13
+
14
+ # --- Atomic parameters from gfn0_param.f90 ---
15
+
16
+ # Atomic radii (Bohr)
17
+ self.rad = {
18
+ 'H': 0.75, 'He': 0.75, 'Li': 1.23, 'Be': 1.01, 'B': 0.90, 'C': 0.85, 'N': 0.84,
19
+ 'O': 0.83, 'F': 0.83, 'Ne': 0.75, 'Na': 1.60, 'Mg': 1.40, 'Al': 1.25, 'Si': 1.14,
20
+ 'P': 1.09, 'S': 1.04, 'Cl': 1.00, 'Ar': 0.75, 'K': 1.90, 'Ca': 1.71, 'Sc': 1.48,
21
+ 'Ti': 1.36, 'V': 1.34, 'Cr': 1.22, 'Mn': 1.19, 'Fe': 1.17, 'Co': 1.16, 'Ni': 1.15,
22
+ 'Cu': 1.14, 'Zn': 1.23, 'Ga': 1.25, 'Ge': 1.21, 'As': 1.16, 'Se': 1.14, 'Br': 1.12,
23
+ 'Kr': 0.75, 'Rb': 2.06, 'Sr': 1.85, 'Y': 1.61, 'Zr': 1.48, 'Nb': 1.37, 'Mo': 1.31,
24
+ 'Tc': 1.23, 'Ru': 1.24, 'Rh': 1.24, 'Pd': 1.19, 'Ag': 1.26, 'Cd': 1.36, 'In': 1.47,
25
+ 'Sn': 1.40, 'Sb': 1.39, 'Te': 1.35, 'I': 1.33, 'Xe': 0.75
26
+ }
27
+
28
+ # Electronegativity parameters (Mulliken EN)
29
+ self.en = {
30
+ 'H': 2.20, 'He': 0.00, 'Li': 0.97, 'Be': 1.47, 'B': 2.01, 'C': 2.50, 'N': 3.07,
31
+ 'O': 3.50, 'F': 4.10, 'Ne': 0.00, 'Na': 1.01, 'Mg': 1.23, 'Al': 1.47, 'Si': 1.74,
32
+ 'P': 2.06, 'S': 2.44, 'Cl': 2.83, 'Ar': 0.00, 'K': 0.91, 'Ca': 1.04, 'Sc': 1.20,
33
+ 'Ti': 1.32, 'V': 1.45, 'Cr': 1.56, 'Mn': 1.60, 'Fe': 1.64, 'Co': 1.70, 'Ni': 1.75,
34
+ 'Cu': 1.75, 'Zn': 1.66, 'Ga': 1.82, 'Ge': 2.02, 'As': 2.20, 'Se': 2.48, 'Br': 2.74,
35
+ 'Kr': 0.00, 'Rb': 0.89, 'Sr': 0.99, 'Y': 1.11, 'Zr': 1.22, 'Nb': 1.23, 'Mo': 1.30,
36
+ 'Tc': 1.36, 'Ru': 1.42, 'Rh': 1.45, 'Pd': 1.35, 'Ag': 1.42, 'Cd': 1.46, 'In': 1.49,
37
+ 'Sn': 1.72, 'Sb': 1.82, 'Te': 2.01, 'I': 2.21, 'Xe': 0.00
38
+ }
39
+
40
+ # Charge scaling and interaction parameters
41
+ self.kCN = 2.0 # Charge-scaling exponent
42
+ self.shellPoly = 1.5 # Shell-charge polynomial
43
+
44
+ # GFN0 specific bond parameters
45
+ # Reference bond orders and stretching constants
46
+ self.referenceBondLength = {
47
+ ('C', 'C'): 1.53, ('C', 'N'): 1.42, ('C', 'O'): 1.42, ('C', 'H'): 1.10,
48
+ ('N', 'N'): 1.41, ('N', 'O'): 1.40, ('N', 'H'): 1.03,
49
+ ('O', 'O'): 1.45, ('O', 'H'): 0.98,
50
+ ('H', 'H'): 0.80,
51
+ # Special bonds for cyano groups
52
+ ('C', 'N', 'triple'): 1.16, # C≡N triple bond
53
+ ('C', 'C', 'triple'): 1.20, # C≡C triple bond
54
+ ('C', 'O', 'double'): 1.25, # C=O double bond
55
+ ('C', 'N', 'double'): 1.29, # C=N double bond
56
+ }
57
+
58
+ # Force constant scaling factors for different bond types
59
+ self.bondForceFactors = {
60
+ 'single': 1.0,
61
+ 'aromatic': 1.2,
62
+ 'double': 1.5,
63
+ 'triple': 2.0
64
+ }
65
+
66
+ # Base force constants in mDyne/Å (converted to atomic units)
67
+ self.kStretchBase = 0.35
68
+
69
+ # Angle parameters - natural angles in radians
70
+ self.naturalAngles = {
71
+ 'sp3': 109.5 * np.pi/180, # Tetrahedral
72
+ 'sp2': 120.0 * np.pi/180, # Trigonal planar
73
+ 'sp': 180.0 * np.pi/180 # Linear
74
+ }
75
+
76
+ # Base angle force constants (mDyne·Å/rad²)
77
+ self.kAngleBase = 0.07
78
+
79
+ # Base torsion barriers (kcal/mol)
80
+ self.V2Base = 0.1 * self.kcalmol2hartree
81
+ self.V3Base = 0.01 * self.kcalmol2hartree
82
+
83
+ # Special parameters for CN triple bonds
84
+ self.CNParams = {
85
+ 'kStretch': 0.9, # Stronger force constant for CN triple bond
86
+ 'kBend': 0.15, # Force constant for X-C≡N bending
87
+ 'kTorsion': 0.002 # Very weak torsional barrier
88
+ }
89
+
90
+ def get_radius(self, element):
91
+ """Get atomic radius for an element (in Bohr)"""
92
+ if element in self.rad:
93
+ return self.rad[element]
94
+ return 1.0 # Default radius
95
+
96
+ def get_en(self, element):
97
+ """Get electronegativity for an element"""
98
+ if element in self.en:
99
+ return self.en[element]
100
+ return 2.0 # Default EN
101
+
102
+ def get_bond_length(self, element1, element2, bond_type='single'):
103
+ """Get reference bond length for a given pair of elements and bond type"""
104
+ key = tuple(sorted([element1, element2]))
105
+ if bond_type != 'single':
106
+ key_with_type = key + (bond_type,)
107
+ if key_with_type in self.referenceBondLength:
108
+ return self.referenceBondLength[key_with_type]
109
+
110
+ if key in self.referenceBondLength:
111
+ return self.referenceBondLength[key]
112
+
113
+ # If not found, estimate from radii
114
+ r1 = self.get_radius(element1)
115
+ r2 = self.get_radius(element2)
116
+ bond_length = r1 + r2
117
+
118
+ # Adjust for bond type
119
+ if bond_type == 'double':
120
+ bond_length *= 0.85
121
+ elif bond_type == 'triple':
122
+ bond_length *= 0.78
123
+ elif bond_type == 'aromatic':
124
+ bond_length *= 0.90
125
+
126
+ return bond_length
127
+
128
+ def get_bond_force_constant(self, element1, element2, bond_type='single'):
129
+ """Get bond force constant for a pair of elements and bond type"""
130
+ # Special case for CN triple bond
131
+ if ((element1 == 'C' and element2 == 'N') or
132
+ (element1 == 'N' and element2 == 'C')) and bond_type == 'triple':
133
+ return self.CNParams['kStretch']
134
+
135
+ # Regular case - scale by bond type
136
+ factor = self.bondForceFactors.get(bond_type, 1.0)
137
+ return self.kStretchBase * factor
@@ -0,0 +1,315 @@
1
+ from multioptpy.Parameters.unit_values import UnitValueLib
2
+
3
+
4
+ class GFNFFParameters:
5
+ """Parameters for GFNFF-based approximation Hessian"""
6
+ def __init__(self):
7
+ # Unit conversion
8
+ self.bohr2ang = UnitValueLib().bohr2angstroms # 0.529177
9
+ self.kcalmol2hartree = 1.0 / UnitValueLib().hartree2kcalmol # 1/627.5095
10
+
11
+ # Reference atomic CN
12
+ self.ref_cn = {
13
+ 'H': 1.0, 'C': 4.0, 'N': 3.0, 'O': 2.0, 'F': 1.0, 'Si': 4.0, 'P': 3.0,
14
+ 'S': 2.0, 'Cl': 1.0, 'Br': 1.0, 'I': 1.0
15
+ }
16
+
17
+ # Element radii and vdW parameters (from gfnff_param.f90)
18
+ # Format: [r_cov, r_vdw, en, alpha]
19
+ self.element_params = {
20
+ 'H': [0.32, 1.09, 2.20, 4.5],
21
+ 'He': [0.46, 1.3, 0.00, 1.0],
22
+ 'Li': [1.29, 1.80, 0.98, 164.0],
23
+ 'Be': [0.99, 1.53, 1.57, 38.0],
24
+ 'B': [0.84, 1.92, 2.04, 21.0],
25
+ 'C': [0.75, 1.70, 2.55, 12.0],
26
+ 'N': [0.71, 1.55, 3.04, 7.4],
27
+ 'O': [0.64, 1.52, 3.44, 5.4],
28
+ 'F': [0.60, 1.47, 3.98, 3.8],
29
+ 'Ne': [0.67, 1.54, 0.00, 2.67],
30
+ 'Na': [1.60, 2.27, 0.93, 163.0],
31
+ 'Mg': [1.40, 1.73, 1.31, 71.0],
32
+ 'Al': [1.24, 1.84, 1.61, 60.0],
33
+ 'Si': [1.14, 2.10, 1.90, 37.0],
34
+ 'P': [1.09, 1.80, 2.19, 25.0],
35
+ 'S': [1.04, 1.80, 2.58, 19.6],
36
+ 'Cl': [0.99, 1.75, 3.16, 15.0],
37
+ 'Ar': [0.96, 1.88, 0.00, 11.1],
38
+ 'K': [2.00, 2.75, 0.82, 293.0],
39
+ 'Ca': [1.70, 2.31, 1.00, 161.0],
40
+ 'Sc': [1.44, 2.15, 1.36, 120.0],
41
+ 'Ti': [1.32, 2.11, 1.54, 98.0],
42
+ 'V': [1.22, 2.07, 1.63, 84.0],
43
+ 'Cr': [1.18, 2.06, 1.66, 78.0],
44
+ 'Mn': [1.17, 2.05, 1.55, 63.0],
45
+ 'Fe': [1.17, 2.00, 1.83, 56.0],
46
+ 'Co': [1.16, 2.00, 1.88, 50.0],
47
+ 'Ni': [1.15, 1.97, 1.91, 48.0],
48
+ 'Cu': [1.17, 1.96, 1.90, 42.0],
49
+ 'Zn': [1.25, 2.01, 1.65, 40.0],
50
+ 'Ga': [1.25, 1.87, 1.81, 60.0],
51
+ 'Ge': [1.21, 2.11, 2.01, 41.0],
52
+ 'As': [1.21, 1.85, 2.18, 29.0],
53
+ 'Se': [1.17, 1.90, 2.55, 25.0],
54
+ 'Br': [1.14, 1.83, 2.96, 20.0],
55
+ 'Kr': [1.17, 2.02, 0.00, 16.8],
56
+ 'Rb': [2.15, 3.03, 0.82, 320.0],
57
+ 'Sr': [1.90, 2.49, 0.95, 199.0],
58
+ 'Y': [1.62, 2.40, 1.22, 126.7],
59
+ 'Zr': [1.45, 2.23, 1.33, 119.97],
60
+ 'Nb': [1.34, 2.18, 1.60, 101.603],
61
+ 'Mo': [1.30, 2.17, 2.16, 88.425],
62
+ 'Tc': [1.27, 2.16, 1.90, 80.083],
63
+ 'Ru': [1.25, 2.13, 2.20, 65.895],
64
+ 'Rh': [1.25, 2.10, 2.28, 56.1],
65
+ 'Pd': [1.28, 2.10, 2.20, 23.68],
66
+ 'Ag': [1.34, 2.11, 1.93, 50.6],
67
+ 'Cd': [1.48, 2.18, 1.69, 39.7],
68
+ 'In': [1.44, 1.93, 1.78, 70.2],
69
+ 'Sn': [1.40, 2.17, 1.96, 55.0],
70
+ 'Sb': [1.40, 2.06, 2.05, 43.7],
71
+ 'Te': [1.37, 2.06, 2.10, 37.65],
72
+ 'I': [1.33, 1.98, 2.66, 35.0],
73
+ 'Xe': [1.31, 2.16, 0.00, 27.3],
74
+ 'Cs': [2.38, 3.43, 0.79, 400.0],
75
+ 'Ba': [2.00, 2.68, 0.89, 280.0],
76
+ 'La': [1.80, 2.40, 1.10, 215.0],
77
+ 'Ce': [1.65, 2.35, 1.12, 210.0],
78
+ 'Pr': [1.65, 2.35, 1.13, 205.0],
79
+ 'Nd': [1.64, 2.35, 1.14, 200.0],
80
+ 'Pm': [1.63, 2.35, 1.13, 200.0],
81
+ 'Sm': [1.62, 2.35, 1.17, 180.0],
82
+ 'Eu': [1.85, 2.35, 1.20, 180.0],
83
+ 'Gd': [1.61, 2.35, 1.20, 180.0],
84
+ 'Tb': [1.59, 2.35, 1.20, 180.0],
85
+ 'Dy': [1.59, 2.35, 1.22, 180.0],
86
+ 'Ho': [1.58, 2.35, 1.23, 180.0],
87
+ 'Er': [1.57, 2.35, 1.24, 180.0],
88
+ 'Tm': [1.56, 2.35, 1.25, 180.0],
89
+ 'Yb': [1.70, 2.35, 1.10, 180.0],
90
+ 'Lu': [1.56, 2.35, 1.27, 180.0],
91
+ 'Hf': [1.44, 2.23, 1.30, 110.0],
92
+ 'Ta': [1.34, 2.22, 1.50, 100.0],
93
+ 'W': [1.30, 2.18, 2.36, 90.0],
94
+ 'Re': [1.28, 2.16, 1.90, 80.0],
95
+ 'Os': [1.26, 2.16, 2.20, 70.0],
96
+ 'Ir': [1.27, 2.13, 2.20, 60.0],
97
+ 'Pt': [1.30, 2.13, 2.28, 50.0],
98
+ 'Au': [1.34, 2.14, 2.54, 40.0],
99
+ 'Hg': [1.49, 2.23, 2.00, 35.0],
100
+ 'Tl': [1.48, 2.09, 2.04, 70.0],
101
+ 'Pb': [1.47, 2.02, 2.33, 55.0],
102
+ 'Bi': [1.46, 2.00, 2.02, 50.0],
103
+ 'Po': [1.46, 2.00, 2.00, 45.0],
104
+ 'At': [1.45, 2.00, 2.20, 40.0],
105
+ 'Rn': [1.43, 2.00, 0.00, 35.0]
106
+ }
107
+
108
+ # Bond parameters - scaling factors as in original GFNFF
109
+ self.bond_scaling = 0.4195 # kcal/mol to hartree
110
+ self.bond_decay = 0.10
111
+
112
+ # Reference bond lengths and force constants for selected bonds
113
+ # Values are taken from GFNFF parameters (bondkonst array in gfnff_param.f90)
114
+ # Format: [r0 (bohr), kb (au)]
115
+ self.bond_params = {
116
+ ('C', 'C'): [2.8464, 0.3601],
117
+ ('C', 'H'): [2.0697, 0.3430],
118
+ ('C', 'N'): [2.7394, 0.3300],
119
+ ('C', 'O'): [2.6794, 0.3250],
120
+ ('C', 'F'): [2.5646, 0.4195],
121
+ ('C', 'S'): [3.3926, 0.2050],
122
+ ('C', 'Cl'): [3.2740, 0.2150],
123
+ ('C', 'Br'): [3.5260, 0.1800],
124
+ ('C', 'I'): [3.8467, 0.1600],
125
+ ('N', 'H'): [1.9079, 0.4150],
126
+ ('N', 'N'): [2.5363, 0.2660],
127
+ ('N', 'O'): [2.6379, 0.2800],
128
+ ('N', 'F'): [2.5155, 0.2950],
129
+ ('O', 'H'): [1.8200, 0.4770],
130
+ ('O', 'O'): [2.7358, 0.1525],
131
+ ('O', 'S'): [3.1786, 0.2270],
132
+ ('S', 'H'): [2.5239, 0.2750],
133
+ ('S', 'S'): [3.6599, 0.1375],
134
+ ('S', 'F'): [3.0108, 0.2200],
135
+ ('S', 'Cl'): [3.4798, 0.1625]
136
+ }
137
+
138
+ # Angle bend parameters
139
+ # Values from benkonst array in gfnff_param.f90
140
+ # Format: [theta0 (degrees), ka (au)]
141
+ self.angle_params = {
142
+ ('C', 'C', 'C'): [112.7, 0.0800],
143
+ ('C', 'C', 'H'): [110.7, 0.0590],
144
+ ('C', 'C', 'N'): [111.0, 0.0740],
145
+ ('C', 'C', 'O'): [109.5, 0.0950],
146
+ ('H', 'C', 'H'): [109.5, 0.0400],
147
+ ('H', 'C', 'N'): [109.5, 0.0670],
148
+ ('H', 'C', 'O'): [109.5, 0.0580],
149
+ ('N', 'C', 'N'): [109.5, 0.0700],
150
+ ('N', 'C', 'O'): [110.5, 0.0750],
151
+ ('O', 'C', 'O'): [109.5, 0.0990],
152
+ ('C', 'N', 'C'): [109.5, 0.0680],
153
+ ('C', 'N', 'H'): [109.5, 0.0560],
154
+ ('H', 'N', 'H'): [106.4, 0.0450],
155
+ ('C', 'O', 'C'): [111.0, 0.0880],
156
+ ('C', 'O', 'H'): [107.0, 0.0980],
157
+ ('H', 'O', 'H'): [104.5, 0.0550],
158
+ ('C', 'S', 'C'): [96.0, 0.0850],
159
+ ('C', 'S', 'H'): [96.0, 0.0680],
160
+ ('H', 'S', 'H'): [93.0, 0.0380]
161
+ }
162
+
163
+ # Torsion parameters
164
+ # Values from torskonst array in gfnff_param.f90
165
+ # Format: [V1, V2, V3] (kcal/mol, converted to hartree in the getter)
166
+ self.torsion_params = {
167
+ ('C', 'C', 'C', 'C'): [0.20, 0.25, 0.18],
168
+ ('C', 'C', 'C', 'H'): [0.00, 0.00, 0.30],
169
+ ('C', 'C', 'C', 'N'): [0.10, 0.40, 0.70],
170
+ ('C', 'C', 'C', 'O'): [-0.55, 0.10, 0.50],
171
+ ('H', 'C', 'C', 'H'): [0.00, 0.00, 0.30],
172
+ ('H', 'C', 'C', 'N'): [0.00, 0.00, 0.40],
173
+ ('H', 'C', 'C', 'O'): [0.00, 0.00, 0.35],
174
+ ('N', 'C', 'C', 'N'): [-0.60, -0.10, 0.50],
175
+ ('N', 'C', 'C', 'O'): [0.50, 0.45, 0.00],
176
+ ('O', 'C', 'C', 'O'): [-0.55, -0.10, 0.00],
177
+ ('C', 'C', 'N', 'C'): [-0.54, -0.10, 0.32],
178
+ ('C', 'C', 'N', 'H'): [0.00, 0.00, 0.30],
179
+ ('H', 'C', 'N', 'C'): [0.00, 0.00, 0.40],
180
+ ('H', 'C', 'N', 'H'): [0.00, 0.00, 0.30],
181
+ ('C', 'C', 'O', 'C'): [0.65, -0.25, 0.67],
182
+ ('C', 'C', 'O', 'H'): [0.00, 0.00, 0.45],
183
+ ('H', 'C', 'O', 'C'): [0.00, 0.00, 0.45],
184
+ ('H', 'C', 'O', 'H'): [0.00, 0.00, 0.27]
185
+ }
186
+
187
+ # Hydrogen bond parameters
188
+ # Based on hbtyppar in gfnff_param.f90
189
+ # Format: [r0 (Å), k (kcal/mol)]
190
+ self.hbond_params = {
191
+ ('O', 'H', 'N'): [1.9, 4.0],
192
+ ('O', 'H', 'O'): [1.8, 4.0],
193
+ ('N', 'H', 'N'): [2.0, 4.0],
194
+ ('N', 'H', 'O'): [1.9, 4.0],
195
+ ('F', 'H', 'N'): [1.8, 3.5],
196
+ ('F', 'H', 'O'): [1.7, 3.5],
197
+ ('S', 'H', 'N'): [2.5, 3.5],
198
+ ('S', 'H', 'O'): [2.4, 3.5],
199
+ ('Cl', 'H', 'N'): [2.3, 3.0],
200
+ ('Cl', 'H', 'O'): [2.2, 3.0],
201
+ ('Br', 'H', 'N'): [2.5, 2.5],
202
+ ('Br', 'H', 'O'): [2.4, 2.5],
203
+ ('I', 'H', 'N'): [2.7, 2.0],
204
+ ('I', 'H', 'O'): [2.6, 2.0]
205
+ }
206
+
207
+ # Dispersion parameters
208
+ self.d4_s6 = 1.0
209
+ self.d4_s8 = 1.03683
210
+ self.d4_s9 = 1.0
211
+ self.d4_a1 = 0.4171
212
+ self.d4_a2 = 4.5337
213
+
214
+ # Default parameters for missing entries
215
+ self.default_bond_k = 0.3000
216
+ self.default_angle_k = 0.0700
217
+ self.default_torsion_v = [0.0, 0.0, 0.2]
218
+
219
+ def get_vdw_radius(self, element):
220
+ """Get van der Waals radius for an element (in Angstrom)"""
221
+ if element in self.element_params:
222
+ return self.element_params[element][1]
223
+ return 2.0 # Default value
224
+
225
+ def get_cov_radius(self, element):
226
+ """Get covalent radius for an element (in Angstrom)"""
227
+ if element in self.element_params:
228
+ return self.element_params[element][0]
229
+ return 1.0 # Default value
230
+
231
+ def get_electronegativity(self, element):
232
+ """Get electronegativity for an element"""
233
+ if element in self.element_params:
234
+ return self.element_params[element][2]
235
+ return 2.0 # Default value
236
+
237
+ def get_polarizability(self, element):
238
+ """Get polarizability for an element (in a.u.)"""
239
+ if element in self.element_params:
240
+ return self.element_params[element][3]
241
+ return 10.0 # Default value
242
+
243
+ def get_bond_params(self, element1, element2):
244
+ """Get bond parameters for a given pair of elements"""
245
+ key = tuple(sorted([element1, element2]))
246
+ if key in self.bond_params:
247
+ # Return [r0 (bohr), kb (au)]
248
+ return self.bond_params[key]
249
+
250
+ # Estimate based on covalent radii if not explicitly defined
251
+ r_cov1 = self.get_cov_radius(element1)
252
+ r_cov2 = self.get_cov_radius(element2)
253
+ r0 = (r_cov1 + r_cov2) / self.bohr2ang # Convert Å to bohr
254
+
255
+ return [r0, self.default_bond_k]
256
+
257
+ def get_angle_params(self, element1, element2, element3):
258
+ """Get angle parameters for a given triplet of elements"""
259
+ key = (element1, element2, element3)
260
+ if key in self.angle_params:
261
+ return self.angle_params[key]
262
+
263
+ # Reverse order
264
+ key_rev = (element3, element2, element1)
265
+ if key_rev in self.angle_params:
266
+ return self.angle_params[key_rev]
267
+
268
+ # Default angle based on element2's expected coordination
269
+ if element2 in ['C', 'Si']:
270
+ theta0 = 109.5 # tetrahedral
271
+ elif element2 in ['N', 'P']:
272
+ theta0 = 107.0 # slightly reduced tetrahedral
273
+ elif element2 in ['O', 'S']:
274
+ theta0 = 104.5 # bent
275
+ else:
276
+ theta0 = 120.0 # default
277
+
278
+ return [theta0, self.default_angle_k]
279
+
280
+ def get_torsion_params(self, element1, element2, element3, element4):
281
+ """Get torsion parameters for a given quartet of elements"""
282
+ key = (element1, element2, element3, element4)
283
+ if key in self.torsion_params:
284
+ # Convert kcal/mol to hartree
285
+ v1, v2, v3 = self.torsion_params[key]
286
+ return [v1 * self.kcalmol2hartree,
287
+ v2 * self.kcalmol2hartree,
288
+ v3 * self.kcalmol2hartree]
289
+
290
+ # Reverse order
291
+ key_rev = (element4, element3, element2, element1)
292
+ if key_rev in self.torsion_params:
293
+ v1, v2, v3 = self.torsion_params[key_rev]
294
+ return [v1 * self.kcalmol2hartree,
295
+ v2 * self.kcalmol2hartree,
296
+ v3 * self.kcalmol2hartree]
297
+
298
+ # Default parameters
299
+ return [v * self.kcalmol2hartree for v in self.default_torsion_v]
300
+
301
+ def get_hbond_params(self, donor, h, acceptor):
302
+ """Get hydrogen bond parameters for a donor-H-acceptor triplet"""
303
+ key = (donor, h, acceptor)
304
+ if key in self.hbond_params:
305
+ r0, k = self.hbond_params[key]
306
+ return [r0 / self.bohr2ang, k * self.kcalmol2hartree] # Convert to bohr, hartree
307
+
308
+ # Try reverse order (some H-bonds can be bidirectional)
309
+ key_rev = (acceptor, h, donor)
310
+ if key_rev in self.hbond_params:
311
+ r0, k = self.hbond_params[key_rev]
312
+ return [r0 / self.bohr2ang, k * self.kcalmol2hartree]
313
+
314
+ # Default weak hydrogen bond parameters
315
+ return [2.0 / self.bohr2ang, 2.0 * self.kcalmol2hartree]