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.
- multioptpy/Calculator/__init__.py +0 -0
- multioptpy/Calculator/ase_calculation_tools.py +424 -0
- multioptpy/Calculator/ase_tools/__init__.py +0 -0
- multioptpy/Calculator/ase_tools/fairchem.py +28 -0
- multioptpy/Calculator/ase_tools/gamess.py +19 -0
- multioptpy/Calculator/ase_tools/gaussian.py +165 -0
- multioptpy/Calculator/ase_tools/mace.py +28 -0
- multioptpy/Calculator/ase_tools/mopac.py +19 -0
- multioptpy/Calculator/ase_tools/nwchem.py +31 -0
- multioptpy/Calculator/ase_tools/orca.py +22 -0
- multioptpy/Calculator/ase_tools/pygfn0.py +37 -0
- multioptpy/Calculator/dxtb_calculation_tools.py +344 -0
- multioptpy/Calculator/emt_calculation_tools.py +458 -0
- multioptpy/Calculator/gpaw_calculation_tools.py +183 -0
- multioptpy/Calculator/lj_calculation_tools.py +314 -0
- multioptpy/Calculator/psi4_calculation_tools.py +334 -0
- multioptpy/Calculator/pwscf_calculation_tools.py +189 -0
- multioptpy/Calculator/pyscf_calculation_tools.py +327 -0
- multioptpy/Calculator/sqm1_calculation_tools.py +611 -0
- multioptpy/Calculator/sqm2_calculation_tools.py +376 -0
- multioptpy/Calculator/tblite_calculation_tools.py +352 -0
- multioptpy/Calculator/tersoff_calculation_tools.py +818 -0
- multioptpy/Constraint/__init__.py +0 -0
- multioptpy/Constraint/constraint_condition.py +834 -0
- multioptpy/Coordinate/__init__.py +0 -0
- multioptpy/Coordinate/polar_coordinate.py +199 -0
- multioptpy/Coordinate/redundant_coordinate.py +638 -0
- multioptpy/IRC/__init__.py +0 -0
- multioptpy/IRC/converge_criteria.py +28 -0
- multioptpy/IRC/dvv.py +544 -0
- multioptpy/IRC/euler.py +439 -0
- multioptpy/IRC/hpc.py +564 -0
- multioptpy/IRC/lqa.py +540 -0
- multioptpy/IRC/modekill.py +662 -0
- multioptpy/IRC/rk4.py +579 -0
- multioptpy/Interpolation/__init__.py +0 -0
- multioptpy/Interpolation/adaptive_interpolation.py +283 -0
- multioptpy/Interpolation/binomial_interpolation.py +179 -0
- multioptpy/Interpolation/geodesic_interpolation.py +785 -0
- multioptpy/Interpolation/interpolation.py +156 -0
- multioptpy/Interpolation/linear_interpolation.py +473 -0
- multioptpy/Interpolation/savitzky_golay_interpolation.py +252 -0
- multioptpy/Interpolation/spline_interpolation.py +353 -0
- multioptpy/MD/__init__.py +0 -0
- multioptpy/MD/thermostat.py +185 -0
- multioptpy/MEP/__init__.py +0 -0
- multioptpy/MEP/pathopt_bneb_force.py +443 -0
- multioptpy/MEP/pathopt_dmf_force.py +448 -0
- multioptpy/MEP/pathopt_dneb_force.py +130 -0
- multioptpy/MEP/pathopt_ewbneb_force.py +207 -0
- multioptpy/MEP/pathopt_gpneb_force.py +512 -0
- multioptpy/MEP/pathopt_lup_force.py +113 -0
- multioptpy/MEP/pathopt_neb_force.py +225 -0
- multioptpy/MEP/pathopt_nesb_force.py +205 -0
- multioptpy/MEP/pathopt_om_force.py +153 -0
- multioptpy/MEP/pathopt_qsm_force.py +174 -0
- multioptpy/MEP/pathopt_qsmv2_force.py +304 -0
- multioptpy/ModelFunction/__init__.py +7 -0
- multioptpy/ModelFunction/avoiding_model_function.py +29 -0
- multioptpy/ModelFunction/binary_image_ts_search_model_function.py +47 -0
- multioptpy/ModelFunction/conical_model_function.py +26 -0
- multioptpy/ModelFunction/opt_meci.py +50 -0
- multioptpy/ModelFunction/opt_mesx.py +47 -0
- multioptpy/ModelFunction/opt_mesx_2.py +49 -0
- multioptpy/ModelFunction/seam_model_function.py +27 -0
- multioptpy/ModelHessian/__init__.py +0 -0
- multioptpy/ModelHessian/approx_hessian.py +147 -0
- multioptpy/ModelHessian/calc_params.py +227 -0
- multioptpy/ModelHessian/fischer.py +236 -0
- multioptpy/ModelHessian/fischerd3.py +360 -0
- multioptpy/ModelHessian/fischerd4.py +398 -0
- multioptpy/ModelHessian/gfn0xtb.py +633 -0
- multioptpy/ModelHessian/gfnff.py +709 -0
- multioptpy/ModelHessian/lindh.py +165 -0
- multioptpy/ModelHessian/lindh2007d2.py +707 -0
- multioptpy/ModelHessian/lindh2007d3.py +822 -0
- multioptpy/ModelHessian/lindh2007d4.py +1030 -0
- multioptpy/ModelHessian/morse.py +106 -0
- multioptpy/ModelHessian/schlegel.py +144 -0
- multioptpy/ModelHessian/schlegeld3.py +322 -0
- multioptpy/ModelHessian/schlegeld4.py +559 -0
- multioptpy/ModelHessian/shortrange.py +346 -0
- multioptpy/ModelHessian/swartd2.py +496 -0
- multioptpy/ModelHessian/swartd3.py +706 -0
- multioptpy/ModelHessian/swartd4.py +918 -0
- multioptpy/ModelHessian/tshess.py +40 -0
- multioptpy/Optimizer/QHAdam.py +61 -0
- multioptpy/Optimizer/__init__.py +0 -0
- multioptpy/Optimizer/abc_fire.py +83 -0
- multioptpy/Optimizer/adabelief.py +58 -0
- multioptpy/Optimizer/adabound.py +68 -0
- multioptpy/Optimizer/adadelta.py +65 -0
- multioptpy/Optimizer/adaderivative.py +56 -0
- multioptpy/Optimizer/adadiff.py +68 -0
- multioptpy/Optimizer/adafactor.py +70 -0
- multioptpy/Optimizer/adam.py +65 -0
- multioptpy/Optimizer/adamax.py +62 -0
- multioptpy/Optimizer/adamod.py +83 -0
- multioptpy/Optimizer/adamw.py +65 -0
- multioptpy/Optimizer/adiis.py +523 -0
- multioptpy/Optimizer/afire_neb.py +282 -0
- multioptpy/Optimizer/block_hessian_update.py +709 -0
- multioptpy/Optimizer/c2diis.py +491 -0
- multioptpy/Optimizer/component_wise_scaling.py +405 -0
- multioptpy/Optimizer/conjugate_gradient.py +82 -0
- multioptpy/Optimizer/conjugate_gradient_neb.py +345 -0
- multioptpy/Optimizer/coordinate_locking.py +405 -0
- multioptpy/Optimizer/dic_rsirfo.py +1015 -0
- multioptpy/Optimizer/ediis.py +417 -0
- multioptpy/Optimizer/eve.py +76 -0
- multioptpy/Optimizer/fastadabelief.py +61 -0
- multioptpy/Optimizer/fire.py +77 -0
- multioptpy/Optimizer/fire2.py +249 -0
- multioptpy/Optimizer/fire_neb.py +92 -0
- multioptpy/Optimizer/gan_step.py +486 -0
- multioptpy/Optimizer/gdiis.py +609 -0
- multioptpy/Optimizer/gediis.py +203 -0
- multioptpy/Optimizer/geodesic_step.py +433 -0
- multioptpy/Optimizer/gpmin.py +633 -0
- multioptpy/Optimizer/gpr_step.py +364 -0
- multioptpy/Optimizer/gradientdescent.py +78 -0
- multioptpy/Optimizer/gradientdescent_neb.py +52 -0
- multioptpy/Optimizer/hessian_update.py +433 -0
- multioptpy/Optimizer/hybrid_rfo.py +998 -0
- multioptpy/Optimizer/kdiis.py +625 -0
- multioptpy/Optimizer/lars.py +21 -0
- multioptpy/Optimizer/lbfgs.py +253 -0
- multioptpy/Optimizer/lbfgs_neb.py +355 -0
- multioptpy/Optimizer/linesearch.py +236 -0
- multioptpy/Optimizer/lookahead.py +40 -0
- multioptpy/Optimizer/nadam.py +64 -0
- multioptpy/Optimizer/newton.py +200 -0
- multioptpy/Optimizer/prodigy.py +70 -0
- multioptpy/Optimizer/purtubation.py +16 -0
- multioptpy/Optimizer/quickmin_neb.py +245 -0
- multioptpy/Optimizer/radam.py +75 -0
- multioptpy/Optimizer/rfo_neb.py +302 -0
- multioptpy/Optimizer/ric_rfo.py +842 -0
- multioptpy/Optimizer/rl_step.py +627 -0
- multioptpy/Optimizer/rmspropgrave.py +65 -0
- multioptpy/Optimizer/rsirfo.py +1647 -0
- multioptpy/Optimizer/rsprfo.py +1056 -0
- multioptpy/Optimizer/sadam.py +60 -0
- multioptpy/Optimizer/samsgrad.py +63 -0
- multioptpy/Optimizer/tr_lbfgs.py +678 -0
- multioptpy/Optimizer/trim.py +273 -0
- multioptpy/Optimizer/trust_radius.py +207 -0
- multioptpy/Optimizer/trust_radius_neb.py +121 -0
- multioptpy/Optimizer/yogi.py +60 -0
- multioptpy/OtherMethod/__init__.py +0 -0
- multioptpy/OtherMethod/addf.py +1150 -0
- multioptpy/OtherMethod/dimer.py +895 -0
- multioptpy/OtherMethod/elastic_image_pair.py +629 -0
- multioptpy/OtherMethod/modelfunction.py +456 -0
- multioptpy/OtherMethod/newton_traj.py +454 -0
- multioptpy/OtherMethod/twopshs.py +1095 -0
- multioptpy/PESAnalyzer/__init__.py +0 -0
- multioptpy/PESAnalyzer/calc_irc_curvature.py +125 -0
- multioptpy/PESAnalyzer/cmds_analysis.py +152 -0
- multioptpy/PESAnalyzer/koopman_analysis.py +268 -0
- multioptpy/PESAnalyzer/pca_analysis.py +314 -0
- multioptpy/Parameters/__init__.py +0 -0
- multioptpy/Parameters/atomic_mass.py +20 -0
- multioptpy/Parameters/atomic_number.py +22 -0
- multioptpy/Parameters/covalent_radii.py +44 -0
- multioptpy/Parameters/d2.py +61 -0
- multioptpy/Parameters/d3.py +63 -0
- multioptpy/Parameters/d4.py +103 -0
- multioptpy/Parameters/dreiding.py +34 -0
- multioptpy/Parameters/gfn0xtb_param.py +137 -0
- multioptpy/Parameters/gfnff_param.py +315 -0
- multioptpy/Parameters/gnb.py +104 -0
- multioptpy/Parameters/parameter.py +22 -0
- multioptpy/Parameters/uff.py +72 -0
- multioptpy/Parameters/unit_values.py +20 -0
- multioptpy/Potential/AFIR_potential.py +55 -0
- multioptpy/Potential/LJ_repulsive_potential.py +345 -0
- multioptpy/Potential/__init__.py +0 -0
- multioptpy/Potential/anharmonic_keep_potential.py +28 -0
- multioptpy/Potential/asym_elllipsoidal_potential.py +718 -0
- multioptpy/Potential/electrostatic_potential.py +69 -0
- multioptpy/Potential/flux_potential.py +30 -0
- multioptpy/Potential/gaussian_potential.py +101 -0
- multioptpy/Potential/idpp.py +516 -0
- multioptpy/Potential/keep_angle_potential.py +146 -0
- multioptpy/Potential/keep_dihedral_angle_potential.py +105 -0
- multioptpy/Potential/keep_outofplain_angle_potential.py +70 -0
- multioptpy/Potential/keep_potential.py +99 -0
- multioptpy/Potential/mechano_force_potential.py +74 -0
- multioptpy/Potential/nanoreactor_potential.py +52 -0
- multioptpy/Potential/potential.py +896 -0
- multioptpy/Potential/spacer_model_potential.py +221 -0
- multioptpy/Potential/switching_potential.py +258 -0
- multioptpy/Potential/universal_potential.py +34 -0
- multioptpy/Potential/value_range_potential.py +36 -0
- multioptpy/Potential/void_point_potential.py +25 -0
- multioptpy/SQM/__init__.py +0 -0
- multioptpy/SQM/sqm1/__init__.py +0 -0
- multioptpy/SQM/sqm1/sqm1_core.py +1792 -0
- multioptpy/SQM/sqm2/__init__.py +0 -0
- multioptpy/SQM/sqm2/calc_tools.py +95 -0
- multioptpy/SQM/sqm2/sqm2_basis.py +850 -0
- multioptpy/SQM/sqm2/sqm2_bond.py +119 -0
- multioptpy/SQM/sqm2/sqm2_core.py +303 -0
- multioptpy/SQM/sqm2/sqm2_data.py +1229 -0
- multioptpy/SQM/sqm2/sqm2_disp.py +65 -0
- multioptpy/SQM/sqm2/sqm2_eeq.py +243 -0
- multioptpy/SQM/sqm2/sqm2_overlapint.py +704 -0
- multioptpy/SQM/sqm2/sqm2_qm.py +578 -0
- multioptpy/SQM/sqm2/sqm2_rep.py +66 -0
- multioptpy/SQM/sqm2/sqm2_srb.py +70 -0
- multioptpy/Thermo/__init__.py +0 -0
- multioptpy/Thermo/normal_mode_analyzer.py +865 -0
- multioptpy/Utils/__init__.py +0 -0
- multioptpy/Utils/bond_connectivity.py +264 -0
- multioptpy/Utils/calc_tools.py +884 -0
- multioptpy/Utils/oniom.py +96 -0
- multioptpy/Utils/pbc.py +48 -0
- multioptpy/Utils/riemann_curvature.py +208 -0
- multioptpy/Utils/symmetry_analyzer.py +482 -0
- multioptpy/Visualization/__init__.py +0 -0
- multioptpy/Visualization/visualization.py +156 -0
- multioptpy/WFAnalyzer/MO_analysis.py +104 -0
- multioptpy/WFAnalyzer/__init__.py +0 -0
- multioptpy/Wrapper/__init__.py +0 -0
- multioptpy/Wrapper/autots.py +1239 -0
- multioptpy/Wrapper/ieip_wrapper.py +93 -0
- multioptpy/Wrapper/md_wrapper.py +92 -0
- multioptpy/Wrapper/neb_wrapper.py +94 -0
- multioptpy/Wrapper/optimize_wrapper.py +76 -0
- multioptpy/__init__.py +5 -0
- multioptpy/entrypoints.py +916 -0
- multioptpy/fileio.py +660 -0
- multioptpy/ieip.py +340 -0
- multioptpy/interface.py +1086 -0
- multioptpy/irc.py +529 -0
- multioptpy/moleculardynamics.py +432 -0
- multioptpy/neb.py +1267 -0
- multioptpy/optimization.py +1553 -0
- multioptpy/optimizer.py +709 -0
- multioptpy-1.20.2.dist-info/METADATA +438 -0
- multioptpy-1.20.2.dist-info/RECORD +246 -0
- multioptpy-1.20.2.dist-info/WHEEL +5 -0
- multioptpy-1.20.2.dist-info/entry_points.txt +9 -0
- multioptpy-1.20.2.dist-info/licenses/LICENSE +674 -0
- 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]
|