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
|