ssite.f90 Source File


Source Code

!-----------------------------------------------------------------------------------------!
! Copyright (c) 2018 Peter Grünberg Institut, Forschungszentrum Jülich, Germany           !
! This file is part of Jülich KKR code and available as free software under the conditions!
! of the MIT license as expressed in the LICENSE.md file in more detail.                  !
!-----------------------------------------------------------------------------------------!

!------------------------------------------------------------------------------------
!> Summary: Assign quantum numbers and call routine to solve 8 coupled differentail radial Dirac eqautions.
!> Author: 
!> Assign quantum numbers and call routine to solve 8 coupled differentail radial 
!> Dirac eqautions. The resulting wavefunctions are used to calculate t-matrices in
!> the \(\kappa-\mu\) representation.
!> Calculation of the radial integrals:
!> \begin{equation}
!> \left[ G_1 G_2 + F_1 F_2\right]r^2 dr
!> \end{equation}
!> for `IHYPER <> 0`. Calculation of the hyperfine matrix elements.
!------------------------------------------------------------------------------------
!> @note
!> 
!> * Ryd-units are used throughout.
!> * To save storage force `JG/JF` and `PR/QR` to share the same storage by 
!> corresponding argument list in `CALL`.
!> * 28/10/94 HE tidy up, `P`,`Q` used in `<DIRAC>` instead of `g`,`f`
!> * 05/10/96 HE workspace for wavefunctions and matrices is allocated dynamically
!> * 07/02/05 VP few changes connected to the calculation of orbital polarisation
!> @endnote
!------------------------------------------------------------------------------------
module mod_ssite

