(git:0de0cc2)
fist_environment.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 fist environment
10 !> \author CJM
11 ! **************************************************************************************************
13  USE atomic_kind_types, ONLY: atomic_kind_type,&
15  USE bibliography, ONLY: devynck2012,&
16  dick1958,&
17  mitchell1993,&
18  cite_reference
19  USE cell_methods, ONLY: read_cell,&
21  USE cell_types, ONLY: cell_release,&
22  cell_type,&
23  get_cell
25  cp_logger_type
29  USE cp_subsys_types, ONLY: cp_subsys_set,&
30  cp_subsys_type
31  USE cp_symmetry, ONLY: write_symmetry
33  distribution_1d_type
38  ewald_environment_type,&
41  USE ewald_pw_types, ONLY: ewald_pw_create,&
42  ewald_pw_type
43  USE exclusion_types, ONLY: exclusion_type
47  fist_energy_type
49  fist_env_set,&
50  fist_environment_type
51  USE fist_nonbond_env_types, ONLY: fist_nonbond_env_type
53  USE header, ONLY: fist_header
55  section_vals_type
56  USE kinds, ONLY: dp
57  USE message_passing, ONLY: mp_para_env_type
58  USE molecule_kind_types, ONLY: molecule_kind_type,&
60  USE molecule_types, ONLY: molecule_type
62  multipole_type
65  particle_list_type
69  USE particle_types, ONLY: particle_type
70  USE qmmm_types_low, ONLY: qmmm_env_mm_type
71 #include "./base/base_uses.f90"
72 
73  IMPLICIT NONE
74 
75  PRIVATE
76 
77  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_environment'
78  PUBLIC :: fist_init
79 
80 CONTAINS
81 ! **************************************************************************************************
82 !> \brief reads the input and database file for fist
83 !> \param fist_env ...
84 !> \param root_section ...
85 !> \param para_env ...
86 !> \param force_env_section ...
87 !> \param subsys_section ...
88 !> \param use_motion_section ...
89 !> \param prev_subsys ...
90 !> \par Used By
91 !> fist_main
92 ! **************************************************************************************************
93  SUBROUTINE fist_init(fist_env, root_section, para_env, force_env_section, &
94  subsys_section, use_motion_section, prev_subsys)
95 
96  TYPE(fist_environment_type), POINTER :: fist_env
97  TYPE(section_vals_type), POINTER :: root_section
98  TYPE(mp_para_env_type), POINTER :: para_env
99  TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
100  LOGICAL, INTENT(IN) :: use_motion_section
101  TYPE(cp_subsys_type), OPTIONAL, POINTER :: prev_subsys
102 
103  CHARACTER(len=*), PARAMETER :: routinen = 'fist_init'
104 
105  INTEGER :: handle, iw
106  LOGICAL :: qmmm, shell_adiabatic, shell_present
107  REAL(kind=dp), DIMENSION(3) :: abc
108  TYPE(cell_type), POINTER :: cell, cell_ref
109  TYPE(cp_logger_type), POINTER :: logger
110  TYPE(cp_subsys_type), POINTER :: subsys
111  TYPE(ewald_environment_type), POINTER :: ewald_env
112  TYPE(exclusion_type), DIMENSION(:), POINTER :: exclusions
113  TYPE(fist_efield_type), POINTER :: efield
114  TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
115  TYPE(particle_list_type), POINTER :: core_particles, shell_particles
116  TYPE(particle_type), DIMENSION(:), POINTER :: core_particle_set, shell_particle_set
117  TYPE(qmmm_env_mm_type), POINTER :: qmmm_env
118  TYPE(section_vals_type), POINTER :: cell_section, ewald_section, mm_section, &
119  poisson_section
120 
121  CALL timeset(routinen, handle)
122  logger => cp_get_default_logger()
123 
124  NULLIFY (subsys, cell, cell_ref)
125  NULLIFY (ewald_env, fist_nonbond_env, qmmm_env, cell_section, &
126  poisson_section, shell_particle_set, shell_particles, &
127  core_particle_set, core_particles, exclusions)
128  IF (.NOT. ASSOCIATED(subsys_section)) THEN
129  subsys_section => section_vals_get_subs_vals(force_env_section, "SUBSYS")
130  END IF
131  mm_section => section_vals_get_subs_vals(force_env_section, "MM")
132  cell_section => section_vals_get_subs_vals(subsys_section, "CELL")
133  poisson_section => section_vals_get_subs_vals(mm_section, "POISSON")
134  ewald_section => section_vals_get_subs_vals(poisson_section, "EWALD")
135 
136  CALL fist_env_set(fist_env, input=force_env_section)
137 
138  iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%PROGRAM_BANNER", &
139  extension=".mmLog")
140  CALL fist_header(iw)
141  CALL cp_print_key_finished_output(iw, logger, mm_section, "PRINT%PROGRAM_BANNER")
142 
143  CALL read_cell(cell, cell_ref, cell_section=cell_section, para_env=para_env)
144  CALL get_cell(cell, abc=abc)
145 
146  ! Print the cell parameters
147  CALL write_cell(cell, subsys_section)
148  CALL write_cell(cell_ref, subsys_section)
149 
150  ! Create the ewald environment
151  ALLOCATE (ewald_env)
152  CALL ewald_env_create(ewald_env, para_env)
153 
154  ! Read the input section and set the ewald_env
155  CALL read_ewald_section(ewald_env, ewald_section)
156  CALL ewald_env_set(ewald_env, poisson_section=poisson_section)
157 
158  ! Read the efield section
159  NULLIFY (efield)
160  CALL read_efield_section(mm_section, efield)
161  CALL fist_env_set(fist_env, efield=efield)
162 
163  ! Topology
164  CALL fist_env_get(fist_env, qmmm=qmmm, qmmm_env=qmmm_env)
165  CALL cp_subsys_create(subsys, para_env=para_env, root_section=root_section, &
166  force_env_section=force_env_section, subsys_section=subsys_section, &
167  qmmm=qmmm, qmmm_env=qmmm_env, exclusions=exclusions, &
168  use_motion_section=use_motion_section)
169  CALL fist_env_set(fist_env, subsys=subsys, exclusions=exclusions)
170 
171  CALL force_field_control(subsys%atomic_kinds%els, subsys%particles%els, &
172  subsys%molecule_kinds%els, subsys%molecules%els, &
173  ewald_env, fist_nonbond_env, root_section, para_env, qmmm=qmmm, &
174  qmmm_env=qmmm_env, subsys_section=subsys_section, &
175  mm_section=mm_section, shell_particle_set=shell_particle_set, &
176  core_particle_set=core_particle_set, cell=cell)
177 
178  NULLIFY (shell_particles, core_particles)
179  IF (ASSOCIATED(shell_particle_set)) THEN
180  CALL cite_reference(devynck2012)
181  CALL cite_reference(mitchell1993)
182  CALL cite_reference(dick1958)
183  CALL particle_list_create(shell_particles, els_ptr=shell_particle_set)
184  END IF
185  IF (ASSOCIATED(core_particle_set)) THEN
186  CALL particle_list_create(core_particles, els_ptr=core_particle_set)
187  END IF
188  CALL get_atomic_kind_set(atomic_kind_set=subsys%atomic_kinds%els, &
189  shell_present=shell_present, shell_adiabatic=shell_adiabatic)
190  CALL fist_env_set(fist_env, shell_model=shell_present, &
191  shell_model_ad=shell_adiabatic)
192  CALL cp_subsys_set(subsys, shell_particles=shell_particles, &
193  core_particles=core_particles)
194  CALL particle_list_release(shell_particles)
195  CALL particle_list_release(core_particles)
196 
197  CALL fist_init_subsys(fist_env, subsys, cell, cell_ref, fist_nonbond_env, ewald_env, &
198  force_env_section, subsys_section, prev_subsys)
199 
200  CALL cell_release(cell)
201  CALL cell_release(cell_ref)
202 
203  CALL timestop(handle)
204 
205  END SUBROUTINE fist_init
206 
207 ! **************************************************************************************************
208 !> \brief Read the input and the database files for the setup of the
209 !> FIST environment.
210 !> \param fist_env ...
211 !> \param subsys ...
212 !> \param cell ...
213 !> \param cell_ref ...
214 !> \param fist_nonbond_env ...
215 !> \param ewald_env ...
216 !> \param force_env_section ...
217 !> \param subsys_section ...
218 !> \param prev_subsys ...
219 !> \date 22.05.2000
220 !> \author MK
221 !> \version 1.0
222 ! **************************************************************************************************
223  SUBROUTINE fist_init_subsys(fist_env, subsys, cell, cell_ref, fist_nonbond_env, &
224  ewald_env, force_env_section, subsys_section, &
225  prev_subsys)
226 
227  TYPE(fist_environment_type), POINTER :: fist_env
228  TYPE(cp_subsys_type), POINTER :: subsys
229  TYPE(cell_type), POINTER :: cell, cell_ref
230  TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
231  TYPE(ewald_environment_type), POINTER :: ewald_env
232  TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
233  TYPE(cp_subsys_type), OPTIONAL, POINTER :: prev_subsys
234 
235  CHARACTER(len=*), PARAMETER :: routinen = 'fist_init_subsys'
236 
237  INTEGER :: handle, max_multipole
238  LOGICAL :: do_multipoles
239  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
240  TYPE(distribution_1d_type), POINTER :: local_molecules, local_particles, &
241  prev_local_molecules
242  TYPE(ewald_pw_type), POINTER :: ewald_pw
243  TYPE(fist_energy_type), POINTER :: thermo
244  TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set, prev_molecule_kind_set
245  TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
246  TYPE(multipole_type), POINTER :: multipoles
247  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
248  TYPE(section_vals_type), POINTER :: grid_print_section
249 
250  CALL timeset(routinen, handle)
251  NULLIFY (thermo, ewald_pw, local_molecules, local_particles, multipoles)
252  particle_set => subsys%particles%els
253  atomic_kind_set => subsys%atomic_kinds%els
254  molecule_set => subsys%molecules%els
255  molecule_kind_set => subsys%molecule_kinds%els
256 
257  IF (PRESENT(prev_subsys)) THEN
258  prev_molecule_kind_set => prev_subsys%molecule_kinds%els
259  prev_local_molecules => prev_subsys%local_molecules
260  ELSE
261  NULLIFY (prev_molecule_kind_set)
262  NULLIFY (prev_local_molecules)
263  END IF
264 
265  ! Create the fist_energy_type
266  CALL allocate_fist_energy(thermo)
267 
268  ! Print the molecule kind set
269  CALL write_molecule_kind_set(molecule_kind_set, subsys_section)
270 
271  ! Print the atomic coordinates
272  CALL write_fist_particle_coordinates(particle_set, subsys_section, &
273  fist_nonbond_env%charges)
274  CALL write_particle_distances(particle_set, cell, subsys_section)
275  CALL write_structure_data(particle_set, cell=cell, input_section=subsys_section)
276 
277  ! Print symmetry information
278  CALL write_symmetry(particle_set, cell, subsys_section)
279 
280  ! Distribute molecules and atoms using the new data structures ***
281  CALL distribute_molecules_1d(atomic_kind_set=atomic_kind_set, &
282  particle_set=particle_set, &
283  local_particles=local_particles, &
284  molecule_kind_set=molecule_kind_set, &
285  molecule_set=molecule_set, &
286  local_molecules=local_molecules, &
287  prev_molecule_kind_set=prev_molecule_kind_set, &
288  prev_local_molecules=prev_local_molecules, &
289  force_env_section=force_env_section)
290 
291  ! Create ewald grids
292  grid_print_section => section_vals_get_subs_vals(force_env_section, &
293  "PRINT%GRID_INFORMATION")
294  ALLOCATE (ewald_pw)
295  CALL ewald_pw_create(ewald_pw, ewald_env, cell, cell_ref, grid_print_section)
296 
297  ! Initialize ewald grids
298  CALL ewald_pw_grid_update(ewald_pw, ewald_env, cell%hmat)
299 
300  ! Possibly Initialize the multipole environment
301  CALL ewald_env_get(ewald_env, do_multipoles=do_multipoles, &
302  max_multipole=max_multipole)
303  IF (do_multipoles) THEN
304  ALLOCATE (multipoles)
305  CALL create_multipole_type(multipoles, particle_set, subsys_section, max_multipole)
306  END IF
307  CALL cp_subsys_set(subsys, multipoles=multipoles, cell=cell)
308 
309  ! Set the fist_env
310  CALL fist_env_set(fist_env=fist_env, &
311  cell_ref=cell_ref, &
312  local_molecules=local_molecules, &
313  local_particles=local_particles, &
314  ewald_env=ewald_env, ewald_pw=ewald_pw, &
315  fist_nonbond_env=fist_nonbond_env, &
316  thermo=thermo)
317 
318  CALL distribution_1d_release(local_particles)
319  CALL distribution_1d_release(local_molecules)
320  CALL timestop(handle)
321 
322  END SUBROUTINE fist_init_subsys
323 END MODULE fist_environment
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
collects all references to literature in CP2K as new algorithms / method are included from literature...
Definition: bibliography.F:28
integer, save, public dick1958
Definition: bibliography.F:43
integer, save, public devynck2012
Definition: bibliography.F:43
integer, save, public mitchell1993
Definition: bibliography.F:43
Handles all functions related to the CELL.
Definition: cell_methods.F:15
recursive subroutine, public read_cell(cell, cell_ref, use_ref_cell, cell_section, check_for_ref, para_env)
...
Definition: cell_methods.F:272
subroutine, public write_cell(cell, subsys_section, tag)
Write the cell parameters to the output unit.
Definition: cell_methods.F:731
Handles all functions related to the CELL.
Definition: cell_types.F:15
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Definition: cell_types.F:559
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
Definition: cell_types.F:195
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
Initialize a small environment for a particular calculation.
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
Work with symmetry.
Definition: cp_symmetry.F:13
subroutine, public write_symmetry(particle_set, cell, input_section)
Write symmetry information to output.
Definition: cp_symmetry.F:61
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
subroutine, public distribution_1d_release(distribution_1d)
releases the given distribution_1d
Distribution methods for atoms, particles, or molecules.
subroutine, public distribute_molecules_1d(atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, force_env_section, prev_molecule_kind_set, prev_local_molecules)
Distribute molecules and particles.
subroutine, public ewald_env_set(ewald_env, ewald_type, alpha, epsilon, eps_pol, gmax, ns_max, precs, o_spline, para_env, poisson_section, interaction_cutoffs, cell_hmat)
Purpose: Set the EWALD environment.
subroutine, public ewald_env_create(ewald_env, para_env)
allocates and intitializes a ewald_env
subroutine, public read_ewald_section(ewald_env, ewald_section)
Purpose: read the EWALD section.
subroutine, public ewald_env_get(ewald_env, ewald_type, alpha, eps_pol, epsilon, gmax, ns_max, o_spline, group, para_env, poisson_section, precs, rcut, do_multipoles, max_multipole, do_ipol, max_ipol_iter, interaction_cutoffs, cell_hmat)
Purpose: Get the EWALD environment.
subroutine, public ewald_pw_grid_update(ewald_pw, ewald_env, cell_hmat)
Rescales pw_grids for given box, if necessary.
subroutine, public ewald_pw_create(ewald_pw, ewald_env, cell, cell_ref, print_section)
creates the structure ewald_pw_type
an exclusion type
subroutine, public read_efield_section(input_section, efield)
Read input section PERIODIC_EFIELD.
subroutine, public allocate_fist_energy(fist_energy)
Allocate and/or initialise a Fist energy data structure.
subroutine, public fist_env_get(fist_env, atomic_kind_set, particle_set, ewald_pw, local_particles, local_molecules, molecule_kind_set, molecule_set, cell, cell_ref, ewald_env, fist_nonbond_env, thermo, para_env, subsys, qmmm, qmmm_env, input, shell_model, shell_model_ad, shell_particle_set, core_particle_set, multipoles, results, exclusions, efield)
Purpose: Get the FIST environment.
subroutine, public fist_env_set(fist_env, atomic_kind_set, particle_set, ewald_pw, local_particles, local_molecules, molecule_kind_set, molecule_set, cell_ref, ewald_env, fist_nonbond_env, thermo, subsys, qmmm, qmmm_env, input, shell_model, shell_model_ad, exclusions, efield)
Set the FIST environment.
initialize fist environment
subroutine, public fist_init(fist_env, root_section, para_env, force_env_section, subsys_section, use_motion_section, prev_subsys)
reads the input and database file for fist
subroutine, public force_field_control(atomic_kind_set, particle_set, molecule_kind_set, molecule_set, ewald_env, fist_nonbond_env, root_section, para_env, qmmm, qmmm_env, subsys_section, mm_section, shell_particle_set, core_particle_set, cell)
If reading in from external file, make sure its there first
Definition: force_fields.F:90
Definition: header.F:13
subroutine, public fist_header(iw)
...
Definition: header.F:164
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
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Interface to the message passing library MPI.
Define the molecule kind structure types and the corresponding functionality.
subroutine, public write_molecule_kind_set(molecule_kind_set, subsys_section)
Write a moleculeatomic kind set data set to the output unit.
Define the data structure for the molecule information.
Multipole structure: for multipole (fixed and induced) in FF based MD.
subroutine, public create_multipole_type(multipoles, particle_set, subsys_section, max_multipole)
Create a multipole type.
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 methods related to particle_type.
subroutine, public write_fist_particle_coordinates(particle_set, subsys_section, charges)
Write the atomic coordinates to the output unit.
subroutine, public write_structure_data(particle_set, cell, input_section)
Write structure data requested by a separate structure data input section to the output unit....
subroutine, public write_particle_distances(particle_set, cell, subsys_section)
Write the matrix of the particle distances to the output unit.
Define the data structure for the particle information.