(git:fc9bb57)
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)) THEN
132 my_use_motion_section = use_motion_section
133 END IF
134
135 my_force_env_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL")
136 IF (PRESENT(force_env_section)) THEN
137 my_force_env_section => force_env_section
138 END IF
139
140 my_subsys_section => section_vals_get_subs_vals(my_force_env_section, "SUBSYS")
141 IF (PRESENT(subsys_section)) THEN
142 my_subsys_section => subsys_section
143 END IF
144
145 CALL section_vals_val_get(my_subsys_section, "SEED", i_vals=seed_vals)
146 IF (SIZE(seed_vals) == 1) THEN
147 subsys%seed(:, :) = real(seed_vals(1), kind=dp)
148 ELSE IF (SIZE(seed_vals) == 6) THEN
149 subsys%seed(1:3, 1:2) = reshape(real(seed_vals(:), kind=dp), [3, 2])
150 ELSE
151 cpabort("Supply exactly 1 or 6 arguments for SEED in &SUBSYS only!")
152 END IF
153
154 colvar_section => section_vals_get_subs_vals(my_subsys_section, "COLVAR")
155
156 CALL cp_subsys_read_colvar(subsys, colvar_section)
157
158 ! *** Read the particle coordinates and allocate the atomic kind, ***
159 ! *** the molecule kind, and the molecule data structures ***
160 CALL topology_control(atomic_kind_set, particle_set, molecule_kind_set, molecule_set, &
161 subsys%colvar_p, subsys%gci, root_section, para_env, &
162 force_env_section=my_force_env_section, &
163 subsys_section=my_subsys_section, use_motion_section=my_use_motion_section, &
164 qmmm=qmmm, qmmm_env=qmmm_env, exclusions=exclusions, elkind=elkind, &
165 subsys=subsys)
166
167 CALL particle_list_create(particles, els_ptr=particle_set)
168 CALL atomic_kind_list_create(atomic_kinds, els_ptr=atomic_kind_set)
169 CALL molecule_list_create(mols, els_ptr=molecule_set)
170 CALL molecule_kind_list_create(mol_kinds, els_ptr=molecule_kind_set)
171
172 CALL cp_subsys_set(subsys, particles=particles, atomic_kinds=atomic_kinds, &
173 molecules=mols, molecule_kinds=mol_kinds)
174
175 CALL particle_list_release(particles)
176 CALL atomic_kind_list_release(atomic_kinds)
177 CALL molecule_list_release(mols)
178 CALL molecule_kind_list_release(mol_kinds)
179
180 ! Should we compute the virial?
181 CALL section_vals_val_get(my_force_env_section, "STRESS_TENSOR", i_val=stress_tensor)
182 SELECT CASE (stress_tensor)
183 CASE (do_stress_none)
184 pv_availability = .false.
185 pv_numerical = .false.
186 pv_diagonal = .false.
188 pv_availability = .true.
189 pv_numerical = .false.
190 pv_diagonal = .false.
192 pv_availability = .true.
193 pv_numerical = .true.
194 pv_diagonal = .false.
196 pv_availability = .true.
197 pv_numerical = .false.
198 pv_diagonal = .true.
200 pv_availability = .true.
201 pv_numerical = .true.
202 pv_diagonal = .true.
203 END SELECT
204
205 ALLOCATE (subsys%virial)
206 CALL virial_set(virial=subsys%virial, &
207 pv_availability=pv_availability, &
208 pv_numer=pv_numerical, &
209 pv_diagonal=pv_diagonal)
210
211 ! Should we compute atomic properties?
212 CALL atprop_create(subsys%atprop)
213 CALL section_vals_val_get(my_force_env_section, "PROPERTIES%ATOMIC%ENERGY", l_val=atomic_energy)
214 subsys%atprop%energy = atomic_energy
215
216 CALL cp_result_create(subsys%results)
217 END SUBROUTINE cp_subsys_create
218
219! **************************************************************************************************
220!> \brief reads the colvar section of the colvar
221!> \param subsys ...
222!> \param colvar_section ...
223!> \par History
224!> 2006.01 Joost VandeVondele
225! **************************************************************************************************
226 SUBROUTINE cp_subsys_read_colvar(subsys, colvar_section)
227 TYPE(cp_subsys_type), POINTER :: subsys
228 TYPE(section_vals_type), POINTER :: colvar_section
229
230 INTEGER :: ig, ncol
231
232 CALL section_vals_get(colvar_section, n_repetition=ncol)
233 ALLOCATE (subsys%colvar_p(ncol))
234 DO ig = 1, ncol
235 NULLIFY (subsys%colvar_p(ig)%colvar)
236 CALL colvar_read(subsys%colvar_p(ig)%colvar, ig, colvar_section, subsys%para_env, subsys%cell)
237 END DO
238 END SUBROUTINE cp_subsys_read_colvar
239
240! **************************************************************************************************
241!> \brief updates the molecule information of the given subsys
242!> \param small_subsys the subsys to create
243!> \param big_subsys the superset of small_subsys
244!> \param small_cell the cell of small_subsys
245!> \param small_para_env the parallel environment for the new (small)
246!> subsys
247!> \param sub_atom_index indexes of the atoms that should be in small_subsys
248!> \param sub_atom_kind_name ...
249!> \param para_env ...
250!> \param force_env_section ...
251!> \param subsys_section ...
252!> \param ignore_outside_box ...
253!> \par History
254!> 05.2004 created [fawzi]
255!> \author Fawzi Mohamed, Teodoro Laino
256!> \note
257!> not really ready to be used with different para_envs for the small
258!> and big part
259!> qmmm_env_create() should be the only instance where this subroutine is called
260!> with small_cell distinct from big_subsys%cell; otherwise it could be possible
261!> to drop the small_cell as input parameter entirely.
262! **************************************************************************************************
263 SUBROUTINE create_small_subsys(small_subsys, big_subsys, small_cell, &
264 small_para_env, sub_atom_index, sub_atom_kind_name, &
265 para_env, force_env_section, subsys_section, ignore_outside_box)
266
267 TYPE(cp_subsys_type), POINTER :: small_subsys, big_subsys
268 TYPE(cell_type), POINTER :: small_cell
269 TYPE(mp_para_env_type), POINTER :: small_para_env
270 INTEGER, DIMENSION(:), INTENT(in) :: sub_atom_index
271 CHARACTER(len=default_string_length), &
272 DIMENSION(:), INTENT(in) :: sub_atom_kind_name
273 TYPE(mp_para_env_type), POINTER :: para_env
274 TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
275 LOGICAL, INTENT(in), OPTIONAL :: ignore_outside_box
276
277 CHARACTER(len=default_string_length) :: my_element, strtmp1
278 INTEGER :: iat, id_, nat
279 TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
280 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
281 TYPE(molecule_kind_list_type), POINTER :: mol_kinds
282 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
283 TYPE(molecule_list_type), POINTER :: mols
284 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
285 TYPE(particle_list_type), POINTER :: particles
286 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
288
289 NULLIFY (mol_kinds, mols, particles, atomic_kinds, atomic_kind_set, particle_set, &
290 molecule_kind_set, molecule_set, particles, atomic_kinds)
291
292 cpassert(.NOT. ASSOCIATED(small_subsys))
293 cpassert(ASSOCIATED(big_subsys))
294 IF (big_subsys%para_env /= small_para_env) THEN
295 cpabort("big_subsys%para_env==small_para_env")
296 END IF
297
298 !-----------------------------------------------------------------------------
299 !-----------------------------------------------------------------------------
300 ! 1. Initialize the topology structure type
301 !-----------------------------------------------------------------------------
303
304 !-----------------------------------------------------------------------------
305 !-----------------------------------------------------------------------------
306 ! 2. Get the cell info
307 !-----------------------------------------------------------------------------
308 topology%cell => small_cell
309 CALL cell_retain(small_cell)
310 CALL write_cell(small_cell, subsys_section, tag="CELL")
311 CALL write_cell(small_cell, subsys_section, tag="CELL_REF")
312
313 !-----------------------------------------------------------------------------
314 !-----------------------------------------------------------------------------
315 ! 3. Initialize atom coords from the bigger system
316 !-----------------------------------------------------------------------------
317 nat = SIZE(sub_atom_index)
318 topology%natoms = nat
319 cpassert(.NOT. ASSOCIATED(topology%atom_info%r))
320 cpassert(.NOT. ASSOCIATED(topology%atom_info%id_atmname))
321 cpassert(.NOT. ASSOCIATED(topology%atom_info%id_molname))
322 cpassert(.NOT. ASSOCIATED(topology%atom_info%id_resname))
323 cpassert(.NOT. ASSOCIATED(topology%atom_info%atm_mass))
324 cpassert(.NOT. ASSOCIATED(topology%atom_info%atm_charge))
325 ALLOCATE (topology%atom_info%r(3, nat), topology%atom_info%id_atmname(nat), &
326 topology%atom_info%id_molname(nat), topology%atom_info%id_resname(nat), &
327 topology%atom_info%id_element(nat), topology%atom_info%atm_mass(nat), &
328 topology%atom_info%atm_charge(nat))
329
330 CALL cp_subsys_get(big_subsys, particles=particles)
331 DO iat = 1, nat
332 topology%atom_info%r(:, iat) = particles%els(sub_atom_index(iat))%r
333 topology%atom_info%id_atmname(iat) = str2id(s2s(sub_atom_kind_name(iat)))
334 topology%atom_info%id_molname(iat) = topology%atom_info%id_atmname(iat)
335 topology%atom_info%id_resname(iat) = topology%atom_info%id_atmname(iat)
336 !
337 ! Defining element
338 !
339 id_ = index(id2str(topology%atom_info%id_atmname(iat)), "_") - 1
340 IF (id_ == -1) id_ = len_trim(id2str(topology%atom_info%id_atmname(iat)))
341 strtmp1 = id2str(topology%atom_info%id_atmname(iat))
342 strtmp1 = strtmp1(1:id_)
343 CALL check_subsys_element(strtmp1, strtmp1, my_element, &
344 subsys_section, use_mm_map_first=.false.)
345 topology%atom_info%id_element(iat) = str2id(s2s(my_element))
346 topology%atom_info%atm_mass(iat) = 0._dp
347 topology%atom_info%atm_charge(iat) = 0._dp
348 END DO
349 topology%conn_type = do_conn_off
350
351 !-----------------------------------------------------------------------------
352 !-----------------------------------------------------------------------------
353 ! 4. Read in or generate the molecular connectivity
354 !-----------------------------------------------------------------------------
355 CALL connectivity_control(topology, para_env, subsys_section=subsys_section, &
356 force_env_section=force_env_section)
357
358 !-----------------------------------------------------------------------------
359 !-----------------------------------------------------------------------------
360 ! 5. Pack everything into the molecular types
361 !-----------------------------------------------------------------------------
362 CALL topology_connectivity_pack(molecule_kind_set, molecule_set, &
363 topology, subsys_section=subsys_section)
364
365 !-----------------------------------------------------------------------------
366 !-----------------------------------------------------------------------------
367 ! 6. Pack everything into the atomic types
368 !-----------------------------------------------------------------------------
369 CALL topology_coordinate_pack(particle_set, atomic_kind_set, &
370 molecule_kind_set, molecule_set, topology, subsys_section=subsys_section, &
371 force_env_section=force_env_section, ignore_outside_box=ignore_outside_box)
372
373 !-----------------------------------------------------------------------------
374 !-----------------------------------------------------------------------------
375 ! 7. Cleanup the topology structure type
376 !-----------------------------------------------------------------------------
378
379 !-----------------------------------------------------------------------------
380 !-----------------------------------------------------------------------------
381 ! 8. Allocate new subsys
382 !-----------------------------------------------------------------------------
383 ALLOCATE (small_subsys)
384 CALL para_env%retain()
385 small_subsys%para_env => para_env
386 CALL particle_list_create(particles, els_ptr=particle_set)
387 CALL atomic_kind_list_create(atomic_kinds, els_ptr=atomic_kind_set)
388 CALL molecule_list_create(mols, els_ptr=molecule_set)
389 CALL molecule_kind_list_create(mol_kinds, els_ptr=molecule_kind_set)
390 CALL cp_subsys_set(small_subsys, particles=particles, atomic_kinds=atomic_kinds, &
391 molecules=mols, molecule_kinds=mol_kinds, cell=small_cell, &
392 cell_ref=small_cell, use_ref_cell=.false.)
393 CALL particle_list_release(particles)
394 CALL atomic_kind_list_release(atomic_kinds)
395 CALL molecule_list_release(mols)
396 CALL molecule_kind_list_release(mol_kinds)
397
398 ALLOCATE (small_subsys%virial)
399 CALL atprop_create(small_subsys%atprop)
400 CALL cp_result_create(small_subsys%results)
401 END SUBROUTINE create_small_subsys
402
403END 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:651
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, cell)
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:319
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:134
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