LCOV - code coverage report
Current view: top level - src - qs_cdft_methods.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:34ef472) Lines: 772 844 91.5 %
Date: 2024-04-26 08:30:29 Functions: 7 7 100.0 %

          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 Subroutines for building CDFT constraints
      10             : !> \par   History
      11             : !>                 separated from et_coupling [03.2017]
      12             : !> \author Nico Holmberg [03.2017]
      13             : ! **************************************************************************************************
      14             : MODULE qs_cdft_methods
      15             :    USE ao_util,                         ONLY: exp_radius_very_extended
      16             :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      17             :                                               get_atomic_kind,&
      18             :                                               get_atomic_kind_set
      19             :    USE cell_types,                      ONLY: cell_type,&
      20             :                                               pbc
      21             :    USE cp_control_types,                ONLY: dft_control_type
      22             :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      23             :                                               cp_logger_type
      24             :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      25             :                                               cp_print_key_unit_nr
      26             :    USE cp_realspace_grid_cube,          ONLY: cp_cube_to_pw
      27             :    USE grid_api,                        ONLY: GRID_FUNC_AB,&
      28             :                                               collocate_pgf_product
      29             :    USE hirshfeld_types,                 ONLY: hirshfeld_type
      30             :    USE input_constants,                 ONLY: cdft_alpha_constraint,&
      31             :                                               cdft_beta_constraint,&
      32             :                                               cdft_charge_constraint,&
      33             :                                               cdft_magnetization_constraint,&
      34             :                                               outer_scf_becke_constraint,&
      35             :                                               outer_scf_hirshfeld_constraint
      36             :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      37             :                                               section_vals_type
      38             :    USE kahan_sum,                       ONLY: accurate_dot_product
      39             :    USE kinds,                           ONLY: dp
      40             :    USE message_passing,                 ONLY: mp_para_env_type
      41             :    USE particle_types,                  ONLY: particle_type
      42             :    USE pw_env_types,                    ONLY: pw_env_get,&
      43             :                                               pw_env_type
      44             :    USE pw_methods,                      ONLY: pw_axpy,&
      45             :                                               pw_copy,&
      46             :                                               pw_integral_ab,&
      47             :                                               pw_integrate_function,&
      48             :                                               pw_set,&
      49             :                                               pw_zero
      50             :    USE pw_pool_types,                   ONLY: pw_pool_type
      51             :    USE pw_types,                        ONLY: pw_r3d_rs_type
      52             :    USE qs_cdft_types,                   ONLY: becke_constraint_type,&
      53             :                                               cdft_control_type,&
      54             :                                               cdft_group_type,&
      55             :                                               hirshfeld_constraint_type
      56             :    USE qs_cdft_utils,                   ONLY: becke_constraint_init,&
      57             :                                               cdft_constraint_print,&
      58             :                                               cdft_print_hirshfeld_density,&
      59             :                                               hfun_scale,&
      60             :                                               hirshfeld_constraint_init
      61             :    USE qs_energy_types,                 ONLY: qs_energy_type
      62             :    USE qs_environment_types,            ONLY: get_qs_env,&
      63             :                                               qs_environment_type
      64             :    USE qs_force_types,                  ONLY: qs_force_type
      65             :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      66             :                                               qs_kind_type
      67             :    USE qs_rho0_types,                   ONLY: get_rho0_mpole,&
      68             :                                               mpole_rho_atom,&
      69             :                                               rho0_mpole_type
      70             :    USE qs_rho_types,                    ONLY: qs_rho_get,&
      71             :                                               qs_rho_type
      72             :    USE qs_subsys_types,                 ONLY: qs_subsys_get,&
      73             :                                               qs_subsys_type
      74             :    USE realspace_grid_types,            ONLY: realspace_grid_desc_type,&
      75             :                                               realspace_grid_type,&
      76             :                                               rs_grid_create,&
      77             :                                               rs_grid_release,&
      78             :                                               rs_grid_zero,&
      79             :                                               transfer_rs2pw
      80             : #include "./base/base_uses.f90"
      81             : 
      82             :    IMPLICIT NONE
      83             : 
      84             :    PRIVATE
      85             : 
      86             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_cdft_methods'
      87             :    LOGICAL, PARAMETER, PRIVATE          :: debug_this_module = .FALSE.
      88             : 
      89             : ! *** Public subroutines ***
      90             : 
      91             :    PUBLIC :: becke_constraint, hirshfeld_constraint
      92             : 
      93             : CONTAINS
      94             : 
      95             : ! **************************************************************************************************
      96             : !> \brief Driver routine for calculating a Becke constraint
      97             : !> \param qs_env the qs_env where to build the constraint
      98             : !> \param calc_pot if the potential needs to be recalculated or just integrated
      99             : !> \param calculate_forces logical if potential has to be calculated or only_energy
     100             : !> \par   History
     101             : !>        Created 01.2007 [fschiff]
     102             : !>        Extended functionality 12/15-12/16 [Nico Holmberg]
     103             : ! **************************************************************************************************
     104        2948 :    SUBROUTINE becke_constraint(qs_env, calc_pot, calculate_forces)
     105             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     106             :       LOGICAL                                            :: calc_pot, calculate_forces
     107             : 
     108             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'becke_constraint'
     109             : 
     110             :       INTEGER                                            :: handle
     111             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
     112             :       TYPE(dft_control_type), POINTER                    :: dft_control
     113             : 
     114        2948 :       CALL timeset(routineN, handle)
     115        2948 :       CALL get_qs_env(qs_env, dft_control=dft_control)
     116        2948 :       cdft_control => dft_control%qs_control%cdft_control
     117        2948 :       IF (dft_control%qs_control%cdft .AND. cdft_control%type == outer_scf_becke_constraint) THEN
     118        2948 :          IF (calc_pot) THEN
     119             :             ! Initialize the Becke constraint environment
     120         190 :             CALL becke_constraint_init(qs_env)
     121             :             ! Calculate the Becke weight function and possibly the gradients
     122         190 :             CALL becke_constraint_low(qs_env)
     123             :          END IF
     124             :          ! Integrate the Becke constraint
     125        2948 :          CALL cdft_constraint_integrate(qs_env)
     126             :          ! Calculate forces
     127        2948 :          IF (calculate_forces) CALL cdft_constraint_force(qs_env)
     128             :       END IF
     129        2948 :       CALL timestop(handle)
     130             : 
     131        2948 :    END SUBROUTINE becke_constraint
     132             : 
     133             : ! **************************************************************************************************
     134             : !> \brief Low level routine to build a Becke weight function and its gradients
     135             : !> \param qs_env the qs_env where to build the constraint
     136             : !> \param just_gradients optional logical which determines if only the gradients should be calculated
     137             : !> \par   History
     138             : !>        Created 03.2017 [Nico Holmberg]
     139             : ! **************************************************************************************************
     140         200 :    SUBROUTINE becke_constraint_low(qs_env, just_gradients)
     141             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     142             :       LOGICAL, OPTIONAL                                  :: just_gradients
     143             : 
     144             :       CHARACTER(len=*), PARAMETER :: routineN = 'becke_constraint_low'
     145             : 
     146             :       INTEGER                                            :: handle, i, iatom, igroup, ind(3), ip, j, &
     147             :                                                             jatom, jp, k, natom, np(3), nskipped
     148         200 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: catom
     149             :       INTEGER, DIMENSION(2, 3)                           :: bo, bo_conf
     150             :       LOGICAL                                            :: in_memory, my_just_gradients
     151         200 :       LOGICAL, ALLOCATABLE, DIMENSION(:)                 :: is_constraint, skip_me
     152         200 :       LOGICAL, ALLOCATABLE, DIMENSION(:, :)              :: atom_in_group
     153             :       REAL(kind=dp)                                      :: dist1, dist2, dmyexp, dvol, eps_cavity, &
     154             :                                                             my1, my1_homo, myexp, sum_cell_f_all, &
     155             :                                                             th, tmp_const
     156         200 :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: cell_functions, ds_dR_i, ds_dR_j, &
     157         200 :                                                             sum_cell_f_group
     158         200 :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :)        :: d_sum_Pm_dR, dP_i_dRi
     159         200 :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: dP_i_dRj
     160             :       REAL(kind=dp), DIMENSION(3)                        :: cell_v, dist_vec, dmy_dR_i, dmy_dR_j, &
     161             :                                                             dr, dr1_r2, dr_i_dR, dr_ij_dR, &
     162             :                                                             dr_j_dR, grid_p, r, r1, shift
     163         200 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: cutoffs
     164             :       TYPE(becke_constraint_type), POINTER               :: becke_control
     165             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
     166         200 :       TYPE(cdft_group_type), DIMENSION(:), POINTER       :: group
     167             :       TYPE(cell_type), POINTER                           :: cell
     168             :       TYPE(dft_control_type), POINTER                    :: dft_control
     169         200 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     170         200 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: charge
     171             : 
     172         200 :       NULLIFY (cutoffs, cell, dft_control, particle_set, group, charge, cdft_control)
     173         200 :       CALL timeset(routineN, handle)
     174             :       ! Get simulation environment
     175             :       CALL get_qs_env(qs_env, &
     176             :                       cell=cell, &
     177             :                       particle_set=particle_set, &
     178             :                       natom=natom, &
     179         200 :                       dft_control=dft_control)
     180         200 :       cdft_control => dft_control%qs_control%cdft_control
     181         200 :       becke_control => cdft_control%becke_control
     182         200 :       group => cdft_control%group
     183         200 :       cutoffs => becke_control%cutoffs
     184         200 :       IF (cdft_control%atomic_charges) &
     185         106 :          charge => cdft_control%charge
     186         200 :       in_memory = .FALSE.
     187         200 :       IF (cdft_control%save_pot) THEN
     188          82 :          in_memory = becke_control%in_memory
     189             :       END IF
     190         200 :       eps_cavity = becke_control%eps_cavity
     191             :       ! Decide if only gradients need to be calculated
     192         200 :       my_just_gradients = .FALSE.
     193         200 :       IF (PRESENT(just_gradients)) my_just_gradients = just_gradients
     194          10 :       IF (my_just_gradients) THEN
     195          10 :          in_memory = .TRUE.
     196             :          !  Pairwise distances need to be recalculated
     197          10 :          IF (becke_control%vector_buffer%store_vectors) THEN
     198          30 :             ALLOCATE (becke_control%vector_buffer%distances(natom))
     199          30 :             ALLOCATE (becke_control%vector_buffer%distance_vecs(3, natom))
     200          40 :             IF (in_memory) ALLOCATE (becke_control%vector_buffer%pair_dist_vecs(3, natom, natom))
     201          30 :             ALLOCATE (becke_control%vector_buffer%position_vecs(3, natom))
     202             :          END IF
     203          40 :          ALLOCATE (becke_control%vector_buffer%R12(natom, natom))
     204          40 :          DO i = 1, 3
     205          40 :             cell_v(i) = cell%hmat(i, i)
     206             :          END DO
     207          20 :          DO iatom = 1, natom - 1
     208          30 :             DO jatom = iatom + 1, natom
     209          40 :                r = particle_set(iatom)%r
     210          40 :                r1 = particle_set(jatom)%r
     211          40 :                DO i = 1, 3
     212          30 :                   r(i) = MODULO(r(i), cell%hmat(i, i)) - cell%hmat(i, i)/2._dp
     213          40 :                   r1(i) = MODULO(r1(i), cell%hmat(i, i)) - cell%hmat(i, i)/2._dp
     214             :                END DO
     215          40 :                dist_vec = (r - r1) - ANINT((r - r1)/cell_v)*cell_v
     216          10 :                IF (becke_control%vector_buffer%store_vectors) THEN
     217          40 :                   becke_control%vector_buffer%position_vecs(:, iatom) = r(:)
     218          40 :                   IF (iatom == 1 .AND. jatom == natom) becke_control%vector_buffer%position_vecs(:, jatom) = r1(:)
     219             :                   IF (in_memory) THEN
     220          40 :                      becke_control%vector_buffer%pair_dist_vecs(:, iatom, jatom) = dist_vec(:)
     221          40 :                      becke_control%vector_buffer%pair_dist_vecs(:, jatom, iatom) = -dist_vec(:)
     222             :                   END IF
     223             :                END IF
     224          40 :                becke_control%vector_buffer%R12(iatom, jatom) = SQRT(DOT_PRODUCT(dist_vec, dist_vec))
     225          20 :                becke_control%vector_buffer%R12(jatom, iatom) = becke_control%vector_buffer%R12(iatom, jatom)
     226             :             END DO
     227             :          END DO
     228             :       END IF
     229         600 :       ALLOCATE (catom(cdft_control%natoms))
     230             :       IF (cdft_control%save_pot .OR. &
     231         200 :           becke_control%cavity_confine .OR. &
     232             :           becke_control%should_skip) THEN
     233         576 :          ALLOCATE (is_constraint(natom))
     234         608 :          is_constraint = .FALSE.
     235             :       END IF
     236             :       ! This boolean is needed to prevent calculation of atom pairs ji when the pair ij has
     237             :       ! already been calculated (data for pair ji is set using symmetry)
     238             :       ! With gradient precomputation, symmetry exploited for both weight function and gradients
     239         600 :       ALLOCATE (skip_me(natom))
     240         596 :       DO i = 1, cdft_control%natoms
     241         396 :          catom(i) = cdft_control%atoms(i)
     242             :          ! Notice that here is_constraint=.TRUE. also for dummy atoms to properly compute their Becke charges
     243             :          ! A subsequent check (atom_in_group) ensures that the gradients of these dummy atoms are correct
     244             :          IF (cdft_control%save_pot .OR. &
     245         396 :              becke_control%cavity_confine .OR. &
     246             :              becke_control%should_skip) &
     247         578 :             is_constraint(catom(i)) = .TRUE.
     248             :       END DO
     249        2000 :       bo = group(1)%weight%pw_grid%bounds_local
     250         800 :       dvol = group(1)%weight%pw_grid%dvol
     251         800 :       dr = group(1)%weight%pw_grid%dr
     252         800 :       np = group(1)%weight%pw_grid%npts
     253         800 :       shift = -REAL(MODULO(np, 2), dp)*dr/2.0_dp
     254         800 :       DO i = 1, 3
     255         800 :          cell_v(i) = cell%hmat(i, i)
     256             :       END DO
     257             :       ! If requested, allocate storage for gradients
     258         200 :       IF (in_memory) THEN
     259          72 :          bo_conf = bo
     260             :          ! With confinement active, we dont need to store gradients outside
     261             :          ! the confinement bounds since they vanish for all particles
     262          72 :          IF (becke_control%cavity_confine) THEN
     263          64 :             bo_conf(1, 3) = becke_control%confine_bounds(1)
     264          64 :             bo_conf(2, 3) = becke_control%confine_bounds(2)
     265             :          END IF
     266         288 :          ALLOCATE (atom_in_group(SIZE(group), natom))
     267         392 :          atom_in_group = .FALSE.
     268         160 :          DO igroup = 1, SIZE(group)
     269             :             ALLOCATE (group(igroup)%gradients(3*natom, bo_conf(1, 1):bo_conf(2, 1), &
     270             :                                               bo_conf(1, 2):bo_conf(2, 2), &
     271         528 :                                               bo_conf(1, 3):bo_conf(2, 3)))
     272    23089200 :             group(igroup)%gradients = 0.0_dp
     273         264 :             ALLOCATE (group(igroup)%d_sum_const_dR(3, natom))
     274         792 :             group(igroup)%d_sum_const_dR = 0.0_dp
     275         336 :             DO ip = 1, SIZE(group(igroup)%atoms)
     276         264 :                atom_in_group(igroup, group(igroup)%atoms(ip)) = .TRUE.
     277             :             END DO
     278             :          END DO
     279             :       END IF
     280             :       ! Allocate remaining work
     281         600 :       ALLOCATE (sum_cell_f_group(SIZE(group)))
     282         600 :       ALLOCATE (cell_functions(natom))
     283         200 :       IF (in_memory) THEN
     284          72 :          ALLOCATE (ds_dR_j(3))
     285          72 :          ALLOCATE (ds_dR_i(3))
     286         216 :          ALLOCATE (d_sum_Pm_dR(3, natom))
     287         288 :          ALLOCATE (dP_i_dRj(3, natom, natom))
     288         216 :          ALLOCATE (dP_i_dRi(3, natom))
     289         200 :          th = 1.0e-8_dp
     290             :       END IF
     291             :       ! Build constraint
     292        4208 :       DO k = bo(1, 1), bo(2, 1)
     293      170960 :          DO j = bo(1, 2), bo(2, 2)
     294     7373448 :             DO i = bo(1, 3), bo(2, 3)
     295             :                ! If the grid point is too far from all constraint atoms and cavity confinement is active,
     296             :                ! we can skip this grid point as it does not contribute to the weight or gradients
     297     7202688 :                IF (becke_control%cavity_confine) THEN
     298     6424576 :                   IF (becke_control%cavity%array(k, j, i) < eps_cavity) CYCLE
     299             :                END IF
     300    19695324 :                ind = (/k, j, i/)
     301     4923831 :                grid_p(1) = k*dr(1) + shift(1)
     302     4923831 :                grid_p(2) = j*dr(2) + shift(2)
     303     4923831 :                grid_p(3) = i*dr(3) + shift(3)
     304     4923831 :                nskipped = 0
     305    15531637 :                cell_functions = 1.0_dp
     306    15531637 :                skip_me = .FALSE.
     307    15531637 :                IF (becke_control%vector_buffer%store_vectors) becke_control%vector_buffer%distances = 0.0_dp
     308     4923831 :                IF (in_memory) THEN
     309    15260751 :                   d_sum_Pm_dR = 0.0_dp
     310     3790808 :                   DO igroup = 1, SIZE(group)
     311    20552160 :                      group(igroup)%d_sum_const_dR = 0.0_dp
     312             :                   END DO
     313    15260751 :                   dP_i_dRi = 0.0_dp
     314             :                END IF
     315             :                ! Iterate over all atoms in the system
     316    12863480 :                DO iatom = 1, natom
     317    10232484 :                   IF (skip_me(iatom)) THEN
     318      393721 :                      cell_functions(iatom) = 0.0_dp
     319      393721 :                      IF (becke_control%should_skip) THEN
     320      252029 :                         IF (is_constraint(iatom)) nskipped = nskipped + 1
     321      252029 :                         IF (nskipped == cdft_control%natoms) THEN
     322           0 :                            IF (in_memory) THEN
     323           0 :                               IF (becke_control%cavity_confine) THEN
     324           0 :                                  becke_control%cavity%array(k, j, i) = 0.0_dp
     325             :                               END IF
     326             :                            END IF
     327             :                            EXIT
     328             :                         END IF
     329             :                      END IF
     330             :                      CYCLE
     331             :                   END IF
     332     9838763 :                   IF (becke_control%vector_buffer%store_vectors) THEN
     333     9838763 :                      IF (becke_control%vector_buffer%distances(iatom) .EQ. 0.0_dp) THEN
     334    35989816 :                         r = becke_control%vector_buffer%position_vecs(:, iatom)
     335    35989816 :                         dist_vec = (r - grid_p) - ANINT((r - grid_p)/cell_v)*cell_v
     336    35989816 :                         dist1 = SQRT(DOT_PRODUCT(dist_vec, dist_vec))
     337    35989816 :                         becke_control%vector_buffer%distance_vecs(:, iatom) = dist_vec
     338     8997454 :                         becke_control%vector_buffer%distances(iatom) = dist1
     339             :                      ELSE
     340     3365236 :                         dist_vec = becke_control%vector_buffer%distance_vecs(:, iatom)
     341             :                         dist1 = becke_control%vector_buffer%distances(iatom)
     342             :                      END IF
     343             :                   ELSE
     344           0 :                      r = particle_set(iatom)%r
     345           0 :                      DO ip = 1, 3
     346           0 :                         r(ip) = MODULO(r(ip), cell%hmat(ip, ip)) - cell%hmat(ip, ip)/2._dp
     347             :                      END DO
     348           0 :                      dist_vec = (r - grid_p) - ANINT((r - grid_p)/cell_v)*cell_v
     349           0 :                      dist1 = SQRT(DOT_PRODUCT(dist_vec, dist_vec))
     350             :                   END IF
     351    12469759 :                   IF (dist1 .LE. cutoffs(iatom)) THEN
     352     2173196 :                      IF (in_memory) THEN
     353      761650 :                         IF (dist1 .LE. th) dist1 = th
     354     3046600 :                         dr_i_dR(:) = dist_vec(:)/dist1
     355             :                      END IF
     356     6980971 :                      DO jatom = 1, natom
     357     6980971 :                         IF (jatom .NE. iatom) THEN
     358             :                            ! Using pairwise symmetry, execute block only for such j<i
     359             :                            ! that have previously not been looped over
     360             :                            ! Note that if skip_me(jatom) = .TRUE., this means that the outer
     361             :                            ! loop over iatom skipped this index when iatom=jatom, but we still
     362             :                            ! need to compute the pair for iatom>jatom
     363     2634579 :                            IF (jatom < iatom) THEN
     364     1286576 :                               IF (.NOT. skip_me(jatom)) CYCLE
     365             :                            END IF
     366     1723481 :                            IF (becke_control%vector_buffer%store_vectors) THEN
     367     1723481 :                               IF (becke_control%vector_buffer%distances(jatom) .EQ. 0.0_dp) THEN
     368     4940120 :                                  r1 = becke_control%vector_buffer%position_vecs(:, jatom)
     369     4940120 :                                  dist_vec = (r1 - grid_p) - ANINT((r1 - grid_p)/cell_v)*cell_v
     370     4940120 :                                  dist2 = SQRT(DOT_PRODUCT(dist_vec, dist_vec))
     371     4940120 :                                  becke_control%vector_buffer%distance_vecs(:, jatom) = dist_vec
     372     1235030 :                                  becke_control%vector_buffer%distances(jatom) = dist2
     373             :                               ELSE
     374     1953804 :                                  dist_vec = becke_control%vector_buffer%distance_vecs(:, jatom)
     375             :                                  dist2 = becke_control%vector_buffer%distances(jatom)
     376             :                               END IF
     377             :                            ELSE
     378           0 :                               r1 = particle_set(jatom)%r
     379           0 :                               DO ip = 1, 3
     380           0 :                                  r1(ip) = MODULO(r1(ip), cell%hmat(ip, ip)) - cell%hmat(ip, ip)/2._dp
     381             :                               END DO
     382           0 :                               dist_vec = (r1 - grid_p) - ANINT((r1 - grid_p)/cell_v)*cell_v
     383           0 :                               dist2 = SQRT(DOT_PRODUCT(dist_vec, dist_vec))
     384             :                            END IF
     385     1723481 :                            IF (in_memory) THEN
     386      484606 :                               IF (becke_control%vector_buffer%store_vectors) THEN
     387     1938424 :                                  dr1_r2 = becke_control%vector_buffer%pair_dist_vecs(:, iatom, jatom)
     388             :                               ELSE
     389           0 :                                  dr1_r2 = (r - r1) - ANINT((r - r1)/cell_v)*cell_v
     390             :                               END IF
     391      484606 :                               IF (dist2 .LE. th) dist2 = th
     392      484606 :                               tmp_const = (becke_control%vector_buffer%R12(iatom, jatom)**3)
     393     1938424 :                               dr_ij_dR(:) = dr1_r2(:)/tmp_const
     394             :                               !derivative w.r.t. Rj
     395     1938424 :                               dr_j_dR = dist_vec(:)/dist2
     396     1938424 :                              dmy_dR_j(:) = -(dr_j_dR(:)/becke_control%vector_buffer%R12(iatom, jatom) - (dist1 - dist2)*dr_ij_dR(:))
     397             :                               !derivative w.r.t. Ri
     398     1938424 :                               dmy_dR_i(:) = dr_i_dR(:)/becke_control%vector_buffer%R12(iatom, jatom) - (dist1 - dist2)*dr_ij_dR(:)
     399             :                            END IF
     400             :                            ! myij
     401     1723481 :                            my1 = (dist1 - dist2)/becke_control%vector_buffer%R12(iatom, jatom)
     402     1723481 :                            IF (becke_control%adjust) THEN
     403     1111478 :                               my1_homo = my1 ! Homonuclear quantity needed for gradient
     404     1111478 :                               my1 = my1 + becke_control%aij(iatom, jatom)*(1.0_dp - my1**2)
     405             :                            END IF
     406             :                            ! f(myij)
     407     1723481 :                            myexp = 1.5_dp*my1 - 0.5_dp*my1**3
     408     1723481 :                            IF (in_memory) THEN
     409      484606 :                               dmyexp = 1.5_dp - 1.5_dp*my1**2
     410             :                               tmp_const = (1.5_dp**2)*dmyexp*(1 - myexp**2)* &
     411      484606 :                                           (1.0_dp - ((1.5_dp*myexp - 0.5_dp*(myexp**3))**2))
     412             :                               ! d s(myij)/d R_i
     413     1938424 :                               ds_dR_i(:) = -0.5_dp*tmp_const*dmy_dR_i(:)
     414             :                               ! d s(myij)/d R_j
     415     1938424 :                               ds_dR_j(:) = -0.5_dp*tmp_const*dmy_dR_j(:)
     416      484606 :                               IF (becke_control%adjust) THEN
     417             :                                  tmp_const = 1.0_dp - 2.0_dp*my1_homo* &
     418      268771 :                                              becke_control%aij(iatom, jatom)
     419     1075084 :                                  ds_dR_i(:) = ds_dR_i(:)*tmp_const
     420             :                                  ! tmp_const is same for both since aij=-aji and myij=-myji
     421     1075084 :                                  ds_dR_j(:) = ds_dR_j(:)*tmp_const
     422             :                               END IF
     423             :                            END IF
     424             :                            ! s(myij) = f[f(f{myij})]
     425     1723481 :                            myexp = 1.5_dp*myexp - 0.5_dp*myexp**3
     426     1723481 :                            myexp = 1.5_dp*myexp - 0.5_dp*myexp**3
     427     1723481 :                            tmp_const = 0.5_dp*(1.0_dp - myexp)
     428     1723481 :                            cell_functions(iatom) = cell_functions(iatom)*tmp_const
     429     1723481 :                            IF (in_memory) THEN
     430      484606 :                               IF (ABS(tmp_const) .LE. th) tmp_const = tmp_const + th
     431             :                               ! P_i independent part of dP_i/dR_i
     432     1938424 :                               dP_i_dRi(:, iatom) = dP_i_dRi(:, iatom) + ds_dR_i(:)/tmp_const
     433             :                               ! P_i independent part of dP_i/dR_j
     434     1938424 :                               dP_i_dRj(:, iatom, jatom) = ds_dR_j(:)/tmp_const
     435             :                            END IF
     436             : 
     437     1723481 :                            IF (dist2 .LE. cutoffs(jatom)) THEN
     438      911098 :                               tmp_const = 0.5_dp*(1.0_dp + myexp) ! s(myji)
     439      911098 :                               cell_functions(jatom) = cell_functions(jatom)*tmp_const
     440      911098 :                               IF (in_memory) THEN
     441      277044 :                                  IF (ABS(tmp_const) .LE. th) tmp_const = tmp_const + th
     442             :                                  ! P_j independent part of dP_j/dR_i
     443             :                                  ! d s(myji)/d R_i = -d s(myij)/d R_i
     444     1108176 :                                  dP_i_dRj(:, jatom, iatom) = -ds_dR_i(:)/tmp_const
     445             :                                  ! P_j independent part of dP_j/dR_j
     446             :                                  ! d s(myji)/d R_j = -d s(myij)/d R_j
     447     1108176 :                                  dP_i_dRi(:, jatom) = dP_i_dRi(:, jatom) - ds_dR_j(:)/tmp_const
     448             :                               END IF
     449             :                            ELSE
     450      812383 :                               skip_me(jatom) = .TRUE.
     451             :                            END IF
     452             :                         END IF
     453             :                      END DO ! jatom
     454     2173196 :                      IF (in_memory) THEN
     455             :                         ! Final value of dP_i_dRi
     456     3046600 :                         dP_i_dRi(:, iatom) = cell_functions(iatom)*dP_i_dRi(:, iatom)
     457             :                         ! Update relevant sums with value
     458     3046600 :                         d_sum_Pm_dR(:, iatom) = d_sum_Pm_dR(:, iatom) + dP_i_dRi(:, iatom)
     459      761650 :                         IF (is_constraint(iatom)) THEN
     460     1682312 :                            DO igroup = 1, SIZE(group)
     461      920662 :                               IF (.NOT. atom_in_group(igroup, iatom)) CYCLE
     462     1380999 :                               DO jp = 1, SIZE(group(igroup)%atoms)
     463     1380999 :                                  IF (iatom == group(igroup)%atoms(jp)) THEN
     464             :                                     ip = jp
     465             :                                     EXIT
     466             :                                  END IF
     467             :                               END DO
     468             :                               group(igroup)%d_sum_const_dR(1:3, iatom) = group(igroup)%d_sum_const_dR(1:3, iatom) + &
     469     4444298 :                                                                          group(igroup)%coeff(ip)*dP_i_dRi(:, iatom)
     470             :                            END DO
     471             :                         END IF
     472     2284950 :                         DO jatom = 1, natom
     473     2284950 :                            IF (jatom .NE. iatom) THEN
     474             :                               ! Final value of dP_i_dRj
     475     3046600 :                               dP_i_dRj(:, iatom, jatom) = cell_functions(iatom)*dP_i_dRj(:, iatom, jatom)
     476             :                               ! Update where needed
     477     3046600 :                               d_sum_Pm_dR(:, jatom) = d_sum_Pm_dR(:, jatom) + dP_i_dRj(:, iatom, jatom)
     478      761650 :                               IF (is_constraint(iatom)) THEN
     479     1682312 :                                  DO igroup = 1, SIZE(group)
     480      920662 :                                     IF (.NOT. atom_in_group(igroup, iatom)) CYCLE
     481      920662 :                                     ip = -1
     482     1380999 :                                     DO jp = 1, SIZE(group(igroup)%atoms)
     483     1380999 :                                        IF (iatom == group(igroup)%atoms(jp)) THEN
     484             :                                           ip = jp
     485             :                                           EXIT
     486             :                                        END IF
     487             :                                     END DO
     488             :                                     group(igroup)%d_sum_const_dR(1:3, jatom) = group(igroup)%d_sum_const_dR(1:3, jatom) + &
     489             :                                                                                group(igroup)%coeff(ip)* &
     490     4444298 :                                                                                dP_i_dRj(:, iatom, jatom)
     491             :                                  END DO
     492             :                               END IF
     493             :                            END IF
     494             :                         END DO
     495             :                      END IF
     496             :                   ELSE
     497     7665567 :                      cell_functions(iatom) = 0.0_dp
     498     7665567 :                      skip_me(iatom) = .TRUE.
     499     7665567 :                      IF (becke_control%should_skip) THEN
     500     4629324 :                         IF (is_constraint(iatom)) nskipped = nskipped + 1
     501     4629324 :                         IF (nskipped == cdft_control%natoms) THEN
     502     2292835 :                            IF (in_memory) THEN
     503      897142 :                               IF (becke_control%cavity_confine) THEN
     504      897142 :                                  becke_control%cavity%array(k, j, i) = 0.0_dp
     505             :                               END IF
     506             :                            END IF
     507             :                            EXIT
     508             :                         END IF
     509             :                      END IF
     510             :                   END IF
     511             :                END DO !iatom
     512     4923831 :                IF (nskipped == cdft_control%natoms) CYCLE
     513             :                ! Sum up cell functions
     514     5442400 :                sum_cell_f_group = 0.0_dp
     515     5442400 :                DO igroup = 1, SIZE(group)
     516    11107611 :                   DO ip = 1, SIZE(group(igroup)%atoms)
     517             :                      sum_cell_f_group(igroup) = sum_cell_f_group(igroup) + group(igroup)%coeff(ip)* &
     518     8476615 :                                                 cell_functions(group(igroup)%atoms(ip))
     519             :                   END DO
     520             :                END DO
     521     2630996 :                sum_cell_f_all = 0.0_dp
     522     8435725 :                DO ip = 1, natom
     523     8435725 :                   sum_cell_f_all = sum_cell_f_all + cell_functions(ip)
     524             :                END DO
     525             :                ! Gradients at (k,j,i)
     526     2630996 :                IF (in_memory .AND. ABS(sum_cell_f_all) .GT. 0.0_dp) THEN
     527     1072432 :                   DO igroup = 1, SIZE(group)
     528     2248084 :                      DO iatom = 1, natom
     529             :                         group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) = &
     530             :                            group(igroup)%d_sum_const_dR(1:3, iatom)/sum_cell_f_all - sum_cell_f_group(igroup)* &
     531     5290434 :                            d_sum_Pm_dR(1:3, iatom)/(sum_cell_f_all**2)
     532             :                      END DO
     533             :                   END DO
     534             :                END IF
     535             :                ! Weight function(s) at (k,j,i)
     536     2797748 :                IF (.NOT. my_just_gradients .AND. ABS(sum_cell_f_all) .GT. 0.000001) THEN
     537     2744726 :                   DO igroup = 1, SIZE(group)
     538     2744726 :                      group(igroup)%weight%array(k, j, i) = sum_cell_f_group(igroup)/sum_cell_f_all
     539             :                   END DO
     540     1282159 :                   IF (cdft_control%atomic_charges) THEN
     541     2164389 :                      DO iatom = 1, cdft_control%natoms
     542     2164389 :                         charge(iatom)%array(k, j, i) = cell_functions(catom(iatom))/sum_cell_f_all
     543             :                      END DO
     544             :                   END IF
     545             :                END IF
     546             :             END DO
     547             :          END DO
     548             :       END DO
     549             :       ! Release storage
     550         200 :       IF (in_memory) THEN
     551          72 :          DEALLOCATE (ds_dR_j)
     552          72 :          DEALLOCATE (ds_dR_i)
     553          72 :          DEALLOCATE (d_sum_Pm_dR)
     554          72 :          DEALLOCATE (dP_i_dRj)
     555          72 :          DEALLOCATE (dP_i_dRi)
     556         160 :          DO igroup = 1, SIZE(group)
     557         160 :             DEALLOCATE (group(igroup)%d_sum_const_dR)
     558             :          END DO
     559          72 :          DEALLOCATE (atom_in_group)
     560          72 :          IF (becke_control%vector_buffer%store_vectors) THEN
     561          72 :             DEALLOCATE (becke_control%vector_buffer%pair_dist_vecs)
     562             :          END IF
     563             :       END IF
     564         200 :       NULLIFY (cutoffs)
     565         200 :       IF (ALLOCATED(is_constraint)) &
     566         192 :          DEALLOCATE (is_constraint)
     567         200 :       DEALLOCATE (catom)
     568         200 :       DEALLOCATE (cell_functions)
     569         200 :       DEALLOCATE (skip_me)
     570         200 :       DEALLOCATE (sum_cell_f_group)
     571         200 :       DEALLOCATE (becke_control%vector_buffer%R12)
     572         200 :       IF (becke_control%vector_buffer%store_vectors) THEN
     573         200 :          DEALLOCATE (becke_control%vector_buffer%distances)
     574         200 :          DEALLOCATE (becke_control%vector_buffer%distance_vecs)
     575         200 :          DEALLOCATE (becke_control%vector_buffer%position_vecs)
     576             :       END IF
     577         200 :       CALL timestop(handle)
     578             : 
     579         400 :    END SUBROUTINE becke_constraint_low
     580             : 
     581             : ! **************************************************************************************************
     582             : !> \brief Driver routine for calculating a Hirshfeld constraint
     583             : !> \param qs_env ...
     584             : !> \param calc_pot ...
     585             : !> \param calculate_forces ...
     586             : ! **************************************************************************************************
     587          86 :    SUBROUTINE hirshfeld_constraint(qs_env, calc_pot, calculate_forces)
     588             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     589             :       LOGICAL                                            :: calc_pot, calculate_forces
     590             : 
     591             :       CHARACTER(len=*), PARAMETER :: routineN = 'hirshfeld_constraint'
     592             : 
     593             :       INTEGER                                            :: handle
     594             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
     595             :       TYPE(dft_control_type), POINTER                    :: dft_control
     596             : 
     597          86 :       CALL timeset(routineN, handle)
     598          86 :       CALL get_qs_env(qs_env, dft_control=dft_control)
     599          86 :       cdft_control => dft_control%qs_control%cdft_control
     600          86 :       IF (dft_control%qs_control%cdft .AND. cdft_control%type == outer_scf_hirshfeld_constraint) THEN
     601          86 :          IF (calc_pot) THEN
     602             :             ! Initialize the Hirshfeld constraint environment
     603          22 :             CALL hirshfeld_constraint_init(qs_env)
     604             :             ! Calculate the Hirshfeld weight function and possibly the gradients
     605          22 :             CALL hirshfeld_constraint_low(qs_env)
     606             :          END IF
     607             :          ! Integrate the Hirshfeld constraint
     608          86 :          CALL cdft_constraint_integrate(qs_env)
     609             :          ! Calculate forces
     610          86 :          IF (calculate_forces) CALL cdft_constraint_force(qs_env)
     611             :       END IF
     612          86 :       CALL timestop(handle)
     613             : 
     614          86 :    END SUBROUTINE hirshfeld_constraint
     615             : 
     616             : ! **************************************************************************************************
     617             : !> \brief Calculates Hirshfeld constraints
     618             : !> \param qs_env ...
     619             : !> \param just_gradients ...
     620             : ! **************************************************************************************************
     621          24 :    SUBROUTINE hirshfeld_constraint_low(qs_env, just_gradients)
     622             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     623             :       LOGICAL, OPTIONAL                                  :: just_gradients
     624             : 
     625             :       CHARACTER(len=*), PARAMETER :: routineN = 'hirshfeld_constraint_low'
     626             : 
     627             :       INTEGER :: atom_a, atoms_memory, atoms_memory_num, handle, i, iatom, iex, igroup, ikind, &
     628             :          ithread, j, k, natom, npme, nthread, num_atoms, num_species, numexp, subpatch_pattern
     629          24 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: num_species_small
     630             :       INTEGER, DIMENSION(2, 3)                           :: bo
     631             :       INTEGER, DIMENSION(3)                              :: lb_pw, lb_rs, npts, ub_pw, ub_rs
     632          24 :       INTEGER, DIMENSION(:), POINTER                     :: atom_list, cores
     633             :       LOGICAL                                            :: my_just_gradients
     634          24 :       LOGICAL, ALLOCATABLE, DIMENSION(:)                 :: compute_charge, is_constraint
     635             :       REAL(kind=dp)                                      :: alpha, coef, eps_rho_rspace, exp_eval, &
     636             :                                                             prefactor, radius
     637          24 :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: coefficients
     638             :       REAL(kind=dp), DIMENSION(3)                        :: dr_pw, dr_rs, origin, r2, r_pbc, ra
     639          24 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: pab
     640          24 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     641             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
     642             :       TYPE(cell_type), POINTER                           :: cell
     643             :       TYPE(dft_control_type), POINTER                    :: dft_control
     644             :       TYPE(hirshfeld_constraint_type), POINTER           :: hirshfeld_control
     645             :       TYPE(hirshfeld_type), POINTER                      :: hirshfeld_env
     646             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     647          24 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     648             :       TYPE(pw_env_type), POINTER                         :: pw_env
     649             :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
     650          24 :       TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:)    :: pw_single_dr
     651          24 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r
     652             :       TYPE(qs_rho_type), POINTER                         :: rho
     653             :       TYPE(realspace_grid_desc_type), POINTER            :: auxbas_rs_desc
     654         936 :       TYPE(realspace_grid_type)                          :: rs_rho_all, rs_rho_constr
     655             :       TYPE(realspace_grid_type), ALLOCATABLE, &
     656          24 :          DIMENSION(:)                                    :: rs_single, rs_single_charge, rs_single_dr
     657             : 
     658          24 :       NULLIFY (atom_list, atomic_kind_set, dft_control, &
     659          24 :                hirshfeld_env, particle_set, pw_env, auxbas_pw_pool, para_env, &
     660          24 :                auxbas_rs_desc, cdft_control, pab, &
     661          24 :                hirshfeld_control, cell, rho_r, rho)
     662             : 
     663          24 :       CALL timeset(routineN, handle)
     664             :       CALL get_qs_env(qs_env, &
     665             :                       atomic_kind_set=atomic_kind_set, &
     666             :                       particle_set=particle_set, &
     667             :                       natom=natom, &
     668             :                       cell=cell, &
     669             :                       rho=rho, &
     670             :                       dft_control=dft_control, &
     671             :                       para_env=para_env, &
     672          24 :                       pw_env=pw_env)
     673          24 :       CALL qs_rho_get(rho, rho_r=rho_r)
     674             : 
     675          24 :       num_atoms = natom
     676             : 
     677          24 :       cdft_control => dft_control%qs_control%cdft_control
     678          24 :       hirshfeld_control => cdft_control%hirshfeld_control
     679          24 :       hirshfeld_env => hirshfeld_control%hirshfeld_env
     680             : 
     681             :       ! Check if only gradient should be calculated, if gradients should be precomputed
     682          24 :       my_just_gradients = .FALSE.
     683          24 :       IF (PRESENT(just_gradients)) my_just_gradients = just_gradients
     684           2 :       IF (my_just_gradients) THEN
     685           2 :          cdft_control%in_memory = .TRUE.
     686           2 :          cdft_control%atomic_charges = .FALSE.
     687           2 :          hirshfeld_control%print_density = .FALSE.
     688             :       END IF
     689             : 
     690          72 :       ALLOCATE (coefficients(natom))
     691          72 :       ALLOCATE (is_constraint(natom))
     692             : 
     693          24 :       subpatch_pattern = 0
     694          24 :       eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
     695          24 :       radius = 100.0_dp
     696             : 
     697          24 :       dr_pw(1) = rho_r(1)%pw_grid%dr(1)
     698          24 :       dr_pw(2) = rho_r(1)%pw_grid%dr(2)
     699          24 :       dr_pw(3) = rho_r(1)%pw_grid%dr(3)
     700          96 :       lb_pw(1:3) = rho_r(1)%pw_grid%bounds_local(1, 1:3)
     701          96 :       ub_pw(1:3) = rho_r(1)%pw_grid%bounds_local(2, 1:3)
     702          96 :       npts = rho_r(1)%pw_grid%npts
     703          24 :       origin(1) = (dr_pw(1)*npts(1))*0.5_dp
     704          24 :       origin(2) = (dr_pw(2)*npts(2))*0.5_dp
     705          24 :       origin(3) = (dr_pw(3)*npts(3))*0.5_dp
     706             : 
     707             :       CALL pw_env_get(pw_env, auxbas_rs_desc=auxbas_rs_desc, &
     708          24 :                       auxbas_pw_pool=auxbas_pw_pool)
     709          24 :       CALL rs_grid_create(rs_rho_all, auxbas_rs_desc)
     710          24 :       CALL rs_grid_zero(rs_rho_all)
     711             : 
     712          24 :       dr_rs(1) = rs_rho_all%desc%dh(1, 1)
     713          24 :       dr_rs(2) = rs_rho_all%desc%dh(2, 2)
     714          24 :       dr_rs(3) = rs_rho_all%desc%dh(3, 3)
     715          24 :       lb_rs(1) = LBOUND(rs_rho_all%r(:, :, :), 1)
     716          24 :       lb_rs(2) = LBOUND(rs_rho_all%r(:, :, :), 2)
     717          24 :       lb_rs(3) = LBOUND(rs_rho_all%r(:, :, :), 3)
     718          24 :       ub_rs(1) = UBOUND(rs_rho_all%r(:, :, :), 1)
     719          24 :       ub_rs(2) = UBOUND(rs_rho_all%r(:, :, :), 2)
     720          24 :       ub_rs(3) = UBOUND(rs_rho_all%r(:, :, :), 3)
     721             : 
     722             :       ! For each CDFT group
     723          48 :       DO igroup = 1, SIZE(cdft_control%group)
     724             : 
     725          24 :          IF (igroup == 2 .AND. .NOT. cdft_control%in_memory) THEN
     726           0 :             CALL rs_grid_zero(rs_rho_all)
     727             :          END IF
     728         240 :          bo = cdft_control%group(igroup)%weight%pw_grid%bounds_local
     729             : 
     730             :          ! Coefficients
     731          72 :          coefficients(:) = 0.0_dp
     732          72 :          is_constraint = .FALSE.
     733          70 :          DO i = 1, SIZE(cdft_control%group(igroup)%atoms)
     734          46 :             coefficients(cdft_control%group(igroup)%atoms(i)) = cdft_control%group(igroup)%coeff(i)
     735          70 :             is_constraint(cdft_control%group(igroup)%atoms(i)) = .TRUE.
     736             :          END DO
     737             : 
     738             :          ! rs_rho_constr: Sum of isolated Gaussian densities over constraint atoms in this constraint group
     739          24 :          CALL rs_grid_create(rs_rho_constr, auxbas_rs_desc)
     740          24 :          CALL rs_grid_zero(rs_rho_constr)
     741             : 
     742             :          ! rs_single: Gaussian density over single atoms when required
     743          24 :          IF (hirshfeld_control%print_density .AND. igroup == 1) THEN
     744           0 :             ALLOCATE (cdft_control%group(igroup)%hw_rho_atomic(cdft_control%natoms))
     745           0 :             ALLOCATE (rs_single(cdft_control%natoms))
     746           0 :             DO i = 1, cdft_control%natoms
     747           0 :                CALL rs_grid_create(rs_single(i), auxbas_rs_desc)
     748           0 :                CALL rs_grid_zero(rs_single(i))
     749             :             END DO
     750             :          END IF
     751             : 
     752             :          ! Setup pw
     753          24 :          CALL pw_zero(cdft_control%group(igroup)%weight)
     754             : 
     755          24 :          CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_total_constraint)
     756          24 :          CALL pw_set(cdft_control%group(igroup)%hw_rho_total_constraint, 1.0_dp)
     757             : 
     758          24 :          IF (igroup == 1) THEN
     759          24 :             CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_total)
     760          24 :             CALL pw_set(cdft_control%group(igroup)%hw_rho_total, 1.0_dp)
     761             : 
     762          24 :             IF (hirshfeld_control%print_density) THEN
     763           0 :                DO iatom = 1, cdft_control%natoms
     764           0 :                   CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_atomic(iatom))
     765           0 :                   CALL pw_set(cdft_control%group(igroup)%hw_rho_atomic(iatom), 1.0_dp)
     766             :                END DO
     767             :             END IF
     768             :          END IF
     769             : 
     770          24 :          IF (cdft_control%atomic_charges .AND. igroup == 1) THEN
     771          40 :             ALLOCATE (cdft_control%group(igroup)%hw_rho_atomic_charge(cdft_control%natoms))
     772         192 :             ALLOCATE (rs_single_charge(cdft_control%natoms))
     773          24 :             ALLOCATE (compute_charge(natom))
     774          24 :             compute_charge = .FALSE.
     775             : 
     776          24 :             DO i = 1, cdft_control%natoms
     777          16 :                CALL rs_grid_create(rs_single_charge(i), auxbas_rs_desc)
     778          16 :                CALL rs_grid_zero(rs_single_charge(i))
     779          24 :                compute_charge(cdft_control%atoms(i)) = .TRUE.
     780             :             END DO
     781             : 
     782          24 :             DO iatom = 1, cdft_control%natoms
     783          16 :                CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_atomic_charge(iatom))
     784          24 :                CALL pw_set(cdft_control%group(igroup)%hw_rho_atomic_charge(iatom), 1.0_dp)
     785             :             END DO
     786             :          END IF
     787             : 
     788          24 :          ALLOCATE (pab(1, 1))
     789          24 :          nthread = 1
     790          24 :          ithread = 0
     791             : 
     792          72 :          DO ikind = 1, SIZE(atomic_kind_set)
     793          48 :             numexp = hirshfeld_env%kind_shape_fn(ikind)%numexp
     794          48 :             IF (numexp <= 0) CYCLE
     795          48 :             CALL get_atomic_kind(atomic_kind_set(ikind), natom=num_species, atom_list=atom_list)
     796         144 :             ALLOCATE (cores(num_species))
     797             : 
     798         180 :             DO iex = 1, numexp
     799         132 :                alpha = hirshfeld_env%kind_shape_fn(ikind)%zet(iex)
     800         132 :                coef = hirshfeld_env%kind_shape_fn(ikind)%coef(iex)
     801         132 :                npme = 0
     802         264 :                cores = 0
     803         264 :                DO iatom = 1, num_species
     804         132 :                   atom_a = atom_list(iatom)
     805         132 :                   ra(:) = pbc(particle_set(atom_a)%r, cell)
     806         264 :                   IF (rs_rho_all%desc%parallel .AND. .NOT. rs_rho_all%desc%distributed) THEN
     807         128 :                      IF (MODULO(iatom, rs_rho_all%desc%group_size) == rs_rho_all%desc%my_pos) THEN
     808          64 :                         npme = npme + 1
     809          64 :                         cores(npme) = iatom
     810             :                      END IF
     811             :                   ELSE
     812           4 :                      npme = npme + 1
     813           4 :                      cores(npme) = iatom
     814             :                   END IF
     815             :                END DO
     816         248 :                DO j = 1, npme
     817          68 :                   iatom = cores(j)
     818          68 :                   atom_a = atom_list(iatom)
     819          68 :                   pab(1, 1) = coef*hirshfeld_env%charges(atom_a)
     820          68 :                   ra(:) = pbc(particle_set(atom_a)%r, cell)
     821             : 
     822          68 :                   IF (hirshfeld_control%use_atomic_cutoff) THEN
     823             :                      radius = exp_radius_very_extended(la_min=0, la_max=0, lb_min=0, lb_max=0, &
     824             :                                                        ra=ra, rb=ra, rp=ra, &
     825             :                                                        zetp=alpha, eps=hirshfeld_control%atomic_cutoff, &
     826             :                                                        pab=pab, o1=0, o2=0, &  ! without map_consistent
     827          68 :                                                        prefactor=1.0_dp, cutoff=0.0_dp)
     828             :                      ! IF (para_env%is_source()) PRINT *, "radius", radius
     829             :                   END IF
     830             : 
     831          68 :                   IF (igroup == 1) THEN
     832             :                      CALL collocate_pgf_product(0, alpha, 0, 0, 0.0_dp, 0, ra, &
     833             :                                                 (/0.0_dp, 0.0_dp, 0.0_dp/), 1.0_dp, pab, 0, 0, &
     834             :                                                 rs_rho_all, radius=radius, &
     835             :                                                 ga_gb_function=GRID_FUNC_AB, use_subpatch=.TRUE., &
     836          68 :                                                 subpatch_pattern=subpatch_pattern)
     837             :                   END IF
     838             : 
     839          68 :                   IF (is_constraint(atom_a)) THEN
     840             :                      CALL collocate_pgf_product(0, alpha, 0, 0, 0.0_dp, 0, ra, &
     841             :                                                 (/0.0_dp, 0.0_dp, 0.0_dp/), coefficients(atom_a), &
     842             :                                                 pab, 0, 0, rs_rho_constr, &
     843             :                                                 radius=radius, &
     844             :                                                 ga_gb_function=GRID_FUNC_AB, use_subpatch=.TRUE., &
     845          67 :                                                 subpatch_pattern=subpatch_pattern)
     846             :                   END IF
     847             : 
     848          68 :                   IF (hirshfeld_control%print_density .AND. igroup == 1) THEN
     849           0 :                      IF (is_constraint(atom_a)) THEN
     850           0 :                      DO iatom = 1, cdft_control%natoms
     851           0 :                         IF (atom_a == cdft_control%atoms(iatom)) EXIT
     852             :                      END DO
     853           0 :                      CPASSERT(iatom <= cdft_control%natoms)
     854             :                      CALL collocate_pgf_product(0, alpha, 0, 0, 0.0_dp, 0, ra, &
     855             :                                                 (/0.0_dp, 0.0_dp, 0.0_dp/), 1.0_dp, pab, 0, 0, &
     856             :                                                 rs_single(iatom), radius=radius, &
     857             :                                                 ga_gb_function=GRID_FUNC_AB, use_subpatch=.TRUE., &
     858           0 :                                                 subpatch_pattern=subpatch_pattern)
     859             :                      END IF
     860             :                   END IF
     861             : 
     862         200 :                   IF (cdft_control%atomic_charges .AND. igroup == 1) THEN
     863          22 :                      IF (compute_charge(atom_a)) THEN
     864          33 :                         DO iatom = 1, cdft_control%natoms
     865          33 :                            IF (atom_a == cdft_control%atoms(iatom)) EXIT
     866             :                         END DO
     867          22 :                         CPASSERT(iatom <= cdft_control%natoms)
     868             :                         CALL collocate_pgf_product(0, alpha, 0, 0, 0.0_dp, 0, ra, &
     869             :                                                    (/0.0_dp, 0.0_dp, 0.0_dp/), 1.0_dp, pab, 0, 0, &
     870             :                                                    rs_single_charge(iatom), radius=radius, &
     871             :                                                    ga_gb_function=GRID_FUNC_AB, use_subpatch=.TRUE., &
     872          22 :                                                    subpatch_pattern=subpatch_pattern)
     873             :                      END IF
     874             :                   END IF
     875             : 
     876             :                END DO
     877             :             END DO
     878         120 :             DEALLOCATE (cores)
     879             :          END DO
     880          24 :          DEALLOCATE (pab)
     881             : 
     882          24 :          IF (igroup == 1) THEN
     883          24 :             CALL transfer_rs2pw(rs_rho_all, cdft_control%group(igroup)%hw_rho_total)
     884             :          END IF
     885             : 
     886          24 :          CALL transfer_rs2pw(rs_rho_constr, cdft_control%group(igroup)%hw_rho_total_constraint)
     887          24 :          CALL rs_grid_release(rs_rho_constr)
     888             : 
     889             :          ! Calculate weight function
     890             :          CALL hfun_scale(cdft_control%group(igroup)%weight%array, &
     891             :                          cdft_control%group(igroup)%hw_rho_total_constraint%array, &
     892             :                          cdft_control%group(1)%hw_rho_total%array, divide=.TRUE., &
     893          24 :                          small=hirshfeld_control%eps_cutoff)
     894             : 
     895             :          ! Calculate charges
     896          24 :          IF (cdft_control%atomic_charges .AND. igroup == 1) THEN
     897          24 :             DO i = 1, cdft_control%natoms
     898          16 :                CALL transfer_rs2pw(rs_single_charge(i), cdft_control%group(igroup)%hw_rho_atomic_charge(i))
     899             :                CALL hfun_scale(cdft_control%charge(i)%array, &
     900             :                                cdft_control%group(igroup)%hw_rho_atomic_charge(i)%array, &
     901             :                                cdft_control%group(igroup)%hw_rho_total%array, divide=.TRUE., &
     902          24 :                                small=hirshfeld_control%eps_cutoff)
     903             :             END DO
     904             :          END IF
     905             : 
     906             :          ! Print atomic densities if requested
     907          48 :          IF (hirshfeld_control%print_density .AND. igroup == 1) THEN
     908           0 :             DO i = 1, cdft_control%natoms
     909           0 :                CALL transfer_rs2pw(rs_single(i), cdft_control%group(igroup)%hw_rho_atomic(i))
     910             :             END DO
     911           0 :             CALL cdft_print_hirshfeld_density(qs_env)
     912             :          END IF
     913             : 
     914             :       END DO
     915             : 
     916          48 :       DO igroup = 1, SIZE(cdft_control%group)
     917             : 
     918          24 :          CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_total_constraint)
     919             : 
     920          24 :          IF (.NOT. cdft_control%in_memory .AND. igroup == 1) THEN
     921          22 :             CALL auxbas_pw_pool%give_back_pw(cdft_control%group(1)%hw_rho_total)
     922             :          END IF
     923             : 
     924          24 :          IF (hirshfeld_control%print_density .AND. igroup == 1) THEN
     925           0 :             DO i = 1, cdft_control%natoms
     926           0 :                CALL rs_grid_release(rs_single(i))
     927           0 :                CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_atomic(i))
     928             :             END DO
     929           0 :             DEALLOCATE (rs_single)
     930           0 :             DEALLOCATE (cdft_control%group(igroup)%hw_rho_atomic)
     931             :          END IF
     932             : 
     933          48 :          IF (cdft_control%atomic_charges .AND. igroup == 1) THEN
     934          24 :             DO i = 1, cdft_control%natoms
     935          16 :                CALL rs_grid_release(rs_single_charge(i))
     936          24 :                CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_atomic_charge(i))
     937             :             END DO
     938          24 :             DEALLOCATE (rs_single_charge)
     939           8 :             DEALLOCATE (compute_charge)
     940           8 :             DEALLOCATE (cdft_control%group(igroup)%hw_rho_atomic_charge)
     941             :          END IF
     942             : 
     943             :       END DO
     944             : 
     945          24 :       IF (cdft_control%in_memory) THEN
     946           4 :          DO igroup = 1, SIZE(cdft_control%group)
     947             :             ALLOCATE (cdft_control%group(igroup)%gradients_x(1*natom, lb_pw(1):ub_pw(1), &
     948          12 :                                                              lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
     949      195284 :             cdft_control%group(igroup)%gradients_x(:, :, :, :) = 0.0_dp
     950             :          END DO
     951             :       END IF
     952             : 
     953          24 :       IF (cdft_control%in_memory) THEN
     954           4 :          DO igroup = 1, SIZE(cdft_control%group)
     955             : 
     956           2 :             ALLOCATE (pab(1, 1))
     957           2 :             nthread = 1
     958           2 :             ithread = 0
     959           2 :             atoms_memory = hirshfeld_control%atoms_memory
     960             : 
     961           6 :             DO ikind = 1, SIZE(atomic_kind_set)
     962           4 :                numexp = hirshfeld_env%kind_shape_fn(ikind)%numexp
     963           4 :                IF (numexp <= 0) CYCLE
     964           4 :                CALL get_atomic_kind(atomic_kind_set(ikind), natom=num_species, atom_list=atom_list)
     965             : 
     966          16 :                ALLOCATE (pw_single_dr(num_species))
     967          96 :                ALLOCATE (rs_single_dr(num_species))
     968             : 
     969           8 :                DO i = 1, num_species
     970           4 :                   CALL auxbas_pw_pool%create_pw(pw_single_dr(i))
     971           8 :                   CALL pw_zero(pw_single_dr(i))
     972             :                END DO
     973             : 
     974          16 :                atoms_memory_num = SIZE((/(j, j=1, num_species, atoms_memory)/))
     975             : 
     976             :                ! Can't store all pw grids, therefore split into groups of size atom_memory
     977             :                ! Ideally this code should be re-written to be more memory efficient
     978           4 :                IF (num_species > atoms_memory) THEN
     979           0 :                   ALLOCATE (num_species_small(atoms_memory_num + 1))
     980           0 :                   num_species_small(1:atoms_memory_num) = (/(j, j=1, num_species, atoms_memory)/)
     981           0 :                   num_species_small(atoms_memory_num + 1) = num_species
     982             :                ELSE
     983           4 :                   ALLOCATE (num_species_small(2))
     984          12 :                   num_species_small(:) = (/1, num_species/)
     985             :                END IF
     986             : 
     987           8 :                DO k = 1, SIZE(num_species_small) - 1
     988           4 :                   IF (num_species > atoms_memory) THEN
     989           0 :                      ALLOCATE (cores(num_species_small(k + 1) - (num_species_small(k) - 1)))
     990             :                   ELSE
     991          12 :                      ALLOCATE (cores(num_species))
     992             :                   END IF
     993             : 
     994           8 :                   DO i = num_species_small(k), num_species_small(k + 1)
     995           4 :                      CALL rs_grid_create(rs_single_dr(i), auxbas_rs_desc)
     996           8 :                      CALL rs_grid_zero(rs_single_dr(i))
     997             :                   END DO
     998          36 :                   DO iex = 1, numexp
     999             : 
    1000          32 :                      alpha = hirshfeld_env%kind_shape_fn(ikind)%zet(iex)
    1001          32 :                      coef = hirshfeld_env%kind_shape_fn(ikind)%coef(iex)
    1002          32 :                      prefactor = 2.0_dp*alpha
    1003          32 :                      npme = 0
    1004          64 :                      cores = 0
    1005             : 
    1006          64 :                      DO iatom = 1, SIZE(cores)
    1007          32 :                         atom_a = atom_list(iatom + (num_species_small(k) - 1))
    1008          32 :                         ra(:) = pbc(particle_set(atom_a)%r, cell)
    1009             : 
    1010          64 :                         IF (rs_rho_all%desc%parallel .AND. .NOT. rs_rho_all%desc%distributed) THEN
    1011          32 :                            IF (MODULO(iatom, rs_rho_all%desc%group_size) == rs_rho_all%desc%my_pos) THEN
    1012          16 :                               npme = npme + 1
    1013          16 :                               cores(npme) = iatom
    1014             :                            END IF
    1015             :                         ELSE
    1016           0 :                            npme = npme + 1
    1017           0 :                            cores(npme) = iatom
    1018             :                         END IF
    1019             :                      END DO
    1020          52 :                      DO j = 1, npme
    1021          16 :                         iatom = cores(j)
    1022          16 :                         atom_a = atom_list(iatom + (num_species_small(k) - 1))
    1023          16 :                         pab(1, 1) = coef*hirshfeld_env%charges(atom_a)
    1024          16 :                         ra(:) = pbc(particle_set(atom_a)%r, cell)
    1025          16 :                         subpatch_pattern = 0
    1026             : 
    1027             :                         ! Calculate cutoff
    1028          16 :                         IF (hirshfeld_control%use_atomic_cutoff) THEN
    1029             :                            radius = exp_radius_very_extended(la_min=0, la_max=0, lb_min=0, lb_max=0, &
    1030             :                                                              ra=ra, rb=ra, rp=ra, &
    1031             :                                                              zetp=alpha, eps=hirshfeld_control%atomic_cutoff, &
    1032             :                                                              pab=pab, o1=0, o2=0, &  ! without map_consistent
    1033          16 :                                                              prefactor=1.0_dp, cutoff=0.0_dp)
    1034             :                         END IF
    1035             : 
    1036             :                         CALL collocate_pgf_product(0, alpha, 0, 0, 0.0_dp, 0, ra, &
    1037             :                                                    (/0.0_dp, 0.0_dp, 0.0_dp/), prefactor, &
    1038             :                                                    pab, 0, 0, rs_single_dr(iatom + (num_species_small(k) - 1)), &
    1039             :                                                    radius=radius, &
    1040             :                                                    ga_gb_function=GRID_FUNC_AB, use_subpatch=.TRUE., &
    1041          48 :                                                    subpatch_pattern=subpatch_pattern)
    1042             : 
    1043             :                      END DO
    1044             :                   END DO
    1045             : 
    1046           8 :                   DO iatom = num_species_small(k), num_species_small(k + 1)
    1047           4 :                      CALL transfer_rs2pw(rs_single_dr(iatom), pw_single_dr(iatom))
    1048           8 :                      CALL rs_grid_release(rs_single_dr(iatom))
    1049             :                   END DO
    1050             : 
    1051           8 :                   DEALLOCATE (cores)
    1052             :                END DO
    1053             : 
    1054           8 :                DO iatom = 1, num_species
    1055           4 :                   atom_a = atom_list(iatom)
    1056      134564 :                   cdft_control%group(igroup)%gradients_x(atom_a, :, :, :) = pw_single_dr(iatom)%array(:, :, :)
    1057           8 :                   CALL auxbas_pw_pool%give_back_pw(pw_single_dr(iatom))
    1058             :                END DO
    1059             : 
    1060           8 :                DEALLOCATE (rs_single_dr)
    1061           4 :                DEALLOCATE (num_species_small)
    1062          10 :                DEALLOCATE (pw_single_dr)
    1063             :             END DO
    1064           4 :             DEALLOCATE (pab)
    1065             :          END DO
    1066             :       END IF
    1067             : 
    1068          24 :       IF (cdft_control%in_memory) THEN
    1069           4 :          DO igroup = 1, SIZE(cdft_control%group)
    1070             :             ALLOCATE (cdft_control%group(igroup)%gradients_y(1*num_atoms, lb_pw(1):ub_pw(1), &
    1071          12 :                                                              lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
    1072             :             ALLOCATE (cdft_control%group(igroup)%gradients_z(1*num_atoms, lb_pw(1):ub_pw(1), &
    1073          12 :                                                              lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
    1074      195282 :             cdft_control%group(igroup)%gradients_y(:, :, :, :) = cdft_control%group(igroup)%gradients_x(:, :, :, :)
    1075      195284 :             cdft_control%group(igroup)%gradients_z(:, :, :, :) = cdft_control%group(igroup)%gradients_x(:, :, :, :)
    1076             :          END DO
    1077             :       END IF
    1078             : 
    1079             :       ! Calculate gradient if requested
    1080          24 :       IF (cdft_control%in_memory) THEN
    1081             : 
    1082           4 :          DO igroup = 1, SIZE(cdft_control%group)
    1083          82 :             DO k = lb_pw(3), ub_pw(3)
    1084        3282 :                DO j = lb_pw(2), ub_pw(2)
    1085       67280 :                   DO i = lb_pw(1), ub_pw(1)
    1086      195200 :                   DO iatom = 1, natom
    1087             : 
    1088      512000 :                      ra(:) = particle_set(iatom)%r
    1089             : 
    1090      192000 :                      IF (cdft_control%group(igroup)%hw_rho_total%array(i, j, k) > hirshfeld_control%eps_cutoff) THEN
    1091             : 
    1092             :                         exp_eval = (coefficients(iatom) - &
    1093             :                                     cdft_control%group(igroup)%weight%array(i, j, k))/ &
    1094      128000 :                                    cdft_control%group(igroup)%hw_rho_total%array(i, j, k)
    1095             : 
    1096      512000 :                         r2 = (/i*dr_pw(1), j*dr_pw(2), k*dr_pw(3)/) + origin
    1097      128000 :                         r_pbc = pbc(ra, r2, cell)
    1098             : 
    1099             :                         ! Store gradient d/dR_x w, including term: (r_x - R_x)
    1100             :                         cdft_control%group(igroup)%gradients_x(iatom, i, j, k) = &
    1101             :                            cdft_control%group(igroup)%gradients_x(iatom, i, j, k)* &
    1102      128000 :                            r_pbc(1)*exp_eval
    1103             : 
    1104             :                         ! Store gradient d/dR_y w, including term: (r_y - R_y)
    1105             :                         cdft_control%group(igroup)%gradients_y(iatom, i, j, k) = &
    1106             :                            cdft_control%group(igroup)%gradients_y(iatom, i, j, k)* &
    1107      128000 :                            r_pbc(2)*exp_eval
    1108             : 
    1109             :                         ! Store gradient d/dR_z w, including term:(r_z - R_z)
    1110             :                         cdft_control%group(igroup)%gradients_z(iatom, i, j, k) = &
    1111             :                            cdft_control%group(igroup)%gradients_z(iatom, i, j, k)* &
    1112      128000 :                            r_pbc(3)*exp_eval
    1113             : 
    1114             :                      END IF
    1115             :                   END DO
    1116             :                   END DO
    1117             :                END DO
    1118             :             END DO
    1119             : 
    1120           4 :             IF (igroup == 1) THEN
    1121           2 :                CALL auxbas_pw_pool%give_back_pw(cdft_control%group(1)%hw_rho_total)
    1122             :             END IF
    1123             :          END DO
    1124             :       END IF
    1125             : 
    1126          24 :       CALL rs_grid_release(rs_rho_all)
    1127             : 
    1128          24 :       IF (ALLOCATED(coefficients)) DEALLOCATE (coefficients)
    1129          24 :       IF (ALLOCATED(is_constraint)) DEALLOCATE (is_constraint)
    1130             : 
    1131          24 :       CALL timestop(handle)
    1132             : 
    1133          72 :    END SUBROUTINE hirshfeld_constraint_low
    1134             : 
    1135             : ! **************************************************************************************************
    1136             : !> \brief Calculates the value of a CDFT constraint by integrating the product of the CDFT
    1137             : !>        weight function and the realspace electron density
    1138             : !> \param qs_env ...
    1139             : ! **************************************************************************************************
    1140        3034 :    SUBROUTINE cdft_constraint_integrate(qs_env)
    1141             :       TYPE(qs_environment_type), POINTER                 :: qs_env
    1142             : 
    1143             :       CHARACTER(len=*), PARAMETER :: routineN = 'cdft_constraint_integrate'
    1144             : 
    1145             :       INTEGER                                            :: handle, i, iatom, igroup, ikind, ivar, &
    1146             :                                                             iw, jatom, natom, nvar
    1147             :       LOGICAL                                            :: is_becke, paw_atom
    1148             :       REAL(kind=dp)                                      :: dvol, eps_cavity, sign
    1149        3034 :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: dE, strength, target_val
    1150        3034 :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :)        :: electronic_charge, gapw_offset
    1151             :       TYPE(becke_constraint_type), POINTER               :: becke_control
    1152             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
    1153        3034 :       TYPE(cdft_group_type), DIMENSION(:), POINTER       :: group
    1154             :       TYPE(cp_logger_type), POINTER                      :: logger
    1155             :       TYPE(dft_control_type), POINTER                    :: dft_control
    1156             :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1157        3034 :       TYPE(mpole_rho_atom), DIMENSION(:), POINTER        :: mp_rho
    1158        3034 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
    1159        3034 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: charge, rho_r
    1160             :       TYPE(qs_energy_type), POINTER                      :: energy
    1161        3034 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
    1162             :       TYPE(qs_rho_type), POINTER                         :: rho
    1163             :       TYPE(rho0_mpole_type), POINTER                     :: rho0_mpole
    1164             :       TYPE(section_vals_type), POINTER                   :: cdft_constraint_section
    1165             : 
    1166        3034 :       NULLIFY (para_env, dft_control, particle_set, rho_r, energy, rho, &
    1167        3034 :                logger, cdft_constraint_section, qs_kind_set, mp_rho, &
    1168        3034 :                rho0_mpole, group, charge)
    1169        3034 :       CALL timeset(routineN, handle)
    1170        3034 :       logger => cp_get_default_logger()
    1171             :       CALL get_qs_env(qs_env, &
    1172             :                       particle_set=particle_set, &
    1173             :                       rho=rho, &
    1174             :                       natom=natom, &
    1175             :                       dft_control=dft_control, &
    1176             :                       para_env=para_env, &
    1177        3034 :                       qs_kind_set=qs_kind_set)
    1178        3034 :       CALL qs_rho_get(rho, rho_r=rho_r)
    1179        3034 :       CPASSERT(ASSOCIATED(qs_kind_set))
    1180        3034 :       cdft_constraint_section => section_vals_get_subs_vals(qs_env%input, "DFT%QS%CDFT")
    1181        3034 :       iw = cp_print_key_unit_nr(logger, cdft_constraint_section, "PROGRAM_RUN_INFO", extension=".cdftLog")
    1182        3034 :       cdft_control => dft_control%qs_control%cdft_control
    1183        3034 :       is_becke = (cdft_control%type == outer_scf_becke_constraint)
    1184        3034 :       becke_control => cdft_control%becke_control
    1185        3034 :       IF (is_becke .AND. .NOT. ASSOCIATED(becke_control)) &
    1186           0 :          CPABORT("Becke control has not been allocated.")
    1187        3034 :       group => cdft_control%group
    1188             :       ! Initialize
    1189        3034 :       nvar = SIZE(cdft_control%target)
    1190        9102 :       ALLOCATE (strength(nvar))
    1191        9102 :       ALLOCATE (target_val(nvar))
    1192        9102 :       ALLOCATE (dE(nvar))
    1193        7044 :       strength(:) = cdft_control%strength(:)
    1194        7044 :       target_val(:) = cdft_control%target(:)
    1195        7044 :       sign = 1.0_dp
    1196        7044 :       dE = 0.0_dp
    1197        3034 :       dvol = group(1)%weight%pw_grid%dvol
    1198        3034 :       IF (cdft_control%atomic_charges) THEN
    1199        1598 :          charge => cdft_control%charge
    1200        6392 :          ALLOCATE (electronic_charge(cdft_control%natoms, dft_control%nspins))
    1201       11018 :          electronic_charge = 0.0_dp
    1202             :       END IF
    1203             :       ! Calculate value of constraint i.e. int ( rho(r) w(r) dr)
    1204        9102 :       DO i = 1, dft_control%nspins
    1205       14088 :          DO igroup = 1, SIZE(group)
    1206        8020 :             SELECT CASE (group(igroup)%constraint_type)
    1207             :             CASE (cdft_charge_constraint)
    1208          16 :                sign = 1.0_dp
    1209             :             CASE (cdft_magnetization_constraint)
    1210          16 :                IF (i == 1) THEN
    1211             :                   sign = 1.0_dp
    1212             :                ELSE
    1213           8 :                   sign = -1.0_dp
    1214             :                END IF
    1215             :             CASE (cdft_alpha_constraint)
    1216        1944 :                sign = 1.0_dp
    1217        1944 :                IF (i == 2) CYCLE
    1218             :             CASE (cdft_beta_constraint)
    1219        1944 :                sign = 1.0_dp
    1220        1944 :                IF (i == 1) CYCLE
    1221             :             CASE DEFAULT
    1222        8020 :                CPABORT("Unknown constraint type.")
    1223             :             END SELECT
    1224       12144 :             IF (is_becke .AND. (cdft_control%external_control .AND. becke_control%cavity_confine)) THEN
    1225             :                ! With external control, we can use cavity_mat as a mask to kahan sum
    1226         180 :                eps_cavity = becke_control%eps_cavity
    1227         180 :                IF (igroup /= 1) &
    1228             :                   CALL cp_abort(__LOCATION__, &
    1229           0 :                                 "Multiple constraints not yet supported by parallel mixed calculations.")
    1230             :                dE(igroup) = dE(igroup) + sign*accurate_dot_product(group(igroup)%weight%array, rho_r(i)%array, &
    1231         180 :                                                                    becke_control%cavity_mat, eps_cavity)*dvol
    1232             :             ELSE
    1233        5896 :                dE(igroup) = dE(igroup) + sign*pw_integral_ab(group(igroup)%weight, rho_r(i), local_only=.TRUE.)
    1234             :             END IF
    1235             :          END DO
    1236        9102 :          IF (cdft_control%atomic_charges) THEN
    1237        9420 :             DO iatom = 1, cdft_control%natoms
    1238        9420 :                electronic_charge(iatom, i) = pw_integral_ab(charge(iatom), rho_r(i), local_only=.TRUE.)
    1239             :             END DO
    1240             :          END IF
    1241             :       END DO
    1242        3034 :       CALL get_qs_env(qs_env, energy=energy)
    1243        3034 :       CALL para_env%sum(dE)
    1244        3034 :       IF (cdft_control%atomic_charges) THEN
    1245        1598 :          CALL para_env%sum(electronic_charge)
    1246             :       END IF
    1247             :       ! Use fragment densities as reference value (= Becke deformation density)
    1248        3034 :       IF (cdft_control%fragment_density .AND. .NOT. cdft_control%fragments_integrated) THEN
    1249          10 :          CALL prepare_fragment_constraint(qs_env)
    1250             :       END IF
    1251        3034 :       IF (dft_control%qs_control%gapw) THEN
    1252             :          ! GAPW: add core charges (rho_hard - rho_soft)
    1253          46 :          IF (cdft_control%fragment_density) &
    1254             :             CALL cp_abort(__LOCATION__, &
    1255           0 :                           "Fragment constraints not yet compatible with GAPW.")
    1256         184 :          ALLOCATE (gapw_offset(nvar, dft_control%nspins))
    1257         230 :          gapw_offset = 0.0_dp
    1258          46 :          CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
    1259          46 :          CALL get_rho0_mpole(rho0_mpole, mp_rho=mp_rho)
    1260         138 :          DO i = 1, dft_control%nspins
    1261         230 :             DO igroup = 1, SIZE(group)
    1262         460 :                DO iatom = 1, SIZE(group(igroup)%atoms)
    1263         276 :                   SELECT CASE (group(igroup)%constraint_type)
    1264             :                   CASE (cdft_charge_constraint)
    1265           0 :                      sign = 1.0_dp
    1266             :                   CASE (cdft_magnetization_constraint)
    1267           0 :                      IF (i == 1) THEN
    1268             :                         sign = 1.0_dp
    1269             :                      ELSE
    1270           0 :                         sign = -1.0_dp
    1271             :                      END IF
    1272             :                   CASE (cdft_alpha_constraint)
    1273           0 :                      sign = 1.0_dp
    1274           0 :                      IF (i == 2) CYCLE
    1275             :                   CASE (cdft_beta_constraint)
    1276           0 :                      sign = 1.0_dp
    1277           0 :                      IF (i == 1) CYCLE
    1278             :                   CASE DEFAULT
    1279         276 :                      CPABORT("Unknown constraint type.")
    1280             :                   END SELECT
    1281         276 :                   jatom = group(igroup)%atoms(iatom)
    1282         276 :                   CALL get_atomic_kind(particle_set(jatom)%atomic_kind, kind_number=ikind)
    1283         276 :                   CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
    1284         368 :                   IF (paw_atom) THEN
    1285         276 :                      gapw_offset(igroup, i) = gapw_offset(igroup, i) + sign*group(igroup)%coeff(iatom)*mp_rho(jatom)%q0(i)
    1286             :                   END IF
    1287             :                END DO
    1288             :             END DO
    1289             :          END DO
    1290          46 :          IF (cdft_control%atomic_charges) THEN
    1291         184 :             DO iatom = 1, cdft_control%natoms
    1292         138 :                jatom = cdft_control%atoms(iatom)
    1293         138 :                CALL get_atomic_kind(particle_set(jatom)%atomic_kind, kind_number=ikind)
    1294         138 :                CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
    1295         184 :                IF (paw_atom) THEN
    1296         414 :                   DO i = 1, dft_control%nspins
    1297         414 :                      electronic_charge(iatom, i) = electronic_charge(iatom, i) + mp_rho(jatom)%q0(i)
    1298             :                   END DO
    1299             :                END IF
    1300             :             END DO
    1301             :          END IF
    1302         138 :          DO i = 1, dft_control%nspins
    1303         230 :             DO ivar = 1, nvar
    1304         184 :                dE(ivar) = dE(ivar) + gapw_offset(ivar, i)
    1305             :             END DO
    1306             :          END DO
    1307          46 :          DEALLOCATE (gapw_offset)
    1308             :       END IF
    1309             :       ! Update constraint value and energy
    1310        7044 :       cdft_control%value(:) = dE(:)
    1311        3034 :       energy%cdft = 0.0_dp
    1312        7044 :       DO ivar = 1, nvar
    1313        7044 :          energy%cdft = energy%cdft + (dE(ivar) - target_val(ivar))*strength(ivar)
    1314             :       END DO
    1315             :       ! Print constraint info and atomic CDFT charges
    1316        3034 :       CALL cdft_constraint_print(qs_env, electronic_charge)
    1317             :       ! Deallocate tmp storage
    1318        3034 :       DEALLOCATE (dE, strength, target_val)
    1319        3034 :       IF (cdft_control%atomic_charges) DEALLOCATE (electronic_charge)
    1320        3034 :       CALL cp_print_key_finished_output(iw, logger, cdft_constraint_section, "PROGRAM_RUN_INFO")
    1321        3034 :       CALL timestop(handle)
    1322             : 
    1323        6068 :    END SUBROUTINE cdft_constraint_integrate
    1324             : 
    1325             : ! **************************************************************************************************
    1326             : !> \brief Calculates atomic forces due to a CDFT constraint (Becke or Hirshfeld)
    1327             : !> \param qs_env ...
    1328             : ! **************************************************************************************************
    1329         118 :    SUBROUTINE cdft_constraint_force(qs_env)
    1330             :       TYPE(qs_environment_type), POINTER                 :: qs_env
    1331             : 
    1332             :       CHARACTER(len=*), PARAMETER :: routineN = 'cdft_constraint_force'
    1333             : 
    1334             :       INTEGER                                            :: handle, i, iatom, igroup, ikind, ispin, &
    1335             :                                                             j, k, natom, nvar
    1336         118 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind, kind_of
    1337             :       INTEGER, DIMENSION(2, 3)                           :: bo
    1338             :       INTEGER, DIMENSION(3)                              :: lb, ub
    1339             :       REAL(kind=dp)                                      :: dvol, eps_cavity, sign
    1340         118 :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: strength
    1341         118 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: cutoffs
    1342         118 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
    1343             :       TYPE(becke_constraint_type), POINTER               :: becke_control
    1344             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
    1345         118 :       TYPE(cdft_group_type), DIMENSION(:), POINTER       :: group
    1346             :       TYPE(cell_type), POINTER                           :: cell
    1347             :       TYPE(dft_control_type), POINTER                    :: dft_control
    1348             :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1349         118 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
    1350         118 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r
    1351         118 :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
    1352             :       TYPE(qs_rho_type), POINTER                         :: rho
    1353             : 
    1354         118 :       CALL timeset(routineN, handle)
    1355         118 :       NULLIFY (atomic_kind_set, cell, para_env, dft_control, particle_set, &
    1356         118 :                rho, rho_r, force, cutoffs, becke_control, group)
    1357             : 
    1358             :       CALL get_qs_env(qs_env, &
    1359             :                       atomic_kind_set=atomic_kind_set, &
    1360             :                       natom=natom, &
    1361             :                       particle_set=particle_set, &
    1362             :                       cell=cell, &
    1363             :                       rho=rho, &
    1364             :                       force=force, &
    1365             :                       dft_control=dft_control, &
    1366         118 :                       para_env=para_env)
    1367         118 :       CALL qs_rho_get(rho, rho_r=rho_r)
    1368             : 
    1369         118 :       cdft_control => dft_control%qs_control%cdft_control
    1370         118 :       becke_control => cdft_control%becke_control
    1371         118 :       group => cdft_control%group
    1372         118 :       nvar = SIZE(cdft_control%target)
    1373         354 :       ALLOCATE (strength(nvar))
    1374         252 :       strength(:) = cdft_control%strength(:)
    1375         118 :       cutoffs => cdft_control%becke_control%cutoffs
    1376         118 :       eps_cavity = cdft_control%becke_control%eps_cavity
    1377             : 
    1378             :       CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
    1379             :                                atom_of_kind=atom_of_kind, &
    1380         118 :                                kind_of=kind_of)
    1381         252 :       DO igroup = 1, SIZE(cdft_control%group)
    1382         402 :          ALLOCATE (cdft_control%group(igroup)%integrated(3, natom))
    1383        1324 :          cdft_control%group(igroup)%integrated = 0.0_dp
    1384             :       END DO
    1385             : 
    1386         472 :       lb(1:3) = rho_r(1)%pw_grid%bounds_local(1, 1:3)
    1387         472 :       ub(1:3) = rho_r(1)%pw_grid%bounds_local(2, 1:3)
    1388        1180 :       bo = cdft_control%group(1)%weight%pw_grid%bounds_local
    1389         118 :       dvol = cdft_control%group(1)%weight%pw_grid%dvol
    1390         118 :       sign = 1.0_dp
    1391             : 
    1392         118 :       IF (cdft_control%type == outer_scf_becke_constraint) THEN
    1393         116 :          IF (.NOT. cdft_control%becke_control%in_memory) THEN
    1394          10 :             CALL becke_constraint_low(qs_env, just_gradients=.TRUE.)
    1395             :          END IF
    1396             : 
    1397           2 :       ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
    1398           2 :          IF (.NOT. cdft_control%in_memory) THEN
    1399           2 :             CALL hirshfeld_constraint_low(qs_env, just_gradients=.TRUE.)
    1400             :          END IF
    1401             :       END IF
    1402             : 
    1403             :       ! If no Becke Gaussian confinement
    1404         118 :       IF (.NOT. ASSOCIATED(becke_control%cavity_mat)) THEN
    1405             :          ! No external control
    1406        2106 :          DO k = bo(1, 1), bo(2, 1)
    1407       93674 :             DO j = bo(1, 2), bo(2, 2)
    1408     4518732 :                DO i = bo(1, 3), bo(2, 3)
    1409             :                   ! First check if this grid point should be skipped
    1410     4425152 :                   IF (cdft_control%becke_control%cavity_confine) THEN
    1411     4273152 :                      IF (cdft_control%becke_control%cavity%array(k, j, i) < eps_cavity) CYCLE
    1412             :                   END IF
    1413             : 
    1414     2713222 :                   DO igroup = 1, SIZE(cdft_control%group)
    1415     8512463 :                      DO iatom = 1, natom
    1416     9537059 :                         DO ispin = 1, dft_control%nspins
    1417             : 
    1418     5449748 :                            SELECT CASE (cdft_control%group(igroup)%constraint_type)
    1419             :                            CASE (cdft_charge_constraint)
    1420           0 :                               sign = 1.0_dp
    1421             :                            CASE (cdft_magnetization_constraint)
    1422           0 :                               IF (ispin == 1) THEN
    1423             :                                  sign = 1.0_dp
    1424             :                               ELSE
    1425           0 :                                  sign = -1.0_dp
    1426             :                               END IF
    1427             :                            CASE (cdft_alpha_constraint)
    1428      412880 :                               sign = 1.0_dp
    1429      412880 :                               IF (ispin == 2) CYCLE
    1430             :                            CASE (cdft_beta_constraint)
    1431      412880 :                               sign = 1.0_dp
    1432      412880 :                               IF (ispin == 1) CYCLE
    1433             :                            CASE DEFAULT
    1434     5449748 :                               CPABORT("Unknown constraint type.")
    1435             :                            END SELECT
    1436             : 
    1437     7761742 :                            IF (cdft_control%type == outer_scf_becke_constraint) THEN
    1438             : 
    1439             :                               cdft_control%group(igroup)%integrated(:, iatom) = &
    1440             :                                  cdft_control%group(igroup)%integrated(:, iatom) + sign* &
    1441             :                                  cdft_control%group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) &
    1442             :                                  *rho_r(ispin)%array(k, j, i) &
    1443    19123472 :                                  *dvol
    1444             : 
    1445      256000 :                            ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
    1446             : 
    1447             :                               cdft_control%group(igroup)%integrated(1, iatom) = &
    1448             :                                  cdft_control%group(igroup)%integrated(1, iatom) + sign* &
    1449             :                                  cdft_control%group(igroup)%gradients_x(iatom, k, j, i) &
    1450             :                                  *rho_r(ispin)%array(k, j, i) &
    1451      256000 :                                  *dvol
    1452             : 
    1453             :                               cdft_control%group(igroup)%integrated(2, iatom) = &
    1454             :                                  cdft_control%group(igroup)%integrated(2, iatom) + sign* &
    1455             :                                  cdft_control%group(igroup)%gradients_y(iatom, k, j, i) &
    1456             :                                  *rho_r(ispin)%array(k, j, i) &
    1457      256000 :                                  *dvol
    1458             : 
    1459             :                               cdft_control%group(igroup)%integrated(3, iatom) = &
    1460             :                                  cdft_control%group(igroup)%integrated(3, iatom) + sign* &
    1461             :                                  cdft_control%group(igroup)%gradients_z(iatom, k, j, i) &
    1462             :                                  *rho_r(ispin)%array(k, j, i) &
    1463      256000 :                                  *dvol
    1464             : 
    1465             :                            END IF
    1466             : 
    1467             :                         END DO
    1468             :                      END DO
    1469             :                   END DO
    1470             :                END DO
    1471             :             END DO
    1472             :          END DO
    1473             : 
    1474             :          ! If Becke Gaussian confinement
    1475             :       ELSE
    1476        1224 :          DO k = LBOUND(cdft_control%becke_control%cavity_mat, 1), UBOUND(cdft_control%becke_control%cavity_mat, 1)
    1477       61848 :             DO j = LBOUND(cdft_control%becke_control%cavity_mat, 2), UBOUND(cdft_control%becke_control%cavity_mat, 2)
    1478     2969728 :                DO i = LBOUND(cdft_control%becke_control%cavity_mat, 3), UBOUND(cdft_control%becke_control%cavity_mat, 3)
    1479             : 
    1480             :                   ! First check if this grid point should be skipped
    1481     2793472 :                   IF (cdft_control%becke_control%cavity_mat(k, j, i) < eps_cavity) CYCLE
    1482             : 
    1483     1747632 :                   DO igroup = 1, SIZE(group)
    1484     5327368 :                      DO iatom = 1, natom
    1485     5912424 :                         DO ispin = 1, dft_control%nspins
    1486     3378528 :                            SELECT CASE (group(igroup)%constraint_type)
    1487             :                            CASE (cdft_charge_constraint)
    1488           0 :                               sign = 1.0_dp
    1489             :                            CASE (cdft_magnetization_constraint)
    1490           0 :                               IF (ispin == 1) THEN
    1491             :                                  sign = 1.0_dp
    1492             :                               ELSE
    1493           0 :                                  sign = -1.0_dp
    1494             :                               END IF
    1495             :                            CASE (cdft_alpha_constraint)
    1496           0 :                               sign = 1.0_dp
    1497           0 :                               IF (ispin == 2) CYCLE
    1498             :                            CASE (cdft_beta_constraint)
    1499           0 :                               sign = 1.0_dp
    1500           0 :                               IF (ispin == 1) CYCLE
    1501             :                            CASE DEFAULT
    1502     3378528 :                               CPABORT("Unknown constraint type.")
    1503             :                            END SELECT
    1504             : 
    1505             :                            ! Integrate gradient of weight function
    1506     5067792 :                            IF (cdft_control%type == outer_scf_becke_constraint) THEN
    1507             : 
    1508             :                               cdft_control%group(igroup)%integrated(:, iatom) = &
    1509             :                                  cdft_control%group(igroup)%integrated(:, iatom) + sign* &
    1510             :                                  cdft_control%group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) &
    1511             :                                  *rho_r(ispin)%array(k, j, i) &
    1512    13514112 :                                  *dvol
    1513             : 
    1514           0 :                            ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
    1515             : 
    1516             :                               cdft_control%group(igroup)%integrated(1, iatom) = &
    1517             :                                  cdft_control%group(igroup)%integrated(1, iatom) + sign* &
    1518             :                                  cdft_control%group(igroup)%gradients_x(iatom, k, j, i) &
    1519             :                                  *rho_r(ispin)%array(k, j, i) &
    1520           0 :                                  *dvol
    1521             : 
    1522             :                               cdft_control%group(igroup)%integrated(2, iatom) = &
    1523             :                                  cdft_control%group(igroup)%integrated(2, iatom) + sign* &
    1524             :                                  cdft_control%group(igroup)%gradients_y(iatom, k, j, i) &
    1525             :                                  *rho_r(ispin)%array(k, j, i) &
    1526           0 :                                  *dvol
    1527             : 
    1528             :                               cdft_control%group(igroup)%integrated(3, iatom) = &
    1529             :                                  cdft_control%group(igroup)%integrated(3, iatom) + sign* &
    1530             :                                  cdft_control%group(igroup)%gradients_z(iatom, k, j, i) &
    1531             :                                  *rho_r(ispin)%array(k, j, i) &
    1532           0 :                                  *dvol
    1533             : 
    1534             :                            END IF
    1535             : 
    1536             :                         END DO
    1537             :                      END DO
    1538             :                   END DO
    1539             :                END DO
    1540             :             END DO
    1541             :          END DO
    1542             :       END IF
    1543             : 
    1544         118 :       IF (.NOT. cdft_control%transfer_pot) THEN
    1545          98 :          IF (cdft_control%type == outer_scf_becke_constraint) THEN
    1546         208 :             DO igroup = 1, SIZE(group)
    1547         208 :                DEALLOCATE (cdft_control%group(igroup)%gradients)
    1548             :             END DO
    1549           2 :          ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
    1550           4 :             DO igroup = 1, SIZE(group)
    1551           2 :                DEALLOCATE (cdft_control%group(igroup)%gradients_x)
    1552           2 :                DEALLOCATE (cdft_control%group(igroup)%gradients_y)
    1553           4 :                DEALLOCATE (cdft_control%group(igroup)%gradients_z)
    1554             :             END DO
    1555             :          END IF
    1556             :       END IF
    1557             : 
    1558         252 :       DO igroup = 1, SIZE(group)
    1559        2396 :          CALL para_env%sum(group(igroup)%integrated)
    1560             :       END DO
    1561             : 
    1562             :       ! Update force only on master process. Otherwise force due to constraint becomes multiplied
    1563             :       ! by the number of processes when the final force%rho_elec is constructed in qs_force
    1564             :       ! by mp_summing [the final integrated(:,:) is distributed on all processors]
    1565         118 :       IF (para_env%is_source()) THEN
    1566         150 :          DO igroup = 1, SIZE(group)
    1567         308 :             DO iatom = 1, natom
    1568         158 :                ikind = kind_of(iatom)
    1569         158 :                i = atom_of_kind(iatom)
    1570        1185 :                force(ikind)%rho_elec(:, i) = force(ikind)%rho_elec(:, i) + group(igroup)%integrated(:, iatom)*strength(igroup)
    1571             :             END DO
    1572             :          END DO
    1573             :       END IF
    1574             : 
    1575         118 :       DEALLOCATE (strength)
    1576         252 :       DO igroup = 1, SIZE(group)
    1577         252 :          DEALLOCATE (group(igroup)%integrated)
    1578             :       END DO
    1579         118 :       NULLIFY (group)
    1580             : 
    1581         118 :       CALL timestop(handle)
    1582             : 
    1583         236 :    END SUBROUTINE cdft_constraint_force
    1584             : 
    1585             : ! **************************************************************************************************
    1586             : !> \brief Prepare CDFT fragment constraints. Fragment densities are read from cube files, multiplied
    1587             : !>        by the CDFT weight functions and integrated over the realspace grid.
    1588             : !> \param qs_env ...
    1589             : ! **************************************************************************************************
    1590          10 :    SUBROUTINE prepare_fragment_constraint(qs_env)
    1591             :       TYPE(qs_environment_type), POINTER                 :: qs_env
    1592             : 
    1593             :       CHARACTER(len=*), PARAMETER :: routineN = 'prepare_fragment_constraint'
    1594             : 
    1595             :       INTEGER                                            :: handle, i, iatom, igroup, natom, &
    1596             :                                                             nelectron_total, nfrag_spins
    1597             :       LOGICAL                                            :: is_becke, needs_spin_density
    1598             :       REAL(kind=dp)                                      :: dvol, multiplier(2), nelectron_frag
    1599             :       TYPE(becke_constraint_type), POINTER               :: becke_control
    1600             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
    1601          10 :       TYPE(cdft_group_type), DIMENSION(:), POINTER       :: group
    1602             :       TYPE(cp_logger_type), POINTER                      :: logger
    1603             :       TYPE(dft_control_type), POINTER                    :: dft_control
    1604             :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1605             :       TYPE(pw_env_type), POINTER                         :: pw_env
    1606             :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
    1607          10 :       TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:)    :: rho_frag
    1608             :       TYPE(qs_subsys_type), POINTER                      :: subsys
    1609             : 
    1610          10 :       NULLIFY (para_env, dft_control, logger, subsys, pw_env, auxbas_pw_pool, group)
    1611          10 :       CALL timeset(routineN, handle)
    1612          10 :       logger => cp_get_default_logger()
    1613             :       CALL get_qs_env(qs_env, &
    1614             :                       natom=natom, &
    1615             :                       dft_control=dft_control, &
    1616          10 :                       para_env=para_env)
    1617             : 
    1618          10 :       cdft_control => dft_control%qs_control%cdft_control
    1619          10 :       is_becke = (cdft_control%type == outer_scf_becke_constraint)
    1620          10 :       becke_control => cdft_control%becke_control
    1621          10 :       IF (is_becke .AND. .NOT. ASSOCIATED(becke_control)) &
    1622           0 :          CPABORT("Becke control has not been allocated.")
    1623          10 :       group => cdft_control%group
    1624          10 :       dvol = group(1)%weight%pw_grid%dvol
    1625             :       ! Fragment densities are meaningful only for some calculation types
    1626          10 :       IF (.NOT. qs_env%single_point_run) &
    1627             :          CALL cp_abort(__LOCATION__, &
    1628             :                        "CDFT fragment constraints are only compatible with single "// &
    1629           0 :                        "point calculations (run_type ENERGY or ENERGY_FORCE).")
    1630          10 :       IF (dft_control%qs_control%gapw) &
    1631             :          CALL cp_abort(__LOCATION__, &
    1632           0 :                        "CDFT fragment constraint not compatible with GAPW.")
    1633          30 :       needs_spin_density = .FALSE.
    1634          30 :       multiplier = 1.0_dp
    1635          10 :       nfrag_spins = 1
    1636          22 :       DO igroup = 1, SIZE(group)
    1637          10 :          SELECT CASE (group(igroup)%constraint_type)
    1638             :          CASE (cdft_charge_constraint)
    1639             :             ! Do nothing
    1640             :          CASE (cdft_magnetization_constraint)
    1641           6 :             needs_spin_density = .TRUE.
    1642             :          CASE (cdft_alpha_constraint, cdft_beta_constraint)
    1643             :             CALL cp_abort(__LOCATION__, &
    1644             :                           "CDFT fragment constraint not yet compatible with "// &
    1645           0 :                           "spin specific constraints.")
    1646             :          CASE DEFAULT
    1647          12 :             CPABORT("Unknown constraint type.")
    1648             :          END SELECT
    1649             :       END DO
    1650          10 :       IF (needs_spin_density) THEN
    1651          12 :          nfrag_spins = 2
    1652          12 :          DO i = 1, 2
    1653          12 :             IF (cdft_control%flip_fragment(i)) multiplier(i) = -1.0_dp
    1654             :          END DO
    1655             :       END IF
    1656             :       ! Read fragment reference densities
    1657          78 :       ALLOCATE (cdft_control%fragments(nfrag_spins, 2))
    1658          44 :       ALLOCATE (rho_frag(nfrag_spins))
    1659          10 :       CALL get_qs_env(qs_env, pw_env=pw_env)
    1660          10 :       CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
    1661             :       ! Total density (rho_alpha + rho_beta)
    1662          10 :       CALL auxbas_pw_pool%create_pw(cdft_control%fragments(1, 1))
    1663             :       CALL cp_cube_to_pw(cdft_control%fragments(1, 1), &
    1664          10 :                          cdft_control%fragment_a_fname, 1.0_dp)
    1665          10 :       CALL auxbas_pw_pool%create_pw(cdft_control%fragments(1, 2))
    1666             :       CALL cp_cube_to_pw(cdft_control%fragments(1, 2), &
    1667          10 :                          cdft_control%fragment_b_fname, 1.0_dp)
    1668             :       ! Spin difference density (rho_alpha - rho_beta) if needed
    1669          10 :       IF (needs_spin_density) THEN
    1670           4 :          CALL auxbas_pw_pool%create_pw(cdft_control%fragments(2, 1))
    1671             :          CALL cp_cube_to_pw(cdft_control%fragments(2, 1), &
    1672           4 :                             cdft_control%fragment_a_spin_fname, multiplier(1))
    1673           4 :          CALL auxbas_pw_pool%create_pw(cdft_control%fragments(2, 2))
    1674             :          CALL cp_cube_to_pw(cdft_control%fragments(2, 2), &
    1675           4 :                             cdft_control%fragment_b_spin_fname, multiplier(2))
    1676             :       END IF
    1677             :       ! Sum up fragments
    1678          24 :       DO i = 1, nfrag_spins
    1679          14 :          CALL auxbas_pw_pool%create_pw(rho_frag(i))
    1680          14 :          CALL pw_copy(cdft_control%fragments(i, 1), rho_frag(i))
    1681          14 :          CALL pw_axpy(cdft_control%fragments(i, 2), rho_frag(i), 1.0_dp)
    1682          14 :          CALL auxbas_pw_pool%give_back_pw(cdft_control%fragments(i, 1))
    1683          24 :          CALL auxbas_pw_pool%give_back_pw(cdft_control%fragments(i, 2))
    1684             :       END DO
    1685          10 :       DEALLOCATE (cdft_control%fragments)
    1686             :       ! Check that the number of electrons is consistent
    1687          10 :       CALL get_qs_env(qs_env, subsys=subsys)
    1688          10 :       CALL qs_subsys_get(subsys, nelectron_total=nelectron_total)
    1689          10 :       nelectron_frag = pw_integrate_function(rho_frag(1))
    1690          10 :       IF (NINT(nelectron_frag) /= nelectron_total) &
    1691             :          CALL cp_abort(__LOCATION__, &
    1692             :                        "The number of electrons in the reference and interacting "// &
    1693           0 :                        "configurations does not match. Check your fragment cube files.")
    1694             :       ! Update constraint target value i.e. perform integration w_i*rho_frag_{tot/spin}*dr
    1695          22 :       cdft_control%target = 0.0_dp
    1696          22 :       DO igroup = 1, SIZE(group)
    1697          12 :          IF (group(igroup)%constraint_type == cdft_charge_constraint) THEN
    1698             :             i = 1
    1699             :          ELSE
    1700           6 :             i = 2
    1701             :          END IF
    1702          22 :          IF (is_becke .AND. (cdft_control%external_control .AND. becke_control%cavity_confine)) THEN
    1703             :             cdft_control%target(igroup) = cdft_control%target(igroup) + &
    1704             :                                           accurate_dot_product(group(igroup)%weight%array, rho_frag(i)%array, &
    1705           0 :                                                                becke_control%cavity_mat, becke_control%eps_cavity)*dvol
    1706             :          ELSE
    1707             :             cdft_control%target(igroup) = cdft_control%target(igroup) + &
    1708          12 :                                           pw_integral_ab(group(igroup)%weight, rho_frag(i), local_only=.TRUE.)
    1709             :          END IF
    1710             :       END DO
    1711          34 :       CALL para_env%sum(cdft_control%target)
    1712             :       ! Calculate reference atomic charges int( w_i * rho_frag * dr )
    1713          10 :       IF (cdft_control%atomic_charges) THEN
    1714          40 :          ALLOCATE (cdft_control%charges_fragment(cdft_control%natoms, nfrag_spins))
    1715          24 :          DO i = 1, nfrag_spins
    1716          44 :             DO iatom = 1, cdft_control%natoms
    1717             :                cdft_control%charges_fragment(iatom, i) = &
    1718          34 :                   pw_integral_ab(cdft_control%charge(iatom), rho_frag(i), local_only=.TRUE.)
    1719             :             END DO
    1720             :          END DO
    1721          78 :          CALL para_env%sum(cdft_control%charges_fragment)
    1722             :       END IF
    1723          24 :       DO i = 1, nfrag_spins
    1724          24 :          CALL auxbas_pw_pool%give_back_pw(rho_frag(i))
    1725             :       END DO
    1726          10 :       DEALLOCATE (rho_frag)
    1727          10 :       cdft_control%fragments_integrated = .TRUE.
    1728             : 
    1729          10 :       CALL timestop(handle)
    1730             : 
    1731          10 :    END SUBROUTINE prepare_fragment_constraint
    1732             : 
    1733             : END MODULE qs_cdft_methods

Generated by: LCOV version 1.15