(git:8ebf9ad)
Loading...
Searching...
No Matches
soc_pseudopotential_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
10 USE core_ppnl, ONLY: build_core_ppnl
11 USE cp_cfm_types, ONLY: cp_cfm_get_info,&
14 USE cp_dbcsr_api, ONLY: dbcsr_add,&
19 dbcsr_set,&
20 dbcsr_type_antisymmetric,&
21 dbcsr_type_no_symmetry
25 USE kinds, ONLY: dp
26 USE kpoint_types, ONLY: get_kpoint_info,&
35 USE virial_types, ONLY: virial_type
36#include "./base/base_uses.f90"
37
38 IMPLICIT NONE
39
40 PRIVATE
41
42 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'soc_pseudopotential_methods'
43
46
47CONTAINS
48
49! **************************************************************************************************
50!> \brief V^SOC_µν^(α),R = ħ/2 < ϕ_µ cell O | sum_ℓ ΔV_ℓ^SO(r,r') L^(α) | ϕ_ν cell R>, α = x,y,z
51!> see Hartwigsen, Goedecker, Hutter, Eq.(18), (19) (doi.org/10.1103/PhysRevB.58.3641)
52!> Caution: V^SOC_µν^(α) is purely imaginary and Hermitian; V^SOC_µν^(α) is stored as real
53!> dbcsr matrix mat_V_SOC_xyz without symmetry; V^SOC_µν^(α) is stored without
54!> the imaginary unit, i.e. mat_V_SOC_xyz is real and antisymmetric
55!> \param qs_env ...
56!> \param mat_V_SOC_xyz ...
57!> \par History
58!> * 09.2023 created
59!> \author Jan Wilhelm
60! **************************************************************************************************
61 SUBROUTINE v_soc_xyz_from_pseudopotential(qs_env, mat_V_SOC_xyz)
62 TYPE(qs_environment_type), POINTER :: qs_env
63 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_v_soc_xyz
64
65 CHARACTER(LEN=*), PARAMETER :: routinen = 'V_SOC_xyz_from_pseudopotential'
66
67 INTEGER :: handle, img, nder, nimages, xyz
68 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
69 LOGICAL :: calculate_forces, do_kp, do_symmetric, &
70 use_virial
71 REAL(kind=dp) :: eps_ppnl
72 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
73 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_l, mat_l_nosym, mat_pot_dummy, &
74 matrix_dummy, matrix_s
75 TYPE(dft_control_type), POINTER :: dft_control
76 TYPE(kpoint_type), POINTER :: kpoints
77 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
78 POINTER :: sab_orb, sap_ppnl
79 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
80 TYPE(qs_force_type), DIMENSION(:), POINTER :: force
81 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
82 TYPE(virial_type), POINTER :: virial
83
84 CALL timeset(routinen, handle)
85
86 NULLIFY (qs_kind_set, dft_control, sab_orb, sap_ppnl, particle_set, atomic_kind_set, &
87 cell_to_index)
88 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control, &
89 matrix_s_kp=matrix_s, kpoints=kpoints, atomic_kind_set=atomic_kind_set, &
90 particle_set=particle_set, sab_orb=sab_orb, sap_ppnl=sap_ppnl)
91
92 eps_ppnl = dft_control%qs_control%eps_ppnl
93 nimages = dft_control%nimages
94 do_kp = (nimages > 1)
95 CALL get_neighbor_list_set_p(neighbor_list_sets=sab_orb, symmetric=do_symmetric)
96 CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
97
98 NULLIFY (mat_l, mat_pot_dummy)
99 CALL dbcsr_allocate_matrix_set(mat_l, 3, nimages)
100 DO xyz = 1, 3
101 DO img = 1, nimages
102 ALLOCATE (mat_l(xyz, img)%matrix)
103 CALL dbcsr_create(mat_l(xyz, img)%matrix, template=matrix_s(1, 1)%matrix, &
104 matrix_type=dbcsr_type_antisymmetric)
105 CALL cp_dbcsr_alloc_block_from_nbl(mat_l(xyz, img)%matrix, sab_orb)
106 CALL dbcsr_set(mat_l(xyz, img)%matrix, 0.0_dp)
107 END DO
108 END DO
109
110 ! get mat_l; the next CPASSERT fails if the atoms do not have any SOC parameters, i.e.
111 ! SOC is zero and one should not activate the SOC section
112 cpassert(ASSOCIATED(sap_ppnl))
113 nder = 0
114 use_virial = .false.
115 calculate_forces = .false.
116
117 NULLIFY (mat_pot_dummy)
118 CALL dbcsr_allocate_matrix_set(mat_pot_dummy, 1, nimages)
119 DO img = 1, nimages
120 ALLOCATE (mat_pot_dummy(1, img)%matrix)
121 CALL dbcsr_create(mat_pot_dummy(1, img)%matrix, template=matrix_s(1, 1)%matrix)
122 CALL cp_dbcsr_alloc_block_from_nbl(mat_pot_dummy(1, img)%matrix, sab_orb)
123 CALL dbcsr_set(mat_pot_dummy(1, img)%matrix, 0.0_dp)
124 END DO
125
126 CALL build_core_ppnl(mat_pot_dummy, matrix_dummy, force, virial, &
127 calculate_forces, use_virial, nder, &
128 qs_kind_set, atomic_kind_set, particle_set, sab_orb, sap_ppnl, &
129 eps_ppnl, nimages=nimages, cell_to_index=cell_to_index, &
130 basis_type="ORB", matrix_l=mat_l)
131
132 NULLIFY (mat_l_nosym)
133 CALL dbcsr_allocate_matrix_set(mat_l_nosym, 3, nimages)
134 DO xyz = 1, 3
135 DO img = 1, nimages
136
137 ALLOCATE (mat_l_nosym(xyz, img)%matrix)
138 IF (do_kp) THEN
139 CALL dbcsr_create(mat_l_nosym(xyz, img)%matrix, template=matrix_s(1, 1)%matrix, &
140 matrix_type=dbcsr_type_antisymmetric)
141 CALL dbcsr_copy(mat_l_nosym(xyz, img)%matrix, mat_l(xyz, img)%matrix)
142 ELSE
143 CALL dbcsr_create(mat_l_nosym(xyz, img)%matrix, template=matrix_s(1, 1)%matrix, &
144 matrix_type=dbcsr_type_no_symmetry)
145 CALL dbcsr_desymmetrize(mat_l(xyz, img)%matrix, mat_l_nosym(xyz, img)%matrix)
146 END IF
147
148 END DO
149 END DO
150
151 NULLIFY (mat_v_soc_xyz)
152 CALL dbcsr_allocate_matrix_set(mat_v_soc_xyz, 3, nimages)
153 DO xyz = 1, 3
154 DO img = 1, nimages
155 ALLOCATE (mat_v_soc_xyz(xyz, img)%matrix)
156 IF (do_kp) THEN
157 ! mat_V_SOC_xyz^R with neighbor cell R actually has no symmetry
158 ! mat_V_SOC_xyz^R_µν = mat_V_SOC_xyz^R_νµ* (the actual symmetry is
159 ! mat_V_SOC_xyz^R_µν = mat_V_SOC_xyz^-R_νµ* ) but rskp_transform
160 ! for mat_V_SOC_xyz^R -> mat_V_SOC_xyz(k) requires symmetry...
161 CALL dbcsr_create(mat_v_soc_xyz(xyz, img)%matrix, template=matrix_s(1, 1)%matrix, &
162 matrix_type=dbcsr_type_antisymmetric)
163 ELSE
164 CALL dbcsr_create(mat_v_soc_xyz(xyz, img)%matrix, template=matrix_s(1, 1)%matrix, &
165 matrix_type=dbcsr_type_no_symmetry)
166 END IF
167 CALL cp_dbcsr_alloc_block_from_nbl(mat_v_soc_xyz(xyz, img)%matrix, sab_orb)
168 ! factor 0.5 from ħ/2 prefactor
169 CALL dbcsr_add(mat_v_soc_xyz(xyz, img)%matrix, mat_l_nosym(xyz, img)%matrix, &
170 0.0_dp, 0.5_dp)
171 END DO
172 END DO
173
174 CALL dbcsr_deallocate_matrix_set(mat_pot_dummy)
175 CALL dbcsr_deallocate_matrix_set(mat_l_nosym)
177
178 CALL timestop(handle)
179
180 END SUBROUTINE v_soc_xyz_from_pseudopotential
181
182! **************************************************************************************************
183!> \brief ...
184!> \param cfm_ks_spinor ...
185!> \param e_win ...
186!> \param eigenval ...
187!> \param E_HOMO ...
188!> \param E_LUMO ...
189! **************************************************************************************************
190 SUBROUTINE remove_soc_outside_energy_window_mo(cfm_ks_spinor, e_win, eigenval, E_HOMO, E_LUMO)
191 TYPE(cp_cfm_type) :: cfm_ks_spinor
192 REAL(kind=dp) :: e_win
193 REAL(kind=dp), DIMENSION(:) :: eigenval
194 REAL(kind=dp) :: e_homo, e_lumo
195
196 CHARACTER(LEN=*), PARAMETER :: routinen = 'remove_soc_outside_energy_window_mo'
197
198 INTEGER :: handle, i_glob, iib, j_glob, jjb, &
199 ncol_global, ncol_local, nrow_global, &
200 nrow_local
201 INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
202 REAL(kind=dp) :: e_i, e_j
203
204 ! Remove SOC outside of energy window (otherwise, numerical problems arise
205 ! because energetically low semicore states and energetically very high
206 ! unbound states couple to the states around the Fermi level).
207 ! This routine is for cfm_ks_spinor being in the molecular-orbital (mo) with
208 ! corresponding eigenvalues "eigenval".
209
210 CALL timeset(routinen, handle)
211
212 CALL cp_cfm_get_info(matrix=cfm_ks_spinor, &
213 nrow_global=nrow_global, &
214 ncol_global=ncol_global, &
215 nrow_local=nrow_local, &
216 ncol_local=ncol_local, &
217 row_indices=row_indices, &
218 col_indices=col_indices)
219
220 cpassert(nrow_global == SIZE(eigenval))
221 cpassert(ncol_global == SIZE(eigenval))
222
223 DO jjb = 1, ncol_local
224 j_glob = col_indices(jjb)
225 DO iib = 1, nrow_local
226 i_glob = row_indices(iib)
227
228 e_i = eigenval(i_glob)
229 e_j = eigenval(j_glob)
230
231 IF (e_i < e_homo - 0.5_dp*e_win .OR. e_i > e_lumo + 0.5_dp*e_win .OR. &
232 e_j < e_homo - 0.5_dp*e_win .OR. e_j > e_lumo + 0.5_dp*e_win) THEN
233 cfm_ks_spinor%local_data(iib, jjb) = 0.0_dp
234 END IF
235
236 END DO
237 END DO
238
239 CALL timestop(handle)
240
242
Define the atomic kind types and their sub types.
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
Definition core_ppnl.F:15
subroutine, public build_core_ppnl(matrix_h, matrix_p, force, virial, calculate_forces, use_virial, nder, qs_kind_set, atomic_kind_set, particle_set, sab_orb, sap_ppnl, eps_ppnl, nimages, cell_to_index, basis_type, deltar, matrix_l, atcore)
...
Definition core_ppnl.F:90
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Define the data structure for the particle information.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
Define the neighbor list data types and the corresponding functionality.
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
subroutine, public v_soc_xyz_from_pseudopotential(qs_env, mat_v_soc_xyz)
V^SOC_µν^(α),R = ħ/2 < ϕ_µ cell O | sum_ℓ ΔV_ℓ^SO(r,r') L^(α) | ϕ_ν cell R>, α = x,...
subroutine, public remove_soc_outside_energy_window_mo(cfm_ks_spinor, e_win, eigenval, e_homo, e_lumo)
...
Provides all information about an atomic kind.
Represent a complex full matrix.
Contains information about kpoints.
Provides all information about a quickstep kind.