1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief given the response wavefunctions obtained by the application
8!>      of the (rxp), p, and ((dk-dl)xp) operators,
9!>      here the current density vector (jx, jy, jz)
10!>      is computed for the 3 directions of the magnetic field (Bx, By, Bz)
11!> \par History
12!>      created 02-2006 [MI]
13!> \author MI
14! **************************************************************************************************
15MODULE qs_linres_atom_current
16   USE atomic_kind_types,               ONLY: atomic_kind_type,&
17                                              get_atomic_kind
18   USE basis_set_types,                 ONLY: get_gto_basis_set,&
19                                              gto_basis_set_p_type,&
20                                              gto_basis_set_type
21   USE cell_types,                      ONLY: cell_type,&
22                                              pbc
23   USE cp_control_types,                ONLY: dft_control_type
24   USE cp_log_handling,                 ONLY: cp_logger_get_default_io_unit
25   USE cp_para_types,                   ONLY: cp_para_env_type
26   USE dbcsr_api,                       ONLY: dbcsr_get_block_p,&
27                                              dbcsr_p_type
28   USE input_constants,                 ONLY: current_gauge_atom,&
29                                              current_gauge_r,&
30                                              current_gauge_r_and_step_func
31   USE kinds,                           ONLY: dp
32   USE message_passing,                 ONLY: mp_sum
33   USE orbital_pointers,                ONLY: indso,&
34                                              nsoset
35   USE particle_types,                  ONLY: particle_type
36   USE paw_proj_set_types,              ONLY: get_paw_proj_set,&
37                                              paw_proj_set_type
38   USE qs_environment_types,            ONLY: get_qs_env,&
39                                              qs_environment_type
40   USE qs_grid_atom,                    ONLY: grid_atom_type
41   USE qs_harmonics_atom,               ONLY: get_none0_cg_list,&
42                                              harmonics_atom_type
43   USE qs_kind_types,                   ONLY: get_qs_kind,&
44                                              get_qs_kind_set,&
45                                              qs_kind_type
46   USE qs_linres_op,                    ONLY: fac_vecp,&
47                                              set_vecp,&
48                                              set_vecp_rev
49   USE qs_linres_types,                 ONLY: allocate_jrho_atom_rad,&
50                                              allocate_jrho_coeff,&
51                                              current_env_type,&
52                                              get_current_env,&
53                                              jrho_atom_type,&
54                                              set2zero_jrho_atom_rad
55   USE qs_neighbor_list_types,          ONLY: get_iterator_info,&
56                                              neighbor_list_iterate,&
57                                              neighbor_list_iterator_create,&
58                                              neighbor_list_iterator_p_type,&
59                                              neighbor_list_iterator_release,&
60                                              neighbor_list_set_p_type
61   USE qs_oce_methods,                  ONLY: proj_blk
62   USE qs_oce_types,                    ONLY: oce_matrix_type
63   USE qs_rho_atom_types,               ONLY: rho_atom_coeff
64   USE sap_kind_types,                  ONLY: alist_pre_align_blk,&
65                                              alist_type,&
66                                              get_alist
67   USE util,                            ONLY: get_limit
68
69!$ USE OMP_LIB, ONLY: omp_get_max_threads, &
70!$                    omp_get_thread_num, &
71!$                    omp_lock_kind, &
72!$                    omp_init_lock, omp_set_lock, &
73!$                    omp_unset_lock, omp_destroy_lock
74
75#include "./base/base_uses.f90"
76
77   IMPLICIT NONE
78
79   PRIVATE
80
81   ! *** Public subroutines ***
82   PUBLIC :: calculate_jrho_atom_rad, calculate_jrho_atom, calculate_jrho_atom_coeff
83
84   ! *** Global parameters (only in this module)
85   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_linres_atom_current'
86
87CONTAINS
88
89! **************************************************************************************************
90!> \brief Calculate the expansion coefficients for the atomic terms
91!>      of the current densitiy in GAPW
92!> \param qs_env ...
93!> \param current_env ...
94!> \param mat_d0 ...
95!> \param mat_jp ...
96!> \param mat_jp_rii ...
97!> \param mat_jp_riii ...
98!> \param iB ...
99!> \param idir ...
100!> \par History
101!>      07.2006 created [MI]
102!>      02.2009 using new setup of projector-basis overlap [jgh]
103!>      08.2016 add OpenMP [EPCC]
104!>      09.2016 use automatic arrays [M Tucker]
105! **************************************************************************************************
106   SUBROUTINE calculate_jrho_atom_coeff(qs_env, current_env, mat_d0, mat_jp, mat_jp_rii, &
107                                        mat_jp_riii, iB, idir)
108
109      TYPE(qs_environment_type), POINTER                 :: qs_env
110      TYPE(current_env_type)                             :: current_env
111      TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: mat_d0, mat_jp, mat_jp_rii, mat_jp_riii
112      INTEGER, INTENT(IN)                                :: iB, idir
113
114      CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_jrho_atom_coeff', &
115         routineP = moduleN//':'//routineN
116
117      INTEGER :: bo(2), handle, iac, iat, iatom, ibc, idir2, ii, iii, ikind, ispin, istat, jatom, &
118         jkind, kac, katom, kbc, kkind, len_CPC, len_PC1, max_gau, max_nsgf, mepos, n_cont_a, &
119         n_cont_b, nat, natom, nkind, nsatbas, nsgfa, nsgfb, nso, nsoctot, nspins, num_pe, &
120         output_unit
121      INTEGER, DIMENSION(3)                              :: cell_b
122      INTEGER, DIMENSION(:), POINTER                     :: atom_list, list_a, list_b
123      LOGICAL                                            :: den_found, dista, distab, distb, &
124                                                            is_not_associated, paw_atom, &
125                                                            sgf_soft_only_a, sgf_soft_only_b
126      REAL(dp)                                           :: eps_cpc, hard_radius_c, jmax, nbr_dbl, &
127                                                            rab(3), rbc(3)
128      REAL(dp), ALLOCATABLE, DIMENSION(:, :)             :: a_matrix, b_matrix, c_matrix, d_matrix
129      REAL(KIND=dp), DIMENSION(:, :), POINTER            :: C_coeff_hh_a, C_coeff_hh_b, &
130                                                            C_coeff_ss_a, C_coeff_ss_b, r_coef_h, &
131                                                            r_coef_s, tmp_coeff, zero_coeff
132      TYPE(alist_type), POINTER                          :: alist_ac, alist_bc
133      TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
134      TYPE(cp_para_env_type), POINTER                    :: para_env
135      TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: mat_a, mat_b, mat_c, mat_d
136      TYPE(dft_control_type), POINTER                    :: dft_control
137      TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER  :: basis_set_list
138      TYPE(gto_basis_set_type), POINTER                  :: basis_set_a, basis_set_b, orb_basis_set
139      TYPE(jrho_atom_type), DIMENSION(:), POINTER        :: jrho1_atom_set
140      TYPE(neighbor_list_iterator_p_type), &
141         DIMENSION(:), POINTER                           :: nl_iterator
142      TYPE(neighbor_list_set_p_type), DIMENSION(:), &
143         POINTER                                         :: sab_all
144      TYPE(oce_matrix_type), POINTER                     :: oce
145      TYPE(paw_proj_set_type), POINTER                   :: paw_proj
146      TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
147      TYPE(rho_atom_coeff), DIMENSION(:), POINTER        :: a_block, b_block, c_block, d_block, &
148                                                            jp2_RARnu, jp_RARnu
149
150!$    INTEGER(kind=omp_lock_kind), ALLOCATABLE, DIMENSION(:) :: proj_blk_lock, alloc_lock
151!$    INTEGER                                            :: lock
152
153      CALL timeset(routineN, handle)
154
155      NULLIFY (atomic_kind_set, qs_kind_set, dft_control, sab_all, jrho1_atom_set, oce, &
156               para_env, zero_coeff, tmp_coeff)
157
158      CALL get_qs_env(qs_env=qs_env, &
159                      atomic_kind_set=atomic_kind_set, &
160                      qs_kind_set=qs_kind_set, &
161                      dft_control=dft_control, &
162                      oce=oce, &
163                      sab_all=sab_all, &
164                      para_env=para_env)
165      CPASSERT(ASSOCIATED(oce))
166
167      CALL get_current_env(current_env=current_env, jrho1_atom_set=jrho1_atom_set)
168      CPASSERT(ASSOCIATED(jrho1_atom_set))
169
170      CALL get_qs_kind_set(qs_kind_set=qs_kind_set, &
171                           maxsgf=max_nsgf, &
172                           maxgtops=max_gau)
173
174      eps_cpc = dft_control%qs_control%gapw_control%eps_cpc
175
176      idir2 = 1
177      IF (idir .NE. iB) THEN
178         CALL set_vecp_rev(idir, iB, idir2)
179      ENDIF
180      CALL set_vecp(iB, ii, iii)
181
182      ! Set pointers for the different gauge
183      mat_a => mat_d0
184      mat_b => mat_jp
185      mat_c => mat_jp_rii
186      mat_d => mat_jp_riii
187
188      ! Density-like matrices
189      nkind = SIZE(qs_kind_set)
190      natom = SIZE(jrho1_atom_set)
191      nspins = dft_control%nspins
192
193      ! Reset CJC coefficients and local density arrays
194      DO ikind = 1, nkind
195         NULLIFY (atom_list)
196         CALL get_atomic_kind(atomic_kind_set(ikind), &
197                              atom_list=atom_list, &
198                              natom=nat)
199         CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
200
201         ! Quick cycle if needed.
202         IF (.NOT. paw_atom) CYCLE
203
204         ! Initialize the density matrix-like arrays.
205         DO iat = 1, nat
206            iatom = atom_list(iat)
207            DO ispin = 1, nspins
208               IF (ASSOCIATED(jrho1_atom_set(iatom)%cjc0_h(1)%r_coef)) THEN
209                  jrho1_atom_set(iatom)%cjc0_h(ispin)%r_coef = 0.0_dp
210                  jrho1_atom_set(iatom)%cjc0_s(ispin)%r_coef = 0.0_dp
211                  jrho1_atom_set(iatom)%cjc_h(ispin)%r_coef = 0.0_dp
212                  jrho1_atom_set(iatom)%cjc_s(ispin)%r_coef = 0.0_dp
213                  jrho1_atom_set(iatom)%cjc_ii_h(ispin)%r_coef = 0.0_dp
214                  jrho1_atom_set(iatom)%cjc_ii_s(ispin)%r_coef = 0.0_dp
215                  jrho1_atom_set(iatom)%cjc_iii_h(ispin)%r_coef = 0.0_dp
216                  jrho1_atom_set(iatom)%cjc_iii_s(ispin)%r_coef = 0.0_dp
217               ENDIF
218            ENDDO ! ispin
219         ENDDO ! iat
220      ENDDO ! ikind
221
222      ! Three centers
223      ALLOCATE (basis_set_list(nkind))
224      DO ikind = 1, nkind
225         CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis_set_a)
226         IF (ASSOCIATED(basis_set_a)) THEN
227            basis_set_list(ikind)%gto_basis_set => basis_set_a
228         ELSE
229            NULLIFY (basis_set_list(ikind)%gto_basis_set)
230         END IF
231      END DO
232
233      len_PC1 = max_nsgf*max_gau
234      len_CPC = max_gau*max_gau
235
236      num_pe = 1
237!$    num_pe = omp_get_max_threads()
238      CALL neighbor_list_iterator_create(nl_iterator, sab_all, nthread=num_pe)
239
240!$OMP PARALLEL DEFAULT( NONE )                                  &
241!$OMP           SHARED( nspins, max_nsgf, max_gau               &
242!$OMP                 , len_PC1, len_CPC                        &
243!$OMP                 , nl_iterator, basis_set_list             &
244!$OMP                 , mat_a, mat_b, mat_c, mat_d              &
245!$OMP                 , nkind, qs_kind_set, eps_cpc, oce        &
246!$OMP                 , ii, iii, jrho1_atom_set                 &
247!$OMP                 , natom, proj_blk_lock, alloc_lock        &
248!$OMP                 )                                         &
249!$OMP          PRIVATE( a_block, b_block, c_block, d_block                      &
250!$OMP                 , jp_RARnu, jp2_RARnu                                     &
251!$OMP                 , a_matrix, b_matrix, c_matrix, d_matrix, istat           &
252!$OMP                 , mepos                                                   &
253!$OMP                 , ikind, jkind, kkind, iatom, jatom, katom                &
254!$OMP                 , cell_b, rab, rbc                                        &
255!$OMP                 , basis_set_a, nsgfa                                      &
256!$OMP                 , basis_set_b, nsgfb                                      &
257!$OMP                 , orb_basis_set, jmax, den_found                          &
258!$OMP                 , hard_radius_c, paw_proj                                 &
259!$OMP                 , nsatbas, nsoctot, nso, paw_atom                         &
260!$OMP                 , iac , alist_ac, kac, n_cont_a, list_a, sgf_soft_only_a  &
261!$OMP                 , ibc , alist_bc, kbc, n_cont_b, list_b, sgf_soft_only_b  &
262!$OMP                 , C_coeff_hh_a, C_coeff_ss_a, dista                       &
263!$OMP                 , C_coeff_hh_b, C_coeff_ss_b, distb                       &
264!$OMP                 , distab                                                  &
265!$OMP                 , r_coef_s, r_coef_h                                      &
266!$OMP                 )
267
268      NULLIFY (a_block, b_block, c_block, d_block)
269      NULLIFY (orb_basis_set, jp_RARnu, jp2_RARnu)
270
271      ALLOCATE (a_block(nspins), b_block(nspins), c_block(nspins), d_block(nspins), &
272                jp_RARnu(nspins), jp2_RARnu(nspins), &
273                STAT=istat)
274      CPASSERT(istat == 0)
275
276      ALLOCATE (a_matrix(max_nsgf, max_nsgf), b_matrix(max_nsgf, max_nsgf), &
277                c_matrix(max_nsgf, max_nsgf), d_matrix(max_nsgf, max_nsgf), &
278                STAT=istat)
279      CPASSERT(istat == 0)
280
281!$OMP SINGLE
282!$    ALLOCATE (alloc_lock(natom))
283!$    ALLOCATE (proj_blk_lock(nspins*natom))
284!$OMP END SINGLE
285
286!$OMP DO
287!$    DO lock = 1, natom
288!$       call omp_init_lock(alloc_lock(lock))
289!$    END DO
290!$OMP END DO
291
292!$OMP DO
293!$    DO lock = 1, nspins*natom
294!$       call omp_init_lock(proj_blk_lock(lock))
295!$    END DO
296!$OMP END DO
297
298      mepos = 0
299!$    mepos = omp_get_thread_num()
300
301      DO WHILE (neighbor_list_iterate(nl_iterator, mepos=mepos) == 0)
302
303         CALL get_iterator_info(nl_iterator, mepos=mepos, &
304                                ikind=ikind, jkind=jkind, &
305                                iatom=iatom, jatom=jatom, cell=cell_b, r=rab)
306         basis_set_a => basis_set_list(ikind)%gto_basis_set
307         IF (.NOT. ASSOCIATED(basis_set_a)) CYCLE
308         basis_set_b => basis_set_list(jkind)%gto_basis_set
309         IF (.NOT. ASSOCIATED(basis_set_b)) CYCLE
310         nsgfa = basis_set_a%nsgf
311         nsgfb = basis_set_b%nsgf
312         DO ispin = 1, nspins
313            NULLIFY (jp_RARnu(ispin)%r_coef, jp2_RARnu(ispin)%r_coef)
314            ALLOCATE (jp_RARnu(ispin)%r_coef(nsgfa, nsgfb), &
315                      jp2_RARnu(ispin)%r_coef(nsgfa, nsgfb))
316         ENDDO
317
318         ! Take the block \mu\nu of jpab, jpab_ii and jpab_iii
319         jmax = 0._dp
320         DO ispin = 1, nspins
321            NULLIFY (a_block(ispin)%r_coef)
322            NULLIFY (b_block(ispin)%r_coef)
323            NULLIFY (c_block(ispin)%r_coef)
324            NULLIFY (d_block(ispin)%r_coef)
325            CALL dbcsr_get_block_p(matrix=mat_a(ispin)%matrix, &
326                                   row=iatom, col=jatom, block=a_block(ispin)%r_coef, &
327                                   found=den_found)
328            jmax = jmax + MAXVAL(ABS(a_block(ispin)%r_coef))
329            CALL dbcsr_get_block_p(matrix=mat_b(ispin)%matrix, &
330                                   row=iatom, col=jatom, block=b_block(ispin)%r_coef, &
331                                   found=den_found)
332            jmax = jmax + MAXVAL(ABS(b_block(ispin)%r_coef))
333            CALL dbcsr_get_block_p(matrix=mat_c(ispin)%matrix, &
334                                   row=iatom, col=jatom, block=c_block(ispin)%r_coef, &
335                                   found=den_found)
336            jmax = jmax + MAXVAL(ABS(c_block(ispin)%r_coef))
337            CALL dbcsr_get_block_p(matrix=mat_d(ispin)%matrix, &
338                                   row=iatom, col=jatom, block=d_block(ispin)%r_coef, &
339                                   found=den_found)
340            jmax = jmax + MAXVAL(ABS(d_block(ispin)%r_coef))
341         ENDDO
342
343         ! Loop over atoms
344         DO kkind = 1, nkind
345            NULLIFY (paw_proj)
346            CALL get_qs_kind(qs_kind_set(kkind), &
347                             basis_set=orb_basis_set, &
348                             hard_radius=hard_radius_c, &
349                             paw_proj_set=paw_proj, &
350                             paw_atom=paw_atom)
351
352            ! Quick cycle if needed.
353            IF (.NOT. paw_atom) CYCLE
354
355            CALL get_paw_proj_set(paw_proj_set=paw_proj, nsatbas=nsatbas)
356            nsoctot = nsatbas
357
358            iac = ikind + nkind*(kkind - 1)
359            ibc = jkind + nkind*(kkind - 1)
360            IF (.NOT. ASSOCIATED(oce%intac(iac)%alist)) CYCLE
361            IF (.NOT. ASSOCIATED(oce%intac(ibc)%alist)) CYCLE
362
363            CALL get_alist(oce%intac(iac), alist_ac, iatom)
364            CALL get_alist(oce%intac(ibc), alist_bc, jatom)
365            IF (.NOT. ASSOCIATED(alist_ac)) CYCLE
366            IF (.NOT. ASSOCIATED(alist_bc)) CYCLE
367
368            DO kac = 1, alist_ac%nclist
369               DO kbc = 1, alist_bc%nclist
370                  IF (alist_ac%clist(kac)%catom /= alist_bc%clist(kbc)%catom) CYCLE
371
372                  IF (ALL(cell_b + alist_bc%clist(kbc)%cell - alist_ac%clist(kac)%cell == 0)) THEN
373                     IF (jmax*alist_bc%clist(kbc)%maxac*alist_ac%clist(kac)%maxac < eps_cpc) CYCLE
374
375                     n_cont_a = alist_ac%clist(kac)%nsgf_cnt
376                     n_cont_b = alist_bc%clist(kbc)%nsgf_cnt
377                     sgf_soft_only_a = alist_ac%clist(kac)%sgf_soft_only
378                     sgf_soft_only_b = alist_bc%clist(kbc)%sgf_soft_only
379                     IF (n_cont_a .EQ. 0 .OR. n_cont_b .EQ. 0) CYCLE
380
381                     ! thanks to the linearity of the response, we
382                     ! can avoid computing soft-soft interations.
383                     ! those terms are already included in the
384                     ! regular grid.
385                     IF (sgf_soft_only_a .AND. sgf_soft_only_b) CYCLE
386
387                     list_a => alist_ac%clist(kac)%sgf_list
388                     list_b => alist_bc%clist(kbc)%sgf_list
389
390                     katom = alist_ac%clist(kac)%catom
391!$                   CALL omp_set_lock(alloc_lock(katom))
392                     IF (.NOT. ASSOCIATED(jrho1_atom_set(katom)%cjc0_h(1)%r_coef)) THEN
393                        CALL allocate_jrho_coeff(jrho1_atom_set, katom, nsoctot)
394                     ENDIF
395!$                   CALL omp_unset_lock(alloc_lock(katom))
396
397                     ! Compute the modified Qai matrix as
398                     ! mQai_\mu\nu = Qai_\mu\nu - Qbi_\mu\nu * (R_A-R_\nu)_ii
399                     !             + Qci_\mu\nu * (R_A-R_\nu)_iii
400                     rbc = alist_bc%clist(kbc)%rac
401                     DO ispin = 1, nspins
402                        CALL DCOPY(nsgfa*nsgfb, b_block(ispin)%r_coef(1, 1), 1, &
403                                   jp_RARnu(ispin)%r_coef(1, 1), 1)
404                        CALL DAXPY(nsgfa*nsgfb, -rbc(ii), d_block(ispin)%r_coef(1, 1), 1, &
405                                   jp_RARnu(ispin)%r_coef(1, 1), 1)
406                        CALL DAXPY(nsgfa*nsgfb, rbc(iii), c_block(ispin)%r_coef(1, 1), 1, &
407                                   jp_RARnu(ispin)%r_coef(1, 1), 1)
408                     ENDDO
409
410                     ! Get the d_A's for the hard and soft densities.
411                     IF (iatom == katom .AND. ALL(alist_ac%clist(kac)%cell == 0)) THEN
412                        C_coeff_hh_a => alist_ac%clist(kac)%achint(:, :, 1)
413                        C_coeff_ss_a => alist_ac%clist(kac)%acint(:, :, 1)
414                        dista = .FALSE.
415                     ELSE
416                        C_coeff_hh_a => alist_ac%clist(kac)%acint(:, :, 1)
417                        C_coeff_ss_a => alist_ac%clist(kac)%acint(:, :, 1)
418                        dista = .TRUE.
419                     END IF
420                     ! Get the d_B's for the hard and soft densities.
421                     IF (jatom == katom .AND. ALL(alist_bc%clist(kbc)%cell == 0)) THEN
422                        C_coeff_hh_b => alist_bc%clist(kbc)%achint(:, :, 1)
423                        C_coeff_ss_b => alist_bc%clist(kbc)%acint(:, :, 1)
424                        distb = .FALSE.
425                     ELSE
426                        C_coeff_hh_b => alist_bc%clist(kbc)%acint(:, :, 1)
427                        C_coeff_ss_b => alist_bc%clist(kbc)%acint(:, :, 1)
428                        distb = .TRUE.
429                     END IF
430
431                     distab = dista .AND. distb
432
433                     nso = nsoctot
434
435                     DO ispin = 1, nspins
436
437                        ! align the blocks
438                        CALL alist_pre_align_blk(a_block(ispin)%r_coef, SIZE(a_block(ispin)%r_coef, 1), &
439                                                 a_matrix, SIZE(a_matrix, 1), &
440                                                 list_a, n_cont_a, list_b, n_cont_b)
441
442                        CALL alist_pre_align_blk(jp_RARnu(ispin)%r_coef, SIZE(jp_RARnu(ispin)%r_coef, 1), &
443                                                 b_matrix, SIZE(b_matrix, 1), &
444                                                 list_a, n_cont_a, list_b, n_cont_b)
445
446                        CALL alist_pre_align_blk(c_block(ispin)%r_coef, SIZE(c_block(ispin)%r_coef, 1), &
447                                                 c_matrix, SIZE(c_matrix, 1), &
448                                                 list_a, n_cont_a, list_b, n_cont_b)
449                        CALL alist_pre_align_blk(d_block(ispin)%r_coef, SIZE(d_block(ispin)%r_coef, 1), &
450                                                 d_matrix, SIZE(d_matrix, 1), &
451                                                 list_a, n_cont_a, list_b, n_cont_b)
452
453!$                      CALL omp_set_lock(proj_blk_lock((katom - 1)*nspins + ispin))
454                        !------------------------------------------------------------------
455                        ! P_\alpha\alpha'
456                        r_coef_h => jrho1_atom_set(katom)%cjc0_h(ispin)%r_coef
457                        r_coef_s => jrho1_atom_set(katom)%cjc0_s(ispin)%r_coef
458                        CALL proj_blk(C_coeff_hh_a, C_coeff_ss_a, n_cont_a, &
459                                      C_coeff_hh_b, C_coeff_ss_b, n_cont_b, &
460                                      a_matrix, max_nsgf, r_coef_h, r_coef_s, nso, &
461                                      len_PC1, len_CPC, 1.0_dp, distab)
462                        !------------------------------------------------------------------
463                        ! mQai_\alpha\alpha'
464                        r_coef_h => jrho1_atom_set(katom)%cjc_h(ispin)%r_coef
465                        r_coef_s => jrho1_atom_set(katom)%cjc_s(ispin)%r_coef
466                        CALL proj_blk(C_coeff_hh_a, C_coeff_ss_a, n_cont_a, &
467                                      C_coeff_hh_b, C_coeff_ss_b, n_cont_b, &
468                                      b_matrix, max_nsgf, r_coef_h, r_coef_s, nso, &
469                                      len_PC1, len_CPC, 1.0_dp, distab)
470                        !------------------------------------------------------------------
471                        ! Qci_\alpha\alpha'
472                        r_coef_h => jrho1_atom_set(katom)%cjc_ii_h(ispin)%r_coef
473                        r_coef_s => jrho1_atom_set(katom)%cjc_ii_s(ispin)%r_coef
474                        CALL proj_blk(C_coeff_hh_a, C_coeff_ss_a, n_cont_a, &
475                                      C_coeff_hh_b, C_coeff_ss_b, n_cont_b, &
476                                      c_matrix, max_nsgf, r_coef_h, r_coef_s, nso, &
477                                      len_PC1, len_CPC, 1.0_dp, distab)
478                        !------------------------------------------------------------------
479                        ! Qbi_\alpha\alpha'
480                        r_coef_h => jrho1_atom_set(katom)%cjc_iii_h(ispin)%r_coef
481                        r_coef_s => jrho1_atom_set(katom)%cjc_iii_s(ispin)%r_coef
482                        CALL proj_blk(C_coeff_hh_a, C_coeff_ss_a, n_cont_a, &
483                                      C_coeff_hh_b, C_coeff_ss_b, n_cont_b, &
484                                      d_matrix, max_nsgf, r_coef_h, r_coef_s, nso, &
485                                      len_PC1, len_CPC, 1.0_dp, distab)
486                        !------------------------------------------------------------------
487!$                      CALL omp_unset_lock(proj_blk_lock((katom - 1)*nspins + ispin))
488
489                     ENDDO ! ispin
490
491                     EXIT !search loop over jatom-katom list
492                  END IF
493               END DO
494            END DO
495
496         ENDDO ! kkind
497         DO ispin = 1, nspins
498            DEALLOCATE (jp_RARnu(ispin)%r_coef, jp2_RARnu(ispin)%r_coef)
499         ENDDO
500      END DO
501      ! Wait for all threads to finish the loop before locks can be freed
502!$OMP BARRIER
503
504!$OMP DO
505!$    DO lock = 1, natom
506!$       call omp_destroy_lock(alloc_lock(lock))
507!$    END DO
508!$OMP END DO
509
510!$OMP DO
511!$    DO lock = 1, nspins*natom
512!$       call omp_destroy_lock(proj_blk_lock(lock))
513!$    END DO
514!$OMP END DO
515
516!$OMP SINGLE
517!$    DEALLOCATE (alloc_lock)
518!$    DEALLOCATE (proj_blk_lock)
519!$OMP END SINGLE NOWAIT
520
521      DEALLOCATE (a_matrix, b_matrix, c_matrix, d_matrix, &
522                  a_block, b_block, c_block, d_block, &
523                  jp_RARnu, jp2_RARnu &
524                  )
525
526!$OMP END PARALLEL
527
528      CALL neighbor_list_iterator_release(nl_iterator)
529      DEALLOCATE (basis_set_list)
530
531      ! parallel sum up
532      nbr_dbl = 0.0_dp
533      DO ikind = 1, nkind
534         CALL get_atomic_kind(atomic_kind_set(ikind), &
535                              atom_list=atom_list, &
536                              natom=nat)
537         CALL get_qs_kind(qs_kind_set(ikind), &
538                          basis_set=orb_basis_set, &
539                          paw_proj_set=paw_proj, &
540                          paw_atom=paw_atom)
541
542         IF (.NOT. paw_atom) CYCLE
543
544         CALL get_paw_proj_set(paw_proj_set=paw_proj, nsatbas=nsatbas)
545         nsoctot = nsatbas
546
547         num_pe = para_env%num_pe
548         mepos = para_env%mepos
549         bo = get_limit(nat, num_pe, mepos)
550
551         ALLOCATE (zero_coeff(nsoctot, nsoctot))
552         DO iat = 1, nat
553            iatom = atom_list(iat)
554            is_not_associated = .NOT. ASSOCIATED(jrho1_atom_set(iatom)%cjc0_h(1)%r_coef)
555
556            IF (iat .GE. bo(1) .AND. iat .LE. bo(2) .AND. is_not_associated) THEN
557               CALL allocate_jrho_coeff(jrho1_atom_set, iatom, nsoctot)
558            ENDIF
559
560            DO ispin = 1, nspins
561
562               tmp_coeff => jrho1_atom_set(iatom)%cjc0_h(ispin)%r_coef
563               IF (is_not_associated) THEN
564                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
565               ENDIF
566               CALL mp_sum(tmp_coeff, para_env%group)
567
568               tmp_coeff => jrho1_atom_set(iatom)%cjc0_s(ispin)%r_coef
569               IF (is_not_associated) THEN
570                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
571               ENDIF
572               CALL mp_sum(tmp_coeff, para_env%group)
573
574               tmp_coeff => jrho1_atom_set(iatom)%cjc_h(ispin)%r_coef
575               IF (is_not_associated) THEN
576                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
577               ENDIF
578
579               CALL mp_sum(tmp_coeff, para_env%group)
580               tmp_coeff => jrho1_atom_set(iatom)%cjc_s(ispin)%r_coef
581               IF (is_not_associated) THEN
582                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
583               ENDIF
584               CALL mp_sum(tmp_coeff, para_env%group)
585
586               tmp_coeff => jrho1_atom_set(iatom)%cjc_ii_h(ispin)%r_coef
587               IF (is_not_associated) THEN
588                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
589               ENDIF
590               CALL mp_sum(tmp_coeff, para_env%group)
591
592               tmp_coeff => jrho1_atom_set(iatom)%cjc_ii_s(ispin)%r_coef
593               IF (is_not_associated) THEN
594                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
595               ENDIF
596               CALL mp_sum(tmp_coeff, para_env%group)
597
598               tmp_coeff => jrho1_atom_set(iatom)%cjc_iii_h(ispin)%r_coef
599               IF (is_not_associated) THEN
600                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
601               ENDIF
602               CALL mp_sum(tmp_coeff, para_env%group)
603
604               tmp_coeff => jrho1_atom_set(iatom)%cjc_iii_s(ispin)%r_coef
605               IF (is_not_associated) THEN
606                  zero_coeff = 0.0_dp; tmp_coeff => zero_coeff
607               ENDIF
608               CALL mp_sum(tmp_coeff, para_env%group)
609
610               IF (ASSOCIATED(jrho1_atom_set(iatom)%cjc0_h(ispin)%r_coef)) &
611                  nbr_dbl = nbr_dbl + 8.0_dp*REAL(SIZE(jrho1_atom_set(iatom)%cjc0_h(ispin)%r_coef), dp)
612            ENDDO ! ispin
613         ENDDO ! iat
614
615         DEALLOCATE (zero_coeff)
616
617      ENDDO ! ikind
618
619      output_unit = cp_logger_get_default_io_unit()
620      IF (output_unit > 0) THEN
621         WRITE (output_unit, '(A,E8.2)') 'calculate_jrho_atom_coeff: nbr_dbl=', nbr_dbl
622      ENDIF
623
624      CALL timestop(handle)
625
626   END SUBROUTINE calculate_jrho_atom_coeff
627
628! **************************************************************************************************
629!> \brief ...
630!> \param qs_env ...
631!> \param current_env ...
632!> \param idir ...
633! **************************************************************************************************
634   SUBROUTINE calculate_jrho_atom_rad(qs_env, current_env, idir)
635      !
636      TYPE(qs_environment_type), POINTER                 :: qs_env
637      TYPE(current_env_type)                             :: current_env
638      INTEGER, INTENT(IN)                                :: idir
639
640      CHARACTER(len=*), PARAMETER :: routineN = 'calculate_jrho_atom_rad', &
641         routineP = moduleN//':'//routineN
642
643      INTEGER :: damax_iso_not0, damax_iso_not0_local, handle, i1, i2, iat, iatom, icg, ikind, &
644         ipgf1, ipgf2, ir, iset1, iset2, iso, iso1, iso1_first, iso1_last, iso2, iso2_first, &
645         iso2_last, ispin, l, l_iso, llmax, lmax12, lmax_expansion, lmin12, m1s, m2s, m_iso, &
646         max_iso_not0, max_iso_not0_local, max_max_iso_not0, max_nso, max_s_harm, maxl, maxlgto, &
647         maxso, mepos, n1s, n2s, na, natom, natom_tot, nkind, nr, nset, nspins, num_pe, size1, &
648         size2
649      INTEGER, ALLOCATABLE, DIMENSION(:)                 :: cg_n_list, dacg_n_list
650      INTEGER, ALLOCATABLE, DIMENSION(:, :, :)           :: cg_list, dacg_list
651      INTEGER, DIMENSION(2)                              :: bo
652      INTEGER, DIMENSION(:), POINTER                     :: atom_list, lmax, lmin, npgf, o2nindex
653      LOGICAL                                            :: paw_atom
654      LOGICAL, ALLOCATABLE, DIMENSION(:, :)              :: is_set_to_0
655      REAL(dp)                                           :: hard_radius
656      REAL(dp), ALLOCATABLE, DIMENSION(:)                :: g1, g2, gauge_h, gauge_s
657      REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: cjc0_h_block, cjc0_s_block, cjc_h_block, &
658         cjc_ii_h_block, cjc_ii_s_block, cjc_iii_h_block, cjc_iii_s_block, cjc_s_block, dgg_1, gg, &
659         gg_lm1
660      REAL(dp), DIMENSION(:, :), POINTER :: coeff, Fr_a_h, Fr_a_h_ii, Fr_a_h_iii, Fr_a_s, &
661         Fr_a_s_ii, Fr_a_s_iii, Fr_b_h, Fr_b_h_ii, Fr_b_h_iii, Fr_b_s, Fr_b_s_ii, Fr_b_s_iii, &
662         Fr_h, Fr_s, zet
663      REAL(dp), DIMENSION(:, :, :), POINTER              :: my_CG
664      REAL(dp), DIMENSION(:, :, :, :), POINTER           :: my_CG_dxyz_asym
665      TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
666      TYPE(cp_para_env_type), POINTER                    :: para_env
667      TYPE(dft_control_type), POINTER                    :: dft_control
668      TYPE(grid_atom_type), POINTER                      :: grid_atom
669      TYPE(gto_basis_set_type), POINTER                  :: orb_basis_set
670      TYPE(harmonics_atom_type), POINTER                 :: harmonics
671      TYPE(jrho_atom_type), DIMENSION(:), POINTER        :: jrho1_atom_set
672      TYPE(jrho_atom_type), POINTER                      :: jrho1_atom
673      TYPE(paw_proj_set_type), POINTER                   :: paw_proj
674      TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
675
676      CALL timeset(routineN, handle)
677      !
678      NULLIFY (atomic_kind_set, qs_kind_set, dft_control, para_env, &
679               coeff, Fr_h, Fr_s, Fr_a_h, Fr_a_s, Fr_a_h_ii, Fr_a_s_ii, &
680               Fr_a_h_iii, Fr_a_s_iii, Fr_b_h, Fr_b_s, Fr_b_h_ii, &
681               Fr_b_s_ii, Fr_b_h_iii, Fr_b_s_iii, jrho1_atom_set, &
682               jrho1_atom)
683      !
684      CALL get_qs_env(qs_env=qs_env, &
685                      atomic_kind_set=atomic_kind_set, &
686                      qs_kind_set=qs_kind_set, &
687                      dft_control=dft_control, &
688                      para_env=para_env)
689
690      CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxlgto=maxlgto)
691
692      !
693      CALL get_current_env(current_env=current_env, &
694                           jrho1_atom_set=jrho1_atom_set)
695      !
696
697      nkind = SIZE(qs_kind_set)
698      nspins = dft_control%nspins
699      !
700      natom_tot = SIZE(jrho1_atom_set, 1)
701      ALLOCATE (is_set_to_0(natom_tot, nspins))
702      is_set_to_0(:, :) = .FALSE.
703
704      !
705      DO ikind = 1, nkind
706         NULLIFY (atom_list, grid_atom, harmonics, orb_basis_set, &
707                  lmax, lmin, npgf, zet, grid_atom, harmonics, my_CG, my_CG_dxyz_asym)
708         !
709         CALL get_atomic_kind(atomic_kind_set(ikind), &
710                              atom_list=atom_list, &
711                              natom=natom)
712         CALL get_qs_kind(qs_kind_set(ikind), &
713                          grid_atom=grid_atom, &
714                          paw_proj_set=paw_proj, &
715                          paw_atom=paw_atom, &
716                          harmonics=harmonics, &
717                          hard_radius=hard_radius, &
718                          basis_set=orb_basis_set)
719         !
720         ! Quick cycle if needed.
721         IF (.NOT. paw_atom) CYCLE
722         !
723         CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
724                                lmax=lmax, lmin=lmin, &
725                                maxl=maxl, npgf=npgf, &
726                                nset=nset, zet=zet, &
727                                maxso=maxso)
728         CALL get_paw_proj_set(paw_proj_set=paw_proj, o2nindex=o2nindex)
729         !
730         nr = grid_atom%nr
731         na = grid_atom%ng_sphere
732         max_iso_not0 = harmonics%max_iso_not0
733         damax_iso_not0 = harmonics%damax_iso_not0
734         max_max_iso_not0 = MAX(max_iso_not0, damax_iso_not0)
735         lmax_expansion = indso(1, max_max_iso_not0)
736         max_s_harm = harmonics%max_s_harm
737         llmax = harmonics%llmax
738         !
739         ! Distribute the atoms of this kind
740         num_pe = para_env%num_pe
741         mepos = para_env%mepos
742         bo = get_limit(natom, num_pe, mepos)
743         !
744         my_CG => harmonics%my_CG
745         my_CG_dxyz_asym => harmonics%my_CG_dxyz_asym
746         !
747         ! Allocate some arrays.
748         max_nso = nsoset(maxl)
749         ALLOCATE (g1(nr), g2(nr), gg(nr, 0:2*maxl), gg_lm1(nr, 0:2*maxl), dgg_1(nr, 0:2*maxl), &
750                   cjc0_h_block(max_nso, max_nso), cjc0_s_block(max_nso, max_nso), &
751                   cjc_h_block(max_nso, max_nso), cjc_s_block(max_nso, max_nso), &
752                   cjc_ii_h_block(max_nso, max_nso), cjc_ii_s_block(max_nso, max_nso), &
753                   cjc_iii_h_block(max_nso, max_nso), cjc_iii_s_block(max_nso, max_nso), &
754                   cg_list(2, nsoset(maxl)**2, max_s_harm), cg_n_list(max_s_harm), &
755                   dacg_list(2, nsoset(maxl)**2, max_s_harm), dacg_n_list(max_s_harm), &
756                   gauge_h(nr), gauge_s(nr))
757         !
758         ! Compute the gauge
759         SELECT CASE (current_env%gauge)
760         CASE (current_gauge_r)
761            ! d(r)=r
762            gauge_h(1:nr) = grid_atom%rad(1:nr)
763            gauge_s(1:nr) = grid_atom%rad(1:nr)
764         CASE (current_gauge_r_and_step_func)
765            ! step function
766            gauge_h(1:nr) = 0e0_dp
767            DO ir = 1, nr
768               IF (grid_atom%rad(ir) .LE. hard_radius) THEN
769                  gauge_s(ir) = grid_atom%rad(ir)
770               ELSE
771                  gauge_s(ir) = gauge_h(ir)
772               ENDIF
773            ENDDO
774         CASE (current_gauge_atom)
775            ! d(r)=A
776            gauge_h(1:nr) = HUGE(0e0_dp) !0e0_dp
777            gauge_s(1:nr) = HUGE(0e0_dp) !0e0_dp
778         CASE DEFAULT
779            CPABORT("Unknown gauge, try again...")
780         END SELECT
781         !
782         !
783         m1s = 0
784         DO iset1 = 1, nset
785            m2s = 0
786            DO iset2 = 1, nset
787               CALL get_none0_cg_list(my_CG, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
788                                      max_s_harm, lmax_expansion, cg_list, cg_n_list, max_iso_not0_local)
789               CPASSERT(max_iso_not0_local .LE. max_iso_not0)
790               CALL get_none0_cg_list(my_CG_dxyz_asym, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
791                                      max_s_harm, lmax_expansion, dacg_list, dacg_n_list, damax_iso_not0_local)
792               CPASSERT(damax_iso_not0_local .LE. damax_iso_not0)
793
794               n1s = nsoset(lmax(iset1))
795               DO ipgf1 = 1, npgf(iset1)
796                  iso1_first = nsoset(lmin(iset1) - 1) + 1 + n1s*(ipgf1 - 1) + m1s
797                  iso1_last = nsoset(lmax(iset1)) + n1s*(ipgf1 - 1) + m1s
798                  size1 = iso1_last - iso1_first + 1
799                  iso1_first = o2nindex(iso1_first)
800                  iso1_last = o2nindex(iso1_last)
801                  i1 = iso1_last - iso1_first + 1
802                  CPASSERT(size1 == i1)
803                  i1 = nsoset(lmin(iset1) - 1) + 1
804                  !
805                  g1(1:nr) = EXP(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))
806                  !
807                  n2s = nsoset(lmax(iset2))
808                  DO ipgf2 = 1, npgf(iset2)
809                     iso2_first = nsoset(lmin(iset2) - 1) + 1 + n2s*(ipgf2 - 1) + m2s
810                     iso2_last = nsoset(lmax(iset2)) + n2s*(ipgf2 - 1) + m2s
811                     size2 = iso2_last - iso2_first + 1
812                     iso2_first = o2nindex(iso2_first)
813                     iso2_last = o2nindex(iso2_last)
814                     i2 = iso2_last - iso2_first + 1
815                     CPASSERT(size2 == i2)
816                     i2 = nsoset(lmin(iset2) - 1) + 1
817                     !
818                     g2(1:nr) = EXP(-zet(ipgf2, iset2)*grid_atom%rad2(1:nr))
819                     !
820                     lmin12 = lmin(iset1) + lmin(iset2)
821                     lmax12 = lmax(iset1) + lmax(iset2)
822                     !
823                     gg = 0.0_dp
824                     gg_lm1 = 0.0_dp
825                     dgg_1 = 0.0_dp
826                     !
827                     ! Take only the terms of expansion for L < lmax_expansion
828                     IF (lmin12 .LE. lmax_expansion) THEN
829                        !
830                        IF (lmax12 .GT. lmax_expansion) lmax12 = lmax_expansion
831                        !
832                        IF (lmin12 == 0) THEN
833                           gg(1:nr, lmin12) = g1(1:nr)*g2(1:nr)
834                           gg_lm1(1:nr, lmin12) = 0.0_dp
835                        ELSE
836                           gg(1:nr, lmin12) = grid_atom%rad2l(1:nr, lmin12)*g1(1:nr)*g2(1:nr)
837                           gg_lm1(1:nr, lmin12) = grid_atom%rad2l(1:nr, lmin12 - 1)*g1(1:nr)*g2(1:nr)
838                        ENDIF
839                        !
840                        DO l = lmin12 + 1, lmax12
841                           gg(1:nr, l) = grid_atom%rad(1:nr)*gg(1:nr, l - 1)
842                           gg_lm1(1:nr, l) = gg(1:nr, l - 1)
843                        ENDDO
844                        !
845                        DO l = lmin12, lmax12
846                           dgg_1(1:nr, l) = 2.0_dp*(zet(ipgf1, iset1) - zet(ipgf2, iset2))&
847                                           &              *gg(1:nr, l)*grid_atom%rad(1:nr)
848                        ENDDO
849                     ELSE
850                        CYCLE
851                     ENDIF ! lmin12
852                     !
853                     DO iat = bo(1), bo(2)
854                        iatom = atom_list(iat)
855                        !
856                        DO ispin = 1, nspins
857                           !------------------------------------------------------------------
858                           ! P_\alpha\alpha'
859                           cjc0_h_block = HUGE(1.0_dp)
860                           cjc0_s_block = HUGE(1.0_dp)
861                           !
862                           ! Hard term
863                           coeff => jrho1_atom_set(iatom)%cjc0_h(ispin)%r_coef
864                           cjc0_h_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
865                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
866                           !
867                           ! Soft term
868                           coeff => jrho1_atom_set(iatom)%cjc0_s(ispin)%r_coef
869                           cjc0_s_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
870                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
871                           !------------------------------------------------------------------
872                           ! mQai_\alpha\alpha'
873                           cjc_h_block = HUGE(1.0_dp)
874                           cjc_s_block = HUGE(1.0_dp)
875                           !
876                           ! Hard term
877                           coeff => jrho1_atom_set(iatom)%cjc_h(ispin)%r_coef
878                           cjc_h_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
879                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
880                           !
881                           ! Soft term
882                           coeff => jrho1_atom_set(iatom)%cjc_s(ispin)%r_coef
883                           cjc_s_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
884                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
885                           !------------------------------------------------------------------
886                           ! Qci_\alpha\alpha'
887                           cjc_ii_h_block = HUGE(1.0_dp)
888                           cjc_ii_s_block = HUGE(1.0_dp)
889                           !
890                           ! Hard term
891                           coeff => jrho1_atom_set(iatom)%cjc_ii_h(ispin)%r_coef
892                           cjc_ii_h_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
893                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
894                           !
895                           ! Soft term
896                           coeff => jrho1_atom_set(iatom)%cjc_ii_s(ispin)%r_coef
897                           cjc_ii_s_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
898                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
899                           !------------------------------------------------------------------
900                           ! Qbi_\alpha\alpha'
901                           cjc_iii_h_block = HUGE(1.0_dp)
902                           cjc_iii_s_block = HUGE(1.0_dp)
903                           !
904                           !
905                           ! Hard term
906                           coeff => jrho1_atom_set(iatom)%cjc_iii_h(ispin)%r_coef
907                           cjc_iii_h_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
908                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
909                           !
910                           ! Soft term
911                           coeff => jrho1_atom_set(iatom)%cjc_iii_s(ispin)%r_coef
912                           cjc_iii_s_block(i1:i1 + size1 - 1, i2:i2 + size2 - 1) = &
913                              coeff(iso1_first:iso1_last, iso2_first:iso2_last)
914                           !------------------------------------------------------------------
915                           !
916                           ! Allocation radial functions
917                           jrho1_atom => jrho1_atom_set(iatom)
918                           IF (.NOT. ASSOCIATED(jrho1_atom%jrho_a_h(ispin)%r_coef)) THEN
919                              CALL allocate_jrho_atom_rad(jrho1_atom, ispin, nr, na, &
920                                                          max_max_iso_not0)
921                              is_set_to_0(iatom, ispin) = .TRUE.
922                           ELSE
923                              IF (.NOT. is_set_to_0(iatom, ispin)) THEN
924                                 CALL set2zero_jrho_atom_rad(jrho1_atom, ispin)
925                                 is_set_to_0(iatom, ispin) = .TRUE.
926                              ENDIF
927                           ENDIF
928                           !------------------------------------------------------------------
929                           !
930                           Fr_h => jrho1_atom%jrho_h(ispin)%r_coef
931                           Fr_s => jrho1_atom%jrho_s(ispin)%r_coef
932                           !------------------------------------------------------------------
933                           !
934                           Fr_a_h => jrho1_atom%jrho_a_h(ispin)%r_coef
935                           Fr_a_s => jrho1_atom%jrho_a_s(ispin)%r_coef
936                           Fr_b_h => jrho1_atom%jrho_b_h(ispin)%r_coef
937                           Fr_b_s => jrho1_atom%jrho_b_s(ispin)%r_coef
938                           !------------------------------------------------------------------
939                           !
940                           Fr_a_h_ii => jrho1_atom%jrho_a_h_ii(ispin)%r_coef
941                           Fr_a_s_ii => jrho1_atom%jrho_a_s_ii(ispin)%r_coef
942                           Fr_b_h_ii => jrho1_atom%jrho_b_h_ii(ispin)%r_coef
943                           Fr_b_s_ii => jrho1_atom%jrho_b_s_ii(ispin)%r_coef
944                           !------------------------------------------------------------------
945                           !
946                           Fr_a_h_iii => jrho1_atom%jrho_a_h_iii(ispin)%r_coef
947                           Fr_a_s_iii => jrho1_atom%jrho_a_s_iii(ispin)%r_coef
948                           Fr_b_h_iii => jrho1_atom%jrho_b_h_iii(ispin)%r_coef
949                           Fr_b_s_iii => jrho1_atom%jrho_b_s_iii(ispin)%r_coef
950                           !------------------------------------------------------------------
951                           !
952                           DO iso = 1, max_iso_not0_local
953                              l_iso = indso(1, iso) ! not needed
954                              m_iso = indso(2, iso) ! not needed
955                              !
956                              DO icg = 1, cg_n_list(iso)
957                                 !
958                                 iso1 = cg_list(1, icg, iso)
959                                 iso2 = cg_list(2, icg, iso)
960                                 !
961                                 IF (.NOT. (iso2 > 0 .AND. iso1 > 0)) THEN
962                                    WRITE (*, *) 'iso1=', iso1, ' iso2=', iso2, ' iso=', iso, ' icg=', icg
963                                    WRITE (*, *) '.... will stop!'
964                                 ENDIF
965                                 CPASSERT(iso2 > 0 .AND. iso1 > 0)
966                                 !
967                                 l = indso(1, iso1) + indso(1, iso2)
968                                 IF (l .GT. lmax_expansion .OR. l .LT. .0) THEN
969                                    WRITE (*, *) 'calculate_jrho_atom_rad: 1 l', l
970                                    WRITE (*, *) 'calculate_jrho_atom_rad: 1 lmax_expansion', lmax_expansion
971                                    WRITE (*, *) '.... will stop!'
972                                 ENDIF
973                                 CPASSERT(l <= lmax_expansion)
974                                 !------------------------------------------------------------------
975                                 ! P0
976                                 !
977                                 IF (current_env%gauge .EQ. current_gauge_atom) THEN
978                                    ! Hard term
979                                    Fr_h(1:nr, iso) = Fr_h(1:nr, iso) + &
980                                                      gg(1:nr, l)*cjc0_h_block(iso1, iso2)* &
981                                                      my_CG(iso1, iso2, iso)
982                                    ! Soft term
983                                    Fr_s(1:nr, iso) = Fr_s(1:nr, iso) + &
984                                                      gg(1:nr, l)*cjc0_s_block(iso1, iso2)* &
985                                                      my_CG(iso1, iso2, iso)
986                                 ELSE
987                                    ! Hard term
988                                    Fr_h(1:nr, iso) = Fr_h(1:nr, iso) + &
989                                                      gg(1:nr, l)*cjc0_h_block(iso1, iso2)* &
990                                                      my_CG(iso1, iso2, iso)*(grid_atom%rad(1:nr) - gauge_h(1:nr))
991                                    ! Soft term
992                                    Fr_s(1:nr, iso) = Fr_s(1:nr, iso) + &
993                                                      gg(1:nr, l)*cjc0_s_block(iso1, iso2)* &
994                                                      my_CG(iso1, iso2, iso)*(grid_atom%rad(1:nr) - gauge_s(1:nr))
995                                 ENDIF
996                                 !------------------------------------------------------------------
997                                 ! Rai
998                                 !
999                                 ! Hard term
1000                                 Fr_a_h(1:nr, iso) = Fr_a_h(1:nr, iso) + &
1001                                                     dgg_1(1:nr, l)*cjc_h_block(iso1, iso2)* &
1002                                                     my_CG(iso1, iso2, iso)
1003                                 !
1004                                 ! Soft term
1005                                 Fr_a_s(1:nr, iso) = Fr_a_s(1:nr, iso) + &
1006                                                     dgg_1(1:nr, l)*cjc_s_block(iso1, iso2)* &
1007                                                     my_CG(iso1, iso2, iso)
1008                                 !------------------------------------------------------------------
1009                                 ! Rci
1010                                 !
1011                                 IF (current_env%gauge .EQ. current_gauge_atom) THEN
1012                                    ! Hard term
1013                                    Fr_a_h_ii(1:nr, iso) = Fr_a_h_ii(1:nr, iso) + &
1014                                                           dgg_1(1:nr, l)* &
1015                                                           cjc_ii_h_block(iso1, iso2)* &
1016                                                           my_CG(iso1, iso2, iso)
1017                                    ! Soft term
1018                                    Fr_a_s_ii(1:nr, iso) = Fr_a_s_ii(1:nr, iso) + &
1019                                                           dgg_1(1:nr, l)* &
1020                                                           cjc_ii_s_block(iso1, iso2)* &
1021                                                           my_CG(iso1, iso2, iso)
1022                                 ELSE
1023                                    ! Hard term
1024                                    Fr_a_h_ii(1:nr, iso) = Fr_a_h_ii(1:nr, iso) + &
1025                                                           dgg_1(1:nr, l)*gauge_h(1:nr)* &
1026                                                           cjc_ii_h_block(iso1, iso2)* &
1027                                                           my_CG(iso1, iso2, iso)
1028                                    ! Soft term
1029                                    Fr_a_s_ii(1:nr, iso) = Fr_a_s_ii(1:nr, iso) + &
1030                                                           dgg_1(1:nr, l)*gauge_s(1:nr)* &
1031                                                           cjc_ii_s_block(iso1, iso2)* &
1032                                                           my_CG(iso1, iso2, iso)
1033                                 ENDIF
1034                                 !------------------------------------------------------------------
1035                                 ! Rbi
1036                                 !
1037                                 IF (current_env%gauge .EQ. current_gauge_atom) THEN
1038                                    ! Hard term
1039                                    Fr_a_h_iii(1:nr, iso) = Fr_a_h_iii(1:nr, iso) + &
1040                                                            dgg_1(1:nr, l)* &
1041                                                            cjc_iii_h_block(iso1, iso2)* &
1042                                                            my_CG(iso1, iso2, iso)
1043                                    ! Soft term
1044                                    Fr_a_s_iii(1:nr, iso) = Fr_a_s_iii(1:nr, iso) + &
1045                                                            dgg_1(1:nr, l)* &
1046                                                            cjc_iii_s_block(iso1, iso2)* &
1047                                                            my_CG(iso1, iso2, iso)
1048                                 ELSE
1049                                    ! Hard term
1050                                    Fr_a_h_iii(1:nr, iso) = Fr_a_h_iii(1:nr, iso) + &
1051                                                            dgg_1(1:nr, l)*gauge_h(1:nr)* &
1052                                                            cjc_iii_h_block(iso1, iso2)* &
1053                                                            my_CG(iso1, iso2, iso)
1054                                    ! Soft term
1055                                    Fr_a_s_iii(1:nr, iso) = Fr_a_s_iii(1:nr, iso) + &
1056                                                            dgg_1(1:nr, l)*gauge_s(1:nr)* &
1057                                                            cjc_iii_s_block(iso1, iso2)* &
1058                                                            my_CG(iso1, iso2, iso)
1059                                 ENDIF
1060                                 !------------------------------------------------------------------
1061                              ENDDO !icg
1062                              !
1063                           ENDDO ! iso
1064                           !
1065                           !
1066                           DO iso = 1, damax_iso_not0_local
1067                              l_iso = indso(1, iso) ! not needed
1068                              m_iso = indso(2, iso) ! not needed
1069                              !
1070                              DO icg = 1, dacg_n_list(iso)
1071                                 !
1072                                 iso1 = dacg_list(1, icg, iso)
1073                                 iso2 = dacg_list(2, icg, iso)
1074                                 !
1075                                 IF (.NOT. (iso2 > 0 .AND. iso1 > 0)) THEN
1076                                    WRITE (*, *) 'iso1=', iso1, ' iso2=', iso2, ' iso=', iso, ' icg=', icg
1077                                    WRITE (*, *) '.... will stop!'
1078                                 ENDIF
1079                                 CPASSERT(iso2 > 0 .AND. iso1 > 0)
1080                                 !
1081                                 l = indso(1, iso1) + indso(1, iso2)
1082                                 IF (l .GT. lmax_expansion) THEN
1083                                    WRITE (*, *) 'calculate_jrho_atom_rad: 1 l', l
1084                                    WRITE (*, *) 'calculate_jrho_atom_rad: 1 lmax_expansion', lmax_expansion
1085                                    WRITE (*, *) '.... will stop!'
1086                                 ENDIF
1087                                 CPASSERT(l <= lmax_expansion)
1088                                 !------------------------------------------------------------------
1089                                 ! Daij
1090                                 !
1091                                 ! Hard term
1092                                 Fr_b_h(1:nr, iso) = Fr_b_h(1:nr, iso) + &
1093                                                     gg_lm1(1:nr, l)*cjc_h_block(iso1, iso2)* &
1094                                                     my_CG_dxyz_asym(idir, iso1, iso2, iso)
1095                                 !
1096                                 ! Soft term
1097                                 Fr_b_s(1:nr, iso) = Fr_b_s(1:nr, iso) + &
1098                                                     gg_lm1(1:nr, l)*cjc_s_block(iso1, iso2)* &
1099                                                     my_CG_dxyz_asym(idir, iso1, iso2, iso)
1100                                 !
1101                                 !------------------------------------------------------------------
1102                                 ! Dcij
1103                                 !
1104                                 IF (current_env%gauge .EQ. current_gauge_atom) THEN
1105                                    ! Hard term
1106                                    Fr_b_h_ii(1:nr, iso) = Fr_b_h_ii(1:nr, iso) + &
1107                                                           gg_lm1(1:nr, l)* &
1108                                                           cjc_ii_h_block(iso1, iso2)* &
1109                                                           my_CG_dxyz_asym(idir, iso1, iso2, iso)
1110                                    ! Soft term
1111                                    Fr_b_s_ii(1:nr, iso) = Fr_b_s_ii(1:nr, iso) + &
1112                                                           gg_lm1(1:nr, l)* &
1113                                                           cjc_ii_s_block(iso1, iso2)* &
1114                                                           my_CG_dxyz_asym(idir, iso1, iso2, iso)
1115                                 ELSE
1116                                    ! Hard term
1117                                    Fr_b_h_ii(1:nr, iso) = Fr_b_h_ii(1:nr, iso) + &
1118                                                           gg_lm1(1:nr, l)*gauge_h(1:nr)* &
1119                                                           cjc_ii_h_block(iso1, iso2)* &
1120                                                           my_CG_dxyz_asym(idir, iso1, iso2, iso)
1121                                    ! Soft term
1122                                    Fr_b_s_ii(1:nr, iso) = Fr_b_s_ii(1:nr, iso) + &
1123                                                           gg_lm1(1:nr, l)*gauge_s(1:nr)* &
1124                                                           cjc_ii_s_block(iso1, iso2)* &
1125                                                           my_CG_dxyz_asym(idir, iso1, iso2, iso)
1126                                 ENDIF
1127                                 !------------------------------------------------------------------
1128                                 ! Dbij
1129                                 !
1130                                 IF (current_env%gauge .EQ. current_gauge_atom) THEN
1131                                    ! Hard term
1132                                    Fr_b_h_iii(1:nr, iso) = Fr_b_h_iii(1:nr, iso) + &
1133                                                            gg_lm1(1:nr, l)* &
1134                                                            cjc_iii_h_block(iso1, iso2)* &
1135                                                            my_CG_dxyz_asym(idir, iso1, iso2, iso)
1136                                    ! Soft term
1137                                    Fr_b_s_iii(1:nr, iso) = Fr_b_s_iii(1:nr, iso) + &
1138                                                            gg_lm1(1:nr, l)* &
1139                                                            cjc_iii_s_block(iso1, iso2)* &
1140                                                            my_CG_dxyz_asym(idir, iso1, iso2, iso)
1141                                 ELSE
1142                                    ! Hard term
1143                                    Fr_b_h_iii(1:nr, iso) = Fr_b_h_iii(1:nr, iso) + &
1144                                                            gg_lm1(1:nr, l)*gauge_h(1:nr)* &
1145                                                            cjc_iii_h_block(iso1, iso2)* &
1146                                                            my_CG_dxyz_asym(idir, iso1, iso2, iso)
1147                                    ! Soft term
1148                                    Fr_b_s_iii(1:nr, iso) = Fr_b_s_iii(1:nr, iso) + &
1149                                                            gg_lm1(1:nr, l)*gauge_s(1:nr)* &
1150                                                            cjc_iii_s_block(iso1, iso2)* &
1151                                                            my_CG_dxyz_asym(idir, iso1, iso2, iso)
1152                                 ENDIF
1153                                 !------------------------------------------------------------------
1154                              ENDDO ! icg
1155                           ENDDO ! iso
1156                           !
1157                        ENDDO ! ispin
1158                     ENDDO ! iat
1159                     !
1160                     !------------------------------------------------------------------
1161                     !
1162                  ENDDO !ipgf2
1163               ENDDO ! ipgf1
1164               m2s = m2s + maxso
1165            ENDDO ! iset2
1166            m1s = m1s + maxso
1167         ENDDO ! iset1
1168         !
1169         DEALLOCATE (cjc0_h_block, cjc0_s_block, cjc_h_block, cjc_s_block, cjc_ii_h_block, cjc_ii_s_block, &
1170                     cjc_iii_h_block, cjc_iii_s_block, g1, g2, gg, gg_lm1, dgg_1, gauge_h, gauge_s, &
1171                     cg_list, cg_n_list, dacg_list, dacg_n_list)
1172      ENDDO ! ikind
1173      !
1174      !
1175      DEALLOCATE (is_set_to_0)
1176      !
1177      CALL timestop(handle)
1178      !
1179   END SUBROUTINE calculate_jrho_atom_rad
1180
1181! **************************************************************************************************
1182!> \brief ...
1183!> \param jrho1_atom ...
1184!> \param jrho_h ...
1185!> \param jrho_s ...
1186!> \param grid_atom ...
1187!> \param harmonics ...
1188!> \param do_igaim ...
1189!> \param ratom ...
1190!> \param natm_gauge ...
1191!> \param iB ...
1192!> \param idir ...
1193!> \param ispin ...
1194! **************************************************************************************************
1195   SUBROUTINE calculate_jrho_atom_ang(jrho1_atom, jrho_h, jrho_s, grid_atom, &
1196                                      harmonics, do_igaim, ratom, natm_gauge, &
1197                                      iB, idir, ispin)
1198      !
1199      TYPE(jrho_atom_type), POINTER            :: jrho1_atom
1200      REAL(dp), DIMENSION(:, :), POINTER       :: jrho_h, jrho_s
1201      TYPE(grid_atom_type), POINTER            :: grid_atom
1202      TYPE(harmonics_atom_type), POINTER       :: harmonics
1203      LOGICAL, INTENT(IN)                      :: do_igaim
1204      INTEGER, INTENT(IN)                      :: iB, idir, ispin, natm_gauge
1205      REAL(dp), INTENT(IN) :: ratom(:, :)
1206
1207      CHARACTER(len=*), PARAMETER :: routineN = 'calculate_jrho_atom_ang', &
1208                                     routineP = moduleN//':'//routineN
1209
1210      INTEGER                                  :: ia, idir2, iiB, iiiB, ir, &
1211                                                  iso, max_max_iso_not0, na, nr
1212      REAL(dp)                                 :: rad_part, scale
1213      REAL(dp), DIMENSION(:, :), POINTER :: a, Fr_a_h, Fr_a_h_ii, Fr_a_h_iii, &
1214                                            Fr_a_s, Fr_a_s_ii, Fr_a_s_iii, Fr_b_h, Fr_b_h_ii, Fr_b_h_iii, Fr_b_s, &
1215                                            Fr_b_s_ii, Fr_b_s_iii, Fr_h, Fr_s, slm
1216      REAL(dp), DIMENSION(:), POINTER :: r
1217      REAL(dp), DIMENSION(:, :, :), ALLOCATABLE :: g
1218!
1219!
1220      NULLIFY (Fr_h, Fr_s, Fr_a_h, Fr_a_s, Fr_a_h_ii, Fr_a_s_ii, Fr_a_h_iii, Fr_a_s_iii, &
1221               Fr_b_h, Fr_b_s, Fr_b_h_ii, Fr_b_s_ii, Fr_b_h_iii, Fr_b_s_iii, &
1222               a, slm)
1223      !
1224      CPASSERT(ASSOCIATED(jrho_h))
1225      CPASSERT(ASSOCIATED(jrho_s))
1226      CPASSERT(ASSOCIATED(jrho1_atom))
1227      ! just to be sure...
1228      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_h))
1229      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_s))
1230      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_h))
1231      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_s))
1232      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_h(ispin)%r_coef))
1233      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_s(ispin)%r_coef))
1234      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_h(ispin)%r_coef))
1235      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_s(ispin)%r_coef))
1236      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_h_ii))
1237      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_s_ii))
1238      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_h_ii))
1239      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_s_ii))
1240      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_h_ii(ispin)%r_coef))
1241      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_s_ii(ispin)%r_coef))
1242      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_h_ii(ispin)%r_coef))
1243      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_s_ii(ispin)%r_coef))
1244      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_h_iii))
1245      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_s_iii))
1246      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_h_iii))
1247      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_s_iii))
1248      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_h_iii(ispin)%r_coef))
1249      CPASSERT(ASSOCIATED(jrho1_atom%jrho_a_s_iii(ispin)%r_coef))
1250      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_h_iii(ispin)%r_coef))
1251      CPASSERT(ASSOCIATED(jrho1_atom%jrho_b_s_iii(ispin)%r_coef))
1252      !
1253      !
1254      nr = grid_atom%nr
1255      na = grid_atom%ng_sphere
1256      max_max_iso_not0 = MAX(harmonics%max_iso_not0, harmonics%damax_iso_not0)
1257      ALLOCATE (g(3, nr, na))
1258      !------------------------------------------------------------------
1259      !
1260      Fr_h => jrho1_atom%jrho_h(ispin)%r_coef
1261      Fr_s => jrho1_atom%jrho_s(ispin)%r_coef
1262      !------------------------------------------------------------------
1263      !
1264      Fr_a_h => jrho1_atom%jrho_a_h(ispin)%r_coef !Rai
1265      Fr_a_s => jrho1_atom%jrho_a_s(ispin)%r_coef
1266      Fr_b_h => jrho1_atom%jrho_b_h(ispin)%r_coef !Daij
1267      Fr_b_s => jrho1_atom%jrho_b_s(ispin)%r_coef
1268      !------------------------------------------------------------------
1269      !
1270      Fr_a_h_ii => jrho1_atom%jrho_a_h_ii(ispin)%r_coef !Rci
1271      Fr_a_s_ii => jrho1_atom%jrho_a_s_ii(ispin)%r_coef
1272      Fr_b_h_ii => jrho1_atom%jrho_b_h_ii(ispin)%r_coef !Dcij
1273      Fr_b_s_ii => jrho1_atom%jrho_b_s_ii(ispin)%r_coef
1274      !------------------------------------------------------------------
1275      !
1276      Fr_a_h_iii => jrho1_atom%jrho_a_h_iii(ispin)%r_coef !Rbi
1277      Fr_a_s_iii => jrho1_atom%jrho_a_s_iii(ispin)%r_coef
1278      Fr_b_h_iii => jrho1_atom%jrho_b_h_iii(ispin)%r_coef !Dbij
1279      Fr_b_s_iii => jrho1_atom%jrho_b_s_iii(ispin)%r_coef
1280      !------------------------------------------------------------------
1281      !
1282      a => harmonics%a
1283      slm => harmonics%slm
1284      r => grid_atom%rad
1285      !
1286      CALL set_vecp(iB, iiB, iiiB)
1287      !
1288      scale = 0.0_dp
1289      idir2 = 1
1290      IF (idir .NE. iB) THEN
1291         CALL set_vecp_rev(idir, iB, idir2)
1292         scale = fac_vecp(idir, iB, idir2)
1293      ENDIF
1294      !
1295      ! Set the gauge
1296      CALL get_gauge()
1297      !
1298      DO ir = 1, nr
1299         DO iso = 1, max_max_iso_not0
1300            DO ia = 1, na
1301               IF (do_igaim) THEN
1302                  !------------------------------------------------------------------
1303                  ! Hard current density response
1304                  ! radial(ia,ir) = (               aj(ia) * Rai(ir,iso) + Daij
1305                  !                  -  aii(ia) * ( aj(ia) * Rbi(ir,iso) + Dbij )
1306                  !                  + aiii(ia) * ( aj(ia) * Rci(ir,iso) + Dcij )
1307                  !                 ) * Ylm(ia)
1308                  rad_part = a(idir, ia)*Fr_a_h(ir, iso) + Fr_b_h(ir, iso) &
1309                       &   - g(iiB, ir, ia)*(a(idir, ia)*Fr_a_h_iii(ir, iso) + Fr_b_h_iii(ir, iso))&
1310                       &   + g(iiiB, ir, ia)*(a(idir, ia)*Fr_a_h_ii(ir, iso) + Fr_b_h_ii(ir, iso))&
1311                       &   + scale*(a(idir2, ia)*r(ir) - g(idir2, ir, ia))*Fr_h(ir, iso)
1312                  !
1313                  jrho_h(ir, ia) = jrho_h(ir, ia) + rad_part*slm(ia, iso)
1314                  !------------------------------------------------------------------
1315                  ! Soft current density response
1316                  rad_part = a(idir, ia)*Fr_a_s(ir, iso) + Fr_b_s(ir, iso) &
1317                       &   - g(iiB, ir, ia)*(a(idir, ia)*Fr_a_s_iii(ir, iso) + Fr_b_s_iii(ir, iso))&
1318                       &   + g(iiiB, ir, ia)*(a(idir, ia)*Fr_a_s_ii(ir, iso) + Fr_b_s_ii(ir, iso))&
1319                       &   + scale*(a(idir2, ia)*r(ir) - g(idir2, ir, ia))*Fr_s(ir, iso)
1320                  !
1321                  jrho_s(ir, ia) = jrho_s(ir, ia) + rad_part*slm(ia, iso)
1322                  !------------------------------------------------------------------
1323               ELSE
1324                  !------------------------------------------------------------------
1325                  ! Hard current density response
1326                  ! radial(ia,ir) = (               aj(ia) * Rai(ir,iso) + Daij
1327                  !                  -  aii(ia) * ( aj(ia) * Rbi(ir,iso) + Dbij )
1328                  !                  + aiii(ia) * ( aj(ia) * Rci(ir,iso) + Dcij )
1329                  !                 ) * Ylm(ia)
1330                  rad_part = a(idir, ia)*Fr_a_h(ir, iso) + Fr_b_h(ir, iso) &
1331                       &   - a(iiB, ia)*(a(idir, ia)*Fr_a_h_iii(ir, iso) + Fr_b_h_iii(ir, iso))&
1332                       &   + a(iiiB, ia)*(a(idir, ia)*Fr_a_h_ii(ir, iso) + Fr_b_h_ii(ir, iso))&
1333                       &   + scale*a(idir2, ia)*Fr_h(ir, iso)
1334                  !
1335                  jrho_h(ir, ia) = jrho_h(ir, ia) + rad_part*slm(ia, iso)
1336                  !------------------------------------------------------------------
1337                  ! Soft current density response
1338                  rad_part = a(idir, ia)*Fr_a_s(ir, iso) + Fr_b_s(ir, iso) &
1339                       &   - a(iiB, ia)*(a(idir, ia)*Fr_a_s_iii(ir, iso) + Fr_b_s_iii(ir, iso))&
1340                       &   + a(iiiB, ia)*(a(idir, ia)*Fr_a_s_ii(ir, iso) + Fr_b_s_ii(ir, iso))&
1341                       &   + scale*a(idir2, ia)*Fr_s(ir, iso)
1342                  !
1343                  jrho_s(ir, ia) = jrho_s(ir, ia) + rad_part*slm(ia, iso)
1344                  !------------------------------------------------------------------
1345               ENDIF
1346            ENDDO ! ia
1347         ENDDO ! iso
1348      ENDDO ! ir
1349      !
1350      DEALLOCATE (g)
1351      !
1352   CONTAINS
1353      !
1354! **************************************************************************************************
1355!> \brief ...
1356! **************************************************************************************************
1357      SUBROUTINE get_gauge()
1358      INTEGER                                            :: iatom, ixyz, jatom
1359      REAL(dp)                                           :: ab, pa, pb, point(3), pra(3), prb(3), &
1360                                                            res, tmp
1361      REAL(dp), ALLOCATABLE, DIMENSION(:)                :: buf
1362
1363         ALLOCATE (buf(natm_gauge))
1364         DO ir = 1, nr
1365         DO ia = 1, na
1366            DO ixyz = 1, 3
1367               g(ixyz, ir, ia) = 0.0_dp
1368            ENDDO
1369            point(1) = r(ir)*a(1, ia)
1370            point(2) = r(ir)*a(2, ia)
1371            point(3) = r(ir)*a(3, ia)
1372            DO iatom = 1, natm_gauge
1373               buf(iatom) = 1.0_dp
1374               pra = point - ratom(:, iatom)
1375               pa = SQRT(pra(1)**2 + pra(2)**2 + pra(3)**2)
1376               DO jatom = 1, natm_gauge
1377                  IF (iatom .EQ. jatom) CYCLE
1378                  prb = point - ratom(:, jatom)
1379                  pb = SQRT(prb(1)**2 + prb(2)**2 + prb(3)**2)
1380                  ab = SQRT((pra(1) - prb(1))**2 + (pra(2) - prb(2))**2 + (pra(3) - prb(3))**2)
1381                  !
1382                  tmp = (pa - pb)/ab
1383                  tmp = 0.5_dp*(3.0_dp - tmp**2)*tmp
1384                  tmp = 0.5_dp*(3.0_dp - tmp**2)*tmp
1385                  tmp = 0.5_dp*(3.0_dp - tmp**2)*tmp
1386                  buf(iatom) = buf(iatom)*0.5_dp*(1.0_dp - tmp)
1387               ENDDO
1388            ENDDO
1389            DO ixyz = 1, 3
1390               res = 0.0_dp
1391               DO iatom = 1, natm_gauge
1392                  res = res + ratom(ixyz, iatom)*buf(iatom)
1393               ENDDO
1394               res = res/SUM(buf(1:natm_gauge))
1395               !
1396               g(ixyz, ir, ia) = res
1397            ENDDO
1398         ENDDO
1399         ENDDO
1400         DEALLOCATE (buf)
1401      END SUBROUTINE get_gauge
1402   END SUBROUTINE calculate_jrho_atom_ang
1403
1404! **************************************************************************************************
1405!> \brief ...
1406!> \param current_env ...
1407!> \param qs_env ...
1408!> \param iB ...
1409!> \param idir ...
1410! **************************************************************************************************
1411   SUBROUTINE calculate_jrho_atom(current_env, qs_env, iB, idir)
1412      TYPE(current_env_type)                             :: current_env
1413      TYPE(qs_environment_type), POINTER                 :: qs_env
1414      INTEGER, INTENT(IN)                                :: iB, idir
1415
1416      CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_jrho_atom', &
1417                                     routineP = moduleN//':'//routineN
1418
1419      INTEGER                                            :: iat, iatom, ikind, ispin, jatom, &
1420                                                            natm_gauge, natm_tot, natom, nkind, &
1421                                                            nspins
1422      INTEGER, DIMENSION(2)                              :: bo
1423      INTEGER, DIMENSION(:), POINTER                     :: atom_list
1424      LOGICAL                                            :: do_igaim, gapw, paw_atom
1425      REAL(dp)                                           :: hard_radius, r(3)
1426      REAL(dp), ALLOCATABLE, DIMENSION(:, :)             :: ratom
1427      TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
1428      TYPE(cell_type), POINTER                           :: cell
1429      TYPE(cp_para_env_type), POINTER                    :: para_env
1430      TYPE(dft_control_type), POINTER                    :: dft_control
1431      TYPE(grid_atom_type), POINTER                      :: grid_atom
1432      TYPE(harmonics_atom_type), POINTER                 :: harmonics
1433      TYPE(jrho_atom_type), DIMENSION(:), POINTER        :: jrho1_atom_set
1434      TYPE(jrho_atom_type), POINTER                      :: jrho1_atom
1435      TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
1436      TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
1437
1438      NULLIFY (para_env, dft_control)
1439      NULLIFY (jrho1_atom_set, grid_atom, harmonics)
1440      NULLIFY (atomic_kind_set, qs_kind_set, atom_list)
1441
1442      CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, &
1443                      atomic_kind_set=atomic_kind_set, &
1444                      qs_kind_set=qs_kind_set, &
1445                      particle_set=particle_set, &
1446                      cell=cell, &
1447                      para_env=para_env)
1448
1449      CALL get_current_env(current_env=current_env, &
1450                           jrho1_atom_set=jrho1_atom_set)
1451
1452      do_igaim = .FALSE.
1453      IF (current_env%gauge .EQ. current_gauge_atom) do_igaim = .TRUE.
1454
1455      gapw = dft_control%qs_control%gapw
1456      nkind = SIZE(qs_kind_set, 1)
1457      nspins = dft_control%nspins
1458
1459      natm_tot = SIZE(particle_set)
1460      ALLOCATE (ratom(3, natm_tot))
1461
1462      IF (gapw) THEN
1463         DO ikind = 1, nkind
1464            NULLIFY (atom_list, grid_atom, harmonics)
1465            CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=natom)
1466            CALL get_qs_kind(qs_kind_set(ikind), &
1467                             grid_atom=grid_atom, &
1468                             harmonics=harmonics, &
1469                             hard_radius=hard_radius, &
1470                             paw_atom=paw_atom)
1471
1472            IF (.NOT. paw_atom) CYCLE
1473
1474            ! Distribute the atoms of this kind
1475
1476            bo = get_limit(natom, para_env%num_pe, para_env%mepos)
1477
1478            DO iat = bo(1), bo(2)
1479               iatom = atom_list(iat)
1480               NULLIFY (jrho1_atom)
1481               jrho1_atom => jrho1_atom_set(iatom)
1482
1483               natm_gauge = 0
1484               DO jatom = 1, natm_tot
1485                  r(:) = pbc(particle_set(jatom)%r(:) - particle_set(iatom)%r(:), cell)
1486                  ! SQRT(SUM(r(:)**2)) .LE. 2.0_dp*hard_radius
1487                  IF (SUM(r(:)**2) .LE. (4.0_dp*hard_radius*hard_radius)) THEN
1488                     natm_gauge = natm_gauge + 1
1489                     ratom(:, natm_gauge) = r(:)
1490                  ENDIF
1491               ENDDO
1492
1493               DO ispin = 1, nspins
1494                  jrho1_atom%jrho_vec_rad_h(idir, ispin)%r_coef = 0.0_dp
1495                  jrho1_atom%jrho_vec_rad_s(idir, ispin)%r_coef = 0.0_dp
1496                  CALL calculate_jrho_atom_ang(jrho1_atom, &
1497                                               jrho1_atom%jrho_vec_rad_h(idir, ispin)%r_coef, &
1498                                               jrho1_atom%jrho_vec_rad_s(idir, ispin)%r_coef, &
1499                                               grid_atom, harmonics, &
1500                                               do_igaim, &
1501                                               ratom, natm_gauge, iB, idir, ispin)
1502               END DO !ispin
1503            END DO !iat
1504         END DO !ikind
1505      END IF
1506
1507      DEALLOCATE (ratom)
1508
1509   END SUBROUTINE calculate_jrho_atom
1510
1511END MODULE qs_linres_atom_current
1512