LCOV - code coverage report
Current view: top level - src/43_wvl_wrappers - m_paw2wvl.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 8 0
Test Date: 2026-09-20 15:27:41 Functions: 0.0 % 4 0

            Line data    Source code
       1              : !!****m* ABINIT/m_paw2wvl
       2              : !! NAME
       3              : !!  paw2wvl
       4              : !!
       5              : !! FUNCTION
       6              : !!
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 2011-2026 ABINIT group (T. Rangel, MT)
      10              : !!  This file is distributed under the terms of the
      11              : !!  GNU General Public License, see ~abinit/COPYING
      12              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13              : !!
      14              : !! SOURCE
      15              : 
      16              : #if defined HAVE_CONFIG_H
      17              : #include "config.h"
      18              : #endif
      19              : 
      20              : #include "abi_common.h"
      21              : 
      22              : module m_paw2wvl
      23              : 
      24              :  use defs_basis
      25              :  use defs_wvltypes
      26              :  use m_abicore
      27              :  use m_errors
      28              : 
      29              :  use m_pawtab, only : pawtab_type
      30              :  use m_paw_ij, only : paw_ij_type
      31              : 
      32              :  implicit none
      33              : 
      34              :  private
      35              : !!***
      36              : 
      37              :  public :: paw2wvl
      38              :  public :: paw2wvl_ij
      39              :  public :: wvl_paw_free
      40              :  public :: wvl_cprjreorder
      41              : !!***
      42              : 
      43              : contains
      44              : !!***
      45              : 
      46              : !!****f* ABINIT/paw2wvl
      47              : !! NAME
      48              : !!  paw2wvl
      49              : !!
      50              : !! FUNCTION
      51              : !!  Points WVL objects to PAW objects
      52              : !!
      53              : !! INPUTS
      54              : !!  argin(sizein)=description
      55              : !!
      56              : !! OUTPUT
      57              : !!  argout(sizeout)=description
      58              : !!
      59              : !! SIDE EFFECTS
      60              : !!
      61              : !! NOTES
      62              : !!
      63              : !! SOURCE
      64              : 
      65            0 : subroutine paw2wvl(pawtab,proj,wvl)
      66              : 
      67              : !Arguments ------------------------------------
      68              :  type(pawtab_type),intent(in)::pawtab(:)
      69              :  type(wvl_internal_type), intent(inout) :: wvl
      70              :  type(wvl_projectors_type),intent(inout)::proj
      71              : 
      72              : !Local variables-------------------------------
      73              : #if defined HAVE_BIGDFT
      74              :  integer :: ib,ig
      75              :  integer :: itypat,jb,ll,lmnmax,lmnsz,nn,ntypat,ll_,nn_
      76              :  integer ::maxmsz,msz1,ptotgau,max_lmn2_size
      77              :  logical :: test_wvl
      78              :  real(dp) :: a1
      79              :  integer,allocatable :: msz(:)
      80              : #endif
      81              : 
      82              : !extra variables, use to debug
      83              : !  integer::nr,unitp,i_shell,ii,ir,ng
      84              : !  real(dp)::step,rmax
      85              : !  real(dp),allocatable::r(:), y(:)
      86              : !  complex::fac,arg
      87              : !  complex(dp),allocatable::f(:),g(:,:)
      88              : 
      89              : ! *********************************************************************
      90              : 
      91              : !DEBUG
      92              : !write (std_out,*) ' paw2wvl : enter'
      93              : !ENDDEBUG
      94              : 
      95              : #if defined HAVE_BIGDFT
      96              : 
      97              :  ntypat=size(pawtab)
      98              : 
      99              : !wvl object must be allocated in pawtab
     100              :  if (ntypat>0) then
     101              :    test_wvl=.true.
     102              :    do itypat=1,ntypat
     103              :      if (pawtab(itypat)%has_wvl==0.or.(.not.associated(pawtab(itypat)%wvl))) test_wvl=.false.
     104              :    end do
     105              :    if (.not.test_wvl) then
     106              :      ABI_BUG('pawtab%wvl must be allocated!')
     107              :    end if
     108              :  end if
     109              : 
     110              : !Find max mesh size
     111              :  ABI_MALLOC(msz,(ntypat))
     112              :  do itypat=1,ntypat
     113              :    msz(itypat)=pawtab(itypat)%wvl%rholoc%msz
     114              :  end do
     115              :  maxmsz=maxval(msz(1:ntypat))
     116              : 
     117              :  ABI_MALLOC(wvl%rholoc%msz,(ntypat))
     118              :  ABI_MALLOC(wvl%rholoc%d,(maxmsz,4,ntypat))
     119              :  ABI_MALLOC(wvl%rholoc%rad,(maxmsz,ntypat))
     120              :  ABI_MALLOC(wvl%rholoc%radius,(ntypat))
     121              : 
     122              :  do itypat=1,ntypat
     123              :    msz1=pawtab(itypat)%wvl%rholoc%msz
     124              :    msz(itypat)=msz1
     125              :    wvl%rholoc%msz(itypat)=msz1
     126              :    wvl%rholoc%d(1:msz1,:,itypat)=pawtab(itypat)%wvl%rholoc%d(1:msz1,:)
     127              :    wvl%rholoc%rad(1:msz1,itypat)=pawtab(itypat)%wvl%rholoc%rad(1:msz1)
     128              :    wvl%rholoc%radius(itypat)=pawtab(itypat)%rpaw
     129              :  end do
     130              :  ABI_FREE(msz)
     131              : !
     132              : !Now fill projectors type:
     133              : !
     134              :  ABI_MALLOC(proj%G,(ntypat))
     135              : !
     136              : !nullify all for security:
     137              : !do itypat=1,ntypat
     138              : !call nullify_gaussian_basis(proj%G(itypat))
     139              : !end do
     140              :  proj%G(:)%nat=1 !not used
     141              :  proj%G(:)%ncplx=2 !Complex gaussians
     142              : !
     143              : !Obtain dimensions:
     144              : !jb=0
     145              : !ptotgau=0
     146              :  do itypat=1,ntypat
     147              : !  do ib=1,pawtab(itypat)%basis_size
     148              : !  jb=jb+1
     149              : !  end do
     150              : !  ptotgau=ptotgau+pawtab(itypat)%wvl%ptotgau
     151              :    ptotgau=pawtab(itypat)%wvl%ptotgau
     152              :    proj%G(itypat)%nexpo=ptotgau
     153              :    proj%G(itypat)%nshltot=pawtab(itypat)%basis_size
     154              :  end do
     155              : !proj%G%nexpo=ptotgau
     156              : !proj%G%nshltot=jb
     157              : !
     158              : !Allocations
     159              :  do itypat=1,ntypat
     160              :    ABI_MALLOC(proj%G(itypat)%ndoc ,(proj%G(itypat)%nshltot))
     161              :    ABI_MALLOC(proj%G(itypat)%nam  ,(proj%G(itypat)%nshltot))
     162              :    ABI_MALLOC(proj%G(itypat)%xp   ,(proj%G(itypat)%ncplx,proj%G(itypat)%nexpo))
     163              :    ABI_MALLOC(proj%G(itypat)%psiat,(proj%G(itypat)%ncplx,proj%G(itypat)%nexpo))
     164              :  end do
     165              : 
     166              : !jb=0
     167              :  do itypat=1,ntypat
     168              :    proj%G(itypat)%ndoc(:)=pawtab(itypat)%wvl%pngau(:)
     169              :  end do
     170              : !
     171              :  do itypat=1,ntypat
     172              :    proj%G(itypat)%xp(:,:)=pawtab(itypat)%wvl%parg(:,:)
     173              :    proj%G(itypat)%psiat(:,:)=pawtab(itypat)%wvl%pfac(:,:)
     174              :  end do
     175              : 
     176              : !Change the real part of psiat to the form adopted in BigDFT:
     177              : !Here we use exp{(a+ib)x^2}, where a is a negative number.
     178              : !In BigDFT: exp{-0.5(x/c)^2}exp{i(bx)^2}, and c is positive
     179              : !Hence c=sqrt(0.5/abs(a))
     180              :  do itypat=1,ntypat
     181              :    do ig=1,proj%G(itypat)%nexpo
     182              :      a1=proj%G(itypat)%xp(1,ig)
     183              :      a1=(sqrt(0.5/abs(a1)))
     184              :      proj%G(itypat)%xp(1,ig)=a1
     185              :    end do
     186              :  end do
     187              : 
     188              : !debug
     189              : !write(*,*)'paw2wvl 178: erase me set gaussians real equal to hgh (for Li)'
     190              : !ABI_FREE(proj%G(1)%xp)
     191              : !ABI_FREE(proj%G(1)%psiat)
     192              : !ABI_MALLOC(proj%G(1)%psiat,(2,2))
     193              : !ABI_MALLOC(proj%G(1)%xp,(2,2))
     194              : !proj%G(1)%ndoc(:)=1 !1 gaussian per shell
     195              : !proj%G(1)%nexpo=2 ! two gaussians in total
     196              : !proj%G(1)%xp=zero
     197              : !proj%G(1)%xp(1,1)=0.666375d0
     198              : !proj%G(1)%xp(1,2)=1.079306d0
     199              : !proj%G(1)%psiat(1,:)=1.d0
     200              : !proj%G(1)%psiat(2,:)=zero
     201              : 
     202              : !
     203              : !begin debug
     204              : !
     205              : !write(*,*)'paw2wvl, comment me'
     206              : !and comment out variables
     207              : !rmax=2.d0
     208              : !nr=rmax/(0.0001d0)
     209              : !ABI_MALLOC(r,(nr))
     210              : !ABI_MALLOC(f,(nr))
     211              : !ABI_MALLOC(y,(nr))
     212              : !step=rmax/real(nr-1,dp)
     213              : !do ir=1,nr
     214              : !r(ir)=real(ir-1,dp)*step
     215              : !end do
     216              : !!
     217              : !unitp=400
     218              : !do itypat=1,ntypat
     219              : !ig=0
     220              : !do i_shell=1,proj%G(itypat)%nshltot
     221              : !unitp=unitp+1
     222              : !f(:)=czero
     223              : !ng=proj%G(itypat)%ndoc(i_shell)
     224              : !ABI_MALLOC(g,(nr,ng))
     225              : !do ii=1,ng
     226              : !ig=ig+1
     227              : !fac=cmplx(proj%G(itypat)%psiat(1,ig),proj%G(itypat)%psiat(2,ig))
     228              : !a1=-0.5d0/(proj%G(itypat)%xp(1,ig)**2)
     229              : !arg=cmplx(a1,proj%G(itypat)%xp(2,ig))
     230              : !g(:,ii)=fac*exp(arg*r(:)**2)
     231              : !f(:)=f(:)+g(:,ii)
     232              : !end do
     233              : !do ir=1,nr
     234              : !write(unitp,'(9999f16.7)')r(ir),real(f(ir)),(real(g(ir,ii)),&
     235              : !&    ii=1,ng)
     236              : !end do
     237              : !ABI_FREE(g)
     238              : !end do
     239              : !end do
     240              : !ABI_FREE(r)
     241              : !ABI_FREE(f)
     242              : !ABI_FREE(y)
     243              : !stop
     244              : !end debug
     245              : 
     246              : 
     247              : !jb=0
     248              :  do itypat=1,ntypat
     249              :    jb=0
     250              :    ll_ = 0
     251              :    nn_ = 0
     252              :    do ib=1,pawtab(itypat)%lmn_size
     253              :      ll=pawtab(itypat)%indlmn(1,ib)
     254              :      nn=pawtab(itypat)%indlmn(3,ib)
     255              : !    write(*,*)ll,pawtab(itypat)%indlmn(2,ib),nn
     256              :      if(ib>1 .and. ll == ll_ .and. nn==nn_) cycle
     257              :      jb=jb+1
     258              : !    proj%G%nam(jb)= pawtab(itypat)%indlmn(1,ib)+1!l quantum number
     259              : !    write(*,*)jb,proj%G%nshltot,proj%G%nam(jb)
     260              :      proj%G(itypat)%nam(jb)= pawtab(itypat)%indlmn(1,ib)+1 !l quantum number
     261              : !    1 is added due to BigDFT convention
     262              : !    write(*,*)jb,pawtab(itypat)%indlmn(1:3,ib)
     263              :      ll_=ll
     264              :      nn_=nn
     265              :    end do
     266              :  end do
     267              : !Nullify remaining objects
     268              :  do itypat=1,ntypat
     269              :    nullify(proj%G(itypat)%rxyz)
     270              :    nullify(proj%G(itypat)%nshell)
     271              :  end do
     272              : !nullify(proj%G%rxyz)
     273              : 
     274              : !now the index l,m,n objects:
     275              :  lmnmax=maxval(pawtab(:)%lmn_size)
     276              :  ABI_MALLOC(wvl%paw%indlmn,(6,lmnmax,ntypat))
     277              :  wvl%paw%lmnmax=lmnmax
     278              :  wvl%paw%ntypes=ntypat
     279              :  wvl%paw%indlmn=0
     280              :  do itypat=1,ntypat
     281              :    lmnsz=pawtab(itypat)%lmn_size
     282              :    wvl%paw%indlmn(1:6,1:lmnsz,itypat)=pawtab(itypat)%indlmn(1:6,1:lmnsz)
     283              :  end do
     284              : 
     285              : !allocate and copy sij
     286              : !max_lmn2_size=max(pawtab(:)%lmn2_size,1)
     287              :  max_lmn2_size=lmnmax*(lmnmax+1)/2
     288              :  ABI_MALLOC(wvl%paw%sij,(max_lmn2_size,ntypat))
     289              : !sij is not yet calculated here.
     290              : !We copy this in gstate after call to pawinit
     291              : !do itypat=1,ntypat
     292              : !wvl%paw%sij(1:pawtab(itypat)%lmn2_size,itypat)=pawtab(itypat)%sij(:)
     293              : !end do
     294              : 
     295              :  ABI_MALLOC(wvl%paw%rpaw,(ntypat))
     296              :  do itypat=1,ntypat
     297              :    wvl%paw%rpaw(itypat)= pawtab(itypat)%rpaw
     298              :  end do
     299              : 
     300              :  if(allocated(wvl%npspcode_paw_init_guess)) then
     301              :    ABI_FREE(wvl%npspcode_paw_init_guess)
     302              :  end if
     303              :  ABI_MALLOC(wvl%npspcode_paw_init_guess,(ntypat))
     304              :  do itypat=1,ntypat
     305              :    wvl%npspcode_paw_init_guess(itypat)=pawtab(itypat)%wvl%npspcode_init_guess
     306              :  end do
     307              : 
     308              : #else
     309              :  if (.false.) write(std_out) pawtab(1)%mesh_size,wvl%h(1),proj%nlpsp
     310              : #endif
     311              : 
     312              : !DEBUG
     313              : !write (std_out,*) ' paw2wvl : exit'
     314              : !stop
     315              : !ENDDEBUG
     316              : 
     317            0 : end subroutine paw2wvl
     318              : !!***
     319              : 
     320              : !!****f* ABINIT/paw2wvl_ij
     321              : !! NAME
     322              : !!  paw2wvl_ij
     323              : !!
     324              : !! FUNCTION
     325              : !!  FIXME: add description.
     326              : !!
     327              : !! INPUTS
     328              : !!  argin(sizein)=description
     329              : !!
     330              : !! OUTPUT
     331              : !!  argout(sizeout)=description
     332              : !!
     333              : !! SIDE EFFECTS
     334              : !!
     335              : !! NOTES
     336              : !!
     337              : !! SOURCE
     338              : 
     339            0 : subroutine paw2wvl_ij(option,paw_ij,wvl)
     340              : 
     341              : #if defined HAVE_BIGDFT
     342              :  use BigDFT_API, only : nullify_paw_ij_objects
     343              : #endif
     344              : 
     345              : !Arguments ------------------------------------
     346              :  integer,intent(in)::option
     347              :  type(wvl_internal_type), intent(inout)::wvl
     348              :  type(paw_ij_type),intent(in) :: paw_ij(:)
     349              : !Local variables-------------------------------
     350              : #if defined HAVE_BIGDFT
     351              :  integer :: iatom,iaux,my_natom
     352              :  character(len=500) :: message
     353              : #endif
     354              : 
     355              : ! *************************************************************************
     356              : 
     357              :  DBG_ENTER("COLL")
     358              : 
     359              : #if defined HAVE_BIGDFT
     360              :  my_natom=size(paw_ij)
     361              : 
     362              : !Option==1: allocate and copy
     363              :  if(option==1) then
     364              :    ABI_MALLOC(wvl%paw%paw_ij,(my_natom))
     365              :    do iatom=1,my_natom
     366              :      call nullify_paw_ij_objects(wvl%paw%paw_ij(iatom))
     367              :      wvl%paw%paw_ij(iatom)%cplex          =paw_ij(iatom)%qphase
     368              :      wvl%paw%paw_ij(iatom)%cplex_dij      =paw_ij(iatom)%cplex_dij
     369              :      wvl%paw%paw_ij(iatom)%has_dij        =paw_ij(iatom)%has_dij
     370              :      wvl%paw%paw_ij(iatom)%has_dijfr      =0
     371              :      wvl%paw%paw_ij(iatom)%has_dijhartree =0
     372              :      wvl%paw%paw_ij(iatom)%has_dijhat     =0
     373              :      wvl%paw%paw_ij(iatom)%has_dijso      =0
     374              :      wvl%paw%paw_ij(iatom)%has_dijU       =0
     375              :      wvl%paw%paw_ij(iatom)%has_dijxc      =0
     376              :      wvl%paw%paw_ij(iatom)%has_dijxc_val  =0
     377              :      wvl%paw%paw_ij(iatom)%has_exexch_pot =0
     378              :      wvl%paw%paw_ij(iatom)%has_pawu_occ   =0
     379              :      wvl%paw%paw_ij(iatom)%lmn_size       =paw_ij(iatom)%lmn_size
     380              :      wvl%paw%paw_ij(iatom)%lmn2_size      =paw_ij(iatom)%lmn2_size
     381              :      wvl%paw%paw_ij(iatom)%ndij           =paw_ij(iatom)%ndij
     382              :      wvl%paw%paw_ij(iatom)%nspden         =paw_ij(iatom)%nspden
     383              :      wvl%paw%paw_ij(iatom)%nsppol         =paw_ij(iatom)%nsppol
     384              :      if (paw_ij(iatom)%has_dij/=0) then
     385              :        iaux=paw_ij(iatom)%cplex_dij*paw_ij(iatom)%lmn2_size
     386              :        ABI_MALLOC(wvl%paw%paw_ij(iatom)%dij,(iaux,paw_ij(iatom)%ndij))
     387              :        wvl%paw%paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)
     388              :      end if
     389              :    end do
     390              : 
     391              : !  Option==2: deallocate
     392              :  elseif(option==2) then
     393              :    do iatom=1,my_natom
     394              :      wvl%paw%paw_ij(iatom)%has_dij=0
     395              :      if (associated(wvl%paw%paw_ij(iatom)%dij)) then
     396              :        ABI_FREE(wvl%paw%paw_ij(iatom)%dij)
     397              :      end if
     398              :    end do
     399              :    ABI_FREE(wvl%paw%paw_ij)
     400              : 
     401              : !  Option==3: only copy
     402              :  elseif(option==3) then
     403              :    do iatom=1,my_natom
     404              :      wvl%paw%paw_ij(iatom)%cplex     =paw_ij(iatom)%qphase
     405              :      wvl%paw%paw_ij(iatom)%cplex_dij =paw_ij(iatom)%cplex_dij
     406              :      wvl%paw%paw_ij(iatom)%lmn_size  =paw_ij(iatom)%lmn_size
     407              :      wvl%paw%paw_ij(iatom)%lmn2_size =paw_ij(iatom)%lmn2_size
     408              :      wvl%paw%paw_ij(iatom)%ndij      =paw_ij(iatom)%ndij
     409              :      wvl%paw%paw_ij(iatom)%nspden    =paw_ij(iatom)%nspden
     410              :      wvl%paw%paw_ij(iatom)%nsppol    =paw_ij(iatom)%nsppol
     411              :      wvl%paw%paw_ij(iatom)%dij(:,:)  =paw_ij(iatom)%dij(:,:)
     412              :    end do
     413              : 
     414              :  else
     415              :    message = 'paw2wvl_ij: option should be equal to 1, 2 or 3'
     416              :    ABI_ERROR(message)
     417              :  end if
     418              : 
     419              : #else
     420              :  if (.false.) write(std_out,*) option,wvl%h(1),paw_ij(1)%ndij
     421              : #endif
     422              : 
     423              :  DBG_EXIT("COLL")
     424              : 
     425            0 : end subroutine paw2wvl_ij
     426              : !!***
     427              : 
     428              : !!****f* ABINIT/wvl_paw_free
     429              : !! NAME
     430              : !!  wvl_paw_free
     431              : !!
     432              : !! FUNCTION
     433              : !!  Frees memory for WVL+PAW implementation
     434              : !!
     435              : !! INPUTS
     436              : !!  ntypat = number of atom types
     437              : !!  wvl= wvl type
     438              : !!  wvl_proj= wvl projector type
     439              : !!
     440              : !! OUTPUT
     441              : !!
     442              : !! SIDE EFFECTS
     443              : !!
     444              : !! NOTES
     445              : !!
     446              : !! SOURCE
     447              : 
     448              : 
     449            0 : subroutine wvl_paw_free(wvl)
     450              : 
     451              : !Arguments ------------------------------------
     452              :  type(wvl_internal_type),intent(inout) :: wvl
     453              : ! *************************************************************************
     454              : 
     455              : #if defined HAVE_BIGDFT
     456              : 
     457              : !PAW objects
     458              :  if( associated(wvl%paw%spsi)) then
     459              :    ABI_FREE(wvl%paw%spsi)
     460              :  end if
     461              :  if( associated(wvl%paw%indlmn)) then
     462              :    ABI_FREE(wvl%paw%indlmn)
     463              :  end if
     464              :  if( associated(wvl%paw%sij)) then
     465              :    ABI_FREE(wvl%paw%sij)
     466              :  end if
     467              :  if( associated(wvl%paw%rpaw)) then
     468              :    ABI_FREE(wvl%paw%rpaw)
     469              :  end if
     470              : 
     471              : !rholoc
     472              :  if( associated(wvl%rholoc%msz )) then
     473              :    ABI_FREE(wvl%rholoc%msz)
     474              :  end if
     475              :  if( associated(wvl%rholoc%d )) then
     476              :    ABI_FREE(wvl%rholoc%d)
     477              :  end if
     478              :  if( associated(wvl%rholoc%rad)) then
     479              :    ABI_FREE(wvl%rholoc%rad)
     480              :  end if
     481              :  if( associated(wvl%rholoc%radius)) then
     482              :    ABI_FREE(wvl%rholoc%radius)
     483              :  end if
     484              : 
     485              : #else
     486              :  if (.false.) write(std_out,*) wvl%h(1)
     487              : #endif
     488              : 
     489              : !paw%paw_ij and paw%cprj are allocated and deallocated inside vtorho
     490              : 
     491            0 : end subroutine wvl_paw_free
     492              : !!***
     493              : 
     494              : 
     495              : !!****f* ABINIT/wvl_cprjreorder
     496              : !! NAME
     497              : !!  wvl_cprjreorder
     498              : !!
     499              : !! FUNCTION
     500              : !! Change the order of a wvl-cprj datastructure
     501              : !!   From unsorted cprj to atom-sorted cprj (atm_indx=atindx)
     502              : !!   From atom-sorted cprj to unsorted cprj (atm_indx=atindx1)
     503              : !!
     504              : !! INPUTS
     505              : !!  atm_indx(natom)=index table for atoms
     506              : !!   From unsorted wvl%paw%cprj to atom-sorted wvl%paw%cprj (atm_indx=atindx)
     507              : !!   From atom-sorted wvl%paw%cprj to unsorted wvl%paw%cprj (atm_indx=atindx1)
     508              : !!
     509              : !! OUTPUT
     510              : !!
     511              : !! SOURCE
     512              : 
     513            0 : subroutine wvl_cprjreorder(wvl,atm_indx)
     514              : 
     515              : #if defined HAVE_BIGDFT
     516              :  use BigDFT_API,only : cprj_objects,cprj_paw_alloc,cprj_clean
     517              :  use dynamic_memory
     518              : #endif
     519              : 
     520              : !Arguments ------------------------------------
     521              : !scalars
     522              : !arrays
     523              :  integer,intent(in) :: atm_indx(:)
     524              :  type(wvl_internal_type),intent(inout),target :: wvl
     525              : 
     526              : !Local variables-------------------------------
     527              : #if defined HAVE_BIGDFT
     528              : !scalars
     529              :  integer :: iexit,ii,jj,kk,n1atindx,n1cprj,n2cprj,ncpgr
     530              :  character(len=100) :: msg
     531              : !arrays
     532              :  integer,allocatable :: nlmn(:)
     533              :  type(cprj_objects),pointer :: cprj(:,:)
     534              :  type(cprj_objects),allocatable :: cprj_tmp(:,:)
     535              : #endif
     536              : 
     537              : ! *************************************************************************
     538              : 
     539              :  DBG_ENTER("COLL")
     540              : 
     541              : #if defined HAVE_BIGDFT
     542              :  cprj => wvl%paw%cprj
     543              : 
     544              :  n1cprj=size(cprj,dim=1);n2cprj=size(cprj,dim=2)
     545              :  n1atindx=size(atm_indx,dim=1)
     546              :  if (n1cprj==0.or.n2cprj==0.or.n1atindx<=1) return
     547              :  if (n1cprj/=n1atindx) then
     548              :    msg='wrong sizes!'
     549              :    ABI_BUG(msg)
     550              :  end if
     551              : 
     552              : !Nothing to do when the atoms are already sorted
     553              :  iexit=1;ii=0
     554              :  do while (iexit==1.and.ii<n1atindx)
     555              :    ii=ii+1
     556              :    if (atm_indx(ii)/=ii) iexit=0
     557              :  end do
     558              :  if (iexit==1) return
     559              : 
     560              :  ABI_MALLOC(nlmn,(n1cprj))
     561              :  do ii=1,n1cprj
     562              :    nlmn(ii)=cprj(ii,1)%nlmn
     563              :  end do
     564              :  ncpgr=cprj(1,1)%ncpgr
     565              : 
     566              :  ABI_MALLOC(cprj_tmp,(n1cprj,n2cprj))
     567              :  call cprj_paw_alloc(cprj_tmp,ncpgr,nlmn)
     568              :  do jj=1,n2cprj
     569              :    do ii=1,n1cprj
     570              :      cprj_tmp(ii,jj)%nlmn=nlmn(ii)
     571              :      cprj_tmp(ii,jj)%ncpgr=ncpgr
     572              :      cprj_tmp(ii,jj)%cp(:,:)=cprj(ii,jj)%cp(:,:)
     573              :      if (ncpgr>0) cprj_tmp(ii,jj)%dcp(:,:,:)=cprj(ii,jj)%dcp(:,:,:)
     574              :    end do
     575              :  end do
     576              : 
     577              :  call cprj_clean(cprj)
     578              : 
     579              :  do jj=1,n2cprj
     580              :    do ii=1,n1cprj
     581              :      kk=atm_indx(ii)
     582              :      cprj(kk,jj)%nlmn=nlmn(ii)
     583              :      cprj(kk,jj)%ncpgr=ncpgr
     584              :      cprj(kk,jj)%cp=f_malloc_ptr((/2,nlmn(ii)/),id='cprj%cp')
     585              :      cprj(kk,jj)%cp(:,:)=cprj_tmp(ii,jj)%cp(:,:)
     586              :      if (ncpgr>0) then
     587              :        cprj(kk,jj)%dcp=f_malloc_ptr((/2,ncpgr,nlmn(ii)/),id='cprj%dcp')
     588              :        cprj(kk,jj)%dcp(:,:,:)=cprj_tmp(kk,jj)%dcp(:,:,:)
     589              :      end if
     590              :    end do
     591              :  end do
     592              : 
     593              :  call cprj_clean(cprj_tmp)
     594              :  ABI_FREE(cprj_tmp)
     595              :  ABI_FREE(nlmn)
     596              : 
     597              : #else
     598              :  if (.false.) write(std_out,*) atm_indx(1),wvl%h(1)
     599              : #endif
     600              : 
     601              :  DBG_EXIT("COLL")
     602              : 
     603            0 : end subroutine wvl_cprjreorder
     604              : !!***
     605              : 
     606              : end module m_paw2wvl
     607              : !!***
        

Generated by: LCOV version 2.3-1