35 #include "./base/base_uses.f90"
41 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'semi_empirical_utils'
56 TYPE(semi_empirical_control_type),
POINTER :: se_control
57 TYPE(section_vals_type),
POINTER :: se_section
58 TYPE(cell_type),
POINTER :: cell
59 INTEGER,
INTENT(IN) :: output_unit
61 LOGICAL :: explicit1, explicit2
68 IF ((.NOT. explicit1) .AND. se_control%do_ewald_gks)
THEN
72 IF (rc /= se_control%cutoff_cou)
THEN
73 IF (output_unit > 0)
THEN
74 WRITE (output_unit, *)
75 WRITE (output_unit,
'(A,T37,A)')
" SEMIEMPIRICAL|", &
76 " Coulomb Integral cutoff/taper was redefined"
77 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Old value [a.u.]", &
79 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| New value [a.u.]", rc
80 WRITE (output_unit, *)
83 se_control%cutoff_cou = rc
84 IF (.NOT. explicit2) se_control%taper_cou = rc
85 ELSE IF ((.NOT. explicit1) .AND. (all(cell%perd == 0)))
THEN
89 IF (rc /= se_control%cutoff_cou)
THEN
90 IF (output_unit > 0)
THEN
91 WRITE (output_unit, *)
92 WRITE (output_unit,
'(A,T37,A)')
" SEMIEMPIRICAL|", &
93 " Coulomb Integral cutoff/taper was redefined"
94 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Old value [a.u.]", &
96 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| New value [a.u.]", rc
97 WRITE (output_unit, *)
100 se_control%cutoff_cou = rc
101 IF (.NOT. explicit2) se_control%taper_cou = rc
103 IF (output_unit > 0)
THEN
104 WRITE (output_unit, *)
105 WRITE (output_unit,
'(A,T44,A)')
" SEMIEMPIRICAL|", &
106 " Coulomb Integral cutoff/taper values"
107 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Cutoff [a.u.]", &
108 se_control%cutoff_cou
109 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Taper [a.u.]", &
111 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Range [a.u.]", &
113 WRITE (output_unit, *)
118 rc = se_control%cutoff_exc
119 IF (.NOT. explicit1)
THEN
124 IF (rc /= se_control%cutoff_exc)
THEN
125 IF (output_unit > 0)
THEN
126 WRITE (output_unit, *)
127 WRITE (output_unit,
'(A,T36,A)')
" SEMIEMPIRICAL|", &
128 " Exchange Integral cutoff/taper was redefined"
129 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Default value [a.u.]", &
130 se_control%cutoff_exc
131 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| New value [a.u.]", rc
132 WRITE (output_unit, *)
136 se_control%cutoff_exc = rc
137 IF (.NOT. explicit2) se_control%taper_exc = rc
139 IF (output_unit > 0)
THEN
140 WRITE (output_unit, *)
141 WRITE (output_unit,
'(A,T43,A)')
" SEMIEMPIRICAL|", &
142 " Exchange Integral cutoff/taper values"
143 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Cutoff [a.u.]", &
144 se_control%cutoff_exc
145 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Taper [a.u.]", &
147 WRITE (output_unit,
'(A,T71,F10.3)')
" SEMIEMPIRICAL| Range [a.u.]", &
149 WRITE (output_unit, *)
163 TYPE(se_taper_type),
POINTER :: se_taper
164 LOGICAL,
INTENT(IN),
OPTIONAL :: coulomb, exchange, lr_corr
166 LOGICAL :: check, l_coulomb, l_exchange, l_lrc
168 check = .NOT.
ASSOCIATED(se_taper%taper)
173 IF (
PRESENT(coulomb)) l_coulomb = coulomb
174 IF (
PRESENT(exchange)) l_exchange = exchange
175 IF (
PRESENT(lr_corr)) l_lrc = lr_corr
177 check = (.NOT. l_exchange) .AND. (.NOT. l_lrc)
179 se_taper%taper => se_taper%taper_cou
182 check = (.NOT. l_coulomb) .AND. (.NOT. l_lrc)
184 se_taper%taper => se_taper%taper_exc
187 check = (.NOT. l_coulomb) .AND. (.NOT. l_exchange)
189 se_taper%taper => se_taper%taper_lrc
199 TYPE(se_taper_type),
POINTER :: se_taper
203 check =
ASSOCIATED(se_taper%taper)
205 NULLIFY (se_taper%taper)
215 TYPE(semi_empirical_type),
POINTER :: sep
216 TYPE(gto_basis_set_type),
POINTER :: orb_basis_set
217 INTEGER,
INTENT(IN) :: ngauss
219 CHARACTER(LEN=6),
DIMENSION(:),
POINTER :: symbol
221 INTEGER,
DIMENSION(:),
POINTER :: lq, nq
222 REAL(kind=
dp),
DIMENSION(:),
POINTER :: zet
224 IF (
ASSOCIATED(sep))
THEN
227 IF (sep%natorb == 1) nshell = 1
228 IF (sep%natorb == 4) nshell = 2
229 IF (sep%natorb == 9) nshell = 3
230 ALLOCATE (nq(0:3), lq(0:3), zet(0:3))
232 ALLOCATE (symbol(0:3))
241 zet(l) = sep%sto_exponents(l)
242 IF (l == 0)
WRITE (symbol(0),
'(I1,A1)') nq(l),
"S"
243 IF (l == 1)
WRITE (symbol(1),
'(I1,A1)') nq(l),
"P"
244 IF (l == 2)
WRITE (symbol(2),
'(I1,A1)') nq(l),
"D"
250 nq=nq, lq=lq, zet=zet)
259 cpabort(
"The pointer sep is not associated")
272 TYPE(semi_empirical_type),
POINTER :: sep
273 INTEGER,
INTENT(IN) :: z, method
275 IF (
ASSOCIATED(sep))
THEN
277 cpabort(
"Atomic number < 0")
301 cpabort(
"Semiempirical method unknown")
304 cpabort(
"The pointer sep is not associated")
308 IF (.NOT. sep%defined) &
309 CALL cp_abort(__location__, &
310 "Semiempirical type ("//trim(sep%name)//
") cannot be defined for "// &
311 "the requested parameterization.")
321 IF (sep%natorb > 0) sep%core_size = 1
322 IF (sep%natorb > 1) sep%core_size = 4
323 IF (sep%dorb) sep%core_size = 10
326 sep%atm_int_size = (sep%natorb + 1)*sep%natorb/2
337 INTEGER,
INTENT(IN) :: se_method
340 SELECT CASE (se_method)
subroutine, public allocate_sto_basis_set(sto_basis_set)
...
subroutine, public create_gto_from_sto_basis(sto_basis_set, gto_basis_set, ngauss, ortho)
...
subroutine, public set_sto_basis_set(sto_basis_set, name, nshell, symbol, nq, lq, zet)
...
Handles all functions related to the CELL.
real(kind=dp) function, public plane_distance(h, k, l, cell)
Calculate the distance between two lattice planes as defined by a triple of Miller indices (hkl).
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Defines the basic variable types.
integer, parameter, public dp
Setup and Methods for semi-empirical multipole types.
subroutine, public semi_empirical_mpole_p_setup(mpoles, se_parameter, method)
Setup semi-empirical mpole type This function setup for each semi-empirical type a structure containi...
Utilities to post-process semi-empirical parameters.
subroutine, public setup_1c_2el_int(sep)
Fills the 1 center 2 electron integrals for the construction of the one-electron fock matrix.
integer function, public get_se_basis(sep, l)
Gives back the number of basis function for each l.
Default parameter sets for semi empirical models: sep%... ass, asp, app, a.u. parameters for the SCP-...
subroutine, public pdg_default_parameter(sep, z)
Default parameter sets for semi empirical models: PDDG.
subroutine, public am1_default_parameter(sep, z)
Default parameter sets for semi empirical models: AM1.
subroutine, public pcharge_default_parameter(sep, z)
Default parameter sets for semi empirical models: POINT_CHARGE.
subroutine, public pm6fm_default_parameter(sep, z)
Default parameter sets for semi empirical models: PM6-FM.
subroutine, public rm1_default_parameter(sep, z)
Default parameter sets for semi empirical models: RM1.
subroutine, public pm6_default_parameter(sep, z)
Default parameter sets for semi empirical models: PM6.
subroutine, public pnnl_default_parameter(sep, z)
Default parameter sets for semi empirical models developed at PNNL.
subroutine, public pm3_default_parameter(sep, z)
Default parameter sets for semi empirical models: PM3.
subroutine, public mndo_default_parameter(sep, z, itype)
Default parameter sets for semi empirical models: MNDO.
Definition of the semi empirical parameter types.
Working with the semi empirical parameter types.
subroutine, public finalize_se_taper(se_taper)
Finalizes the semi-empirical taper for a chunk calculation.
integer function, public get_se_type(se_method)
Gives back the unique semi_empirical METHOD type.
subroutine, public initialize_se_taper(se_taper, coulomb, exchange, lr_corr)
Initializes the semi-empirical taper for a chunk calculation.
subroutine, public se_param_set_default(sep, z, method)
Initialize parameter for a semi_empirival type.
subroutine, public se_cutoff_compatible(se_control, se_section, cell, output_unit)
Reset cutoffs trying to be somehow a bit smarter.
subroutine, public init_se_param(sep, orb_basis_set, ngauss)
Initialize semi_empirical type.