24#include "./base/base_uses.f90"
29 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'negf_atom_map'
30 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .true.
42 INTEGER,
DIMENSION(3) :: cell = -1
45 PRIVATE :: qs_kind_group_type, qs_kind_groups_create, qs_kind_groups_release
50 TYPE qs_kind_group_type
52 CHARACTER(len=2) :: element_symbol =
""
54 INTEGER :: natoms = -1
58 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_list
60 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: r
61 END TYPE qs_kind_group_type
81 INTENT(out) :: atom_map
82 INTEGER,
DIMENSION(:),
INTENT(in) :: atom_list
84 REAL(kind=
dp),
INTENT(in) :: eps_geometry
86 CHARACTER(len=*),
PARAMETER :: routinen =
'negf_map_atomic_indices'
88 CHARACTER(len=2) :: element_device
89 CHARACTER(len=default_string_length) :: atom_str
90 INTEGER :: atom_index_device, handle, iatom, &
91 iatom_kind, ikind, ikind_contact, &
92 natoms, nkinds_contact, nsgf_device
93 REAL(kind=
dp),
DIMENSION(3) :: coords, coords_error, coords_scaled
95 TYPE(
particle_type),
DIMENSION(:),
POINTER :: particle_set_contact, particle_set_device
96 TYPE(qs_kind_group_type),
ALLOCATABLE, &
97 DIMENSION(:) :: kind_groups_contact
98 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set_contact, qs_kind_set_device
100 CALL timeset(routinen, handle)
102 natoms =
SIZE(atom_map, 1)
103 cpassert(
SIZE(atom_list) == natoms)
105 CALL qs_subsys_get(subsys_device, particle_set=particle_set_device, qs_kind_set=qs_kind_set_device)
106 CALL qs_subsys_get(subsys_contact, cell=cell_contact, particle_set=particle_set_contact, qs_kind_set=qs_kind_set_contact)
108 CALL qs_kind_groups_create(kind_groups_contact, particle_set_contact, qs_kind_set_contact)
109 nkinds_contact =
SIZE(kind_groups_contact)
112 atom_index_device = atom_list(iatom)
113 CALL get_atomic_kind(particle_set_device(atom_index_device)%atomic_kind, kind_number=ikind)
114 CALL get_qs_kind(qs_kind_set_device(ikind), element_symbol=element_device, nsgf=nsgf_device)
116 atom_map(iatom)%iatom = 0
118 iterate_kind:
DO ikind_contact = 1, nkinds_contact
120 IF (kind_groups_contact(ikind_contact)%element_symbol == element_device .AND. &
121 kind_groups_contact(ikind_contact)%nsgf == nsgf_device)
THEN
124 DO iatom_kind = 1, kind_groups_contact(ikind_contact)%natoms
125 coords(1:3) = particle_set_device(atom_index_device)%r(1:3) - &
126 kind_groups_contact(ikind_contact)%r(1:3, iatom_kind)
129 coords_error = coords_scaled - real(nint(coords_scaled), kind=
dp)
131 IF (dot_product(coords_error, coords_error) < (eps_geometry*eps_geometry))
THEN
132 atom_map(iatom)%iatom = kind_groups_contact(ikind_contact)%atom_list(iatom_kind)
133 atom_map(iatom)%cell = nint(coords_scaled)
140 IF (atom_map(iatom)%iatom == 0)
THEN
142 WRITE (atom_str,
'(A2,3(1X,F11.6))') element_device, particle_set_device(atom_index_device)%r
144 CALL cp_abort(__location__, &
145 "Unable to map the atom ("//trim(atom_str)//
") onto the atom from the corresponding FORCE_EVAL section")
149 CALL qs_kind_groups_release(kind_groups_contact)
151 CALL centering_contact_coordinates(subsys=subsys_contact)
153 CALL timestop(handle)
163 SUBROUTINE centering_contact_coordinates(subsys)
166 REAL(kind=
dp) :: shiftx, shifty, shiftz
171 shiftx = (maxval(particle_set(:)%r(1)) + minval(particle_set(:)%r(1)))/2.0
172 shifty = (maxval(particle_set(:)%r(2)) + minval(particle_set(:)%r(2)))/2.0
173 shiftz = (maxval(particle_set(:)%r(3)) + minval(particle_set(:)%r(3)))/2.0
175 particle_set(:)%r(1) = particle_set(:)%r(1) - shiftx
176 particle_set(:)%r(2) = particle_set(:)%r(2) - shifty
177 particle_set(:)%r(3) = particle_set(:)%r(3) - shiftz
179 END SUBROUTINE centering_contact_coordinates
191 SUBROUTINE qs_kind_groups_create(kind_groups, particle_set, qs_kind_set)
192 TYPE(qs_kind_group_type),
ALLOCATABLE, &
193 DIMENSION(:),
INTENT(inout) :: kind_groups
195 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
197 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_kind_groups_create'
199 INTEGER :: handle, iatom, ikind, natoms, nkinds
201 CALL timeset(routinen, handle)
203 natoms =
SIZE(particle_set)
207 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
208 IF (nkinds < ikind) nkinds = ikind
211 ALLOCATE (kind_groups(nkinds))
214 kind_groups(ikind)%natoms = 0
215 CALL get_qs_kind(qs_kind_set(ikind), element_symbol=kind_groups(ikind)%element_symbol, nsgf=kind_groups(ikind)%nsgf)
219 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
220 kind_groups(ikind)%natoms = kind_groups(ikind)%natoms + 1
224 ALLOCATE (kind_groups(ikind)%atom_list(kind_groups(ikind)%natoms))
225 ALLOCATE (kind_groups(ikind)%r(3, kind_groups(ikind)%natoms))
227 kind_groups(ikind)%natoms = 0
231 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
232 kind_groups(ikind)%natoms = kind_groups(ikind)%natoms + 1
234 kind_groups(ikind)%atom_list(kind_groups(ikind)%natoms) = iatom
235 kind_groups(ikind)%r(1:3, kind_groups(ikind)%natoms) = particle_set(iatom)%r(1:3)
238 CALL timestop(handle)
239 END SUBROUTINE qs_kind_groups_create
247 SUBROUTINE qs_kind_groups_release(kind_groups)
248 TYPE(qs_kind_group_type),
ALLOCATABLE, &
249 DIMENSION(:),
INTENT(inout) :: kind_groups
251 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_kind_groups_release'
253 INTEGER :: handle, ikind
255 CALL timeset(routinen, handle)
257 IF (
ALLOCATED(kind_groups))
THEN
258 DO ikind =
SIZE(kind_groups), 1, -1
259 IF (
ALLOCATED(kind_groups(ikind)%atom_list))
DEALLOCATE (kind_groups(ikind)%atom_list)
260 IF (
ALLOCATED(kind_groups(ikind)%r))
DEALLOCATE (kind_groups(ikind)%r)
263 DEALLOCATE (kind_groups)
266 CALL timestop(handle)
267 END SUBROUTINE qs_kind_groups_release
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.
Handles all functions related to the CELL.
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Map atoms between various force environments.
subroutine, public negf_map_atomic_indices(atom_map, atom_list, subsys_device, subsys_contact, eps_geometry)
Map atoms in the cell 'subsys_device' listed in 'atom_list' with the corresponding atoms in the cell ...
Define the data structure for the particle information.
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.
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, 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, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Type defining parameters related to the simulation cell.
Structure that maps the given atom in the sourse FORCE_EVAL section with another atom from the target...
Provides all information about a quickstep kind.