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
multioptpy/ieip.py
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import datetime
|
|
4
|
+
import glob
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
from multioptpy.fileio import FileIO
|
|
9
|
+
from multioptpy.Parameters.parameter import UnitValueLib
|
|
10
|
+
from multioptpy.interface import force_data_parser
|
|
11
|
+
|
|
12
|
+
from multioptpy.OtherMethod.dimer import DimerMethod
|
|
13
|
+
from multioptpy.OtherMethod.newton_traj import NewtonTrajectory
|
|
14
|
+
from multioptpy.OtherMethod.addf import ADDFlikeMethod
|
|
15
|
+
from multioptpy.OtherMethod.twopshs import twoPSHSlikeMethod
|
|
16
|
+
from multioptpy.OtherMethod.elastic_image_pair import ElasticImagePair
|
|
17
|
+
from multioptpy.OtherMethod.modelfunction import ModelFunctionOptimizer
|
|
18
|
+
|
|
19
|
+
class IEIPConfig:
|
|
20
|
+
"""
|
|
21
|
+
Configuration class for Improved Elastic Image Pair (iEIP) method.
|
|
22
|
+
|
|
23
|
+
References:
|
|
24
|
+
- J. Chem. Theory. Comput. 2023, 19, 2410-2417
|
|
25
|
+
- J. Comput. Chem. 2018, 39, 233–251 (DS-AFIR)
|
|
26
|
+
"""
|
|
27
|
+
def __init__(self, args):
|
|
28
|
+
UVL = UnitValueLib()
|
|
29
|
+
np.set_printoptions(precision=12, floatmode="fixed", suppress=True)
|
|
30
|
+
|
|
31
|
+
# Unit conversion constants
|
|
32
|
+
self.hartree2kcalmol = UVL.hartree2kcalmol
|
|
33
|
+
self.bohr2angstroms = UVL.bohr2angstroms
|
|
34
|
+
self.hartree2kjmol = UVL.hartree2kjmol
|
|
35
|
+
|
|
36
|
+
# Displacement and convergence thresholds
|
|
37
|
+
self.displacement_limit = 0.04 # Bohr
|
|
38
|
+
self.maximum_ieip_disp = 0.2 # Bohr
|
|
39
|
+
self.L_covergence = 0.03 # Bohr
|
|
40
|
+
self.img_distance_convage_criterion = 0.15 # Bohr
|
|
41
|
+
|
|
42
|
+
# Convergence thresholds
|
|
43
|
+
self.MAX_FORCE_THRESHOLD = 0.0006
|
|
44
|
+
self.RMS_FORCE_THRESHOLD = 0.0004
|
|
45
|
+
self.MAX_DISPLACEMENT_THRESHOLD = 0.0030
|
|
46
|
+
self.RMS_DISPLACEMENT_THRESHOLD = 0.0020
|
|
47
|
+
|
|
48
|
+
# Iteration limits
|
|
49
|
+
self.microiterlimit = int(args.NSTEP)
|
|
50
|
+
self.microiter_num = args.microiter
|
|
51
|
+
|
|
52
|
+
# Electronic state configuration
|
|
53
|
+
self.initial_excite_state = args.excited_state[0]
|
|
54
|
+
self.final_excite_state = args.excited_state[1]
|
|
55
|
+
self.excite_state_list = args.excited_state
|
|
56
|
+
|
|
57
|
+
# Charge and multiplicity
|
|
58
|
+
self.init_electric_charge_and_multiplicity = [int(args.electronic_charge[0]), int(args.spin_multiplicity[0])]
|
|
59
|
+
self.final_electric_charge_and_multiplicity = [int(args.electronic_charge[1]), int(args.spin_multiplicity[1])]
|
|
60
|
+
self.electric_charge_and_multiplicity_list = []
|
|
61
|
+
for i in range(len(args.electronic_charge)):
|
|
62
|
+
self.electric_charge_and_multiplicity_list.append([int(args.electronic_charge[i]), int(args.spin_multiplicity[i])])
|
|
63
|
+
|
|
64
|
+
# Solvation models
|
|
65
|
+
self.cpcm_solv_model = args.cpcm_solv_model
|
|
66
|
+
self.alpb_solv_model = args.alpb_solv_model
|
|
67
|
+
|
|
68
|
+
# Computation resources
|
|
69
|
+
self.N_THREAD = args.N_THREAD
|
|
70
|
+
self.SET_MEMORY = args.SET_MEMORY
|
|
71
|
+
self.START_FILE = args.INPUT + "/"
|
|
72
|
+
|
|
73
|
+
# Quantum chemistry settings
|
|
74
|
+
self.BASIS_SET = args.basisset
|
|
75
|
+
self.FUNCTIONAL = args.functional
|
|
76
|
+
self.usextb = args.usextb
|
|
77
|
+
self.usedxtb = args.usedxtb
|
|
78
|
+
self.electronic_charge = args.electronic_charge
|
|
79
|
+
self.spin_multiplicity = args.spin_multiplicity
|
|
80
|
+
|
|
81
|
+
# Validate sub-basis set inputs
|
|
82
|
+
if len(args.sub_basisset) % 2 != 0:
|
|
83
|
+
print("invalid input (-sub_bs)")
|
|
84
|
+
sys.exit(0)
|
|
85
|
+
|
|
86
|
+
# Configure basis sets
|
|
87
|
+
if args.pyscf:
|
|
88
|
+
self.SUB_BASIS_SET = {}
|
|
89
|
+
if len(args.sub_basisset) > 0:
|
|
90
|
+
self.SUB_BASIS_SET["default"] = str(self.BASIS_SET)
|
|
91
|
+
for j in range(int(len(args.sub_basisset)/2)):
|
|
92
|
+
self.SUB_BASIS_SET[args.sub_basisset[2*j]] = args.sub_basisset[2*j+1]
|
|
93
|
+
print("Basis Sets defined by User are detected.")
|
|
94
|
+
print(self.SUB_BASIS_SET)
|
|
95
|
+
else:
|
|
96
|
+
self.SUB_BASIS_SET = {"default": self.BASIS_SET}
|
|
97
|
+
else: # psi4
|
|
98
|
+
self.SUB_BASIS_SET = ""
|
|
99
|
+
if len(args.sub_basisset) > 0:
|
|
100
|
+
self.SUB_BASIS_SET += "\nassign " + str(self.BASIS_SET) + "\n"
|
|
101
|
+
for j in range(int(len(args.sub_basisset)/2)):
|
|
102
|
+
self.SUB_BASIS_SET += "assign " + args.sub_basisset[2*j] + " " + args.sub_basisset[2*j+1] + "\n"
|
|
103
|
+
print("Basis Sets defined by User are detected.")
|
|
104
|
+
print(self.SUB_BASIS_SET)
|
|
105
|
+
|
|
106
|
+
# Validate effective core potential inputs
|
|
107
|
+
if len(args.effective_core_potential) % 2 != 0:
|
|
108
|
+
print("invalid input (-ecp)")
|
|
109
|
+
sys.exit(0)
|
|
110
|
+
|
|
111
|
+
# Configure effective core potentials
|
|
112
|
+
if args.pyscf:
|
|
113
|
+
self.ECP = {}
|
|
114
|
+
if len(args.effective_core_potential) > 0:
|
|
115
|
+
for j in range(int(len(args.effective_core_potential)/2)):
|
|
116
|
+
self.ECP[args.effective_core_potential[2*j]] = args.effective_core_potential[2*j+1]
|
|
117
|
+
else:
|
|
118
|
+
self.ECP = ""
|
|
119
|
+
|
|
120
|
+
# Other settings
|
|
121
|
+
self.othersoft = args.othersoft
|
|
122
|
+
self.software_path_file = args.software_path_file
|
|
123
|
+
self.basic_set_and_function = args.functional + "/" + args.basisset
|
|
124
|
+
self.force_data = force_data_parser(args)
|
|
125
|
+
|
|
126
|
+
# Set up output directory
|
|
127
|
+
if self.othersoft != "None":
|
|
128
|
+
self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + args.othersoft + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
|
|
129
|
+
elif args.sqm2:
|
|
130
|
+
self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_SQM2_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
|
|
131
|
+
|
|
132
|
+
elif args.sqm1:
|
|
133
|
+
self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_SQM1_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
|
|
134
|
+
elif args.usextb == "None" and args.usedxtb == "None":
|
|
135
|
+
self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + self.basic_set_and_function.replace("/", "_") + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
|
|
136
|
+
else:
|
|
137
|
+
if args.usedxtb != "None":
|
|
138
|
+
self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + self.usedxtb + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
|
|
139
|
+
self.force_data["xtb"] = self.usedxtb
|
|
140
|
+
else:
|
|
141
|
+
self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + self.usextb + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
|
|
142
|
+
self.force_data["xtb"] = self.usextb
|
|
143
|
+
|
|
144
|
+
# Optimization parameters
|
|
145
|
+
self.args = args
|
|
146
|
+
self.BETA = args.BETA
|
|
147
|
+
self.spring_const = 1e-8
|
|
148
|
+
self.unrestrict = args.unrestrict
|
|
149
|
+
self.mf_mode = args.model_function_mode
|
|
150
|
+
self.FC_COUNT = int(args.calc_exact_hess)
|
|
151
|
+
self.dft_grid = int(args.dft_grid)
|
|
152
|
+
|
|
153
|
+
# Set config for Newton Trajectory Method
|
|
154
|
+
self.use_gnt = getattr(args, 'use_gnt', False)
|
|
155
|
+
self.gnt_step_len = getattr(args, 'gnt_step_len', 0.5)
|
|
156
|
+
self.gnt_rms_thresh = getattr(args, 'gnt_rms_thresh', 1.7e-3)
|
|
157
|
+
self.gnt_vec = getattr(args, 'gnt_vec', None)
|
|
158
|
+
self.gnt_microiter = getattr(args, 'gnt_microiter', 100)
|
|
159
|
+
|
|
160
|
+
# Set config for ADDF-like method
|
|
161
|
+
self.use_addf = getattr(args, 'use_addf', False)
|
|
162
|
+
self.addf_step_num = getattr(args, 'addf_step_num', 300)
|
|
163
|
+
self.nadd = getattr(args, 'number_of_add', 5)
|
|
164
|
+
self.addf_step_size = getattr(args, 'addf_step_size', 0.05)
|
|
165
|
+
|
|
166
|
+
# Set config for 2PSHS-like method
|
|
167
|
+
self.use_2pshs = getattr(args, 'use_2pshs', False)
|
|
168
|
+
self.twoPshs_step_num = getattr(args, 'twoPshs_step_num', 300)
|
|
169
|
+
self.twoPshs_step_size = getattr(args, 'twoPshs_step_size', 0.05)
|
|
170
|
+
|
|
171
|
+
# Set config for Dimer Method
|
|
172
|
+
self.use_dimer = getattr(args, 'use_dimer', False)
|
|
173
|
+
self.dimer_separation = getattr(args, 'dimer_separation', 0.0001)
|
|
174
|
+
self.dimer_trial_angle = getattr(args, 'dimer_trial_angle', np.pi / 32.0)
|
|
175
|
+
self.dimer_max_iterations = getattr(args, 'dimer_max_iterations', 1000)
|
|
176
|
+
|
|
177
|
+
# Create output directory
|
|
178
|
+
os.mkdir(self.iEIP_FOLDER_DIRECTORY)
|
|
179
|
+
|
|
180
|
+
def save_input_data(self):
|
|
181
|
+
"""Save the input configuration data to a file"""
|
|
182
|
+
with open(self.iEIP_FOLDER_DIRECTORY + "input.txt", "w") as f:
|
|
183
|
+
f.write(str(vars(self.args)))
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class iEIP:
|
|
188
|
+
"""
|
|
189
|
+
Main class for Improved Elastic Image Pair (iEIP) method.
|
|
190
|
+
|
|
191
|
+
Manages the overall optimization process by delegating to specialized
|
|
192
|
+
component classes for configuration, elastic image pair optimization,
|
|
193
|
+
model function optimization.
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
References:
|
|
197
|
+
- J. Chem. Theory. Comput. 2023, 19, 2410-2417
|
|
198
|
+
- J. Comput. Chem. 2018, 39, 233–251 (DS-AFIR)
|
|
199
|
+
"""
|
|
200
|
+
def __init__(self, args):
|
|
201
|
+
self.config = IEIPConfig(args)
|
|
202
|
+
self.elastic_image_pair = ElasticImagePair(self.config)
|
|
203
|
+
self.model_function_optimizer = ModelFunctionOptimizer(self.config)
|
|
204
|
+
self.newton_trajectory = NewtonTrajectory(self.config)
|
|
205
|
+
self.addf_like_method = ADDFlikeMethod(self.config)
|
|
206
|
+
self.twoPshs = twoPSHSlikeMethod(self.config)
|
|
207
|
+
self.dimer_method = DimerMethod(self.config)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def optimize(self):
|
|
211
|
+
"""Load calculation modules based on configuration and run optimization"""
|
|
212
|
+
if self.config.othersoft != "None":
|
|
213
|
+
if self.config.othersoft.lower() == "lj":
|
|
214
|
+
from multioptpy.Calculator.lj_calculation_tools import Calculation
|
|
215
|
+
print("Use Lennard-Jones cluster potential.")
|
|
216
|
+
elif self.config.othersoft.lower() == "emt":
|
|
217
|
+
from multioptpy.Calculator.emt_calculation_tools import Calculation
|
|
218
|
+
print("Use EMT cluster potential.")
|
|
219
|
+
elif self.config.othersoft.lower() == "tersoff":
|
|
220
|
+
from multioptpy.Calculator.tersoff_calculation_tools import Calculation
|
|
221
|
+
print("Use Tersoff cluster potential.")
|
|
222
|
+
else:
|
|
223
|
+
print("Use", self.config.othersoft)
|
|
224
|
+
with open(self.config.iEIP_FOLDER_DIRECTORY + "use_" + self.config.othersoft + ".txt", "w") as f:
|
|
225
|
+
f.write(self.config.othersoft + "\n")
|
|
226
|
+
f.write(self.config.BASIS_SET + "\n")
|
|
227
|
+
f.write(self.config.FUNCTIONAL + "\n")
|
|
228
|
+
from multioptpy.Calculator.ase_calculation_tools import Calculation
|
|
229
|
+
elif self.config.args.sqm2:
|
|
230
|
+
from multioptpy.Calculator.sqm2_calculation_tools import Calculation
|
|
231
|
+
print("Use SQM2 potential.")
|
|
232
|
+
|
|
233
|
+
elif self.config.args.sqm1:
|
|
234
|
+
from multioptpy.Calculator.sqm1_calculation_tools import Calculation
|
|
235
|
+
elif self.config.args.pyscf:
|
|
236
|
+
from multioptpy.Calculator.pyscf_calculation_tools import Calculation
|
|
237
|
+
elif self.config.args.usextb != "None" and self.config.args.usedxtb == "None":
|
|
238
|
+
from multioptpy.Calculator.tblite_calculation_tools import Calculation
|
|
239
|
+
elif self.config.args.usedxtb != "None" and self.config.args.usextb == "None":
|
|
240
|
+
from multioptpy.Calculator.dxtb_calculation_tools import Calculation
|
|
241
|
+
else:
|
|
242
|
+
from multioptpy.Calculator.psi4_calculation_tools import Calculation
|
|
243
|
+
|
|
244
|
+
file_path_list = glob.glob(self.config.START_FILE+"*_[A-Z].xyz")
|
|
245
|
+
FIO_img_list = []
|
|
246
|
+
|
|
247
|
+
for file_path in file_path_list:
|
|
248
|
+
FIO_img_list.append(FileIO(self.config.iEIP_FOLDER_DIRECTORY, file_path))
|
|
249
|
+
|
|
250
|
+
geometry_list_list = []
|
|
251
|
+
element_list_list = []
|
|
252
|
+
electric_charge_and_multiplicity_list = []
|
|
253
|
+
|
|
254
|
+
for i in range(len(FIO_img_list)):
|
|
255
|
+
geometry_list, element_list, electric_charge_and_multiplicity = FIO_img_list[i].make_geometry_list(
|
|
256
|
+
self.config.electric_charge_and_multiplicity_list[i])
|
|
257
|
+
|
|
258
|
+
if self.config.args.pyscf:
|
|
259
|
+
electric_charge_and_multiplicity = [self.config.electronic_charge[i],
|
|
260
|
+
self.config.spin_multiplicity[i]]
|
|
261
|
+
|
|
262
|
+
geometry_list_list.append(geometry_list)
|
|
263
|
+
element_list_list.append(element_list)
|
|
264
|
+
electric_charge_and_multiplicity_list.append(electric_charge_and_multiplicity)
|
|
265
|
+
|
|
266
|
+
# Save input configuration data
|
|
267
|
+
self.config.save_input_data()
|
|
268
|
+
|
|
269
|
+
# Initialize calculation objects
|
|
270
|
+
SP_list = []
|
|
271
|
+
file_directory_list = []
|
|
272
|
+
for i in range(len(FIO_img_list)):
|
|
273
|
+
SP_list.append(Calculation(
|
|
274
|
+
START_FILE = self.config.START_FILE,
|
|
275
|
+
N_THREAD = self.config.N_THREAD,
|
|
276
|
+
SET_MEMORY = self.config.SET_MEMORY,
|
|
277
|
+
FUNCTIONAL = self.config.FUNCTIONAL,
|
|
278
|
+
FC_COUNT = self.config.FC_COUNT,
|
|
279
|
+
BPA_FOLDER_DIRECTORY = self.config.iEIP_FOLDER_DIRECTORY,
|
|
280
|
+
Model_hess = np.eye(3*len(geometry_list_list[i])),
|
|
281
|
+
unrestrict = self.config.unrestrict,
|
|
282
|
+
BASIS_SET = self.config.BASIS_SET,
|
|
283
|
+
SUB_BASIS_SET = self.config.SUB_BASIS_SET,
|
|
284
|
+
electronic_charge = self.config.electronic_charge[i] or electric_charge_and_multiplicity_list[i][0],
|
|
285
|
+
spin_multiplicity = self.config.spin_multiplicity[i] or electric_charge_and_multiplicity_list[i][1],
|
|
286
|
+
excited_state = self.config.excite_state_list[i],
|
|
287
|
+
dft_grid = self.config.dft_grid,
|
|
288
|
+
ECP = self.config.ECP,
|
|
289
|
+
software_type = self.config.othersoft,
|
|
290
|
+
software_path_file = self.config.software_path_file
|
|
291
|
+
))
|
|
292
|
+
|
|
293
|
+
SP_list[i].cpcm_solv_model = self.config.cpcm_solv_model
|
|
294
|
+
SP_list[i].alpb_solv_model = self.config.alpb_solv_model
|
|
295
|
+
|
|
296
|
+
file_directory = FIO_img_list[i].make_psi4_input_file(geometry_list_list[i], 0)
|
|
297
|
+
file_directory_list.append(file_directory)
|
|
298
|
+
|
|
299
|
+
# Run optimization with appropriate method
|
|
300
|
+
if self.config.mf_mode != "None":
|
|
301
|
+
self.model_function_optimizer.model_function_optimization(
|
|
302
|
+
file_directory_list, SP_list, element_list_list,
|
|
303
|
+
self.config.electric_charge_and_multiplicity_list, FIO_img_list)
|
|
304
|
+
elif self.config.use_gnt:
|
|
305
|
+
self.newton_trajectory.main(file_directory_list[0], file_directory_list[1],
|
|
306
|
+
SP_list[0], SP_list[1], element_list_list[0],
|
|
307
|
+
self.config.electric_charge_and_multiplicity_list[0],
|
|
308
|
+
self.config.electric_charge_and_multiplicity_list[1],
|
|
309
|
+
FIO_img_list[0], FIO_img_list[1])
|
|
310
|
+
elif self.config.use_addf:
|
|
311
|
+
self.addf_like_method.run(file_directory_list[0],
|
|
312
|
+
SP_list[0],
|
|
313
|
+
self.config.electric_charge_and_multiplicity_list[0],
|
|
314
|
+
FIO_img_list[0])
|
|
315
|
+
elif self.config.use_2pshs:
|
|
316
|
+
self.twoPshs.run(file_directory_list[0],
|
|
317
|
+
SP_list[0], SP_list[1],
|
|
318
|
+
self.config.electric_charge_and_multiplicity_list[0],
|
|
319
|
+
FIO_img_list[0], FIO_img_list[1])
|
|
320
|
+
elif self.config.use_dimer:
|
|
321
|
+
self.dimer_method.run(file_directory_list[0],
|
|
322
|
+
SP_list[0],
|
|
323
|
+
self.config.electric_charge_and_multiplicity_list[0],
|
|
324
|
+
FIO_img_list[0])
|
|
325
|
+
|
|
326
|
+
else:
|
|
327
|
+
self.elastic_image_pair.iteration(
|
|
328
|
+
file_directory_list[0], file_directory_list[1],
|
|
329
|
+
SP_list[0], SP_list[1], element_list_list[0],
|
|
330
|
+
self.config.electric_charge_and_multiplicity_list[0],
|
|
331
|
+
self.config.electric_charge_and_multiplicity_list[1],
|
|
332
|
+
FIO_img_list[0], FIO_img_list[1])
|
|
333
|
+
|
|
334
|
+
return
|
|
335
|
+
|
|
336
|
+
def run(self):
|
|
337
|
+
"""Run the optimization process and display completion message"""
|
|
338
|
+
self.optimize()
|
|
339
|
+
print("completed...")
|
|
340
|
+
return
|