(git:e7e05ae)
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
14  USE atomic_kind_types, ONLY: atomic_kind_type,&
17  gto_basis_set_type
18  USE cell_methods, ONLY: cell_create,&
19  read_cell,&
21  USE cell_types, ONLY: cell_clone,&
22  cell_release,&
23  cell_type
25  USE cp_subsys_types, ONLY: cp_subsys_get,&
28  cp_subsys_type
29  USE external_potential_types, ONLY: all_potential_type,&
30  get_potential,&
31  gth_potential_type,&
32  sgp_potential_type
34  section_vals_type
35  USE kinds, ONLY: dp
36  USE message_passing, ONLY: mp_para_env_type
38  molecule_kind_type,&
41  get_qs_kind,&
43  qs_kind_type
44  USE qs_subsys_types, ONLY: qs_subsys_set,&
45  qs_subsys_type
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 
55 CONTAINS
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 
268 END 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.
Definition: cell_methods.F:15
recursive subroutine, public read_cell(cell, cell_ref, use_ref_cell, cell_section, check_for_ref, para_env)
...
Definition: cell_methods.F:272
subroutine, public write_cell(cell, subsys_section, tag)
Write the cell parameters to the output unit.
Definition: cell_methods.F:731
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
Definition: cell_methods.F:85
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.
Definition: qs_kind_types.F:23
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)
...