(git:ccc2433)
cp_subsys_methods.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Initialize a small environment for a particular calculation
10 !> \par History
11 !> 5.2004 created [fawzi]
12 !> 9.2007 cleaned [tlaino] - University of Zurich
13 !> \author Teodoro Laino
14 ! **************************************************************************************************
18  atomic_kind_list_type
19  USE atomic_kind_types, ONLY: atomic_kind_type
20  USE atprop_types, ONLY: atprop_create
21  USE cell_types, ONLY: cell_retain,&
22  cell_type
23  USE colvar_methods, ONLY: colvar_read
25  USE cp_subsys_types, ONLY: cp_subsys_get,&
27  cp_subsys_type
28  USE exclusion_types, ONLY: exclusion_type
29  USE input_constants, ONLY: do_conn_off,&
37  section_vals_type,&
39  USE kinds, ONLY: default_string_length,&
40  dp
41  USE message_passing, ONLY: mp_para_env_type
44  molecule_kind_list_type
45  USE molecule_kind_types, ONLY: molecule_kind_type
48  molecule_list_type
49  USE molecule_types, ONLY: molecule_type
52  particle_list_type
53  USE particle_types, ONLY: particle_type
54  USE qmmm_types_low, ONLY: qmmm_env_mm_type
55  USE string_table, ONLY: id2str,&
56  s2s,&
57  str2id
58  USE topology, ONLY: connectivity_control,&
66  USE virial_types, ONLY: virial_set
67 #include "./base/base_uses.f90"
68 
69  IMPLICIT NONE
70  PRIVATE
71 
72  LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .false.
73  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp_subsys_methods'
74 
76 
77 CONTAINS
78 
79 ! **************************************************************************************************
80 !> \brief Creates allocates and fills subsys from given input.
81 !> \param subsys ...
82 !> \param para_env ...
83 !> \param root_section ...
84 !> \param force_env_section ...
85 !> \param subsys_section ...
86 !> \param use_motion_section ...
87 !> \param qmmm ...
88 !> \param qmmm_env ...
89 !> \param exclusions ...
90 !> \param elkind ...
91 !> \author Ole Schuett
92 ! **************************************************************************************************
93  SUBROUTINE cp_subsys_create(subsys, para_env, &
94  root_section, force_env_section, subsys_section, &
95  use_motion_section, qmmm, qmmm_env, exclusions, elkind)
96  TYPE(cp_subsys_type), POINTER :: subsys
97  TYPE(mp_para_env_type), POINTER :: para_env
98  TYPE(section_vals_type), POINTER :: root_section
99  TYPE(section_vals_type), OPTIONAL, POINTER :: force_env_section, subsys_section
100  LOGICAL, INTENT(IN), OPTIONAL :: use_motion_section
101  LOGICAL, OPTIONAL :: qmmm
102  TYPE(qmmm_env_mm_type), OPTIONAL, POINTER :: qmmm_env
103  TYPE(exclusion_type), DIMENSION(:), OPTIONAL, &
104  POINTER :: exclusions
105  LOGICAL, INTENT(IN), OPTIONAL :: elkind
106 
107  INTEGER :: stress_tensor
108  INTEGER, DIMENSION(:), POINTER :: seed_vals
109  LOGICAL :: atomic_energy, atomic_stress, &
110  my_use_motion_section, &
111  pv_availability, pv_diagonal, &
112  pv_numerical
113  TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
114  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
115  TYPE(molecule_kind_list_type), POINTER :: mol_kinds
116  TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
117  TYPE(molecule_list_type), POINTER :: mols
118  TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
119  TYPE(particle_list_type), POINTER :: particles
120  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
121  TYPE(section_vals_type), POINTER :: colvar_section, my_force_env_section, &
122  my_subsys_section
123 
124  cpassert(.NOT. ASSOCIATED(subsys))
125  ALLOCATE (subsys)
126 
127  CALL para_env%retain()
128  subsys%para_env => para_env
129 
130  my_use_motion_section = .false.
131  IF (PRESENT(use_motion_section)) &
132  my_use_motion_section = use_motion_section
133 
134  my_force_env_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL")
135  IF (PRESENT(force_env_section)) &
136  my_force_env_section => force_env_section
137 
138  my_subsys_section => section_vals_get_subs_vals(my_force_env_section, "SUBSYS")
139  IF (PRESENT(subsys_section)) &
140  my_subsys_section => subsys_section
141 
142  CALL section_vals_val_get(my_subsys_section, "SEED", i_vals=seed_vals)
143  IF (SIZE(seed_vals) == 1) THEN
144  subsys%seed(:, :) = real(seed_vals(1), kind=dp)
145  ELSE IF (SIZE(seed_vals) == 6) THEN
146  subsys%seed(1:3, 1:2) = reshape(real(seed_vals(:), kind=dp), (/3, 2/))
147  ELSE
148  cpabort("Supply exactly 1 or 6 arguments for SEED in &SUBSYS only!")
149  END IF
150 
151  colvar_section => section_vals_get_subs_vals(my_subsys_section, "COLVAR")
152 
153  CALL cp_subsys_read_colvar(subsys, colvar_section)
154 
155  ! *** Read the particle coordinates and allocate the atomic kind, ***
156  ! *** the molecule kind, and the molecule data structures ***
157  CALL topology_control(atomic_kind_set, particle_set, molecule_kind_set, molecule_set, &
158  subsys%colvar_p, subsys%gci, root_section, para_env, &
159  force_env_section=my_force_env_section, &
160  subsys_section=my_subsys_section, use_motion_section=my_use_motion_section, &
161  qmmm=qmmm, qmmm_env=qmmm_env, exclusions=exclusions, elkind=elkind)
162 
163  CALL particle_list_create(particles, els_ptr=particle_set)
164  CALL atomic_kind_list_create(atomic_kinds, els_ptr=atomic_kind_set)
165  CALL molecule_list_create(mols, els_ptr=molecule_set)
166  CALL molecule_kind_list_create(mol_kinds, els_ptr=molecule_kind_set)
167 
168  CALL cp_subsys_set(subsys, particles=particles, atomic_kinds=atomic_kinds, &
169  molecules=mols, molecule_kinds=mol_kinds)
170 
171  CALL particle_list_release(particles)
172  CALL atomic_kind_list_release(atomic_kinds)
173  CALL molecule_list_release(mols)
174  CALL molecule_kind_list_release(mol_kinds)
175 
176  ! Should we compute the virial?
177  CALL section_vals_val_get(my_force_env_section, "STRESS_TENSOR", i_val=stress_tensor)
178  SELECT CASE (stress_tensor)
179  CASE (do_stress_none)
180  pv_availability = .false.
181  pv_numerical = .false.
182  pv_diagonal = .false.
183  CASE (do_stress_analytical)
184  pv_availability = .true.
185  pv_numerical = .false.
186  pv_diagonal = .false.
187  CASE (do_stress_numerical)
188  pv_availability = .true.
189  pv_numerical = .true.
190  pv_diagonal = .false.
192  pv_availability = .true.
193  pv_numerical = .false.
194  pv_diagonal = .true.
196  pv_availability = .true.
197  pv_numerical = .true.
198  pv_diagonal = .true.
199  END SELECT
200 
201  ALLOCATE (subsys%virial)
202  CALL virial_set(virial=subsys%virial, &
203  pv_availability=pv_availability, &
204  pv_numer=pv_numerical, &
205  pv_diagonal=pv_diagonal)
206 
207  ! Should we compute atomic properties?
208  CALL atprop_create(subsys%atprop)
209  CALL section_vals_val_get(my_force_env_section, "PROPERTIES%ATOMIC%ENERGY", l_val=atomic_energy)
210  subsys%atprop%energy = atomic_energy
211  CALL section_vals_val_get(my_force_env_section, "PROPERTIES%ATOMIC%PRESSURE", l_val=atomic_stress)
212  IF (atomic_stress) THEN
213  cpassert(pv_availability)
214  cpassert(.NOT. pv_numerical)
215  END IF
216  subsys%atprop%stress = atomic_stress
217 
218  CALL cp_result_create(subsys%results)
219  END SUBROUTINE cp_subsys_create
220 
221 ! **************************************************************************************************
222 !> \brief reads the colvar section of the colvar
223 !> \param subsys ...
224 !> \param colvar_section ...
225 !> \par History
226 !> 2006.01 Joost VandeVondele
227 ! **************************************************************************************************
228  SUBROUTINE cp_subsys_read_colvar(subsys, colvar_section)
229  TYPE(cp_subsys_type), POINTER :: subsys
230  TYPE(section_vals_type), POINTER :: colvar_section
231 
232  INTEGER :: ig, ncol
233 
234  CALL section_vals_get(colvar_section, n_repetition=ncol)
235  ALLOCATE (subsys%colvar_p(ncol))
236  DO ig = 1, ncol
237  NULLIFY (subsys%colvar_p(ig)%colvar)
238  CALL colvar_read(subsys%colvar_p(ig)%colvar, ig, colvar_section, subsys%para_env)
239  END DO
240  END SUBROUTINE cp_subsys_read_colvar
241 
242 ! **************************************************************************************************
243 !> \brief updates the molecule information of the given subsys
244 !> \param small_subsys the subsys to create
245 !> \param big_subsys the superset of small_subsys
246 !> \param small_cell ...
247 !> \param small_para_env the parallel environment for the new (small)
248 !> subsys
249 !> \param sub_atom_index indexes of the atoms that should be in small_subsys
250 !> \param sub_atom_kind_name ...
251 !> \param para_env ...
252 !> \param force_env_section ...
253 !> \param subsys_section ...
254 !> \param ignore_outside_box ...
255 !> \par History
256 !> 05.2004 created [fawzi]
257 !> \author Fawzi Mohamed, Teodoro Laino
258 !> \note
259 !> not really ready to be used with different para_envs for the small
260 !> and big part
261 ! **************************************************************************************************
262  SUBROUTINE create_small_subsys(small_subsys, big_subsys, small_cell, &
263  small_para_env, sub_atom_index, sub_atom_kind_name, &
264  para_env, force_env_section, subsys_section, ignore_outside_box)
265 
266  TYPE(cp_subsys_type), POINTER :: small_subsys, big_subsys
267  TYPE(cell_type), POINTER :: small_cell
268  TYPE(mp_para_env_type), POINTER :: small_para_env
269  INTEGER, DIMENSION(:), INTENT(in) :: sub_atom_index
270  CHARACTER(len=default_string_length), &
271  DIMENSION(:), INTENT(in) :: sub_atom_kind_name
272  TYPE(mp_para_env_type), POINTER :: para_env
273  TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
274  LOGICAL, INTENT(in), OPTIONAL :: ignore_outside_box
275 
276  CHARACTER(len=default_string_length) :: my_element, strtmp1
277  INTEGER :: iat, id_, nat
278  TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
279  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
280  TYPE(molecule_kind_list_type), POINTER :: mol_kinds
281  TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
282  TYPE(molecule_list_type), POINTER :: mols
283  TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
284  TYPE(particle_list_type), POINTER :: particles
285  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
287 
288  NULLIFY (mol_kinds, mols, particles, atomic_kinds, atomic_kind_set, particle_set, &
289  molecule_kind_set, molecule_set, particles, atomic_kinds)
290 
291  cpassert(.NOT. ASSOCIATED(small_subsys))
292  cpassert(ASSOCIATED(big_subsys))
293  IF (big_subsys%para_env /= small_para_env) &
294  cpabort("big_subsys%para_env==small_para_env")
295 
296  !-----------------------------------------------------------------------------
297  !-----------------------------------------------------------------------------
298  ! 1. Initialize the topology structure type
299  !-----------------------------------------------------------------------------
300  CALL init_topology(topology)
301 
302  !-----------------------------------------------------------------------------
303  !-----------------------------------------------------------------------------
304  ! 2. Get the cell info
305  !-----------------------------------------------------------------------------
306  topology%cell => small_cell
307  CALL cell_retain(small_cell)
308 
309  !-----------------------------------------------------------------------------
310  !-----------------------------------------------------------------------------
311  ! 3. Initialize atom coords from the bigger system
312  !-----------------------------------------------------------------------------
313  nat = SIZE(sub_atom_index)
314  topology%natoms = nat
315  cpassert(.NOT. ASSOCIATED(topology%atom_info%r))
316  cpassert(.NOT. ASSOCIATED(topology%atom_info%id_atmname))
317  cpassert(.NOT. ASSOCIATED(topology%atom_info%id_molname))
318  cpassert(.NOT. ASSOCIATED(topology%atom_info%id_resname))
319  cpassert(.NOT. ASSOCIATED(topology%atom_info%atm_mass))
320  cpassert(.NOT. ASSOCIATED(topology%atom_info%atm_charge))
321  ALLOCATE (topology%atom_info%r(3, nat), topology%atom_info%id_atmname(nat), &
322  topology%atom_info%id_molname(nat), topology%atom_info%id_resname(nat), &
323  topology%atom_info%id_element(nat), topology%atom_info%atm_mass(nat), &
324  topology%atom_info%atm_charge(nat))
325 
326  CALL cp_subsys_get(big_subsys, particles=particles)
327  DO iat = 1, nat
328  topology%atom_info%r(:, iat) = particles%els(sub_atom_index(iat))%r
329  topology%atom_info%id_atmname(iat) = str2id(s2s(sub_atom_kind_name(iat)))
330  topology%atom_info%id_molname(iat) = topology%atom_info%id_atmname(iat)
331  topology%atom_info%id_resname(iat) = topology%atom_info%id_atmname(iat)
332  !
333  ! Defining element
334  !
335  id_ = index(id2str(topology%atom_info%id_atmname(iat)), "_") - 1
336  IF (id_ == -1) id_ = len_trim(id2str(topology%atom_info%id_atmname(iat)))
337  strtmp1 = id2str(topology%atom_info%id_atmname(iat))
338  strtmp1 = strtmp1(1:id_)
339  CALL check_subsys_element(strtmp1, strtmp1, my_element, &
340  subsys_section, use_mm_map_first=.false.)
341  topology%atom_info%id_element(iat) = str2id(s2s(my_element))
342  topology%atom_info%atm_mass(iat) = 0._dp
343  topology%atom_info%atm_charge(iat) = 0._dp
344  END DO
345  topology%conn_type = do_conn_off
346 
347  !-----------------------------------------------------------------------------
348  !-----------------------------------------------------------------------------
349  ! 4. Read in or generate the molecular connectivity
350  !-----------------------------------------------------------------------------
351  CALL connectivity_control(topology, para_env, subsys_section=subsys_section, &
352  force_env_section=force_env_section)
353 
354  !-----------------------------------------------------------------------------
355  !-----------------------------------------------------------------------------
356  ! 5. Pack everything into the molecular types
357  !-----------------------------------------------------------------------------
358  CALL topology_connectivity_pack(molecule_kind_set, molecule_set, &
359  topology, subsys_section=subsys_section)
360 
361  !-----------------------------------------------------------------------------
362  !-----------------------------------------------------------------------------
363  ! 6. Pack everything into the atomic types
364  !-----------------------------------------------------------------------------
365  CALL topology_coordinate_pack(particle_set, atomic_kind_set, &
366  molecule_kind_set, molecule_set, topology, subsys_section=subsys_section, &
367  force_env_section=force_env_section, ignore_outside_box=ignore_outside_box)
368 
369  !-----------------------------------------------------------------------------
370  !-----------------------------------------------------------------------------
371  ! 7. Cleanup the topology structure type
372  !-----------------------------------------------------------------------------
374 
375  !-----------------------------------------------------------------------------
376  !-----------------------------------------------------------------------------
377  ! 8. Allocate new subsys
378  !-----------------------------------------------------------------------------
379  ALLOCATE (small_subsys)
380  CALL para_env%retain()
381  small_subsys%para_env => para_env
382  CALL particle_list_create(particles, els_ptr=particle_set)
383  CALL atomic_kind_list_create(atomic_kinds, els_ptr=atomic_kind_set)
384  CALL molecule_list_create(mols, els_ptr=molecule_set)
385  CALL molecule_kind_list_create(mol_kinds, els_ptr=molecule_kind_set)
386  CALL cp_subsys_set(small_subsys, particles=particles, atomic_kinds=atomic_kinds, &
387  molecules=mols, molecule_kinds=mol_kinds)
388  CALL particle_list_release(particles)
389  CALL atomic_kind_list_release(atomic_kinds)
390  CALL molecule_list_release(mols)
391  CALL molecule_kind_list_release(mol_kinds)
392 
393  ALLOCATE (small_subsys%virial)
394  CALL atprop_create(small_subsys%atprop)
395  CALL cp_result_create(small_subsys%results)
396  END SUBROUTINE create_small_subsys
397 
398 END MODULE cp_subsys_methods
represent a simple array based list of the given type
subroutine, public atomic_kind_list_release(list)
releases a list (see doc/ReferenceCounting.html)
subroutine, public atomic_kind_list_create(list, els_ptr, owns_els, n_els)
creates a list
Define the atomic kind types and their sub types.
Holds information on atomic properties.
Definition: atprop_types.F:14
subroutine, public atprop_create(atprop_env)
...
Definition: atprop_types.F:53
Handles all functions related to the CELL.
Definition: cell_types.F:15
subroutine, public cell_retain(cell)
retains the given cell (see doc/ReferenceCounting.html)
Definition: cell_types.F:542
defines collective variables s({R}) and the derivative of this variable wrt R these can then be used ...
recursive subroutine, public colvar_read(colvar, icol, colvar_section, para_env)
reads a colvar from the input
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_result_create(results)
Allocates and intitializes the cp_result.
Initialize a small environment for a particular calculation.
subroutine, public create_small_subsys(small_subsys, big_subsys, small_cell, small_para_env, sub_atom_index, sub_atom_kind_name, para_env, force_env_section, subsys_section, ignore_outside_box)
updates the molecule information of the given subsys
subroutine, public cp_subsys_create(subsys, para_env, root_section, force_env_section, subsys_section, use_motion_section, qmmm, qmmm_env, exclusions, elkind)
Creates allocates and fills subsys from given input.
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_set(subsys, atomic_kinds, particles, local_particles, molecules, molecule_kinds, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, results, cell)
sets various propreties of the subsys
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
an exclusion type
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_stress_analytical
integer, parameter, public do_conn_off
integer, parameter, public do_stress_diagonal_anal
integer, parameter, public do_stress_diagonal_numer
integer, parameter, public do_stress_none
integer, parameter, public do_stress_numerical
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
integer, parameter, public default_string_length
Definition: kinds.F:57
Interface to the message passing library MPI.
represent a simple array based list of the given type
subroutine, public molecule_kind_list_create(list, els_ptr, owns_els, n_els)
creates a list
subroutine, public molecule_kind_list_release(list)
releases a list (see doc/ReferenceCounting.html)
Define the molecule kind structure types and the corresponding functionality.
represent a simple array based list of the given type
subroutine, public molecule_list_create(list, els_ptr, owns_els, n_els)
creates a list
subroutine, public molecule_list_release(list)
releases a list (see doc/ReferenceCounting.html)
Define the data structure for the molecule information.
represent a simple array based list of the given type
subroutine, public particle_list_create(list, els_ptr, owns_els, n_els)
creates a list
subroutine, public particle_list_release(list)
releases a list (see doc/ReferenceCounting.html)
Define the data structure for the particle information.
generates a unique id number for a string (str2id) that can be used two compare two strings....
Definition: string_table.F:22
character(len=default_string_length) function, public s2s(str)
converts a string in a string of default_string_length
Definition: string_table.F:141
integer function, public str2id(str)
returns a unique id for a given string, and stores the string for later retrieval using the id.
Definition: string_table.F:72
character(len=default_string_length) function, public id2str(id)
returns the string associated with a given id
Definition: string_table.F:115
Collection of subroutine needed for topology related things.
subroutine, public topology_connectivity_pack(molecule_kind_set, molecule_set, topology, subsys_section)
topology connectivity pack
Collection of subroutine needed for topology related things.
subroutine, public topology_coordinate_pack(particle_set, atomic_kind_set, molecule_kind_set, molecule_set, topology, qmmm, qmmm_env, subsys_section, force_env_section, exclusions, ignore_outside_box)
Take info readin from different file format and stuff it into compatible data structure in cp2k.
subroutine, public deallocate_topology(topology)
Just DEALLOCATE all the stuff
subroutine, public init_topology(topology)
Just NULLIFY and zero all the stuff
Collection of subroutine needed for topology related things.
Definition: topology_util.F:13
subroutine, public check_subsys_element(element_in, atom_name_in, element_out, subsys_section, use_mm_map_first)
Check and returns the ELEMENT label.
Control for reading in different topologies and coordinates.
Definition: topology.F:13
subroutine, public topology_control(atomic_kind_set, particle_set, molecule_kind_set, molecule_set, colvar_p, gci, root_section, para_env, qmmm, qmmm_env, force_env_section, subsys_section, use_motion_section, exclusions, elkind)
...
Definition: topology.F:125
subroutine, public connectivity_control(topology, para_env, qmmm, qmmm_env, subsys_section, force_env_section)
If reading in from external file, make sure its there first
Definition: topology.F:285
subroutine, public virial_set(virial, pv_total, pv_kinetic, pv_virial, pv_xc, pv_fock_4c, pv_constraint, pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, pv_ehartree, pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw, pv_availability, pv_calculate, pv_numer, pv_diagonal)
...
Definition: virial_types.F:192