Line data Source code
1 : !--------------------------------------------------------------------------------
2 : ! Copyright (c) 2022 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
3 : ! This file is part of FLEUR and available as free software under the conditions
4 : ! of the MIT license as expressed in the LICENSE file in more detail.
5 : !--------------------------------------------------------------------------------
6 :
7 : MODULE m_dfpt_cdnval
8 :
9 : USE m_juDFT
10 : #ifdef CPP_MPI
11 : use mpi
12 : #endif
13 :
14 : CONTAINS
15 :
16 0 : SUBROUTINE dfpt_cdnval(eig_id, dfpt_eig_id, fmpi,kpts,jspin,noco,nococonv,input,banddosdummy,cell,atoms,enpara,stars,&
17 : vacuum,sphhar,sym,juphon,vTot,cdnvalJob,den,dosdummy,vacdosdummy,&
18 : hub1inp, cdnvalJob1, resultsdummy, resultsdummy1, bqpt, iDtype, iDir, denIm, l_real,&
19 : qm_eid_id,dfpt_eigm_id,starsmq,resultsdummy1m,cdnvalJob1m)
20 :
21 : USE m_types
22 : USE m_constants
23 : USE m_eig66_io
24 : USE m_abcof
25 : USE m_pwden
26 : USE m_vacden
27 : USE m_cdnmt ! calculate the density and orbital moments etc.
28 : USE m_types_dos
29 : USE m_types_vacdos
30 : #ifdef CPP_MPI
31 : USE m_mpi_col_den ! collect density data from parallel nodes
32 : #endif
33 : USE m_dfpt_rhomt
34 : USE m_dfpt_rhonmt
35 : USE m_genMTBasis
36 : USE m_npy
37 :
38 : IMPLICIT NONE
39 :
40 : TYPE(t_mpi), INTENT(IN) :: fmpi
41 :
42 : TYPE(t_enpara), INTENT(IN) :: enpara
43 : TYPE(t_banddos), INTENT(IN) :: banddosdummy
44 : TYPE(t_dos), INTENT(INOUT) :: dosdummy
45 : TYPE(t_vacdos), INTENT(INOUT) :: vacdosdummy
46 : TYPE(t_input), INTENT(IN) :: input
47 : TYPE(t_vacuum), INTENT(IN) :: vacuum
48 : TYPE(t_noco), INTENT(IN) :: noco
49 : TYPE(t_nococonv), INTENT(IN) :: nococonv
50 : TYPE(t_sym), INTENT(IN) :: sym
51 : TYPE(t_juphon), INTENT(IN) :: juphon
52 : TYPE(t_stars), INTENT(IN) :: stars
53 : TYPE(t_cell), INTENT(IN) :: cell
54 : TYPE(t_kpts), INTENT(IN) :: kpts
55 : TYPE(t_sphhar), INTENT(IN) :: sphhar
56 : TYPE(t_atoms), INTENT(IN) :: atoms
57 : TYPE(t_hub1inp), INTENT(IN) :: hub1inp
58 : TYPE(t_potden), INTENT(IN) :: vTot
59 : TYPE(t_cdnvalJob), INTENT(IN) :: cdnvalJob, cdnvalJob1
60 : TYPE(t_results), INTENT(INOUT) :: resultsdummy, resultsdummy1
61 : TYPE(t_potden), INTENT(INOUT) :: den, denIm
62 :
63 : ! Scalar Arguments
64 : INTEGER, INTENT(IN) :: eig_id, dfpt_eig_id, jspin, iDtype, iDir
65 : LOGICAL, INTENT(IN) :: l_real
66 :
67 : REAL, INTENT(IN) :: bqpt(3)
68 :
69 : INTEGER, OPTIONAL, INTENT(IN) :: qm_eid_id, dfpt_eigm_id
70 : TYPE(t_stars), OPTIONAL, INTENT(IN) :: starsmq
71 : TYPE(t_results), OPTIONAL, INTENT(INOUT) :: resultsdummy1m
72 : TYPE(t_cdnvalJob), OPTIONAL, INTENT(IN) :: cdnvalJob1m
73 :
74 : ! Local Scalars
75 : INTEGER :: ikpt,ikpt_i,jsp_start,jsp_end,ispin,jsp,iType,ikG,iqdir
76 : INTEGER :: iErr,nbands,noccbd,nbands1,iLo,l,imLo,ikLo,ikGLo,nbands1m
77 : INTEGER :: skip_t,skip_tt,nbasfcn,nbasfcnq,nbasfcnmq
78 : REAL :: gExt(3), q_loop(3), bkpt(3)
79 :
80 : ! Local Arrays
81 0 : COMPLEX :: f_b8_dummy(3, atoms%ntype)
82 0 : REAL,ALLOCATABLE :: we(:),eig(:),we1(:),eig1(:),we1m(:),eig1m(:)
83 0 : INTEGER,ALLOCATABLE :: ev_list(:)
84 0 : REAL, ALLOCATABLE :: f(:,:,:,:),g(:,:,:,:),flo(:,:,:,:) ! radial functions
85 :
86 0 : TYPE (t_lapw) :: lapw, lapwq, lapwmq
87 0 : TYPE (t_orb) :: orbdummy
88 0 : TYPE (t_denCoeffs) :: denCoeffs
89 0 : TYPE (t_denCoeffsOffdiag) :: denCoeffsOffdiag
90 0 : TYPE (t_eigVecCoeffs) :: eigVecCoeffs, eigVecCoeffs1, eigVecCoeffsPref, eigVecCoeffs1m
91 0 : TYPE (t_usdus) :: usdus
92 0 : TYPE (t_mat) :: zMat, zMat1, zMatPref, zMat1m
93 0 : TYPE(t_kpts) :: kpts_mod
94 :
95 : LOGICAL :: l_minusq
96 :
97 0 : CALL timestart("dfpt_cdnval")
98 :
99 0 : call timestart("init")
100 :
101 0 : l_minusq = PRESENT(qm_eid_id)
102 0 : IF (noco%l_mperp) THEN
103 : ! when the off-diag. part of the density matrix, i.e. m_x and
104 : ! m_y, is calculated inside the muffin-tins (l_mperp = T), cdnval
105 : ! is called only once. therefore, several spin loops have been
106 : ! added. if l_mperp = F, these loops run only from jspin - jspin.
107 0 : jsp_start = 1
108 0 : jsp_end = 2
109 : ELSE
110 0 : jsp_start = jspin
111 0 : jsp_end = jspin
112 : END IF
113 :
114 0 : ALLOCATE (f(atoms%jmtd,2,0:atoms%lmaxd,input%jspins)) ! Deallocation before mpi_col_den
115 0 : ALLOCATE (g(atoms%jmtd,2,0:atoms%lmaxd,input%jspins))
116 0 : ALLOCATE (flo(atoms%jmtd,2,atoms%nlod,input%jspins))
117 :
118 : ! Initializations
119 0 : CALL usdus%init(atoms,input%jspins)
120 0 : CALL denCoeffs%init(atoms,sphhar,jsp_start,jsp_end)
121 : ! The last entry in denCoeffsOffdiag%init is l_fmpl. It is meant as a switch to a plot of the full magnet.
122 : ! density without the atomic sphere approximation for the magnet. density.
123 0 : CALL denCoeffsOffdiag%init(atoms,noco,sphhar,banddosdummy%l_jDOS,any(noco%l_unrestrictMT).OR.noco%l_mperp)
124 : !CALL orbdummy%init(atoms,noco,jsp_start,jsp_end)
125 :
126 0 : IF (denCoeffsOffdiag%l_fmpl.AND.(.NOT.noco%l_mperp)) CALL juDFT_error("for fmpl set noco%l_mperp = T!" ,calledby ="cdnval")
127 :
128 0 : DO iType = 1, atoms%ntype
129 0 : DO ispin = 1, input%jspins
130 0 : CALL genMTBasis(atoms,enpara,vTot,fmpi,iType,ispin,usdus,f(:,:,0:,ispin),g(:,:,0:,ispin),flo(:,:,:,ispin))
131 : END DO
132 : END DO
133 0 : DEALLOCATE (f,g,flo)
134 :
135 0 : skip_tt = dot_product(enpara%skiplo(:atoms%ntype,jspin),atoms%neq(:atoms%ntype))
136 : IF (noco%l_soc.OR.noco%l_noco) skip_tt = 2 * skip_tt
137 :
138 0 : jsp = MERGE(1,jspin,noco%l_noco)
139 :
140 : ! TODO: There was the idea that some problems stemmed from k+q>0.5, so we tried implementing
141 : ! a backfolding option. This turned out to be unnecessary, but I leave it here for possible
142 : ! future application
143 0 : kpts_mod = kpts
144 0 : DO ikpt_i = 1, size(cdnvalJob%k_list)
145 0 : ikpt=fmpi%k_list(ikpt_i)
146 0 : bkpt = kpts%bk(:, ikpt)
147 : DO iqdir = 1, 3
148 : !IF (bkpt(iqdir)+bqpt(iqdir)>=0.5) bkpt(iqdir) = bkpt(iqdir) - 1.0
149 : !IF (bkpt(iqdir)+bqpt(iqdir)<-0.5) bkpt(iqdir) = bkpt(iqdir) + 1.0
150 : !IF (bkpt(iqdir)+bqpt(iqdir)>=0.5.AND.ABS(bqpt(iqdir))>1e-8) bkpt(iqdir) = bkpt(iqdir) - 1.0
151 : !IF (bkpt(iqdir)+bqpt(iqdir)<-0.5.AND.ABS(bqpt(iqdir))>1e-8) bkpt(iqdir) = bkpt(iqdir) + 1.0
152 : END DO
153 0 : kpts_mod%bk(:, ikpt) = bkpt
154 : END DO
155 :
156 0 : call timestop("init")
157 :
158 0 : DO ikpt_i = 1,size(cdnvalJob%k_list)
159 0 : ikpt=cdnvalJob%k_list(ikpt_i)
160 :
161 0 : CALL lapw%init(input,noco,nococonv, kpts,atoms,sym,ikpt,cell, fmpi)
162 0 : CALL lapwq%init(input,noco,nococonv, kpts_mod,atoms,sym,ikpt,cell, fmpi, bqpt)
163 :
164 0 : IF (l_minusq) CALL lapwmq%init(input,noco,nococonv, kpts_mod,atoms,sym,ikpt,cell, fmpi, -bqpt)
165 :
166 : skip_t = skip_tt
167 0 : ev_list=cdnvaljob%compact_ev_list(ikpt_i,.FALSE.)
168 0 : noccbd = SIZE(ev_list)
169 :
170 0 : we = cdnvalJob%weights(ev_list,ikpt)
171 0 : we1 = cdnvalJob1%weights(ev_list,ikpt)
172 0 : eig = resultsdummy%eig(ev_list,ikpt,jsp)
173 0 : eig1 = resultsdummy1%eig(ev_list,ikpt,jsp)
174 :
175 0 : IF (l_minusq) THEN
176 0 : we1m = cdnvalJob1m%weights(ev_list,ikpt)
177 0 : eig1m = resultsdummy1m%eig(ev_list,ikpt,jsp)
178 : END IF
179 :
180 : IF (cdnvalJob%l_evp) THEN
181 : IF (minval(ev_list) > skip_tt) skip_t = 0
182 : IF (maxval(ev_list) <= skip_tt) skip_t = noccbd
183 : IF ((minval(ev_list) <= skip_tt).AND.(maxval(ev_list) > skip_tt)) skip_t = mod(skip_tt,noccbd)
184 : END IF
185 :
186 0 : nbasfcn = MERGE(lapw%nv(1)+lapw%nv(2)+2*atoms%nlotot,lapw%nv(1)+atoms%nlotot,noco%l_noco)
187 0 : nbasfcnq = MERGE(lapwq%nv(1)+lapwq%nv(2)+2*atoms%nlotot,lapwq%nv(1)+atoms%nlotot,noco%l_noco)
188 :
189 0 : IF (l_minusq) nbasfcnmq = MERGE(lapwmq%nv(1)+lapwmq%nv(2)+2*atoms%nlotot,lapwmq%nv(1)+atoms%nlotot,noco%l_noco)
190 :
191 0 : CALL zMat%init(l_real,nbasfcn,noccbd)
192 0 : CALL zMat1%init(.FALSE.,nbasfcnq,noccbd)
193 0 : CALL zMatPref%init(.FALSE.,nbasfcn,noccbd)
194 :
195 0 : IF (l_minusq) THEN
196 0 : CALL zMat1m%init(.FALSE.,nbasfcnmq,noccbd)
197 : END IF
198 :
199 0 : CALL read_eig(eig_id,ikpt,jsp,list=ev_list,neig=nbands,zmat=zMat)
200 0 : CALL read_eig(dfpt_eig_id,ikpt,jsp,list=ev_list,neig=nbands1,zmat=zMat1)
201 :
202 0 : IF (l_minusq) CALL read_eig(dfpt_eigm_id,ikpt,jsp,list=ev_list,neig=nbands1m,zmat=zMat1m)
203 :
204 : ! TODO: Implement correct spin logic here! Only collinear operational for now!
205 0 : DO ikG = 1, lapw%nv(jsp)
206 0 : gExt = MATMUL(lapw%vk(:, ikG, jsp),cell%bmat)
207 0 : IF (zMat%l_real) THEN
208 0 : zMatPref%data_c(ikG,:) = ImagUnit * gExt(idir) * zMat%data_r(ikG, :)
209 : ELSE
210 0 : zMatPref%data_c(ikG,:) = ImagUnit * gExt(idir) * zMat%data_c(ikG, :)
211 : END IF
212 : END DO
213 :
214 : ! TODO: LOs matching coefficients are unperturbed for now, because they derailed
215 : ! the calculation. Find out why; forces can use the perturbation!
216 : !DO ikG = lapw%nv(jsp) + 1, lapw%nv(jsp) + atoms%nlo(iDtype)
217 : ! iLo = ikG-lapw%nv(jsp)
218 : ! l = atoms%llo(iLo, iDtype)
219 : ! DO imLo = 1, 2*l+1
220 : ! ikLo = lapw%kvec(imLo,iLo,iDtype)
221 : ! ikGLo = lapw%nv(jsp) + lapw%index_lo(iLo,iDtype) + imLo
222 : ! !gExt = MATMUL(cell%bmat,lapw%vk(:,ikLo, jsp))
223 : ! gExt = MATMUL(cell%bmat,lapw%bkpt)
224 : ! IF (zMat%l_real) THEN
225 : ! zMatPref%data_c(ikGLo,:) = ImagUnit * gExt(idir) * zMat%data_r(ikGLo, :)
226 : ! ELSE
227 : ! zMatPref%data_c(ikGLo,:) = ImagUnit * gExt(idir) * zMat%data_c(ikGLo, :)
228 : ! END IF
229 : ! END DO
230 : !END DO
231 :
232 : !IF (.NOT.(nbands==nbands1)) TODO: Can this ever be a problem?
233 : #ifdef CPP_MPI
234 0 : CALL MPI_BARRIER(fmpi%mpi_comm,iErr) ! Synchronizes the RMA operations
235 : #endif
236 :
237 0 : IF (noccbd.LE.0) CYCLE ! Note: This jump has to be after the MPI_BARRIER is called
238 :
239 : ! valence density in the atomic spheres
240 0 : CALL eigVecCoeffs%init(input,atoms,jspin,noccbd,noco%l_mperp)
241 0 : CALL eigVecCoeffs1%init(input,atoms,jspin,noccbd,noco%l_mperp)
242 0 : IF (juphon%l_phonon) CALL eigVecCoeffsPref%init(input,atoms,jspin,noccbd,noco%l_mperp)
243 :
244 0 : IF (l_minusq) CALL eigVecCoeffs1m%init(input,atoms,jspin,noccbd,noco%l_mperp)
245 :
246 0 : DO ispin = jsp_start, jsp_end
247 : ! TODO: Does this spin logic hold for noco?
248 : CALL abcof(input,atoms,sym,cell,lapw,noccbd,usdus,noco,nococonv,ispin,&
249 : eigVecCoeffs%abcof(:,0:,0,:,ispin),eigVecCoeffs%abcof(:,0:,1,:,ispin),&
250 0 : eigVecCoeffs%ccof(-atoms%llod:,:,:,:,ispin),zMat)
251 : CALL abcof(input,atoms,sym,cell,lapwq,noccbd,usdus,noco,nococonv,ispin,&
252 : eigVecCoeffs1%abcof(:,0:,0,:,ispin),eigVecCoeffs1%abcof(:,0:,1,:,ispin),&
253 0 : eigVecCoeffs1%ccof(-atoms%llod:,:,:,:,ispin),zMat1)
254 0 : IF (juphon%l_phonon) CALL abcof(input,atoms,sym,cell,lapw,noccbd,usdus,noco,nococonv,ispin,&
255 : eigVecCoeffsPref%abcof(:,0:,0,:,ispin),eigVecCoeffsPref%abcof(:,0:,1,:,ispin),&
256 0 : eigVecCoeffsPref%ccof(-atoms%llod:,:,:,:,ispin),zMatPref)
257 0 : IF (l_minusq) CALL abcof(input,atoms,sym,cell,lapwmq,noccbd,usdus,noco,nococonv,ispin,&
258 : eigVecCoeffs1m%abcof(:,0:,0,:,ispin),eigVecCoeffs1m%abcof(:,0:,1,:,ispin),&
259 0 : eigVecCoeffs1m%ccof(-atoms%llod:,:,:,:,ispin),zMat1)
260 :
261 0 : IF (juphon%l_phonon) THEN
262 0 : eigVecCoeffs1%abcof(:,0:,:,iDtype,ispin) = eigVecCoeffs1%abcof(:,0:,:,iDtype,ispin) + eigVecCoeffsPref%abcof(:,0:,:,iDtype,ispin)
263 0 : eigVecCoeffs1%ccof(-atoms%llod:,:,:,iDtype,ispin) = eigVecCoeffs1%ccof(-atoms%llod:,:,:,iDtype,ispin) + eigVecCoeffsPref%ccof(-atoms%llod:,:,:,iDtype,ispin)
264 : END IF
265 :
266 0 : IF (l_minusq.AND.juphon%l_phonon) THEN
267 0 : eigVecCoeffs1m%abcof(:,0:,:,iDtype,ispin) = eigVecCoeffs1m%abcof(:,0:,:,iDtype,ispin) + eigVecCoeffsPref%abcof(:,0:,:,iDtype,ispin)
268 0 : eigVecCoeffs1m%ccof(-atoms%llod:,:,:,iDtype,ispin) = eigVecCoeffs1m%ccof(-atoms%llod:,:,:,iDtype,ispin) + eigVecCoeffsPref%ccof(-atoms%llod:,:,:,iDtype,ispin)
269 : END IF
270 :
271 0 : IF (l_minusq) THEN
272 0 : CALL dfpt_rhomt(atoms,we,we1,noccbd,ispin,ispin,-bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
273 0 : CALL dfpt_rhonmt(atoms,sphhar,we,we1,noccbd,ispin,ispin,-bqpt,.TRUE.,.FALSE.,sym,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
274 0 : CALL dfpt_rhomtlo(atoms,noccbd,we,we1,ispin,ispin,-bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
275 0 : CALL dfpt_rhonmtlo(atoms,sphhar,sym,noccbd,we,we1,eigVecCoeffs,eigVecCoeffs1,denCoeffs,ispin,ispin,.TRUE.,-bqpt,eigVecCoeffs1m)
276 : ELSE
277 0 : CALL dfpt_rhomt(atoms,we,we1,noccbd,ispin,ispin,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
278 0 : CALL dfpt_rhonmt(atoms,sphhar,we,we1,noccbd,ispin,ispin,bqpt,.TRUE.,.FALSE.,sym,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
279 0 : CALL dfpt_rhomtlo(atoms,noccbd,we,we1,ispin,ispin,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
280 0 : CALL dfpt_rhonmtlo(atoms,sphhar,sym,noccbd,we,we1,eigVecCoeffs,eigVecCoeffs1,denCoeffs,ispin,ispin,.TRUE.,bqpt)
281 : END IF
282 : END DO ! end loop over ispin
283 0 : IF (noco%l_mperp) then
284 0 : IF (.NOT.l_minusq) THEN
285 0 : call timestart("denCoeffsOffdiag%calcCoefficients")
286 0 : CALL dfpt_rhomt(atoms,we,we1,noccbd,2,1,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
287 0 : CALL dfpt_rhonmt(atoms,sphhar,we,we1,noccbd,2,1,bqpt,.TRUE.,.FALSE.,sym,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
288 0 : CALL dfpt_rhomtlo(atoms,noccbd,we,we1,2,1,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
289 0 : CALL dfpt_rhonmtlo(atoms,sphhar,sym,noccbd,we,we1,eigVecCoeffs,eigVecCoeffs1,denCoeffs,2,1,.TRUE.,bqpt,eigVecCoeffs1m)
290 0 : CALL dfpt_rhomt(atoms,we,we1,noccbd,1,2,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
291 0 : CALL dfpt_rhonmt(atoms,sphhar,we,we1,noccbd,1,2,bqpt,.TRUE.,.FALSE.,sym,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
292 0 : CALL dfpt_rhomtlo(atoms,noccbd,we,we1,1,2,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs,eigVecCoeffs1m)
293 0 : CALL dfpt_rhonmtlo(atoms,sphhar,sym,noccbd,we,we1,eigVecCoeffs,eigVecCoeffs1,denCoeffs,1,2,.TRUE.,bqpt,eigVecCoeffs1m)
294 0 : call timestop("denCoeffsOffdiag%calcCoefficients")
295 : ELSE
296 0 : call timestart("denCoeffsOffdiag%calcCoefficients")
297 0 : CALL dfpt_rhomt(atoms,we,we1,noccbd,2,1,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
298 0 : CALL dfpt_rhonmt(atoms,sphhar,we,we1,noccbd,2,1,bqpt,.TRUE.,.FALSE.,sym,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
299 0 : CALL dfpt_rhomtlo(atoms,noccbd,we,we1,2,1,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
300 0 : CALL dfpt_rhonmtlo(atoms,sphhar,sym,noccbd,we,we1,eigVecCoeffs,eigVecCoeffs1,denCoeffs,2,1,.TRUE.,bqpt)
301 0 : CALL dfpt_rhomt(atoms,we,we1,noccbd,1,2,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
302 0 : CALL dfpt_rhonmt(atoms,sphhar,we,we1,noccbd,1,2,bqpt,.TRUE.,.FALSE.,sym,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
303 0 : CALL dfpt_rhomtlo(atoms,noccbd,we,we1,1,2,bqpt,.TRUE.,eigVecCoeffs,eigVecCoeffs1,denCoeffs)
304 0 : CALL dfpt_rhonmtlo(atoms,sphhar,sym,noccbd,we,we1,eigVecCoeffs,eigVecCoeffs1,denCoeffs,1,2,.TRUE.,bqpt)
305 0 : call timestop("denCoeffsOffdiag%calcCoefficients")
306 : END IF
307 : endif
308 :
309 : ! valence density in the interstitial and vacuum region has to be called only once (if jspin=1) in the non-collinear case
310 0 : IF (.NOT.((jspin.EQ.2).AND.noco%l_noco)) THEN
311 : ! valence density in the interstitial region
312 0 : IF (.NOT.l_minusq) THEN
313 : CALL pwden(stars,kpts,banddosdummy ,input,fmpi,noco,nococonv,cell,atoms,sym,ikpt,&
314 0 : jspin,lapw,noccbd,ev_list,we,eig,den,resultsdummy,f_b8_dummy,zMat,dosdummy,bqpt,lapwq,we1,zMat1,iDir)
315 : ELSE
316 : CALL pwden(stars,kpts,banddosdummy ,input,fmpi,noco,nococonv,cell,atoms,sym,ikpt,&
317 0 : jspin,lapw,noccbd,ev_list,we,eig,den,resultsdummy,f_b8_dummy,zMat,dosdummy,bqpt,lapwq,we1,zMat1,iDir,lapwmq,zMat1m)
318 : END IF
319 0 : IF (input%film) THEN
320 : CALL vacden(vacuum,stars,input,cell,atoms,noco,nococonv,banddosdummy,&
321 0 : we,ikpt,jspin,REAL(vTot%vac(:,1,:,:)),noccbd,ev_list,lapw,enpara%evac,den,zMat,vacdosdummy,dosdummy,lapwq,we1,zMat1)
322 : END IF
323 : END IF
324 : END DO ! end of k-point loop
325 :
326 : #ifdef CPP_MPI
327 0 : DO ispin = jsp_start,jsp_end
328 : CALL mpi_col_den(fmpi,sphhar,atoms,stars,vacuum,input,noco,ispin,dosdummy,vacdosdummy,&
329 0 : resultsdummy,denCoeffs,orbdummy,denCoeffsOffdiag,den)
330 : END DO
331 : #endif
332 :
333 0 : IF (fmpi%irank==0) THEN
334 0 : CALL timestart("cdnmt")
335 : CALL cdnmt(input%jspins,input,atoms,sym,sphhar,noco,jsp_start,jsp_end,enpara,banddosdummy,&
336 0 : vTot%mt(:,0,:,:),denCoeffs,usdus,orbdummy,denCoeffsOffdiag,den%mt,hub1inp,rhoIm=denIm%mt)
337 0 : CALL timestop("cdnmt")
338 : END IF
339 :
340 0 : CALL timestop("dfpt_cdnval")
341 :
342 0 : END SUBROUTINE dfpt_cdnval
343 :
344 : END MODULE m_dfpt_cdnval
|