contains

  !-------------------------------------------------------------------------------
  !> Summary: Assign quantum numbers and call routine to solve 8 coupled differentail radial Dirac eqautions.
  !> Author: 
  !> Category: dirac, single-site, KKRhost
  !> Deprecated: False 
  !> Assign quantum numbers and call routine to solve 8 coupled differentail radial 
  !> Dirac eqautions. The resulting wavefunctions are used to calculate t-matrices in
  !> the \(\kappa-\mu\) representation.
  !> Calculation of the radial integrals:
  !> \begin{equation}
  !> \left[ G_1 G_2 + F_1 F_2\right]r^2 dr
  !> \end{equation}
  !> for `IHYPER <> 0`. Calculation of the hyperfine matrix elements.
  !-------------------------------------------------------------------------------
  !> @note 
  !>
  !> * Ryd-units are used throughout.
  !> * To save storage force `JG/JF` and `PR/QR` to share the same storage by 
  !> corresponding argument list in `CALL`.
  !> * 28/10/94 HE tidy up, `P`,`Q` used in `<DIRAC>` instead of `g`,`f`
  !> * 05/10/96 HE workspace for wavefunctions and matrices is allocated dynamically
  !> * 07/02/05 VP few changes connected to the calculation of orbital polarisation
  !> @endnote
  !-------------------------------------------------------------------------------
  subroutine ssite(iwrregwf,iwrirrwf,nfilcbwf,calcint,getirrsol,soctl,ctl,eryd,p,   &
    ihyper,iprint,ikm1lin,ikm2lin,nlq,nkmq,nlinq,nt,nkm,iqat,tsst,msst,tsstlin,dzz, &
    dzj,szz,szj,ozz,ozj,bzz,bzj,qzz,qzj,tzz,tzj,vt,bt,at,zat,nucleus,r,drdi,r2drdi, &
    jws,imt,ameopo,lopt,solver,cgc,ozzs,ozjs,nlmax,nqmax,linmax,nrmax,nmmax,ntmax,  &
    nkmmax,nkmpmax,nlamax)

    use :: mod_datatypes, only: dp
    use :: mod_cinit
    use :: mod_cdjlzdz
    use :: mod_cdnlzdz
    use :: mod_dirac_op, only: dirabmop
    use :: mod_cinthff
    use :: mod_cintabr
    use :: mod_cjlz
    use :: mod_dirac_soc2, only: dirabmsoc2
    use :: mod_dirac_soc, only: dirabmsoc
    use :: mod_dirac_bs, only: dirbs
    use :: mod_cnlz
    use :: mod_ikapmue
    use :: mod_rinit
    use :: mod_sumupint
    use :: mod_rnuctab
    use :: mod_constants, only: ci

    implicit none

    real (kind=dp) :: f1, e0, a0, cautog

    ! conversion factor for hyperfine fields from A.U. to GAUSS
    ! electron charge     in esu
    ! Bohr-radius         in cm

    parameter (f1=1.0e0_dp, e0=1.6021892e-19_dp*2.997930e+09_dp, a0=0.52917706e-08_dp, cautog=e0/(a0*a0))

    ! Dummy arguments
    logical :: calcint, getirrsol
    complex (kind=dp) :: eryd, p
    integer :: ihyper, iprint, iwrirrwf, iwrregwf, linmax, nfilcbwf, nkm, nkmmax, nlamax, nlmax, nmmax, nqmax, nrmax, nt, ntmax, nucleus
    integer :: nkmpmax
    character (len=10) :: solver
    real (kind=dp) :: ameopo(nkmmax, nkmmax, nlamax, 3), at(nrmax, nlamax, 3, ntmax), bt(nrmax, ntmax), ctl(ntmax, nlmax), drdi(nrmax, nmmax), r(nrmax, nmmax), &
      r2drdi(nrmax, nmmax), soctl(ntmax, nlmax), vt(nrmax, ntmax)
    real (kind=dp) :: cgc(nkmpmax, 2)
    complex (kind=dp) :: ozjs(linmax, ntmax, 2), ozzs(linmax, ntmax, 2)
    complex (kind=dp) :: bzj(linmax, ntmax), bzz(linmax, ntmax), dzj(linmax, ntmax), dzz(linmax, ntmax), msst(nkmmax, nkmmax, ntmax), ozj(linmax, ntmax), ozz(linmax, ntmax), &
      qzj(linmax, ntmax), qzz(linmax, ntmax), szj(linmax, ntmax), szz(linmax, ntmax), tsst(nkmmax, nkmmax, ntmax), tsstlin(linmax, ntmax), tzj(linmax, ntmax), tzz(linmax, ntmax)
    integer :: ikm1lin(linmax), ikm2lin(linmax), imt(ntmax), iqat(nqmax, ntmax), jws(nmmax), lopt(ntmax), nkmq(nqmax), nlinq(nqmax), nlq(nqmax), zat(ntmax), muem05

    ! Local variables
    complex (kind=dp) :: a(2, 2), arg, b1, b2, cint(nrmax), crsq, csum, det, dxp(2, 2), f11, f12, f21, f22, g11, g11p, g12, g12p, g21, g21p, g22, g22p, gam(2, 2), gaminv(2, 2), hl, &
      hlb1, hlb2, jf(nrmax, 2, 2), jg(nrmax, 2, 2), jl, jlb1, jlb2, jlp, maux(nkmmax, nkmmax), msst2(2, 2), nl, nlb1, nlb2, nlp, norm, pfac, pi(2, 2, nrmax), pr(2, 2, nrmax), &
      qi(2, 2, nrmax), qr(2, 2, nrmax), rmehf(2, 2), rmehf1(2, 2), rmehf2(2, 2), sig(2, 2), tsst2(2, 2), xsst2(2, 2), zf(nrmax, 2, 2), zfjf(2, 2), zfzf(2, 2), zg(nrmax, 2, 2), &
      zgjg(2, 2), zgzg(2, 2)
    real (kind=dp) :: ap(2, 2, nrmax), aq(2, 2, nrmax), c, cff(2, 2), cfg(2, 2), cg1, cg2, cg4, cg5, cg8, cgf(2, 2), cgg(2, 2), ch(2, 2), csqr, ctf(2, 2), ctg(2, 2), dovr(nrmax), &
      drovrn(nrmax), mj, r1m(2, 2), rkd(2, 2), rnuc, sk1, sk2, tdia1, tdia2, toff
    real (kind=dp) :: cog(2, 2, 2), cof(2, 2, 2)
    integer :: i, i1, i2, i3, i5, ikm1, ikm2, il, im, in, info, ipiv(nkmmax), iq, isk1, isk2, it, j, jlim, jtop, k, k1, k2, kap1, kap2, kc, l, l1, lb1, lb2, lin, n, nsol, imkm1, &
      imkm2, is
    logical :: wronski

    data r1m/1.0e0_dp, 0.0e0_dp, 0.0e0_dp, 1.0e0_dp/
    data rkd/1.0e0_dp, 0.0e0_dp, 0.0e0_dp, -1.0e0_dp/
    ! DATA RKD / 1.0D0, 0.0D0, 0.0D0, 1.0D0 /

    call cinit(ntmax*linmax, dzz)
    call cinit(ntmax*linmax, dzj)
    call cinit(ntmax*linmax, szz)
    call cinit(ntmax*linmax, szj)
    call cinit(ntmax*linmax, ozz)
    call cinit(ntmax*linmax, ozj)
    call cinit(ntmax*linmax, bzz)
    call cinit(ntmax*linmax, bzj)
    call cinit(ntmax*linmax, qzz)
    call cinit(ntmax*linmax, qzj)
    call cinit(ntmax*linmax, tzz)
    call cinit(ntmax*linmax, tzj)

    wronski = .true.
    wronski = .false.
    ! ------------------------------------------------------------------------

    c = ctl(1, 1)
    csqr = c*c

    ! calculate relativistic momentum

    p = sqrt(eryd*(1.0e0_dp+eryd/csqr))

    pfac = p/(1.0e0_dp+eryd/csqr)


    ! TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
    do it = 1, nt

      if (iprint>0) write (1337, '(A,I3,A,10F10.4)') ' SOLVER ', it, solver, (soctl(it,il), il=1, nlmax)

      iq = iqat(1, it)
      im = imt(it)
      jtop = jws(im)
      if (nucleus/=0) then
        rnuc = rnuctab(zat(it))
        in = 1
        do while (r(in,im)<rnuc)
          in = in + 1
        end do
        ! RLIM=R(IN,IM)
        jlim = in
        if (mod(jlim,2)==0) jlim = jlim - 1
        rnuc = r(jlim, im)
      end if
      do i = 1, jtop
        dovr(i) = drdi(i, im)/r(i, im)
        if (nucleus/=0) drovrn(i) = (r(i,im)/rnuc)**3*drdi(i, im)
      end do

      lin = 0

      ! LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
      do l = 0, (nlq(iq)-1)
        il = l + 1
        c = ctl(it, il)
        csqr = c*c

        ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        kap1 = -l - 1
        kap2 = l
        if (l==0) kap2 = kap1
        ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        isk1 = isign(1, kap1)
        isk2 = isign(1, kap2)
        sk1 = real(isk1, kind=dp)
        sk2 = real(isk2, kind=dp)
        l1 = l
        lb1 = l - isk1
        lb2 = l - isk2

        arg = p*r(jtop, im)
        jl = cjlz(l1, arg)
        jlb1 = cjlz(lb1, arg)
        jlb2 = cjlz(lb2, arg)
        nl = cnlz(l1, arg)
        nlb1 = cnlz(lb1, arg)
        nlb2 = cnlz(lb2, arg)
        hl = jl + ci*nl
        hlb1 = jlb1 + ci*nlb1
        hlb2 = jlb2 + ci*nlb2

        if (solver(1:7)=='ABM-SOC') then
          jlp = cdjlzdz(l1, arg, 1)*p
          nlp = cdnlzdz(l1, arg, 1)*p
        end if

        ! MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
        do mj = -(real(l,kind=dp)+0.5_dp), +(real(l,kind=dp)+0.5_dp), 1.0_dp

          ! ------------------------------------------------------------------------
          ! NO COUPLING FOR:  ABS(MUE)= J   +  J=L+1/2 == KAP=-L-1
          if (abs(mj)>=real(l,kind=dp)) then
            nsol = 1
          else
            nsol = 2
          end if
          ! ------------------------------------------------------------------------
          muem05 = nint(mj-0.5e0_dp)
          ikm1 = ikapmue(kap1, muem05)
          ikm2 = ikapmue(kap2, muem05)
          imkm1 = ikapmue(-kap1, muem05)
          imkm2 = ikapmue(-kap2, muem05)
          ! ------------------------------------------------------------------------
          i5 = nrmax*2*2
          call cinit(i5, zg)
          call cinit(i5, zf)
          call cinit(i5, jg)
          call cinit(i5, jf)
          call cinit(i5, pr)
          call cinit(i5, qr)
          call cinit(i5, pi)
          call cinit(i5, qi)

          if (solver(1:2)=='BS') then
            call dirbs(getirrsol, ctl(it,il), eryd, l, mj, kap1, kap2, p, cg1, cg2, cg4, cg5, cg8, vt(1,it), bt(1,it), zat(it), nucleus, r(1,im), drdi(1,im), dovr, jtop, pr, qr, &
              pi, qi, zg, zf)
          else if (solver=='ABM-BI') then
            stop ' < DIRABMBI > : Not implemented. Set SOLVER=BS in inputcard'
            ! CALL DIRABMBI(GETIRRSOL,CTL(IT,IL),IT,ERYD,L,MJ,KAP1,
            ! &                          KAP2,P,CG1,CG2,CG4,CG5,CG8,AMEOPC,
            ! &                          AMEOPO,VT(1,IT),BT(1,IT),AT,Z(IT),
            ! &
            ! NUCLEUS,R(1,IM),DRDI(1,IM),DOVR,JTOP,PR,
            ! &                          QR,PI,QI,ZG,ZF,AP,AQ,NTMAX,NLAMAX,
            ! &                          NKMMAX,NRMAX)
          else if (solver(1:6)=='ABM-OP') then
            call dirabmop(getirrsol, ctl(it,il), it, eryd, l, mj, kap1, kap2, p, cg1, cg2, cg4, cg5, cg8, ameopo, vt(1,it), bt(1,it), at, zat(it), nucleus, r(1,im), drdi(1,im), &
              dovr, jtop, pr, qr, pi, qi, zg, zf, ap, aq, lopt(it), ntmax, nlamax, nkmmax, nrmax)
          else if (solver=='ABM-SOC   ') then
            call dirabmsoc(getirrsol, ctl(it,il), soctl(it,il), it, eryd, l, mj, kap1, kap2, p, cg1, cg2, cg4, cg5, cg8, vt(1,it), bt(1,it), zat(it), nucleus, r(1,im), drdi(1,im), &
              dovr, jtop, dxp, pr, qr, pi, qi, zg, zf, nrmax)
          else if (solver=='ABM-SOC-II') then
            call dirabmsoc2(getirrsol, ctl(it,il), soctl(it,il), it, eryd, l, mj, kap1, kap2, p, cg1, cg2, cg4, cg5, cg8, vt(1,it), bt(1,it), zat(it), nucleus, r(1,im), drdi(1,im), &
              dovr, jtop, dxp, pr, qr, pi, qi, zg, zf, nrmax)
          else
            write (6, *) 'No solver found for: ', solver
            stop
          end if

          ! wavefunctions at the muffin-tin-radius

          n = jtop

          g11 = pr(1, 1, n)/r(n, im)
          f11 = qr(1, 1, n)/(r(n,im)*c)
          g21 = pr(2, 1, n)/r(n, im)
          f21 = qr(2, 1, n)/(r(n,im)*c)
          g22 = pr(2, 2, n)/r(n, im)
          f22 = qr(2, 2, n)/(r(n,im)*c)
          g12 = pr(1, 2, n)/r(n, im)
          f12 = qr(1, 2, n)/(r(n,im)*c)

          if (solver(1:7)=='ABM-SOC') then
            g11p = (dxp(1,1)/drdi(n,im)-g11)/r(n, im)
            g21p = (dxp(2,1)/drdi(n,im)-g21)/r(n, im)
            g12p = (dxp(1,2)/drdi(n,im)-g12)/r(n, im)
            g22p = (dxp(2,2)/drdi(n,im)-g22)/r(n, im)
          end if

          ! ------- the minor component for the soc-manipulated wf is
          ! meaningless

          if (solver(1:7)=='ABM-SOC') then
            call cinit(2*2*nrmax, qr)
            call cinit(2*2*nrmax, qi)
          end if

          ! COSD= NL * C * F11 - PFAC * SK1 * NLB1 * G11
          ! SIND= JL * C * F11 - PFAC * SK1 * JLB1 * G11

          ! -------------------------------------------------------------------
          ! T-SS  CONSTRUCTED USING EXPRESSIONS FROM H.E. + B.L.G. (1988)
          ! -------------------------------------------------------------------

          nl = (hl-jl)/ci
          nlb1 = (hlb1-jlb1)/ci
          nlb2 = (hlb2-jlb2)/ci


          if (solver(1:7)=='ABM-SOC') then
            gam(1, 1) = jl*g11p - jlp*g11
            gam(2, 1) = jl*g21p - jlp*g21
            gam(1, 2) = jl*g12p - jlp*g12
            gam(2, 2) = jl*g22p - jlp*g22

            sig(1, 1) = nl*g11p - nlp*g11
            sig(2, 1) = nl*g21p - nlp*g21
            sig(1, 2) = nl*g12p - nlp*g12
            sig(2, 2) = nl*g22p - nlp*g22
          else
            gam(1, 1) = jl*c*f11 - pfac*sk1*jlb1*g11
            gam(2, 1) = jl*c*f21 - pfac*sk2*jlb2*g21
            gam(1, 2) = jl*c*f12 - pfac*sk1*jlb1*g12
            gam(2, 2) = jl*c*f22 - pfac*sk2*jlb2*g22

            sig(1, 1) = nl*c*f11 - pfac*sk1*nlb1*g11
            sig(2, 1) = nl*c*f21 - pfac*sk2*nlb2*g21
            sig(1, 2) = nl*c*f12 - pfac*sk1*nlb1*g12
            sig(2, 2) = nl*c*f22 - pfac*sk2*nlb2*g22
          end if

          call zcopy(nsol*nsol, gam, 1, gaminv, 1)
          call zgetrf(nsol, nsol, gaminv, 2, ipiv, info)
          call zgetri(nsol, gaminv, 2, ipiv, maux, 2*2, info)

          do i2 = 1, nsol
            do i1 = 1, nsol
              csum = 0.0e0_dp
              do i3 = 1, nsol
                csum = csum + sig(i1, i3)*gaminv(i3, i2)
              end do
              xsst2(i1, i2) = p*csum
            end do
          end do

          do i1 = 1, nsol
            do i2 = 1, nsol
              msst2(i1, i2) = -xsst2(i1, i2)
            end do
            msst2(i1, i1) = msst2(i1, i1) + ci*p
          end do

          call zcopy(nsol*nsol, msst2, 1, tsst2, 1)

          call zgetrf(nsol, nsol, tsst2, 2, ipiv, info)
          call zgetri(nsol, tsst2, 2, ipiv, maux, 2*2, info)

          if (iprint>=3) write (1337, 100) it, l, mj, ((tsst2(i1,i2),i2=1,nsol), i1=1, nsol)
          ! ------------------------------------------------------------------------

          ! COEFFICIENTS TO CALCULATE THE SPIN  MAGNETISATION

          cgg(1, 1) = cg1
          cgg(1, 2) = cg2
          cgg(2, 1) = cg2
          cgg(2, 2) = cg4
          call rinit(4, cgf)
          cgf(1, 1) = cg5
          cgf(2, 2) = cg8


          ! COEFFICIENTS TO CALCULATE THE SPIN  DIPOLAR MOMENT TZ

          tdia1 = 2*mj/real((2*l1+1)*(2*lb1+1), kind=dp)
          tdia2 = 2*mj/real((2*l1+1)*(2*lb2+1), kind=dp)
          toff = -sqrt((l1+0.5e0_dp)**2-mj**2)/real(2*l1+1, kind=dp)

          ctg(1, 1) = 0.5e0_dp*(cg1-3.0e0_dp*tdia1)
          ctg(1, 2) = 0.5e0_dp*(cg2-3.0e0_dp*toff)
          ctg(2, 1) = 0.5e0_dp*(cg2-3.0e0_dp*toff)
          ctg(2, 2) = 0.5e0_dp*(cg4-3.0e0_dp*tdia2)
          call rinit(4, ctf)


          ! COEFFICIENTS TO CALCULATE THE ORBITAL MAGNETISATION

          cfg(1, 1) = mj*(kap1+1.0e0_dp)/(kap1+0.5e0_dp)
          cfg(2, 2) = mj*(kap2+1.0e0_dp)/(kap2+0.5e0_dp)
          cfg(1, 2) = 0.5e0_dp*sqrt(1.0e0_dp-(mj/(kap1+0.5e0_dp))**2)
          cfg(2, 1) = cfg(1, 2)
          call rinit(4, cff)
          cff(1, 1) = mj*(-kap1+1.0e0_dp)/(-kap1+0.5e0_dp)
          cff(2, 2) = mj*(-kap2+1.0e0_dp)/(-kap2+0.5e0_dp)

          ! -----------------------------------------------------------------------
          ! COEFFICIENTS TO CALCULATE THE ORBITAL POLARISATION

          call rinit(4*2, cog)
          call rinit(4*2, cof)
          do is = 1, 2
            cog(1, 1, is) = cgc(ikm1, is)*cgc(ikm1, is)*real(muem05-is+2, kind=dp)
            cof(1, 1, is) = cgc(imkm1, is)*cgc(imkm1, is)*real(muem05-is+2, kind=dp)
          end do

          if (nsol==2) then
            do is = 1, 2
              cog(2, 2, is) = cgc(ikm2, is)*cgc(ikm2, is)*real(muem05-is+2, kind=dp)
              cof(2, 2, is) = cgc(imkm2, is)*cgc(imkm2, is)*real(muem05-is+2, kind=dp)

              cog(1, 2, is) = cgc(ikm1, is)*cgc(ikm2, is)*real(muem05-is+2, kind=dp)
              cog(2, 1, is) = cog(1, 2, is)
            end do
          end if
          ! -----------------------------------------------------------------------
          ! ANGULAR HYPERFINE MATRIX ELEMENTS   SEE E.G.  E.M.ROSE
          ! THE FACTOR  I  HAS BEEN OMITTED

          ch(1, 1) = 4.0e0_dp*kap1*mj/(4.0e0_dp*kap1*kap1-1.0e0_dp)
          ch(2, 2) = 4.0e0_dp*kap2*mj/(4.0e0_dp*kap2*kap2-1.0e0_dp)
          if (nsol==2) then
            ch(1, 2) = sqrt(0.25e0_dp-(mj/real(kap1-kap2,kind=dp))**2)
            ch(2, 1) = ch(1, 2)
          end if
          ! -----------------------------------------------------------------------
          ! ALCULATE RADIAL INTEGRALS  UP TO   OR RWS(JTOP=JWS)


          if (nsol==1) then
            ! ====================================================================
            ! NO COUPLING TO OTHER SCATTERING CHANNELS
            ! REGULAR PART    Z*Z    Z = (GRA,FRA)

            norm = (p*nl-jl*xsst2(1,1))/g11

            do i = 1, jtop
              zg(i, 1, 1) = (pr(1,1,i)/r(i,im))*norm
              zf(i, 1, 1) = (qr(1,1,i)/r(i,im)/c)*norm
              jg(i, 1, 1) = pi(1, 1, i)/r(i, im)
              jf(i, 1, 1) = qi(1, 1, i)/r(i, im)/c
            end do


            if (iwrregwf/=0) write (nfilcbwf, rec=ikm1+(it-1)*nkm) it, l, mj, nsol, 'REG', kap1, ikm1, (zg(i,1,1), zf(i,1,1), i=1, jtop)

            if (iwrirrwf/=0) write (nfilcbwf, rec=ikm1+(it-1+nt)*nkm) it, l, mj, nsol, 'IRR', kap1, ikm1, (jg(i,1,1), jf(i,1,1), i=1, jtop)

            ! ============================================== NO COUPLING = END
            ! ===
          else
            ! ====================================================================
            ! COUPLING OF TWO SCATTERING CHANNELS
            ! Z(K1,K2):  INDEX 1: SPIN-ANGULAR CHARACTER
            ! INDEX 2: BOUNDARY CONDITION


            det = g11*g22 - g12*g21

            ! OEFFICIENTS TO GET:   Z(K1,K1)  Z(K2,K1)
            b1 = p*nl - xsst2(1, 1)*jl
            b2 = -xsst2(2, 1)*jl
            a(1, 1) = (g22*b1-g12*b2)/det
            a(2, 1) = (g11*b2-g21*b1)/det

            ! OEFFICIENTS TO GET:   Z(K1,K2)  Z(K2,K2)
            b1 = -xsst2(1, 2)*jl
            b2 = p*nl - xsst2(2, 2)*jl
            a(1, 2) = (g22*b1-g12*b2)/det
            a(2, 2) = (g11*b2-g21*b1)/det

            ! ALCULATE FUNCTIONS: Z(K1,K1), Z(K2,K1), Z(K1,K2), Z(K2,K2)
            do k = 1, nsol
              do i = 1, jtop
                zg(i, 1, k) = (pr(1,1,i)*a(1,k)+pr(1,2,i)*a(2,k))/r(i, im)
                zf(i, 1, k) = (qr(1,1,i)*a(1,k)+qr(1,2,i)*a(2,k))/r(i, im)/c

                zg(i, 2, k) = (pr(2,1,i)*a(1,k)+pr(2,2,i)*a(2,k))/r(i, im)
                zf(i, 2, k) = (qr(2,1,i)*a(1,k)+qr(2,2,i)*a(2,k))/r(i, im)/c
              end do
            end do
            do k = 1, nsol
              kc = 3 - k
              do i = 1, jtop
                jg(i, k, k) = pi(k, k, i)/r(i, im)
                jf(i, k, k) = qi(k, k, i)/r(i, im)/c
                jg(i, kc, k) = pi(kc, k, i)/r(i, im)
                jf(i, kc, k) = qi(kc, k, i)/r(i, im)/c
              end do
            end do

            ! -----------------------------------------------------------------------
            if (iwrregwf/=0) then
              ! solution 1
              write (nfilcbwf, rec=ikm1+(it-1)*nkm) it, l, mj, nsol, 'REG', kap1, ikm1, (zg(i,1,1), zf(i,1,1), i=1, jtop), kap2, ikm2, (zg(i,2,1), zf(i,2,1), i=1, jtop)

              ! solution 2
              write (nfilcbwf, rec=ikm2+(it-1)*nkm) it, l, mj, nsol, 'REG', kap2, ikm2, (zg(i,2,2), zf(i,2,2), i=1, jtop), kap1, ikm1, (zg(i,1,2), zf(i,1,2), i=1, jtop)
            end if

            if (iwrirrwf/=0) then
              ! solution 1
              write (nfilcbwf, rec=ikm1+(it-1+nt)*nkm) it, l, mj, nsol, 'IRR', kap1, ikm1, (jg(i,1,1), jf(i,1,1), i=1, jtop), kap2, ikm2, (jg(i,2,1), jf(i,2,1), i=1, jtop)

              ! solution 2
              write (nfilcbwf, rec=ikm2+(it-1+nt)*nkm) it, l, mj, nsol, 'IRR', kap2, ikm2, (jg(i,2,2), jf(i,2,2), i=1, jtop), kap1, ikm1, (jg(i,1,2), jf(i,1,2), i=1, jtop)

            end if
            ! ================================================= COUPLING = END
            ! ===
          end if



          ! ALCULATE SUM OF INTEGRALS TO BE MULTIPLIED TO   TAU(K1,K2)
          do k1 = 1, nsol
            do k2 = 1, nsol

              lin = lin + 1
              tsstlin(lin, it) = tsst2(k1, k2)
              if (calcint) then
                ! REGULAR PART    Z*Z

                call cintabr(zg(1,1,k1), zg(1,1,k2), zgzg, zf(1,1,k1), zf(1,1,k2), zfzf, r2drdi(1,im), nsol, nsol, jtop, nrmax)

                call sumupint(dzz(lin,it), f1, zgzg, r1m, f1, zfzf, r1m, nsol)
                call sumupint(szz(lin,it), f1, zgzg, cgg, -f1, zfzf, cgf, nsol)
                call sumupint(ozz(lin,it), f1, zgzg, cfg, -f1, zfzf, cff, nsol)
                ! ----------------------------------------------------------------------
                do is = 1, 2
                  call sumupint(ozzs(lin,it,is), f1, zgzg, cog(1,1,is), -f1, zfzf, cof(1,1,is), nsol)
                end do
                ! ----------------------------------------------------------------------
                call sumupint(qzz(lin,it), f1, zgzg, rkd, f1, zfzf, rkd, nsol)
                call sumupint(tzz(lin,it), f1, zgzg, ctg, -f1, zfzf, ctf, nsol)

                ! write(66,'(3I3,2e16.7)') it,nsol,lin,DZZ(LIN,IT)
                ! write(66,'(4e16.7)') ((ZGZG(ii,jj),ii=1,nsol),jj=1,nsol)
                ! write(66,'(4e16.7)') ((ZFZF(ii,jj),ii=1,nsol),jj=1,nsol)


                ! -----------------------------------------------------------------------
                if (ihyper==1) then
                  call cinthff(zg(1,1,k1), zf(1,1,k1), zg(1,1,k2), zf(1,1,k2), rmehf, nsol, nsol, jtop, cint, r(1,im), drdi(1,im), nrmax)

                  if (nucleus/=0) then
                    ! calculates integrals inside nucleus but up to now only
                    ! approximately because jlim is not the nuclear radius
                    ! the same arguments are valid for the irregular parts below
                    call cinthff(zg(1,1,k1), zf(1,1,k1), zg(1,1,k2), zf(1,1,k2), rmehf1, nsol, nsol, jlim, cint, r(1,im), drdi(1,im), nrmax)
                    call cinthff(zg(1,1,k1), zf(1,1,k1), zg(1,1,k2), zf(1,1,k2), rmehf2, nsol, nsol, jlim, cint, r(1,im), drovrn, nrmax)
                    do i = 1, nsol
                      do j = 1, nsol
                        rmehf(i, j) = rmehf(i, j) - rmehf1(i, j) + rmehf2(i, j)
                      end do
                    end do
                  end if
                  ! !end of nucleus.eq.0
                  call sumupint(bzz(lin,it), cautog, rmehf, ch, 0.0e0_dp, rmehf, ch, nsol)
                end if
                ! -----------------------------------------------------------------------

                ! IRREGULAR PART    Z*J
                ! THE  ENDING  A (B)  STANDS FOR THE DOMINATING (DIMINATED)
                ! SET OF SPIN-ANGULAR-CHAR:  I.E.  J==J(A,A)  FOR R>RMT

                if (k1==k2) then

                  call cintabr(zg(1,1,k1), jg(1,1,k1), zgjg, zf(1,1,k1), jf(1,1,k1), zfjf, r2drdi(1,im), nsol, nsol, jtop, nrmax)

                  call sumupint(dzj(lin,it), f1, zgjg, r1m, f1, zfjf, r1m, nsol)
                  call sumupint(szj(lin,it), f1, zgjg, cgg, -f1, zfjf, cgf, nsol)
                  call sumupint(ozj(lin,it), f1, zgjg, cfg, -f1, zfjf, cff, nsol)
                  ! ----------------------------------------------------------------------
                  do is = 1, 2
                    call sumupint(ozjs(lin,it,is), f1, zgjg, cog(1,1,is), -f1, zfjf, cof(1,1,is), nsol)
                  end do
                  ! ----------------------------------------------------------------------
                  call sumupint(qzj(lin,it), f1, zgjg, rkd, f1, zfjf, rkd, nsol)
                  call sumupint(tzj(lin,it), f1, zgjg, ctg, -f1, zfjf, ctf, nsol)

                  ! -----------------------------------------------------------------------
                  if (ihyper==1) then
                    call cinthff(zg(1,1,k1), zf(1,1,k1), jg(1,1,k1), jf(1,1,k1), rmehf, nsol, nsol, jtop, cint, r(1,im), drdi(1,im), nrmax)
                    if (nucleus/=0) then
                      ! calculates integrals inside nucleus but up to now only
                      ! approximately because jlim is not the nuclear radius
                      ! the same arguments are valid for the irregular parts
                      ! below
                      call cinthff(zg(1,1,k1), zf(1,1,k1), jg(1,1,k1), jf(1,1,k1), rmehf1, nsol, nsol, jlim, cint, r(1,im), drdi(1,im), nrmax)
                      call cinthff(zg(1,1,k1), zf(1,1,k1), jg(1,1,k1), jf(1,1,k1), rmehf2, nsol, nsol, jlim, cint, r(1,im), drovrn, nrmax)
                      do i = 1, nsol
                        do j = 1, nsol
                          rmehf(i, j) = rmehf(i, j) - rmehf1(i, j) + rmehf2(i, j)
                        end do
                      end do
                    end if
                    ! !end of nucleus.eq.0

                    call sumupint(bzj(lin,it), cautog, rmehf, ch, 0.0e0_dp, rmehf, ch, nsol)
                  end if
                end if
                ! -----------------------------------------------------------------------
              end if
              ! ! OF IF (.CALCINT.)
            end do
          end do

          ! heck WRONSKI-relationship

          if (wronski) then
            do i = 1, jtop, 40
              crsq = c*r(i, im)**2
              write (1337, 110, advance='no') it, l, nint(2*mj), i, r(i, im), 1.0e0_dp - (zf(i,1,1)*jg(i,1,1)-zg(i,1,1)*jf(i,1,1)+zf(i,2,1)*jg(i,2,1)-zg(i,2,1)*jf(i,2,1))*crsq
              if (nsol==2) then
                write (1337, 120) 1.0e0_dp - (zf(i,1,2)*jg(i,1,2)-zg(i,1,2)*jf(i,1,2)+zf(i,2,2)*jg(i,2,2)-zg(i,2,2)*jf(i,2,2))*crsq, &
                  1.0e0_dp - (zf(i,1,2)*jg(i,1,1)-zg(i,1,2)*jf(i,1,1)+zf(i,2,2)*jg(i,2,1)-zg(i,2,2)*jf(i,2,1))*crsq, 1.0e0_dp - (zf(i,1,1)*jg(i,1,2)-zg(i,1,1)*jf(i,1,2)+zf(i,2,1)* &
                  jg(i,2,2)-zg(i,2,1)*jf(i,2,2))*crsq
              else
                write (1337, *)
              end if
            end do
          end if

        end do
        ! MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
      end do
      ! LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

      call cinit(nkmmax*nkmmax, tsst(1,1,it))

      do lin = 1, nlinq(iq)
        i1 = ikm1lin(lin)
        i2 = ikm2lin(lin)
        tsst(i1, i2, it) = tsstlin(lin, it)
      end do

      do j = 1, nkmq(iq)
        call zcopy(nkmq(iq), tsst(1,j,it), 1, msst(1,j,it), 1)
      end do

      call zgetrf(nkmq(iq), nkmq(iq), msst(1,1,it), nkmmax, ipiv, info)
      call zgetri(nkmq(iq), msst(1,1,it), nkmmax, ipiv, maux, nkmmax*nkmmax, info)

      if (iprint>=4) then
        do lin = 1, nlinq(iq)
          i1 = ikm1lin(lin)
          i2 = ikm2lin(lin)
          write (1337, 130) it, lin
          write (1337, 130) it, i1, i2, ' DZZ ', dzz(lin, it), dzj(lin, it)
          write (1337, 130) it, i1, i2, ' SZZ ', szz(lin, it), szj(lin, it)
          write (1337, 130) it, i1, i2, ' OZZ ', ozz(lin, it), ozj(lin, it)
        end do
      end if
    end do
    ! TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

