LCOV - code coverage report
Current view: top level - src - qs_linres_epr_nablavks.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 88.0 % 308 271
Test Date: 2025-12-04 06:27:48 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Calculates Nabla V_KS (local part if PSP) on the different grids
      10              : !> \par History
      11              : !>       created 06-2007 [RD]
      12              : !> \author RD
      13              : ! **************************************************************************************************
      14              : MODULE qs_linres_epr_nablavks
      15              :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      16              :                                               get_atomic_kind
      17              :    USE cell_types,                      ONLY: cell_type
      18              :    USE cp_control_types,                ONLY: dft_control_type
      19              :    USE cp_dbcsr_api,                    ONLY: dbcsr_p_type
      20              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      21              :                                               cp_logger_type
      22              :    USE cp_output_handling,              ONLY: cp_p_file,&
      23              :                                               cp_print_key_finished_output,&
      24              :                                               cp_print_key_should_output,&
      25              :                                               cp_print_key_unit_nr
      26              :    USE cp_realspace_grid_cube,          ONLY: cp_pw_to_cube
      27              :    USE external_potential_types,        ONLY: all_potential_type,&
      28              :                                               get_potential,&
      29              :                                               gth_potential_type,&
      30              :                                               sgp_potential_type
      31              :    USE hartree_local_methods,           ONLY: calculate_Vh_1center
      32              :    USE input_section_types,             ONLY: section_get_ivals,&
      33              :                                               section_vals_get_subs_vals,&
      34              :                                               section_vals_type,&
      35              :                                               section_vals_val_get
      36              :    USE kinds,                           ONLY: default_string_length,&
      37              :                                               dp
      38              :    USE mathconstants,                   ONLY: rootpi,&
      39              :                                               twopi
      40              :    USE message_passing,                 ONLY: mp_para_env_type
      41              :    USE particle_list_types,             ONLY: particle_list_type
      42              :    USE particle_types,                  ONLY: particle_type
      43              :    USE pw_env_types,                    ONLY: pw_env_get,&
      44              :                                               pw_env_type
      45              :    USE pw_methods,                      ONLY: pw_axpy,&
      46              :                                               pw_copy,&
      47              :                                               pw_derive,&
      48              :                                               pw_transfer,&
      49              :                                               pw_zero
      50              :    USE pw_poisson_methods,              ONLY: pw_poisson_solve
      51              :    USE pw_poisson_types,                ONLY: pw_poisson_type
      52              :    USE pw_pool_types,                   ONLY: pw_pool_type
      53              :    USE pw_types,                        ONLY: pw_c1d_gs_type,&
      54              :                                               pw_r3d_rs_type
      55              :    USE qs_cneo_types,                   ONLY: cneo_potential_type
      56              :    USE qs_environment_types,            ONLY: get_qs_env,&
      57              :                                               qs_environment_type
      58              :    USE qs_gapw_densities,               ONLY: prepare_gapw_den
      59              :    USE qs_grid_atom,                    ONLY: grid_atom_type
      60              :    USE qs_harmonics_atom,               ONLY: harmonics_atom_type
      61              :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      62              :                                               qs_kind_type
      63              :    USE qs_ks_methods,                   ONLY: calc_rho_tot_gspace
      64              :    USE qs_ks_types,                     ONLY: qs_ks_env_type
      65              :    USE qs_linres_types,                 ONLY: epr_env_type,&
      66              :                                               get_epr_env,&
      67              :                                               nablavks_atom_type
      68              : ! R0
      69              :    USE qs_local_rho_types,              ONLY: rhoz_type
      70              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type
      71              :    USE qs_oce_types,                    ONLY: oce_matrix_type
      72              :    USE qs_rho0_types,                   ONLY: rho0_atom_type
      73              :    USE qs_rho_atom_methods,             ONLY: calculate_rho_atom_coeff
      74              :    USE qs_rho_atom_types,               ONLY: get_rho_atom,&
      75              :                                               rho_atom_coeff,&
      76              :                                               rho_atom_type
      77              : ! R0
      78              :    USE qs_rho_types,                    ONLY: qs_rho_get,&
      79              :                                               qs_rho_p_type,&
      80              :                                               qs_rho_type
      81              :    USE qs_subsys_types,                 ONLY: qs_subsys_get,&
      82              :                                               qs_subsys_type
      83              :    USE qs_vxc,                          ONLY: qs_vxc_create
      84              :    USE qs_vxc_atom,                     ONLY: calculate_vxc_atom_epr
      85              :    USE util,                            ONLY: get_limit
      86              : #include "./base/base_uses.f90"
      87              : 
      88              :    IMPLICIT NONE
      89              : 
      90              :    PRIVATE
      91              :    PUBLIC :: epr_nablavks
      92              : 
      93              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_linres_epr_nablavks'
      94              : 
      95              : CONTAINS
      96              : 
      97              : ! **************************************************************************************************
      98              : !> \brief Evaluates Nabla V_KS on the grids
      99              : !> \param epr_env ...
     100              : !> \param qs_env ...
     101              : !> \par History
     102              : !>      06.2006 created [RD]
     103              : !> \author RD
     104              : ! **************************************************************************************************
     105           14 :    SUBROUTINE epr_nablavks(epr_env, qs_env)
     106              : 
     107              :       TYPE(epr_env_type)                                 :: epr_env
     108              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     109              : 
     110              :       CHARACTER(LEN=default_string_length)               :: ext, filename
     111              :       COMPLEX(KIND=dp)                                   :: gtemp
     112              :       INTEGER                                            :: bo_atom(2), ia, iat, iatom, idir, iexp, &
     113              :                                                             ig, ikind, ir, iso, ispin, ix, iy, iz, &
     114              :                                                             natom, nexp_ppl, nkind, nspins, &
     115              :                                                             output_unit, unit_nr
     116              :       INTEGER, DIMENSION(2, 3)                           :: bo
     117           14 :       INTEGER, DIMENSION(:), POINTER                     :: atom_list
     118              :       LOGICAL                                            :: gapw, gapw_xc, gth_gspace, ionode, &
     119              :                                                             make_soft, mpi_io, paw_atom
     120              :       REAL(KIND=dp) :: alpha, alpha_core, arg, charge, ehartree, exc, exc1, exp_rap, &
     121              :          gapw_max_alpha, hard_radius, hard_value, soft_value, sqrt_alpha, sqrt_rap
     122           14 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: vh1_rad_h, vh1_rad_s
     123              :       REAL(KIND=dp), DIMENSION(3)                        :: rap, ratom, roffset, rpoint
     124           14 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: cexp_ppl, rho_rad_z
     125           14 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: rho_rad_0
     126              :       TYPE(all_potential_type), POINTER                  :: all_potential
     127           14 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     128              :       TYPE(cell_type), POINTER                           :: cell
     129              :       TYPE(cneo_potential_type), POINTER                 :: cneo_potential
     130              :       TYPE(cp_logger_type), POINTER                      :: logger
     131           14 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: rho_ao
     132              :       TYPE(dft_control_type), POINTER                    :: dft_control
     133              :       TYPE(grid_atom_type), POINTER                      :: grid_atom
     134              :       TYPE(gth_potential_type), POINTER                  :: gth_potential
     135              :       TYPE(harmonics_atom_type), POINTER                 :: harmonics
     136              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     137           14 :       TYPE(nablavks_atom_type), DIMENSION(:), POINTER    :: nablavks_atom_set
     138              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     139           14 :          POINTER                                         :: sab
     140              :       TYPE(oce_matrix_type), POINTER                     :: oce
     141              :       TYPE(particle_list_type), POINTER                  :: particles
     142           14 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     143              :       TYPE(pw_c1d_gs_type)                               :: rho_tot_gspace, v_coulomb_gspace, &
     144              :                                                             v_coulomb_gtemp, v_hartree_gspace, &
     145              :                                                             v_hartree_gtemp, v_xc_gtemp
     146              :       TYPE(pw_env_type), POINTER                         :: pw_env
     147              :       TYPE(pw_poisson_type), POINTER                     :: poisson_env
     148              :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
     149              :       TYPE(pw_r3d_rs_type)                               :: v_coulomb_rtemp, v_hartree_rtemp, &
     150              :                                                             v_xc_rtemp, wf_r
     151           14 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho1_r, rho2_r, rho_r, v_rspace_new, &
     152           14 :                                                             v_tau_rspace
     153              :       TYPE(pw_r3d_rs_type), POINTER                      :: pwx, pwy, pwz
     154           14 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     155              :       TYPE(qs_ks_env_type), POINTER                      :: ks_env
     156           14 :       TYPE(qs_rho_p_type), DIMENSION(:, :), POINTER      :: nablavks_set
     157              :       TYPE(qs_rho_type), POINTER                         :: rho, rho_xc
     158              :       TYPE(qs_subsys_type), POINTER                      :: subsys
     159           14 :       TYPE(rho0_atom_type), DIMENSION(:), POINTER        :: rho0_atom_set
     160           14 :       TYPE(rho_atom_coeff), DIMENSION(:), POINTER        :: rho_rad_h, rho_rad_s
     161           14 :       TYPE(rho_atom_coeff), DIMENSION(:, :), POINTER     :: nablavks_vec_rad_h, nablavks_vec_rad_s
     162           14 :       TYPE(rho_atom_type), DIMENSION(:), POINTER         :: rho_atom_set
     163              :       TYPE(rho_atom_type), POINTER                       :: rho_atom
     164           14 :       TYPE(rhoz_type), DIMENSION(:), POINTER             :: rhoz_set
     165              :       TYPE(section_vals_type), POINTER                   :: g_section, input, lr_section, xc_section
     166              :       TYPE(sgp_potential_type), POINTER                  :: sgp_potential
     167              : 
     168              : ! R0
     169              : ! R0
     170              : ! R0
     171              : ! R0
     172              : ! R0
     173              : ! R0
     174              : 
     175           14 :       NULLIFY (auxbas_pw_pool)
     176           14 :       NULLIFY (cell)
     177           14 :       NULLIFY (dft_control)
     178           14 :       NULLIFY (g_section)
     179           14 :       NULLIFY (logger)
     180           14 :       NULLIFY (lr_section)
     181           14 :       NULLIFY (nablavks_set)
     182           14 :       NULLIFY (nablavks_atom_set) ! R0
     183           14 :       NULLIFY (nablavks_vec_rad_h) ! R0
     184           14 :       NULLIFY (nablavks_vec_rad_s) ! R0
     185           14 :       NULLIFY (para_env)
     186           14 :       NULLIFY (particle_set)
     187           14 :       NULLIFY (particles)
     188           14 :       NULLIFY (poisson_env)
     189           14 :       NULLIFY (pw_env)
     190           14 :       NULLIFY (pwx) ! R0
     191           14 :       NULLIFY (pwy) ! R0
     192           14 :       NULLIFY (pwz) ! R0
     193           14 :       NULLIFY (rho)
     194           14 :       NULLIFY (rho_xc)
     195           14 :       NULLIFY (rho0_atom_set)
     196           14 :       NULLIFY (rho_atom_set)
     197           14 :       NULLIFY (rhoz_set)
     198           14 :       NULLIFY (subsys)
     199           14 :       NULLIFY (v_rspace_new)
     200           14 :       NULLIFY (v_tau_rspace)
     201           14 :       NULLIFY (xc_section)
     202           14 :       NULLIFY (input)
     203           14 :       NULLIFY (ks_env)
     204           14 :       NULLIFY (rho_r, rho_ao, rho1_r, rho2_r)
     205           14 :       NULLIFY (oce, qs_kind_set, sab)
     206              : 
     207           28 :       logger => cp_get_default_logger()
     208           14 :       lr_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES")
     209              :       ionode = logger%para_env%is_source()
     210              : 
     211              :       output_unit = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", &
     212           14 :                                          extension=".linresLog")
     213              : 
     214              : !   -------------------------------------
     215              : !   Read settings
     216              : !   -------------------------------------
     217              : 
     218              :       g_section => section_vals_get_subs_vals(lr_section, &
     219           14 :                                               "EPR%PRINT%G_TENSOR")
     220              : 
     221           14 :       CALL section_vals_val_get(g_section, "gapw_max_alpha", r_val=gapw_max_alpha)
     222              : 
     223           14 :       gth_gspace = .TRUE.
     224              : 
     225              : !   -------------------------------------
     226              : !   Get nablavks arrays
     227              : !   -------------------------------------
     228              : 
     229              :       CALL get_epr_env(epr_env, nablavks_set=nablavks_set, & ! R0
     230           14 :                        nablavks_atom_set=nablavks_atom_set) ! R0
     231              :       ! R0
     232              : 
     233           42 :       DO ispin = 1, SIZE(nablavks_set, 2)
     234          126 :          DO idir = 1, SIZE(nablavks_set, 1)
     235           84 :             CALL qs_rho_get(nablavks_set(idir, ispin)%rho, rho_r=rho_r)
     236          112 :             CALL pw_zero(rho_r(1))
     237              :          END DO
     238              :       END DO
     239              : 
     240           14 :       CALL qs_rho_get(nablavks_set(1, 1)%rho, rho_r=rho_r)
     241           14 :       pwx => rho_r(1)
     242           14 :       CALL qs_rho_get(nablavks_set(2, 1)%rho, rho_r=rho_r)
     243           14 :       pwy => rho_r(1)
     244           14 :       CALL qs_rho_get(nablavks_set(3, 1)%rho, rho_r=rho_r)
     245           14 :       pwz => rho_r(1)
     246              : 
     247           56 :       roffset = -REAL(MODULO(pwx%pw_grid%npts, 2), dp)*pwx%pw_grid%dr/2.0_dp
     248              : 
     249              : !   -------------------------------------
     250              : !   Get grids / atom info
     251              : !   -------------------------------------
     252              : 
     253              :       CALL get_qs_env(qs_env=qs_env, &
     254              :                       atomic_kind_set=atomic_kind_set, &
     255              :                       qs_kind_set=qs_kind_set, &
     256              :                       input=input, &
     257              :                       cell=cell, &
     258              :                       dft_control=dft_control, &
     259              :                       para_env=para_env, &
     260              :                       particle_set=particle_set, &
     261              :                       pw_env=pw_env, &
     262              :                       rho=rho, &
     263              :                       rho_xc=rho_xc, &
     264              :                       rho_atom_set=rho_atom_set, &
     265              :                       rho0_atom_set=rho0_atom_set, &
     266              :                       rhoz_set=rhoz_set, &
     267              :                       subsys=subsys, &
     268              :                       ks_env=ks_env, &
     269           14 :                       oce=oce, sab_orb=sab)
     270              : 
     271              :       CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
     272           14 :                       poisson_env=poisson_env)
     273              : 
     274           14 :       CALL qs_subsys_get(subsys, particles=particles)
     275              : 
     276           14 :       gapw = dft_control%qs_control%gapw
     277           14 :       gapw_xc = dft_control%qs_control%gapw_xc
     278           14 :       nkind = SIZE(atomic_kind_set)
     279           14 :       nspins = dft_control%nspins
     280              : 
     281              : !   -------------------------------------
     282              : !   Add Hartree potential
     283              : !   -------------------------------------
     284              : 
     285           14 :       CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
     286           14 :       CALL auxbas_pw_pool%create_pw(v_hartree_gtemp)
     287           14 :       CALL auxbas_pw_pool%create_pw(v_hartree_rtemp)
     288           14 :       CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
     289              : 
     290           14 :       IF (gapw) THEN
     291              :          ! need to rebuild the coeff !
     292           10 :          CALL qs_rho_get(rho, rho_ao_kp=rho_ao)
     293           10 :          CALL calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
     294              : 
     295           10 :          CALL prepare_gapw_den(qs_env, do_rho0=.TRUE.)
     296              :       END IF
     297              : 
     298           14 :       CALL pw_zero(rho_tot_gspace)
     299              : 
     300              :       CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, &
     301           14 :                                skip_nuclear_density=.NOT. gapw)
     302              : 
     303              :       CALL pw_poisson_solve(poisson_env, rho_tot_gspace, ehartree, &
     304           14 :                             v_hartree_gspace)
     305              : 
     306              :       !   -------------------------------------
     307              :       !   Atomic grids part
     308              :       !   -------------------------------------
     309              : 
     310           14 :       IF (gapw) THEN
     311              : 
     312           30 :          DO ikind = 1, nkind ! loop over atom types
     313              : 
     314           20 :             NULLIFY (atom_list)
     315           20 :             NULLIFY (grid_atom)
     316           20 :             NULLIFY (harmonics)
     317              :             NULLIFY (rho_rad_z)
     318              : 
     319           20 :             rho_rad_z => rhoz_set(ikind)%r_coef
     320              : 
     321           20 :             CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=natom)
     322              :             CALL get_qs_kind(qs_kind_set(ikind), &
     323              :                              grid_atom=grid_atom, &
     324              :                              harmonics=harmonics, &
     325              :                              hard_radius=hard_radius, &
     326              :                              paw_atom=paw_atom, &
     327              :                              zeff=charge, &
     328           20 :                              alpha_core_charge=alpha_core)
     329              : 
     330           30 :             IF (paw_atom) THEN
     331              : 
     332           80 :                ALLOCATE (vh1_rad_h(grid_atom%nr, harmonics%max_iso_not0))
     333           60 :                ALLOCATE (vh1_rad_s(grid_atom%nr, harmonics%max_iso_not0))
     334              : 
     335              :                ! DO iat = 1, natom ! natom = # atoms for ikind
     336              :                !
     337              :                !    iatom = atom_list(iat)
     338              :                !    ratom = particle_set(iatom)%r
     339              :                !
     340              :                !    DO ig = v_hartree_gspace%pw_grid%first_gne0,v_hartree_gspace%pw_grid%ngpts_cut_local
     341              :                !
     342              :                !       gtemp = fourpi * charge / cell%deth * &
     343              :                !               EXP ( - v_hartree_gspace%pw_grid%gsq(ig) / (4.0_dp * alpha_core) ) &
     344              :                !               / v_hartree_gspace%pw_grid%gsq(ig)
     345              :                !
     346              :                !       arg = DOT_PRODUCT(v_hartree_gspace%pw_grid%g(:,ig),ratom)
     347              :                !
     348              :                !       gtemp = gtemp * CMPLX(COS(arg),-SIN(arg),KIND=dp)
     349              :                !
     350              :                !       v_hartree_gspace%array(ig) = v_hartree_gspace%array(ig) + gtemp
     351              :                !    END DO
     352              :                !    IF ( v_hartree_gspace%pw_grid%have_g0 ) v_hartree_gspace%array(1) = 0.0_dp
     353              :                !
     354              :                ! END DO
     355              : 
     356           20 :                bo_atom = get_limit(natom, para_env%num_pe, para_env%mepos)
     357              : 
     358           35 :                DO iat = bo_atom(1), bo_atom(2) ! natomkind = # atoms for ikind
     359              : 
     360           15 :                   iatom = atom_list(iat)
     361           60 :                   ratom = particle_set(iatom)%r
     362              : 
     363           15 :                   nablavks_vec_rad_h => nablavks_atom_set(iatom)%nablavks_vec_rad_h
     364           15 :                   nablavks_vec_rad_s => nablavks_atom_set(iatom)%nablavks_vec_rad_s
     365              : 
     366           45 :                   DO ispin = 1, nspins
     367          135 :                      DO idir = 1, 3
     368       229590 :                         nablavks_vec_rad_h(idir, ispin)%r_coef(:, :) = 0.0_dp
     369       229620 :                         nablavks_vec_rad_s(idir, ispin)%r_coef(:, :) = 0.0_dp
     370              :                      END DO ! idir
     371              :                   END DO ! ispin
     372              : 
     373           15 :                   rho_atom => rho_atom_set(iatom)
     374           15 :                   NULLIFY (rho_rad_h, rho_rad_s, rho_rad_0)
     375              :                   CALL get_rho_atom(rho_atom=rho_atom, rho_rad_h=rho_rad_h, &
     376           15 :                                     rho_rad_s=rho_rad_s)
     377           15 :                   rho_rad_0 => rho0_atom_set(iatom)%rho0_rad_h%r_coef
     378         9348 :                   vh1_rad_h = 0.0_dp
     379         9348 :                   vh1_rad_s = 0.0_dp
     380              : 
     381           15 :                   CALL calculate_Vh_1center(vh1_rad_h, vh1_rad_s, rho_rad_h, rho_rad_s, rho_rad_0, rho_rad_z, grid_atom)
     382              : 
     383          750 :                   DO ir = 2, grid_atom%nr
     384              : 
     385          735 :                      IF (grid_atom%rad(ir) >= hard_radius) CYCLE
     386              : 
     387        21435 :                      DO ia = 1, grid_atom%ng_sphere
     388              : 
     389              :                         ! hard part
     390              : 
     391        84000 :                         DO idir = 1, 3
     392        63000 :                            hard_value = 0.0_dp
     393       831600 :                            DO iso = 1, harmonics%max_iso_not0
     394              :                               hard_value = hard_value + &
     395              :                                            vh1_rad_h(ir, iso)*harmonics%dslm_dxyz(idir, ia, iso) + &
     396              :                                            harmonics%slm(ia, iso)* &
     397              :                                            (vh1_rad_h(ir - 1, iso) - vh1_rad_h(ir, iso))/ &
     398              :                                            (grid_atom%rad(ir - 1) - grid_atom%rad(ir))* &
     399       831600 :                                            (harmonics%a(idir, ia))
     400              :                            END DO
     401        84000 :                            nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) = hard_value
     402              :                         END DO
     403              : 
     404              :                         ! soft part
     405              : 
     406        84735 :                         DO idir = 1, 3
     407        63000 :                            soft_value = 0.0_dp
     408       831600 :                            DO iso = 1, harmonics%max_iso_not0
     409              :                               soft_value = soft_value + &
     410              :                                            vh1_rad_s(ir, iso)*harmonics%dslm_dxyz(idir, ia, iso) + &
     411              :                                            harmonics%slm(ia, iso)* &
     412              :                                            (vh1_rad_s(ir - 1, iso) - vh1_rad_s(ir, iso))/ &
     413              :                                            (grid_atom%rad(ir - 1) - grid_atom%rad(ir))* &
     414       831600 :                                            (harmonics%a(idir, ia))
     415              :                            END DO
     416        84000 :                            nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) = soft_value
     417              :                         END DO
     418              : 
     419              :                      END DO ! ia
     420              : 
     421              :                   END DO ! ir
     422              : 
     423           80 :                   DO idir = 1, 3
     424       114795 :                      nablavks_vec_rad_h(idir, 2)%r_coef(:, :) = nablavks_vec_rad_h(idir, 1)%r_coef(:, :)
     425       114810 :                      nablavks_vec_rad_s(idir, 2)%r_coef(:, :) = nablavks_vec_rad_s(idir, 1)%r_coef(:, :)
     426              :                   END DO
     427              : 
     428              :                END DO ! iat
     429              : 
     430           20 :                DEALLOCATE (vh1_rad_h)
     431           20 :                DEALLOCATE (vh1_rad_s)
     432              : 
     433              :             END IF ! paw_atom
     434              : 
     435              :          END DO ! ikind
     436              : 
     437              :       END IF ! gapw
     438              : 
     439           14 :       CALL pw_copy(v_hartree_gspace, v_hartree_gtemp)
     440           14 :       CALL pw_derive(v_hartree_gtemp, [1, 0, 0])
     441           14 :       CALL pw_transfer(v_hartree_gtemp, v_hartree_rtemp)
     442           14 :       CALL pw_copy(v_hartree_rtemp, pwx)
     443              : 
     444           14 :       CALL pw_copy(v_hartree_gspace, v_hartree_gtemp)
     445           14 :       CALL pw_derive(v_hartree_gtemp, [0, 1, 0])
     446           14 :       CALL pw_transfer(v_hartree_gtemp, v_hartree_rtemp)
     447           14 :       CALL pw_copy(v_hartree_rtemp, pwy)
     448              : 
     449           14 :       CALL pw_copy(v_hartree_gspace, v_hartree_gtemp)
     450           14 :       CALL pw_derive(v_hartree_gtemp, [0, 0, 1])
     451           14 :       CALL pw_transfer(v_hartree_gtemp, v_hartree_rtemp)
     452           14 :       CALL pw_copy(v_hartree_rtemp, pwz)
     453              : 
     454           14 :       CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
     455           14 :       CALL auxbas_pw_pool%give_back_pw(v_hartree_gtemp)
     456           14 :       CALL auxbas_pw_pool%give_back_pw(v_hartree_rtemp)
     457           14 :       CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
     458              : 
     459              : !   -------------------------------------
     460              : !   Add Coulomb potential
     461              : !   -------------------------------------
     462              : 
     463           42 :       DO ikind = 1, nkind ! loop over atom types
     464              : 
     465           28 :          NULLIFY (atom_list)
     466           28 :          NULLIFY (grid_atom)
     467           28 :          NULLIFY (harmonics)
     468              : 
     469           28 :          CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=natom)
     470              :          CALL get_qs_kind(qs_kind_set(ikind), &
     471              :                           grid_atom=grid_atom, &
     472              :                           harmonics=harmonics, &
     473              :                           hard_radius=hard_radius, &
     474              :                           gth_potential=gth_potential, &
     475              :                           sgp_potential=sgp_potential, &
     476              :                           all_potential=all_potential, &
     477              :                           cneo_potential=cneo_potential, &
     478           28 :                           paw_atom=paw_atom)
     479              : 
     480           42 :          IF (ASSOCIATED(gth_potential)) THEN
     481              : 
     482           12 :             NULLIFY (cexp_ppl)
     483              : 
     484              :             CALL get_potential(potential=gth_potential, &
     485              :                                zeff=charge, &
     486              :                                alpha_ppl=alpha, &
     487              :                                nexp_ppl=nexp_ppl, &
     488           12 :                                cexp_ppl=cexp_ppl)
     489              : 
     490           12 :             sqrt_alpha = SQRT(alpha)
     491              : 
     492           12 :             IF (gapw .AND. paw_atom .AND. alpha > gapw_max_alpha) THEN
     493              :                make_soft = .TRUE.
     494              :             ELSE
     495            8 :                make_soft = .FALSE.
     496              :             END IF
     497              : 
     498              :             !   -------------------------------------
     499              :             !   PW grid part
     500              :             !   -------------------------------------
     501              : 
     502              :             IF (gth_gspace) THEN
     503              : 
     504           12 :                CALL auxbas_pw_pool%create_pw(v_coulomb_gspace)
     505           12 :                CALL auxbas_pw_pool%create_pw(v_coulomb_gtemp)
     506           12 :                CALL auxbas_pw_pool%create_pw(v_coulomb_rtemp)
     507              : 
     508           12 :                CALL pw_zero(v_coulomb_gspace)
     509              : 
     510           30 :                DO iat = 1, natom ! natom = # atoms for ikind
     511              : 
     512           18 :                   iatom = atom_list(iat)
     513           72 :                   ratom = particle_set(iatom)%r
     514              : 
     515       820134 :                   DO ig = v_coulomb_gspace%pw_grid%first_gne0, v_coulomb_gspace%pw_grid%ngpts_cut_local
     516       820116 :                      gtemp = 0.0_dp
     517              :                      ! gtemp = - fourpi * charge / cell%deth * &
     518              :                      !         EXP ( - v_coulomb_gspace%pw_grid%gsq(ig) / (4.0_dp * alpha) ) &
     519              :                      !         / v_coulomb_gspace%pw_grid%gsq(ig)
     520              : 
     521       820116 :                      IF (.NOT. make_soft) THEN
     522              : 
     523            0 :                         SELECT CASE (nexp_ppl)
     524              :                         CASE (1)
     525              :                            gtemp = gtemp + &
     526              :                                    (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
     527              :                                    EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
     528              :                                    ! C1
     529              :                                    +cexp_ppl(1) &
     530            0 :                                    )
     531              :                         CASE (2)
     532              :                            gtemp = gtemp + &
     533              :                                    (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
     534              :                                    EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
     535              :                                    ! C1
     536              :                                    +cexp_ppl(1) &
     537              :                                    ! C2
     538              :                                    + cexp_ppl(2)/(2.0_dp*alpha)* &
     539              :                                    (3.0_dp - v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha)) &
     540       546744 :                                    )
     541              :                         CASE (3)
     542              :                            gtemp = gtemp + &
     543              :                                    (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
     544              :                                    EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
     545              :                                    ! C1
     546              :                                    +cexp_ppl(1) &
     547              :                                    ! C2
     548              :                                    + cexp_ppl(2)/(2.0_dp*alpha)* &
     549              :                                    (3.0_dp - v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha)) &
     550              :                                    ! C3
     551              :                                    + cexp_ppl(3)/(2.0_dp*alpha)**2* &
     552              :                                    (15.0_dp - 10.0_dp*v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha) &
     553              :                                     + (v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**2) &
     554            0 :                                    )
     555              :                         CASE (4)
     556              :                            gtemp = gtemp + &
     557              :                                    (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
     558              :                                    EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
     559              :                                    ! C1
     560              :                                    +cexp_ppl(1) &
     561              :                                    ! C2
     562              :                                    + cexp_ppl(2)/(2.0_dp*alpha)* &
     563              :                                    (3.0_dp - v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha)) &
     564              :                                    ! C3
     565              :                                    + cexp_ppl(3)/(2.0_dp*alpha)**2* &
     566              :                                    (15.0_dp - 10.0_dp*v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha) &
     567              :                                     + (v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**2) &
     568              :                                    ! C4
     569              :                                    + cexp_ppl(4)/(2.0_dp*alpha)**3* &
     570              :                                    (105.0_dp - 105.0_dp*v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha) &
     571              :                                     + 21.0_dp*(v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**2 &
     572              :                                     - (v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**3) &
     573       546744 :                                    )
     574              :                         END SELECT
     575              : 
     576              :                      END IF
     577              : 
     578      3280464 :                      arg = DOT_PRODUCT(v_coulomb_gspace%pw_grid%g(:, ig), ratom)
     579              : 
     580       820116 :                      gtemp = gtemp*CMPLX(COS(arg), -SIN(arg), KIND=dp)
     581       820134 :                      v_coulomb_gspace%array(ig) = v_coulomb_gspace%array(ig) + gtemp
     582              :                   END DO
     583           30 :                   IF (v_coulomb_gspace%pw_grid%have_g0) v_coulomb_gspace%array(1) = 0.0_dp
     584              : 
     585              :                END DO
     586              : 
     587           12 :                CALL pw_copy(v_coulomb_gspace, v_coulomb_gtemp)
     588           12 :                CALL pw_derive(v_coulomb_gtemp, [1, 0, 0])
     589           12 :                CALL pw_transfer(v_coulomb_gtemp, v_coulomb_rtemp)
     590           12 :                CALL pw_axpy(v_coulomb_rtemp, pwx)
     591              : 
     592           12 :                CALL pw_copy(v_coulomb_gspace, v_coulomb_gtemp)
     593           12 :                CALL pw_derive(v_coulomb_gtemp, [0, 1, 0])
     594           12 :                CALL pw_transfer(v_coulomb_gtemp, v_coulomb_rtemp)
     595           12 :                CALL pw_axpy(v_coulomb_rtemp, pwy)
     596              : 
     597           12 :                CALL pw_copy(v_coulomb_gspace, v_coulomb_gtemp)
     598           12 :                CALL pw_derive(v_coulomb_gtemp, [0, 0, 1])
     599           12 :                CALL pw_transfer(v_coulomb_gtemp, v_coulomb_rtemp)
     600           12 :                CALL pw_axpy(v_coulomb_rtemp, pwz)
     601              : 
     602           12 :                CALL auxbas_pw_pool%give_back_pw(v_coulomb_gspace)
     603           12 :                CALL auxbas_pw_pool%give_back_pw(v_coulomb_gtemp)
     604           12 :                CALL auxbas_pw_pool%give_back_pw(v_coulomb_rtemp)
     605              :             ELSE
     606              : 
     607              :                ! Attic of the atomic parallellisation
     608              :                !
     609              :                ! bo(2)
     610              :                ! bo = get_limit(natom, para_env%num_pe, para_env%mepos)
     611              :                ! DO iat =  bo(1),bo(2) ! natom = # atoms for ikind
     612              :                ! DO ix = lbound(pwx%array,1), ubound(pwx%array,1)
     613              :                ! DO iy = lbound(pwx%array,2), ubound(pwx%array,2)
     614              :                ! DO iz = lbound(pwx%array,3), ubound(pwx%array,3)
     615              : 
     616              :                bo = pwx%pw_grid%bounds_local
     617              : 
     618              :                DO iat = 1, natom ! natom = # atoms for ikind
     619              : 
     620              :                   iatom = atom_list(iat)
     621              :                   ratom = particle_set(iatom)%r
     622              : 
     623              :                   DO ix = bo(1, 1), bo(2, 1)
     624              :                      DO iy = bo(1, 2), bo(2, 2)
     625              :                         DO iz = bo(1, 3), bo(2, 3)
     626              :                            rpoint = [REAL(ix, dp)*pwx%pw_grid%dr(1), &
     627              :                                      REAL(iy, dp)*pwx%pw_grid%dr(2), &
     628              :                                      REAL(iz, dp)*pwx%pw_grid%dr(3)]
     629              :                            rpoint = rpoint + roffset
     630              :                            rap = rpoint - ratom
     631              :                            rap(1) = MODULO(rap(1), cell%hmat(1, 1)) - cell%hmat(1, 1)/2._dp
     632              :                            rap(2) = MODULO(rap(2), cell%hmat(2, 2)) - cell%hmat(2, 2)/2._dp
     633              :                            rap(3) = MODULO(rap(3), cell%hmat(3, 3)) - cell%hmat(3, 3)/2._dp
     634              :                            sqrt_rap = SQRT(DOT_PRODUCT(rap, rap))
     635              :                            exp_rap = EXP(-alpha*sqrt_rap**2)
     636              :                            sqrt_rap = MAX(sqrt_rap, 1.e-10_dp)
     637              :                            ! d_x
     638              : 
     639              :                            pwx%array(ix, iy, iz) = pwx%array(ix, iy, iz) + charge*( &
     640              :                                                    -2.0_dp*sqrt_alpha*EXP(-sqrt_rap**2*sqrt_alpha**2)*rap(1) &
     641              :                                                    /(rootpi*sqrt_rap**2) &
     642              :                                                    + erf(sqrt_rap*sqrt_alpha)*rap(1) &
     643              :                                                    /sqrt_rap**3)
     644              : 
     645              :                            ! d_y
     646              : 
     647              :                            pwy%array(ix, iy, iz) = pwy%array(ix, iy, iz) + charge*( &
     648              :                                                    -2.0_dp*sqrt_alpha*EXP(-sqrt_rap**2*sqrt_alpha**2)*rap(2) &
     649              :                                                    /(rootpi*sqrt_rap**2) &
     650              :                                                    + erf(sqrt_rap*sqrt_alpha)*rap(2) &
     651              :                                                    /sqrt_rap**3)
     652              : 
     653              :                            ! d_z
     654              : 
     655              :                            pwz%array(ix, iy, iz) = pwz%array(ix, iy, iz) + charge*( &
     656              :                                                    -2.0_dp*sqrt_alpha*EXP(-sqrt_rap**2*sqrt_alpha**2)*rap(3) &
     657              :                                                    /(rootpi*sqrt_rap**2) &
     658              :                                                    + erf(sqrt_rap*sqrt_alpha)*rap(3) &
     659              :                                                    /sqrt_rap**3)
     660              : 
     661              :                            IF (make_soft) CYCLE
     662              : 
     663              :                            ! d_x
     664              : 
     665              :                            DO iexp = 1, nexp_ppl
     666              :                               pwx%array(ix, iy, iz) = pwx%array(ix, iy, iz) + ( &
     667              :                                                       -2.0_dp*alpha*rap(1)*exp_rap* &
     668              :                                                       cexp_ppl(iexp)*(sqrt_rap**2)**(iexp - 1))
     669              :                               IF (iexp > 1) THEN
     670              :                                  pwx%array(ix, iy, iz) = pwx%array(ix, iy, iz) + ( &
     671              :                                                          2.0_dp*exp_rap*cexp_ppl(iexp)* &
     672              :                                                          (sqrt_rap**2)**(iexp - 2)*REAL(iexp - 1, dp)*rap(1))
     673              :                               END IF
     674              :                            END DO
     675              : 
     676              :                            ! d_y
     677              : 
     678              :                            DO iexp = 1, nexp_ppl
     679              :                               pwy%array(ix, iy, iz) = pwy%array(ix, iy, iz) + ( &
     680              :                                                       -2.0_dp*alpha*rap(2)*exp_rap* &
     681              :                                                       cexp_ppl(iexp)*(sqrt_rap**2)**(iexp - 1))
     682              :                               IF (iexp > 1) THEN
     683              :                                  pwy%array(ix, iy, iz) = pwy%array(ix, iy, iz) + ( &
     684              :                                                          2.0_dp*exp_rap*cexp_ppl(iexp)* &
     685              :                                                          (sqrt_rap**2)**(iexp - 2)*REAL(iexp - 1, dp)*rap(2))
     686              :                               END IF
     687              :                            END DO
     688              : 
     689              :                            ! d_z
     690              : 
     691              :                            DO iexp = 1, nexp_ppl
     692              :                               pwz%array(ix, iy, iz) = pwz%array(ix, iy, iz) + ( &
     693              :                                                       -2.0_dp*alpha*rap(3)*exp_rap* &
     694              :                                                       cexp_ppl(iexp)*(sqrt_rap**2)**(iexp - 1))
     695              :                               IF (iexp > 1) THEN
     696              :                                  pwz%array(ix, iy, iz) = pwz%array(ix, iy, iz) + ( &
     697              :                                                          2.0_dp*exp_rap*cexp_ppl(iexp)* &
     698              :                                                          (sqrt_rap**2)**(iexp - 2)*REAL(iexp - 1, dp)*rap(3))
     699              :                               END IF
     700              :                            END DO
     701              : 
     702              :                         END DO ! iz
     703              :                      END DO ! iy
     704              :                   END DO ! ix
     705              :                END DO ! iat
     706              :             END IF ! gth_gspace
     707              : 
     708              :             !   -------------------------------------
     709              :             !   Atomic grids part
     710              :             !   -------------------------------------
     711              : 
     712           12 :             IF (gapw .AND. paw_atom) THEN
     713              : 
     714            4 :                bo_atom = get_limit(natom, para_env%num_pe, para_env%mepos)
     715              : 
     716            7 :                DO iat = bo_atom(1), bo_atom(2) ! natom = # atoms for ikind
     717              : 
     718            3 :                   iatom = atom_list(iat)
     719              : 
     720            3 :                   nablavks_vec_rad_h => nablavks_atom_set(iatom)%nablavks_vec_rad_h
     721            3 :                   nablavks_vec_rad_s => nablavks_atom_set(iatom)%nablavks_vec_rad_s
     722              : 
     723          153 :                   DO ir = 1, grid_atom%nr
     724              : 
     725          150 :                      IF (grid_atom%rad(ir) >= hard_radius) CYCLE
     726              : 
     727           84 :                      exp_rap = EXP(-alpha*grid_atom%rad(ir)**2)
     728              : 
     729         4287 :                      DO ia = 1, grid_atom%ng_sphere
     730              : 
     731        16950 :                         DO idir = 1, 3
     732        12600 :                            hard_value = 0.0_dp
     733              :                            hard_value = charge*( &
     734              :                                         -2.0_dp*sqrt_alpha*EXP(-grid_atom%rad(ir)**2*sqrt_alpha**2) &
     735              :                                         *grid_atom%rad(ir)*harmonics%a(idir, ia) &
     736              :                                         /(rootpi*grid_atom%rad(ir)**2) &
     737              :                                         + erf(grid_atom%rad(ir)*sqrt_alpha) &
     738              :                                         *grid_atom%rad(ir)*harmonics%a(idir, ia) &
     739        12600 :                                         /grid_atom%rad(ir)**3)
     740        12600 :                            soft_value = hard_value
     741        37800 :                            DO iexp = 1, nexp_ppl
     742              :                               hard_value = hard_value + ( &
     743              :                                            -2.0_dp*alpha*grid_atom%rad(ir)*harmonics%a(idir, ia) &
     744        25200 :                                            *exp_rap*cexp_ppl(iexp)*(grid_atom%rad(ir)**2)**(iexp - 1))
     745        37800 :                               IF (iexp > 1) THEN
     746              :                                  hard_value = hard_value + ( &
     747              :                                               2.0_dp*exp_rap*cexp_ppl(iexp) &
     748              :                                               *(grid_atom%rad(ir)**2)**(iexp - 2)*REAL(iexp - 1, dp) &
     749        12600 :                                               *grid_atom%rad(ir)*harmonics%a(idir, ia))
     750              :                               END IF
     751              :                            END DO
     752              :                            nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) = &
     753        12600 :                               nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) + hard_value
     754        16800 :                            IF (make_soft) THEN
     755              :                               nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) = &
     756        12600 :                                  nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) + soft_value
     757              :                            ELSE
     758              :                               nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) = &
     759            0 :                                  nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) + hard_value
     760              :                            END IF
     761              :                         END DO
     762              : 
     763              :                      END DO ! ia
     764              :                   END DO ! ir
     765              : 
     766           10 :                   DO ispin = 2, nspins
     767           15 :                      DO idir = 1, 3
     768        22959 :                         nablavks_vec_rad_h(idir, ispin)%r_coef(:, :) = nablavks_vec_rad_h(idir, 1)%r_coef(:, :)
     769        22962 :                         nablavks_vec_rad_s(idir, ispin)%r_coef(:, :) = nablavks_vec_rad_s(idir, 1)%r_coef(:, :)
     770              :                      END DO
     771              :                   END DO
     772              : 
     773              :                END DO
     774              : 
     775              :             END IF
     776              : 
     777           16 :          ELSE IF (ASSOCIATED(sgp_potential)) THEN
     778              : 
     779            0 :             CPABORT("EPR with SGP potentials is not implemented")
     780              : 
     781           16 :          ELSE IF (ASSOCIATED(cneo_potential)) THEN
     782              : 
     783            0 :             CPABORT("EPR with CNEO potentials is not implemented")
     784              : 
     785           16 :          ELSE IF (ASSOCIATED(all_potential)) THEN
     786              : 
     787              :             CALL get_potential(potential=all_potential, &
     788              :                                alpha_core_charge=alpha, &
     789           16 :                                zeff=charge)
     790              : 
     791           16 :             sqrt_alpha = SQRT(alpha)
     792              : 
     793              :             !   -------------------------------------
     794              :             !   Atomic grids part
     795              :             !   -------------------------------------
     796              : 
     797           16 :             bo_atom = get_limit(natom, para_env%num_pe, para_env%mepos)
     798              : 
     799           28 :             DO iat = bo_atom(1), bo_atom(2) ! natom = # atoms for ikind
     800              : 
     801           12 :                iatom = atom_list(iat)
     802              : 
     803           12 :                nablavks_vec_rad_h => nablavks_atom_set(iatom)%nablavks_vec_rad_h
     804              : 
     805          612 :                DO ir = 1, grid_atom%nr
     806              : 
     807          600 :                   IF (grid_atom%rad(ir) >= hard_radius) CYCLE
     808              : 
     809        17148 :                   DO ia = 1, grid_atom%ng_sphere
     810              : 
     811        67800 :                      DO idir = 1, 3
     812        50400 :                         hard_value = 0.0_dp
     813              :                         hard_value = charge*( &
     814              :                                      2.0_dp*sqrt_alpha*EXP(-grid_atom%rad(ir)**2*sqrt_alpha**2) &
     815              :                                      *grid_atom%rad(ir)*harmonics%a(idir, ia) &
     816              :                                      /(rootpi*grid_atom%rad(ir)**2) &
     817              :                                      + erfc(grid_atom%rad(ir)*sqrt_alpha) &
     818              :                                      *grid_atom%rad(ir)*harmonics%a(idir, ia) &
     819        50400 :                                      /grid_atom%rad(ir)**3)
     820              :                         nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) = &
     821        67200 :                            nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) + hard_value
     822              :                      END DO
     823              : 
     824              :                   END DO ! ia
     825              :                END DO ! ir
     826              : 
     827           40 :                DO ispin = 2, nspins
     828           60 :                   DO idir = 1, 3
     829        91848 :                      nablavks_vec_rad_h(idir, ispin)%r_coef(:, :) = nablavks_vec_rad_h(idir, 1)%r_coef(:, :)
     830              :                   END DO
     831              :                END DO
     832              : 
     833              :             END DO
     834              : 
     835              :          ELSE
     836              :             CYCLE
     837              :          END IF
     838              : 
     839              :       END DO
     840              : 
     841           56 :       DO idir = 1, 3
     842           42 :          CALL qs_rho_get(nablavks_set(idir, 1)%rho, rho_r=rho1_r)
     843           42 :          CALL qs_rho_get(nablavks_set(idir, 2)%rho, rho_r=rho2_r)
     844           56 :          CALL pw_copy(rho1_r(1), rho2_r(1))
     845              :       END DO
     846              : 
     847              : !   -------------------------------------
     848              : !   Add V_xc potential
     849              : !   -------------------------------------
     850              : 
     851           14 :       CALL auxbas_pw_pool%create_pw(v_xc_gtemp)
     852           14 :       CALL auxbas_pw_pool%create_pw(v_xc_rtemp)
     853              : 
     854           14 :       xc_section => section_vals_get_subs_vals(input, "PROPERTIES%LINRES%EPR%PRINT%G_TENSOR%XC")
     855              :       ! a possible vdW section in xc_section will be ignored
     856              : 
     857           14 :       IF (gapw_xc) THEN
     858              :          CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_xc, xc_section=xc_section, &
     859            0 :                             vxc_rho=v_rspace_new, vxc_tau=v_tau_rspace, exc=exc, just_energy=.FALSE.)
     860              :       ELSE
     861              :          CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho, xc_section=xc_section, &
     862           14 :                             vxc_rho=v_rspace_new, vxc_tau=v_tau_rspace, exc=exc, just_energy=.FALSE.)
     863              :       END IF
     864              : 
     865           14 :       IF (ASSOCIATED(v_rspace_new)) THEN
     866              : 
     867           42 :          DO ispin = 1, nspins
     868              : 
     869           28 :             CALL pw_transfer(v_rspace_new(ispin), v_xc_gtemp)
     870           28 :             CALL pw_derive(v_xc_gtemp, [1, 0, 0])
     871           28 :             CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
     872           28 :             CALL qs_rho_get(nablavks_set(1, ispin)%rho, rho_r=rho_r)
     873           28 :             CALL pw_axpy(v_xc_rtemp, rho_r(1))
     874              : 
     875           28 :             CALL pw_transfer(v_rspace_new(ispin), v_xc_gtemp)
     876           28 :             CALL pw_derive(v_xc_gtemp, [0, 1, 0])
     877           28 :             CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
     878           28 :             CALL qs_rho_get(nablavks_set(2, ispin)%rho, rho_r=rho_r)
     879           28 :             CALL pw_axpy(v_xc_rtemp, rho_r(1))
     880              : 
     881           28 :             CALL pw_transfer(v_rspace_new(ispin), v_xc_gtemp)
     882           28 :             CALL pw_derive(v_xc_gtemp, [0, 0, 1])
     883           28 :             CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
     884           28 :             CALL qs_rho_get(nablavks_set(3, ispin)%rho, rho_r=rho_r)
     885           28 :             CALL pw_axpy(v_xc_rtemp, rho_r(1))
     886              : 
     887           42 :             CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
     888              : 
     889              :          END DO
     890              : 
     891           14 :          DEALLOCATE (v_rspace_new)
     892              :       END IF
     893              : 
     894           14 :       IF (ASSOCIATED(v_tau_rspace)) THEN
     895              : 
     896            0 :          DO ispin = 1, nspins
     897              : 
     898            0 :             CALL pw_transfer(v_tau_rspace(ispin), v_xc_gtemp)
     899            0 :             CALL pw_derive(v_xc_gtemp, [1, 0, 0])
     900            0 :             CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
     901            0 :             CALL qs_rho_get(nablavks_set(1, ispin)%rho, rho_r=rho_r)
     902            0 :             CALL pw_axpy(v_xc_rtemp, rho_r(1))
     903              : 
     904            0 :             CALL pw_transfer(v_tau_rspace(ispin), v_xc_gtemp)
     905            0 :             CALL pw_derive(v_xc_gtemp, [0, 1, 0])
     906            0 :             CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
     907            0 :             CALL qs_rho_get(nablavks_set(2, ispin)%rho, rho_r=rho_r)
     908            0 :             CALL pw_axpy(v_xc_rtemp, rho_r(1))
     909              : 
     910            0 :             CALL pw_transfer(v_tau_rspace(ispin), v_xc_gtemp)
     911            0 :             CALL pw_derive(v_xc_gtemp, [0, 0, 1])
     912            0 :             CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
     913            0 :             CALL qs_rho_get(nablavks_set(3, ispin)%rho, rho_r=rho_r)
     914            0 :             CALL pw_axpy(v_xc_rtemp, rho_r(1))
     915              : 
     916            0 :             CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
     917              : 
     918              :          END DO
     919              : 
     920            0 :          DEALLOCATE (v_tau_rspace)
     921              :       END IF
     922              : 
     923           14 :       CALL auxbas_pw_pool%give_back_pw(v_xc_gtemp)
     924           14 :       CALL auxbas_pw_pool%give_back_pw(v_xc_rtemp)
     925              : 
     926           14 :       IF (gapw .OR. gapw_xc) THEN
     927           10 :          CALL calculate_vxc_atom_epr(qs_env=qs_env, exc1=exc1, gradient_atom_set=nablavks_atom_set)
     928              :       END IF
     929              : 
     930              : !   -------------------------------------
     931              : !   Write Nabla V_KS (local) to cubes
     932              : !   -------------------------------------
     933              : 
     934           14 :       IF (BTEST(cp_print_key_should_output(logger%iter_info, lr_section, &
     935              :                                            "EPR%PRINT%NABLAVKS_CUBES"), cp_p_file)) THEN
     936            0 :          CALL auxbas_pw_pool%create_pw(wf_r)
     937            0 :          DO idir = 1, 3
     938            0 :             CALL pw_zero(wf_r)
     939            0 :             CALL qs_rho_get(nablavks_set(idir, 1)%rho, rho_r=rho_r)
     940            0 :             CALL pw_copy(rho_r(1), wf_r) ! RA
     941            0 :             filename = "nablavks"
     942            0 :             mpi_io = .TRUE.
     943            0 :             WRITE (ext, '(a2,I1,a5)') "_d", idir, ".cube"
     944              :             unit_nr = cp_print_key_unit_nr(logger, lr_section, "EPR%PRINT%NABLAVKS_CUBES", &
     945              :                                            extension=TRIM(ext), middle_name=TRIM(filename), &
     946              :                                            log_filename=.FALSE., file_position="REWIND", &
     947            0 :                                            mpi_io=mpi_io)
     948              :             CALL cp_pw_to_cube(wf_r, unit_nr, "NABLA V_KS ", &
     949              :                                particles=particles, &
     950              :                                stride=section_get_ivals(lr_section, &
     951              :                                                         "EPR%PRINT%NABLAVKS_CUBES%STRIDE"), &
     952            0 :                                mpi_io=mpi_io)
     953              :             CALL cp_print_key_finished_output(unit_nr, logger, lr_section, &
     954            0 :                                               "EPR%PRINT%NABLAVKS_CUBES", mpi_io=mpi_io)
     955              :          END DO
     956            0 :          CALL auxbas_pw_pool%give_back_pw(wf_r)
     957              :       END IF
     958              : 
     959              :       CALL cp_print_key_finished_output(output_unit, logger, lr_section, &
     960           14 :                                         "PRINT%PROGRAM_RUN_INFO")
     961              : 
     962           28 :    END SUBROUTINE epr_nablavks
     963              : 
     964              : END MODULE qs_linres_epr_nablavks
     965              : 
        

Generated by: LCOV version 2.0-1