(git:277415c)
Loading...
Searching...
No Matches
ec_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 used for Harris functional
10!> Kohn-Sham calculation
11!> \par History
12!> 10.2020 created
13!> \author Fabian Belleflamme
14! **************************************************************************************************
18 USE cp_dbcsr_api, ONLY: dbcsr_init_p,&
20 dbcsr_type_no_symmetry
25 USE cp_fm_types, ONLY: cp_fm_get_info,&
29 USE kinds, ONLY: dp
31 USE pw_env_types, ONLY: pw_env_get,&
34 USE pw_types, ONLY: pw_c1d_gs_type,&
43 USE qs_mo_types, ONLY: allocate_mo_set,&
47 USE qs_rho_types, ONLY: qs_rho_get,&
49 USE xc, ONLY: xc_calc_2nd_deriv,&
55#include "./base/base_uses.f90"
56
57 IMPLICIT NONE
58
59 PRIVATE
60
61! *** Global parameters ***
62
63 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ec_methods'
64
65 PUBLIC :: create_kernel
66 PUBLIC :: ec_mos_init
67
68CONTAINS
69
70! **************************************************************************************************
71!> \brief Creation of second derivative xc-potential
72!> \param qs_env ...
73!> \param vxc will contain the partially integrated second derivative
74!> taken with respect to rho, evaluated in rho and folded with rho1
75!> vxc is allocated here and needs to be deallocated by the caller.
76!> \param vxc_tau ...
77!> \param rho density at which derivatives were calculated
78!> \param rho1_r density in r-space with which to fold
79!> \param rho1_g density in g-space with which to fold
80!> \param tau1_r ...
81!> \param xc_section XC parameters of this potential
82!> \param compute_virial Enable stress-tensor calculation
83!> \param virial_xc Will contain GGA contribution of XC-kernel to stress-tensor
84!> \date 11.2019
85!> \author fbelle
86! **************************************************************************************************
87 SUBROUTINE create_kernel(qs_env, vxc, vxc_tau, rho, rho1_r, rho1_g, tau1_r, xc_section, compute_virial, virial_xc)
88
89 TYPE(qs_environment_type), POINTER :: qs_env
90 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vxc, vxc_tau
91 TYPE(qs_rho_type), INTENT(IN), POINTER :: rho
92 TYPE(pw_r3d_rs_type), DIMENSION(:), INTENT(IN), &
93 POINTER :: rho1_r
94 TYPE(pw_c1d_gs_type), DIMENSION(:), INTENT(IN), &
95 POINTER :: rho1_g
96 TYPE(pw_r3d_rs_type), DIMENSION(:), INTENT(IN), &
97 POINTER :: tau1_r
98 TYPE(section_vals_type), INTENT(IN), POINTER :: xc_section
99 LOGICAL, INTENT(IN), OPTIONAL :: compute_virial
100 REAL(kind=dp), DIMENSION(3, 3), INTENT(INOUT), &
101 OPTIONAL :: virial_xc
102
103 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_kernel'
104
105 INTEGER :: handle
106 TYPE(pw_env_type), POINTER :: pw_env
107 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
108 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r, tau_r
109 TYPE(pw_r3d_rs_type), POINTER :: weights
110 TYPE(xc_derivative_set_type) :: deriv_set
111 TYPE(xc_rho_set_type) :: rho_set
112
113 CALL timeset(routinen, handle)
114
115 NULLIFY (auxbas_pw_pool, pw_env, rho_r, vxc, vxc_tau)
116
117 CALL get_qs_env(qs_env, pw_env=pw_env, xcint_weights=weights)
118 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool)
119 ! Get density
120 CALL qs_rho_get(rho, rho_r=rho_r, tau_r=tau_r)
121
122 CALL xc_prep_2nd_deriv(deriv_set=deriv_set, & ! containing potentials
123 rho_set=rho_set, & ! density at which derivs are calculated
124 rho_r=rho_r, & ! place where derivative is evaluated
125 tau_r=tau_r, &
126 pw_pool=auxbas_pw_pool, & ! pool for grids
127 weights=weights, &
128 xc_section=xc_section)
129
130 ! folding of second deriv with density in rho1_set
131 CALL xc_calc_2nd_deriv(v_xc=vxc, & ! XC-potential, rho-dependent
132 v_xc_tau=vxc_tau, & ! XC-potential, tau-dependent
133 deriv_set=deriv_set, & ! deriv of xc-potential
134 rho_set=rho_set, & ! density at which deriv are calculated
135 rho1_r=rho1_r, & ! density with which to fold
136 rho1_g=rho1_g, & ! density with which to fold
137 tau1_r=tau1_r, &
138 pw_pool=auxbas_pw_pool, & ! pool for grids
139 weights=weights, &
140 xc_section=xc_section, &
141 gapw=.false., &
142 compute_virial=compute_virial, &
143 virial_xc=virial_xc)
144
145 ! Release second deriv stuff
146 CALL xc_dset_release(deriv_set)
147 CALL xc_rho_set_release(rho_set=rho_set, pw_pool=auxbas_pw_pool)
148
149 CALL timestop(handle)
150
151 END SUBROUTINE create_kernel
152
153! **************************************************************************************************
154!> \brief Allocate and initiate molecular orbitals environment
155!>
156!> \param qs_env ...
157!> \param matrix_s Used as template
158!> \param
159!>
160!> \par History
161!> 2020.10 created [Fabian Belleflamme]
162!> \author Fabian Belleflamme
163! **************************************************************************************************
164 SUBROUTINE ec_mos_init(qs_env, matrix_s)
165 TYPE(qs_environment_type), POINTER :: qs_env
166 TYPE(dbcsr_type) :: matrix_s
167
168 CHARACTER(len=*), PARAMETER :: routinen = 'ec_mos_init'
169
170 INTEGER :: handle, ispin, multiplicity, n_ao, &
171 nelectron, nmo, nspins
172 INTEGER, DIMENSION(2) :: n_mo, nelectron_spin
173 REAL(dp) :: maxocc
174 TYPE(cp_blacs_env_type), POINTER :: blacs_env
175 TYPE(cp_fm_struct_type), POINTER :: fm_struct
176 TYPE(cp_fm_type), POINTER :: mo_coeff
177 TYPE(dbcsr_type), POINTER :: mo_coeff_b
178 TYPE(dft_control_type), POINTER :: dft_control
179 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
180 TYPE(mp_para_env_type), POINTER :: para_env
181 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
182 TYPE(qs_matrix_pools_type), POINTER :: my_mpools
183
184 CALL timeset(routinen, handle)
185
186 NULLIFY (blacs_env, dft_control, mo_coeff, mo_coeff_b, mos, my_mpools, qs_kind_set)
187
188 CALL get_qs_env(qs_env=qs_env, &
189 dft_control=dft_control, &
190 blacs_env=blacs_env, &
191 qs_kind_set=qs_kind_set, &
192 nelectron_spin=nelectron_spin, &
193 para_env=para_env)
194 nspins = dft_control%nspins
195
196 ! Start setup
197 CALL get_qs_kind_set(qs_kind_set, nsgf=n_ao, nelectron=nelectron)
198
199 ! the total number of electrons
200 nelectron = nelectron - dft_control%charge
201 multiplicity = dft_control%multiplicity
202
203 ! setting maxocc and n_mo
204 IF (dft_control%nspins == 1) THEN
205 maxocc = 2.0_dp
206 nelectron_spin(1) = nelectron
207 nelectron_spin(2) = 0
208 IF (modulo(nelectron, 2) == 0) THEN
209 n_mo(1) = nelectron/2
210 ELSE
211 n_mo(1) = int(nelectron/2._dp) + 1
212 END IF
213 n_mo(2) = 0
214 ELSE
215 maxocc = 1.0_dp
216
217 ! The simplist spin distribution is written here. Special cases will
218 ! need additional user input
219 IF (modulo(nelectron + multiplicity - 1, 2) /= 0) THEN
220 cpabort("LSD: try to use a different multiplicity")
221 END IF
222
223 nelectron_spin(1) = (nelectron + multiplicity - 1)/2
224 nelectron_spin(2) = (nelectron - multiplicity + 1)/2
225
226 IF (nelectron_spin(2) < 0) THEN
227 cpabort("LSD: too few electrons for this multiplicity")
228 END IF
229
230 n_mo(1) = nelectron_spin(1)
231 n_mo(2) = nelectron_spin(2)
232
233 END IF
234
235 ! Allocate MO set
236 ALLOCATE (mos(nspins))
237 DO ispin = 1, nspins
238 CALL allocate_mo_set(mo_set=mos(ispin), &
239 nao=n_ao, &
240 nmo=n_mo(ispin), &
241 nelectron=nelectron_spin(ispin), &
242 n_el_f=real(nelectron_spin(ispin), dp), &
243 maxocc=maxocc, &
244 flexible_electron_count=dft_control%relax_multiplicity)
245 END DO
246
247 CALL set_qs_env(qs_env, mos=mos)
248
249 ! finish initialization of the MOs
250 NULLIFY (mo_coeff, mo_coeff_b)
251 DO ispin = 1, SIZE(mos)
252 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b, &
253 nmo=nmo, nao=n_ao)
254
255 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
256 CALL cp_fm_struct_create(fm_struct, nrow_global=n_ao, &
257 ncol_global=nmo, para_env=para_env, &
258 context=blacs_env)
259
260 CALL init_mo_set(mos(ispin), &
261 fm_struct=fm_struct, &
262 name="qs_env%mo"//trim(adjustl(cp_to_string(ispin))))
263 CALL cp_fm_struct_release(fm_struct)
264 END IF
265
266 IF (.NOT. ASSOCIATED(mo_coeff_b)) THEN
267 CALL cp_fm_get_info(mos(ispin)%mo_coeff, ncol_global=nmo)
268 CALL dbcsr_init_p(mos(ispin)%mo_coeff_b)
269 CALL cp_dbcsr_m_by_n_from_row_template(mos(ispin)%mo_coeff_b, &
270 template=matrix_s, &
271 n=nmo, &
272 sym=dbcsr_type_no_symmetry)
273 END IF
274 END DO
275
276 CALL mpools_release(mpools=my_mpools)
277
278 CALL timestop(handle)
279
280 END SUBROUTINE ec_mos_init
281
282END MODULE ec_methods
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_init_p(matrix)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_m_by_n_from_row_template(matrix, template, n, sym)
Utility function to create dbcsr matrix, m x n matrix (n arbitrary) with the same processor grid and ...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
various routines to log and control the output. The idea is that decisions about where to log should ...
Routines used for Harris functional Kohn-Sham calculation.
Definition ec_methods.F:15
subroutine, public ec_mos_init(qs_env, matrix_s)
Allocate and initiate molecular orbitals environment.
Definition ec_methods.F:165
subroutine, public create_kernel(qs_env, vxc, vxc_tau, rho, rho1_r, rho1_g, tau1_r, xc_section, compute_virial, virial_xc)
Creation of second derivative xc-potential.
Definition ec_methods.F:88
objects that represent the structure of input sections and the data contained in an input section
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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, xcint_weights, 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.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
wrapper for the pools of matrixes
subroutine, public mpools_release(mpools)
releases the given mpools
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
represent a group ofunctional derivatives
subroutine, public xc_dset_release(derivative_set)
releases a derivative set
contains the structure
subroutine, public xc_rho_set_release(rho_set, pw_pool)
releases the given rho_set
Exchange and Correlation functional calculations.
Definition xc.F:17
subroutine, public xc_prep_2nd_deriv(deriv_set, rho_set, rho_r, pw_pool, weights, xc_section, tau_r)
Prepare objects for the calculation of the 2nd derivatives of the density functional....
Definition xc.F:5533
subroutine, public xc_calc_2nd_deriv(v_xc, v_xc_tau, deriv_set, rho_set, rho1_r, rho1_g, tau1_r, pw_pool, weights, xc_section, gapw, vxg, do_excitations, do_sf, do_triplet, compute_virial, virial_xc)
Caller routine to calculate the second order potential in the direction of rho1_r.
Definition xc.F:924
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
represent a full matrix
stores all the informations relevant to an mpi environment
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
container for the pools of matrixes used by qs
keeps the density in various representations, keeping track of which ones are valid.
A derivative set contains the different derivatives of a xc-functional in form of a linked list.
represent a density, with all the representation and data needed to perform a functional evaluation