(git:85b8a9b)
Loading...
Searching...
No Matches
fist_environment.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 fist environment
10!> \author CJM
11! **************************************************************************************************
15 USE bibliography, ONLY: devynck2012,&
16 dick1958,&
18 cite_reference
19 USE cell_types, ONLY: cell_type
49 USE header, ONLY: fist_header
66#include "./base/base_uses.f90"
67
68 IMPLICIT NONE
69
70 PRIVATE
71
72 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_environment'
73 PUBLIC :: fist_init
74
75CONTAINS
76! **************************************************************************************************
77!> \brief reads the input and database file for fist
78!> \param fist_env ...
79!> \param root_section ...
80!> \param para_env ...
81!> \param force_env_section ...
82!> \param subsys_section ...
83!> \param use_motion_section ...
84!> \param prev_subsys ...
85!> \par Used By
86!> fist_main
87! **************************************************************************************************
88 SUBROUTINE fist_init(fist_env, root_section, para_env, force_env_section, &
89 subsys_section, use_motion_section, prev_subsys)
90
91 TYPE(fist_environment_type), POINTER :: fist_env
92 TYPE(section_vals_type), POINTER :: root_section
93 TYPE(mp_para_env_type), POINTER :: para_env
94 TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
95 LOGICAL, INTENT(IN) :: use_motion_section
96 TYPE(cp_subsys_type), OPTIONAL, POINTER :: prev_subsys
97
98 CHARACTER(len=*), PARAMETER :: routinen = 'fist_init'
99
100 INTEGER :: handle, iw
101 LOGICAL :: qmmm, shell_adiabatic, shell_present
102 TYPE(cp_logger_type), POINTER :: logger
103 TYPE(cp_subsys_type), POINTER :: subsys
104 TYPE(ewald_environment_type), POINTER :: ewald_env
105 TYPE(exclusion_type), DIMENSION(:), POINTER :: exclusions
106 TYPE(fist_efield_type), POINTER :: efield
107 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
108 TYPE(particle_list_type), POINTER :: core_particles, shell_particles
109 TYPE(particle_type), DIMENSION(:), POINTER :: core_particle_set, shell_particle_set
110 TYPE(qmmm_env_mm_type), POINTER :: qmmm_env
111 TYPE(section_vals_type), POINTER :: ewald_section, mm_section, &
112 poisson_section
113
114 CALL timeset(routinen, handle)
115 logger => cp_get_default_logger()
116
117 NULLIFY (ewald_env, fist_nonbond_env, qmmm_env, subsys, &
118 poisson_section, shell_particle_set, shell_particles, &
119 core_particle_set, core_particles, exclusions)
120 IF (.NOT. ASSOCIATED(subsys_section)) THEN
121 subsys_section => section_vals_get_subs_vals(force_env_section, "SUBSYS")
122 END IF
123 mm_section => section_vals_get_subs_vals(force_env_section, "MM")
124 poisson_section => section_vals_get_subs_vals(mm_section, "POISSON")
125 ewald_section => section_vals_get_subs_vals(poisson_section, "EWALD")
126
127 CALL fist_env_set(fist_env, input=force_env_section)
128
129 iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%PROGRAM_BANNER", &
130 extension=".mmLog")
131 CALL fist_header(iw)
132 CALL cp_print_key_finished_output(iw, logger, mm_section, "PRINT%PROGRAM_BANNER")
133
134 ! Create the ewald environment
135 ALLOCATE (ewald_env)
136 CALL ewald_env_create(ewald_env, para_env)
137
138 ! Read the input section and set the ewald_env
139 CALL read_ewald_section(ewald_env, ewald_section)
140 CALL ewald_env_set(ewald_env, poisson_section=poisson_section)
141
142 ! Topology
143 CALL fist_env_get(fist_env, qmmm=qmmm, qmmm_env=qmmm_env)
144 CALL cp_subsys_create(subsys, para_env=para_env, root_section=root_section, &
145 force_env_section=force_env_section, subsys_section=subsys_section, &
146 qmmm=qmmm, qmmm_env=qmmm_env, exclusions=exclusions, &
147 use_motion_section=use_motion_section)
148 ! Read the efield section after the cell has been canonicalized.
149 NULLIFY (efield)
150 CALL read_efield_section(mm_section, efield, subsys%cell)
151 CALL fist_env_set(fist_env, efield=efield)
152 CALL fist_env_set(fist_env, subsys=subsys, exclusions=exclusions)
153
154 CALL force_field_control(subsys%atomic_kinds%els, subsys%particles%els, &
155 subsys%molecule_kinds%els, subsys%molecules%els, &
156 ewald_env, fist_nonbond_env, root_section, para_env, qmmm=qmmm, &
157 qmmm_env=qmmm_env, subsys_section=subsys_section, &
158 mm_section=mm_section, shell_particle_set=shell_particle_set, &
159 core_particle_set=core_particle_set, cell=subsys%cell)
160
161 NULLIFY (shell_particles, core_particles)
162 IF (ASSOCIATED(shell_particle_set)) THEN
163 CALL cite_reference(devynck2012)
164 CALL cite_reference(mitchell1993)
165 CALL cite_reference(dick1958)
166 CALL particle_list_create(shell_particles, els_ptr=shell_particle_set)
167 END IF
168 IF (ASSOCIATED(core_particle_set)) THEN
169 CALL particle_list_create(core_particles, els_ptr=core_particle_set)
170 END IF
171 CALL get_atomic_kind_set(atomic_kind_set=subsys%atomic_kinds%els, &
172 shell_present=shell_present, shell_adiabatic=shell_adiabatic)
173 CALL fist_env_set(fist_env, shell_model=shell_present, &
174 shell_model_ad=shell_adiabatic)
175 CALL cp_subsys_set(subsys, shell_particles=shell_particles, &
176 core_particles=core_particles)
177 CALL particle_list_release(shell_particles)
178 CALL particle_list_release(core_particles)
179
180 CALL fist_init_subsys(fist_env, subsys, fist_nonbond_env, ewald_env, &
181 force_env_section, subsys_section, prev_subsys)
182
183 CALL timestop(handle)
184
185 END SUBROUTINE fist_init
186
187! **************************************************************************************************
188!> \brief Read the input and the database files for the setup of the
189!> FIST environment.
190!> \param fist_env ...
191!> \param subsys ...
192!> \param fist_nonbond_env ...
193!> \param ewald_env ...
194!> \param force_env_section ...
195!> \param subsys_section ...
196!> \param prev_subsys ...
197!> \date 22.05.2000
198!> \author MK
199!> \version 1.0
200! **************************************************************************************************
201 SUBROUTINE fist_init_subsys(fist_env, subsys, fist_nonbond_env, &
202 ewald_env, force_env_section, subsys_section, &
203 prev_subsys)
204
205 TYPE(fist_environment_type), POINTER :: fist_env
206 TYPE(cp_subsys_type), POINTER :: subsys
207 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
208 TYPE(ewald_environment_type), POINTER :: ewald_env
209 TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
210 TYPE(cp_subsys_type), OPTIONAL, POINTER :: prev_subsys
211
212 CHARACTER(len=*), PARAMETER :: routinen = 'fist_init_subsys'
213
214 INTEGER :: handle, max_multipole
215 LOGICAL :: do_multipoles
216 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
217 TYPE(cell_type), POINTER :: my_cell, my_cell_ref
218 TYPE(distribution_1d_type), POINTER :: local_molecules, local_particles, &
219 prev_local_molecules
220 TYPE(ewald_pw_type), POINTER :: ewald_pw
221 TYPE(fist_energy_type), POINTER :: thermo
222 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set, prev_molecule_kind_set
223 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
224 TYPE(multipole_type), POINTER :: multipoles
225 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
226 TYPE(section_vals_type), POINTER :: grid_print_section
227
228 CALL timeset(routinen, handle)
229 NULLIFY (thermo, ewald_pw, local_molecules, local_particles, &
230 multipoles, my_cell, my_cell_ref)
231 particle_set => subsys%particles%els
232 atomic_kind_set => subsys%atomic_kinds%els
233 molecule_set => subsys%molecules%els
234 molecule_kind_set => subsys%molecule_kinds%els
235 my_cell => subsys%cell
236 my_cell_ref => subsys%cell_ref
237
238 IF (PRESENT(prev_subsys)) THEN
239 prev_molecule_kind_set => prev_subsys%molecule_kinds%els
240 prev_local_molecules => prev_subsys%local_molecules
241 ELSE
242 NULLIFY (prev_molecule_kind_set)
243 NULLIFY (prev_local_molecules)
244 END IF
245
246 ! Create the fist_energy_type
247 CALL allocate_fist_energy(thermo)
248
249 ! Print the molecule kind set
250 CALL write_molecule_kind_set(molecule_kind_set, subsys_section)
251
252 ! Print the atomic coordinates
253 CALL write_fist_particle_coordinates(particle_set, subsys_section, &
254 fist_nonbond_env%charges)
255 CALL write_particle_distances(particle_set, my_cell, subsys_section)
256 CALL write_structure_data(particle_set, cell=my_cell, input_section=subsys_section)
257
258 ! Print symmetry information
259 CALL write_symmetry(particle_set, my_cell, subsys_section)
260
261 ! Distribute molecules and atoms using the new data structures ***
262 CALL distribute_molecules_1d(atomic_kind_set=atomic_kind_set, &
263 particle_set=particle_set, &
264 local_particles=local_particles, &
265 molecule_kind_set=molecule_kind_set, &
266 molecule_set=molecule_set, &
267 local_molecules=local_molecules, &
268 prev_molecule_kind_set=prev_molecule_kind_set, &
269 prev_local_molecules=prev_local_molecules, &
270 force_env_section=force_env_section)
271
272 ! Create ewald grids
273 grid_print_section => section_vals_get_subs_vals(force_env_section, &
274 "PRINT%GRID_INFORMATION")
275 ALLOCATE (ewald_pw)
276 CALL ewald_pw_create(ewald_pw, ewald_env, my_cell, my_cell_ref, grid_print_section)
277
278 ! Initialize ewald grids
279 CALL ewald_pw_grid_update(ewald_pw, ewald_env, my_cell%hmat)
280
281 ! Possibly Initialize the multipole environment
282 CALL ewald_env_get(ewald_env, do_multipoles=do_multipoles, &
283 max_multipole=max_multipole)
284 IF (do_multipoles) THEN
285 ALLOCATE (multipoles)
286 CALL create_multipole_type(multipoles, particle_set, subsys_section, max_multipole)
287 END IF
288 CALL cp_subsys_set(subsys, multipoles=multipoles)
289
290 ! Set the fist_env
291 CALL fist_env_set(fist_env=fist_env, &
292 cell_ref=my_cell_ref, &
293 local_molecules=local_molecules, &
294 local_particles=local_particles, &
295 ewald_env=ewald_env, ewald_pw=ewald_pw, &
296 fist_nonbond_env=fist_nonbond_env, &
297 thermo=thermo)
298
299 CALL distribution_1d_release(local_particles)
300 CALL distribution_1d_release(local_molecules)
301 CALL timestop(handle)
302
303 END SUBROUTINE fist_init_subsys
304END 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...
integer, save, public dick1958
integer, save, public devynck2012
integer, save, public mitchell1993
Handles all functions related to the CELL.
Definition cell_types.F:15
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, cell_ref, use_ref_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, cell)
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
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
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.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
structure to store local (to a processor) ordered lists of integers.
A type used to store lists of exclusions and onfos.
stores all the informations relevant to an mpi environment