(git:374b731)
Loading...
Searching...
No Matches
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! **************************************************************************************************
21 USE cell_types, ONLY: cell_retain,&
29 USE input_constants, ONLY: do_conn_off,&
39 USE kinds, ONLY: default_string_length,&
40 dp
55 USE string_table, ONLY: id2str,&
56 s2s,&
57 str2id
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
77CONTAINS
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.
184 pv_availability = .true.
185 pv_numerical = .false.
186 pv_diagonal = .false.
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 !-----------------------------------------------------------------------------
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
398END 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.
subroutine, public atprop_create(atprop_env)
...
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....
character(len=default_string_length) function, public s2s(str)
converts a string in a string of default_string_length
integer function, public str2id(str)
returns a unique id for a given string, and stores the string for later retrieval using the id.
character(len=default_string_length) function, public id2str(id)
returns the string associated with a given id
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.
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)
...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
represents a system: atoms, molecules, their pos,vel,...
A type used to store lists of exclusions and onfos.
stores all the informations relevant to an mpi environment