(git:495eafe)
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-2026 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
28 USE kinds, ONLY: dp
41#include "./base/base_uses.f90"
42
43 IMPLICIT NONE
44 PRIVATE
45
46 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_subsys_methods'
47
48 PUBLIC :: qs_subsys_create
49
50CONTAINS
51
52! **************************************************************************************************
53!> \brief Creates a qs_subsys. Optionally an existsing cp_subsys is used.
54!> \param subsys ...
55!> \param para_env ...
56!> \param root_section ...
57!> \param force_env_section ...
58!> \param subsys_section ...
59!> \param use_motion_section ...
60!> \param cp_subsys ...
61!> \param elkind ...
62!> \param silent ...
63! **************************************************************************************************
64 SUBROUTINE qs_subsys_create(subsys, para_env, root_section, force_env_section, subsys_section, &
65 use_motion_section, cp_subsys, elkind, silent)
66 TYPE(qs_subsys_type), INTENT(OUT) :: subsys
67 TYPE(mp_para_env_type), POINTER :: para_env
68 TYPE(section_vals_type), OPTIONAL, POINTER :: root_section
69 TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
70 LOGICAL, INTENT(IN) :: use_motion_section
71 TYPE(cp_subsys_type), OPTIONAL, POINTER :: cp_subsys
72 LOGICAL, INTENT(IN), OPTIONAL :: elkind, silent
73
74 LOGICAL :: be_silent
75 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
76 TYPE(cp_subsys_type), POINTER :: my_cp_subsys
77 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
78 TYPE(section_vals_type), POINTER :: kind_section
79
80 NULLIFY (atomic_kind_set, qs_kind_set, kind_section, my_cp_subsys)
81
82 be_silent = .false.
83 IF (PRESENT(silent)) be_silent = silent
84 ! create cp_subsys
85 IF (PRESENT(cp_subsys)) THEN
86 my_cp_subsys => cp_subsys
87 ELSE IF (PRESENT(root_section)) THEN
88 CALL cp_subsys_create(my_cp_subsys, para_env, root_section=root_section, &
89 force_env_section=force_env_section, &
90 subsys_section=subsys_section, &
91 use_motion_section=use_motion_section, &
92 elkind=elkind)
93 ELSE
94 cpabort("qs_subsys_create: cp_subsys or root_section needed")
95 END IF
96
97 ! setup qs_kinds
98 CALL cp_subsys_get(my_cp_subsys, atomic_kind_set=atomic_kind_set)
99 kind_section => section_vals_get_subs_vals(subsys_section, "KIND")
100 CALL create_qs_kind_set(qs_kind_set, atomic_kind_set, kind_section, &
101 para_env, force_env_section, be_silent)
102
103 CALL num_ao_el_per_molecule(my_cp_subsys%molecule_kinds%els, &
104 qs_kind_set)
105
106 CALL qs_subsys_set(subsys, &
107 cp_subsys=my_cp_subsys, &
108 cell_ref=my_cp_subsys%cell_ref, &
109 use_ref_cell=my_cp_subsys%use_ref_cell, &
110 qs_kind_set=qs_kind_set)
111
112 IF (.NOT. PRESENT(cp_subsys)) CALL cp_subsys_release(my_cp_subsys)
113
114 END SUBROUTINE qs_subsys_create
115
116! **************************************************************************************************
117!> \brief Read a molecule kind data set from the input file.
118!> \param molecule_kind_set ...
119!> \param qs_kind_set ...
120!> \date 22.11.2004
121!> \par History
122!> Rustam Z. Khaliullin 10.2014 - charges and electrons of molecules
123!> are now in agreement with atomic guess
124!> \author MI
125!> \version 1.0
126! **************************************************************************************************
127 SUBROUTINE num_ao_el_per_molecule(molecule_kind_set, qs_kind_set)
128
129 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
130 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
131
132 INTEGER :: arbitrary_spin, iatom, ikind, imol, &
133 n_ao, natom, nmol_kind, nsgf, nspins, &
134 z_molecule
135 INTEGER, DIMENSION(0:lmat, 10) :: ne_core, ne_elem, ne_explicit
136 INTEGER, DIMENSION(2) :: n_occ_alpha_and_beta
137 REAL(kind=dp) :: charge_molecule, zeff, zeff_correction
138 REAL(kind=dp), DIMENSION(0:lmat, 10, 2) :: edelta
139 TYPE(all_potential_type), POINTER :: all_potential
140 TYPE(atomic_kind_type), POINTER :: atomic_kind
141 TYPE(cneo_potential_type), POINTER :: cneo_potential
142 TYPE(gth_potential_type), POINTER :: gth_potential
143 TYPE(gto_basis_set_type), POINTER :: orb_basis_set
144 TYPE(molecule_kind_type), POINTER :: molecule_kind
145 TYPE(sgp_potential_type), POINTER :: sgp_potential
146
147 IF (ASSOCIATED(molecule_kind_set)) THEN
148
149 nspins = 2
150 nmol_kind = SIZE(molecule_kind_set, 1)
151 natom = 0
152
153 ! *** Initialize the molecule kind data structure ***
154 arbitrary_spin = 1
155 DO imol = 1, nmol_kind
156
157 molecule_kind => molecule_kind_set(imol)
158 CALL get_molecule_kind(molecule_kind=molecule_kind, &
159 natom=natom)
160 !nelectron = 0
161 n_ao = 0
162 n_occ_alpha_and_beta(1:nspins) = 0
163 z_molecule = 0
164
165 DO iatom = 1, natom
166
167 atomic_kind => molecule_kind%atom_list(iatom)%atomic_kind
168 CALL get_atomic_kind(atomic_kind, kind_number=ikind)
169 CALL get_qs_kind(qs_kind_set(ikind), &
170 basis_set=orb_basis_set, &
171 all_potential=all_potential, &
172 gth_potential=gth_potential, &
173 sgp_potential=sgp_potential, &
174 cneo_potential=cneo_potential)
175
176 ! Obtain the electronic state of the atom
177 ! The same state is used to calculate the ATOMIC GUESS
178 ! It is great that we are consistent with ATOMIC_GUESS
179 CALL init_atom_electronic_state(atomic_kind=atomic_kind, &
180 qs_kind=qs_kind_set(ikind), &
181 ncalc=ne_explicit, &
182 ncore=ne_core, &
183 nelem=ne_elem, &
184 edelta=edelta)
185
186 ! If &BS section is used ATOMIC_GUESS is calculated twice
187 ! for two separate wfns with their own alpha-beta combinations
188 ! This is done to break the spin symmetry of the initial wfn
189 ! For now, only alpha part of &BS is used to count electrons on
190 ! molecules
191 ! Get the number of explicit electrons (i.e. with orbitals)
192 ! For now, only the total number of electrons can be obtained
193 ! from init_atom_electronic_state
194 n_occ_alpha_and_beta(arbitrary_spin) = &
195 n_occ_alpha_and_beta(arbitrary_spin) + sum(ne_explicit) + &
196 sum(nint(2*edelta(:, :, arbitrary_spin)))
197 ! We need a way to specify the number of alpha and beta electrons
198 ! on each molecule (i.e. multiplicity is not enough)
199 !n_occ(ispin) = n_occ(ispin) + SUM(ne_explicit) + SUM(NINT(2*edelta(:, :, ispin)))
200
201 IF (ASSOCIATED(all_potential)) THEN
202 CALL get_potential(potential=all_potential, zeff=zeff, &
203 zeff_correction=zeff_correction)
204 ELSE IF (ASSOCIATED(gth_potential)) THEN
205 CALL get_potential(potential=gth_potential, zeff=zeff, &
206 zeff_correction=zeff_correction)
207 ELSE IF (ASSOCIATED(sgp_potential)) THEN
208 CALL get_potential(potential=sgp_potential, zeff=zeff, &
209 zeff_correction=zeff_correction)
210 ELSE IF (ASSOCIATED(cneo_potential)) THEN
211 CALL get_cneo_potential(potential=cneo_potential, zeff=zeff)
212 zeff_correction = 0.0_dp
213 ELSE
214 zeff = 0.0_dp
215 zeff_correction = 0.0_dp
216 END IF
217 z_molecule = z_molecule + nint(zeff - zeff_correction)
218
219 ! this one does not work because nelem is not adjusted in the symmetry breaking code
220 !CALL get_atomic_kind(atomic_kind,z=z)
221 !z_molecule=z_molecule+z
222
223 IF (ASSOCIATED(orb_basis_set)) THEN
224 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, nsgf=nsgf)
225 ELSE
226 nsgf = 0
227 END IF
228 n_ao = n_ao + nsgf
229
230 END DO ! iatom
231
232 ! At this point we have the number of electrons (alpha+beta) on the molecule
233 ! as they are seen by the ATOMIC GUESS routines
234 charge_molecule = real(z_molecule - n_occ_alpha_and_beta(arbitrary_spin), dp)
235 CALL set_molecule_kind(molecule_kind=molecule_kind, &
236 nelectron=n_occ_alpha_and_beta(arbitrary_spin), &
237 charge=charge_molecule, &
238 nsgf=n_ao)
239
240 END DO ! imol
241 END IF
242
243 END SUBROUTINE num_ao_el_per_molecule
244
245END 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)
...
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_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
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, monovalent, 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, 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.
represents a system: atoms, molecules, their pos,vel,...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.