(git:374b731)
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-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! **************************************************************************************************
15 USE bibliography, ONLY: devynck2012,&
16 dick1958,&
18 cite_reference
19 USE cell_methods, ONLY: read_cell,&
21 USE cell_types, ONLY: cell_release,&
22 cell_type,&
53 USE header, ONLY: fist_header
56 USE kinds, ONLY: dp
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
80CONTAINS
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
323END 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.
recursive subroutine, public read_cell(cell, cell_ref, use_ref_cell, cell_section, check_for_ref, para_env)
...
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_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
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.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
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