LCOV - code coverage report
Current view: top level - src - se_core_matrix.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 35.4 % 452 160
Test Date: 2025-07-25 12:55:17 Functions: 20.0 % 5 1

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Calculation of the Hamiltonian integral matrix <a|H|b> for
      10              : !>      semi-empirical methods
      11              : !> \author JGH
      12              : ! **************************************************************************************************
      13              : MODULE se_core_matrix
      14              :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      15              :                                               get_atomic_kind,&
      16              :                                               get_atomic_kind_set
      17              :    USE cp_control_types,                ONLY: dft_control_type
      18              :    USE cp_dbcsr_api,                    ONLY: &
      19              :         dbcsr_add, dbcsr_copy, dbcsr_deallocate_matrix, dbcsr_distribute, dbcsr_get_block_p, &
      20              :         dbcsr_p_type, dbcsr_replicate_all, dbcsr_set, dbcsr_sum_replicated, dbcsr_type
      21              :    USE cp_dbcsr_contrib,                ONLY: dbcsr_get_block_diag
      22              :    USE cp_dbcsr_operations,             ONLY: dbcsr_allocate_matrix_set
      23              :    USE cp_dbcsr_output,                 ONLY: cp_dbcsr_write_sparse_matrix
      24              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      25              :                                               cp_logger_type
      26              :    USE cp_output_handling,              ONLY: cp_p_file,&
      27              :                                               cp_print_key_finished_output,&
      28              :                                               cp_print_key_should_output,&
      29              :                                               cp_print_key_unit_nr
      30              :    USE input_constants,                 ONLY: &
      31              :         do_method_am1, do_method_mndo, do_method_mndod, do_method_pdg, do_method_pm3, &
      32              :         do_method_pm6, do_method_pm6fm, do_method_pnnl, do_method_rm1
      33              :    USE input_section_types,             ONLY: section_vals_val_get
      34              :    USE kinds,                           ONLY: dp
      35              :    USE message_passing,                 ONLY: mp_para_env_type
      36              :    USE particle_types,                  ONLY: particle_type
      37              :    USE physcon,                         ONLY: evolt
      38              :    USE qs_energy_types,                 ONLY: qs_energy_type
      39              :    USE qs_environment_types,            ONLY: get_qs_env,&
      40              :                                               qs_environment_type
      41              :    USE qs_force_types,                  ONLY: qs_force_type
      42              :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      43              :                                               qs_kind_type
      44              :    USE qs_ks_types,                     ONLY: qs_ks_env_type,&
      45              :                                               set_ks_env
      46              :    USE qs_neighbor_list_types,          ONLY: get_iterator_info,&
      47              :                                               neighbor_list_iterate,&
      48              :                                               neighbor_list_iterator_create,&
      49              :                                               neighbor_list_iterator_p_type,&
      50              :                                               neighbor_list_iterator_release,&
      51              :                                               neighbor_list_set_p_type
      52              :    USE qs_overlap,                      ONLY: build_overlap_matrix
      53              :    USE qs_rho_types,                    ONLY: qs_rho_get,&
      54              :                                               qs_rho_type
      55              :    USE semi_empirical_int_arrays,       ONLY: rij_threshold
      56              :    USE semi_empirical_types,            ONLY: get_se_param,&
      57              :                                               semi_empirical_type
      58              :    USE semi_empirical_utils,            ONLY: get_se_type
      59              :    USE virial_methods,                  ONLY: virial_pair_force
      60              :    USE virial_types,                    ONLY: virial_type
      61              : #include "./base/base_uses.f90"
      62              : 
      63              :    IMPLICIT NONE
      64              : 
      65              :    PRIVATE
      66              : 
      67              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'se_core_matrix'
      68              : 
      69              :    PUBLIC :: build_se_core_matrix
      70              : 
      71              : CONTAINS
      72              : 
      73              : ! **************************************************************************************************
      74              : !> \brief ...
      75              : !> \param qs_env ...
      76              : !> \param para_env ...
      77              : !> \param calculate_forces ...
      78              : ! **************************************************************************************************
      79         7338 :    SUBROUTINE build_se_core_matrix(qs_env, para_env, calculate_forces)
      80              : 
      81              :       TYPE(qs_environment_type), POINTER                 :: qs_env
      82              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      83              :       LOGICAL, INTENT(IN)                                :: calculate_forces
      84              : 
      85              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'build_se_core_matrix'
      86              : 
      87              :       INTEGER :: after, atom_a, atom_b, handle, i, iatom, icol, icor, ikind, inode, irow, itype, &
      88              :          iw, j, jatom, jkind, natom, natorb_a, nkind, nr_a, nra, nrb
      89         7338 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atom_of_kind, nrt
      90              :       LOGICAL                                            :: defined, found, omit_headers, use_virial
      91         7338 :       LOGICAL, ALLOCATABLE, DIMENSION(:)                 :: se_defined
      92              :       REAL(KIND=dp)                                      :: delta, dr, econst, eheat, eisol, kh, &
      93              :                                                             udd, uff, upp, uss, ZPa, ZPb, ZSa, ZSb
      94         7338 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: ZPt, ZSt
      95         7338 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: hmt, umt
      96              :       REAL(KIND=dp), DIMENSION(16)                       :: ha, hb, ua
      97              :       REAL(KIND=dp), DIMENSION(3)                        :: force_ab, rij
      98         7338 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: beta_a, sto_exponents_a
      99         7338 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: dsmat, h_block, h_blocka, pabmat, pamat, &
     100         7338 :                                                             s_block
     101         7338 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     102              :       TYPE(cp_logger_type), POINTER                      :: logger
     103         7338 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: matrix_h, matrix_p, matrix_s
     104              :       TYPE(dbcsr_type), POINTER                          :: diagmat_h, diagmat_p
     105              :       TYPE(dft_control_type), POINTER                    :: dft_control
     106              :       TYPE(neighbor_list_iterator_p_type), &
     107         7338 :          DIMENSION(:), POINTER                           :: nl_iterator
     108              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     109         7338 :          POINTER                                         :: sab_orb
     110         7338 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     111              :       TYPE(qs_energy_type), POINTER                      :: energy
     112         7338 :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: force
     113         7338 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     114              :       TYPE(qs_ks_env_type), POINTER                      :: ks_env
     115              :       TYPE(qs_rho_type), POINTER                         :: rho
     116              :       TYPE(semi_empirical_type), POINTER                 :: se_kind_a
     117              :       TYPE(virial_type), POINTER                         :: virial
     118              : 
     119              : !   REAL(KIND=dp), DIMENSION(3)              :: R
     120              : 
     121         7338 :       CALL timeset(routineN, handle)
     122              : 
     123         7338 :       NULLIFY (logger, energy)
     124         7338 :       logger => cp_get_default_logger()
     125              : 
     126         7338 :       NULLIFY (rho, force, atomic_kind_set, qs_kind_set, sab_orb, &
     127         7338 :                diagmat_h, diagmat_p, particle_set, matrix_p, ks_env)
     128              : 
     129              :       CALL get_qs_env(qs_env, &
     130              :                       matrix_s=matrix_s, &
     131              :                       matrix_h=matrix_h, &
     132              :                       ks_env=ks_env, &
     133              :                       particle_set=particle_set, &
     134              :                       atomic_kind_set=atomic_kind_set, &
     135              :                       qs_kind_set=qs_kind_set, &
     136              :                       dft_control=dft_control, &
     137              :                       energy=energy, &
     138              :                       force=force, &
     139              :                       virial=virial, &
     140              :                       rho=rho, &
     141         7338 :                       sab_orb=sab_orb)
     142              : 
     143              :       ! calculate overlap matrix
     144         7338 :       IF (calculate_forces) THEN
     145              :          CALL build_overlap_matrix(ks_env, nderivative=1, matrix_s=matrix_s, &
     146              :                                    matrix_name="OVERLAP", &
     147              :                                    basis_type_a="ORB", &
     148              :                                    basis_type_b="ORB", &
     149         3002 :                                    sab_nl=sab_orb)
     150         3002 :          CALL set_ks_env(ks_env, matrix_s=matrix_s)
     151         3002 :          use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
     152              :       ELSE
     153              :          CALL build_overlap_matrix(ks_env, matrix_s=matrix_s, &
     154              :                                    matrix_name="OVERLAP", &
     155              :                                    basis_type_a="ORB", &
     156              :                                    basis_type_b="ORB", &
     157         4336 :                                    sab_nl=sab_orb)
     158         4336 :          CALL set_ks_env(ks_env, matrix_s=matrix_s)
     159         4336 :          use_virial = .FALSE.
     160              :       END IF
     161              : 
     162         7338 :       IF (calculate_forces) THEN
     163         3002 :          CALL qs_rho_get(rho, rho_ao=matrix_p)
     164              : 
     165         3002 :          IF (SIZE(matrix_p) == 2) THEN
     166          140 :             CALL dbcsr_add(matrix_p(1)%matrix, matrix_p(2)%matrix, alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
     167              :          END IF
     168         3002 :          delta = dft_control%qs_control%se_control%delta
     169              :          CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
     170         3002 :                                   atom_of_kind=atom_of_kind)
     171         3002 :          ALLOCATE (diagmat_p)
     172         3002 :          CALL dbcsr_get_block_diag(matrix_p(1)%matrix, diagmat_p)
     173         3002 :          CALL dbcsr_replicate_all(diagmat_p)
     174              :       END IF
     175              : 
     176              :       ! Allocate the core Hamiltonian matrix
     177         7338 :       CALL dbcsr_allocate_matrix_set(matrix_h, 1)
     178         7338 :       ALLOCATE (matrix_h(1)%matrix)
     179         7338 :       CALL dbcsr_copy(matrix_h(1)%matrix, matrix_s(1)%matrix, "CORE HAMILTONIAN MATRIX")
     180         7338 :       CALL dbcsr_set(matrix_h(1)%matrix, 0.0_dp)
     181              : 
     182              :       ! Allocate a diagonal block matrix
     183         7338 :       ALLOCATE (diagmat_h)
     184         7338 :       CALL dbcsr_get_block_diag(matrix_s(1)%matrix, diagmat_h)
     185         7338 :       CALL dbcsr_set(diagmat_h, 0.0_dp)
     186         7338 :       CALL dbcsr_replicate_all(diagmat_h)
     187              : 
     188              :       ! kh might be set in qs_control
     189              :       itype = get_se_type(dft_control%qs_control%method_id)
     190         7338 :       kh = 0.5_dp
     191              : 
     192         7338 :       nkind = SIZE(atomic_kind_set)
     193              : 
     194        22014 :       ALLOCATE (se_defined(nkind))
     195        22014 :       ALLOCATE (hmt(16, nkind))
     196        14676 :       ALLOCATE (umt(16, nkind))
     197              : 
     198        22014 :       ALLOCATE (ZSt(nkind))
     199        14676 :       ALLOCATE (ZPt(nkind))
     200        14676 :       ALLOCATE (nrt(nkind))
     201              : 
     202         7338 :       econst = 0.0_dp
     203        23642 :       DO ikind = 1, nkind
     204        16304 :          CALL get_atomic_kind(atomic_kind_set(ikind), natom=natom)
     205        16304 :          CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind_a)
     206              :          CALL get_se_param(se_kind_a, defined=defined, natorb=natorb_a, &
     207              :                            beta=beta_a, uss=uss, upp=upp, udd=udd, uff=uff, eisol=eisol, eheat=eheat, &
     208        16304 :                            nr=nr_a, sto_exponents=sto_exponents_a)
     209        16304 :          econst = econst - (eisol - eheat)*REAL(natom, dp)
     210        16304 :          se_defined(ikind) = (defined .AND. natorb_a >= 1)
     211        16304 :          hmt(1, ikind) = beta_a(0)
     212        65216 :          hmt(2:4, ikind) = beta_a(1)
     213        97824 :          hmt(5:9, ikind) = beta_a(2)
     214       130432 :          hmt(10:16, ikind) = beta_a(3)
     215        16304 :          umt(1, ikind) = uss
     216        65216 :          umt(2:4, ikind) = upp
     217        97824 :          umt(5:9, ikind) = udd
     218       130432 :          umt(10:16, ikind) = uff
     219              : 
     220        16304 :          ZSt(ikind) = sto_exponents_a(0)
     221        16304 :          ZPt(ikind) = sto_exponents_a(1)
     222        56250 :          nrt(ikind) = nr_a
     223              : 
     224              :       END DO
     225         7338 :       energy%core_self = econst
     226              : 
     227         7338 :       CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
     228       428930 :       DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
     229       421592 :          CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, iatom=iatom, jatom=jatom, inode=inode, r=rij)
     230       421592 :          IF (.NOT. se_defined(ikind)) CYCLE
     231       421592 :          IF (.NOT. se_defined(jkind)) CYCLE
     232      7167064 :          ha(1:16) = hmt(1:16, ikind)
     233      7167064 :          ua(1:16) = umt(1:16, ikind)
     234      7167064 :          hb(1:16) = hmt(1:16, jkind)
     235              : 
     236       421592 :          nra = nrt(ikind)
     237       421592 :          nrb = nrt(jkind)
     238       421592 :          ZSa = ZSt(ikind)
     239       421592 :          ZSb = ZSt(jkind)
     240       421592 :          ZPa = ZPt(ikind)
     241       421592 :          ZPb = ZPt(jkind)
     242              : 
     243       421592 :          IF (inode == 1) THEN
     244       159950 :             SELECT CASE (dft_control%qs_control%method_id)
     245              :             CASE (do_method_am1, do_method_rm1, do_method_mndo, do_method_pdg, &
     246              :                   do_method_pm3, do_method_pm6, do_method_pm6fm, do_method_mndod, do_method_pnnl)
     247        79975 :                NULLIFY (h_blocka)
     248        79975 :                CALL dbcsr_get_block_p(diagmat_h, iatom, iatom, h_blocka, found)
     249        79975 :                CPASSERT(ASSOCIATED(h_blocka))
     250       159950 :                IF (calculate_forces) THEN
     251        34176 :                   CALL dbcsr_get_block_p(diagmat_p, iatom, iatom, pamat, found)
     252        34176 :                   CPASSERT(ASSOCIATED(pamat))
     253              :                END IF
     254              :             END SELECT
     255              :          END IF
     256      1686368 :          dr = SUM(rij(:)**2)
     257       421592 :          IF (iatom == jatom .AND. dr < rij_threshold) THEN
     258              : 
     259        27968 :             SELECT CASE (dft_control%qs_control%method_id)
     260              :             CASE DEFAULT
     261            0 :                CPABORT("")
     262              :             CASE (do_method_am1, do_method_rm1, do_method_mndo, do_method_pdg, &
     263              :                   do_method_pm3, do_method_pm6, do_method_pm6fm, do_method_mndod, do_method_pnnl)
     264       114804 :                DO i = 1, SIZE(h_blocka, 1)
     265       114804 :                   h_blocka(i, i) = h_blocka(i, i) + ua(i)
     266              :                END DO
     267              :             END SELECT
     268              : 
     269              :          ELSE
     270       393624 :             IF (iatom <= jatom) THEN
     271       190374 :                irow = iatom
     272       190374 :                icol = jatom
     273              :             ELSE
     274       203250 :                irow = jatom
     275       203250 :                icol = iatom
     276              :             END IF
     277       393624 :             NULLIFY (h_block)
     278              :             CALL dbcsr_get_block_p(matrix_h(1)%matrix, &
     279       393624 :                                    irow, icol, h_block, found)
     280       393624 :             CPASSERT(ASSOCIATED(h_block))
     281              :             ! two-centre one-electron term
     282       393624 :             NULLIFY (s_block)
     283              : 
     284              : !          CALL dbcsr_get_block_p(matrix_s(1)%matrix,&
     285              : !               irow,icol,s_block,found)
     286              : !          CPPostcondition(ASSOCIATED(s_block),cp_failure_level,routineP,failure)
     287              : !
     288              : !          if( irow == iatom )then
     289              : !            R= -rij
     290              : !            call makeS(R,nra,nrb,ZSa,ZSb,ZPa,ZPb,S)
     291              : !          else
     292              : !            R= rij
     293              : !            call makeS(R,nrb,nra,ZSb,ZSa,ZPb,ZPa,S)
     294              : !          endif
     295              : !
     296              : !          do i=1,4
     297              : !            do j=1,4
     298              : !              s_block(i,j)=S(ix(i),ix(j))
     299              : !            enddo
     300              : !          enddo
     301              : 
     302              :             CALL dbcsr_get_block_p(matrix_s(1)%matrix, &
     303       393624 :                                    irow, icol, s_block, found)
     304       393624 :             CPASSERT(ASSOCIATED(s_block))
     305       393624 :             IF (irow == iatom) THEN
     306       802618 :                DO i = 1, SIZE(h_block, 1)
     307      2976740 :                   DO j = 1, SIZE(h_block, 2)
     308      2786366 :                      h_block(i, j) = h_block(i, j) + kh*(ha(i) + hb(j))*s_block(i, j)
     309              :                   END DO
     310              :                END DO
     311              :             ELSE
     312       853098 :                DO i = 1, SIZE(h_block, 1)
     313      3188301 :                   DO j = 1, SIZE(h_block, 2)
     314      2985051 :                      h_block(i, j) = h_block(i, j) + kh*(ha(j) + hb(i))*s_block(i, j)
     315              :                   END DO
     316              :                END DO
     317              :             END IF
     318       393624 :             IF (calculate_forces) THEN
     319       172272 :                atom_a = atom_of_kind(iatom)
     320       172272 :                atom_b = atom_of_kind(jatom)
     321              : 
     322              : !            if( irow == iatom )then
     323              : !              R= -rij
     324              : !              call makedS(R,nra,nrb,ZSa,ZSb,ZPa,ZPb,dS)
     325              : !            else
     326              : !              R= rij
     327              : !              call makedS(R,nrb,nra,ZSb,ZSa,ZPb,ZPa,dS)
     328              : !            endif
     329              : 
     330       172272 :                CALL dbcsr_get_block_p(matrix_p(1)%matrix, irow, icol, pabmat, found)
     331       172272 :                CPASSERT(ASSOCIATED(pabmat))
     332       689088 :                DO icor = 1, 3
     333       516816 :                   force_ab(icor) = 0._dp
     334              : 
     335              : !              CALL dbcsr_get_block_p(matrix_s(icor+1)%matrix,irow,icol,dsmat,found)
     336              : !              CPPostcondition(ASSOCIATED(dsmat),cp_failure_level,routineP,failure)
     337              : !
     338              : !              do i=1,4
     339              : !                do j=1,4
     340              : !                  dsmat(i,j)=dS(ix(i),ix(j),icor)
     341              : !                enddo
     342              : !              enddo
     343              : 
     344       516816 :                   CALL dbcsr_get_block_p(matrix_s(icor + 1)%matrix, irow, icol, dsmat, found)
     345       516816 :                   CPASSERT(ASSOCIATED(dsmat))
     346     11942100 :                   dsmat = 2._dp*kh*dsmat*pabmat
     347      1205904 :                   IF (irow == iatom) THEN
     348       974223 :                      DO i = 1, SIZE(h_block, 1)
     349      2948979 :                         DO j = 1, SIZE(h_block, 2)
     350      2698497 :                            force_ab(icor) = force_ab(icor) + (ha(i) + hb(j))*dsmat(i, j)
     351              :                         END DO
     352              :                      END DO
     353              :                   ELSE
     354      1030002 :                      DO i = 1, SIZE(h_block, 1)
     355      3137163 :                         DO j = 1, SIZE(h_block, 2)
     356      2870829 :                            force_ab(icor) = force_ab(icor) + (ha(j) + hb(i))*dsmat(i, j)
     357              :                         END DO
     358              :                      END DO
     359              :                   END IF
     360              :                END DO
     361              :             END IF
     362              : 
     363              :          END IF
     364              : 
     365       428930 :          IF (calculate_forces .AND. (iatom /= jatom .OR. dr > rij_threshold)) THEN
     366       506248 :             IF (irow == iatom) force_ab = -force_ab
     367              :             force(ikind)%all_potential(:, atom_a) = &
     368       689088 :                force(ikind)%all_potential(:, atom_a) - force_ab(:)
     369              :             force(jkind)%all_potential(:, atom_b) = &
     370       689088 :                force(jkind)%all_potential(:, atom_b) + force_ab(:)
     371       172272 :             IF (use_virial) THEN
     372            0 :                CALL virial_pair_force(virial%pv_virial, -1.0_dp, force_ab, rij)
     373              :             END IF
     374              :          END IF
     375              : 
     376              :       END DO
     377         7338 :       CALL neighbor_list_iterator_release(nl_iterator)
     378              : 
     379         7338 :       DEALLOCATE (se_defined, hmt, umt, ZSt, ZPt, nrt)
     380              : 
     381         7338 :       CALL dbcsr_sum_replicated(diagmat_h)
     382         7338 :       CALL dbcsr_distribute(diagmat_h)
     383         7338 :       CALL dbcsr_add(matrix_h(1)%matrix, diagmat_h, 1.0_dp, 1.0_dp)
     384         7338 :       CALL set_ks_env(ks_env, matrix_h=matrix_h)
     385              : 
     386         7338 :       IF (BTEST(cp_print_key_should_output(logger%iter_info, &
     387              :                                            qs_env%input, "DFT%PRINT%AO_MATRICES/CORE_HAMILTONIAN"), cp_p_file)) THEN
     388              :          iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/CORE_HAMILTONIAN", &
     389         1264 :                                    extension=".Log")
     390         1264 :          CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
     391         1264 :          CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
     392         1264 :          after = MIN(MAX(after, 1), 16)
     393              :          CALL cp_dbcsr_write_sparse_matrix(matrix_h(1)%matrix, 4, after, qs_env, para_env, &
     394         1264 :                                            scale=evolt, output_unit=iw, omit_headers=omit_headers)
     395              :          CALL cp_print_key_finished_output(iw, logger, qs_env%input, &
     396         1264 :                                            "DFT%PRINT%AO_MATRICES/CORE_HAMILTONIAN")
     397              :       END IF
     398              : 
     399         7338 :       IF (calculate_forces) THEN
     400         3002 :          IF (SIZE(matrix_p) == 2) THEN
     401          140 :             CALL dbcsr_add(matrix_p(1)%matrix, matrix_p(2)%matrix, alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
     402              :          END IF
     403         3002 :          DEALLOCATE (atom_of_kind)
     404         3002 :          CALL dbcsr_deallocate_matrix(diagmat_p)
     405              :       END IF
     406              : 
     407         7338 :       CALL dbcsr_deallocate_matrix(diagmat_h)
     408              : 
     409         7338 :       CALL timestop(handle)
     410              : 
     411        14676 :    END SUBROUTINE build_se_core_matrix
     412              : 
     413              : ! **************************************************************************************************
     414              : !> \brief ...
     415              : !> \param R ...
     416              : !> \param nra ...
     417              : !> \param nrb ...
     418              : !> \param ZSA ...
     419              : !> \param ZSB ...
     420              : !> \param ZPA ...
     421              : !> \param ZPB ...
     422              : !> \param S ...
     423              : ! **************************************************************************************************
     424            0 :    SUBROUTINE makeS(R, nra, nrb, ZSA, ZSB, ZPA, ZPB, S)
     425              : 
     426              :       REAL(kind=dp), DIMENSION(3)                        :: R
     427              :       INTEGER                                            :: nra, nrb
     428              :       REAL(kind=dp)                                      :: ZSA, ZSB, ZPA, ZPB
     429              :       REAL(kind=dp), DIMENSION(4, 4)                     :: S
     430              : 
     431              :       INTEGER, DIMENSION(4, 4), PARAMETER :: &
     432              :          nc1 = RESHAPE((/2, 4, 4, 6, 4, 3, 6, 7, 4, 6, 4, 8, 6, 7, 8, 5/), (/4, 4/)), &
     433              :          nc2 = RESHAPE((/4, 4, 8, 8, 6, 8, 6, 12, 8, 8, 12, 8, 10, 12, 14, 16/), (/4, 4/)), &
     434              :          nc3 = RESHAPE((/4, 6, 8, 10, 4, 8, 8, 12, 8, 6, 12, 14, 8, 12, 8, 16/), (/4, 4/)), &
     435              :          nc4 = RESHAPE((/4, 8, 11, 14, 8, 6, 12, 14, 11, 12, 10, 20, 14, 14, 20, 12/), (/4, 4/)), &
     436              :          nc5 = RESHAPE((/2, 4, 6, 8, 4, 4, 8, 8, 6, 8, 6, 12, 8, 8, 12, 8/), (/4, 4/))
     437              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c1 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 &
     438              :          , 1, 1, 1, 1, -1, 1, 2, 3, -1, -2, 1, 2, -2, -1, -3, 1, -3, -2, -1, -4, 0, -1, -2, 2, -1, &
     439              :          1, -2, -1, 2, -2, 3, -3, 2, -1, -3, 6, 0, -1, -1, -2, 1, 0, -2, -4, -1, 2, -1, -3, 2, 4, 3&
     440              :          , -4, 0, 0, 0, -3, 0, 0, 1, -1, 0, 1, 0, 3, -3, -1, 3, 1, 0, 0, 0, -1, 0, 0, 1, 2, 0, -1, &
     441              :          0, 3, 1, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0 &
     442              :          , 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     443              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     444              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     445              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     446              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     447              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     448              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     449              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c2 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 &
     450              :          , 1, 1, 1, 1, -1, 1, 1, 2, -2, -1, 1, 1, -3, -2, -1, 1, -4, -3, -2, -1, 1, -1, 1, 1, 1, 1 &
     451              :          , -2, 1, 1, 1, 1, -3, 1, 1, 1, 1, -1, -1, -1, 2, 1, -1, -2, -2, 3, -2, -2, -3, 6, 2, -1, &
     452              :          -3, 0, 0, 1, -2, -2, -1, 1, 1, -3, 2, -1, 3, -4, -3, -2, -1, 0, 0, -1, -1, 1, 1, 1, -2, -1&
     453              :          , -1, 2, 3, -4, 2, 4, 3, 0, 0, -1, -2, 0, -1, 0, -2, 3, 2, -2, -1, 6, 2, -1, -3, 0, 0, -1,&
     454              :          -1, 0, 1, 0, 1, -1, -1, 1, -1, 1, -3, -1, 3, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 2, 0, -4, 2, 4&
     455              :          , 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 1, 1, -2, -3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0&
     456              :          , 0, -3, -1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, &
     457              :          0, 0, 0, 0, 0, 0, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0&
     458              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, &
     459              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     460              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     461              :          0/), (/4, 4, 20/))
     462              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c3 = RESHAPE((/-1, -1, -1, -1, -1, -1, -1, -1, -1 &
     463              :          , -1, -1, -1, -1, -1, -1, -1, -1, -2, -3, -4, 1, -1, -2, -3, 1, 1, -1, -2, 2, 1, 1, -1, 1 &
     464              :          , 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, -1, -3, -6, -1, 1, 2, -2, 1, -2, 2, 1, &
     465              :          -2, 2, -3, 3, 0, 2, 3, 4, 0, 1, 2, 3, -1, -1, 1, 2, -2, -1, -3, 1, 0, 1, -1, -4, 0, 1, 1, &
     466              :          2, -1, 1, 2, 4, 1, -2, 3, 3, 0, 0, 3, 6, 0, -1, -2, 2, -1, 0, -2, -1, 2, -2, 1, -3, 0, 0, &
     467              :          1, -1, 0, -1, -1, 3, 1, 0, -1, 1, -1, -1, -1, -3, 0, 0, 0, 4, 0, 0, 0, -2, 0, 0, -2, -4, 0&
     468              :          , 2, 0, -3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1, -2, 0, 1, 0, -3, 0, 0, 0, 0, 0, 0, 0, -3, 0 &
     469              :          , 0, 1, -1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, &
     470              :          0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, &
     471              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0&
     472              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     473              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     474              :          , 0, 0, 0/), (/4, 4, 20/))
     475              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c4 = RESHAPE((/-1, -1, -1, -1, -1, -1, -1, -1, -1 &
     476              :          , -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -2, &
     477              :          -3, 1, 1, -1, -2, 2, 1, 2, -1, 3, 2, 1, 3, -1, 1, 2, 3, -1, -1, 1, 2, -2, -1, -1, 1, -3, &
     478              :          -2, -1, -2, 0, 1, -1, -3, 1, -1, 1, 1, -1, 1, -1, 2, -3, 1, 2, -1, 0, -1, 2, 4, -1, 1, -1 &
     479              :          , -1, 2, -1, -1, -1, 4, -1, -1, -3, 0, 1, -1, -1, -1, 0, 1, 2, -1, -1, -1, -1, -1, -2, -1 &
     480              :          , 3, 0, -1, 2, -1, 1, 0, -1, -2, -2, 1, 2, 2, 1, 2, -2, 1, 0, 0, -2, 4, 0, 0, -1, 1, 2, -1&
     481              :          , 1, -1, -4, 1, 1, 2, 0, 0, 1, -3, 0, 0, 1, -1, 1, 1, -1, -1, 3, -1, 1, -3, 0, 0, -1, 3, 0&
     482              :          , 0, -1, -2, -1, 1, 0, -1, 3, 2, -1, -1, 0, 0, 0, -3, 0, 0, 1, 2, 0, -1, 0, -1, -3, -2, -1&
     483              :          , 1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 2, -1, -1, 2, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, &
     484              :          -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     485              :          , 0, 0, 2, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, &
     486              :          0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, &
     487              :          0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0/), (/4, 4, 20/))
     488              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c5 = RESHAPE((/-1, -1, -1, -1, -1, -1, -1, -1, -1 &
     489              :          , -1, -1, -1, -1, -1, -1, -1, 1, -1, -2, -3, 1, 1, -1, -2, 2, 1, 2, -1, 3, 2, 1, 3, 0, 1, &
     490              :          -1, -3, 1, 1, 1, 1, -1, 1, 1, 2, -3, 1, 2, 1, 0, 1, 1, 1, -1, -1, 1, 2, 1, 1, -1, 1, 1, -2&
     491              :          , 1, -3, 0, 0, 2, -1, 0, 0, 1, 2, -2, -1, -2, 2, 1, -2, -2, -3, 0, 0, 1, 3, 0, 0, 1, 1, 1,&
     492              :          -1, 1, 1, -3, 1, -1, 1, 0, 0, 0, 3, 0, 0, -1, -2, 0, -1, 0, -1, 3, 2, -1, 3, 0, 0, 0, 1, 0&
     493              :          , 0, -1, -1, 0, 1, 0, -2, -1, -1, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0,&
     494              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,&
     495              :          1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 &
     496              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     497              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     498              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     499              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, &
     500              :          20/))
     501              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma1 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     502              :          , 5, 6, 7, 8, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 4, 5, 6, 6, 0, 1, 1, 3, 1, 0, 3, 4, 1, 3&
     503              :          , 2, 5, 3, 4, 5, 4, 0, 0, 0, 2, 0, 0, 2, 3, 0, 2, 0, 4, 2, 3, 4, 2, 0, 0, 0, 1, 0, 0, 1, 2&
     504              :          , 0, 1, 0, 3, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0&
     505              :          , 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     506              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     507              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     508              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     509              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     510              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     511              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     512              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     513              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma2 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     514              :          , 5, 6, 7, 8, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 1, 1, 3, 4, 2, 3, 3, 5, 3, 4&
     515              :          , 5, 5, 4, 5, 6, 7, 0, 0, 2, 3, 1, 2, 2, 4, 2, 3, 4, 4, 3, 4, 5, 6, 0, 0, 2, 2, 1, 2, 1, 4&
     516              :          , 2, 2, 4, 3, 3, 4, 5, 6, 0, 0, 1, 1, 0, 1, 0, 3, 1, 1, 3, 2, 2, 3, 4, 5, 0, 0, 1, 1, 0, 1&
     517              :          , 0, 3, 1, 1, 3, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 1, 2, 3, 4, 0, 0, 0, 0&
     518              :          , 0, 0, 0, 2, 0, 0, 2, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0&
     519              :          , 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2&
     520              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     521              :          , 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     522              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     523              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     524              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     525              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma3 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     526              :          , 5, 6, 7, 8, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 1, 2, 3, 4, 1, 3, 4, 5, 3, 3&
     527              :          , 5, 6, 4, 5, 5, 7, 0, 1, 2, 3, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 0, 1, 2, 3, 0, 2, 2, 4&
     528              :          , 2, 1, 4, 5, 2, 4, 3, 6, 0, 0, 1, 2, 0, 1, 1, 3, 1, 0, 3, 4, 1, 3, 2, 5, 0, 0, 1, 2, 0, 1&
     529              :          , 1, 3, 1, 0, 3, 4, 1, 3, 1, 5, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 2, 3, 0, 2, 0, 4, 0, 0, 0, 1&
     530              :          , 0, 0, 0, 2, 0, 0, 2, 3, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 0, 1, 0, 3, 0, 0&
     531              :          , 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2&
     532              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     533              :          , 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     534              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     535              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     536              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     537              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma4 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     538              :          , 5, 6, 7, 8, 2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4&
     539              :          , 4, 6, 4, 5, 6, 6, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 4, 5, 6, 6, 0, 1, 2, 3, 1, 0, 3, 4&
     540              :          , 2, 3, 4, 5, 3, 4, 5, 6, 0, 1, 2, 3, 1, 0, 3, 4, 2, 3, 2, 5, 3, 4, 5, 4, 0, 0, 2, 3, 0, 0&
     541              :          , 2, 3, 2, 2, 2, 5, 3, 3, 5, 4, 0, 0, 1, 2, 0, 0, 2, 3, 1, 2, 2, 4, 2, 3, 4, 2, 0, 0, 1, 2&
     542              :          , 0, 0, 1, 2, 1, 1, 0, 4, 2, 2, 4, 2, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 4, 2, 2, 4, 2, 0, 0&
     543              :          , 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 1, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 1, 1, 3, 0&
     544              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0&
     545              :          , 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2&
     546              :          , 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     547              :          , 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     548              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     549              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma5 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     550              :          , 5, 6, 7, 8, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 4, 5, 6, 6, 0, 1, 2, 3, 1, 2, 3, 4, 2, 3&
     551              :          , 4, 5, 3, 4, 5, 6, 0, 0, 2, 3, 0, 0, 3, 3, 2, 3, 2, 5, 3, 3, 5, 4, 0, 0, 1, 2, 0, 0, 2, 3&
     552              :          , 1, 2, 2, 4, 2, 3, 4, 4, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 4, 2, 2, 4, 2, 0, 0, 0, 1, 0, 0&
     553              :          , 1, 1, 0, 1, 0, 3, 1, 1, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0&
     554              :          , 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0&
     555              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     556              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     557              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     558              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     559              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     560              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     561              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb1 = RESHAPE((/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     562              :          , 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 3, 2, 2, 4, 2, 2, 3, 2&
     563              :          , 4, 2, 2, 2, 2, 4, 0, 3, 4, 3, 3, 0, 3, 3, 4, 3, 6, 3, 3, 3, 3, 6, 0, 0, 0, 4, 0, 0, 4, 4&
     564              :          , 0, 4, 0, 4, 4, 4, 4, 8, 0, 0, 0, 5, 0, 0, 5, 5, 0, 5, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0&
     565              :          , 0, 6, 0, 0, 0, 6, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0&
     566              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     567              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     568              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     569              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     570              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     571              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     572              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     573              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb2 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1&
     574              :          , 1, 1, 1, 1, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0&
     575              :          , 0, 3, 0, 0, 0, 0, 1, 2, 3, 1, 3, 3, 2, 3, 3, 1, 3, 2, 3, 3, 3, 3, 0, 0, 1, 4, 1, 1, 5, 1&
     576              :          , 1, 4, 1, 5, 1, 1, 1, 1, 0, 0, 4, 5, 2, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 0, 0, 2, 3, 0, 2&
     577              :          , 0, 2, 2, 3, 2, 7, 2, 2, 2, 2, 0, 0, 3, 4, 0, 3, 0, 5, 3, 4, 5, 6, 5, 5, 5, 5, 0, 0, 0, 0&
     578              :          , 0, 0, 0, 3, 0, 0, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 4, 6, 6, 6, 0, 0&
     579              :          , 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 5, 7, 7&
     580              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     581              :          , 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     582              :          , 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     583              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     584              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     585              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb3 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1&
     586              :          , 1, 1, 1, 1, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3&
     587              :          , 0, 0, 0, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 3, 3, 2, 3, 3, 1, 3, 2, 3, 0, 1, 1, 1, 0, 1, 4, 1&
     588              :          , 1, 5, 1, 1, 4, 1, 5, 1, 0, 2, 4, 4, 0, 4, 5, 4, 4, 4, 4, 4, 5, 4, 4, 4, 0, 0, 2, 2, 0, 2&
     589              :          , 3, 2, 2, 0, 2, 2, 3, 2, 7, 2, 0, 0, 3, 5, 0, 3, 4, 5, 3, 0, 5, 5, 4, 5, 6, 5, 0, 0, 0, 3&
     590              :          , 0, 0, 0, 3, 0, 0, 3, 3, 0, 3, 0, 3, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 6, 6, 0, 6, 0, 6, 0, 0&
     591              :          , 0, 0, 0, 0, 0, 4, 0, 0, 4, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 7, 0, 5, 0, 7&
     592              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0&
     593              :          , 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     594              :          , 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     595              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     596              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     597              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb4 = RESHAPE((/2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2&
     598              :          , 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 3, 4, 3, 3, 3, 3&
     599              :          , 4, 3, 3, 3, 3, 4, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 4, 4, 2, 4, 4, 2&
     600              :          , 4, 4, 0, 4, 4, 2, 4, 0, 0, 0, 2, 2, 0, 2, 0, 0, 2, 0, 6, 2, 2, 0, 2, 6, 0, 3, 0, 0, 3, 0&
     601              :          , 5, 5, 0, 5, 4, 0, 0, 5, 0, 2, 0, 1, 3, 5, 1, 0, 1, 1, 3, 1, 2, 5, 5, 1, 5, 8, 0, 0, 1, 3&
     602              :          , 0, 0, 4, 6, 1, 4, 6, 3, 3, 6, 3, 6, 0, 0, 4, 1, 0, 0, 2, 4, 4, 2, 4, 1, 1, 4, 1, 4, 0, 0&
     603              :          , 2, 4, 0, 0, 5, 5, 2, 5, 0, 6, 4, 5, 6, 8, 0, 0, 0, 2, 0, 0, 3, 3, 0, 3, 0, 4, 2, 3, 4, 6&
     604              :          , 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 5, 6, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 7, 3, 4&
     605              :          , 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3&
     606              :          , 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     607              :          , 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     608              :          , 0, 0, 0, 5, 0, 0, 5, 0/), (/4, 4, 20/))
     609              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb5 = RESHAPE((/2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2&
     610              :          , 2, 2, 2, 2, 0, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4&
     611              :          , 0, 4, 4, 0, 4, 0, 0, 1, 0, 0, 1, 2, 0, 5, 0, 0, 6, 0, 0, 5, 0, 6, 0, 0, 1, 5, 0, 0, 5, 1&
     612              :          , 1, 5, 2, 5, 5, 1, 5, 2, 0, 0, 2, 1, 0, 0, 1, 6, 2, 1, 4, 1, 1, 6, 1, 8, 0, 0, 0, 2, 0, 0&
     613              :          , 2, 3, 0, 2, 0, 6, 2, 3, 6, 4, 0, 0, 0, 3, 0, 0, 3, 4, 0, 3, 0, 2, 3, 4, 2, 6, 0, 0, 0, 0&
     614              :          , 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0&
     615              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0&
     616              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     617              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     618              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     619              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     620              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     621              : 
     622              :       INTEGER                                            :: k, k1, k2, mu
     623              :       REAL(kind=dp)                                      :: cp, ct, fac1, fac2, J, Jc, Jcc, Jss, rr, &
     624              :                                                             sp, st, xx, yy, za, zb
     625              :       REAL(kind=dp), DIMENSION(3)                        :: v
     626              :       REAL(kind=dp), DIMENSION(3, 3)                     :: Arot
     627              : 
     628            0 :       S(:, :) = 0.0_dp
     629              : 
     630            0 :       v(:) = R(:)
     631            0 :       rr = SQRT(DOT_PRODUCT(v, v))
     632              : 
     633            0 :       IF (rr < 1.0e-20_dp) THEN
     634              : 
     635            0 :          DO mu = 1, 4
     636            0 :             S(mu, mu) = 1.0_dp
     637              :          END DO
     638              : 
     639              :       ELSE
     640              : 
     641            0 :          fac1 = 1.0_dp
     642            0 :          IF (nra == 1) THEN
     643              :             fac1 = fac1*2.0_dp
     644              :          ELSE
     645              :             IF (nra == 2) THEN
     646              :                fac1 = fac1*SQRT(4.0_dp/3.0_dp)
     647              :             ELSE
     648              :                IF (nra == 3) THEN
     649              :                   fac1 = fac1*SQRT(8.0_dp/45.0_dp)
     650              :                ELSE
     651              :                   IF (nra == 4) THEN
     652              :                      fac1 = fac1*SQRT(4.0_dp/315.0_dp)
     653              :                   ELSE
     654            0 :                      WRITE (*, *) 'nra= ', nra
     655            0 :                      RETURN
     656              :                   END IF
     657              :                END IF
     658              :             END IF
     659              :          END IF
     660            0 :          IF (nrb == 1) THEN
     661            0 :             fac1 = fac1*2.0_dp
     662              :          ELSE
     663            0 :             IF (nrb == 2) THEN
     664            0 :                fac1 = fac1*SQRT(4.0_dp/3.0_dp)
     665              :             ELSE
     666            0 :                IF (nrb == 3) THEN
     667            0 :                   fac1 = fac1*SQRT(8.0_dp/45.0_dp)
     668              :                ELSE
     669            0 :                   IF (nrb == 4) THEN
     670            0 :                      fac1 = fac1*SQRT(4.0_dp/315.0_dp)
     671              :                   ELSE
     672            0 :                      WRITE (*, *) 'nrb= ', nrb
     673            0 :                      RETURN
     674              :                   END IF
     675              :                END IF
     676              :             END IF
     677              :          END IF
     678              : 
     679            0 :          ct = -v(3)/rr
     680            0 :          IF (ABS(ct) < 1.0_dp) THEN
     681            0 :             st = SQRT(1.0_dp - ct**2)
     682            0 :             cp = -v(1)/(rr*st)
     683            0 :             sp = -v(2)/(rr*st)
     684            0 :             Arot(1, 1) = ct*cp
     685            0 :             Arot(1, 2) = -sp
     686            0 :             Arot(1, 3) = st*cp
     687            0 :             Arot(2, 1) = ct*sp
     688            0 :             Arot(2, 2) = cp
     689            0 :             Arot(2, 3) = st*sp
     690            0 :             Arot(3, 1) = -st
     691            0 :             Arot(3, 2) = 0.0_dp
     692            0 :             Arot(3, 3) = ct
     693              :          ELSE
     694            0 :             Arot(1, 1) = ct
     695            0 :             Arot(1, 2) = 0.0_dp
     696            0 :             Arot(1, 3) = 0.0_dp
     697            0 :             Arot(2, 1) = 0.0_dp
     698            0 :             Arot(2, 2) = 1.0_dp
     699            0 :             Arot(2, 3) = 0.0_dp
     700            0 :             Arot(3, 1) = 0.0_dp
     701            0 :             Arot(3, 2) = 0.0_dp
     702            0 :             Arot(3, 3) = ct
     703              :          END IF
     704              : 
     705            0 :          za = ZSA
     706            0 :          zb = ZSB
     707            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
     708            0 :          xx = 0.5_dp*rr*(za + zb)
     709            0 :          yy = 0.5_dp*rr*(za - zb)
     710              : 
     711            0 :          J = 0.0_dp
     712            0 :          DO k = 1, nc1(nra, nrb)
     713            0 :             J = J + REAL(c1(nra, nrb, k), dp)*AA(ma1(nra, nrb, k), xx)*BB(mb1(nra, nrb, k), yy)
     714              :          END DO
     715            0 :          J = J*rr**(nra + nrb + 1)
     716            0 :          J = J/2.0_dp**(nra + nrb + 2)
     717              : 
     718            0 :          S(1, 1) = S(1, 1) + fac1*fac2*J
     719              : 
     720            0 :          za = ZPA
     721            0 :          zb = ZSB
     722            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
     723            0 :          xx = 0.5_dp*rr*(za + zb)
     724            0 :          yy = 0.5_dp*rr*(za - zb)
     725              : 
     726            0 :          Jc = 0.0_dp
     727            0 :          DO k = 1, nc2(nra, nrb)
     728            0 :             Jc = Jc + REAL(c2(nra, nrb, k), dp)*AA(ma2(nra, nrb, k), xx)*BB(mb2(nra, nrb, k), yy)
     729              :          END DO
     730            0 :          Jc = Jc*rr**(nra + nrb + 1)
     731            0 :          Jc = Jc/2.0_dp**(nra + nrb + 2)
     732              : 
     733            0 :          DO k1 = 1, 3
     734              :             S(k1 + 1, 1) = S(k1 + 1, 1) &
     735            0 :          &          + SQRT(3.0_dp)*Arot(k1, 3)*fac1*fac2*Jc
     736              :          END DO
     737              : 
     738            0 :          za = ZSA
     739            0 :          zb = ZPB
     740            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
     741            0 :          xx = 0.5_dp*rr*(za + zb)
     742            0 :          yy = 0.5_dp*rr*(za - zb)
     743              : 
     744            0 :          Jc = 0.0_dp
     745            0 :          DO k = 1, nc3(nra, nrb)
     746            0 :             Jc = Jc + REAL(c3(nra, nrb, k), dp)*AA(ma3(nra, nrb, k), xx)*BB(mb3(nra, nrb, k), yy)
     747              :          END DO
     748            0 :          Jc = Jc*rr**(nra + nrb + 1)
     749            0 :          Jc = Jc/2.0_dp**(nra + nrb + 2)
     750              : 
     751            0 :          DO k1 = 1, 3
     752              :             S(1, k1 + 1) = S(1, k1 + 1) &
     753            0 :          &          - SQRT(3.0_dp)*Arot(k1, 3)*fac1*fac2*Jc
     754              :          END DO
     755              : 
     756            0 :          za = ZPA
     757            0 :          zb = ZPB
     758            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
     759            0 :          xx = 0.5_dp*rr*(za + zb)
     760            0 :          yy = 0.5_dp*rr*(za - zb)
     761              : 
     762            0 :          Jss = 0.0_dp
     763            0 :          DO k = 1, nc4(nra, nrb)
     764            0 :             Jss = Jss + REAL(c4(nra, nrb, k), dp)*AA(ma4(nra, nrb, k), xx)*BB(mb4(nra, nrb, k), yy)
     765              :          END DO
     766            0 :          Jss = Jss*rr**(nra + nrb + 1)
     767            0 :          Jss = Jss/2.0_dp**(nra + nrb + 2)
     768              : 
     769            0 :          Jcc = 0.0_dp
     770            0 :          DO k = 1, nc5(nra, nrb)
     771            0 :             Jcc = Jcc + REAL(c5(nra, nrb, k), dp)*AA(ma5(nra, nrb, k), xx)*BB(mb5(nra, nrb, k), yy)
     772              :          END DO
     773            0 :          Jcc = Jcc*rr**(nra + nrb + 1)
     774            0 :          Jcc = Jcc/2.0_dp**(nra + nrb + 2)
     775              : 
     776            0 :          DO k1 = 1, 3
     777            0 :             DO k2 = 1, 3
     778              :                S(k1 + 1, k2 + 1) = S(k1 + 1, k2 + 1) &
     779              :           &            + 1.5_dp*Arot(k1, 1)*Arot(k2, 1)*fac1*fac2*Jss &
     780              :           &            + 1.5_dp*Arot(k1, 2)*Arot(k2, 2)*fac1*fac2*Jss &
     781            0 :           &            - 3.0_dp*Arot(k1, 3)*Arot(k2, 3)*fac1*fac2*Jcc
     782              :             END DO
     783              :          END DO
     784              : 
     785              :       END IF
     786              : 
     787              :    END SUBROUTINE makeS
     788              : 
     789              : ! **************************************************************************************************
     790              : !> \brief ...
     791              : !> \param R ...
     792              : !> \param nra ...
     793              : !> \param nrb ...
     794              : !> \param ZSA ...
     795              : !> \param ZSB ...
     796              : !> \param ZPA ...
     797              : !> \param ZPB ...
     798              : !> \param dS ...
     799              : ! **************************************************************************************************
     800            0 :    SUBROUTINE makedS(R, nra, nrb, ZSA, ZSB, ZPA, ZPB, dS)
     801              : 
     802              :       REAL(kind=dp), DIMENSION(3)                        :: R
     803              :       INTEGER                                            :: nra, nrb
     804              :       REAL(kind=dp)                                      :: ZSA, ZSB, ZPA, ZPB
     805              :       REAL(kind=dp), DIMENSION(4, 4, 3)                  :: dS
     806              : 
     807              :       INTEGER, DIMENSION(4, 4), PARAMETER :: &
     808              :          nc1 = RESHAPE((/2, 4, 4, 6, 4, 3, 6, 7, 4, 6, 4, 8, 6, 7, 8, 5/), (/4, 4/)), &
     809              :          nc2 = RESHAPE((/4, 4, 8, 8, 6, 8, 6, 12, 8, 8, 12, 8, 10, 12, 14, 16/), (/4, 4/)), &
     810              :          nc3 = RESHAPE((/4, 6, 8, 10, 4, 8, 8, 12, 8, 6, 12, 14, 8, 12, 8, 16/), (/4, 4/)), &
     811              :          nc4 = RESHAPE((/4, 8, 11, 14, 8, 6, 12, 14, 11, 12, 10, 20, 14, 14, 20, 12/), (/4, 4/)), &
     812              :          nc5 = RESHAPE((/2, 4, 6, 8, 4, 4, 8, 8, 6, 8, 6, 12, 8, 8, 12, 8/), (/4, 4/))
     813              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c1 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 &
     814              :          , 1, 1, 1, 1, -1, 1, 2, 3, -1, -2, 1, 2, -2, -1, -3, 1, -3, -2, -1, -4, 0, -1, -2, 2, -1, &
     815              :          1, -2, -1, 2, -2, 3, -3, 2, -1, -3, 6, 0, -1, -1, -2, 1, 0, -2, -4, -1, 2, -1, -3, 2, 4, 3&
     816              :          , -4, 0, 0, 0, -3, 0, 0, 1, -1, 0, 1, 0, 3, -3, -1, 3, 1, 0, 0, 0, -1, 0, 0, 1, 2, 0, -1, &
     817              :          0, 3, 1, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0 &
     818              :          , 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     819              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     820              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     821              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     822              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     823              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     824              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     825              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c2 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 &
     826              :          , 1, 1, 1, 1, -1, 1, 1, 2, -2, -1, 1, 1, -3, -2, -1, 1, -4, -3, -2, -1, 1, -1, 1, 1, 1, 1 &
     827              :          , -2, 1, 1, 1, 1, -3, 1, 1, 1, 1, -1, -1, -1, 2, 1, -1, -2, -2, 3, -2, -2, -3, 6, 2, -1, &
     828              :          -3, 0, 0, 1, -2, -2, -1, 1, 1, -3, 2, -1, 3, -4, -3, -2, -1, 0, 0, -1, -1, 1, 1, 1, -2, -1&
     829              :          , -1, 2, 3, -4, 2, 4, 3, 0, 0, -1, -2, 0, -1, 0, -2, 3, 2, -2, -1, 6, 2, -1, -3, 0, 0, -1,&
     830              :          -1, 0, 1, 0, 1, -1, -1, 1, -1, 1, -3, -1, 3, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 2, 0, -4, 2, 4&
     831              :          , 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 1, 1, -2, -3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0&
     832              :          , 0, -3, -1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, &
     833              :          0, 0, 0, 0, 0, 0, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0&
     834              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, &
     835              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     836              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
     837              :          0/), (/4, 4, 20/))
     838              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c3 = RESHAPE((/-1, -1, -1, -1, -1, -1, -1, -1, -1 &
     839              :          , -1, -1, -1, -1, -1, -1, -1, -1, -2, -3, -4, 1, -1, -2, -3, 1, 1, -1, -2, 2, 1, 1, -1, 1 &
     840              :          , 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, -1, -3, -6, -1, 1, 2, -2, 1, -2, 2, 1, &
     841              :          -2, 2, -3, 3, 0, 2, 3, 4, 0, 1, 2, 3, -1, -1, 1, 2, -2, -1, -3, 1, 0, 1, -1, -4, 0, 1, 1, &
     842              :          2, -1, 1, 2, 4, 1, -2, 3, 3, 0, 0, 3, 6, 0, -1, -2, 2, -1, 0, -2, -1, 2, -2, 1, -3, 0, 0, &
     843              :          1, -1, 0, -1, -1, 3, 1, 0, -1, 1, -1, -1, -1, -3, 0, 0, 0, 4, 0, 0, 0, -2, 0, 0, -2, -4, 0&
     844              :          , 2, 0, -3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1, -2, 0, 1, 0, -3, 0, 0, 0, 0, 0, 0, 0, -3, 0 &
     845              :          , 0, 1, -1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, &
     846              :          0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, &
     847              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0&
     848              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     849              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     850              :          , 0, 0, 0/), (/4, 4, 20/))
     851              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c4 = RESHAPE((/-1, -1, -1, -1, -1, -1, -1, -1, -1 &
     852              :          , -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -2, &
     853              :          -3, 1, 1, -1, -2, 2, 1, 2, -1, 3, 2, 1, 3, -1, 1, 2, 3, -1, -1, 1, 2, -2, -1, -1, 1, -3, &
     854              :          -2, -1, -2, 0, 1, -1, -3, 1, -1, 1, 1, -1, 1, -1, 2, -3, 1, 2, -1, 0, -1, 2, 4, -1, 1, -1 &
     855              :          , -1, 2, -1, -1, -1, 4, -1, -1, -3, 0, 1, -1, -1, -1, 0, 1, 2, -1, -1, -1, -1, -1, -2, -1 &
     856              :          , 3, 0, -1, 2, -1, 1, 0, -1, -2, -2, 1, 2, 2, 1, 2, -2, 1, 0, 0, -2, 4, 0, 0, -1, 1, 2, -1&
     857              :          , 1, -1, -4, 1, 1, 2, 0, 0, 1, -3, 0, 0, 1, -1, 1, 1, -1, -1, 3, -1, 1, -3, 0, 0, -1, 3, 0&
     858              :          , 0, -1, -2, -1, 1, 0, -1, 3, 2, -1, -1, 0, 0, 0, -3, 0, 0, 1, 2, 0, -1, 0, -1, -3, -2, -1&
     859              :          , 1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 2, -1, -1, 2, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, &
     860              :          -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     861              :          , 0, 0, 2, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, &
     862              :          0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, &
     863              :          0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0/), (/4, 4, 20/))
     864              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: c5 = RESHAPE((/-1, -1, -1, -1, -1, -1, -1, -1, -1 &
     865              :          , -1, -1, -1, -1, -1, -1, -1, 1, -1, -2, -3, 1, 1, -1, -2, 2, 1, 2, -1, 3, 2, 1, 3, 0, 1, &
     866              :          -1, -3, 1, 1, 1, 1, -1, 1, 1, 2, -3, 1, 2, 1, 0, 1, 1, 1, -1, -1, 1, 2, 1, 1, -1, 1, 1, -2&
     867              :          , 1, -3, 0, 0, 2, -1, 0, 0, 1, 2, -2, -1, -2, 2, 1, -2, -2, -3, 0, 0, 1, 3, 0, 0, 1, 1, 1,&
     868              :          -1, 1, 1, -3, 1, -1, 1, 0, 0, 0, 3, 0, 0, -1, -2, 0, -1, 0, -1, 3, 2, -1, 3, 0, 0, 0, 1, 0&
     869              :          , 0, -1, -1, 0, 1, 0, -2, -1, -1, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0,&
     870              :          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,&
     871              :          1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 &
     872              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     873              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     874              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     875              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, &
     876              :          20/))
     877              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma1 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     878              :          , 5, 6, 7, 8, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 4, 5, 6, 6, 0, 1, 1, 3, 1, 0, 3, 4, 1, 3&
     879              :          , 2, 5, 3, 4, 5, 4, 0, 0, 0, 2, 0, 0, 2, 3, 0, 2, 0, 4, 2, 3, 4, 2, 0, 0, 0, 1, 0, 0, 1, 2&
     880              :          , 0, 1, 0, 3, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0&
     881              :          , 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     882              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     883              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     884              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     885              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     886              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     887              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     888              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     889              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma2 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     890              :          , 5, 6, 7, 8, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 1, 1, 3, 4, 2, 3, 3, 5, 3, 4&
     891              :          , 5, 5, 4, 5, 6, 7, 0, 0, 2, 3, 1, 2, 2, 4, 2, 3, 4, 4, 3, 4, 5, 6, 0, 0, 2, 2, 1, 2, 1, 4&
     892              :          , 2, 2, 4, 3, 3, 4, 5, 6, 0, 0, 1, 1, 0, 1, 0, 3, 1, 1, 3, 2, 2, 3, 4, 5, 0, 0, 1, 1, 0, 1&
     893              :          , 0, 3, 1, 1, 3, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 1, 2, 3, 4, 0, 0, 0, 0&
     894              :          , 0, 0, 0, 2, 0, 0, 2, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0&
     895              :          , 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2&
     896              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     897              :          , 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     898              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     899              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     900              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     901              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma3 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     902              :          , 5, 6, 7, 8, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 1, 2, 3, 4, 1, 3, 4, 5, 3, 3&
     903              :          , 5, 6, 4, 5, 5, 7, 0, 1, 2, 3, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 0, 1, 2, 3, 0, 2, 2, 4&
     904              :          , 2, 1, 4, 5, 2, 4, 3, 6, 0, 0, 1, 2, 0, 1, 1, 3, 1, 0, 3, 4, 1, 3, 2, 5, 0, 0, 1, 2, 0, 1&
     905              :          , 1, 3, 1, 0, 3, 4, 1, 3, 1, 5, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 2, 3, 0, 2, 0, 4, 0, 0, 0, 1&
     906              :          , 0, 0, 0, 2, 0, 0, 2, 3, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 0, 1, 0, 3, 0, 0&
     907              :          , 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2&
     908              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     909              :          , 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     910              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     911              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     912              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     913              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma4 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     914              :          , 5, 6, 7, 8, 2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4&
     915              :          , 4, 6, 4, 5, 6, 6, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 4, 5, 6, 6, 0, 1, 2, 3, 1, 0, 3, 4&
     916              :          , 2, 3, 4, 5, 3, 4, 5, 6, 0, 1, 2, 3, 1, 0, 3, 4, 2, 3, 2, 5, 3, 4, 5, 4, 0, 0, 2, 3, 0, 0&
     917              :          , 2, 3, 2, 2, 2, 5, 3, 3, 5, 4, 0, 0, 1, 2, 0, 0, 2, 3, 1, 2, 2, 4, 2, 3, 4, 2, 0, 0, 1, 2&
     918              :          , 0, 0, 1, 2, 1, 1, 0, 4, 2, 2, 4, 2, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 4, 2, 2, 4, 2, 0, 0&
     919              :          , 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 1, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 1, 1, 3, 0&
     920              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0&
     921              :          , 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2&
     922              :          , 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     923              :          , 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     924              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     925              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: ma5 = RESHAPE((/2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7&
     926              :          , 5, 6, 7, 8, 0, 2, 3, 4, 2, 2, 4, 5, 3, 4, 4, 6, 4, 5, 6, 6, 0, 1, 2, 3, 1, 2, 3, 4, 2, 3&
     927              :          , 4, 5, 3, 4, 5, 6, 0, 0, 2, 3, 0, 0, 3, 3, 2, 3, 2, 5, 3, 3, 5, 4, 0, 0, 1, 2, 0, 0, 2, 3&
     928              :          , 1, 2, 2, 4, 2, 3, 4, 4, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 4, 2, 2, 4, 2, 0, 0, 0, 1, 0, 0&
     929              :          , 1, 1, 0, 1, 0, 3, 1, 1, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0&
     930              :          , 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0&
     931              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     932              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     933              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     934              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     935              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     936              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     937              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb1 = RESHAPE((/0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     938              :          , 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 3, 2, 2, 4, 2, 2, 3, 2&
     939              :          , 4, 2, 2, 2, 2, 4, 0, 3, 4, 3, 3, 0, 3, 3, 4, 3, 6, 3, 3, 3, 3, 6, 0, 0, 0, 4, 0, 0, 4, 4&
     940              :          , 0, 4, 0, 4, 4, 4, 4, 8, 0, 0, 0, 5, 0, 0, 5, 5, 0, 5, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0&
     941              :          , 0, 6, 0, 0, 0, 6, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0&
     942              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     943              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     944              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     945              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     946              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     947              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     948              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     949              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb2 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1&
     950              :          , 1, 1, 1, 1, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0&
     951              :          , 0, 3, 0, 0, 0, 0, 1, 2, 3, 1, 3, 3, 2, 3, 3, 1, 3, 2, 3, 3, 3, 3, 0, 0, 1, 4, 1, 1, 5, 1&
     952              :          , 1, 4, 1, 5, 1, 1, 1, 1, 0, 0, 4, 5, 2, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 0, 0, 2, 3, 0, 2&
     953              :          , 0, 2, 2, 3, 2, 7, 2, 2, 2, 2, 0, 0, 3, 4, 0, 3, 0, 5, 3, 4, 5, 6, 5, 5, 5, 5, 0, 0, 0, 0&
     954              :          , 0, 0, 0, 3, 0, 0, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 4, 6, 6, 6, 0, 0&
     955              :          , 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 5, 7, 7&
     956              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     957              :          , 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     958              :          , 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     959              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     960              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     961              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb3 = RESHAPE((/1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1&
     962              :          , 1, 1, 1, 1, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3&
     963              :          , 0, 0, 0, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 3, 3, 2, 3, 3, 1, 3, 2, 3, 0, 1, 1, 1, 0, 1, 4, 1&
     964              :          , 1, 5, 1, 1, 4, 1, 5, 1, 0, 2, 4, 4, 0, 4, 5, 4, 4, 4, 4, 4, 5, 4, 4, 4, 0, 0, 2, 2, 0, 2&
     965              :          , 3, 2, 2, 0, 2, 2, 3, 2, 7, 2, 0, 0, 3, 5, 0, 3, 4, 5, 3, 0, 5, 5, 4, 5, 6, 5, 0, 0, 0, 3&
     966              :          , 0, 0, 0, 3, 0, 0, 3, 3, 0, 3, 0, 3, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 6, 6, 0, 6, 0, 6, 0, 0&
     967              :          , 0, 0, 0, 0, 0, 4, 0, 0, 4, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 7, 0, 5, 0, 7&
     968              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0&
     969              :          , 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     970              :          , 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     971              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     972              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     973              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb4 = RESHAPE((/2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2&
     974              :          , 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 3, 4, 3, 3, 3, 3&
     975              :          , 4, 3, 3, 3, 3, 4, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 4, 4, 2, 4, 4, 2&
     976              :          , 4, 4, 0, 4, 4, 2, 4, 0, 0, 0, 2, 2, 0, 2, 0, 0, 2, 0, 6, 2, 2, 0, 2, 6, 0, 3, 0, 0, 3, 0&
     977              :          , 5, 5, 0, 5, 4, 0, 0, 5, 0, 2, 0, 1, 3, 5, 1, 0, 1, 1, 3, 1, 2, 5, 5, 1, 5, 8, 0, 0, 1, 3&
     978              :          , 0, 0, 4, 6, 1, 4, 6, 3, 3, 6, 3, 6, 0, 0, 4, 1, 0, 0, 2, 4, 4, 2, 4, 1, 1, 4, 1, 4, 0, 0&
     979              :          , 2, 4, 0, 0, 5, 5, 2, 5, 0, 6, 4, 5, 6, 8, 0, 0, 0, 2, 0, 0, 3, 3, 0, 3, 0, 4, 2, 3, 4, 6&
     980              :          , 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 5, 6, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 7, 3, 4&
     981              :          , 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3&
     982              :          , 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     983              :          , 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     984              :          , 0, 0, 0, 5, 0, 0, 5, 0/), (/4, 4, 20/))
     985              :       INTEGER, DIMENSION(4, 4, 20), PARAMETER :: mb5 = RESHAPE((/2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2&
     986              :          , 2, 2, 2, 2, 0, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4&
     987              :          , 0, 4, 4, 0, 4, 0, 0, 1, 0, 0, 1, 2, 0, 5, 0, 0, 6, 0, 0, 5, 0, 6, 0, 0, 1, 5, 0, 0, 5, 1&
     988              :          , 1, 5, 2, 5, 5, 1, 5, 2, 0, 0, 2, 1, 0, 0, 1, 6, 2, 1, 4, 1, 1, 6, 1, 8, 0, 0, 0, 2, 0, 0&
     989              :          , 2, 3, 0, 2, 0, 6, 2, 3, 6, 4, 0, 0, 0, 3, 0, 0, 3, 4, 0, 3, 0, 2, 3, 4, 2, 6, 0, 0, 0, 0&
     990              :          , 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0&
     991              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0&
     992              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     993              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     994              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     995              :          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&
     996              :          , 0, 0, 0, 0, 0, 0, 0, 0/), (/4, 4, 20/))
     997              : 
     998              :       INTEGER                                            :: k, k1, k2, mu
     999              :       REAL(kind=dp)                                      :: cp, ct, dJ, dJc, dJcc, dJss, dxx, dyy, &
    1000              :                                                             f, fac1, fac2, J, Jc, Jcc, Jss, rr, &
    1001              :                                                             sp, st, w, w1, w2, xx, yy, za, zb
    1002              :       REAL(kind=dp), DIMENSION(3)                        :: dcp, dct, dsp, dst, v
    1003              :       REAL(kind=dp), DIMENSION(3, 3)                     :: Arot
    1004              :       REAL(kind=dp), DIMENSION(3, 3, 3)                  :: dArot
    1005              : 
    1006            0 :       dS(:, :, :) = 0.0_dp
    1007              : 
    1008            0 :       v(:) = R(:)
    1009            0 :       rr = SQRT(DOT_PRODUCT(v, v))
    1010              : 
    1011            0 :       IF (rr < 1.0e-20_dp) THEN
    1012              : 
    1013            0 :          DO mu = 1, 4
    1014            0 :             dS(mu, mu, :) = 0.0_dp
    1015              :          END DO
    1016              : 
    1017              :       ELSE
    1018              : 
    1019            0 :          fac1 = 1.0_dp
    1020            0 :          IF (nra == 1) THEN
    1021              :             fac1 = fac1*2.0_dp
    1022              :          ELSE
    1023              :             IF (nra == 2) THEN
    1024              :                fac1 = fac1*SQRT(4.0_dp/3.0_dp)
    1025              :             ELSE
    1026              :                IF (nra == 3) THEN
    1027              :                   fac1 = fac1*SQRT(8.0_dp/45.0_dp)
    1028              :                ELSE
    1029              :                   IF (nra == 4) THEN
    1030              :                      fac1 = fac1*SQRT(4.0_dp/315.0_dp)
    1031              :                   ELSE
    1032            0 :                      WRITE (*, *) 'nra= ', nra
    1033            0 :                      RETURN
    1034              :                   END IF
    1035              :                END IF
    1036              :             END IF
    1037              :          END IF
    1038            0 :          IF (nrb == 1) THEN
    1039            0 :             fac1 = fac1*2.0_dp
    1040              :          ELSE
    1041            0 :             IF (nrb == 2) THEN
    1042            0 :                fac1 = fac1*SQRT(4.0_dp/3.0_dp)
    1043              :             ELSE
    1044            0 :                IF (nrb == 3) THEN
    1045            0 :                   fac1 = fac1*SQRT(8.0_dp/45.0_dp)
    1046              :                ELSE
    1047            0 :                   IF (nrb == 4) THEN
    1048            0 :                      fac1 = fac1*SQRT(4.0_dp/315.0_dp)
    1049              :                   ELSE
    1050            0 :                      WRITE (*, *) 'nrb= ', nrb
    1051            0 :                      RETURN
    1052              :                   END IF
    1053              :                END IF
    1054              :             END IF
    1055              :          END IF
    1056              : 
    1057            0 :          ct = -v(3)/rr
    1058            0 :          IF (ABS(ct) >= 1.0_dp) THEN
    1059              : 
    1060            0 :             dct(:) = v(:)*v(3)/rr**3
    1061            0 :             dct(3) = dct(3) - 1.0_dp/rr
    1062              : 
    1063            0 :             Arot(1, 1) = ct
    1064            0 :             Arot(1, 2) = 0.0_dp
    1065            0 :             Arot(1, 3) = 0.0_dp
    1066            0 :             Arot(2, 1) = 0.0_dp
    1067            0 :             Arot(2, 2) = 1.0_dp
    1068            0 :             Arot(2, 3) = 0.0_dp
    1069            0 :             Arot(3, 1) = 0.0_dp
    1070            0 :             Arot(3, 2) = 0.0_dp
    1071            0 :             Arot(3, 3) = ct
    1072              : 
    1073            0 :             dArot(1, 1, :) = dct(:)
    1074            0 :             dArot(1, 2, :) = 0.0_dp
    1075            0 :             dArot(1, 3, :) = 0.0_dp
    1076            0 :             dArot(2, 1, :) = 0.0_dp
    1077            0 :             dArot(2, 2, :) = 0.0_dp
    1078            0 :             dArot(2, 3, :) = 0.0_dp
    1079            0 :             dArot(3, 1, :) = 0.0_dp
    1080            0 :             dArot(3, 2, :) = 0.0_dp
    1081            0 :             dArot(3, 3, :) = dct(:)
    1082              : 
    1083              :          ELSE
    1084              : 
    1085            0 :             xx = SQRT(v(1)**2 + v(2)**2)
    1086            0 :             st = xx/rr
    1087            0 :             cp = -v(1)/xx
    1088            0 :             sp = -v(2)/xx
    1089              : 
    1090            0 :             dct(:) = v(:)*v(3)/rr**3
    1091            0 :             dct(3) = dct(3) - 1.0_dp/rr
    1092            0 :             dst(:) = -ct*dct(:)/st
    1093            0 :             dcp(:) = v(:)*v(1)/(rr**3*st)
    1094            0 :             dcp(:) = dcp(:) + v(1)*dst(:)/(rr*st**2)
    1095            0 :             dcp(1) = dcp(1) - 1.0_dp/(rr*st)
    1096            0 :             dsp(:) = v(:)*v(2)/(rr**3*st)
    1097            0 :             dsp(:) = dsp(:) + v(2)*dst(:)/(rr*st**2)
    1098            0 :             dsp(2) = dsp(2) - 1.0_dp/(rr*st)
    1099              : 
    1100            0 :             Arot(1, 1) = ct*cp
    1101            0 :             Arot(1, 2) = -sp
    1102            0 :             Arot(1, 3) = st*cp
    1103            0 :             Arot(2, 1) = ct*sp
    1104            0 :             Arot(2, 2) = cp
    1105            0 :             Arot(2, 3) = st*sp
    1106            0 :             Arot(3, 1) = -st
    1107            0 :             Arot(3, 2) = 0.0_dp
    1108            0 :             Arot(3, 3) = ct
    1109              : 
    1110            0 :             dArot(1, 1, :) = dct(:)*cp + ct*dcp(:)
    1111            0 :             dArot(1, 2, :) = -dsp(:)
    1112            0 :             dArot(1, 3, :) = dst(:)*cp + st*dcp(:)
    1113            0 :             dArot(2, 1, :) = dct(:)*sp + ct*dsp(:)
    1114            0 :             dArot(2, 2, :) = dcp(:)
    1115            0 :             dArot(2, 3, :) = dst(:)*sp + st*dsp(:)
    1116            0 :             dArot(3, 1, :) = -dst(:)
    1117            0 :             dArot(3, 2, :) = 0.0_dp
    1118            0 :             dArot(3, 3, :) = dct(:)
    1119              : 
    1120              :          END IF
    1121              : 
    1122            0 :          za = ZSA
    1123            0 :          zb = ZSB
    1124            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
    1125            0 :          xx = 0.5_dp*rr*(za + zb)
    1126            0 :          yy = 0.5_dp*rr*(za - zb)
    1127            0 :          dxx = 0.5_dp*(za + zb)
    1128            0 :          dyy = 0.5_dp*(za - zb)
    1129              : 
    1130            0 :          w = 0.0_dp
    1131            0 :          w1 = 0.0_dp
    1132            0 :          w2 = 0.0_dp
    1133            0 :          f = rr**(nra + nrb + 1)/2.0_dp**(nra + nrb + 2)
    1134            0 :          DO k = 1, nc1(nra, nrb)
    1135            0 :             w = w + REAL(c1(nra, nrb, k), dp)*AA(ma1(nra, nrb, k), xx)*BB(mb1(nra, nrb, k), yy)
    1136            0 :             w1 = w1 + REAL(c1(nra, nrb, k), dp)*AA(ma1(nra, nrb, k) + 1, xx)*BB(mb1(nra, nrb, k), yy)
    1137            0 :             w2 = w2 + REAL(c1(nra, nrb, k), dp)*AA(ma1(nra, nrb, k), xx)*BB(mb1(nra, nrb, k) + 1, yy)
    1138              :          END DO
    1139            0 :          J = f*w
    1140            0 :          dJ = f*REAL(nra + nrb + 1, dp)*w/rr
    1141            0 :          dJ = dJ - dxx*f*w1
    1142            0 :          dJ = dJ - dyy*f*w2
    1143              : 
    1144            0 :          dS(1, 1, :) = dS(1, 1, :) + fac1*fac2*dJ*v(:)/rr
    1145              : 
    1146            0 :          za = ZPA
    1147            0 :          zb = ZSB
    1148            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
    1149            0 :          xx = 0.5_dp*rr*(za + zb)
    1150            0 :          yy = 0.5_dp*rr*(za - zb)
    1151            0 :          dxx = 0.5_dp*(za + zb)
    1152            0 :          dyy = 0.5_dp*(za - zb)
    1153              : 
    1154            0 :          w = 0.0_dp
    1155            0 :          w1 = 0.0_dp
    1156            0 :          w2 = 0.0_dp
    1157            0 :          f = rr**(nra + nrb + 1)/2.0_dp**(nra + nrb + 2)
    1158            0 :          DO k = 1, nc2(nra, nrb)
    1159            0 :             w = w + REAL(c2(nra, nrb, k), dp)*AA(ma2(nra, nrb, k), xx)*BB(mb2(nra, nrb, k), yy)
    1160            0 :             w1 = w1 + REAL(c2(nra, nrb, k), dp)*AA(ma2(nra, nrb, k) + 1, xx)*BB(mb2(nra, nrb, k), yy)
    1161            0 :             w2 = w2 + REAL(c2(nra, nrb, k), dp)*AA(ma2(nra, nrb, k), xx)*BB(mb2(nra, nrb, k) + 1, yy)
    1162              :          END DO
    1163            0 :          Jc = f*w
    1164            0 :          dJc = f*REAL(nra + nrb + 1, dp)*w/rr
    1165            0 :          dJc = dJc - dxx*f*w1
    1166            0 :          dJc = dJc - dyy*f*w2
    1167              : 
    1168            0 :          DO k1 = 1, 3
    1169              :             dS(k1 + 1, 1, :) = dS(k1 + 1, 1, :) &
    1170              :          &          + SQRT(3.0_dp)*Arot(k1, 3)*fac1*fac2*dJc*v(:)/rr &
    1171            0 :          &          + SQRT(3.0_dp)*dArot(k1, 3, :)*fac1*fac2*Jc
    1172              :          END DO
    1173              : 
    1174            0 :          za = ZSA
    1175            0 :          zb = ZPB
    1176            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
    1177            0 :          xx = 0.5_dp*rr*(za + zb)
    1178            0 :          yy = 0.5_dp*rr*(za - zb)
    1179            0 :          dxx = 0.5_dp*(za + zb)
    1180            0 :          dyy = 0.5_dp*(za - zb)
    1181              : 
    1182            0 :          w = 0.0_dp
    1183            0 :          w1 = 0.0_dp
    1184            0 :          w2 = 0.0_dp
    1185            0 :          f = rr**(nra + nrb + 1)/2.0_dp**(nra + nrb + 2)
    1186            0 :          DO k = 1, nc3(nra, nrb)
    1187            0 :             w = w + REAL(c3(nra, nrb, k), dp)*AA(ma3(nra, nrb, k), xx)*BB(mb3(nra, nrb, k), yy)
    1188            0 :             w1 = w1 + REAL(c3(nra, nrb, k), dp)*AA(ma3(nra, nrb, k) + 1, xx)*BB(mb3(nra, nrb, k), yy)
    1189            0 :             w2 = w2 + REAL(c3(nra, nrb, k), dp)*AA(ma3(nra, nrb, k), xx)*BB(mb3(nra, nrb, k) + 1, yy)
    1190              :          END DO
    1191            0 :          Jc = f*w
    1192            0 :          dJc = f*REAL(nra + nrb + 1, dp)*w/rr
    1193            0 :          dJc = dJc - dxx*f*w1
    1194            0 :          dJc = dJc - dyy*f*w2
    1195              : 
    1196            0 :          DO k1 = 1, 3
    1197              :             dS(1, k1 + 1, :) = dS(1, k1 + 1, :) &
    1198              :          &          - SQRT(3.0_dp)*Arot(k1, 3)*fac1*fac2*dJc*v(:)/rr &
    1199            0 :          &          - SQRT(3.0_dp)*dArot(k1, 3, :)*fac1*fac2*Jc
    1200              :          END DO
    1201              : 
    1202            0 :          za = ZPA
    1203            0 :          zb = ZPB
    1204            0 :          fac2 = SQRT(za**(2*nra + 1)*zb**(2*nrb + 1))
    1205            0 :          xx = 0.5_dp*rr*(za + zb)
    1206            0 :          yy = 0.5_dp*rr*(za - zb)
    1207            0 :          dxx = 0.5_dp*(za + zb)
    1208            0 :          dyy = 0.5_dp*(za - zb)
    1209              : 
    1210            0 :          w = 0.0_dp
    1211            0 :          w1 = 0.0_dp
    1212            0 :          w2 = 0.0_dp
    1213            0 :          f = rr**(nra + nrb + 1)/2.0_dp**(nra + nrb + 2)
    1214            0 :          DO k = 1, nc4(nra, nrb)
    1215            0 :             w = w + REAL(c4(nra, nrb, k), dp)*AA(ma4(nra, nrb, k), xx)*BB(mb4(nra, nrb, k), yy)
    1216            0 :             w1 = w1 + REAL(c4(nra, nrb, k), dp)*AA(ma4(nra, nrb, k) + 1, xx)*BB(mb4(nra, nrb, k), yy)
    1217            0 :             w2 = w2 + REAL(c4(nra, nrb, k), dp)*AA(ma4(nra, nrb, k), xx)*BB(mb4(nra, nrb, k) + 1, yy)
    1218              :          END DO
    1219            0 :          Jss = f*w
    1220            0 :          dJss = f*REAL(nra + nrb + 1, dp)*w/rr
    1221            0 :          dJss = dJss - dxx*f*w1
    1222            0 :          dJss = dJss - dyy*f*w2
    1223              : 
    1224            0 :          w = 0.0_dp
    1225            0 :          w1 = 0.0_dp
    1226            0 :          w2 = 0.0_dp
    1227            0 :          f = rr**(nra + nrb + 1)/2.0_dp**(nra + nrb + 2)
    1228            0 :          DO k = 1, nc5(nra, nrb)
    1229            0 :             w = w + REAL(c5(nra, nrb, k), dp)*AA(ma5(nra, nrb, k), xx)*BB(mb5(nra, nrb, k), yy)
    1230            0 :             w1 = w1 + REAL(c5(nra, nrb, k), dp)*AA(ma5(nra, nrb, k) + 1, xx)*BB(mb5(nra, nrb, k), yy)
    1231            0 :             w2 = w2 + REAL(c5(nra, nrb, k), dp)*AA(ma5(nra, nrb, k), xx)*BB(mb5(nra, nrb, k) + 1, yy)
    1232              :          END DO
    1233            0 :          Jcc = f*w
    1234            0 :          dJcc = f*REAL(nra + nrb + 1, dp)*w/rr
    1235            0 :          dJcc = dJcc - dxx*f*w1
    1236            0 :          dJcc = dJcc - dyy*f*w2
    1237              : 
    1238            0 :          DO k1 = 1, 3
    1239            0 :             DO k2 = 1, 3
    1240              :                dS(k1 + 1, k2 + 1, :) = dS(k1 + 1, k2 + 1, :) &
    1241              :           &            + 1.5_dp*Arot(k1, 1)*Arot(k2, 1)*fac1*fac2*dJss*v(:)/rr &
    1242              :           &            + 1.5_dp*dArot(k1, 1, :)*Arot(k2, 1)*fac1*fac2*Jss &
    1243              :           &            + 1.5_dp*Arot(k1, 1)*dArot(k2, 1, :)*fac1*fac2*Jss &
    1244              :           &            + 1.5_dp*Arot(k1, 2)*Arot(k2, 2)*fac1*fac2*dJss*v(:)/rr &
    1245              :           &            + 1.5_dp*dArot(k1, 2, :)*Arot(k2, 2)*fac1*fac2*Jss &
    1246              :           &            + 1.5_dp*Arot(k1, 2)*dArot(k2, 2, :)*fac1*fac2*Jss &
    1247              :           &            - 3.0_dp*Arot(k1, 3)*Arot(k2, 3)*fac1*fac2*dJcc*v(:)/rr &
    1248              :           &            - 3.0_dp*dArot(k1, 3, :)*Arot(k2, 3)*fac1*fac2*Jcc &
    1249            0 :           &            - 3.0_dp*Arot(k1, 3)*dArot(k2, 3, :)*fac1*fac2*Jcc
    1250              :             END DO
    1251              :          END DO
    1252              : 
    1253              :       END IF
    1254              : 
    1255              :    END SUBROUTINE makedS
    1256              : 
    1257              : ! **************************************************************************************************
    1258              : !> \brief ...
    1259              : !> \param n ...
    1260              : !> \param x ...
    1261              : !> \return ...
    1262              : ! **************************************************************************************************
    1263            0 :    FUNCTION AA(n, x)
    1264              : 
    1265              :       INTEGER                                            :: n
    1266              :       REAL(kind=dp)                                      :: x, AA
    1267              : 
    1268              :       REAL(kind=dp)                                      :: p
    1269              : 
    1270            0 :       IF (n == 0) THEN
    1271              :          p = 1.0_dp
    1272              :       ELSE
    1273              :          IF (n == 1) THEN
    1274            0 :             p = 1.0_dp + x
    1275              :          ELSE
    1276              :             IF (n == 2) THEN
    1277              :                p = 2.0_dp + x*( &
    1278            0 :                    2.0_dp + x)
    1279              :             ELSE
    1280              :                IF (n == 3) THEN
    1281              :                   p = 6.0_dp + x*( &
    1282              :                       6.0_dp + x*( &
    1283            0 :                       3.0_dp + x))
    1284              :                ELSE
    1285              :                   IF (n == 4) THEN
    1286              :                      p = 24.0_dp + x*( &
    1287              :                          24.0_dp + x*( &
    1288              :                          12.0_dp + x*( &
    1289            0 :                          4.0_dp + x)))
    1290              :                   ELSE
    1291              :                      IF (n == 5) THEN
    1292              :                         p = 120.0_dp + x*( &
    1293              :                             120.0_dp + x*( &
    1294              :                             60.0_dp + x*( &
    1295              :                             20.0_dp + x*( &
    1296            0 :                             5.0_dp + x))))
    1297              :                      ELSE
    1298              :                         IF (n == 6) THEN
    1299              :                            p = 720.0_dp + x*( &
    1300              :                                720.0_dp + x*( &
    1301              :                                360.0_dp + x*( &
    1302              :                                120.0_dp + x*( &
    1303              :                                30.0_dp + x*( &
    1304            0 :                                6.0_dp + x)))))
    1305              :                         ELSE
    1306              :                            IF (n == 7) THEN
    1307              :                               p = 5040.0_dp + x*( &
    1308              :                                   5040.0_dp + x*( &
    1309              :                                   2520.0_dp + x*( &
    1310              :                                   840.0_dp + x*( &
    1311              :                                   210.0_dp + x*( &
    1312              :                                   42.0_dp + x*( &
    1313            0 :                                   7.0_dp + x))))))
    1314              :                            ELSE
    1315              :                               IF (n == 8) THEN
    1316              :                                  p = 40320.0_dp + x*( &
    1317              :                                      40320.0_dp + x*( &
    1318              :                                      20160.0_dp + x*( &
    1319              :                                      6720.0_dp + x*( &
    1320              :                                      1680.0_dp + x*( &
    1321              :                                      336.0_dp + x*( &
    1322              :                                      56.0_dp + x*( &
    1323            0 :                                      8.0_dp + x)))))))
    1324              :                               ELSE
    1325              :                                  IF (n == 9) THEN
    1326              :                                     p = 362880.0_dp + x*( &
    1327              :                                         362880.0_dp + x*( &
    1328              :                                         181440.0_dp + x*( &
    1329              :                                         60480.0_dp + x*( &
    1330              :                                         15120.0_dp + x*( &
    1331              :                                         3024.0_dp + x*( &
    1332              :                                         504.0_dp + x*( &
    1333              :                                         72.0_dp + x*( &
    1334            0 :                                         9.0_dp + x))))))))
    1335              :                                  ELSE
    1336              :                                     IF (n == 10) THEN
    1337              :                                        p = 3628800.0_dp + x*( &
    1338              :                                            3628800.0_dp + x*( &
    1339              :                                            1814400.0_dp + x*( &
    1340              :                                            604800.0_dp + x*( &
    1341              :                                            151200.0_dp + x*( &
    1342              :                                            30240.0_dp + x*( &
    1343              :                                            5040.0_dp + x*( &
    1344              :                                            720.0_dp + x*( &
    1345              :                                            90.0_dp + x*( &
    1346            0 :                                            10.0_dp + x)))))))))
    1347              :                                     ELSE
    1348            0 :                                        p = 1.0_dp
    1349            0 :                                        WRITE (*, *) ' n= ', n, ' in AA(n,x) '
    1350              :                                     END IF
    1351              :                                  END IF
    1352              :                               END IF
    1353              :                            END IF
    1354              :                         END IF
    1355              :                      END IF
    1356              :                   END IF
    1357              :                END IF
    1358              :             END IF
    1359              :          END IF
    1360              :       END IF
    1361              : 
    1362            0 :       AA = EXP(-x)*p/x**(n + 1)
    1363              : 
    1364            0 :    END FUNCTION AA
    1365              : 
    1366              : ! **************************************************************************************************
    1367              : !> \brief ...
    1368              : !> \param n ...
    1369              : !> \param y ...
    1370              : !> \return ...
    1371              : ! **************************************************************************************************
    1372            0 :    FUNCTION BB(n, y)
    1373              : 
    1374              :       INTEGER                                            :: n
    1375              :       REAL(kind=dp)                                      :: y, BB
    1376              : 
    1377            0 :       IF (ABS(y) > 1.0e-20_dp) THEN
    1378            0 :          BB = REAL((-1)**(n + 1), dp)*AA(n, -y) - AA(n, y)
    1379              :       ELSE
    1380            0 :          IF (MOD(n, 2) == 0) THEN
    1381            0 :             BB = 2.0_dp/REAL(n + 1, dp)
    1382              :          ELSE
    1383            0 :             BB = -y*2.0_dp/REAL(n + 2, dp)
    1384              :          END IF
    1385              :       END IF
    1386              : 
    1387            0 :    END FUNCTION BB
    1388              : 
    1389              : END MODULE se_core_matrix
    1390              : 
        

Generated by: LCOV version 2.0-1