73#include "./base/base_uses.f90"
78 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
79 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qmmm_init'
113 mm_el_pot_radius_corr, mm_atom_index, mm_link_atoms, &
114 mm_link_scale_factor, added_shells, shell_model)
116 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges
117 REAL(
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg, mm_el_pot_radius, &
118 mm_el_pot_radius_corr
119 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index, mm_link_atoms
120 REAL(
dp),
DIMENSION(:),
POINTER :: mm_link_scale_factor
122 LOGICAL :: shell_model
124 INTEGER :: i, ilink, indmm, indshell, ishell
126 REAL(
dp) :: qcore, qi, qshell, rc, ri
131 TYPE(
particle_type),
DIMENSION(:),
POINTER :: core_set, particle_set, shell_set
134 NULLIFY (particle_set, my_kind, added_shells)
135 CALL cp_subsys_get(subsys=subsys, particles=particles, core_particles=core_particles, &
136 shell_particles=shell_particles)
137 particle_set => particles%els
139 IF (all(particle_set(:)%shell_index .EQ. 0))
THEN
140 shell_model = .false.
146 IF (shell_model)
THEN
147 shell_set => shell_particles%els
148 core_set => core_particles%els
149 ishell =
SIZE(shell_set)
151 added_shells%added_particles => shell_set
152 added_shells%added_cores => core_set
155 DO i = 1,
SIZE(mm_atom_index)
156 indmm = mm_atom_index(i)
157 my_kind => particle_set(indmm)%atomic_kind
158 CALL get_atomic_kind(atomic_kind=my_kind, fist_potential=my_potential, &
159 shell_active=is_shell, shell=shell_kind)
164 IF (
ASSOCIATED(charges)) qi = charges(indmm)
166 mm_el_pot_radius(i) = ri
167 mm_el_pot_radius_corr(i) = rc
169 indshell = particle_set(indmm)%shell_index
170 IF (
ASSOCIATED(shell_kind))
THEN
174 mm_atom_chrg(i) = qcore
176 added_shells%mm_core_index(indshell) = indmm
177 added_shells%mm_core_chrg(indshell) = qshell
178 added_shells%mm_el_pot_radius(indshell) = ri*1.0_dp
179 added_shells%mm_el_pot_radius_corr(indshell) = rc*1.0_dp
183 IF (
ASSOCIATED(mm_link_atoms))
THEN
184 DO ilink = 1,
SIZE(mm_link_atoms)
185 DO i = 1,
SIZE(mm_atom_index)
186 IF (mm_atom_index(i) == mm_link_atoms(ilink))
EXIT
188 indmm = mm_atom_index(i)
189 mm_atom_chrg(i) = mm_atom_chrg(i)*mm_link_scale_factor(ilink)
210 SUBROUTINE print_qmmm_charges(mm_atom_index, mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, &
211 added_charges, added_shells, qmmm_section, nocompatibility, shell_model)
212 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index
213 REAL(
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg, mm_el_pot_radius, &
214 mm_el_pot_radius_corr
218 LOGICAL,
INTENT(IN) :: nocompatibility, shell_model
220 INTEGER :: i, ind1, ind2, indmm, iw
221 REAL(kind=
dp) :: qi, qtot, rc, ri
229 WRITE (iw, fmt=
"(/,T2,A)") repeat(
"-", 79)
230 WRITE (iw, fmt=
'(/5X,A)')
"MM POINT CHARGES GENERATING THE QM/MM ELECTROSTATIC POTENTIAL"
231 WRITE (iw, fmt=
"(/,T2,A)") repeat(
"-", 79)
232 DO i = 1,
SIZE(mm_atom_index)
233 indmm = mm_atom_index(i)
236 ri = mm_el_pot_radius(i)
237 rc = mm_el_pot_radius_corr(i)
238 IF (nocompatibility)
THEN
239 WRITE (iw,
'(5X,A9,T15,I5,T28,A8,T38,F12.6,T60,A8,T69,F12.6)')
' MM ATOM:', indmm,
' RADIUS:', ri, &
242 WRITE (iw,
'(5X,A9,T15,I5,T28,A8,T38,F12.6,T60,A8,T69,F12.6,/,T56,A12,T69,F12.6)') &
243 ' MM ATOM:', indmm,
' RADIUS:', ri,
' CHARGE:', qi,
'CORR. RADIUS', rc
246 IF (added_charges%num_mm_atoms /= 0)
THEN
247 WRITE (iw, fmt=
"(/,T2,A)") repeat(
"-", 79)
248 WRITE (iw,
'(/5X,A)')
"ADDED POINT CHARGES GENERATING THE QM/MM ELECTROSTATIC POTENTIAL"
249 WRITE (iw, fmt=
"(/,T2,A)") repeat(
"-", 79)
250 DO i = 1,
SIZE(added_charges%mm_atom_index)
251 indmm = added_charges%mm_atom_index(i)
252 qi = added_charges%mm_atom_chrg(i)
254 ri = added_charges%mm_el_pot_radius(i)
255 ind1 = added_charges%add_env(i)%Index1
256 ind2 = added_charges%add_env(i)%Index2
257 IF (nocompatibility)
THEN
258 WRITE (iw,
'(5X,A9,I5,T25,A8,T35,F12.6,T50,A8,T59,F12.6,I5,I5)')
'MM POINT:', indmm,
' RADIUS:', ri, &
259 ' CHARGE:', qi, ind1, ind2
261 WRITE (iw,
'(5X,A9,I5,T25,A8,T35,F12.6,T50,A8,T59,F12.6,I5,I5,/,T56,A12,T69,F12.6)') &
262 'MM POINT:', indmm,
' RADIUS:', ri,
' CHARGE:', qi, ind1, ind2,
'CORR. RADIUS', rc
268 IF (shell_model)
THEN
269 WRITE (iw, fmt=
"(/,T2,A)") repeat(
"-", 73)
270 WRITE (iw,
'(/5X,A)')
"ADDED SHELL CHARGES GENERATING THE QM/MM ELECTROSTATIC POTENTIAL"
271 WRITE (iw, fmt=
"(/,T2,A)") repeat(
"-", 73)
273 DO i = 1,
SIZE(added_shells%mm_core_index)
274 indmm = added_shells%mm_core_index(i)
275 qi = added_shells%mm_core_chrg(i)
277 ri = added_shells%mm_el_pot_radius(i)
278 IF (nocompatibility)
THEN
279 WRITE (iw,
'(7X,A,I5,A8,F12.6,A8,F12.6,3F12.6)')
'SHELL:', indmm,
' RADIUS:', ri, &
280 ' CHARGE:', qi, added_shells%added_particles(i)%r
282 WRITE (iw,
'(7X,A,I5,A8,F12.6,A8,F12.6,A,F12.6)')
'SHELL:', indmm,
' RADIUS:', ri, &
283 ' CHARGE:', qi,
' CORR. RADIUS', rc
290 WRITE (iw, fmt=
"(/,T2,A)") repeat(
"-", 79)
291 WRITE (iw,
'(/,T50,A,T69,F12.6)')
' TOTAL CHARGE:', qtot
292 WRITE (iw, fmt=
"(/,T2,A,/)") repeat(
"-", 79)
295 "PRINT%QMMM_CHARGES")
310 INTEGER :: i, iw, mm_index, qm_index
311 REAL(kind=
dp) :: alpha
317 IF (
ASSOCIATED(qmmm_links))
THEN
318 WRITE (iw, fmt=
"(/,T2, A)") repeat(
"-", 73)
319 WRITE (iw, fmt=
"(/,T31,A)")
" QM/MM LINKS "
320 WRITE (iw, fmt=
"(/,T2, A)") repeat(
"-", 73)
321 IF (
ASSOCIATED(qmmm_links%imomm))
THEN
322 WRITE (iw, fmt=
"(/,T31,A)")
" IMOMM TYPE LINK "
323 DO i = 1,
SIZE(qmmm_links%imomm)
324 qm_index = qmmm_links%imomm(i)%link%qm_index
325 mm_index = qmmm_links%imomm(i)%link%mm_index
326 alpha = qmmm_links%imomm(i)%link%alpha
327 WRITE (iw, fmt=
"(T2,A,T20,A9,I8,1X,A9,I8,T62,A6,F12.6)")
"TYPE: IMOMM", &
328 "QM INDEX:", qm_index,
"MM INDEX:", mm_index,
"ALPHA:", alpha
331 IF (
ASSOCIATED(qmmm_links%pseudo))
THEN
332 WRITE (iw, fmt=
"(/,T31,A)")
" PSEUDO TYPE LINK "
333 DO i = 1,
SIZE(qmmm_links%pseudo)
334 qm_index = qmmm_links%pseudo(i)%link%qm_index
335 mm_index = qmmm_links%pseudo(i)%link%mm_index
336 WRITE (iw, fmt=
"(T2,A,T20,A9,I8,1X,A9,I8)")
"TYPE: PSEUDO", &
337 "QM INDEX:", qm_index,
"MM INDEX:", mm_index
340 WRITE (iw, fmt=
"(/,T2,A,/)") repeat(
"-", 73)
342 WRITE (iw, fmt=
"(/,T2, A)") repeat(
"-", 73)
343 WRITE (iw, fmt=
"(/,T26,A)")
" NO QM/MM LINKS DETECTED"
344 WRITE (iw, fmt=
"(/,T2, A)") repeat(
"-", 73)
348 "PRINT%qmmm_link_info")
366 mm_atom_chrg, qs_env, added_charges, added_shells, &
367 print_section, qmmm_section)
370 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg
377 REAL(kind=
dp) :: maxchrg
378 REAL(kind=
dp),
DIMENSION(:),
POINTER :: maxradius, maxradius2
381 NULLIFY (maxradius, maxradius2, pw_env)
383 maxchrg = maxval(abs(mm_atom_chrg(:)))
385 IF (qmmm_env_qm%add_mm_charges) maxchrg = max(maxchrg, maxval(abs(added_charges%mm_atom_chrg(:))))
389 mm_el_pot_radius=qmmm_env_qm%mm_el_pot_radius, &
390 mm_el_pot_radius_corr=qmmm_env_qm%mm_el_pot_radius_corr, &
391 qmmm_coupl_type=qmmm_env_qm%qmmm_coupl_type, &
392 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
393 maxradius=maxradius, &
395 compatibility=qmmm_env_qm%compatibility, &
396 print_section=print_section, &
397 qmmm_section=qmmm_section)
399 IF (qmmm_env_qm%move_mm_charges .OR. qmmm_env_qm%add_mm_charges)
THEN
403 mm_el_pot_radius=added_charges%mm_el_pot_radius, &
404 mm_el_pot_radius_corr=added_charges%mm_el_pot_radius_corr, &
405 qmmm_coupl_type=qmmm_env_qm%qmmm_coupl_type, &
406 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
407 maxradius=maxradius2, &
409 compatibility=qmmm_env_qm%compatibility, &
410 print_section=print_section, &
411 qmmm_section=qmmm_section)
413 SELECT CASE (qmmm_env_qm%qmmm_coupl_type)
415 DO i = 1,
SIZE(maxradius)
416 maxradius(i) = max(maxradius(i), maxradius2(i))
420 IF (
ASSOCIATED(maxradius2))
DEALLOCATE (maxradius2)
423 IF (qmmm_env_qm%added_shells%num_mm_atoms .GT. 0)
THEN
425 maxchrg = maxval(abs(added_shells%mm_core_chrg(:)))
429 mm_el_pot_radius=added_shells%mm_el_pot_radius, &
430 mm_el_pot_radius_corr=added_shells%mm_el_pot_radius_corr, &
431 qmmm_coupl_type=qmmm_env_qm%qmmm_coupl_type, &
432 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
433 maxradius=maxradius2, &
435 compatibility=qmmm_env_qm%compatibility, &
436 print_section=print_section, &
437 qmmm_section=qmmm_section)
439 SELECT CASE (qmmm_env_qm%qmmm_coupl_type)
441 DO i = 1,
SIZE(maxradius)
442 maxradius(i) = max(maxradius(i), maxradius2(i))
446 IF (
ASSOCIATED(maxradius2))
DEALLOCATE (maxradius2)
450 qmmm_env_qm%maxradius => maxradius
466 added_charges, added_shells, print_section)
474 mm_el_pot_radius=qmmm_env_qm%mm_el_pot_radius, &
475 potentials=qmmm_env_qm%potentials, &
476 pgfs=qmmm_env_qm%pgfs, &
478 compatibility=qmmm_env_qm%compatibility, &
479 print_section=print_section)
481 IF (qmmm_env_qm%move_mm_charges .OR. qmmm_env_qm%add_mm_charges)
THEN
484 mm_el_pot_radius=added_charges%mm_el_pot_radius, &
485 potentials=added_charges%potentials, &
486 pgfs=added_charges%pgfs, &
488 compatibility=qmmm_env_qm%compatibility, &
489 print_section=print_section)
492 IF (qmmm_env_qm%added_shells%num_mm_atoms .GT. 0)
THEN
495 mm_el_pot_radius=added_shells%mm_el_pot_radius, &
496 potentials=added_shells%potentials, &
497 pgfs=added_shells%pgfs, &
499 compatibility=qmmm_env_qm%compatibility, &
500 print_section=print_section)
522 added_charges, added_shells, qmmm_periodic, print_section, mm_atom_chrg)
524 TYPE(
cell_type),
POINTER :: qm_cell_small, mm_cell
530 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg
532 REAL(kind=
dp) :: maxchrg
535 IF (qmmm_env_qm%periodic)
THEN
537 NULLIFY (dft_control)
538 CALL get_qs_env(qs_env, dft_control=dft_control)
540 IF (dft_control%qs_control%semi_empirical)
THEN
541 cpabort(
"QM/MM periodic calculations not implemented for semi empirical methods")
542 ELSE IF (dft_control%qs_control%dftb)
THEN
544 qmmm_coupl_type=qmmm_env_qm%qmmm_coupl_type, mm_cell=mm_cell, &
545 para_env=para_env, qmmm_periodic=qmmm_periodic, print_section=print_section)
546 ELSE IF (dft_control%qs_control%xtb)
THEN
548 qmmm_coupl_type=qmmm_env_qm%qmmm_coupl_type, mm_cell=mm_cell, &
549 para_env=para_env, qmmm_periodic=qmmm_periodic, print_section=print_section)
553 maxchrg = maxval(abs(mm_atom_chrg(:)))
554 IF (qmmm_env_qm%add_mm_charges) maxchrg = max(maxchrg, maxval(abs(added_charges%mm_atom_chrg(:))))
557 per_potentials=qmmm_env_qm%per_potentials, &
558 potentials=qmmm_env_qm%potentials, &
559 pgfs=qmmm_env_qm%pgfs, &
560 qm_cell_small=qm_cell_small, &
562 compatibility=qmmm_env_qm%compatibility, &
563 qmmm_periodic=qmmm_periodic, &
564 print_section=print_section, &
565 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
567 ncp=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts, &
568 ncpl=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts_local)
570 IF (qmmm_env_qm%move_mm_charges .OR. qmmm_env_qm%add_mm_charges)
THEN
573 per_potentials=added_charges%per_potentials, &
574 potentials=added_charges%potentials, &
575 pgfs=added_charges%pgfs, &
576 qm_cell_small=qm_cell_small, &
578 compatibility=qmmm_env_qm%compatibility, &
579 qmmm_periodic=qmmm_periodic, &
580 print_section=print_section, &
581 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
583 ncp=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts, &
584 ncpl=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts_local)
587 IF (qmmm_env_qm%added_shells%num_mm_atoms .GT. 0)
THEN
590 per_potentials=added_shells%per_potentials, &
591 potentials=added_shells%potentials, &
592 pgfs=added_shells%pgfs, &
593 qm_cell_small=qm_cell_small, &
595 compatibility=qmmm_env_qm%compatibility, &
596 qmmm_periodic=qmmm_periodic, &
597 print_section=print_section, &
598 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
600 ncp=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts, &
601 ncpl=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts_local)
628 qm_atom_index, mm_atom_index, qm_cell_small, qmmm_coupl_type, eps_mm_rspace, &
633 CHARACTER(len=default_string_length), &
634 DIMENSION(:),
POINTER :: qm_atom_type
635 INTEGER,
DIMENSION(:),
POINTER :: qm_atom_index, mm_atom_index
636 TYPE(
cell_type),
POINTER :: qm_cell_small
637 INTEGER,
INTENT(OUT) :: qmmm_coupl_type
638 REAL(kind=
dp),
INTENT(OUT) :: eps_mm_rspace
639 LOGICAL,
INTENT(OUT) :: qmmm_link
642 CHARACTER(len=default_string_length) :: atmname, mm_atom_kind
643 INTEGER :: i, icount, ikind, ikindr, my_type, &
644 n_rep_val, nkind, size_mm_system
645 INTEGER,
DIMENSION(:),
POINTER :: mm_link_atoms
646 LOGICAL :: explicit, is_mm, is_qm
647 REAL(kind=
dp) :: tmp_radius, tmp_radius_c
648 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tmp_sph_cut
653 image_charge_section, mm_kinds
655 NULLIFY (mm_link_atoms, cell_section, tmp_sph_cut)
656 NULLIFY (image_charge_section)
665 CALL read_cell(qm_cell_small, qm_cell_small, cell_section=cell_section, &
666 check_for_ref=.false., para_env=para_env)
667 qm_cell_small%tag =
"CELL_QM"
671 cpassert(
SIZE(tmp_sph_cut) == 2)
672 qmmm_env%spherical_cutoff = tmp_sph_cut
673 IF (qmmm_env%spherical_cutoff(1) <= 0.0_dp)
THEN
674 qmmm_env%spherical_cutoff(2) = 0.0_dp
676 IF (qmmm_env%spherical_cutoff(2) <= 0.0_dp) qmmm_env%spherical_cutoff(2) = epsilon(0.0_dp)
677 tmp_radius = qmmm_env%spherical_cutoff(1) - 20.0_dp*qmmm_env%spherical_cutoff(2)
678 IF (tmp_radius <= 0.0_dp) &
679 CALL cp_abort(__location__, &
680 "SPHERICAL_CUTOFF(1) > 20*SPHERICAL_CUTOFF(1)! Please correct parameters for "// &
681 "the Spherical Cutoff in order to satisfy the previous condition!")
687 CALL cp_subsys_get(subsys=subsys_mm, atomic_kinds=atomic_kinds)
688 DO ikind = 1,
SIZE(atomic_kinds%els)
689 atomic_kind => atomic_kinds%els(ikind)
691 fist_potential=fist_potential)
693 qmmm_radius=tmp_radius, &
694 qmmm_corr_radius=tmp_radius)
696 fist_potential=fist_potential)
698 CALL setup_qm_atom_list(qmmm_section=qmmm_section, &
699 qm_atom_index=qm_atom_index, &
700 qm_atom_type=qm_atom_type, &
701 mm_link_atoms=mm_link_atoms, &
712 set_radius_pot_0:
DO ikindr = 1,
SIZE(atomic_kinds%els)
713 atomic_kind => atomic_kinds%els(ikindr)
716 fist_potential=fist_potential)
717 CALL set_potential(potential=fist_potential, qmmm_radius=tmp_radius, &
718 qmmm_corr_radius=tmp_radius)
720 fist_potential=fist_potential)
721 END DO set_radius_pot_0
730 tmp_radius_c = tmp_radius
734 set_radius_pot_1:
DO ikindr = 1,
SIZE(atomic_kinds%els)
735 atomic_kind => atomic_kinds%els(ikindr)
738 IF (trim(mm_atom_kind) == atmname)
THEN
740 fist_potential=fist_potential)
742 qmmm_radius=tmp_radius, &
743 qmmm_corr_radius=tmp_radius_c)
745 fist_potential=fist_potential)
747 END DO set_radius_pot_1
757 cpabort(
"QMMM section not present in input file!")
762 size_mm_system =
SIZE(subsys_mm%particles%els) -
SIZE(qm_atom_index)
763 IF (qmmm_link .AND.
ASSOCIATED(mm_link_atoms)) size_mm_system = size_mm_system +
SIZE(mm_link_atoms)
764 ALLOCATE (mm_atom_index(size_mm_system))
767 DO i = 1,
SIZE(subsys_mm%particles%els)
769 IF (any(qm_atom_index == i))
THEN
772 IF (
ASSOCIATED(mm_link_atoms))
THEN
773 IF (any(mm_link_atoms == i) .AND. qmmm_link) is_mm = .true.
777 IF (icount <= size_mm_system) mm_atom_index(icount) = i
780 cpassert(icount == size_mm_system)
781 IF (
ASSOCIATED(mm_link_atoms))
THEN
782 DEALLOCATE (mm_link_atoms)
787 IF (qmmm_env%image_charge)
THEN
790 IF (explicit) qmmm_env%image_charge_pot%all_mm = .false.
792 IF (qmmm_env%image_charge_pot%all_mm)
THEN
793 qmmm_env%image_charge_pot%image_mm_list => mm_atom_index
795 CALL setup_image_atom_list(image_charge_section, qmmm_env, &
796 qm_atom_index, subsys_mm)
799 qmmm_env%image_charge_pot%particles_all => subsys_mm%particles%els
802 r_val=qmmm_env%image_charge_pot%V0)
804 r_val=qmmm_env%image_charge_pot%eta)
807 SELECT CASE (my_type)
809 qmmm_env%image_charge_pot%coeff_iterative = .false.
811 qmmm_env%image_charge_pot%coeff_iterative = .true.
815 l_val=qmmm_env%image_charge_pot%image_restart)
818 i_val=qmmm_env%image_charge_pot%image_matrix_method)
820 IF (qmmm_env%image_charge_pot%image_matrix_method .EQ.
do_eri_mme)
THEN
824 hmat=qm_cell_small%hmat, is_ortho=qm_cell_small%orthorhombic, &
825 zet_min=qmmm_env%image_charge_pot%eta, &
826 zet_max=qmmm_env%image_charge_pot%eta, &
851 mm_link_atoms, mm_link_scale_factor, &
852 fist_scale_charge_link, qmmm_coupl_type, &
856 INTEGER,
DIMENSION(:),
POINTER :: qm_atom_index, mm_link_atoms
857 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_link_scale_factor, &
858 fist_scale_charge_link
859 INTEGER,
INTENT(OUT) :: qmmm_coupl_type
860 LOGICAL,
INTENT(OUT) :: qmmm_link
865 NULLIFY (qmmm_ff_section)
870 CALL setup_qm_atom_list(qmmm_section, qm_atom_index=qm_atom_index, qmmm_link=qmmm_link, &
871 mm_link_atoms=mm_link_atoms, mm_link_scale_factor=mm_link_scale_factor, &
872 fist_scale_charge_link=fist_scale_charge_link)
878 IF (qmmm_env%use_qmmm_ff)
THEN
880 l_val=qmmm_env%multiple_potential)
881 CALL read_qmmm_ff_section(qmmm_ff_section, qmmm_env%inp_info)
895 SUBROUTINE read_qmmm_ff_section(qmmm_ff_section, inp_info)
899 INTEGER :: n_gd, n_gp, n_lj, n_wl, np
924 np = n_lj + n_wl + n_gd
927 CALL read_gd_section(inp_info%nonbonded, gd_section, start=n_lj + n_wl)
930 np = n_lj + n_wl + n_gd + n_gp
933 CALL read_gp_section(inp_info%nonbonded, gp_section, start=n_lj + n_wl + n_gd)
955 np = n_lj + n_wl + n_gd
958 CALL read_gd_section(inp_info%nonbonded14, gd_section, start=n_lj + n_wl)
961 np = n_lj + n_wl + n_gd + n_gp
964 CALL read_gp_section(inp_info%nonbonded14, gp_section, start=n_lj + n_wl + n_gd)
967 END SUBROUTINE read_qmmm_ff_section
982 SUBROUTINE setup_qm_atom_list(qmmm_section, qm_atom_index, qm_atom_type, &
983 mm_link_atoms, mm_link_scale_factor, qmmm_link, fist_scale_charge_link)
985 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: qm_atom_index
986 CHARACTER(len=default_string_length), &
987 DIMENSION(:),
OPTIONAL,
POINTER :: qm_atom_type
988 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: mm_link_atoms
989 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: mm_link_scale_factor
990 LOGICAL,
INTENT(OUT),
OPTIONAL :: qmmm_link
991 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: fist_scale_charge_link
993 CHARACTER(len=default_string_length) :: qm_atom_kind, qm_link_element
994 INTEGER :: ikind, k, link_involv_mm, link_type, &
995 mm_index, n_var, nkind, nlinks, &
997 INTEGER,
DIMENSION(:),
POINTER :: mm_indexes
999 REAL(kind=
dp) :: scale_f
1015 num_qm_atom_tot = num_qm_atom_tot +
SIZE(mm_indexes)
1027 DO ikind = 1, nlinks
1030 SELECT CASE (link_type)
1032 num_qm_atom_tot = num_qm_atom_tot + 1
1033 link_involv_mm = link_involv_mm + 1
1035 num_qm_atom_tot = num_qm_atom_tot + 1
1043 IF (
PRESENT(mm_link_scale_factor) .AND. (link_involv_mm /= 0)) &
1044 ALLOCATE (mm_link_scale_factor(link_involv_mm))
1045 IF (
PRESENT(fist_scale_charge_link) .AND. (link_involv_mm /= 0)) &
1046 ALLOCATE (fist_scale_charge_link(link_involv_mm))
1047 IF (
PRESENT(mm_link_atoms) .AND. (link_involv_mm /= 0)) &
1048 ALLOCATE (mm_link_atoms(link_involv_mm))
1049 IF (
PRESENT(qm_atom_index))
ALLOCATE (qm_atom_index(num_qm_atom_tot))
1050 IF (
PRESENT(qm_atom_type))
ALLOCATE (qm_atom_type(num_qm_atom_tot))
1051 IF (
PRESENT(qm_atom_index)) qm_atom_index = 0
1052 IF (
PRESENT(qm_atom_type)) qm_atom_type =
" "
1059 IF (
PRESENT(qm_atom_index))
THEN
1060 qm_atom_index(num_qm_atom_tot:num_qm_atom_tot +
SIZE(mm_indexes) - 1) = mm_indexes(:)
1062 IF (
PRESENT(qm_atom_type))
THEN
1065 qm_atom_type(num_qm_atom_tot:num_qm_atom_tot +
SIZE(mm_indexes) - 1) = qm_atom_kind
1067 num_qm_atom_tot = num_qm_atom_tot +
SIZE(mm_indexes)
1070 IF (
PRESENT(mm_link_scale_factor) .AND. (link_involv_mm /= 0)) mm_link_scale_factor = 0.0_dp
1071 IF (
PRESENT(fist_scale_charge_link) .AND. (link_involv_mm /= 0)) fist_scale_charge_link = 0.0_dp
1072 IF (
PRESENT(mm_link_atoms) .AND. (link_involv_mm /= 0)) mm_link_atoms = 0
1074 DO ikind = 1, nlinks
1075 IF (
PRESENT(qm_atom_type))
THEN
1077 qm_atom_type(num_qm_atom_tot:num_qm_atom_tot) = trim(qm_link_element)//
"_LINK"
1079 IF (
PRESENT(qm_atom_index))
THEN
1081 cpassert(all(qm_atom_index /= mm_index))
1082 qm_atom_index(num_qm_atom_tot:num_qm_atom_tot) = mm_index
1083 num_qm_atom_tot = num_qm_atom_tot + 1
1085 IF (
PRESENT(mm_link_atoms) .AND. (link_involv_mm /= 0))
THEN
1087 mm_link_atoms(ikind) = mm_index
1089 IF (
PRESENT(mm_link_scale_factor) .AND. (link_involv_mm /= 0))
THEN
1091 mm_link_scale_factor(ikind) = scale_f
1093 IF (
PRESENT(fist_scale_charge_link) .AND. (link_involv_mm /= 0))
THEN
1095 fist_scale_charge_link(ikind) = scale_f
1099 cpassert(num_qm_atom_tot - 1 ==
SIZE(qm_atom_index))
1101 END SUBROUTINE setup_qm_atom_list
1115 SUBROUTINE setup_qmmm_links(qmmm_section, qmmm_links, mm_el_pot_radius, mm_el_pot_radius_corr, &
1119 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_el_pot_radius, mm_el_pot_radius_corr
1120 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index
1121 INTEGER,
INTENT(IN) :: iw
1123 INTEGER :: ikind, link_type, mm_index, n_gho, &
1124 n_imomm, n_pseudo, n_rep_val, n_tot, &
1126 INTEGER,
DIMENSION(:),
POINTER :: wrk_tmp
1127 REAL(kind=
dp) :: alpha, my_radius
1136 cpassert(nlinks /= 0)
1137 DO ikind = 1, nlinks
1138 CALL section_vals_val_get(qmmm_link_section,
"LINK_TYPE", i_rep_section=ikind, i_val=link_type)
1143 n_tot = n_imomm + n_gho + n_pseudo
1144 cpassert(n_tot /= 0)
1145 ALLOCATE (qmmm_links)
1146 NULLIFY (qmmm_links%imomm, &
1149 IF (n_imomm /= 0)
THEN
1150 ALLOCATE (qmmm_links%imomm(n_imomm))
1151 ALLOCATE (wrk_tmp(n_imomm))
1152 DO ikind = 1, n_imomm
1153 NULLIFY (qmmm_links%imomm(ikind)%link)
1154 ALLOCATE (qmmm_links%imomm(ikind)%link)
1157 DO ikind = 1, nlinks
1158 CALL section_vals_val_get(qmmm_link_section,
"LINK_TYPE", i_rep_section=ikind, i_val=link_type)
1160 n_imomm = n_imomm + 1
1164 CALL section_vals_val_get(qmmm_link_section,
"RADIUS", i_rep_section=ikind, n_rep_val=n_rep_val)
1165 qmmm_links%imomm(n_imomm)%link%qm_index = qm_index
1166 qmmm_links%imomm(n_imomm)%link%mm_index = mm_index
1167 qmmm_links%imomm(n_imomm)%link%alpha = alpha
1168 wrk_tmp(n_imomm) = mm_index
1169 IF (n_rep_val == 1)
THEN
1171 WHERE (mm_atom_index == mm_index) mm_el_pot_radius = my_radius
1172 WHERE (mm_atom_index == mm_index) mm_el_pot_radius_corr = my_radius
1174 CALL section_vals_val_get(qmmm_link_section,
"CORR_RADIUS", i_rep_section=ikind, n_rep_val=n_rep_val)
1175 IF (n_rep_val == 1)
THEN
1176 CALL section_vals_val_get(qmmm_link_section,
"CORR_RADIUS", i_rep_section=ikind, r_val=my_radius)
1177 WHERE (mm_atom_index == mm_index) mm_el_pot_radius_corr = my_radius
1184 DO ikind = 1,
SIZE(wrk_tmp)
1185 IF (count(wrk_tmp == wrk_tmp(ikind)) > 1)
THEN
1186 WRITE (iw,
'(/A)')
"In the IMOMM scheme no more than one QM atom can be bounded to the same MM atom."
1187 WRITE (iw,
'(A)')
"Multiple link MM atom not allowed. Check your link sections."
1191 DEALLOCATE (wrk_tmp)
1194 IF (n_pseudo /= 0)
THEN
1195 ALLOCATE (qmmm_links%pseudo(n_pseudo))
1196 DO ikind = 1, n_pseudo
1197 NULLIFY (qmmm_links%pseudo(ikind)%link)
1198 ALLOCATE (qmmm_links%pseudo(ikind)%link)
1201 DO ikind = 1, nlinks
1202 CALL section_vals_val_get(qmmm_link_section,
"LINK_TYPE", i_rep_section=ikind, i_val=link_type)
1204 n_pseudo = n_pseudo + 1
1207 qmmm_links%pseudo(n_pseudo)%link%qm_index = qm_index
1208 qmmm_links%pseudo(n_pseudo)%link%mm_index = mm_index
1213 IF (n_gho /= 0)
THEN
1235 mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, &
1236 added_charges, mm_atom_index)
1238 LOGICAL,
INTENT(OUT) :: move_mm_charges, add_mm_charges
1239 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg, mm_el_pot_radius, &
1240 mm_el_pot_radius_corr
1242 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index
1244 INTEGER :: i_add, icount, ikind, ind1, index1, &
1245 index2, n_add_tot, n_adds, n_move_tot, &
1246 n_moves, n_rep_val, nlinks
1248 REAL(kind=
dp) :: alpha, c_radius, charge, radius
1253 move_mm_charges = .false.
1254 add_mm_charges = .false.
1255 NULLIFY (qmmm_link_section, move_section, add_section)
1258 cpassert(nlinks /= 0)
1262 DO ikind = 1, nlinks
1264 i_rep_section=ikind)
1267 i_rep_section=ikind)
1269 n_move_tot = n_move_tot + n_moves
1270 n_add_tot = n_add_tot + n_adds
1272 icount = n_move_tot + n_add_tot
1273 IF (n_add_tot /= 0) add_mm_charges = .true.
1274 IF (n_move_tot /= 0) move_mm_charges = .true.
1283 DO ikind = 1, nlinks
1285 i_rep_section=ikind)
1286 CALL section_vals_get(move_section, explicit=explicit, n_repetition=n_moves)
1291 DO i_add = 1, n_moves
1297 CALL section_vals_val_get(move_section,
"CORR_RADIUS", n_rep_val=n_rep_val, i_rep_section=i_add)
1299 IF (n_rep_val == 1) &
1302 CALL set_add_set_type(added_charges, icount, index1, index2, alpha, radius, c_radius, &
1303 mm_atom_chrg=mm_atom_chrg, mm_el_pot_radius=mm_el_pot_radius, &
1304 mm_el_pot_radius_corr=mm_el_pot_radius_corr, &
1305 mm_atom_index=mm_atom_index, move=n_moves, ind1=ind1)
1307 mm_atom_chrg(ind1) = 0.0_dp
1311 i_rep_section=ikind)
1317 DO i_add = 1, n_adds
1324 CALL section_vals_val_get(add_section,
"CORR_RADIUS", n_rep_val=n_rep_val, i_rep_section=i_add)
1326 IF (n_rep_val == 1) &
1329 CALL set_add_set_type(added_charges, icount, index1, index2, alpha, radius, c_radius, charge, &
1330 mm_atom_chrg=mm_atom_chrg, mm_el_pot_radius=mm_el_pot_radius, &
1331 mm_el_pot_radius_corr=mm_el_pot_radius_corr, &
1332 mm_atom_index=mm_atom_index)
1359 SUBROUTINE set_add_set_type(added_charges, icount, Index1, Index2, alpha, radius, c_radius, charge, &
1360 mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, mm_atom_index, move, ind1)
1362 INTEGER,
INTENT(IN) :: icount, index1, index2
1363 REAL(kind=
dp),
INTENT(IN) :: alpha, radius, c_radius
1364 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: charge
1365 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg, mm_el_pot_radius, &
1366 mm_el_pot_radius_corr
1367 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index
1368 INTEGER,
INTENT(in),
OPTIONAL :: move
1369 INTEGER,
INTENT(OUT),
OPTIONAL :: ind1
1371 INTEGER :: i, my_move
1372 REAL(kind=
dp) :: my_c_radius, my_charge, my_radius
1376 my_c_radius = c_radius
1377 IF (
PRESENT(charge)) my_charge = charge
1378 IF (
PRESENT(move)) my_move = move
1380 getid:
DO WHILE (i <=
SIZE(mm_atom_index))
1381 IF (index1 == mm_atom_index(i))
EXIT getid
1384 IF (
PRESENT(ind1)) ind1 = i
1385 cpassert(i <=
SIZE(mm_atom_index))
1386 IF (.NOT.
PRESENT(charge)) my_charge = mm_atom_chrg(i)/real(my_move, kind=
dp)
1387 IF (my_radius == 0.0_dp) my_radius = mm_el_pot_radius(i)
1388 IF (my_c_radius == 0.0_dp) my_c_radius = mm_el_pot_radius_corr(i)
1390 added_charges%add_env(icount)%Index1 = index1
1391 added_charges%add_env(icount)%Index2 = index2
1392 added_charges%add_env(icount)%alpha = alpha
1393 added_charges%mm_atom_index(icount) = icount
1394 added_charges%mm_atom_chrg(icount) = my_charge
1395 added_charges%mm_el_pot_radius(icount) = my_radius
1396 added_charges%mm_el_pot_radius_corr(icount) = my_c_radius
1397 END SUBROUTINE set_add_set_type
1415 TYPE(
cell_type),
POINTER :: qm_cell_small
1416 REAL(kind=
dp),
DIMENSION(3),
INTENT(in) :: dr
1418 LOGICAL :: center_grid
1419 REAL(kind=
dp),
DIMENSION(3) :: tmp
1420 REAL(kind=
dp),
DIMENSION(:),
POINTER :: vec
1424 tmp(1) = qm_cell_small%hmat(1, 1)
1425 tmp(2) = qm_cell_small%hmat(2, 2)
1426 tmp(3) = qm_cell_small%hmat(3, 3)
1427 cpassert(all(tmp > 0))
1428 qmmm_env%dOmmOqm = tmp/2.0_dp
1432 IF (center_grid)
THEN
1433 qmmm_env%utrasl = dr
1435 qmmm_env%utrasl = 1.0_dp
1438 qmmm_env%transl_v = vec
1451 SUBROUTINE setup_image_atom_list(image_charge_section, qmmm_env, &
1452 qm_atom_index, subsys_mm)
1456 INTEGER,
DIMENSION(:),
POINTER :: qm_atom_index
1459 INTEGER :: atom_a, atom_b, i, j, k, max_index, &
1460 n_var, num_const_atom, &
1462 INTEGER,
DIMENSION(:),
POINTER :: mm_indexes
1463 LOGICAL :: fix_xyz, imageind_in_range
1466 NULLIFY (mm_indexes, molecule_kind)
1467 imageind_in_range = .false.
1468 num_image_mm_atom = 0
1475 i_rep_val=i, i_vals=mm_indexes)
1476 num_image_mm_atom = num_image_mm_atom +
SIZE(mm_indexes)
1479 ALLOCATE (qmmm_env%image_charge_pot%image_mm_list(num_image_mm_atom))
1481 qmmm_env%image_charge_pot%image_mm_list = 0
1482 num_image_mm_atom = 1
1486 i_rep_val=i, i_vals=mm_indexes)
1487 qmmm_env%image_charge_pot%image_mm_list(num_image_mm_atom:num_image_mm_atom &
1488 +
SIZE(mm_indexes) - 1) = mm_indexes(:)
1489 num_image_mm_atom = num_image_mm_atom +
SIZE(mm_indexes)
1493 num_image_mm_atom = num_image_mm_atom - 1
1495 max_index =
SIZE(subsys_mm%particles%els)
1497 cpassert(
SIZE(qmmm_env%image_charge_pot%image_mm_list) /= 0)
1498 imageind_in_range = (maxval(qmmm_env%image_charge_pot%image_mm_list) <= max_index) &
1499 .AND. (minval(qmmm_env%image_charge_pot%image_mm_list) > 0)
1500 cpassert(imageind_in_range)
1502 DO i = 1, num_image_mm_atom
1503 atom_a = qmmm_env%image_charge_pot%image_mm_list(i)
1504 IF (any(qm_atom_index == atom_a))
THEN
1505 cpabort(
"Image atom list must only contain MM atoms")
1507 DO j = i + 1, num_image_mm_atom
1508 atom_b = qmmm_env%image_charge_pot%image_mm_list(j)
1509 IF (atom_a == atom_b) &
1510 cpabort(
"There are atoms doubled in image list.")
1517 IF (
ASSOCIATED(subsys_mm%molecule_kinds))
THEN
1518 IF (
ASSOCIATED(subsys_mm%molecule_kinds%els))
THEN
1519 molecule_kind => subsys_mm%molecule_kinds%els
1520 DO i = 1,
SIZE(molecule_kind)
1521 IF (.NOT.
ASSOCIATED(molecule_kind(i)%fixd_list))
EXIT
1522 IF (.NOT. fix_xyz)
EXIT
1523 DO j = 1,
SIZE(molecule_kind(i)%fixd_list)
1524 IF (.NOT. fix_xyz)
EXIT
1525 DO k = 1, num_image_mm_atom
1526 atom_a = qmmm_env%image_charge_pot%image_mm_list(k)
1527 IF (atom_a == molecule_kind(i)%fixd_list(j)%fixd)
THEN
1528 num_const_atom = num_const_atom + 1
1529 IF (molecule_kind(i)%fixd_list(j)%itype /=
use_perd_xyz)
THEN
1542 IF (num_const_atom == num_image_mm_atom .AND. fix_xyz)
THEN
1543 qmmm_env%image_charge_pot%state_image_matrix =
calc_once
1545 qmmm_env%image_charge_pot%state_image_matrix =
calc_always
1548 END SUBROUTINE setup_image_atom_list
1564 REAL(kind=
dp) :: eta, eta_conv, v0, v0_conv
1570 eta = qmmm_env%image_charge_pot%eta
1572 v0 = qmmm_env%image_charge_pot%V0
1576 WRITE (iw, fmt=
"(T25,A)")
"IMAGE CHARGE PARAMETERS"
1577 WRITE (iw, fmt=
"(T25,A)") repeat(
"-", 23)
1578 WRITE (iw, fmt=
"(/)")
1579 WRITE (iw, fmt=
"(T2,A)")
"INDEX OF MM ATOMS CARRYING AN IMAGE CHARGE:"
1580 WRITE (iw, fmt=
"(/)")
1582 WRITE (iw,
"(7X,10I6)") qmmm_env%image_charge_pot%image_mm_list
1583 WRITE (iw, fmt=
"(/)")
1584 WRITE (iw,
"(T2,A52,T69,F12.8)") &
1585 "WIDTH OF GAUSSIAN CHARGE DISTRIBUTION [angstrom^-2]:", eta_conv
1586 WRITE (iw,
"(T2,A26,T69,F12.8)")
"EXTERNAL POTENTIAL [volt]:", v0_conv
1587 WRITE (iw, fmt=
"(/,T2,A,/)") repeat(
"-", 79)
1590 "PRINT%PROGRAM_RUN_INFO")
represent a simple array based list of the given type
Define the atomic kind types and their sub types.
subroutine, public set_atomic_kind(atomic_kind, element_symbol, name, mass, kind_number, natom, atom_list, fist_potential, shell, shell_active, damping)
Set the components of an atomic kind data set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
recursive subroutine, public read_cell(cell, cell_ref, use_ref_cell, cell_section, check_for_ref, para_env)
...
Handles all functions related to the CELL.
integer, parameter, public use_perd_xyz
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
subroutine, public cp_eri_mme_init_read_input(mme_section, param)
Read input and initialize parameter type.
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell)
returns information about various attributes of the given subsys
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
real(kind=dp) function, public cp_unit_to_cp2k(value, unit_str, defaults, power)
converts to the internal cp2k units to the given unit
Definition of the atomic potential types.
Define all structures types related to force_fields.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.
Define the molecule kind structure types and the corresponding functionality.
subroutine, public pair_potential_reallocate(p, lb1_new, ub1_new, lj, lj_charmm, williams, goodwin, eam, quip, nequip, allegro, bmhft, bmhftd, ipbv, buck4r, buckmo, gp, tersoff, siepmann, gal, gal21, tab, deepmd)
Cleans the potential parameter type.
represent a simple array based list of the given type
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public qmmm_potential_init(qmmm_coupl_type, mm_el_pot_radius, potentials, pgfs, mm_cell, compatibility, print_section)
Initialize the QMMM potential stored on vector, according the qmmm_coupl_type.
logical function, public qmmm_ff_precond_only_qm(id1, id2, id3, id4, is_link)
This function handles the atom names and modifies the "_QM_" prefix, in order to find the parameters ...
Initialize the use of the gaussians to treat the QMMM coupling potential.
subroutine, public qmmm_gaussian_initialize(qmmm_gaussian_fns, para_env, pw_env, mm_el_pot_radius, mm_el_pot_radius_corr, qmmm_coupl_type, eps_mm_rspace, maxradius, maxchrg, compatibility, print_section, qmmm_section)
Initialize the Gaussian QMMM Environment.
Initialize a QM/MM calculation.
subroutine, public setup_qmmm_vars_qm(qmmm_section, qmmm_env, subsys_mm, qm_atom_type, qm_atom_index, mm_atom_index, qm_cell_small, qmmm_coupl_type, eps_mm_rspace, qmmm_link, para_env)
...
subroutine, public setup_qmmm_links(qmmm_section, qmmm_links, mm_el_pot_radius, mm_el_pot_radius_corr, mm_atom_index, iw)
this routine sets up all variables to treat qmmm links
subroutine, public qmmm_init_gaussian_type(qmmm_env_qm, para_env, mm_atom_chrg, qs_env, added_charges, added_shells, print_section, qmmm_section)
...
subroutine, public move_or_add_atoms(qmmm_section, move_mm_charges, add_mm_charges, mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, added_charges, mm_atom_index)
this routine sets up all variables to treat qmmm links
subroutine, public assign_mm_charges_and_radius(subsys, charges, mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, mm_atom_index, mm_link_atoms, mm_link_scale_factor, added_shells, shell_model)
Assigns charges and radius to evaluate the MM electrostatic potential.
subroutine, public setup_origin_mm_cell(qmmm_section, qmmm_env, qm_cell_small, dr)
this routine sets up the origin of the MM cell respect to the origin of the QM cell....
subroutine, public qmmm_init_periodic_potential(qmmm_env_qm, qm_cell_small, mm_cell, para_env, qs_env, added_charges, added_shells, qmmm_periodic, print_section, mm_atom_chrg)
...
subroutine, public print_qmmm_charges(mm_atom_index, mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, added_charges, added_shells, qmmm_section, nocompatibility, shell_model)
Print info on charges generating the qmmm potential..
subroutine, public print_qmmm_links(qmmm_section, qmmm_links)
Print info on qm/mm links.
subroutine, public setup_qmmm_vars_mm(qmmm_section, qmmm_env, qm_atom_index, mm_link_atoms, mm_link_scale_factor, fist_scale_charge_link, qmmm_coupl_type, qmmm_link)
...
subroutine, public print_image_charge_info(qmmm_env, qmmm_section)
Print info on image charges.
subroutine, public qmmm_init_potential(qmmm_env_qm, mm_cell, added_charges, added_shells, print_section)
...
Setting up the potential for QM/MM periodic boundary conditions calculations.
subroutine, public qmmm_per_potential_init(qmmm_coupl_type, per_potentials, potentials, pgfs, qm_cell_small, mm_cell, compatibility, qmmm_periodic, print_section, eps_mm_rspace, maxchrg, ncp, ncpl)
Initialize the QMMM potential stored on vector, according the qmmm_coupl_type.
subroutine, public qmmm_ewald_potential_init(ewald_env, ewald_pw, qmmm_coupl_type, mm_cell, para_env, qmmm_periodic, print_section)
Initialize the QMMM Ewald potential needed for QM-QM Coupling using point charges.
subroutine, public create_add_shell_type(added_shells, ndim)
creates the add_shell_type structure
subroutine, public create_add_set_type(added_charges, ndim)
creates the add_set_type structure
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
elemental subroutine, public get_shell(shell, charge, charge_core, charge_shell, mass_core, mass_shell, k2_spring, k4_spring, max_dist, shell_cutoff)
...
represent a list of objects
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
stores all the informations relevant to an mpi environment
represent a list of objects
contained for different pw related things
parameters for core-shell model potentials