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