(git:cb5d5fc)
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-2026 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_methods, ONLY: write_cell
22 USE cell_types, ONLY: cell_retain,&
30 USE input_constants, ONLY: do_conn_off,&
40 USE kinds, ONLY: default_string_length,&
41 dp
56 USE string_table, ONLY: id2str,&
57 s2s,&
58 str2id
67 USE virial_types, ONLY: virial_set
68#include "./base/base_uses.f90"
69
70 IMPLICIT NONE
71 PRIVATE
72
73 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .false.
74 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp_subsys_methods'
75
77
78CONTAINS
79
80! **************************************************************************************************
81!> \brief Creates allocates and fills subsys from given input.
82!> \param subsys ...
83!> \param para_env ...
84!> \param root_section ...
85!> \param force_env_section ...
86!> \param subsys_section ...
87!> \param use_motion_section ...
88!> \param qmmm ...
89!> \param qmmm_env ...
90!> \param exclusions ...
91!> \param elkind ...
92!> \author Ole Schuett
93! **************************************************************************************************
94 SUBROUTINE cp_subsys_create(subsys, para_env, &
95 root_section, force_env_section, subsys_section, &
96 use_motion_section, qmmm, qmmm_env, exclusions, elkind)
97 TYPE(cp_subsys_type), POINTER :: subsys
98 TYPE(mp_para_env_type), POINTER :: para_env
99 TYPE(section_vals_type), POINTER :: root_section
100 TYPE(section_vals_type), OPTIONAL, POINTER :: force_env_section, subsys_section
101 LOGICAL, INTENT(IN), OPTIONAL :: use_motion_section
102 LOGICAL, OPTIONAL :: qmmm
103 TYPE(qmmm_env_mm_type), OPTIONAL, POINTER :: qmmm_env
104 TYPE(exclusion_type), DIMENSION(:), OPTIONAL, &
105 POINTER :: exclusions
106 LOGICAL, INTENT(IN), OPTIONAL :: elkind
107
108 INTEGER :: stress_tensor
109 INTEGER, DIMENSION(:), POINTER :: seed_vals
110 LOGICAL :: atomic_energy, 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 subsys=subsys)
163
164 CALL particle_list_create(particles, els_ptr=particle_set)
165 CALL atomic_kind_list_create(atomic_kinds, els_ptr=atomic_kind_set)
166 CALL molecule_list_create(mols, els_ptr=molecule_set)
167 CALL molecule_kind_list_create(mol_kinds, els_ptr=molecule_kind_set)
168
169 CALL cp_subsys_set(subsys, particles=particles, atomic_kinds=atomic_kinds, &
170 molecules=mols, molecule_kinds=mol_kinds)
171
172 CALL particle_list_release(particles)
173 CALL atomic_kind_list_release(atomic_kinds)
174 CALL molecule_list_release(mols)
175 CALL molecule_kind_list_release(mol_kinds)
176
177 ! Should we compute the virial?
178 CALL section_vals_val_get(my_force_env_section, "STRESS_TENSOR", i_val=stress_tensor)
179 SELECT CASE (stress_tensor)
180 CASE (do_stress_none)
181 pv_availability = .false.
182 pv_numerical = .false.
183 pv_diagonal = .false.
185 pv_availability = .true.
186 pv_numerical = .false.
187 pv_diagonal = .false.
189 pv_availability = .true.
190 pv_numerical = .true.
191 pv_diagonal = .false.
193 pv_availability = .true.
194 pv_numerical = .false.
195 pv_diagonal = .true.
197 pv_availability = .true.
198 pv_numerical = .true.
199 pv_diagonal = .true.
200 END SELECT
201
202 ALLOCATE (subsys%virial)
203 CALL virial_set(virial=subsys%virial, &
204 pv_availability=pv_availability, &
205 pv_numer=pv_numerical, &
206 pv_diagonal=pv_diagonal)
207
208 ! Should we compute atomic properties?
209 CALL atprop_create(subsys%atprop)
210 CALL section_vals_val_get(my_force_env_section, "PROPERTIES%ATOMIC%ENERGY", l_val=atomic_energy)
211 subsys%atprop%energy = atomic_energy
212
213 CALL cp_result_create(subsys%results)
214 END SUBROUTINE cp_subsys_create
215
216! **************************************************************************************************
217!> \brief reads the colvar section of the colvar
218!> \param subsys ...
219!> \param colvar_section ...
220!> \par History
221!> 2006.01 Joost VandeVondele
222! **************************************************************************************************
223 SUBROUTINE cp_subsys_read_colvar(subsys, colvar_section)
224 TYPE(cp_subsys_type), POINTER :: subsys
225 TYPE(section_vals_type), POINTER :: colvar_section
226
227 INTEGER :: ig, ncol
228
229 CALL section_vals_get(colvar_section, n_repetition=ncol)
230 ALLOCATE (subsys%colvar_p(ncol))
231 DO ig = 1, ncol
232 NULLIFY (subsys%colvar_p(ig)%colvar)
233 CALL colvar_read(subsys%colvar_p(ig)%colvar, ig, colvar_section, subsys%para_env)
234 END DO
235 END SUBROUTINE cp_subsys_read_colvar
236
237! **************************************************************************************************
238!> \brief updates the molecule information of the given subsys
239!> \param small_subsys the subsys to create
240!> \param big_subsys the superset of small_subsys
241!> \param small_cell the cell of small_subsys
242!> \param small_para_env the parallel environment for the new (small)
243!> subsys
244!> \param sub_atom_index indexes of the atoms that should be in small_subsys
245!> \param sub_atom_kind_name ...
246!> \param para_env ...
247!> \param force_env_section ...
248!> \param subsys_section ...
249!> \param ignore_outside_box ...
250!> \par History
251!> 05.2004 created [fawzi]
252!> \author Fawzi Mohamed, Teodoro Laino
253!> \note
254!> not really ready to be used with different para_envs for the small
255!> and big part
256!> qmmm_env_create() should be the only instance where this subroutine is called
257!> with small_cell distinct from big_subsys%cell; otherwise it could be possible
258!> to drop the small_cell as input parameter entirely.
259! **************************************************************************************************
260 SUBROUTINE create_small_subsys(small_subsys, big_subsys, small_cell, &
261 small_para_env, sub_atom_index, sub_atom_kind_name, &
262 para_env, force_env_section, subsys_section, ignore_outside_box)
263
264 TYPE(cp_subsys_type), POINTER :: small_subsys, big_subsys
265 TYPE(cell_type), POINTER :: small_cell
266 TYPE(mp_para_env_type), POINTER :: small_para_env
267 INTEGER, DIMENSION(:), INTENT(in) :: sub_atom_index
268 CHARACTER(len=default_string_length), &
269 DIMENSION(:), INTENT(in) :: sub_atom_kind_name
270 TYPE(mp_para_env_type), POINTER :: para_env
271 TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
272 LOGICAL, INTENT(in), OPTIONAL :: ignore_outside_box
273
274 CHARACTER(len=default_string_length) :: my_element, strtmp1
275 INTEGER :: iat, id_, nat
276 TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
277 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
278 TYPE(molecule_kind_list_type), POINTER :: mol_kinds
279 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
280 TYPE(molecule_list_type), POINTER :: mols
281 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
282 TYPE(particle_list_type), POINTER :: particles
283 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
285
286 NULLIFY (mol_kinds, mols, particles, atomic_kinds, atomic_kind_set, particle_set, &
287 molecule_kind_set, molecule_set, particles, atomic_kinds)
288
289 cpassert(.NOT. ASSOCIATED(small_subsys))
290 cpassert(ASSOCIATED(big_subsys))
291 IF (big_subsys%para_env /= small_para_env) &
292 cpabort("big_subsys%para_env==small_para_env")
293
294 !-----------------------------------------------------------------------------
295 !-----------------------------------------------------------------------------
296 ! 1. Initialize the topology structure type
297 !-----------------------------------------------------------------------------
299
300 !-----------------------------------------------------------------------------
301 !-----------------------------------------------------------------------------
302 ! 2. Get the cell info
303 !-----------------------------------------------------------------------------
304 topology%cell => small_cell
305 CALL cell_retain(small_cell)
306 CALL write_cell(small_cell, subsys_section, tag="CELL")
307 CALL write_cell(small_cell, subsys_section, tag="CELL_REF")
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, cell=small_cell, &
388 cell_ref=small_cell, use_ref_cell=.false.)
389 CALL particle_list_release(particles)
390 CALL atomic_kind_list_release(atomic_kinds)
391 CALL molecule_list_release(mols)
392 CALL molecule_kind_list_release(mol_kinds)
393
394 ALLOCATE (small_subsys%virial)
395 CALL atprop_create(small_subsys%atprop)
396 CALL cp_result_create(small_subsys%results)
397 END SUBROUTINE create_small_subsys
398
399END 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.
subroutine, public write_cell(cell, subsys_section, tag)
Write the cell parameters to the output unit.
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:547
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, cell_ref, use_ref_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, cell_ref, use_ref_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 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:310
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, subsys)
...
Definition topology.F:133
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:60
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