(git:b279b6b)
hfx_pw_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 Test routines for HFX caclulations using PW
10 !>
11 !>
12 !> \par History
13 !> refactoring 03-2011 [MI]
14 !> Made GAPW compatible 12.2019 (A. Bussy)
15 !> Refactored from hfx_admm_utils (JGH)
16 !> \author MI
17 ! **************************************************************************************************
19  USE atomic_kind_types, ONLY: atomic_kind_type
20  USE cell_types, ONLY: cell_type
21  USE cp_control_types, ONLY: dft_control_type
23  USE cp_fm_types, ONLY: cp_fm_get_info,&
24  cp_fm_type
26  cp_logger_type
29  USE dbcsr_api, ONLY: dbcsr_type
35  section_vals_type,&
37  USE kinds, ONLY: dp
38  USE mathconstants, ONLY: fourpi
39  USE particle_types, ONLY: particle_type
40  USE pw_env_types, ONLY: pw_env_type
41  USE pw_grid_types, ONLY: pw_grid_type
42  USE pw_methods, ONLY: pw_copy,&
43  pw_multiply,&
44  pw_transfer,&
45  pw_zero
46  USE pw_poisson_methods, ONLY: pw_poisson_solve
47  USE pw_poisson_types, ONLY: pw_poisson_type
48  USE pw_pool_types, ONLY: pw_pool_type
49  USE pw_types, ONLY: pw_c1d_gs_type,&
50  pw_r3d_rs_type
52  USE qs_environment_types, ONLY: get_qs_env,&
53  qs_environment_type
54  USE qs_kind_types, ONLY: qs_kind_type
55  USE qs_mo_types, ONLY: get_mo_set,&
56  mo_set_type
57 #include "./base/base_uses.f90"
58 
59  IMPLICIT NONE
60 
61  PRIVATE
62 
63  ! *** Public subroutines ***
64  PUBLIC :: pw_hfx
65 
66  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'hfx_pw_methods'
67 
68 CONTAINS
69 
70 ! **************************************************************************************************
71 !> \brief computes the Hartree-Fock energy brute force in a pw basis
72 !> \param qs_env ...
73 !> \param ehfx ...
74 !> \param hfx_section ...
75 !> \param poisson_env ...
76 !> \param auxbas_pw_pool ...
77 !> \param irep ...
78 !> \par History
79 !> 12.2007 created [Joost VandeVondele]
80 !> \note
81 !> only computes the HFX energy, no derivatives as yet
82 ! **************************************************************************************************
83  SUBROUTINE pw_hfx(qs_env, ehfx, hfx_section, poisson_env, auxbas_pw_pool, irep)
84  TYPE(qs_environment_type), POINTER :: qs_env
85  REAL(kind=dp), INTENT(IN) :: ehfx
86  TYPE(section_vals_type), POINTER :: hfx_section
87  TYPE(pw_poisson_type), POINTER :: poisson_env
88  TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
89  INTEGER :: irep
90 
91  CHARACTER(*), PARAMETER :: routinen = 'pw_hfx'
92 
93  INTEGER :: blocksize, handle, ig, iloc, iorb, &
94  iorb_block, ispin, iw, jloc, jorb, &
95  jorb_block, norb, potential_type
96  LOGICAL :: do_kpoints, do_pw_hfx, explicit
97  REAL(kind=dp) :: exchange_energy, fraction, g2, g3d, gg, &
98  omega, pair_energy, rcut, scaling
99  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
100  TYPE(cell_type), POINTER :: cell
101  TYPE(cp_fm_type), POINTER :: mo_coeff
102  TYPE(cp_logger_type), POINTER :: logger
103  TYPE(dbcsr_type), POINTER :: mo_coeff_b
104  TYPE(dft_control_type), POINTER :: dft_control
105  TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
106  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
107  TYPE(pw_c1d_gs_type) :: greenfn, pot_g, rho_g
108  TYPE(pw_env_type), POINTER :: pw_env
109  TYPE(pw_grid_type), POINTER :: grid
110  TYPE(pw_r3d_rs_type) :: rho_r
111  TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:) :: rho_i, rho_j
112  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
113  TYPE(section_vals_type), POINTER :: ip_section
114 
115  CALL timeset(routinen, handle)
116  logger => cp_get_default_logger()
117 
118  CALL section_vals_val_get(hfx_section, "PW_HFX", l_val=do_pw_hfx, i_rep_section=irep)
119 
120  IF (do_pw_hfx) THEN
121  CALL section_vals_val_get(hfx_section, "FRACTION", r_val=fraction)
122  CALL section_vals_val_get(hfx_section, "PW_HFX_BLOCKSIZE", i_val=blocksize)
123 
124  CALL get_qs_env(qs_env, mos=mo_array, pw_env=pw_env, dft_control=dft_control, &
125  cell=cell, particle_set=particle_set, do_kpoints=do_kpoints, &
126  atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
127  IF (do_kpoints) cpabort("PW HFX not implemented with K-points")
128 
129  ! limit the blocksize by the number of orbitals
130  CALL get_mo_set(mo_set=mo_array(1), mo_coeff=mo_coeff)
131  CALL cp_fm_get_info(mo_coeff, ncol_global=norb)
132  blocksize = max(1, min(blocksize, norb))
133 
134  CALL auxbas_pw_pool%create_pw(rho_r)
135  CALL auxbas_pw_pool%create_pw(rho_g)
136  CALL auxbas_pw_pool%create_pw(pot_g)
137 
138  ALLOCATE (rho_i(blocksize))
139  ALLOCATE (rho_j(blocksize))
140 
141  CALL auxbas_pw_pool%create_pw(greenfn)
142  ip_section => section_vals_get_subs_vals(hfx_section, "INTERACTION_POTENTIAL")
143  CALL section_vals_get(ip_section, explicit=explicit)
144  potential_type = do_potential_coulomb
145  IF (explicit) THEN
146  CALL section_vals_val_get(ip_section, "POTENTIAL_TYPE", i_val=potential_type)
147  END IF
148  IF (potential_type == do_potential_coulomb) THEN
149  CALL pw_copy(poisson_env%green_fft%influence_fn, greenfn)
150  ELSEIF (potential_type == do_potential_truncated) THEN
151  CALL section_vals_val_get(ip_section, "CUTOFF_RADIUS", r_val=rcut)
152  grid => poisson_env%green_fft%influence_fn%pw_grid
153  DO ig = grid%first_gne0, grid%ngpts_cut_local
154  g2 = grid%gsq(ig)
155  gg = sqrt(g2)
156  g3d = fourpi/g2
157  greenfn%array(ig) = g3d*(1.0_dp - cos(rcut*gg))
158  END DO
159  IF (grid%have_g0) &
160  greenfn%array(1) = 0.5_dp*fourpi*rcut*rcut
161  ELSEIF (potential_type == do_potential_short) THEN
162  CALL section_vals_val_get(ip_section, "OMEGA", r_val=omega)
163  IF (omega > 0.0_dp) omega = 0.25_dp/(omega*omega)
164  grid => poisson_env%green_fft%influence_fn%pw_grid
165  DO ig = grid%first_gne0, grid%ngpts_cut_local
166  g2 = grid%gsq(ig)
167  gg = -omega*g2
168  g3d = fourpi/g2
169  greenfn%array(ig) = g3d*(1.0_dp - exp(gg))
170  END DO
171  IF (grid%have_g0) greenfn%array(1) = 0.0_dp
172  ELSE
173  cpwarn("PW_SCF: Potential type not supported, calculation uses Coulomb potential.")
174  END IF
175 
176  DO iorb_block = 1, blocksize
177  CALL rho_i(iorb_block)%create(rho_r%pw_grid)
178  CALL rho_j(iorb_block)%create(rho_r%pw_grid)
179  END DO
180 
181  exchange_energy = 0.0_dp
182 
183  DO ispin = 1, SIZE(mo_array)
184  CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
185 
186  IF (mo_array(ispin)%use_mo_coeff_b) THEN !fm->dbcsr
187  CALL copy_dbcsr_to_fm(mo_coeff_b, mo_coeff) !fm->dbcsr
188  END IF !fm->dbcsr
189 
190  CALL cp_fm_get_info(mo_coeff, ncol_global=norb)
191 
192  DO iorb_block = 1, norb, blocksize
193 
194  DO iorb = iorb_block, min(iorb_block + blocksize - 1, norb)
195 
196  iloc = iorb - iorb_block + 1
197  CALL calculate_wavefunction(mo_coeff, iorb, rho_i(iloc), rho_g, &
198  atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, &
199  pw_env)
200 
201  END DO
202 
203  DO jorb_block = iorb_block, norb, blocksize
204 
205  DO jorb = jorb_block, min(jorb_block + blocksize - 1, norb)
206 
207  jloc = jorb - jorb_block + 1
208  CALL calculate_wavefunction(mo_coeff, jorb, rho_j(jloc), rho_g, &
209  atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, &
210  pw_env)
211 
212  END DO
213 
214  DO iorb = iorb_block, min(iorb_block + blocksize - 1, norb)
215  iloc = iorb - iorb_block + 1
216  DO jorb = jorb_block, min(jorb_block + blocksize - 1, norb)
217  jloc = jorb - jorb_block + 1
218  IF (jorb < iorb) cycle
219 
220  ! compute the pair density
221  CALL pw_zero(rho_r)
222  CALL pw_multiply(rho_r, rho_i(iloc), rho_j(jloc))
223 
224  ! go the g-space and compute hartree energy
225  CALL pw_transfer(rho_r, rho_g)
226  CALL pw_poisson_solve(poisson_env, rho_g, pair_energy, pot_g, &
227  greenfn=greenfn)
228 
229  ! sum up to the full energy
230  scaling = fraction
231  IF (SIZE(mo_array) == 1) scaling = scaling*2.0_dp
232  IF (iorb /= jorb) scaling = scaling*2.0_dp
233 
234  exchange_energy = exchange_energy - scaling*pair_energy
235 
236  END DO
237  END DO
238 
239  END DO
240  END DO
241  END DO
242 
243  DO iorb_block = 1, blocksize
244  CALL rho_i(iorb_block)%release()
245  CALL rho_j(iorb_block)%release()
246  END DO
247 
248  CALL auxbas_pw_pool%give_back_pw(rho_r)
249  CALL auxbas_pw_pool%give_back_pw(rho_g)
250  CALL auxbas_pw_pool%give_back_pw(pot_g)
251  CALL auxbas_pw_pool%give_back_pw(greenfn)
252 
253  iw = cp_print_key_unit_nr(logger, hfx_section, "HF_INFO", &
254  extension=".scfLog")
255 
256  IF (iw > 0) THEN
257  WRITE (unit=iw, fmt="((T3,A,T61,F20.10))") &
258  "HF_PW_HFX| PW exchange energy:", exchange_energy
259  WRITE (unit=iw, fmt="((T3,A,T61,F20.10),/)") &
260  "HF_PW_HFX| Gaussian exchange energy:", ehfx
261  END IF
262 
263  CALL cp_print_key_finished_output(iw, logger, hfx_section, "HF_INFO")
264 
265  END IF
266 
267  CALL timestop(handle)
268 
269  END SUBROUTINE pw_hfx
270 
271 END MODULE hfx_pw_methods
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Definition: cell_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
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
Definition: cp_fm_types.F:1016
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
Test routines for HFX caclulations using PW.
subroutine, public pw_hfx(qs_env, ehfx, hfx_section, poisson_env, auxbas_pw_pool, irep)
computes the Hartree-Fock energy brute force in a pw basis
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_potential_truncated
integer, parameter, public do_potential_coulomb
integer, parameter, public do_potential_short
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
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Definition of mathematical constants and functions.
Definition: mathconstants.F:16
real(kind=dp), parameter, public fourpi
Define the data structure for the particle information.
container for various plainwaves related things
Definition: pw_env_types.F:14
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Definition: pw_pool_types.F:24
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type, external_vector)
maps a given wavefunction on the grid
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, 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_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, ecoul_1c, rho0_s_rs, rho0_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, 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, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
Definition: qs_kind_types.F:23
Definition and initialisation of the mo data type.
Definition: qs_mo_types.F:22
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.
Definition: qs_mo_types.F:397