Line data Source code
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 given the response wavefunctions obtained by the application 10 : !> of the (rxp), p, and ((dk-dl)xp) operators, 11 : !> here the current density vector (jx, jy, jz) 12 : !> is computed for the 3 directions of the magnetic field (Bx, By, Bz) 13 : !> \par History 14 : !> created 02-2006 [MI] 15 : !> \author MI 16 : ! ************************************************************************************************** 17 : MODULE qs_linres_nmr_epr_common_utils 18 : USE kinds, ONLY: dp 19 : USE mathconstants, ONLY: gaussi 20 : USE pw_grid_types, ONLY: pw_grid_type 21 : USE pw_methods, ONLY: pw_transfer 22 : USE pw_pool_types, ONLY: pw_pool_type 23 : USE pw_types, ONLY: pw_c1d_gs_type 24 : #include "./base/base_uses.f90" 25 : 26 : IMPLICIT NONE 27 : 28 : PRIVATE 29 : 30 : ! *** Public subroutines *** 31 : PUBLIC :: mult_G_ov_G2_grid 32 : 33 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_linres_nmr_epr_common_utils' 34 : 35 : CONTAINS 36 : 37 : ! ************************************************************************************************** 38 : !> \brief Given the current density on the PW grid in reciprcal space 39 : !> (obtained by FFT), calculate the integral 40 : !> \int_{r}[ ((r-r') x j(r))/|r-r'|^3 ] = Bind(r') 41 : !> which in reciprcal space reads (for G/=0) 42 : !> i G/|G|^2 x J(G) 43 : !> \param pw_pool ... 44 : !> \param rho_gspace ... 45 : !> \param funcG_times_rho ... 46 : !> \param idir ... 47 : !> \param my_chi ... 48 : !> \author MI 49 : !> \note 50 : !> The G=0 component is not comnputed here, but can be evaluated 51 : !> through the susceptibility and added to the shift in a second time 52 : !> 53 : !> This method would not work for a non periodic system 54 : !> It should be generalized like the calculation of Hartree 55 : ! ************************************************************************************************** 56 4500 : SUBROUTINE mult_G_ov_G2_grid(pw_pool, rho_gspace, funcG_times_rho, idir, my_chi) 57 : 58 : TYPE(pw_pool_type), POINTER :: pw_pool 59 : TYPE(pw_c1d_gs_type), INTENT(IN) :: rho_gspace 60 : TYPE(pw_c1d_gs_type), INTENT(INOUT) :: funcG_times_rho 61 : INTEGER, INTENT(IN) :: idir 62 : REAL(dp), INTENT(IN) :: my_chi 63 : 64 : INTEGER :: handle, ig, ng 65 : REAL(dp) :: g2 66 : TYPE(pw_c1d_gs_type) :: influence_fn 67 : TYPE(pw_grid_type), POINTER :: grid 68 : CHARACTER(len=*), PARAMETER :: routineN = 'mult_G_ov_G2_grid' 69 : 70 4500 : CALL timeset(routineN, handle) 71 : 72 4500 : CALL pw_pool%create_pw(influence_fn) 73 : 74 4500 : grid => influence_fn%pw_grid 75 87683778 : DO ig = grid%first_gne0, grid%ngpts_cut_local 76 87679278 : g2 = grid%gsq(ig) 77 87683778 : influence_fn%array(ig) = gaussi*grid%g(idir, ig)/g2 78 : END DO ! ig 79 4500 : IF (grid%have_g0) influence_fn%array(1) = 0.0_dp 80 : 81 4500 : CALL pw_transfer(rho_gspace, funcG_times_rho) 82 : 83 4500 : ng = SIZE(grid%gsq) 84 87686028 : funcG_times_rho%array(1:ng) = funcG_times_rho%array(1:ng)*influence_fn%array(1:ng) 85 4500 : IF (grid%have_g0) funcG_times_rho%array(1) = my_chi 86 : 87 4500 : CALL pw_pool%give_back_pw(influence_fn) 88 : 89 4500 : CALL timestop(handle) 90 : 91 4500 : END SUBROUTINE mult_G_ov_G2_grid 92 : 93 : END MODULE qs_linres_nmr_epr_common_utils