LCOV - code coverage report
Current view: top level - src - qmmm_create.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:92574dc) Lines: 98.1 % 162 159
Test Date: 2026-09-24 01:27:39 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Initialize a QM/MM calculation
      10              : !> \par History
      11              : !>      5.2004 created [fawzi]
      12              : !> \author Fawzi Mohamed
      13              : ! **************************************************************************************************
      14              : MODULE qmmm_create
      15              :    USE bibliography,                    ONLY: Golze2013,&
      16              :                                               Laino2005,&
      17              :                                               Laino2006,&
      18              :                                               cite_reference
      19              :    USE cell_methods,                    ONLY: read_cell,&
      20              :                                               write_cell
      21              :    USE cell_types,                      ONLY: cell_clone,&
      22              :                                               cell_release,&
      23              :                                               cell_type,&
      24              :                                               get_cell
      25              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      26              :                                               cp_logger_type
      27              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      28              :                                               cp_print_key_unit_nr
      29              :    USE cp_subsys_methods,               ONLY: create_small_subsys
      30              :    USE cp_subsys_types,                 ONLY: cp_subsys_release,&
      31              :                                               cp_subsys_type
      32              :    USE fist_environment,                ONLY: fist_init
      33              :    USE fist_environment_types,          ONLY: fist_env_create,&
      34              :                                               fist_env_get,&
      35              :                                               fist_env_set,&
      36              :                                               fist_environment_type
      37              :    USE fist_nonbond_env_types,          ONLY: fist_nonbond_env_type
      38              :    USE global_types,                    ONLY: global_environment_type
      39              :    USE header,                          ONLY: qmmm_header
      40              :    USE input_constants,                 ONLY: &
      41              :         do_fist, do_multipole_section_off, do_multipole_section_on, do_qmmm, &
      42              :         do_qmmm_center_every_step, do_qmmm_center_never, do_qmmm_center_pbc_aware, &
      43              :         do_qmmm_center_setup_only, do_qmmm_none, do_qs
      44              :    USE input_section_types,             ONLY: section_vals_get,&
      45              :                                               section_vals_get_subs_vals,&
      46              :                                               section_vals_type,&
      47              :                                               section_vals_val_get,&
      48              :                                               section_vals_val_set
      49              :    USE kinds,                           ONLY: default_string_length,&
      50              :                                               dp
      51              :    USE message_passing,                 ONLY: mp_para_env_type
      52              :    USE pw_env_types,                    ONLY: pw_env_type
      53              :    USE qmmm_init,                       ONLY: &
      54              :         assign_mm_charges_and_radius, move_or_add_atoms, print_image_charge_info, &
      55              :         print_qmmm_charges, print_qmmm_links, qmmm_init_gaussian_type, &
      56              :         qmmm_init_periodic_potential, qmmm_init_potential, setup_origin_mm_cell, setup_qmmm_links, &
      57              :         setup_qmmm_vars_mm, setup_qmmm_vars_qm
      58              :    USE qmmm_links_methods,              ONLY: qmmm_link_Imomm_coord
      59              :    USE qmmm_pw_grid,                    ONLY: qmmm_pw_grid_init
      60              :    USE qmmm_types,                      ONLY: qmmm_env_type
      61              :    USE qmmm_types_low,                  ONLY: add_set_release,&
      62              :                                               add_set_type,&
      63              :                                               add_shell_type,&
      64              :                                               qmmm_env_mm_create,&
      65              :                                               qmmm_env_mm_type,&
      66              :                                               qmmm_env_qm_create,&
      67              :                                               qmmm_env_qm_type,&
      68              :                                               qmmm_links_type
      69              :    USE qs_environment,                  ONLY: qs_init
      70              :    USE qs_environment_types,            ONLY: get_qs_env,&
      71              :                                               qs_env_create,&
      72              :                                               qs_environment_type,&
      73              :                                               set_qs_env
      74              : #include "./base/base_uses.f90"
      75              : 
      76              :    IMPLICIT NONE
      77              :    PRIVATE
      78              : 
      79              :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      80              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qmmm_create'
      81              : 
      82              :    PUBLIC :: qmmm_env_create
      83              : 
      84              : CONTAINS
      85              : 
      86              : ! **************************************************************************************************
      87              : !> \brief ...
      88              : !> \param qmmm_env ...
      89              : !> \param root_section ...
      90              : !> \param para_env ...
      91              : !> \param globenv ...
      92              : !> \param force_env_section ...
      93              : !> \param qmmm_section ...
      94              : !> \param subsys_section ...
      95              : !> \param use_motion_section ...
      96              : !> \param prev_subsys ...
      97              : !> \param ignore_outside_box ...
      98              : !> \par History
      99              : !>      05.2004 created [fawzi]
     100              : !> \author Fawzi Mohamed
     101              : ! **************************************************************************************************
     102          398 :    SUBROUTINE qmmm_env_create(qmmm_env, root_section, para_env, globenv, &
     103              :                               force_env_section, qmmm_section, subsys_section, use_motion_section, prev_subsys, &
     104              :                               ignore_outside_box)
     105              :       TYPE(qmmm_env_type), INTENT(OUT)                   :: qmmm_env
     106              :       TYPE(section_vals_type), POINTER                   :: root_section
     107              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     108              :       TYPE(global_environment_type), POINTER             :: globenv
     109              :       TYPE(section_vals_type), POINTER                   :: force_env_section, qmmm_section, &
     110              :                                                             subsys_section
     111              :       LOGICAL, INTENT(IN)                                :: use_motion_section
     112              :       TYPE(cp_subsys_type), OPTIONAL, POINTER            :: prev_subsys
     113              :       LOGICAL, INTENT(in), OPTIONAL                      :: ignore_outside_box
     114              : 
     115              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'qmmm_env_create'
     116              :       REAL(KIND=dp), PARAMETER                           :: eps_cell = 1.0E-12_dp
     117              : 
     118              :       CHARACTER(len=default_string_length), &
     119          398 :          DIMENSION(:), POINTER                           :: qm_atom_type
     120              :       INTEGER                                            :: center_i, delta_charge, handle, iw, iw2, &
     121              :                                                             orig_charge, qmmm_coupl_type, &
     122              :                                                             use_multipole
     123          398 :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index, mm_link_atoms, &
     124          398 :                                                             qm_atom_index
     125              :       LOGICAL                                            :: add_mm_charges, explicit, &
     126              :                                                             move_mm_charges, nocompatibility, &
     127              :                                                             qmmm_link, qmmm_link_Imomm, shell_model
     128          398 :       REAL(dp), DIMENSION(:), POINTER                    :: mm_atom_chrg, mm_el_pot_radius, &
     129          398 :                                                             mm_el_pot_radius_corr
     130              :       REAL(KIND=dp)                                      :: eps_mm_rspace
     131              :       REAL(KIND=dp), DIMENSION(3)                        :: abc_mm, abc_qm
     132          398 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: fist_scale_charge_link, &
     133          398 :                                                             mm_link_scale_factor
     134              :       TYPE(add_set_type), POINTER                        :: added_charges
     135              :       TYPE(add_shell_type), POINTER                      :: added_shells
     136              :       TYPE(cell_type), POINTER                           :: mm_cell, qm_cell_small, super_cell
     137              :       TYPE(cp_logger_type), POINTER                      :: logger
     138              :       TYPE(cp_subsys_type), POINTER                      :: subsys_mm, subsys_qm
     139              :       TYPE(fist_environment_type), POINTER               :: fist_env
     140              :       TYPE(fist_nonbond_env_type), POINTER               :: fist_nonbond_env
     141              :       TYPE(pw_env_type), POINTER                         :: pw_env
     142              :       TYPE(qmmm_env_mm_type), POINTER                    :: qmmm_env_mm
     143              :       TYPE(qmmm_env_qm_type), POINTER                    :: qmmm_env_qm
     144              :       TYPE(qmmm_links_type), POINTER                     :: qmmm_links
     145              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     146              :       TYPE(section_vals_type), POINTER                   :: cell_section, multipole_section, &
     147              :                                                             print_gen, print_section, qmmm_periodic
     148              : 
     149          398 :       CALL timeset(routineN, handle)
     150              : 
     151          398 :       NULLIFY (qm_atom_index, mm_atom_index, qm_atom_type)
     152          398 :       NULLIFY (qmmm_env_qm, subsys_mm, subsys_qm, mm_cell, qm_cell_small, cell_section)
     153          398 :       NULLIFY (mm_atom_chrg, mm_el_pot_radius, qmmm_env_mm, fist_env)
     154          398 :       NULLIFY (mm_link_atoms, mm_link_scale_factor, qmmm_links, added_charges, added_shells)
     155          398 :       NULLIFY (fist_scale_charge_link, print_section, fist_nonbond_env)
     156          398 :       NULLIFY (print_gen, logger, mm_el_pot_radius_corr, super_cell, pw_env)
     157              : 
     158          398 :       logger => cp_get_default_logger()
     159              : 
     160              :       ! citations
     161          398 :       CALL cite_reference(Laino2005)
     162              : 
     163              :       ! Input section...
     164          398 :       IF (.NOT. ASSOCIATED(subsys_section)) THEN
     165            0 :          subsys_section => section_vals_get_subs_vals(force_env_section, "SUBSYS")
     166              :       END IF
     167          398 :       qmmm_periodic => section_vals_get_subs_vals(qmmm_section, "PERIODIC")
     168          398 :       multipole_section => section_vals_get_subs_vals(qmmm_section, "PERIODIC%MULTIPOLE")
     169          398 :       print_section => section_vals_get_subs_vals(qmmm_section, "PRINT")
     170          398 :       print_gen => section_vals_get_subs_vals(print_section, "PROGRAM_RUN_INFO")
     171          398 :       iw = cp_print_key_unit_nr(logger, print_gen, "", extension=".log")
     172              : 
     173              :       ! Create QM/MM Environments..
     174         6368 :       ALLOCATE (qmmm_env_qm)
     175          398 :       CALL qmmm_env_qm_create(qmmm_env_qm)
     176          398 :       ALLOCATE (qmmm_env_mm)
     177          398 :       CALL qmmm_env_mm_create(qmmm_env_mm)
     178              : 
     179              :       ! Set up QM/MM Options
     180              :       CALL setup_qmmm_vars_mm(qmmm_section, &
     181              :                               qmmm_env_mm, &
     182              :                               qm_atom_index, &
     183              :                               mm_link_atoms, &
     184              :                               mm_link_scale_factor, &
     185              :                               fist_scale_charge_link, &
     186              :                               qmmm_coupl_type, &
     187          398 :                               qmmm_link)
     188              : 
     189          398 :       qmmm_env_mm%qm_atom_index => qm_atom_index
     190          398 :       qmmm_env_mm%mm_link_atoms => mm_link_atoms
     191          398 :       qmmm_env_mm%mm_link_scale_factor => mm_link_scale_factor
     192          398 :       qmmm_env_mm%fist_scale_charge_link => fist_scale_charge_link
     193          398 :       qmmm_env_mm%qmmm_coupl_type = qmmm_coupl_type
     194          398 :       qmmm_env_mm%qmmm_link = qmmm_link
     195              :       ! Center the qm subsys into the qm box
     196          398 :       CALL section_vals_val_get(qmmm_section, "CENTER", i_val=center_i)
     197          398 :       IF (center_i == do_qmmm_center_never) THEN
     198           16 :          qmmm_env_qm%center_qm_subsys = .FALSE.
     199           16 :          qmmm_env_qm%center_qm_subsys0 = .FALSE.
     200          382 :       ELSE IF (center_i == do_qmmm_center_setup_only) THEN
     201           92 :          qmmm_env_qm%center_qm_subsys = .FALSE.
     202           92 :          qmmm_env_qm%center_qm_subsys0 = .TRUE.
     203          290 :       ELSE IF (center_i == do_qmmm_center_every_step) THEN
     204          290 :          qmmm_env_qm%center_qm_subsys = .TRUE.
     205          290 :          qmmm_env_qm%center_qm_subsys0 = .TRUE.
     206              :       ELSE
     207            0 :          CPABORT("Unknown type of CENTER! ")
     208              :       END IF
     209              : 
     210          398 :       CALL section_vals_val_get(qmmm_section, "CENTER_TYPE", i_val=center_i)
     211          398 :       qmmm_env_qm%center_qm_subsys_pbc_aware = (center_i == do_qmmm_center_pbc_aware)
     212              : 
     213              :       ! Compatibility with the QM/MM in CPMD code
     214          398 :       CALL section_vals_val_get(qmmm_section, "NOCOMPATIBILITY", l_val=nocompatibility)
     215          398 :       qmmm_env_qm%compatibility = .NOT. nocompatibility
     216              : 
     217              :       ! Parallel scheme for the long range
     218              :       CALL section_vals_val_get(qmmm_section, "PARALLEL_SCHEME", &
     219          398 :                                 i_val=qmmm_env_qm%par_scheme)
     220              : 
     221              :       ! Periodic boundary condition calculation
     222          398 :       CALL section_vals_get(qmmm_periodic, explicit=explicit)
     223          398 :       qmmm_env_qm%periodic = explicit
     224              :       !multipole section is switched on by default; switched off only if explicitly stated
     225          398 :       IF (qmmm_env_qm%periodic) qmmm_env_qm%multipole = .TRUE.
     226          398 :       CALL section_vals_get(multipole_section, explicit=explicit)
     227          398 :       CALL section_vals_val_get(multipole_section, "_SECTION_PARAMETERS_", i_val=use_multipole)
     228          398 :       IF (explicit .AND. use_multipole == do_multipole_section_off) qmmm_env_qm%multipole = .FALSE.
     229          398 :       IF (explicit .AND. use_multipole == do_multipole_section_on) qmmm_env_qm%multipole = .TRUE.
     230          398 :       IF (qmmm_env_qm%periodic .AND. qmmm_env_qm%multipole) CALL cite_reference(Laino2006)
     231          398 :       IF (qmmm_coupl_type == do_qmmm_none) THEN
     232           52 :          IF (qmmm_env_qm%periodic) THEN
     233              :             CALL cp_warn(__LOCATION__, &
     234              :                          "QMMM periodic calculation with coupling NONE was requested! "// &
     235              :                          "Switching off the periodic keyword since periodic and non-periodic "// &
     236            2 :                          "calculation with coupling NONE represent the same method! ")
     237              :          END IF
     238           52 :          qmmm_env_qm%periodic = .FALSE.
     239              :       END IF
     240              : 
     241              :       ! First Initialize Fist...
     242          398 :       CALL section_vals_val_set(force_env_section, "METHOD", i_val=do_fist)
     243          398 :       ALLOCATE (fist_env)
     244          398 :       CALL fist_env_create(fist_env, para_env=para_env)
     245          398 :       CALL fist_env_set(fist_env, qmmm=.TRUE., qmmm_env=qmmm_env_mm)
     246              :       CALL fist_init(fist_env, root_section, para_env, force_env_section, &
     247          398 :                      subsys_section, use_motion_section, prev_subsys=prev_subsys)
     248              : 
     249              :       ! Get cell: mm_cell from FORCE_EVAL/SUBSYS/CELL like in MM-only Fist;
     250              :       !           qm_cell from FORCE_EVAL/QMMM/CELL
     251          398 :       CALL fist_env_get(fist_env, subsys=subsys_mm, cell=mm_cell)
     252          398 :       mm_cell%tag = "CELL_MM"
     253          398 :       cell_section => section_vals_get_subs_vals(qmmm_section, "CELL")
     254              :       CALL read_cell(qm_cell_small, qm_cell_small, cell_section=cell_section, &
     255          398 :                      check_for_ref=.FALSE., para_env=para_env)
     256          398 :       qm_cell_small%tag = "CELL_QM"
     257              : 
     258              :       ! Set up QM/MM Options
     259              :       CALL setup_qmmm_vars_qm(qmmm_section, &
     260              :                               qmmm_env_qm, &
     261              :                               subsys_mm, &
     262              :                               qm_atom_type, &
     263              :                               qm_atom_index, &
     264              :                               mm_atom_index, &
     265              :                               qm_cell_small, &
     266              :                               qmmm_coupl_type, &
     267              :                               eps_mm_rspace, &
     268              :                               qmmm_link, &
     269          398 :                               para_env)
     270              : 
     271          398 :       qmmm_env_qm%qm_atom_index => qm_atom_index
     272          398 :       qmmm_env_qm%mm_atom_index => mm_atom_index
     273          398 :       qmmm_env_qm%eps_mm_rspace = eps_mm_rspace
     274          398 :       qmmm_env_qm%qmmm_coupl_type = qmmm_coupl_type
     275          398 :       qmmm_env_qm%qmmm_link = qmmm_link
     276          398 :       qmmm_env_qm%num_qm_atoms = SIZE(qm_atom_index)
     277          398 :       qmmm_env_qm%num_mm_atoms = SIZE(mm_atom_index)
     278          398 :       IF (qmmm_env_qm%image_charge) THEN
     279           10 :          qmmm_env_qm%num_image_mm_atoms = SIZE(qmmm_env_qm%image_charge_pot%image_mm_list)
     280           10 :          CALL cite_reference(Golze2013)
     281              :       END IF
     282              : 
     283              :       ! Duplicate structure for link atoms
     284          398 :       IF (qmmm_link) THEN
     285           64 :          IF (ASSOCIATED(mm_link_atoms)) THEN
     286          186 :             ALLOCATE (qmmm_env_qm%mm_link_atoms(SIZE(mm_link_atoms)))
     287          512 :             qmmm_env_qm%mm_link_atoms = mm_link_atoms
     288              :          END IF
     289              :       END IF
     290          398 :       IF (iw > 0) THEN
     291          167 :          WRITE (iw, '(A,I26)') " Number of QM atoms: ", qmmm_env_qm%num_qm_atoms
     292          167 :          WRITE (iw, '(A,I26)') " Number of MM atoms: ", qmmm_env_qm%num_mm_atoms
     293          167 :          IF (qmmm_env_qm%image_charge) THEN
     294            5 :             WRITE (iw, '(A,I8)') " Number of MM atoms with image charge: ", &
     295           10 :                qmmm_env_qm%num_image_mm_atoms
     296              :          END IF
     297          167 :          CALL write_cell(mm_cell, subsys_section)
     298              :       END IF
     299          398 :       CALL get_cell(qm_cell_small, abc=abc_qm)
     300          398 :       CALL get_cell(mm_cell, abc=abc_mm)
     301              : 
     302          398 :       IF (qmmm_env_qm%image_charge) THEN
     303           40 :          IF (ANY(ABS(abc_mm - abc_qm) > eps_cell)) THEN
     304            0 :             CPABORT("QM and MM box need to have the same size when using image charges")
     305              :          END IF
     306              :       END IF
     307              : 
     308              :       ! Assign charges and mm_el_pot_radius from fist_topology
     309          398 :       CALL fist_env_get(fist_env, fist_nonbond_env=fist_nonbond_env)
     310         1192 :       ALLOCATE (mm_atom_chrg(SIZE(mm_atom_index)))
     311          794 :       ALLOCATE (mm_el_pot_radius(SIZE(mm_atom_index)))
     312          794 :       ALLOCATE (mm_el_pot_radius_corr(SIZE(mm_atom_index)))
     313       188202 :       mm_atom_chrg = 0.0_dp
     314       188202 :       mm_el_pot_radius = 0.0_dp
     315       188202 :       mm_el_pot_radius_corr = 0.0_dp
     316              : 
     317              :       CALL assign_mm_charges_and_radius(subsys=subsys_mm, &
     318              :                                         charges=fist_nonbond_env%charges, &
     319              :                                         mm_atom_chrg=mm_atom_chrg, &
     320              :                                         mm_el_pot_radius=mm_el_pot_radius, &
     321              :                                         mm_el_pot_radius_corr=mm_el_pot_radius_corr, &
     322              :                                         mm_atom_index=mm_atom_index, &
     323              :                                         mm_link_atoms=mm_link_atoms, &
     324              :                                         mm_link_scale_factor=mm_link_scale_factor, &
     325              :                                         added_shells=added_shells, &
     326          398 :                                         shell_model=shell_model)
     327              : 
     328          398 :       qmmm_env_qm%mm_atom_chrg => mm_atom_chrg
     329          398 :       qmmm_env_qm%mm_el_pot_radius => mm_el_pot_radius
     330          398 :       qmmm_env_qm%mm_el_pot_radius_corr => mm_el_pot_radius_corr
     331          398 :       qmmm_env_qm%added_shells => added_shells
     332              : 
     333          398 :       qmmm_link_Imomm = .FALSE.
     334          398 :       IF (qmmm_link) THEN
     335              :          CALL setup_qmmm_links(qmmm_section, qmmm_links, mm_el_pot_radius, &
     336           64 :                                mm_el_pot_radius_corr, mm_atom_index)
     337           64 :          qmmm_env_qm%qmmm_links => qmmm_links
     338              : 
     339           64 :          CALL print_qmmm_links(qmmm_section, qmmm_links)
     340              : 
     341           64 :          CALL add_set_release(qmmm_env_qm%added_charges)
     342              :          CALL move_or_add_atoms(qmmm_section, move_mm_charges, add_mm_charges, &
     343              :                                 mm_atom_chrg, mm_el_pot_radius, mm_el_pot_radius_corr, &
     344           64 :                                 added_charges, mm_atom_index)
     345           64 :          qmmm_env_qm%move_mm_charges = move_mm_charges
     346           64 :          qmmm_env_qm%add_mm_charges = add_mm_charges
     347           64 :          qmmm_env_qm%added_charges => added_charges
     348           64 :          IF (ASSOCIATED(qmmm_links%imomm)) qmmm_link_imomm = (SIZE(qmmm_links%imomm) /= 0)
     349              :       END IF
     350              : 
     351              :       CALL print_qmmm_charges(mm_atom_index, mm_atom_chrg, mm_el_pot_radius, &
     352              :                               mm_el_pot_radius_corr, qmmm_env_qm%added_charges, &
     353          398 :                               qmmm_env_qm%added_shells, qmmm_section, nocompatibility, shell_model)
     354          398 :       IF (qmmm_env_qm%image_charge) THEN
     355           10 :          CALL print_image_charge_info(qmmm_env_qm, qmmm_section)
     356              :       END IF
     357              : 
     358          398 :       CALL section_vals_val_get(qmmm_section, "DELTA_CHARGE", i_val=delta_charge)
     359          398 :       CALL section_vals_val_get(force_env_section, "DFT%CHARGE", i_val=orig_charge)
     360          398 :       CALL section_vals_val_set(force_env_section, "DFT%CHARGE", i_val=orig_charge + delta_charge)
     361              : 
     362          398 :       CALL section_vals_val_set(force_env_section, "METHOD", i_val=do_qs)
     363              :       CALL create_small_subsys(subsys_qm, &
     364              :                                big_subsys=subsys_mm, small_para_env=para_env, &
     365              :                                small_cell=qm_cell_small, sub_atom_index=qm_atom_index, &
     366              :                                sub_atom_kind_name=qm_atom_type, para_env=para_env, &
     367              :                                force_env_section=force_env_section, subsys_section=subsys_section, &
     368          398 :                                ignore_outside_box=ignore_outside_box)
     369          398 :       IF (qmmm_link_imomm) CALL qmmm_link_Imomm_coord(qmmm_links, subsys_qm%particles%els, &
     370           62 :                                                       qm_atom_index)
     371        13930 :       ALLOCATE (qs_env)
     372          398 :       CALL qs_env_create(qs_env, globenv)
     373              :       CALL qs_init(qs_env, para_env, root_section, globenv=globenv, cp_subsys=subsys_qm, &
     374              :                    qmmm=.TRUE., qmmm_env_qm=qmmm_env_qm, &
     375              :                    force_env_section=force_env_section, &
     376              :                    subsys_section=subsys_section, &
     377          398 :                    use_motion_section=use_motion_section)
     378          398 :       CALL cp_subsys_release(subsys_qm)
     379              : 
     380          398 :       IF (qmmm_env_qm%periodic) THEN
     381           48 :          IF (.NOT. ASSOCIATED(super_cell)) THEN
     382         3312 :             ALLOCATE (super_cell)
     383              :          END IF
     384           48 :          CALL cell_clone(mm_cell, super_cell, tag="SUPER_CELL")
     385           48 :          CALL set_qs_env(qs_env, super_cell=super_cell, qmmm_periodic=qmmm_env_qm%periodic)
     386           48 :          CALL cell_release(super_cell)
     387              :       END IF
     388          398 :       CALL section_vals_val_set(force_env_section, "DFT%CHARGE", i_val=orig_charge)
     389          398 :       CALL cp_print_key_finished_output(iw, logger, print_gen, "")
     390              :       iw2 = cp_print_key_unit_nr(logger, qmmm_section, "PRINT%PROGRAM_BANNER", &
     391          398 :                                  extension=".qmmmLog")
     392          398 :       CALL qmmm_header(iw2)
     393              :       CALL cp_print_key_finished_output(iw2, logger, qmmm_section, &
     394          398 :                                         "PRINT%PROGRAM_BANNER")
     395              :       !
     396              :       ! Initialize MM Potential fitted with Gaussian
     397              :       !
     398              :       CALL qmmm_init_gaussian_type(qmmm_env_qm=qmmm_env_qm, &
     399              :                                    para_env=para_env, &
     400              :                                    qs_env=qs_env, &
     401              :                                    mm_atom_chrg=mm_atom_chrg, &
     402              :                                    added_charges=qmmm_env_qm%added_charges, &
     403              :                                    added_shells=qmmm_env_qm%added_shells, &
     404              :                                    print_section=print_section, &
     405          398 :                                    qmmm_section=qmmm_section)
     406              :       !
     407              :       ! Initialize the MM potential stored on vector
     408              :       !
     409              :       CALL qmmm_init_potential(qmmm_env_qm=qmmm_env_qm, &
     410              :                                mm_cell=mm_cell, &
     411              :                                added_charges=qmmm_env_qm%added_charges, &
     412              :                                added_shells=qmmm_env_qm%added_shells, &
     413          398 :                                print_section=print_section)
     414              :       !
     415              :       ! Initialize the qmmm_pw_grid
     416              :       !
     417          398 :       CALL get_qs_env(qs_env, pw_env=pw_env)
     418              :       CALL qmmm_pw_grid_init(qmmm_env=qmmm_env_qm, &
     419          398 :                              pw_env=pw_env)
     420              :       !
     421              :       ! Initialize the MM periodic potential
     422              :       !
     423              :       CALL qmmm_init_periodic_potential(qmmm_env_qm=qmmm_env_qm, &
     424              :                                         qm_cell_small=qm_cell_small, &
     425              :                                         mm_cell=mm_cell, &
     426              :                                         para_env=para_env, &
     427              :                                         qs_env=qs_env, &
     428              :                                         added_charges=qmmm_env_qm%added_charges, &
     429              :                                         added_shells=qmmm_env_qm%added_shells, &
     430              :                                         qmmm_periodic=qmmm_periodic, &
     431              :                                         print_section=print_section, &
     432          398 :                                         mm_atom_chrg=mm_atom_chrg)
     433              :       !
     434              :       ! Preparing for PBC...
     435              :       !
     436              :       CALL setup_origin_mm_cell(qmmm_section, qmmm_env_qm, qm_cell_small, &
     437          398 :                                 dr=pw_env%pw_pools(pw_env%auxbas_grid)%pool%pw_grid%dr)
     438              : 
     439          398 :       CALL cell_release(qm_cell_small)
     440              : 
     441              :       ! assemble the actual qmmm_env
     442          398 :       qmmm_env%qs_env => qs_env
     443          398 :       qmmm_env%fist_env => fist_env
     444          398 :       qmmm_env%qm => qmmm_env_qm
     445              : 
     446          398 :       CALL section_vals_val_set(force_env_section, "METHOD", i_val=do_qmmm)
     447          398 :       DEALLOCATE (qm_atom_type)
     448              : 
     449          398 :       CALL timestop(handle)
     450              : 
     451         3582 :    END SUBROUTINE qmmm_env_create
     452              : 
     453              : END MODULE qmmm_create
        

Generated by: LCOV version 2.0-1