100 format ('  t-ss(TLM)', 2i3, f5.1, 2e14.5, 2x, 2e14.5, :, /, 22x, 2e14.5, 2x, 2e14.5)
110 format (' IT=', i2, ' L=', i2, ' MJ=', i2, '/2', i7, f10.6, 1(2x,2f9.6))
120 format (3(2x,2f9.6))
130 format (' IT=', i2, 2i3, a, 2x, 2e14.5, 2x, 2e14.5)
  end subroutine ssite

  !-------------------------------------------------------------------------------
  !> Summary: Re-read the wave functions written by `<SSITE>` or `<CORE>`
  !> Author: Who wrote this subroutine
  !> Category: dirac, input-output, KKRhost
  !> Deprecated: False 
  !> Re-read the wave functions written by `<SSITE>` or `<CORE>`
  !-------------------------------------------------------------------------------
  subroutine readwfun(nfil,it,l,mj,nsol,sreg,sirr,ikm1,kap1,ikm2,kap2,nt,nkm,zg,zf, &
    jg,jf,jtop,nrmax)

    use :: mod_datatypes, only: dp

    implicit none

    ! Dummy arguments
    integer :: ikm1, ikm2, it, jtop, kap1, kap2, l, nfil, nkm, nrmax, nsol, nt
    real (kind=dp) :: mj
    character (len=3) :: sirr, sreg
    complex (kind=dp) :: jf(nrmax, 2, 2), jg(nrmax, 2, 2), zf(nrmax, 2, 2), zg(nrmax, 2, 2)

    ! Local variables
    integer :: i, iflag, ikmin(2), itp, k, kapin(2), lp, nsolp
    real (kind=dp) :: mjp
    character (len=3) :: strp

    iflag = 0
    ! -----------------------------------------------------------------------
    ! REGULAR wave function -- solution 1
    if (sreg=='REG' .or. sreg=='COR') then
      read (nfil, rec=ikm1+(it-1)*nkm) itp, lp, mjp, nsolp, strp, (kapin(k), ikmin(k), (zg(i,k,1),zf(i,k,1),i=1,jtop), k=1, nsol)
      if (itp/=it .or. lp/=l .or. abs(mjp-mj)>0.001e0_dp .or. nsolp/=nsol .or. strp/='REG') iflag = iflag + 1
      if (kap1/=kapin(1)) iflag = iflag + 1
      if (ikm1/=ikmin(1)) iflag = iflag + 1
      if (nsol>1) then
        if (kap2/=kapin(2)) iflag = iflag + 1
        if (ikm2/=ikmin(2)) iflag = iflag + 1
      end if
    end if

    ! -----------------------------------------------------------------------
    ! IRREGULAR wave function -- solution 1
    if (sirr=='IRR') then
      read (nfil, rec=ikm1+(it-1+nt)*nkm) itp, lp, mjp, nsolp, strp, (kapin(k), ikmin(k), (jg(i,k,1),jf(i,k,1),i=1,jtop), k=1, nsol)
      if (itp/=it .or. lp/=l .or. abs(mjp-mj)>0.001e0_dp .or. nsolp/=nsol .or. strp/='IRR') iflag = iflag + 1
      if (kap1/=kapin(1)) iflag = iflag + 1
      if (ikm1/=ikmin(1)) iflag = iflag + 1
      if (nsol>1) then
        if (kap2/=kapin(2)) iflag = iflag + 1
        if (ikm2/=ikmin(2)) iflag = iflag + 1
      end if
    end if

    if (nsol==2) then
      ! -----------------------------------------------------------------------
      ! REGULAR wave function -- solution 2
      if (sreg=='REG' .or. sreg=='COR') then
        read (nfil, rec=ikm2+(it-1)*nkm) itp, lp, mjp, nsolp, strp, (kapin(k), ikmin(k), (zg(i,k,2),zf(i,k,2),i=1,jtop), k=2, 1, -1)
        if (itp/=it .or. lp/=l .or. abs(mjp-mj)>0.001e0_dp .or. nsolp/=nsol .or. strp/='REG') iflag = iflag + 1
      end if

      ! -----------------------------------------------------------------------
      ! IRREGULAR wave function -- solution 2
      if (sirr=='IRR') then
        read (nfil, rec=ikm2+(it-1+nt)*nkm) itp, lp, mjp, nsolp, strp, (kapin(k), ikmin(k), (jg(i,k,2),jf(i,k,2),i=1,jtop), k=2, 1, -1)
        if (itp/=it .or. lp/=l .or. abs(mjp-mj)>0.001e0_dp .or. nsolp/=nsol .or. strp/='IRR') iflag = iflag + 1
      end if

    end if

    ! -----------------------------------------------------------------------

    if (iflag>0) then
      write (*, 100) iflag, it, l, mj, sreg, sirr
      stop ' in <READWFUN>'
    end if
100 format (/, /, 1x, 79('*'), /, 10x, 'error reading the wave functions', ' IFLAG = 1', /, 10x, 'for  IT=', i2, ' L=', i2, ' MJ=', f4.1, ' KEYS=', a, a)
  end subroutine readwfun

end module mod_ssite