Branch data Line data Source code
1 : : !!****m*ABINIT/m_wfd_wannier
2 : : !! NAME
3 : : !! m_wfd_wannier
4 : : !!
5 : : !! FUNCTION
6 : : !! The high level wfd_t inteface for building wannier functions
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2005-2026 ABINIT group (hexu)
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 : :
17 : : #if defined HAVE_CONFIG_H
18 : : #include "config.h"
19 : : #endif
20 : :
21 : : #include "abi_common.h"
22 : :
23 : : !===============================================================
24 : : ! m_wfd_wannier
25 : : !> @description: Wannier function from wfd_t
26 : : !===============================================================
27 : :
28 : : module m_wfd_wannier
29 : :
30 : : use defs_basis
31 : : use m_abicore
32 : : use m_errors
33 : : use m_xmpi
34 : :
35 : : use defs_abitypes, only : mpi_type
36 : : use defs_datatypes, only : pseudopotential_type
37 : : use m_dtset, only : dataset_type
38 : : use m_hdr, only : hdr_type
39 : : use m_wfd, only : wfd_t
40 : : use m_crystal, only : crystal_t
41 : : use m_pawang, only : pawang_type
42 : : use m_pawrad, only : pawrad_type
43 : : use m_pawtab, only : pawtab_type
44 : : use m_pawcprj, only : pawcprj_type
45 : : use m_dtfil, only : datafiles_type
46 : : use m_abstract_wf, only : abstract_wf, compute_iwav, write_cg_and_cprj, wann_ksetting_t, init_mywfc
47 : : use m_mlwfovlp, only : mlwfovlp
48 : : use m_ebands, only : ebands_t
49 : :
50 : : use defs_wannier90
51 : :
52 : : implicit none
53 : : private
54 : : public :: wfd_run_wannier
55 : : integer, parameter :: master=0
56 : :
57 : : contains
58 : :
59 : :
60 : : !-----------------------------------------------------------------------------
61 : : !> @brief The high level wfd_t inteface for building wannier functions
62 : : !> @param[in] cryst: crystal_t type, crystal structure
63 : : !> @param[inout] ebands: ebands_t type, eigenvalues and eigenvectors
64 : : !> @param[inout] hdr: hdr_type type, header
65 : : !> @param[in] mpi_enreg: mpi_type type, MPI information
66 : : !> @param[in] ngfftc: integer, FFT grid for coarse grid
67 : : !> @param[in] ngfftf: integer, FFT grid for fine grid
68 : : !> @param[in] wfd: wfd_t type, wavefunction data
69 : : !> @param[in] dtset: dataset_type type, dataset
70 : : !> @param[in] dtfil: datafiles_type type, datafiles
71 : : !> @param[in] pawang: pawang_type type, PAW angular momentum
72 : : !> @param[in] pawrad: pawrad_type type, PAW radial functions
73 : : !> @param[in] pawtab: pawtab_type type, PAW tabulated functions
74 : : !> @param[in] psps: pseudopotential_type type, pseudopotential
75 : : !> @param[in] kg: real(dp), FFT grid, shouldn't be used
76 : : !> @param[in] cg: complex(dp), wavefunction coefficients, shouldn't be used
77 : : !> @param[in] cprj: complex(dp), wavefunction coefficients, shouldn't be used
78 : : !-----------------------------------------------------------------------------
79 : 19 : subroutine wfd_run_wannier(cryst, ebands, hdr, mpi_enreg, &
80 [ + + + - : 19 : ngfftc, ngfftf, wfd, dtset, dtfil, pawang, pawrad, pawtab, psps , kg, cg, cprj)
- + + + +
- - + - +
+ + + - -
+ - + ]
81 : :
82 : : type(crystal_t), intent(in) :: cryst
83 : : type(ebands_t), intent(in) :: ebands
84 : : type(hdr_type), intent(in) :: hdr
85 : : integer, intent(in) :: ngfftc(18),ngfftf(18)
86 : : type(dataset_type), intent(in) :: dtset
87 : : type(datafiles_type),intent(in) :: dtfil
88 : : type(mpi_type), intent(inout) :: mpi_enreg
89 : : type(pseudopotential_type),intent(in) :: psps
90 : : type(pawang_type),intent(in) :: pawang
91 : : !type(pawrad_type),intent(in) :: pawrad(psps%ntypat*psps%usepaw)
92 : : type(pawrad_type),intent(in) :: pawrad(:)
93 : : !type(pawtab_type),intent(in) :: pawtab(psps%ntypat*psps%usepaw)
94 : : type(pawtab_type),intent(in) :: pawtab(:)
95 : :
96 : : type(wfd_t), optional, intent(inout) :: wfd
97 : : real(dp), optional, target, intent(in) :: cg(:, :)
98 : : integer, optional, target, intent(in) :: kg(:, :)
99 : : type(pawcprj_type), optional, target, intent(in) :: cprj(:, :)
100 : : class(abstract_wf), pointer :: mywfc
101 : : integer :: mgfftc
102 : : integer :: nfft
103 : : integer :: mcg, mcprj
104 : : !real(dp), pointer:: ptr_cg(:, :)=>null()
105 : : integer, pointer:: ptr_kg(:, :)=>null()
106 : : !type(pawcprj_type), pointer:: ptr_cprj(:, :)=>null()
107 : : integer :: mpw, nspinor, mband, mkmem, nsppol
108 : : ! TODO: anything todo with nkpt: fullBZ
109 : : ! TODO: ebands for fullBZ
110 : : ! TODO: mcprj
111 : : ! TODO: mgfftc: is it ngfft. NO
112 : : ! TODO: ngfft: is it ngfftc, or ngfftf
113 : : ! TODO: check mpw in wfd
114 : : ! TODO: mkmem: note: the mkmem in mpi_enreg is not used.
115 : : ! TODO: gather kg from wfd
116 : : ! TODO: mcg
117 : : ! TODO: mcprj
118 : 38 : integer :: exclude_bands(hdr%mband, hdr%nsppol)
119 : : integer :: spaceComm, nprocs, rank, master
120 : :
121 : : ABI_UNUSED(ngfftf(1))
122 : :
123 : : !print *, "============================================================"
124 : : !print *, "Starting WFD Wannier"
125 : : !print *, "============================================================"
126 : :
127 : 19 : spaceComm=MPI_enreg%comm_world
128 : 19 : nprocs = MPI_enreg%nproc
129 : 19 : rank= MPI_enreg%me
130 : 19 : master=0
131 : :
132 : 19 : mgfftc=dtset%mgfft
133 [ + + ]: 398 : mpw=MAXVAL(hdr%npwarr)
134 : 19 : nspinor=hdr%nspinor
135 : 19 : mband=hdr%mband
136 : 19 : nsppol = hdr%nsppol
137 : : !mcg=mpw*nspinor*mband* mkmem *nsppol
138 : : !mcprj = nspinor*mband* mkmem*nsppol
139 : : ! Is this correct for paw?
140 [ + + ]: 76 : nfft=product(ngfftc(1:3))
141 [ + + ]: 19 : if (present(cg)) then
142 : 14 : mkmem= dtset%mkmem
143 : : call init_mywfc(mywfc=mywfc, ebands=ebands, cg=cg, cprj=cprj, &
144 : : & cryst=cryst,dtset=dtset, &
145 : : & dtfil=dtfil, hdr=hdr, MPI_enreg=MPI_enreg, nprocs=nprocs, psps=psps, &
146 [ - + ]: 14 : & pawtab=pawtab, rank=rank, comm=spaceComm)
147 : 14 : ptr_kg => kg
148 : : ! call mlwfovlp(mywfc=mywfc, crystal=cryst, ebands=ebands, hdr=hdr, atindx1=cryst%atindx1 &
149 : : ! &,dtset=dtset,dtfil=dtfil, &
150 : : ! & eigen=ebands%eig,gprimd=cryst%gprimd,kg=ptr_kg,&
151 : : ! & mband=hdr%mband,mcg=mcg,mcprj=mcprj,mgfftc=mgfftc, &
152 : : ! & mkmem=mkmem,mpi_enreg=mpi_enreg,mpw=mpw,natom=cryst%natom,&
153 : : ! & nattyp=cryst%nattyp,nfft=nfft,ngfft=ngfftf,nkpt=hdr%nkpt,npwarr= hdr%npwarr , &
154 : : ! &nsppol=dtset%nsppol,ntypat=cryst%ntypat,occ=ebands%occ,&
155 : : ! &pawang=pawang,pawrad=pawrad,pawtab=pawtab,prtvol=dtset%prtvol,psps=psps, &
156 : : ! &rprimd=cryst%rprimd,ucvol=cryst%ucvol, xred=cryst%xred)
157 : : else
158 : : call init_mywfc(mywfc=mywfc, ebands=ebands, wfd=wfd, &
159 : : & cryst=cryst,dtset=dtset, &
160 : : & dtfil=dtfil, hdr=hdr, MPI_enreg=MPI_enreg, nprocs=nprocs, psps=psps, &
161 : 5 : & pawtab=pawtab, rank=rank, comm=spaceComm)
162 : :
163 : : ! TODO: distribute k
164 : 5 : mkmem = mywfc%kset%my_nkpt
165 [ + + ]: 309 : mpw=maxval(mywfc%hdr%npwarr)
166 : 5 : mcg=mpw*nspinor*mband* mkmem *nsppol
167 : 5 : mcprj = nspinor*mband* mkmem*nsppol
168 : : !block
169 : : ! integer :: ik
170 : : ! do ik =1, mkmem
171 : : ! print *, ik, ":", mywfc%ebands%kptns(:, ik)
172 : : ! end do
173 : : !end block
174 : :
175 [ - + ]: 5 : if (present(kg)) then
176 : 0 : ptr_kg=> kg
177 : : else
178 [ - + + - : 15 : ABI_MALLOC(ptr_kg, (3, mpw*mkmem))
+ - + - -
+ - + ]
179 : 5 : call mywfc%get_kgs(ptr_kg)
180 : : end if
181 : : end if
182 : :
183 : : call mlwfovlp(mywfc=mywfc, crystal=cryst, ebands=mywfc%ebands, hdr=mywfc%hdr, atindx1=cryst%atindx1 &
184 : : &,dtset=mywfc%dtset,dtfil=dtfil, &
185 : : & eigen=mywfc%ebands%eig,gprimd=cryst%gprimd,kg=ptr_kg,&
186 : : & mband=mywfc%hdr%mband,mcg=mcg,mcprj=mcprj,mgfftc=mgfftc, &
187 : : & mkmem=mkmem,mpi_enreg=mpi_enreg,mpw=mpw,natom=cryst%natom,&
188 : : & nattyp=cryst%nattyp,nfft=nfft,ngfft=ngfftc,nkpt=mywfc%hdr%nkpt,npwarr= mywfc%hdr%npwarr , &
189 : : &nsppol=dtset%nsppol,ntypat=cryst%ntypat,occ=mywfc%ebands%occ,&
190 : : &pawang=pawang,pawrad=pawrad,pawtab=pawtab,prtvol=dtset%prtvol,psps=psps, &
191 [ - + ]: 19 : &rprimd=cryst%rprimd,ucvol=cryst%ucvol, xred=cryst%xred, exclude_bands=exclude_bands)
192 : :
193 [ + + ]: 19 : if (.not. present(kg)) then
194 [ - + ]: 5 : ABI_FREE(ptr_kg)
195 : : end if
196 : 19 : nullify(ptr_kg)
197 : 19 : end subroutine wfd_run_wannier
198 : :
199 : : end module m_wfd_wannier
|