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)
115 TYPE(cp_subsys_type),
POINTER :: subsys
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
121 TYPE(add_shell_type),
OPTIONAL,
POINTER :: added_shells
122 LOGICAL :: shell_model
124 INTEGER :: i, ilink, indmm, indshell, ishell
126 REAL(
dp) :: qcore, qi, qshell, rc, ri
127 TYPE(atomic_kind_type),
POINTER :: my_kind
128 TYPE(fist_potential_type),
POINTER :: my_potential
129 TYPE(particle_list_type),
POINTER :: core_particles, particles, &
131 TYPE(particle_type),
DIMENSION(:),
POINTER :: core_set, particle_set, shell_set
132 TYPE(shell_kind_type),
POINTER :: shell_kind
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)
160 CALL get_potential(potential=my_potential, &
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
215 TYPE(add_set_type),
POINTER :: added_charges
216 TYPE(add_shell_type),
POINTER :: added_shells
217 TYPE(section_vals_type),
POINTER :: qmmm_section
218 LOGICAL,
INTENT(IN) :: nocompatibility, shell_model
220 INTEGER :: i, ind1, ind2, indmm, iw
221 REAL(kind=
dp) :: qi, qtot, rc, ri
222 TYPE(cp_logger_type),
POINTER :: logger
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")
307 TYPE(section_vals_type),
POINTER :: qmmm_section
308 TYPE(qmmm_links_type),
POINTER :: qmmm_links
310 INTEGER :: i, iw, mm_index, qm_index
311 REAL(kind=
dp) :: alpha
312 TYPE(cp_logger_type),
POINTER :: logger
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)
368 TYPE(qmmm_env_qm_type),
POINTER :: qmmm_env_qm
369 TYPE(mp_para_env_type),
POINTER :: para_env
370 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg
371 TYPE(qs_environment_type),
POINTER :: qs_env
372 TYPE(add_set_type),
POINTER :: added_charges
373 TYPE(add_shell_type),
POINTER :: added_shells
374 TYPE(section_vals_type),
POINTER :: print_section, qmmm_section
377 REAL(kind=
dp) :: maxchrg
378 REAL(kind=
dp),
DIMENSION(:),
POINTER :: maxradius, maxradius2
379 TYPE(pw_env_type),
POINTER :: pw_env
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)
467 TYPE(qmmm_env_qm_type),
POINTER :: qmmm_env_qm
468 TYPE(cell_type),
POINTER :: mm_cell
469 TYPE(add_set_type),
POINTER :: added_charges
470 TYPE(add_shell_type),
POINTER :: added_shells
471 TYPE(section_vals_type),
POINTER :: 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)
523 TYPE(qmmm_env_qm_type),
POINTER :: qmmm_env_qm
524 TYPE(cell_type),
POINTER :: qm_cell_small, mm_cell
525 TYPE(mp_para_env_type),
POINTER :: para_env
526 TYPE(qs_environment_type),
POINTER :: qs_env
527 TYPE(add_set_type),
POINTER :: added_charges
528 TYPE(add_shell_type),
POINTER :: added_shells
529 TYPE(section_vals_type),
POINTER :: qmmm_periodic, print_section
530 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg
532 REAL(kind=
dp) :: maxchrg
533 TYPE(dft_control_type),
POINTER :: dft_control
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, &
563 compatibility=qmmm_env_qm%compatibility, &
564 qmmm_periodic=qmmm_periodic, &
565 print_section=print_section, &
566 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
568 ncp=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts, &
569 ncpl=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts_local)
571 IF (qmmm_env_qm%move_mm_charges .OR. qmmm_env_qm%add_mm_charges)
THEN
574 per_potentials=added_charges%per_potentials, &
575 potentials=added_charges%potentials, &
576 pgfs=added_charges%pgfs, &
577 qm_cell_small=qm_cell_small, &
580 compatibility=qmmm_env_qm%compatibility, &
581 qmmm_periodic=qmmm_periodic, &
582 print_section=print_section, &
583 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
585 ncp=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts, &
586 ncpl=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts_local)
589 IF (qmmm_env_qm%added_shells%num_mm_atoms .GT. 0)
THEN
592 per_potentials=added_shells%per_potentials, &
593 potentials=added_shells%potentials, &
594 pgfs=added_shells%pgfs, &
595 qm_cell_small=qm_cell_small, &
598 compatibility=qmmm_env_qm%compatibility, &
599 qmmm_periodic=qmmm_periodic, &
600 print_section=print_section, &
601 eps_mm_rspace=qmmm_env_qm%eps_mm_rspace, &
603 ncp=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts, &
604 ncpl=qmmm_env_qm%aug_pools(
SIZE(qmmm_env_qm%aug_pools))%pool%pw_grid%npts_local)
631 qm_atom_index, mm_atom_index, qm_cell_small, qmmm_coupl_type, eps_mm_rspace, &
633 TYPE(section_vals_type),
POINTER :: qmmm_section
634 TYPE(qmmm_env_qm_type),
POINTER :: qmmm_env
635 TYPE(cp_subsys_type),
POINTER :: subsys_mm
636 CHARACTER(len=default_string_length), &
637 DIMENSION(:),
POINTER :: qm_atom_type
638 INTEGER,
DIMENSION(:),
POINTER :: qm_atom_index, mm_atom_index
639 TYPE(cell_type),
POINTER :: qm_cell_small
640 INTEGER,
INTENT(OUT) :: qmmm_coupl_type
641 REAL(kind=
dp),
INTENT(OUT) :: eps_mm_rspace
642 LOGICAL,
INTENT(OUT) :: qmmm_link
643 TYPE(mp_para_env_type),
POINTER :: para_env
645 CHARACTER(len=default_string_length) :: atmname, mm_atom_kind
646 INTEGER :: i, icount, ikind, ikindr, my_type, &
647 n_rep_val, nkind, size_mm_system
648 INTEGER,
DIMENSION(:),
POINTER :: mm_link_atoms
649 LOGICAL :: explicit, is_mm, is_qm
650 REAL(kind=
dp) :: tmp_radius, tmp_radius_c
651 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tmp_sph_cut
652 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
653 TYPE(atomic_kind_type),
POINTER :: atomic_kind
654 TYPE(fist_potential_type),
POINTER :: fist_potential
655 TYPE(section_vals_type),
POINTER :: cell_section, eri_mme_section, &
656 image_charge_section, mm_kinds
658 NULLIFY (mm_link_atoms, cell_section, tmp_sph_cut)
659 NULLIFY (image_charge_section)
668 CALL read_cell(qm_cell_small, qm_cell_small, cell_section=cell_section, &
669 check_for_ref=.false., para_env=para_env)
670 qm_cell_small%tag =
"CELL_QM"
674 cpassert(
SIZE(tmp_sph_cut) == 2)
675 qmmm_env%spherical_cutoff = tmp_sph_cut
676 IF (qmmm_env%spherical_cutoff(1) <= 0.0_dp)
THEN
677 qmmm_env%spherical_cutoff(2) = 0.0_dp
679 IF (qmmm_env%spherical_cutoff(2) <= 0.0_dp) qmmm_env%spherical_cutoff(2) = epsilon(0.0_dp)
680 tmp_radius = qmmm_env%spherical_cutoff(1) - 20.0_dp*qmmm_env%spherical_cutoff(2)
681 IF (tmp_radius <= 0.0_dp) &
682 CALL cp_abort(__location__, &
683 "SPHERICAL_CUTOFF(1) > 20*SPHERICAL_CUTOFF(1)! Please correct parameters for "// &
684 "the Spherical Cutoff in order to satisfy the previous condition!")
690 CALL cp_subsys_get(subsys=subsys_mm, atomic_kinds=atomic_kinds)
691 DO ikind = 1,
SIZE(atomic_kinds%els)
692 atomic_kind => atomic_kinds%els(ikind)
694 fist_potential=fist_potential)
695 CALL set_potential(potential=fist_potential, &
696 qmmm_radius=tmp_radius, &
697 qmmm_corr_radius=tmp_radius)
699 fist_potential=fist_potential)
701 CALL setup_qm_atom_list(qmmm_section=qmmm_section, &
702 qm_atom_index=qm_atom_index, &
703 qm_atom_type=qm_atom_type, &
704 mm_link_atoms=mm_link_atoms, &
715 set_radius_pot_0:
DO ikindr = 1,
SIZE(atomic_kinds%els)
716 atomic_kind => atomic_kinds%els(ikindr)
719 fist_potential=fist_potential)
720 CALL set_potential(potential=fist_potential, qmmm_radius=tmp_radius, &
721 qmmm_corr_radius=tmp_radius)
723 fist_potential=fist_potential)
724 END DO set_radius_pot_0
733 tmp_radius_c = tmp_radius
737 set_radius_pot_1:
DO ikindr = 1,
SIZE(atomic_kinds%els)
738 atomic_kind => atomic_kinds%els(ikindr)
741 IF (trim(mm_atom_kind) == atmname)
THEN
743 fist_potential=fist_potential)
744 CALL set_potential(potential=fist_potential, &
745 qmmm_radius=tmp_radius, &
746 qmmm_corr_radius=tmp_radius_c)
748 fist_potential=fist_potential)
750 END DO set_radius_pot_1
760 cpabort(
"QMMM section not present in input file!")
765 size_mm_system =
SIZE(subsys_mm%particles%els) -
SIZE(qm_atom_index)
766 IF (qmmm_link .AND.
ASSOCIATED(mm_link_atoms)) size_mm_system = size_mm_system +
SIZE(mm_link_atoms)
767 ALLOCATE (mm_atom_index(size_mm_system))
770 DO i = 1,
SIZE(subsys_mm%particles%els)
772 IF (any(qm_atom_index == i))
THEN
775 IF (
ASSOCIATED(mm_link_atoms))
THEN
776 IF (any(mm_link_atoms == i) .AND. qmmm_link) is_mm = .true.
780 IF (icount <= size_mm_system) mm_atom_index(icount) = i
783 cpassert(icount == size_mm_system)
784 IF (
ASSOCIATED(mm_link_atoms))
THEN
785 DEALLOCATE (mm_link_atoms)
790 IF (qmmm_env%image_charge)
THEN
793 IF (explicit) qmmm_env%image_charge_pot%all_mm = .false.
795 IF (qmmm_env%image_charge_pot%all_mm)
THEN
796 qmmm_env%image_charge_pot%image_mm_list => mm_atom_index
798 CALL setup_image_atom_list(image_charge_section, qmmm_env, &
799 qm_atom_index, subsys_mm)
802 qmmm_env%image_charge_pot%particles_all => subsys_mm%particles%els
805 r_val=qmmm_env%image_charge_pot%V0)
807 r_val=qmmm_env%image_charge_pot%eta)
810 SELECT CASE (my_type)
812 qmmm_env%image_charge_pot%coeff_iterative = .false.
814 qmmm_env%image_charge_pot%coeff_iterative = .true.
818 l_val=qmmm_env%image_charge_pot%image_restart)
821 i_val=qmmm_env%image_charge_pot%image_matrix_method)
823 IF (qmmm_env%image_charge_pot%image_matrix_method .EQ.
do_eri_mme)
THEN
826 CALL cp_eri_mme_set_params(qmmm_env%image_charge_pot%eri_mme_param, &
827 hmat=qm_cell_small%hmat, is_ortho=qm_cell_small%orthorhombic, &
828 zet_min=qmmm_env%image_charge_pot%eta, &
829 zet_max=qmmm_env%image_charge_pot%eta, &
854 mm_link_atoms, mm_link_scale_factor, &
855 fist_scale_charge_link, qmmm_coupl_type, &
857 TYPE(section_vals_type),
POINTER :: qmmm_section
858 TYPE(qmmm_env_mm_type),
POINTER :: qmmm_env
859 INTEGER,
DIMENSION(:),
POINTER :: qm_atom_index, mm_link_atoms
860 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_link_scale_factor, &
861 fist_scale_charge_link
862 INTEGER,
INTENT(OUT) :: qmmm_coupl_type
863 LOGICAL,
INTENT(OUT) :: qmmm_link
866 TYPE(section_vals_type),
POINTER :: qmmm_ff_section
868 NULLIFY (qmmm_ff_section)
873 CALL setup_qm_atom_list(qmmm_section, qm_atom_index=qm_atom_index, qmmm_link=qmmm_link, &
874 mm_link_atoms=mm_link_atoms, mm_link_scale_factor=mm_link_scale_factor, &
875 fist_scale_charge_link=fist_scale_charge_link)
881 IF (qmmm_env%use_qmmm_ff)
THEN
883 l_val=qmmm_env%multiple_potential)
884 CALL read_qmmm_ff_section(qmmm_ff_section, qmmm_env%inp_info)
898 SUBROUTINE read_qmmm_ff_section(qmmm_ff_section, inp_info)
899 TYPE(section_vals_type),
POINTER :: qmmm_ff_section
900 TYPE(input_info_type),
POINTER :: inp_info
902 INTEGER :: n_gd, n_gp, n_lj, n_wl, np
903 TYPE(section_vals_type),
POINTER :: gd_section, gp_section, lj_section, &
927 np = n_lj + n_wl + n_gd
930 CALL read_gd_section(inp_info%nonbonded, gd_section, start=n_lj + n_wl)
933 np = n_lj + n_wl + n_gd + n_gp
936 CALL read_gp_section(inp_info%nonbonded, gp_section, start=n_lj + n_wl + n_gd)
958 np = n_lj + n_wl + n_gd
961 CALL read_gd_section(inp_info%nonbonded14, gd_section, start=n_lj + n_wl)
964 np = n_lj + n_wl + n_gd + n_gp
967 CALL read_gp_section(inp_info%nonbonded14, gp_section, start=n_lj + n_wl + n_gd)
970 END SUBROUTINE read_qmmm_ff_section
985 SUBROUTINE setup_qm_atom_list(qmmm_section, qm_atom_index, qm_atom_type, &
986 mm_link_atoms, mm_link_scale_factor, qmmm_link, fist_scale_charge_link)
987 TYPE(section_vals_type),
POINTER :: qmmm_section
988 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: qm_atom_index
989 CHARACTER(len=default_string_length), &
990 DIMENSION(:),
OPTIONAL,
POINTER :: qm_atom_type
991 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: mm_link_atoms
992 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: mm_link_scale_factor
993 LOGICAL,
INTENT(OUT),
OPTIONAL :: qmmm_link
994 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: fist_scale_charge_link
996 CHARACTER(len=default_string_length) :: qm_atom_kind, qm_link_element
997 INTEGER :: ikind, k, link_involv_mm, link_type, &
998 mm_index, n_var, nkind, nlinks, &
1000 INTEGER,
DIMENSION(:),
POINTER :: mm_indexes
1002 REAL(kind=
dp) :: scale_f
1003 TYPE(section_vals_type),
POINTER :: qm_kinds, qmmm_links
1018 num_qm_atom_tot = num_qm_atom_tot +
SIZE(mm_indexes)
1030 DO ikind = 1, nlinks
1033 SELECT CASE (link_type)
1035 num_qm_atom_tot = num_qm_atom_tot + 1
1036 link_involv_mm = link_involv_mm + 1
1038 num_qm_atom_tot = num_qm_atom_tot + 1
1046 IF (
PRESENT(mm_link_scale_factor) .AND. (link_involv_mm /= 0)) &
1047 ALLOCATE (mm_link_scale_factor(link_involv_mm))
1048 IF (
PRESENT(fist_scale_charge_link) .AND. (link_involv_mm /= 0)) &
1049 ALLOCATE (fist_scale_charge_link(link_involv_mm))
1050 IF (
PRESENT(mm_link_atoms) .AND. (link_involv_mm /= 0)) &
1051 ALLOCATE (mm_link_atoms(link_involv_mm))
1052 IF (
PRESENT(qm_atom_index))
ALLOCATE (qm_atom_index(num_qm_atom_tot))
1053 IF (
PRESENT(qm_atom_type))
ALLOCATE (qm_atom_type(num_qm_atom_tot))
1054 IF (
PRESENT(qm_atom_index)) qm_atom_index = 0
1055 IF (
PRESENT(qm_atom_type)) qm_atom_type =
" "
1062 IF (
PRESENT(qm_atom_index))
THEN
1063 qm_atom_index(num_qm_atom_tot:num_qm_atom_tot +
SIZE(mm_indexes) - 1) = mm_indexes(:)
1065 IF (
PRESENT(qm_atom_type))
THEN
1068 qm_atom_type(num_qm_atom_tot:num_qm_atom_tot +
SIZE(mm_indexes) - 1) = qm_atom_kind
1070 num_qm_atom_tot = num_qm_atom_tot +
SIZE(mm_indexes)
1073 IF (
PRESENT(mm_link_scale_factor) .AND. (link_involv_mm /= 0)) mm_link_scale_factor = 0.0_dp
1074 IF (
PRESENT(fist_scale_charge_link) .AND. (link_involv_mm /= 0)) fist_scale_charge_link = 0.0_dp
1075 IF (
PRESENT(mm_link_atoms) .AND. (link_involv_mm /= 0)) mm_link_atoms = 0
1077 DO ikind = 1, nlinks
1078 IF (
PRESENT(qm_atom_type))
THEN
1080 qm_atom_type(num_qm_atom_tot:num_qm_atom_tot) = trim(qm_link_element)//
"_LINK"
1082 IF (
PRESENT(qm_atom_index))
THEN
1084 cpassert(all(qm_atom_index /= mm_index))
1085 qm_atom_index(num_qm_atom_tot:num_qm_atom_tot) = mm_index
1086 num_qm_atom_tot = num_qm_atom_tot + 1
1088 IF (
PRESENT(mm_link_atoms) .AND. (link_involv_mm /= 0))
THEN
1090 mm_link_atoms(ikind) = mm_index
1092 IF (
PRESENT(mm_link_scale_factor) .AND. (link_involv_mm /= 0))
THEN
1094 mm_link_scale_factor(ikind) = scale_f
1096 IF (
PRESENT(fist_scale_charge_link) .AND. (link_involv_mm /= 0))
THEN
1098 fist_scale_charge_link(ikind) = scale_f
1102 cpassert(num_qm_atom_tot - 1 ==
SIZE(qm_atom_index))
1104 END SUBROUTINE setup_qm_atom_list
1118 SUBROUTINE setup_qmmm_links(qmmm_section, qmmm_links, mm_el_pot_radius, mm_el_pot_radius_corr, &
1120 TYPE(section_vals_type),
POINTER :: qmmm_section
1121 TYPE(qmmm_links_type),
POINTER :: qmmm_links
1122 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_el_pot_radius, mm_el_pot_radius_corr
1123 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index
1124 INTEGER,
INTENT(IN) :: iw
1126 INTEGER :: ikind, link_type, mm_index, n_gho, &
1127 n_imomm, n_pseudo, n_rep_val, n_tot, &
1129 INTEGER,
DIMENSION(:),
POINTER :: wrk_tmp
1130 REAL(kind=
dp) :: alpha, my_radius
1131 TYPE(section_vals_type),
POINTER :: qmmm_link_section
1139 cpassert(nlinks /= 0)
1140 DO ikind = 1, nlinks
1141 CALL section_vals_val_get(qmmm_link_section,
"LINK_TYPE", i_rep_section=ikind, i_val=link_type)
1146 n_tot = n_imomm + n_gho + n_pseudo
1147 cpassert(n_tot /= 0)
1148 ALLOCATE (qmmm_links)
1149 NULLIFY (qmmm_links%imomm, &
1152 IF (n_imomm /= 0)
THEN
1153 ALLOCATE (qmmm_links%imomm(n_imomm))
1154 ALLOCATE (wrk_tmp(n_imomm))
1155 DO ikind = 1, n_imomm
1156 NULLIFY (qmmm_links%imomm(ikind)%link)
1157 ALLOCATE (qmmm_links%imomm(ikind)%link)
1160 DO ikind = 1, nlinks
1161 CALL section_vals_val_get(qmmm_link_section,
"LINK_TYPE", i_rep_section=ikind, i_val=link_type)
1163 n_imomm = n_imomm + 1
1167 CALL section_vals_val_get(qmmm_link_section,
"RADIUS", i_rep_section=ikind, n_rep_val=n_rep_val)
1168 qmmm_links%imomm(n_imomm)%link%qm_index = qm_index
1169 qmmm_links%imomm(n_imomm)%link%mm_index = mm_index
1170 qmmm_links%imomm(n_imomm)%link%alpha = alpha
1171 wrk_tmp(n_imomm) = mm_index
1172 IF (n_rep_val == 1)
THEN
1174 WHERE (mm_atom_index == mm_index) mm_el_pot_radius = my_radius
1175 WHERE (mm_atom_index == mm_index) mm_el_pot_radius_corr = my_radius
1177 CALL section_vals_val_get(qmmm_link_section,
"CORR_RADIUS", i_rep_section=ikind, n_rep_val=n_rep_val)
1178 IF (n_rep_val == 1)
THEN
1179 CALL section_vals_val_get(qmmm_link_section,
"CORR_RADIUS", i_rep_section=ikind, r_val=my_radius)
1180 WHERE (mm_atom_index == mm_index) mm_el_pot_radius_corr = my_radius
1187 DO ikind = 1,
SIZE(wrk_tmp)
1188 IF (count(wrk_tmp == wrk_tmp(ikind)) > 1)
THEN
1189 WRITE (iw,
'(/A)')
"In the IMOMM scheme no more than one QM atom can be bounded to the same MM atom."
1190 WRITE (iw,
'(A)')
"Multiple link MM atom not allowed. Check your link sections."
1194 DEALLOCATE (wrk_tmp)
1197 IF (n_pseudo /= 0)
THEN
1198 ALLOCATE (qmmm_links%pseudo(n_pseudo))
1199 DO ikind = 1, n_pseudo
1200 NULLIFY (qmmm_links%pseudo(ikind)%link)
1201 ALLOCATE (qmmm_links%pseudo(ikind)%link)
1204 DO ikind = 1, nlinks
1205 CALL section_vals_val_get(qmmm_link_section,
"LINK_TYPE", i_rep_section=ikind, i_val=link_type)
1207 n_pseudo = n_pseudo + 1
1210 qmmm_links%pseudo(n_pseudo)%link%qm_index = qm_index
1211 qmmm_links%pseudo(n_pseudo)%link%mm_index = mm_index
1216 IF (n_gho /= 0)
THEN
1238 mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, &
1239 added_charges, mm_atom_index)
1240 TYPE(section_vals_type),
POINTER :: qmmm_section
1241 LOGICAL,
INTENT(OUT) :: move_mm_charges, add_mm_charges
1242 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg, mm_el_pot_radius, &
1243 mm_el_pot_radius_corr
1244 TYPE(add_set_type),
POINTER :: added_charges
1245 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index
1247 INTEGER :: i_add, icount, ikind, ind1, index1, &
1248 index2, n_add_tot, n_adds, n_move_tot, &
1249 n_moves, n_rep_val, nlinks
1251 REAL(kind=
dp) :: alpha, c_radius, charge, radius
1252 TYPE(section_vals_type),
POINTER :: add_section, move_section, &
1256 move_mm_charges = .false.
1257 add_mm_charges = .false.
1258 NULLIFY (qmmm_link_section, move_section, add_section)
1261 cpassert(nlinks /= 0)
1265 DO ikind = 1, nlinks
1267 i_rep_section=ikind)
1270 i_rep_section=ikind)
1272 n_move_tot = n_move_tot + n_moves
1273 n_add_tot = n_add_tot + n_adds
1275 icount = n_move_tot + n_add_tot
1276 IF (n_add_tot /= 0) add_mm_charges = .true.
1277 IF (n_move_tot /= 0) move_mm_charges = .true.
1286 DO ikind = 1, nlinks
1288 i_rep_section=ikind)
1289 CALL section_vals_get(move_section, explicit=explicit, n_repetition=n_moves)
1294 DO i_add = 1, n_moves
1300 CALL section_vals_val_get(move_section,
"CORR_RADIUS", n_rep_val=n_rep_val, i_rep_section=i_add)
1302 IF (n_rep_val == 1) &
1305 CALL set_add_set_type(added_charges, icount, index1, index2, alpha, radius, c_radius, &
1306 mm_atom_chrg=mm_atom_chrg, mm_el_pot_radius=mm_el_pot_radius, &
1307 mm_el_pot_radius_corr=mm_el_pot_radius_corr, &
1308 mm_atom_index=mm_atom_index, move=n_moves, ind1=ind1)
1310 mm_atom_chrg(ind1) = 0.0_dp
1314 i_rep_section=ikind)
1320 DO i_add = 1, n_adds
1327 CALL section_vals_val_get(add_section,
"CORR_RADIUS", n_rep_val=n_rep_val, i_rep_section=i_add)
1329 IF (n_rep_val == 1) &
1332 CALL set_add_set_type(added_charges, icount, index1, index2, alpha, radius, c_radius, charge, &
1333 mm_atom_chrg=mm_atom_chrg, mm_el_pot_radius=mm_el_pot_radius, &
1334 mm_el_pot_radius_corr=mm_el_pot_radius_corr, &
1335 mm_atom_index=mm_atom_index)
1362 SUBROUTINE set_add_set_type(added_charges, icount, Index1, Index2, alpha, radius, c_radius, charge, &
1363 mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, mm_atom_index, move, ind1)
1364 TYPE(add_set_type),
POINTER :: added_charges
1365 INTEGER,
INTENT(IN) :: icount, index1, index2
1366 REAL(kind=
dp),
INTENT(IN) :: alpha, radius, c_radius
1367 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: charge
1368 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_atom_chrg, mm_el_pot_radius, &
1369 mm_el_pot_radius_corr
1370 INTEGER,
DIMENSION(:),
POINTER :: mm_atom_index
1371 INTEGER,
INTENT(in),
OPTIONAL :: move
1372 INTEGER,
INTENT(OUT),
OPTIONAL :: ind1
1374 INTEGER :: i, my_move
1375 REAL(kind=
dp) :: my_c_radius, my_charge, my_radius
1379 my_c_radius = c_radius
1380 IF (
PRESENT(charge)) my_charge = charge
1381 IF (
PRESENT(move)) my_move = move
1383 getid:
DO WHILE (i <=
SIZE(mm_atom_index))
1384 IF (index1 == mm_atom_index(i))
EXIT getid
1387 IF (
PRESENT(ind1)) ind1 = i
1388 cpassert(i <=
SIZE(mm_atom_index))
1389 IF (.NOT.
PRESENT(charge)) my_charge = mm_atom_chrg(i)/real(my_move, kind=
dp)
1390 IF (my_radius == 0.0_dp) my_radius = mm_el_pot_radius(i)
1391 IF (my_c_radius == 0.0_dp) my_c_radius = mm_el_pot_radius_corr(i)
1393 added_charges%add_env(icount)%Index1 = index1
1394 added_charges%add_env(icount)%Index2 = index2
1395 added_charges%add_env(icount)%alpha = alpha
1396 added_charges%mm_atom_index(icount) = icount
1397 added_charges%mm_atom_chrg(icount) = my_charge
1398 added_charges%mm_el_pot_radius(icount) = my_radius
1399 added_charges%mm_el_pot_radius_corr(icount) = my_c_radius
1400 END SUBROUTINE set_add_set_type
1416 TYPE(section_vals_type),
POINTER :: qmmm_section
1417 TYPE(qmmm_env_qm_type),
POINTER :: qmmm_env
1418 TYPE(cell_type),
POINTER :: qm_cell_small
1419 REAL(kind=
dp),
DIMENSION(3),
INTENT(in) :: dr
1421 LOGICAL :: center_grid
1422 REAL(kind=
dp),
DIMENSION(3) :: tmp
1423 REAL(kind=
dp),
DIMENSION(:),
POINTER :: vec
1427 tmp(1) = qm_cell_small%hmat(1, 1)
1428 tmp(2) = qm_cell_small%hmat(2, 2)
1429 tmp(3) = qm_cell_small%hmat(3, 3)
1430 cpassert(all(tmp > 0))
1431 qmmm_env%dOmmOqm = tmp/2.0_dp
1435 IF (center_grid)
THEN
1436 qmmm_env%utrasl = dr
1438 qmmm_env%utrasl = 1.0_dp
1441 qmmm_env%transl_v = vec
1454 SUBROUTINE setup_image_atom_list(image_charge_section, qmmm_env, &
1455 qm_atom_index, subsys_mm)
1457 TYPE(section_vals_type),
POINTER :: image_charge_section
1458 TYPE(qmmm_env_qm_type),
POINTER :: qmmm_env
1459 INTEGER,
DIMENSION(:),
POINTER :: qm_atom_index
1460 TYPE(cp_subsys_type),
POINTER :: subsys_mm
1462 INTEGER :: atom_a, atom_b, i, j, k, max_index, &
1463 n_var, num_const_atom, &
1465 INTEGER,
DIMENSION(:),
POINTER :: mm_indexes
1466 LOGICAL :: fix_xyz, imageind_in_range
1467 TYPE(molecule_kind_type),
DIMENSION(:),
POINTER :: molecule_kind
1469 NULLIFY (mm_indexes, molecule_kind)
1470 imageind_in_range = .false.
1471 num_image_mm_atom = 0
1478 i_rep_val=i, i_vals=mm_indexes)
1479 num_image_mm_atom = num_image_mm_atom +
SIZE(mm_indexes)
1482 ALLOCATE (qmmm_env%image_charge_pot%image_mm_list(num_image_mm_atom))
1484 qmmm_env%image_charge_pot%image_mm_list = 0
1485 num_image_mm_atom = 1
1489 i_rep_val=i, i_vals=mm_indexes)
1490 qmmm_env%image_charge_pot%image_mm_list(num_image_mm_atom:num_image_mm_atom &
1491 +
SIZE(mm_indexes) - 1) = mm_indexes(:)
1492 num_image_mm_atom = num_image_mm_atom +
SIZE(mm_indexes)
1496 num_image_mm_atom = num_image_mm_atom - 1
1498 max_index =
SIZE(subsys_mm%particles%els)
1500 cpassert(
SIZE(qmmm_env%image_charge_pot%image_mm_list) /= 0)
1501 imageind_in_range = (maxval(qmmm_env%image_charge_pot%image_mm_list) <= max_index) &
1502 .AND. (minval(qmmm_env%image_charge_pot%image_mm_list) > 0)
1503 cpassert(imageind_in_range)
1505 DO i = 1, num_image_mm_atom
1506 atom_a = qmmm_env%image_charge_pot%image_mm_list(i)
1507 IF (any(qm_atom_index == atom_a))
THEN
1508 cpabort(
"Image atom list must only contain MM atoms")
1510 DO j = i + 1, num_image_mm_atom
1511 atom_b = qmmm_env%image_charge_pot%image_mm_list(j)
1512 IF (atom_a == atom_b) &
1513 cpabort(
"There are atoms doubled in image list.")
1520 IF (
ASSOCIATED(subsys_mm%molecule_kinds))
THEN
1521 IF (
ASSOCIATED(subsys_mm%molecule_kinds%els))
THEN
1522 molecule_kind => subsys_mm%molecule_kinds%els
1523 DO i = 1,
SIZE(molecule_kind)
1524 IF (.NOT.
ASSOCIATED(molecule_kind(i)%fixd_list))
EXIT
1525 IF (.NOT. fix_xyz)
EXIT
1526 DO j = 1,
SIZE(molecule_kind(i)%fixd_list)
1527 IF (.NOT. fix_xyz)
EXIT
1528 DO k = 1, num_image_mm_atom
1529 atom_a = qmmm_env%image_charge_pot%image_mm_list(k)
1530 IF (atom_a == molecule_kind(i)%fixd_list(j)%fixd)
THEN
1531 num_const_atom = num_const_atom + 1
1532 IF (molecule_kind(i)%fixd_list(j)%itype /=
use_perd_xyz)
THEN
1545 IF (num_const_atom == num_image_mm_atom .AND. fix_xyz)
THEN
1546 qmmm_env%image_charge_pot%state_image_matrix =
calc_once
1548 qmmm_env%image_charge_pot%state_image_matrix =
calc_always
1551 END SUBROUTINE setup_image_atom_list
1563 TYPE(qmmm_env_qm_type),
POINTER :: qmmm_env
1564 TYPE(section_vals_type),
POINTER :: qmmm_section
1567 REAL(kind=
dp) :: eta, eta_conv, v0, v0_conv
1568 TYPE(cp_logger_type),
POINTER :: logger
1573 eta = qmmm_env%image_charge_pot%eta
1575 v0 = qmmm_env%image_charge_pot%V0
1579 WRITE (iw, fmt=
"(T25,A)")
"IMAGE CHARGE PARAMETERS"
1580 WRITE (iw, fmt=
"(T25,A)") repeat(
"-", 23)
1581 WRITE (iw, fmt=
"(/)")
1582 WRITE (iw, fmt=
"(T2,A)")
"INDEX OF MM ATOMS CARRYING AN IMAGE CHARGE:"
1583 WRITE (iw, fmt=
"(/)")
1585 WRITE (iw,
"(7X,10I6)") qmmm_env%image_charge_pot%image_mm_list
1586 WRITE (iw, fmt=
"(/)")
1587 WRITE (iw,
"(T2,A52,T69,F12.8)") &
1588 "WIDTH OF GAUSSIAN CHARGE DISTRIBUTION [angstrom^-2]:", eta_conv
1589 WRITE (iw,
"(T2,A26,T69,F12.8)")
"EXTERNAL POTENTIAL [volt]:", v0_conv
1590 WRITE (iw, fmt=
"(/,T2,A,/)") repeat(
"-", 79)
1593 "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, para_env, 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_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, 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, 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)
...