(git:0446f17)
Loading...
Searching...
No Matches
qs_subsys_methods.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Routines that work on qs_subsys_type
10!> \author Ole Schuett
11! **************************************************************************************************
13 USE atom_types, ONLY: lmat
18 USE cell_methods, ONLY: cell_create,&
19 read_cell,&
21 USE cell_types, ONLY: cell_clone,&
35 USE kinds, ONLY: dp
48#include "./base/base_uses.f90"
49
50 IMPLICIT NONE
51 PRIVATE
52
53 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_subsys_methods'
54
55 PUBLIC :: qs_subsys_create
56
57CONTAINS
58
59! **************************************************************************************************
60!> \brief Creates a qs_subsys. Optionally an existsing cp_subsys is used.
61!> \param subsys ...
62!> \param para_env ...
63!> \param root_section ...
64!> \param force_env_section ...
65!> \param subsys_section ...
66!> \param use_motion_section ...
67!> \param cp_subsys ...
68!> \param cell ...
69!> \param cell_ref ...
70!> \param elkind ...
71!> \param silent ...
72! **************************************************************************************************
73 SUBROUTINE qs_subsys_create(subsys, para_env, root_section, force_env_section, subsys_section, &
74 use_motion_section, cp_subsys, cell, cell_ref, elkind, silent)
75 TYPE(qs_subsys_type), INTENT(OUT) :: subsys
76 TYPE(mp_para_env_type), POINTER :: para_env
77 TYPE(section_vals_type), OPTIONAL, POINTER :: root_section
78 TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
79 LOGICAL, INTENT(IN) :: use_motion_section
80 TYPE(cp_subsys_type), OPTIONAL, POINTER :: cp_subsys
81 TYPE(cell_type), OPTIONAL, POINTER :: cell, cell_ref
82 LOGICAL, INTENT(IN), OPTIONAL :: elkind, silent
83
84 LOGICAL :: be_silent, use_ref_cell
85 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
86 TYPE(cell_type), POINTER :: my_cell, my_cell_ref
87 TYPE(cp_subsys_type), POINTER :: my_cp_subsys
88 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
89 TYPE(section_vals_type), POINTER :: cell_section, kind_section
90
91 NULLIFY (atomic_kind_set, qs_kind_set, cell_section, kind_section, my_cell, my_cell_ref, my_cp_subsys)
92
93 be_silent = .false.
94 IF (PRESENT(silent)) be_silent = silent
95 ! create cp_subsys
96 IF (PRESENT(cp_subsys)) THEN
97 my_cp_subsys => cp_subsys
98 ELSE IF (PRESENT(root_section)) THEN
99 CALL cp_subsys_create(my_cp_subsys, para_env, root_section=root_section, &
100 force_env_section=force_env_section, &
101 subsys_section=subsys_section, &
102 use_motion_section=use_motion_section, &
103 elkind=elkind)
104 ELSE
105 cpabort("qs_subsys_create: cp_subsys or root_section needed")
106 END IF
107
108 ! create cp_subsys%cell
109 !TODO: moved to cp_subsys_create(), needs further disentanglement of cell_ref.
110 use_ref_cell = .false.
111 IF (PRESENT(cell)) THEN
112 my_cell => cell
113 IF (PRESENT(cell_ref)) THEN
114 my_cell_ref => cell_ref
115 use_ref_cell = .true.
116 ELSE
117 CALL cell_create(my_cell_ref)
118 CALL cell_clone(my_cell, my_cell_ref, tag="CELL_REF")
119 END IF
120 ELSE
121 cell_section => section_vals_get_subs_vals(subsys_section, "CELL")
122 CALL read_cell(my_cell, my_cell_ref, use_ref_cell=use_ref_cell, &
123 cell_section=cell_section, para_env=para_env)
124 END IF
125 CALL cp_subsys_set(my_cp_subsys, cell=my_cell)
126 CALL write_cell(my_cell, subsys_section)
127 CALL write_cell(my_cell_ref, subsys_section)
128
129 ! setup qs_kinds
130 CALL cp_subsys_get(my_cp_subsys, atomic_kind_set=atomic_kind_set)
131 kind_section => section_vals_get_subs_vals(subsys_section, "KIND")
132 CALL create_qs_kind_set(qs_kind_set, atomic_kind_set, kind_section, &
133 para_env, force_env_section, be_silent)
134
135 CALL num_ao_el_per_molecule(my_cp_subsys%molecule_kinds%els, &
136 qs_kind_set)
137
138 CALL qs_subsys_set(subsys, &
139 cp_subsys=my_cp_subsys, &
140 cell_ref=my_cell_ref, &
141 use_ref_cell=use_ref_cell, &
142 qs_kind_set=qs_kind_set)
143
144 IF (.NOT. PRESENT(cell)) CALL cell_release(my_cell)
145 IF (.NOT. PRESENT(cell_ref)) CALL cell_release(my_cell_ref)
146 IF (.NOT. PRESENT(cp_subsys)) CALL cp_subsys_release(my_cp_subsys)
147
148 END SUBROUTINE qs_subsys_create
149
150! **************************************************************************************************
151!> \brief Read a molecule kind data set from the input file.
152!> \param molecule_kind_set ...
153!> \param qs_kind_set ...
154!> \date 22.11.2004
155!> \par History
156!> Rustam Z. Khaliullin 10.2014 - charges and electrons of molecules
157!> are now in agreement with atomic guess
158!> \author MI
159!> \version 1.0
160! **************************************************************************************************
161 SUBROUTINE num_ao_el_per_molecule(molecule_kind_set, qs_kind_set)
162
163 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
164 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
165
166 INTEGER :: arbitrary_spin, iatom, ikind, imol, &
167 n_ao, natom, nmol_kind, nsgf, nspins, &
168 z_molecule
169 INTEGER, DIMENSION(0:lmat, 10) :: ne_core, ne_elem, ne_explicit
170 INTEGER, DIMENSION(2) :: n_occ_alpha_and_beta
171 REAL(kind=dp) :: charge_molecule, zeff, zeff_correction
172 REAL(kind=dp), DIMENSION(0:lmat, 10, 2) :: edelta
173 TYPE(all_potential_type), POINTER :: all_potential
174 TYPE(atomic_kind_type), POINTER :: atomic_kind
175 TYPE(cneo_potential_type), POINTER :: cneo_potential
176 TYPE(gth_potential_type), POINTER :: gth_potential
177 TYPE(gto_basis_set_type), POINTER :: orb_basis_set
178 TYPE(molecule_kind_type), POINTER :: molecule_kind
179 TYPE(sgp_potential_type), POINTER :: sgp_potential
180
181 IF (ASSOCIATED(molecule_kind_set)) THEN
182
183 nspins = 2
184 nmol_kind = SIZE(molecule_kind_set, 1)
185 natom = 0
186
187 ! *** Initialize the molecule kind data structure ***
188 arbitrary_spin = 1
189 DO imol = 1, nmol_kind
190
191 molecule_kind => molecule_kind_set(imol)
192 CALL get_molecule_kind(molecule_kind=molecule_kind, &
193 natom=natom)
194 !nelectron = 0
195 n_ao = 0
196 n_occ_alpha_and_beta(1:nspins) = 0
197 z_molecule = 0
198
199 DO iatom = 1, natom
200
201 atomic_kind => molecule_kind%atom_list(iatom)%atomic_kind
202 CALL get_atomic_kind(atomic_kind, kind_number=ikind)
203 CALL get_qs_kind(qs_kind_set(ikind), &
204 basis_set=orb_basis_set, &
205 all_potential=all_potential, &
206 gth_potential=gth_potential, &
207 sgp_potential=sgp_potential, &
208 cneo_potential=cneo_potential)
209
210 ! Obtain the electronic state of the atom
211 ! The same state is used to calculate the ATOMIC GUESS
212 ! It is great that we are consistent with ATOMIC_GUESS
213 CALL init_atom_electronic_state(atomic_kind=atomic_kind, &
214 qs_kind=qs_kind_set(ikind), &
215 ncalc=ne_explicit, &
216 ncore=ne_core, &
217 nelem=ne_elem, &
218 edelta=edelta)
219
220 ! If &BS section is used ATOMIC_GUESS is calculated twice
221 ! for two separate wfns with their own alpha-beta combinations
222 ! This is done to break the spin symmetry of the initial wfn
223 ! For now, only alpha part of &BS is used to count electrons on
224 ! molecules
225 ! Get the number of explicit electrons (i.e. with orbitals)
226 ! For now, only the total number of electrons can be obtained
227 ! from init_atom_electronic_state
228 n_occ_alpha_and_beta(arbitrary_spin) = &
229 n_occ_alpha_and_beta(arbitrary_spin) + sum(ne_explicit) + &
230 sum(nint(2*edelta(:, :, arbitrary_spin)))
231 ! We need a way to specify the number of alpha and beta electrons
232 ! on each molecule (i.e. multiplicity is not enough)
233 !n_occ(ispin) = n_occ(ispin) + SUM(ne_explicit) + SUM(NINT(2*edelta(:, :, ispin)))
234
235 IF (ASSOCIATED(all_potential)) THEN
236 CALL get_potential(potential=all_potential, zeff=zeff, &
237 zeff_correction=zeff_correction)
238 ELSE IF (ASSOCIATED(gth_potential)) THEN
239 CALL get_potential(potential=gth_potential, zeff=zeff, &
240 zeff_correction=zeff_correction)
241 ELSE IF (ASSOCIATED(sgp_potential)) THEN
242 CALL get_potential(potential=sgp_potential, zeff=zeff, &
243 zeff_correction=zeff_correction)
244 ELSE IF (ASSOCIATED(cneo_potential)) THEN
245 CALL get_cneo_potential(potential=cneo_potential, zeff=zeff)
246 zeff_correction = 0.0_dp
247 ELSE
248 zeff = 0.0_dp
249 zeff_correction = 0.0_dp
250 END IF
251 z_molecule = z_molecule + nint(zeff - zeff_correction)
252
253 ! this one does not work because nelem is not adjusted in the symmetry breaking code
254 !CALL get_atomic_kind(atomic_kind,z=z)
255 !z_molecule=z_molecule+z
256
257 IF (ASSOCIATED(orb_basis_set)) THEN
258 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, nsgf=nsgf)
259 ELSE
260 nsgf = 0
261 END IF
262 n_ao = n_ao + nsgf
263
264 END DO ! iatom
265
266 ! At this point we have the number of electrons (alpha+beta) on the molecule
267 ! as they are seen by the ATOMIC GUESS routines
268 charge_molecule = real(z_molecule - n_occ_alpha_and_beta(arbitrary_spin), dp)
269 CALL set_molecule_kind(molecule_kind=molecule_kind, &
270 nelectron=n_occ_alpha_and_beta(arbitrary_spin), &
271 charge=charge_molecule, &
272 nsgf=n_ao)
273
274 END DO ! imol
275 END IF
276
277 END SUBROUTINE num_ao_el_per_molecule
278
279END MODULE qs_subsys_methods
Define the atom type and its sub types.
Definition atom_types.F:15
integer, parameter, public lmat
Definition atom_types.F:67
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
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.
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
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 cell_clone(cell_in, cell_out, tag)
Clone cell variable.
Definition cell_types.F:107
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_release(subsys)
releases a subsys (see doc/ReferenceCounting.html)
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
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)
returns information about various attributes of the given subsys
Definition of the atomic potential types.
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 get_molecule_kind(molecule_kind, atom_list, bond_list, bend_list, ub_list, impr_list, opbend_list, colv_list, fixd_list, g3x3_list, g4x6_list, vsite_list, torsion_list, shell_list, name, mass, charge, kind_number, natom, nbend, nbond, nub, nimpr, nopbend, nconstraint, nconstraint_fixd, nfixd, ncolv, ng3x3, ng4x6, nvsite, nfixd_restraint, ng3x3_restraint, ng4x6_restraint, nvsite_restraint, nrestraints, nmolecule, nsgf, nshell, ntorsion, molecule_list, nelectron, nelectron_alpha, nelectron_beta, bond_kind_set, bend_kind_set, ub_kind_set, impr_kind_set, opbend_kind_set, torsion_kind_set, molname_generated)
Get informations about a molecule kind.
subroutine, public set_molecule_kind(molecule_kind, name, mass, charge, kind_number, molecule_list, atom_list, nbond, bond_list, nbend, bend_list, nub, ub_list, nimpr, impr_list, nopbend, opbend_list, ntorsion, torsion_list, fixd_list, ncolv, colv_list, ng3x3, g3x3_list, ng4x6, nfixd, g4x6_list, nvsite, vsite_list, ng3x3_restraint, ng4x6_restraint, nfixd_restraint, nshell, shell_list, nvsite_restraint, bond_kind_set, bend_kind_set, ub_kind_set, torsion_kind_set, impr_kind_set, opbend_kind_set, nelectron, nsgf, molname_generated)
Set the components of a molecule kind.
Types used by CNEO-DFT (see J. Chem. Theory Comput. 2025, 21, 16, 7865–7877)
subroutine, public get_cneo_potential(potential, z, zeff, mass, elec_conf, nsgf, nne, npsgf, nsotot, my_gcc_h, my_gcc_s, ovlp, kin, utrans, distance, harmonics, qlm_gg, gg, vgg, n2oindex, o2nindex, rad2l, oorad2l)
...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public init_atom_electronic_state(atomic_kind, qs_kind, ncalc, ncore, nelem, edelta)
...
subroutine, public create_qs_kind_set(qs_kind_set, atomic_kind_set, kind_section, para_env, force_env_section, silent)
Read an atomic kind set data set from the input file.
Routines that work on qs_subsys_type.
subroutine, public qs_subsys_create(subsys, para_env, root_section, force_env_section, subsys_section, use_motion_section, cp_subsys, cell, cell_ref, elkind, silent)
Creates a qs_subsys. Optionally an existsing cp_subsys is used.
types that represent a quickstep subsys
subroutine, public qs_subsys_set(subsys, cp_subsys, local_particles, local_molecules, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, nelectron_total, nelectron_spin)
...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
represents a system: atoms, molecules, their pos,vel,...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.