Branch data Line data Source code
1 : : !!****m* ABINIT/m_opernlc_ylm
2 : : !! NAME
3 : : !! m_opernlc_ylm
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !! COPYRIGHT
8 : : !! Copyright (C) 2008-2026 ABINIT group (MT)
9 : : !! This file is distributed under the terms of the
10 : : !! GNU General Public License, see ~abinit/COPYING
11 : : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : : !!
13 : : !! SOURCE
14 : :
15 : : #if defined HAVE_CONFIG_H
16 : : #include "config.h"
17 : : #endif
18 : :
19 : : #include "abi_common.h"
20 : :
21 : : module m_opernlc_ylm
22 : :
23 : : use defs_basis
24 : : use m_errors
25 : : use m_abicore
26 : : use m_xmpi
27 : : use m_xomp
28 : :
29 : : use defs_abitypes, only : MPI_type
30 : : implicit none
31 : :
32 : : private
33 : : !!***
34 : :
35 : : public :: opernlc_ylm
36 : : public :: ls_ylm
37 : : !!***
38 : :
39 : : contains
40 : : !!***
41 : :
42 : : !!****f* ABINIT/opernlc_ylm
43 : : !! NAME
44 : : !! opernlc_ylm
45 : : !!
46 : : !! FUNCTION
47 : : !! * Operate with the non-local part of the hamiltonian,
48 : : !! in order to reduce projected scalars
49 : : !! * Operate with the non-local projectors and the overlap matrix,
50 : : !! in order to reduce projected scalars
51 : : !!
52 : : !! INPUTS
53 : : !! atindx1(natom)=index table for atoms (gives the absolute index of
54 : : !! an atom from its rank in a block of atoms)
55 : : !! cplex=1 if <p_lmn|c> scalars are real (equivalent to istwfk>1)
56 : : !! 2 if <p_lmn|c> scalars are complex
57 : : !! cplex_dgxdt(ndgxdt) = used only when cplex = 1
58 : : !! cplex_dgxdt(i) = 1 if dgxdt(1,i,:,:) is real, 2 if it is pure imaginary
59 : : !! cplex_enl=1 if enl factors are real, 2 if they are complex
60 : : !! cplex_fac=1 if gxfac scalars are real, 2 if gxfac scalars are complex
61 : : !! dgxdt(cplex,ndgxdt,nlmn,nincat)=grads of projected scalars (only if optder>0)
62 : : !! dimenl1,dimenl2=dimensions of enl (see enl)
63 : : !! dimekbq=1 if enl factors do not contain a exp(-iqR) phase, 2 is they do
64 : : !! enl(cplex_enl*dimenl1,dimenl2,nspinortot**2,dimekbq)=
65 : : !! ->Norm conserving : ==== when paw_opt=0 ====
66 : : !! (Real) Kleinman-Bylander energies (hartree)
67 : : !! dimenl1=lmnmax - dimenl2=ntypat
68 : : !! dimekbq is 2 if Enl contains a exp(-iqR) phase, 1 otherwise
69 : : !! ->PAW : ==== when paw_opt=1, 2 or 4 ====
70 : : !! (Real or complex, hermitian) Dij coefs to connect projectors
71 : : !! dimenl1=cplex_enl*lmnmax*(lmnmax+1)/2 - dimenl2=natom
72 : : !! These are complex numbers if cplex_enl=2
73 : : !! enl(:,:,1) contains Dij^up-up
74 : : !! enl(:,:,2) contains Dij^dn-dn
75 : : !! enl(:,:,3) contains Dij^up-dn (only if nspinor=2)
76 : : !! enl(:,:,4) contains Dij^dn-up (only if nspinor=2)
77 : : !! dimekbq is 2 if Dij contains a exp(-iqR) phase, 1 otherwise
78 : : !! gx(cplex,nlmn,nincat*abs(enl_opt))= projected scalars
79 : : !! iatm=absolute rank of first atom of the current block of atoms
80 : : !! indlmn(6,nlmn)= array giving l,m,n,lm,ln,s for i=lmn
81 : : !! itypat=type of atoms
82 : : !! lambda=factor to be used when computing (Vln-lambda.S) - only for paw_opt=2
83 : : !! mpi_enreg=information about MPI parallelization
84 : : !! natom=number of atoms in cell
85 : : !! ndgxdt=second dimension of dgxdt
86 : : !! ndgxdtfac=second dimension of dgxdtfac
87 : : !! nincat=number of atoms in the subset here treated
88 : : !! nlmn=number of (l,m,n) numbers for current type of atom
89 : : !! nspinor= number of spinorial components of the wavefunctions (on current proc)
90 : : !! nspinortot=total number of spinorial components of the wavefunctions
91 : : !! optder=0=only gxfac is computed, 1=both gxfac and dgxdtfac are computed
92 : : !! 2=gxfac, dgxdtfac and d2gxdtfac are computed
93 : : !! paw_opt= define the nonlocal operator concerned with:
94 : : !! paw_opt=0 : Norm-conserving Vnl (use of Kleinman-Bylander ener.)
95 : : !! paw_opt=1 : PAW nonlocal part of H (use of Dij coeffs)
96 : : !! paw_opt=2 : PAW: (Vnl-lambda.Sij) (Sij=overlap matrix)
97 : : !! paw_opt=3 : PAW overlap matrix (Sij)
98 : : !! paw_opt=4 : both PAW nonlocal part of H (Dij) and overlap matrix (Sij)
99 : : !! sij(nlm*(nlmn+1)/2)=overlap matrix components (only if paw_opt=2, 3 or 4)
100 : : !!
101 : : !! OUTPUT
102 : : !! if (paw_opt=0, 1, 2 or 4)
103 : : !! gxfac(cplex_fac,nlmn,nincat,nspinor)= reduced projected scalars related to Vnl (NL operator)
104 : : !! if (paw_opt=3 or 4)
105 : : !! gxfac_sij(cplex,nlmn,nincat,nspinor)= reduced projected scalars related to Sij (overlap)
106 : : !! if (optder==1.and.paw_opt=0, 1, 2 or 4)
107 : : !! dgxdtfac(cplex_fac,ndgxdtfac,nlmn,nincat,nspinor)= gradients of gxfac related to Vnl (NL operator)
108 : : !! if (optder==1.and.paw_opt=3 or 4)
109 : : !! dgxdtfac_sij(cplex,ndgxdtfac,nlmn,nincat,nspinor)= gradients of gxfac related to Sij (overlap)
110 : : !!
111 : : !! NOTES
112 : : !! This routine operates for one type of atom, and within this given type of atom,
113 : : !! for a subset of at most nincat atoms.
114 : : !!
115 : : !! About the non-local factors symmetry:
116 : : !! - The lower triangular part of the Dij matrix can be deduced from the upper one
117 : : !! with the following relation: D^s2s1_ji = (D^s1s2_ij)^*
118 : : !! where s1,s2 are spinor components
119 : : !! - The Dij factors can contain a exp(-iqR) phase
120 : : !! This phase does not have to be included in the symmetry rule
121 : : !! For that reason, we first apply the real part (cos(qR).D^s1s2_ij)
122 : : !! then, we apply the imaginary part (-sin(qR).D^s1s2_ij)
123 : : !!
124 : : !! SOURCE
125 : :
126 : 35673080 : subroutine opernlc_ylm(atindx1,cplex,cplex_dgxdt,cplex_d2gxdt,cplex_enl,cplex_fac,&
127 : 35673080 : & dgxdt,dgxdtfac,dgxdtfac_sij,d2gxdt,d2gxdtfac,d2gxdtfac_sij,dimenl1,dimenl2,dimekbq,enl,&
128 : 35673080 : & gx,gxfac,gxfac_sij,iatm,indlmn,itypat,lambda,mpi_enreg,natom,ndgxdt,ndgxdtfac,&
129 : 35673080 : & nd2gxdt,nd2gxdtfac,nincat,nlmn,nspinor,nspinortot,optder,paw_opt,sij)
130 : :
131 : : !Arguments ------------------------------------
132 : : !scalars
133 : : integer,intent(in) :: cplex,cplex_enl,cplex_fac,dimenl1,dimenl2,dimekbq,iatm,itypat
134 : : integer,intent(in) :: natom,ndgxdt,ndgxdtfac,nd2gxdt,nd2gxdtfac,nincat,nspinor,nspinortot,optder,paw_opt
135 : : integer,intent(inout) :: nlmn
136 : : real(dp) :: lambda
137 : : type(MPI_type) , intent(in) :: mpi_enreg
138 : : !arrays
139 : : integer,intent(in) :: atindx1(natom),indlmn(6,nlmn),cplex_dgxdt(ndgxdt),cplex_d2gxdt(nd2gxdt)
140 : : real(dp),intent(in) :: dgxdt(cplex,ndgxdt,nlmn,nincat,nspinor)
141 : : real(dp),intent(in) :: d2gxdt(cplex,nd2gxdt,nlmn,nincat,nspinor)
142 : : real(dp),intent(in),target :: enl(dimenl1,dimenl2,nspinortot**2,dimekbq)
143 : : real(dp),intent(inout) :: gx(cplex,nlmn,nincat,nspinor)
144 : : real(dp),intent(in) :: sij(((paw_opt+1)/3)*nlmn*(nlmn+1)/2)
145 : : real(dp),intent(out),target :: dgxdtfac(cplex_fac,ndgxdtfac,nlmn,nincat,nspinor)
146 : : real(dp),intent(out) :: dgxdtfac_sij(cplex,ndgxdtfac,nlmn,nincat,nspinor*(paw_opt/3))
147 : : real(dp),intent(out),target :: d2gxdtfac(cplex_fac,nd2gxdtfac,nlmn,nincat,nspinor)
148 : : real(dp),intent(out) :: d2gxdtfac_sij(cplex,nd2gxdtfac,nlmn,nincat,nspinor*(paw_opt/3))
149 : : real(dp),intent(out),target :: gxfac(cplex_fac,nlmn,nincat,nspinor)
150 : : real(dp),intent(out) :: gxfac_sij(cplex,nlmn,nincat,nspinor*(paw_opt/3))
151 : :
152 : : !Local variables-------------------------------
153 : : !Arrays
154 : : !scalars
155 : : integer :: cplex_,ia,ierr,ijlmn,ijspin,ilm,ilmn,i0lmn,iln,index_enl,iphase,ispinor,ispinor_index
156 : : integer :: j0lmn,jilmn,jispin,jjlmn,jlm,jlmn,jspinor,jspinor_index,mu,shift
157 : : integer :: ll_so, klm_so, lmax_so, nlmso, sign_so
158 : : real(dp) :: sijr
159 : : real(dp) :: ekb_so, ls_uu_im, ls_ud_re, ls_ud_im
160 : 35673080 : real(dp), allocatable :: ls_ylm_so(:,:,:)
161 : : !arrays
162 : 71346160 : real(dp) :: enl_(2),gxfi(2),gxi(cplex),gxj(cplex)
163 : 35673080 : real(dp),allocatable :: d2gxdtfac_offdiag(:,:,:,:,:),dgxdtfac_offdiag(:,:,:,:,:)
164 : 35673080 : real(dp),allocatable :: gxfac_offdiag(:,:,:,:),gxfj(:,:)
165 : 35673080 : real(dp),pointer :: d2gxdtfac_(:,:,:,:,:),dgxdtfac_(:,:,:,:,:),gxfac_(:,:,:,:)
166 : 35673080 : real(dp),pointer :: enl_ptr(:,:,:)
167 : :
168 : : ! *************************************************************************
169 : :
170 : : DBG_ENTER("COLL")
171 : :
172 : : !Parallelization over spinors treatment
173 : 84248 : shift=0;if (mpi_enreg%paral_spinor==1) shift=mpi_enreg%me_spinor
174 : :
175 : : !When Enl factors contain a exp(-iqR) phase:
176 : : ! - We loop over the real and imaginary parts
177 : : ! - We need an additional memory space
178 [ + + ]: 76674300 : do iphase=1,dimekbq
179 [ + + ]: 41001220 : if (paw_opt==3) cycle
180 [ + + ]: 38694028 : if (iphase==1) then
181 : 33365888 : gxfac_ => gxfac ; dgxdtfac_ => dgxdtfac ; d2gxdtfac_ => d2gxdtfac
182 : : else
183 [ - + ]: 5328140 : ABI_CHECK(cplex_fac==2,"BUG: invalid cplex_fac==1 when dimekbq=2!")
184 [ - + + - : 31968840 : ABI_MALLOC(gxfac_,(cplex_fac,nlmn,nincat,nspinor))
- + + - -
+ + - - +
+ - + - +
- - + -
+ ]
185 [ + + ]: 5328140 : if (optder>=1) then
186 [ - + + - : 775908 : ABI_MALLOC(dgxdtfac_,(cplex_fac,ndgxdtfac,nlmn,nincat,nspinor))
- + + - -
+ + - - +
+ - - + +
- + - + -
- + - + ]
187 : : end if
188 [ - + ]: 5328140 : if (optder>=2) then
189 [ # # # # : 0 : ABI_MALLOC(d2gxdtfac_,(cplex_fac,nd2gxdtfac,nlmn,nincat,nspinor))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # ]
190 : : end if
191 : : end if
192 [ + + + + : 1795896100 : gxfac_=zero
+ + + + ]
193 [ + + + + : 272977532 : if (optder>=1) dgxdtfac_=zero
+ + + + +
+ + + ]
194 [ + + + + : 109011289 : if (optder>=2) d2gxdtfac_=zero
+ + + + +
+ + + ]
195 : 38694028 : enl_ptr => enl(:,:,:,iphase)
196 : :
197 : : !NC+SO: precompute L.S matrix once (reused by gxfac, dgxdtfac, d2gxdtfac blocks below)
198 : 38694028 : lmax_so = 0
199 [ + + + + : 38694028 : if (paw_opt==0.and.nspinortot==2.and.nspinor==nspinortot) then
+ - ]
200 [ + + + + : 137970 : if (any(indlmn(6,1:nlmn)==2)) then
+ + ]
201 [ + + ]: 170820 : do ilmn=1,nlmn
202 [ + + ]: 170820 : if (indlmn(6,ilmn)==2) lmax_so = max(lmax_so, indlmn(1,ilmn))
203 : : end do
204 [ + - ]: 6570 : if (lmax_so > 0) then
205 : 6570 : nlmso = (lmax_so+1)**2*((lmax_so+1)**2+1)/2
206 [ - + + - : 26280 : ABI_MALLOC(ls_ylm_so,(2,nlmso,2))
+ - + - -
+ - + -
+ ]
207 : 6570 : call ls_ylm(ls_ylm_so, lmax_so)
208 : : end if
209 : : end if
210 : : end if
211 : :
212 : : !Accumulate gxfac related to non-local operator (Norm-conserving)
213 : : !-------------------------------------------------------------------
214 [ + + ]: 38694028 : if (paw_opt==0) then
215 : : !Enl is E(Kleinman-Bylander)
216 [ - + ]: 9449245 : ABI_CHECK(cplex_enl/=2,"BUG: invalid cplex_enl=2!")
217 [ - + ]: 9449245 : ABI_CHECK(cplex_fac==cplex,"BUG: invalid cplex_fac/=cplex!")
218 : : !$OMP PARALLEL &
219 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,ilmn,iln,enl_)
220 : : #ifdef FC_NVHPC
221 : : !FIXME Compiler bug since v24.1~24.9
222 : : !$OMP DO COLLAPSE(2)
223 : : #else
224 : : !$OMP DO COLLAPSE(3)
225 : : #endif
226 [ + + ]: 18911630 : do ispinor=1,nspinor
227 [ + + ]: 30758928 : do ia=1,nincat
228 [ + + ]: 144341753 : do ilmn=1,nlmn
229 [ + + ]: 123032070 : if (indlmn(6,ilmn)==2) cycle ! NC+SO: SO projectors handled separately below
230 : 122887530 : ispinor_index=ispinor+shift
231 : 122887530 : iln=indlmn(5,ilmn)
232 : 122887530 : enl_(1)=enl_ptr(iln,itypat,ispinor_index)
233 [ + + ]: 380132032 : gxfac_(1:cplex,ilmn,ia,ispinor)=enl_(1)*gx(1:cplex,ilmn,ia,ispinor)
234 : : end do
235 : : end do
236 : : end do
237 : : !$OMP END DO
238 : : !$OMP END PARALLEL
239 : : end if
240 : :
241 : : ! NC+SO: real-Ylm L.S coupling ---
242 [ + + ]: 38694028 : if (lmax_so > 0) then
243 [ + + ]: 13140 : do ia=1,nincat
244 [ + + ]: 177390 : do ilmn=1,nlmn
245 [ + + ]: 164250 : if (indlmn(6,ilmn)/=2) cycle
246 : 72270 : iln = indlmn(5,ilmn)
247 : 72270 : ekb_so = enl_ptr(iln,itypat,1)
248 [ - + ]: 72270 : if (abs(ekb_so)<tol16) cycle
249 : 72270 : ll_so = indlmn(1,ilmn)
250 : 72270 : ilm = indlmn(4,ilmn)
251 [ + + ]: 1885590 : do jlmn=1,nlmn
252 [ + + ]: 1806750 : if (indlmn(6,jlmn)/=2) cycle
253 [ + + ]: 794970 : if (indlmn(1,jlmn)/=ll_so) cycle
254 [ + + ]: 400770 : if (indlmn(3,jlmn)/=indlmn(3,ilmn)) cycle
255 : 282510 : jlm = indlmn(4,jlmn)
256 [ + + ]: 282510 : if (ilm<=jlm) then
257 : 177390 : klm_so = jlm*(jlm-1)/2 + ilm
258 : 177390 : sign_so = 1
259 : : else
260 : 105120 : klm_so = ilm*(ilm-1)/2 + jlm
261 : 105120 : sign_so = -1
262 : : end if
263 : 282510 : ls_uu_im = sign_so * ls_ylm_so(2,klm_so,1)
264 : 282510 : ls_ud_re = sign_so * ls_ylm_so(1,klm_so,2)
265 : 282510 : ls_ud_im = sign_so * ls_ylm_so(2,klm_so,2)
266 : : ! up-up: Re(<up|LS|up>)=0, only Im contributes
267 : 282510 : gxfac_(1,ilmn,ia,1)=gxfac_(1,ilmn,ia,1) - ekb_so*ls_uu_im*gx(2,jlmn,ia,1)
268 : 282510 : gxfac_(2,ilmn,ia,1)=gxfac_(2,ilmn,ia,1) + ekb_so*ls_uu_im*gx(1,jlmn,ia,1)
269 : : ! up-dn
270 : : gxfac_(1,ilmn,ia,1)=gxfac_(1,ilmn,ia,1) &
271 : 282510 : & + ekb_so*(ls_ud_re*gx(1,jlmn,ia,2) - ls_ud_im*gx(2,jlmn,ia,2))
272 : : gxfac_(2,ilmn,ia,1)=gxfac_(2,ilmn,ia,1) &
273 : 282510 : & + ekb_so*(ls_ud_re*gx(2,jlmn,ia,2) + ls_ud_im*gx(1,jlmn,ia,2))
274 : : ! dn-up: Re=-ls_ud_re, Im=+ls_ud_im
275 : : gxfac_(1,ilmn,ia,2)=gxfac_(1,ilmn,ia,2) &
276 : 282510 : & + ekb_so*(-ls_ud_re*gx(1,jlmn,ia,1) - ls_ud_im*gx(2,jlmn,ia,1))
277 : : gxfac_(2,ilmn,ia,2)=gxfac_(2,ilmn,ia,2) &
278 : 282510 : & + ekb_so*(-ls_ud_re*gx(2,jlmn,ia,1) + ls_ud_im*gx(1,jlmn,ia,1))
279 : : ! dn-dn: Im=-ls_uu_im
280 : 282510 : gxfac_(1,ilmn,ia,2)=gxfac_(1,ilmn,ia,2) + ekb_so*ls_uu_im*gx(2,jlmn,ia,2)
281 : 1971000 : gxfac_(2,ilmn,ia,2)=gxfac_(2,ilmn,ia,2) - ekb_so*ls_uu_im*gx(1,jlmn,ia,2)
282 : : end do ! jlmn
283 : : end do ! ilmn
284 : : end do ! ia
285 : : end if ! NC+SO
286 : :
287 : : !Accumulate gxfac related to nonlocal operator (PAW)
288 : : !-------------------------------------------------------------------
289 [ + + ]: 38694028 : if (paw_opt==1.or.paw_opt==2.or.paw_opt==4) then
290 : : !Enl is psp strength Dij or (Dij-lambda.Sij)
291 : :
292 : : ! === Diagonal term(s) (up-up, down-down)
293 : :
294 : : ! 1-Enl is real
295 [ + + ]: 29244783 : if (cplex_enl==1) then
296 : : !$OMP PARALLEL &
297 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
298 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,gxj,ilmn,i0lmn,ijlmn,gxi)
299 : : !$OMP DO COLLAPSE(3)
300 [ + + ]: 52625086 : do ispinor=1,nspinor
301 [ + + ]: 87994247 : do ia=1,nincat
302 [ + + ]: 409431339 : do jlmn=1,nlmn
303 : 347749635 : ispinor_index=ispinor+shift
304 : 347749635 : index_enl=atindx1(iatm+ia)
305 : 347749635 : j0lmn=jlmn*(jlmn-1)/2
306 : 347749635 : jjlmn=j0lmn+jlmn
307 : 347749635 : enl_(1)=enl_ptr(jjlmn,index_enl,ispinor_index)
308 [ + + ]: 347749635 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
309 [ + + ]: 1006359185 : gxj(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
310 [ + + ]: 1006359185 : gxfac_(1:cplex,jlmn,ia,ispinor)=gxfac_(1:cplex,jlmn,ia,ispinor)+enl_(1)*gxj(1:cplex)
311 [ + + ]: 2252113372 : do ilmn=1,jlmn-1
312 : 1868994576 : ijlmn=j0lmn+ilmn
313 : 1868994576 : enl_(1)=enl_ptr(ijlmn,index_enl,ispinor_index)
314 [ + + ]: 1868994576 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
315 [ + + ]: 5454695917 : gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
316 [ + + ]: 5454695917 : gxfac_(1:cplex,jlmn,ia,ispinor)=gxfac_(1:cplex,jlmn,ia,ispinor)+enl_(1)*gxi(1:cplex)
317 : : #if !defined HAVE_OPENMP
318 [ + + ]: 5802445552 : gxfac_(1:cplex,ilmn,ia,ispinor)=gxfac_(1:cplex,ilmn,ia,ispinor)+enl_(1)*gxj(1:cplex)
319 : : #endif
320 : : end do
321 : : #if defined HAVE_OPENMP
322 : : if(jlmn<nlmn) then
323 : : do ilmn=jlmn+1,nlmn
324 : : i0lmn=(ilmn*(ilmn-1)/2)
325 : : ijlmn=i0lmn+jlmn
326 : : enl_(1)=enl_ptr(ijlmn,index_enl,ispinor_index)
327 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
328 : : gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
329 : : gxfac_(1:cplex,jlmn,ia,ispinor)=gxfac_(1:cplex,jlmn,ia,ispinor)+enl_(1)*gxi(1:cplex)
330 : : end do
331 : : end if
332 : : #endif
333 : : end do
334 : : end do
335 : : end do
336 : : !$OMP END DO
337 : : !$OMP END PARALLEL
338 : :
339 : : ! 2-Enl is complex ===== D^ss'_ij=D^s's_ji^*
340 : : else
341 [ - + ]: 2932240 : ABI_CHECK(cplex_fac==cplex_enl,"BUG: invalid cplex_fac/=cplex_enl!")
342 : :
343 [ + + ]: 2932240 : if (nspinortot==1) then ! -------------> NO SPINORS
344 : :
345 : : !$OMP PARALLEL &
346 : : !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,jjlmn,enl_,gxj,ilmn,i0lmn,ijlmn,gxi)
347 [ + + ]: 1707526 : do ia=1,nincat
348 : 853763 : index_enl=atindx1(iatm+ia)
349 : : !$OMP DO
350 [ + + ]: 8537630 : do jlmn=1,nlmn
351 : 6830104 : j0lmn=jlmn*(jlmn-1)/2
352 : 6830104 : jjlmn=j0lmn+jlmn
353 : 6830104 : enl_(1)=enl_ptr(2*jjlmn-1,index_enl,1)
354 [ - + ]: 6830104 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
355 [ + + ]: 20490312 : gxj(1:cplex)=gx(1:cplex,jlmn,ia,1)
356 : 6830104 : gxfac_(1,jlmn,ia,1)=gxfac_(1,jlmn,ia,1)+enl_(1)*gxj(1)
357 [ + - ]: 6830104 : if (cplex==2) gxfac_(2,jlmn,ia,1)=gxfac_(2,jlmn,ia,1)+enl_(1)*gxj(2)
358 [ + + ]: 31589231 : do ilmn=1,jlmn-1
359 : 23905364 : ijlmn=j0lmn+ilmn
360 [ + + ]: 71716092 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,1)
361 [ - + ]: 23905364 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
362 [ + + ]: 71716092 : gxi(1:cplex)=gx(1:cplex,ilmn,ia,1)
363 : 23905364 : gxfac_(1,jlmn,ia,1)=gxfac_(1,jlmn,ia,1)+enl_(1)*gxi(1)
364 : 23905364 : gxfac_(2,jlmn,ia,1)=gxfac_(2,jlmn,ia,1)-enl_(2)*gxi(1)
365 : : #if !defined HAVE_OPENMP
366 : 23905364 : gxfac_(1,ilmn,ia,1)=gxfac_(1,ilmn,ia,1)+enl_(1)*gxj(1)
367 : 23905364 : gxfac_(2,ilmn,ia,1)=gxfac_(2,ilmn,ia,1)+enl_(2)*gxj(1)
368 : : #endif
369 [ + - ]: 30735468 : if (cplex==2) then
370 : 23905364 : gxfac_(1,jlmn,ia,1)=gxfac_(1,jlmn,ia,1)+enl_(2)*gxi(2)
371 : 23905364 : gxfac_(2,jlmn,ia,1)=gxfac_(2,jlmn,ia,1)+enl_(1)*gxi(2)
372 : : #if !defined HAVE_OPENMP
373 : 23905364 : gxfac_(1,ilmn,ia,1)=gxfac_(1,ilmn,ia,1)-enl_(2)*gxj(2)
374 : 23905364 : gxfac_(2,ilmn,ia,1)=gxfac_(2,ilmn,ia,1)+enl_(1)*gxj(2)
375 : : #endif
376 : : end if
377 : : end do
378 : : #if defined HAVE_OPENMP
379 : : if(jlmn<nlmn) then
380 : : do ilmn=jlmn+1,nlmn
381 : : i0lmn=ilmn*(ilmn-1)/2
382 : : ijlmn=i0lmn+jlmn
383 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,1)
384 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
385 : : gxi(1:cplex)=gx(1:cplex,ilmn,ia,1)
386 : : gxfac_(1,jlmn,ia,1)=gxfac_(1,jlmn,ia,1)+enl_(1)*gxi(1)
387 : : gxfac_(2,jlmn,ia,1)=gxfac_(2,jlmn,ia,1)+enl_(2)*gxi(1)
388 : : if (cplex==2) then
389 : : gxfac_(1,jlmn,ia,1)=gxfac_(1,jlmn,ia,1)-enl_(2)*gxi(2)
390 : : gxfac_(2,jlmn,ia,1)=gxfac_(2,jlmn,ia,1)+enl_(1)*gxi(2)
391 : : end if
392 : : end do
393 : : end if
394 : : #endif
395 : : end do
396 : : !$OMP END DO
397 : : end do
398 : : !$OMP END PARALLEL
399 : :
400 : : else ! -------------> SPINORIAL CASE
401 : :
402 : : ! === Diagonal term(s) (up-up, down-down)
403 : :
404 : : !$OMP PARALLEL &
405 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
406 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,gxj,ilmn,i0lmn,ijlmn,gxi)
407 [ + + ]: 6151183 : do ispinor=1,nspinor
408 : 4072706 : ispinor_index=ispinor+shift
409 [ + + ]: 11536833 : do ia=1,nincat
410 : 5385650 : index_enl=atindx1(iatm+ia)
411 : : !$OMP DO
412 [ + + ]: 98617340 : do jlmn=1,nlmn
413 : 89158984 : j0lmn=jlmn*(jlmn-1)/2
414 : 89158984 : jjlmn=j0lmn+jlmn
415 : 89158984 : enl_(1)=enl_ptr(2*jjlmn-1,index_enl,ispinor_index)
416 [ + + ]: 89158984 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
417 [ + + ]: 267476952 : gxj(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
418 : 89158984 : gxfac_(1,jlmn,ia,ispinor)=gxfac_(1,jlmn,ia,ispinor)+enl_(1)*gxj(1)
419 [ + - ]: 89158984 : if (cplex==2) gxfac_(2,jlmn,ia,ispinor)=gxfac_(2,jlmn,ia,ispinor)+enl_(1)*gxj(2)
420 [ + + ]: 957332100 : do ilmn=1,jlmn-1
421 : 862787466 : ijlmn=j0lmn+ilmn
422 [ + + ]: 2588362398 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
423 [ + + ]: 862787466 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
424 [ + + ]: 2588362398 : gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
425 : 862787466 : gxfac_(1,jlmn,ia,ispinor)=gxfac_(1,jlmn,ia,ispinor)+enl_(1)*gxi(1)
426 : 862787466 : gxfac_(2,jlmn,ia,ispinor)=gxfac_(2,jlmn,ia,ispinor)-enl_(2)*gxi(1)
427 : : #if !defined HAVE_OPENMP
428 : 862787466 : gxfac_(1,ilmn,ia,ispinor)=gxfac_(1,ilmn,ia,ispinor)+enl_(1)*gxj(1)
429 : 862787466 : gxfac_(2,ilmn,ia,ispinor)=gxfac_(2,ilmn,ia,ispinor)+enl_(2)*gxj(1)
430 : : #endif
431 [ + - ]: 951946450 : if (cplex==2) then
432 : 862787466 : gxfac_(1,jlmn,ia,ispinor)=gxfac_(1,jlmn,ia,ispinor)+enl_(2)*gxi(2)
433 : 862787466 : gxfac_(2,jlmn,ia,ispinor)=gxfac_(2,jlmn,ia,ispinor)+enl_(1)*gxi(2)
434 : : #if !defined HAVE_OPENMP
435 : 862787466 : gxfac_(1,ilmn,ia,ispinor)=gxfac_(1,ilmn,ia,ispinor)-enl_(2)*gxj(2)
436 : 862787466 : gxfac_(2,ilmn,ia,ispinor)=gxfac_(2,ilmn,ia,ispinor)+enl_(1)*gxj(2)
437 : : #endif
438 : : end if
439 : : end do
440 : : #if defined HAVE_OPENMP
441 : : if(jlmn<nlmn) then
442 : : do ilmn=jlmn+1,nlmn
443 : : i0lmn=ilmn*(ilmn-1)/2
444 : : ijlmn=i0lmn+jlmn
445 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
446 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
447 : : gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
448 : : gxfac_(1,jlmn,ia,ispinor)=gxfac_(1,jlmn,ia,ispinor)+enl_(1)*gxi(1)
449 : : gxfac_(2,jlmn,ia,ispinor)=gxfac_(2,jlmn,ia,ispinor)+enl_(2)*gxi(1)
450 : : if (cplex==2) then
451 : : gxfac_(1,jlmn,ia,ispinor)=gxfac_(1,jlmn,ia,ispinor)-enl_(2)*gxi(2)
452 : : gxfac_(2,jlmn,ia,ispinor)=gxfac_(2,jlmn,ia,ispinor)+enl_(1)*gxi(2)
453 : : end if
454 : : end do
455 : : end if
456 : : #endif
457 : : end do
458 : : !$OMP END DO
459 : : end do
460 : : end do
461 : : !$OMP END PARALLEL
462 : : end if !nspinortot
463 : : end if !complex_enl
464 : :
465 : : ! === Off-diagonal term(s) (up-down, down-up)
466 : :
467 : : ! --- No parallelization over spinors ---
468 [ + + + + ]: 29244783 : if (nspinortot==2.and.nspinor==nspinortot) then
469 [ - + ]: 1994229 : ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
470 [ - + ]: 1994229 : ABI_CHECK(cplex_fac==cplex,"BUG: invalid cplex_fac/=cplex)!")
471 : : !$OMP PARALLEL &
472 : : !$OMP PRIVATE(ispinor,jspinor,ia,index_enl), &
473 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,gxi,gxj,ilmn,i0lmn,ijlmn)
474 [ + + ]: 5982687 : do ispinor=1,nspinortot
475 : 3988458 : jspinor=3-ispinor
476 [ + + ]: 11241249 : do ia=1,nincat
477 : 5258562 : index_enl=atindx1(iatm+ia)
478 : : !$OMP DO
479 [ + + ]: 96118420 : do jlmn=1,nlmn
480 : 86871400 : j0lmn=jlmn*(jlmn-1)/2
481 : 86871400 : jjlmn=j0lmn+jlmn
482 [ + + ]: 260614200 : enl_(1:2)=enl_ptr(2*jjlmn-1:2*jjlmn,index_enl,2+ispinor )
483 [ + + ]: 260614200 : gxi(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
484 : 86871400 : gxfac_(1,jlmn,ia,jspinor)=gxfac_(1,jlmn,ia,jspinor)+enl_(1)*gxi(1)
485 : 86871400 : gxfac_(2,jlmn,ia,jspinor)=gxfac_(2,jlmn,ia,jspinor)-enl_(2)*gxi(1)
486 [ + - ]: 86871400 : if (cplex==2) then
487 : 86871400 : gxfac_(1,jlmn,ia,jspinor)=gxfac_(1,jlmn,ia,jspinor)+enl_(2)*gxi(2)
488 : 86871400 : gxfac_(2,jlmn,ia,jspinor)=gxfac_(2,jlmn,ia,jspinor)+enl_(1)*gxi(2)
489 : : end if
490 : : #if !defined HAVE_OPENMP
491 [ + + ]: 260614200 : gxj(1:cplex)=gx(1:cplex,jlmn,ia,jspinor)
492 : : #endif
493 [ + + ]: 935472964 : do ilmn=1,jlmn-1
494 : 843343002 : ijlmn=j0lmn+ilmn
495 [ + + ]: 2530029006 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
496 [ + + ]: 2530029006 : gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
497 : 843343002 : gxfac_(1,jlmn,ia,jspinor)=gxfac_(1,jlmn,ia,jspinor)+enl_(1)*gxi(1)
498 : 843343002 : gxfac_(2,jlmn,ia,jspinor)=gxfac_(2,jlmn,ia,jspinor)-enl_(2)*gxi(1)
499 : : #if !defined HAVE_OPENMP
500 : 843343002 : gxfac_(1,ilmn,ia,ispinor)=gxfac_(1,ilmn,ia,ispinor)+enl_(1)*gxj(1)
501 : 843343002 : gxfac_(2,ilmn,ia,ispinor)=gxfac_(2,ilmn,ia,ispinor)+enl_(2)*gxj(1)
502 : : #endif
503 [ + - ]: 930214402 : if (cplex==2) then
504 : 843343002 : gxfac_(1,jlmn,ia,jspinor)=gxfac_(1,jlmn,ia,jspinor)+enl_(2)*gxi(2)
505 : 843343002 : gxfac_(2,jlmn,ia,jspinor)=gxfac_(2,jlmn,ia,jspinor)+enl_(1)*gxi(2)
506 : : #if !defined HAVE_OPENMP
507 : 843343002 : gxfac_(1,ilmn,ia,ispinor)=gxfac_(1,ilmn,ia,ispinor)-enl_(2)*gxj(2)
508 : 843343002 : gxfac_(2,ilmn,ia,ispinor)=gxfac_(2,ilmn,ia,ispinor)+enl_(1)*gxj(2)
509 : : #endif
510 : : end if
511 : : end do
512 : : #if defined HAVE_OPENMP
513 : : if(jlmn<nlmn) then
514 : : do ilmn=jlmn+1,nlmn
515 : : i0lmn=ilmn*(ilmn-1)/2
516 : : ijlmn=i0lmn+jlmn
517 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
518 : : gxi(1:cplex)=gx(1:cplex,ilmn,ia,jspinor)
519 : : gxfac_(1,jlmn,ia,ispinor)=gxfac_(1,jlmn,ia,ispinor)+enl_(1)*gxi(1)
520 : : gxfac_(2,jlmn,ia,ispinor)=gxfac_(2,jlmn,ia,ispinor)+enl_(2)*gxi(1)
521 : : if (cplex==2) then
522 : : gxfac_(1,jlmn,ia,ispinor)=gxfac_(1,jlmn,ia,ispinor)-enl_(2)*gxi(2)
523 : : gxfac_(2,jlmn,ia,ispinor)=gxfac_(2,jlmn,ia,ispinor)+enl_(1)*gxi(2)
524 : : end if
525 : : end do
526 : : end if
527 : : #endif
528 : : end do
529 : : !$OMP END DO
530 : : end do
531 : : end do
532 : : !$OMP END PARALLEL
533 : :
534 : : ! --- Parallelization over spinors ---
535 [ + + + - ]: 27250554 : else if (nspinortot==2.and.nspinor/=nspinortot) then
536 [ - + ]: 84248 : ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
537 [ - + ]: 84248 : ABI_CHECK(cplex_fac==2,"BUG: invalid cplex_fac/=2!")
538 [ - + + - : 505488 : ABI_MALLOC(gxfac_offdiag,(cplex_fac,nlmn,nincat,nspinortot))
- + + - -
+ + - - +
+ - + - +
- - + - +
- + ]
539 : : !$OMP WORKSHARE
540 [ + + + + : 14232424 : gxfac_offdiag(:,:,:,:)=zero
+ + + + ]
541 : : !$OMP END WORKSHARE
542 : 84248 : ispinor_index=mpi_enreg%me_spinor+1
543 : 84248 : jspinor_index=3-ispinor_index
544 [ + + ]: 84248 : if (ispinor_index==1) then
545 : : ijspin=3;jispin=4
546 : : else
547 : 42124 : ijspin=4;jispin=3
548 : : end if
549 : : !$OMP PARALLEL &
550 : : !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,ilmn,i0lmn,ijlmn,enl_,jilmn,gxi)
551 [ + + ]: 211336 : do ia=1,nincat
552 : 127088 : index_enl=atindx1(iatm+ia)
553 : : !$OMP DO
554 [ + + ]: 2498920 : do jlmn=1,nlmn
555 : 2287584 : j0lmn=jlmn*(jlmn-1)/2
556 [ + + ]: 43591184 : do ilmn=1,nlmn
557 : 41176512 : i0lmn=ilmn*(ilmn-1)/2
558 [ + + ]: 41176512 : if (ilmn<=jlmn) then
559 : 21732048 : ijlmn=j0lmn+ilmn
560 : 21732048 : enl_(1)= enl_ptr(2*ijlmn-1,index_enl,ijspin)
561 : 21732048 : enl_(2)=-enl_ptr(2*ijlmn ,index_enl,ijspin)
562 : : else
563 : 19444464 : jilmn=i0lmn+jlmn
564 : 19444464 : enl_(1)= enl_ptr(2*jilmn-1,index_enl,jispin)
565 : 19444464 : enl_(2)= enl_ptr(2*jilmn ,index_enl,jispin)
566 : : end if
567 [ + + ]: 123529536 : gxi(1:cplex)=gx(1:cplex,ilmn,ia,1)
568 : : gxfac_offdiag(1,jlmn,ia,jspinor_index)= &
569 : 41176512 : & gxfac_offdiag(1,jlmn,ia,jspinor_index)+enl_(1)*gxi(1)
570 : : gxfac_offdiag(2,jlmn,ia,jspinor_index)= &
571 : 41176512 : & gxfac_offdiag(2,jlmn,ia,jspinor_index)+enl_(2)*gxi(1)
572 [ + - ]: 43464096 : if (cplex==2) then
573 : : gxfac_offdiag(1,jlmn,ia,jspinor_index)= &
574 : 41176512 : & gxfac_offdiag(1,jlmn,ia,jspinor_index)-enl_(2)*gxi(2)
575 : : gxfac_offdiag(2,jlmn,ia,jspinor_index)= &
576 : 41176512 : & gxfac_offdiag(2,jlmn,ia,jspinor_index)+enl_(1)*gxi(2)
577 : : end if
578 : : end do !ilmn
579 : : end do !jlmn
580 : : !$OMP END DO
581 : : end do !iat
582 : : !$OMP END PARALLEL
583 : 84248 : call xmpi_sum(gxfac_offdiag,mpi_enreg%comm_spinor,ierr)
584 [ + + + + : 7074088 : gxfac_(:,:,:,1)=gxfac_(:,:,:,1)+gxfac_offdiag(:,:,:,ispinor_index)
+ + ]
585 [ - + ]: 168496 : ABI_FREE(gxfac_offdiag)
586 : : end if
587 : :
588 : : end if !paw_opt
589 : :
590 : : !Accumulate dgxdtfac related to nonlocal operator (Norm-conserving)
591 : : !-------------------------------------------------------------------
592 [ + + + + ]: 38694028 : if (optder>=1.and.paw_opt==0) then
593 : : !Enl is E(Kleinman-Bylander)
594 [ - + ]: 2665549 : ABI_CHECK(cplex_enl==1,"BUG: invalid cplex_enl/=1!")
595 [ - + ]: 2665549 : ABI_CHECK(cplex_fac==cplex,"BUG: invalid cplex_fac/=cplex!")
596 : : !$OMP PARALLEL &
597 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,ilmn,iln,enl_,mu)
598 [ + + ]: 5332842 : do ispinor=1,nspinor
599 : 2667293 : ispinor_index = ispinor + shift
600 [ + + ]: 8909133 : do ia=1,nincat
601 : : !$OMP DO
602 [ + + ]: 39681661 : do ilmn=1,nlmn
603 [ + + ]: 33438077 : if (indlmn(6,ilmn)==2) cycle ! NC+SO: SO projectors handled separately below
604 : 33418893 : iln=indlmn(5,ilmn)
605 : 33418893 : enl_(1)=enl_ptr(iln,itypat,ispinor_index)
606 [ + + ]: 78514750 : do mu=1,ndgxdtfac
607 [ + + ]: 157996775 : dgxdtfac_(1:cplex,mu,ilmn,ia,ispinor)=enl_(1)*dgxdt(1:cplex,mu,ilmn,ia,ispinor)
608 : : end do
609 : : end do
610 : : !$OMP END DO
611 : : end do
612 : : end do
613 : : !$OMP END PARALLEL
614 : : end if
615 : :
616 : : !--- NC+SO: real-Ylm L.S coupling for first derivatives ---
617 [ + + + + ]: 38694028 : if (optder>=1.and.lmax_so > 0) then
618 [ + + ]: 1744 : do ia=1,nincat
619 [ + + ]: 23544 : do ilmn=1,nlmn
620 [ + + ]: 21800 : if (indlmn(6,ilmn)/=2) cycle
621 : 9592 : iln = indlmn(5,ilmn)
622 : 9592 : ekb_so = enl_ptr(iln,itypat,1)
623 [ - + ]: 9592 : if (abs(ekb_so)<tol16) cycle
624 : 9592 : ll_so = indlmn(1,ilmn)
625 : 9592 : ilm = indlmn(4,ilmn)
626 [ + + ]: 250264 : do jlmn=1,nlmn
627 [ + + ]: 239800 : if (indlmn(6,jlmn)/=2) cycle
628 [ + + ]: 105512 : if (indlmn(1,jlmn)/=ll_so) cycle
629 [ + + ]: 53192 : if (indlmn(3,jlmn)/=indlmn(3,ilmn)) cycle
630 : 37496 : jlm = indlmn(4,jlmn)
631 [ + + ]: 37496 : if (ilm<=jlm) then
632 : 23544 : klm_so = jlm*(jlm-1)/2 + ilm
633 : 23544 : sign_so = 1
634 : : else
635 : 13952 : klm_so = ilm*(ilm-1)/2 + jlm
636 : 13952 : sign_so = -1
637 : : end if
638 : 37496 : ls_uu_im = sign_so * ls_ylm_so(2,klm_so,1)
639 : 37496 : ls_ud_re = sign_so * ls_ylm_so(1,klm_so,2)
640 : 37496 : ls_ud_im = sign_so * ls_ylm_so(2,klm_so,2)
641 [ + + ]: 99544 : do mu=1,ndgxdtfac
642 : 40248 : dgxdtfac_(1,mu,ilmn,ia,1)=dgxdtfac_(1,mu,ilmn,ia,1) - ekb_so*ls_uu_im*dgxdt(2,mu,jlmn,ia,1)
643 : 40248 : dgxdtfac_(2,mu,ilmn,ia,1)=dgxdtfac_(2,mu,ilmn,ia,1) + ekb_so*ls_uu_im*dgxdt(1,mu,jlmn,ia,1)
644 : : dgxdtfac_(1,mu,ilmn,ia,1)=dgxdtfac_(1,mu,ilmn,ia,1) &
645 : 40248 : & + ekb_so*(ls_ud_re*dgxdt(1,mu,jlmn,ia,2) - ls_ud_im*dgxdt(2,mu,jlmn,ia,2))
646 : : dgxdtfac_(2,mu,ilmn,ia,1)=dgxdtfac_(2,mu,ilmn,ia,1) &
647 : 40248 : & + ekb_so*(ls_ud_re*dgxdt(2,mu,jlmn,ia,2) + ls_ud_im*dgxdt(1,mu,jlmn,ia,2))
648 : : dgxdtfac_(1,mu,ilmn,ia,2)=dgxdtfac_(1,mu,ilmn,ia,2) &
649 : 40248 : & + ekb_so*(-ls_ud_re*dgxdt(1,mu,jlmn,ia,1) - ls_ud_im*dgxdt(2,mu,jlmn,ia,1))
650 : : dgxdtfac_(2,mu,ilmn,ia,2)=dgxdtfac_(2,mu,ilmn,ia,2) &
651 : 40248 : & + ekb_so*(-ls_ud_re*dgxdt(2,mu,jlmn,ia,1) + ls_ud_im*dgxdt(1,mu,jlmn,ia,1))
652 : 40248 : dgxdtfac_(1,mu,ilmn,ia,2)=dgxdtfac_(1,mu,ilmn,ia,2) + ekb_so*ls_uu_im*dgxdt(2,mu,jlmn,ia,2)
653 : 280048 : dgxdtfac_(2,mu,ilmn,ia,2)=dgxdtfac_(2,mu,ilmn,ia,2) - ekb_so*ls_uu_im*dgxdt(1,mu,jlmn,ia,2)
654 : : end do ! mu
655 : : end do ! jlmn
656 : : end do ! ilmn
657 : : end do ! ia
658 : : end if ! NC+SO dgxdtfac_
659 : :
660 : : !Accumulate dgxdtfac related to nonlocal operator (PAW)
661 : : !-------------------------------------------------------------------
662 [ + + + + ]: 38694028 : if (optder>=1.and.(paw_opt==1.or.paw_opt==2.or.paw_opt==4)) then
663 : : !Enl is psp strength Dij or (Dij-lambda.Sij)
664 : :
665 : : ! === Diagonal term(s) (up-up, down-down)
666 : :
667 : : ! 1-Enl is real
668 [ + + ]: 1458897 : if (cplex_enl==1) then
669 : : !$OMP PARALLEL &
670 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
671 [ - + + - : 5063196 : ABI_MALLOC(gxfj,(cplex,ndgxdtfac))
- + + - +
- + - - +
- + ]
672 [ + + ]: 2531598 : do ispinor=1,nspinor
673 : 1265799 : ispinor_index=ispinor+shift
674 [ + + ]: 3995348 : do ia=1,nincat
675 : 1463750 : index_enl=atindx1(iatm+ia)
676 : : !$OMP DO
677 [ + + ]: 15593735 : do jlmn=1,nlmn
678 : 12864186 : j0lmn=jlmn*(jlmn-1)/2
679 : 12864186 : jjlmn=j0lmn+jlmn
680 : 12864186 : enl_(1)=enl_ptr(jjlmn,index_enl,ispinor_index)
681 [ + + ]: 12864186 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
682 [ + + ]: 26397914 : do mu=1,ndgxdtfac
683 [ + + ]: 40601184 : gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,ispinor)
684 [ + + ]: 53465370 : dgxdtfac_(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
685 : : end do
686 [ + + ]: 70489832 : do ilmn=1,jlmn-1
687 : 56161896 : ijlmn=j0lmn+ilmn
688 : 56161896 : enl_(1)=enl_ptr(ijlmn,index_enl,ispinor_index)
689 [ + + ]: 56161896 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
690 [ + + ]: 128261486 : do mu=1,ndgxdtfac
691 [ + + ]: 177706212 : gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
692 [ + + ]: 177706212 : dgxdtfac_(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
693 : : #if !defined HAVE_OPENMP
694 [ + + ]: 233868108 : dgxdtfac_(1:cplex,mu,ilmn,ia,ispinor)=dgxdtfac_(1:cplex,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
695 : : #endif
696 : : end do
697 : : end do
698 : : #if defined HAVE_OPENMP
699 : : if(jlmn<nlmn) then
700 : : do ilmn=jlmn+1,nlmn
701 : : i0lmn=ilmn*(ilmn-1)/2
702 : : ijlmn=i0lmn+jlmn
703 : : enl_(1)=enl_ptr(ijlmn,index_enl,ispinor_index)
704 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
705 : : do mu=1,ndgxdtfac
706 : : gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
707 : : dgxdtfac_(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
708 : : end do
709 : : end do
710 : : end if
711 : : #endif
712 : : end do
713 : : !$OMP END DO
714 : : end do
715 : : end do
716 [ - + ]: 1265799 : ABI_FREE(gxfj)
717 : : !$OMP END PARALLEL
718 : :
719 : : ! 2-Enl is complex ===== D^ss'_ij=D^s's_ji^*
720 : : else
721 [ - + ]: 193098 : ABI_CHECK(cplex_fac==cplex_enl,"BUG: invalid cplex_fac/=cplex_enl!")
722 : :
723 [ + + ]: 193098 : if (nspinortot==1) then ! -------------> NO SPINORS
724 : :
725 : : !$OMP PARALLEL &
726 : : !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
727 [ - + + - : 490224 : ABI_MALLOC(gxfj,(cplex,ndgxdtfac))
- + + - +
- + - - +
- + ]
728 [ + + ]: 245112 : do ia=1,nincat
729 : 122556 : index_enl=atindx1(iatm+ia)
730 : : !$OMP DO
731 [ + + ]: 1225560 : do jlmn=1,nlmn
732 : 980448 : j0lmn=jlmn*(jlmn-1)/2
733 : 980448 : jjlmn=j0lmn+jlmn
734 : 980448 : enl_(1)=enl_ptr(2*jjlmn-1,index_enl,1)
735 [ - + ]: 980448 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
736 [ + + ]: 1960896 : do mu=1,ndgxdtfac
737 [ - + ]: 980448 : if(cplex_dgxdt(mu)==2)then
738 : 0 : cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = dgxdt(1,mu,jlmn,ia,1)
739 : : else
740 [ + + ]: 2941344 : cplex_ = cplex ; gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,1)
741 : : end if
742 : 980448 : dgxdtfac_(1,mu,jlmn,ia,1)=dgxdtfac_(1,mu,jlmn,ia,1)+enl_(1)*gxfj(1,mu)
743 [ + - ]: 1960896 : if (cplex_==2) dgxdtfac_(2,mu,jlmn,ia,1)=dgxdtfac_(2,mu,jlmn,ia,1)+enl_(1)*gxfj(2,mu)
744 : : end do
745 [ + + ]: 4534572 : do ilmn=1,jlmn-1
746 : 3431568 : ijlmn=j0lmn+ilmn
747 [ + + ]: 10294704 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,1)
748 [ - + ]: 3431568 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
749 [ + + ]: 7843584 : do mu=1,ndgxdtfac
750 [ - + ]: 3431568 : if(cplex_dgxdt(mu)==2)then
751 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,1)
752 : : else
753 [ + + ]: 10294704 : cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,1)
754 : : end if
755 : 3431568 : dgxdtfac_(1,mu,jlmn,ia,1)=dgxdtfac_(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
756 : 3431568 : dgxdtfac_(2,mu,jlmn,ia,1)=dgxdtfac_(2,mu,jlmn,ia,1)-enl_(2)*gxfi(1)
757 : : #if !defined HAVE_OPENMP
758 : 3431568 : dgxdtfac_(1,mu,ilmn,ia,1)=dgxdtfac_(1,mu,ilmn,ia,1)+enl_(1)*gxfj(1,mu)
759 : 3431568 : dgxdtfac_(2,mu,ilmn,ia,1)=dgxdtfac_(2,mu,ilmn,ia,1)+enl_(2)*gxfj(1,mu)
760 : : #endif
761 [ + - ]: 6863136 : if (cplex_==2) then
762 : 3431568 : dgxdtfac_(1,mu,jlmn,ia,1)=dgxdtfac_(1,mu,jlmn,ia,1)+enl_(2)*gxfi(2)
763 : 3431568 : dgxdtfac_(2,mu,jlmn,ia,1)=dgxdtfac_(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
764 : : #if !defined HAVE_OPENMP
765 : 3431568 : dgxdtfac_(1,mu,ilmn,ia,1)=dgxdtfac_(1,mu,ilmn,ia,1)-enl_(2)*gxfj(2,mu)
766 : 3431568 : dgxdtfac_(2,mu,ilmn,ia,1)=dgxdtfac_(2,mu,ilmn,ia,1)+enl_(1)*gxfj(2,mu)
767 : : #endif
768 : : end if
769 : : end do
770 : : end do
771 : : #if defined HAVE_OPENMP
772 : : if(jlmn<nlmn) then
773 : : do ilmn=jlmn+1,nlmn
774 : : i0lmn=ilmn*(ilmn-1)/2
775 : : ijlmn=i0lmn+jlmn
776 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,1)
777 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
778 : : do mu=1,ndgxdtfac
779 : : if(cplex_dgxdt(mu)==2)then
780 : : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,1)
781 : : else
782 : : cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,1)
783 : : end if
784 : : dgxdtfac_(1,mu,jlmn,ia,1)=dgxdtfac_(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
785 : : dgxdtfac_(2,mu,jlmn,ia,1)=dgxdtfac_(2,mu,jlmn,ia,1)+enl_(2)*gxfi(1)
786 : : if (cplex_==2) then
787 : : dgxdtfac_(1,mu,jlmn,ia,1)=dgxdtfac_(1,mu,jlmn,ia,1)-enl_(2)*gxfi(2)
788 : : dgxdtfac_(2,mu,jlmn,ia,1)=dgxdtfac_(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
789 : : end if
790 : : end do
791 : : end do
792 : : end if
793 : : #endif
794 : : end do
795 : : !$OMP END DO
796 : : end do
797 [ - + ]: 122556 : ABI_FREE(gxfj)
798 : : !$OMP END PARALLEL
799 : :
800 : : else ! -------------> SPINORIAL CASE
801 : :
802 : : ! === Diagonal term(s) (up-up, down-down)
803 : :
804 : : !$OMP PARALLEL &
805 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
806 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
807 [ - + + - : 282168 : ABI_MALLOC(gxfj,(cplex,ndgxdtfac))
- + + - +
- + - - +
- + ]
808 [ + + ]: 211626 : do ispinor=1,nspinor
809 : 141084 : ispinor_index = ispinor + shift
810 [ + + ]: 361698 : do ia=1,nincat
811 : 150072 : index_enl=atindx1(iatm+ia)
812 : : !$OMP DO
813 [ + + ]: 1581612 : do jlmn=1,nlmn
814 : 1290456 : j0lmn=jlmn*(jlmn-1)/2
815 : 1290456 : jjlmn=j0lmn+jlmn
816 : 1290456 : enl_(1)=enl_ptr(2*jjlmn-1,index_enl,ispinor_index)
817 [ - + ]: 1290456 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
818 [ + + ]: 2594952 : do mu=1,ndgxdtfac
819 [ - + ]: 1304496 : if(cplex_dgxdt(mu)==2)then
820 : 0 : cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = dgxdt(1,mu,jlmn,ia,ispinor)
821 : : else
822 [ + + ]: 3913488 : cplex_ = cplex ; gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,ispinor)
823 : : end if
824 : 1304496 : dgxdtfac_(1,mu,jlmn,ia,ispinor)=dgxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
825 [ + - ]: 2594952 : if (cplex_==2) dgxdtfac_(2,mu,jlmn,ia,ispinor)=dgxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
826 : : end do
827 [ + + ]: 6541344 : do ilmn=1,jlmn-1
828 : 5100816 : ijlmn=j0lmn+ilmn
829 [ + + ]: 15302448 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
830 [ - + ]: 5100816 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
831 [ + + ]: 11576328 : do mu=1,ndgxdtfac
832 [ - + ]: 5185056 : if(cplex_dgxdt(mu)==2)then
833 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,ispinor)
834 : : else
835 [ + + ]: 15555168 : cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
836 : : end if
837 : 5185056 : dgxdtfac_(1,mu,jlmn,ia,ispinor)=dgxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
838 : 5185056 : dgxdtfac_(2,mu,jlmn,ia,ispinor)=dgxdtfac_(2,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(1)
839 : : #if !defined HAVE_OPENMP
840 : 5185056 : dgxdtfac_(1,mu,ilmn,ia,ispinor)=dgxdtfac_(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
841 : 5185056 : dgxdtfac_(2,mu,ilmn,ia,ispinor)=dgxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
842 : : #endif
843 [ + - ]: 10285872 : if (cplex_==2) then
844 : 5185056 : dgxdtfac_(1,mu,jlmn,ia,ispinor)=dgxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(2)
845 : 5185056 : dgxdtfac_(2,mu,jlmn,ia,ispinor)=dgxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
846 : : #if !defined HAVE_OPENMP
847 : 5185056 : dgxdtfac_(1,mu,ilmn,ia,ispinor)=dgxdtfac_(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
848 : 5185056 : dgxdtfac_(2,mu,ilmn,ia,ispinor)=dgxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
849 : : #endif
850 : : end if
851 : : end do
852 : : end do
853 : : #if defined HAVE_OPENMP
854 : : if(jlmn<nlmn) then
855 : : do ilmn=jlmn+1,nlmn
856 : : i0lmn=ilmn*(ilmn-1)/2
857 : : ijlmn=i0lmn+jlmn
858 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
859 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
860 : : do mu=1,ndgxdtfac
861 : : if(cplex_dgxdt(mu)==2)then
862 : : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,ispinor)
863 : : else
864 : : cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
865 : : end if
866 : : dgxdtfac_(1,mu,jlmn,ia,ispinor)=dgxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
867 : : dgxdtfac_(2,mu,jlmn,ia,ispinor)=dgxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
868 : : if (cplex_==2) then
869 : : dgxdtfac_(1,mu,jlmn,ia,ispinor)=dgxdtfac_(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
870 : : dgxdtfac_(2,mu,jlmn,ia,ispinor)=dgxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
871 : : end if
872 : : end do
873 : : end do
874 : : end if
875 : : #endif
876 : : end do
877 : : !$OMP END DO
878 : : end do
879 : : end do
880 [ - + ]: 70542 : ABI_FREE(gxfj)
881 : : !$OMP END PARALLEL
882 : : end if !nspinortot
883 : : end if !complex
884 : :
885 : : ! === Off-diagonal term(s) (up-down, down-up)
886 : :
887 : : ! --- No parallelization over spinors ---
888 [ + + + - ]: 1458897 : if (nspinortot==2.and.nspinor==nspinortot) then
889 [ - + ]: 70542 : ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
890 [ - + ]: 70542 : ABI_CHECK(cplex_fac==2,"BUG: invalid cplex_fac/=2!")
891 : : !$OMP PARALLEL &
892 : : !$OMP PRIVATE(ispinor,jspinor,ia,index_enl), &
893 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfi,gxfj,ilmn,i0lmn,ijlmn)
894 [ - + + - : 282168 : ABI_MALLOC(gxfj,(cplex,ndgxdtfac))
- + + - +
- + - - +
- + ]
895 [ + + ]: 211626 : do ispinor=1,nspinor
896 : 141084 : jspinor=3-ispinor
897 [ + + ]: 361698 : do ia=1,nincat
898 : 150072 : index_enl=atindx1(iatm+ia)
899 : : !$OMP DO
900 [ + + ]: 1581612 : do jlmn=1,nlmn
901 : 1290456 : j0lmn=jlmn*(jlmn-1)/2
902 : 1290456 : jjlmn=j0lmn+jlmn
903 [ + + ]: 3871368 : enl_(1:2)=enl_ptr(2*jjlmn-1:2*jjlmn,index_enl,2+ispinor)
904 [ + + ]: 2594952 : do mu=1,ndgxdtfac
905 [ - + ]: 1304496 : if(cplex_dgxdt(mu)==2)then
906 : 0 : cplex_ = 2 ;
907 : 0 : gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,jlmn,ia,ispinor)
908 : 0 : gxfj(1,mu) = zero ; gxfj(2,mu) = dgxdt(1,mu,jlmn,ia,jspinor)
909 : : else
910 : 1304496 : cplex_ = cplex ;
911 [ + + ]: 3913488 : gxfi(1:cplex) =dgxdt(1:cplex,mu,jlmn,ia,ispinor)
912 [ + + ]: 3913488 : gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,jspinor)
913 : : end if
914 : 1304496 : dgxdtfac_(1,mu,jlmn,ia,jspinor)=dgxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
915 : 1304496 : dgxdtfac_(2,mu,jlmn,ia,jspinor)=dgxdtfac_(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
916 [ + - ]: 2594952 : if (cplex_==2) then
917 : 1304496 : dgxdtfac_(1,mu,jlmn,ia,jspinor)=dgxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
918 : 1304496 : dgxdtfac_(2,mu,jlmn,ia,jspinor)=dgxdtfac_(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
919 : : end if
920 : : end do
921 [ + + ]: 6541344 : do ilmn=1,jlmn-1
922 : 5100816 : ijlmn=j0lmn+ilmn
923 [ + + ]: 15302448 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
924 [ + + ]: 11576328 : do mu=1,ndgxdtfac
925 [ - + ]: 5185056 : if(cplex_dgxdt(mu)==2)then
926 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,ispinor)
927 : : else
928 [ + + ]: 15555168 : cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
929 : : end if
930 : 5185056 : dgxdtfac_(1,mu,jlmn,ia,jspinor)=dgxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
931 : 5185056 : dgxdtfac_(2,mu,jlmn,ia,jspinor)=dgxdtfac_(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
932 : : #if !defined HAVE_OPENMP
933 : 5185056 : dgxdtfac_(1,mu,ilmn,ia,ispinor)=dgxdtfac_(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
934 : 5185056 : dgxdtfac_(2,mu,ilmn,ia,ispinor)=dgxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
935 : : #endif
936 [ + - ]: 10285872 : if (cplex_==2) then
937 : 5185056 : dgxdtfac_(1,mu,jlmn,ia,jspinor)=dgxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
938 : 5185056 : dgxdtfac_(2,mu,jlmn,ia,jspinor)=dgxdtfac_(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
939 : : #if !defined HAVE_OPENMP
940 : 5185056 : dgxdtfac_(1,mu,ilmn,ia,ispinor)=dgxdtfac_(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
941 : 5185056 : dgxdtfac_(2,mu,ilmn,ia,ispinor)=dgxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
942 : : #endif
943 : : end if
944 : : end do !mu
945 : : end do !ilmn
946 : : #if defined HAVE_OPENMP
947 : : if(jlmn<nlmn) then
948 : : do ilmn=jlmn+1,nlmn
949 : : i0lmn=ilmn*(ilmn-1)/2
950 : : ijlmn=i0lmn+jlmn
951 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
952 : : do mu=1,ndgxdtfac
953 : : if(cplex_dgxdt(mu)==2)then
954 : : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,jspinor)
955 : : else
956 : : cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,jspinor)
957 : : end if
958 : : dgxdtfac_(1,mu,jlmn,ia,ispinor)=dgxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
959 : : dgxdtfac_(2,mu,jlmn,ia,ispinor)=dgxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
960 : : if (cplex_==2) then
961 : : dgxdtfac_(1,mu,jlmn,ia,ispinor)=dgxdtfac_(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
962 : : dgxdtfac_(2,mu,jlmn,ia,ispinor)=dgxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
963 : : end if
964 : : end do !mu
965 : : end do !ilmn
966 : : end if
967 : : #endif
968 : : end do !jmln
969 : : !$OMP END DO
970 : : end do !ia
971 : : end do !ispinor
972 [ - + ]: 70542 : ABI_FREE(gxfj)
973 : : !$OMP END PARALLEL
974 : :
975 : : ! --- Parallelization over spinors ---
976 [ - + - - ]: 1388355 : else if (nspinortot==2.and.nspinor/=nspinortot) then
977 [ # # ]: 0 : ABI_CHECK(cplex_enl==2,"BUG: opernlc_ylm: invalid cplex_enl/=2!")
978 [ # # ]: 0 : ABI_CHECK(cplex_fac==2,"BUG: opernlc_ylm: invalid cplex_fac/=2!")
979 [ # # # # : 0 : ABI_MALLOC(dgxdtfac_offdiag,(cplex_fac,ndgxdtfac,nlmn,nincat,nspinortot))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
980 : : !$OMP PARALLEL &
981 : : !$OMP PRIVATE(ia,index_enl), &
982 : : !$OMP PRIVATE(jlmn,j0lmn,ilmn,i0lmn,ijlmn,enl_,jilmn,mu,gxfi)
983 : : !$OMP WORKSHARE
984 [ # # # # : 0 : dgxdtfac_offdiag(:,:,:,:,:)=zero
# # # # #
# ]
985 : : !$OMP END WORKSHARE
986 : : !$OMP SINGLE
987 : 0 : ispinor_index=mpi_enreg%me_spinor+1
988 : 0 : jspinor_index=3-ispinor_index
989 [ # # ]: 0 : if (ispinor_index==1) then
990 : : ijspin=3;jispin=4
991 : : else
992 : 0 : ijspin=4;jispin=3
993 : : end if
994 : : !$OMP END SINGLE
995 [ # # ]: 0 : do ia=1,nincat
996 : 0 : index_enl=atindx1(iatm+ia)
997 : : !$OMP DO
998 [ # # ]: 0 : do jlmn=1,nlmn
999 : 0 : j0lmn=jlmn*(jlmn-1)/2
1000 [ # # ]: 0 : do ilmn=1,nlmn
1001 : 0 : i0lmn=ilmn*(ilmn-1)/2
1002 [ # # ]: 0 : if (ilmn<=jlmn) then
1003 : 0 : ijlmn=j0lmn+ilmn
1004 : 0 : enl_(1)= enl_ptr(2*ijlmn-1,index_enl,ijspin)
1005 : 0 : enl_(2)=-enl_ptr(2*ijlmn ,index_enl,ijspin)
1006 : : else
1007 : 0 : jilmn=i0lmn+jlmn
1008 : 0 : enl_(1)= enl_ptr(2*jilmn-1,index_enl,jispin)
1009 : 0 : enl_(2)= enl_ptr(2*jilmn ,index_enl,jispin)
1010 : : end if
1011 [ # # ]: 0 : do mu=1,ndgxdtfac
1012 [ # # ]: 0 : if(cplex_dgxdt(mu)==2)then
1013 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,1)
1014 : : else
1015 [ # # ]: 0 : cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,1)
1016 : : end if
1017 : : dgxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)= &
1018 : 0 : & dgxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(1)
1019 : : dgxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)= &
1020 : 0 : & dgxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)+enl_(2)*gxfi(1)
1021 [ # # ]: 0 : if (cplex_==2) then
1022 : : dgxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)= &
1023 : 0 : & dgxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)-enl_(2)*gxfi(2)
1024 : : dgxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)= &
1025 : 0 : & dgxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(2)
1026 : : end if
1027 : : end do
1028 : : end do !ilmn
1029 : : end do !jlmn
1030 : : !$OMP END DO
1031 : : end do !iat
1032 : : !$OMP SINGLE
1033 : 0 : call xmpi_sum(dgxdtfac_offdiag,mpi_enreg%comm_spinor,ierr)
1034 : : !$OMP END SINGLE
1035 : : !$OMP WORKSHARE
1036 [ # # # # : 0 : dgxdtfac_(:,:,:,:,1)=dgxdtfac_(:,:,:,:,1)+dgxdtfac_offdiag(:,:,:,:,ispinor_index)
# # # # ]
1037 : : !$OMP END WORKSHARE
1038 : : !$OMP END PARALLEL
1039 [ # # ]: 0 : ABI_FREE(dgxdtfac_offdiag)
1040 : : end if !nspinortot
1041 : :
1042 : : end if ! pawopt & optder
1043 : :
1044 : : !Accumulate d2gxdtfac related to nonlocal operator (Norm-conserving)
1045 : : !-------------------------------------------------------------------
1046 [ + + + + ]: 38694028 : if (optder==2.and.paw_opt==0) then
1047 : : !Enl is E(Kleinman-Bylander)
1048 : : !$OMP PARALLEL &
1049 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,ilmn,iln,enl_,mu)
1050 [ + + ]: 898032 : do ispinor=1,nspinor
1051 : 449016 : ispinor_index = ispinor + shift
1052 [ + + ]: 1742067 : do ia=1,nincat
1053 : : !$OMP DO
1054 [ + + ]: 8682588 : do ilmn=1,nlmn
1055 [ + - ]: 7389537 : if (indlmn(6,ilmn)==2) cycle ! NC+SO: SO projectors handled separately below
1056 : 7389537 : iln=indlmn(5,ilmn)
1057 : 7389537 : enl_(1)=enl_ptr(iln,itypat,ispinor_index)
1058 [ + + ]: 28562373 : do mu=1,nd2gxdtfac
1059 [ + + ]: 68375940 : d2gxdtfac_(1:cplex,mu,ilmn,ia,ispinor)=enl_(1)*d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1060 : : end do
1061 : : end do
1062 : : !$OMP END DO
1063 : : end do
1064 : : end do
1065 : : !$OMP END PARALLEL
1066 : : end if
1067 : :
1068 : : ! NC+SO: real-Ylm L.S coupling for second derivatives (elastic tensor) ---
1069 [ + + - + ]: 38694028 : if (optder==2.and.lmax_so > 0) then
1070 [ # # ]: 0 : do ia=1,nincat
1071 [ # # ]: 0 : do ilmn=1,nlmn
1072 [ # # ]: 0 : if (indlmn(6,ilmn)/=2) cycle
1073 : 0 : iln = indlmn(5,ilmn)
1074 : 0 : ekb_so = enl_ptr(iln,itypat,1)
1075 [ # # ]: 0 : if (abs(ekb_so)<tol16) cycle
1076 : 0 : ll_so = indlmn(1,ilmn)
1077 : 0 : ilm = indlmn(4,ilmn)
1078 [ # # ]: 0 : do jlmn=1,nlmn
1079 [ # # ]: 0 : if (indlmn(6,jlmn)/=2) cycle
1080 [ # # ]: 0 : if (indlmn(1,jlmn)/=ll_so) cycle
1081 [ # # ]: 0 : if (indlmn(3,jlmn)/=indlmn(3,ilmn)) cycle
1082 : 0 : jlm = indlmn(4,jlmn)
1083 [ # # ]: 0 : if (ilm<=jlm) then
1084 : 0 : klm_so = jlm*(jlm-1)/2 + ilm
1085 : 0 : sign_so = 1
1086 : : else
1087 : 0 : klm_so = ilm*(ilm-1)/2 + jlm
1088 : 0 : sign_so = -1
1089 : : end if
1090 : 0 : ls_uu_im = sign_so * ls_ylm_so(2,klm_so,1)
1091 : 0 : ls_ud_re = sign_so * ls_ylm_so(1,klm_so,2)
1092 : 0 : ls_ud_im = sign_so * ls_ylm_so(2,klm_so,2)
1093 [ # # ]: 0 : do mu=1,nd2gxdtfac
1094 : : ! up-up
1095 : 0 : d2gxdtfac_(1,mu,ilmn,ia,1)=d2gxdtfac_(1,mu,ilmn,ia,1) - ekb_so*ls_uu_im*d2gxdt(2,mu,jlmn,ia,1)
1096 : 0 : d2gxdtfac_(2,mu,ilmn,ia,1)=d2gxdtfac_(2,mu,ilmn,ia,1) + ekb_so*ls_uu_im*d2gxdt(1,mu,jlmn,ia,1)
1097 : : ! up-dn
1098 : : d2gxdtfac_(1,mu,ilmn,ia,1)=d2gxdtfac_(1,mu,ilmn,ia,1) &
1099 : 0 : & + ekb_so*(ls_ud_re*d2gxdt(1,mu,jlmn,ia,2) - ls_ud_im*d2gxdt(2,mu,jlmn,ia,2))
1100 : : d2gxdtfac_(2,mu,ilmn,ia,1)=d2gxdtfac_(2,mu,ilmn,ia,1) &
1101 : 0 : & + ekb_so*(ls_ud_re*d2gxdt(2,mu,jlmn,ia,2) + ls_ud_im*d2gxdt(1,mu,jlmn,ia,2))
1102 : : ! dn-up
1103 : : d2gxdtfac_(1,mu,ilmn,ia,2)=d2gxdtfac_(1,mu,ilmn,ia,2) &
1104 : 0 : & + ekb_so*(-ls_ud_re*d2gxdt(1,mu,jlmn,ia,1) - ls_ud_im*d2gxdt(2,mu,jlmn,ia,1))
1105 : : d2gxdtfac_(2,mu,ilmn,ia,2)=d2gxdtfac_(2,mu,ilmn,ia,2) &
1106 : 0 : & + ekb_so*(-ls_ud_re*d2gxdt(2,mu,jlmn,ia,1) + ls_ud_im*d2gxdt(1,mu,jlmn,ia,1))
1107 : : ! dn-dn
1108 : 0 : d2gxdtfac_(1,mu,ilmn,ia,2)=d2gxdtfac_(1,mu,ilmn,ia,2) + ekb_so*ls_uu_im*d2gxdt(2,mu,jlmn,ia,2)
1109 : 0 : d2gxdtfac_(2,mu,ilmn,ia,2)=d2gxdtfac_(2,mu,ilmn,ia,2) - ekb_so*ls_uu_im*d2gxdt(1,mu,jlmn,ia,2)
1110 : : end do ! mu
1111 : : end do ! jlmn
1112 : : end do ! ilmn
1113 : : end do ! ia
1114 : : end if ! NC+SO d2gxdtfac
1115 : :
1116 [ + + ]: 38694028 : if (lmax_so > 0) then
1117 [ - + ]: 6570 : ABI_FREE(ls_ylm_so)
1118 : : end if
1119 : :
1120 : : DBG_EXIT("COLL")
1121 : :
1122 : : !Accumulate d2gxdtfac related to nonlocal operator (PAW)
1123 : : !-------------------------------------------------------------------
1124 [ + + + + ]: 38694028 : if (optder==2.and.(paw_opt==1.or.paw_opt==2.or.paw_opt==4)) then
1125 : : !Enl is psp strength Dij or (Dij-lambda.Sij)
1126 : :
1127 : : ! === Diagonal term(s) (up-up, down-down)
1128 : :
1129 : : ! 1-Enl is real
1130 [ + + ]: 4173 : if (cplex_enl==1) then
1131 : : !$OMP PARALLEL &
1132 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
1133 [ - + + - : 15612 : ABI_MALLOC(gxfj,(cplex,nd2gxdtfac))
- + + - +
- + - - +
- + ]
1134 [ + + ]: 7806 : do ispinor=1,nspinor
1135 : 3903 : ispinor_index=ispinor+shift
1136 [ + + ]: 11772 : do ia=1,nincat
1137 : 3966 : index_enl=atindx1(iatm+ia)
1138 : : !$OMP DO
1139 [ + + ]: 40227 : do jlmn=1,nlmn
1140 : 32358 : j0lmn=jlmn*(jlmn-1)/2
1141 : 32358 : jjlmn=j0lmn+jlmn
1142 : 32358 : enl_(1)=enl_ptr(jjlmn,index_enl,ispinor_index)
1143 [ - + ]: 32358 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
1144 [ + + ]: 64716 : do mu=1,nd2gxdtfac
1145 [ + + ]: 97074 : gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1146 [ + + ]: 129432 : d2gxdtfac_(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac_(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
1147 : : end do
1148 [ + + ]: 153672 : do ilmn=1,jlmn-1
1149 : 117348 : ijlmn=j0lmn+ilmn
1150 : 117348 : enl_(1)=enl_ptr(ijlmn,index_enl,ispinor_index)
1151 [ - + ]: 117348 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1152 [ + + ]: 267054 : do mu=1,nd2gxdtfac
1153 [ + + ]: 352044 : gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1154 [ + + ]: 352044 : d2gxdtfac_(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac_(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
1155 : : #if !defined HAVE_OPENMP
1156 [ + + ]: 469392 : d2gxdtfac_(1:cplex,mu,ilmn,ia,ispinor)=d2gxdtfac_(1:cplex,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
1157 : : #endif
1158 : : end do
1159 : : end do
1160 : : #if defined HAVE_OPENMP
1161 : : if(jlmn<nlmn) then
1162 : : do ilmn=jlmn+1,nlmn
1163 : : i0lmn=ilmn*(ilmn-1)/2
1164 : : ijlmn=i0lmn+jlmn
1165 : : enl_(1)=enl_ptr(ijlmn,index_enl,ispinor_index)
1166 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1167 : : do mu=1,nd2gxdtfac
1168 : : gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1169 : : d2gxdtfac_(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac_(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
1170 : : end do
1171 : : end do
1172 : : end if
1173 : : #endif
1174 : : end do
1175 : : !$OMP END DO
1176 : : end do
1177 : : end do
1178 [ - + ]: 3903 : ABI_FREE(gxfj)
1179 : : !$OMP END PARALLEL
1180 : :
1181 : : ! 2-Enl is complex ===== D^ss'_ij=D^s's_ji^*
1182 : : else
1183 [ - + ]: 270 : ABI_CHECK(cplex_fac==cplex_enl,"BUG: invalid cplex_fac/=cplex_enl!")
1184 : :
1185 [ - + ]: 270 : if (nspinortot==1) then ! -------------> NO SPINORS
1186 : :
1187 : : !$OMP PARALLEL &
1188 : : !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
1189 [ # # # # : 0 : ABI_MALLOC(gxfj,(cplex,nd2gxdtfac))
# # # # #
# # # # #
# # ]
1190 [ # # ]: 0 : do ia=1,nincat
1191 : 0 : index_enl=atindx1(iatm+ia)
1192 : : !$OMP DO
1193 [ # # ]: 0 : do jlmn=1,nlmn
1194 : 0 : j0lmn=jlmn*(jlmn-1)/2
1195 : 0 : jjlmn=j0lmn+jlmn
1196 : 0 : enl_(1)=enl_ptr(2*jjlmn-1,index_enl,1)
1197 [ # # ]: 0 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
1198 [ # # ]: 0 : do mu=1,nd2gxdtfac
1199 [ # # ]: 0 : if(cplex_d2gxdt(mu)==2)then
1200 : 0 : cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = d2gxdt(1,mu,jlmn,ia,1)
1201 : : else
1202 [ # # ]: 0 : cplex_ = cplex ; gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,1)
1203 : : end if
1204 : 0 : d2gxdtfac_(1,mu,jlmn,ia,1)=d2gxdtfac_(1,mu,jlmn,ia,1)+enl_(1)*gxfj(1,mu)
1205 [ # # ]: 0 : if (cplex_==2) d2gxdtfac_(2,mu,jlmn,ia,1)=d2gxdtfac_(2,mu,jlmn,ia,1)+enl_(1)*gxfj(2,mu)
1206 : : end do
1207 [ # # ]: 0 : do ilmn=1,jlmn-1
1208 : 0 : ijlmn=j0lmn+ilmn
1209 [ # # ]: 0 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,1)
1210 [ # # ]: 0 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1211 [ # # ]: 0 : do mu=1,nd2gxdtfac
1212 [ # # ]: 0 : if(cplex_d2gxdt(mu)==2)then
1213 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,1)
1214 : : else
1215 [ # # ]: 0 : cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,1)
1216 : : end if
1217 : 0 : d2gxdtfac_(1,mu,jlmn,ia,1)=d2gxdtfac_(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
1218 : 0 : d2gxdtfac_(2,mu,jlmn,ia,1)=d2gxdtfac_(2,mu,jlmn,ia,1)-enl_(2)*gxfi(1)
1219 : : #if !defined HAVE_OPENMP
1220 : 0 : d2gxdtfac_(1,mu,ilmn,ia,1)=d2gxdtfac_(1,mu,ilmn,ia,1)+enl_(1)*gxfj(1,mu)
1221 : 0 : d2gxdtfac_(2,mu,ilmn,ia,1)=d2gxdtfac_(2,mu,ilmn,ia,1)+enl_(2)*gxfj(1,mu)
1222 : : #endif
1223 [ # # ]: 0 : if (cplex_==2) then
1224 : 0 : d2gxdtfac_(1,mu,jlmn,ia,1)=d2gxdtfac_(1,mu,jlmn,ia,1)+enl_(2)*gxfi(2)
1225 : 0 : d2gxdtfac_(2,mu,jlmn,ia,1)=d2gxdtfac_(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
1226 : : #if !defined HAVE_OPENMP
1227 : 0 : d2gxdtfac_(1,mu,ilmn,ia,1)=d2gxdtfac_(1,mu,ilmn,ia,1)-enl_(2)*gxfj(2,mu)
1228 : 0 : d2gxdtfac_(2,mu,ilmn,ia,1)=d2gxdtfac_(2,mu,ilmn,ia,1)+enl_(1)*gxfj(2,mu)
1229 : : #endif
1230 : : end if
1231 : : end do
1232 : : end do
1233 : : #if defined HAVE_OPENMP
1234 : : if(jlmn<nlmn) then
1235 : : do ilmn=jlmn+1,nlmn
1236 : : i0lmn=ilmn*(ilmn-1)/2
1237 : : ijlmn=i0lmn+jlmn
1238 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,1)
1239 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1240 : : do mu=1,nd2gxdtfac
1241 : : if(cplex_d2gxdt(mu)==2)then
1242 : : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,1)
1243 : : else
1244 : : cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,1)
1245 : : end if
1246 : : d2gxdtfac_(1,mu,jlmn,ia,1)=d2gxdtfac_(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
1247 : : d2gxdtfac_(2,mu,jlmn,ia,1)=d2gxdtfac_(2,mu,jlmn,ia,1)+enl_(2)*gxfi(1)
1248 : : if (cplex_==2) then
1249 : : d2gxdtfac_(1,mu,jlmn,ia,1)=d2gxdtfac_(1,mu,jlmn,ia,1)-enl_(2)*gxfi(2)
1250 : : d2gxdtfac_(2,mu,jlmn,ia,1)=d2gxdtfac_(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
1251 : : end if
1252 : : end do
1253 : : end do
1254 : : end if
1255 : : #endif
1256 : : end do
1257 : : !$OMP END DO
1258 : : end do
1259 [ # # ]: 0 : ABI_FREE(gxfj)
1260 : : !$OMP END PARALLEL
1261 : :
1262 : : else ! -------------> SPINORIAL CASE
1263 : :
1264 : : ! === Diagonal term(s) (up-up, down-down)
1265 : :
1266 : : !$OMP PARALLEL &
1267 : : !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
1268 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
1269 [ - + + - : 1080 : ABI_MALLOC(gxfj,(cplex,nd2gxdtfac))
- + + - +
- + - - +
- + ]
1270 [ + + ]: 810 : do ispinor=1,nspinor
1271 : 540 : ispinor_index = ispinor + shift
1272 [ + + ]: 1890 : do ia=1,nincat
1273 : 1080 : index_enl=atindx1(iatm+ia)
1274 : : !$OMP DO
1275 [ + + ]: 15660 : do jlmn=1,nlmn
1276 : 14040 : j0lmn=jlmn*(jlmn-1)/2
1277 : 14040 : jjlmn=j0lmn+jlmn
1278 : 14040 : enl_(1)=enl_ptr(2*jjlmn-1,index_enl,ispinor_index)
1279 [ - + ]: 14040 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
1280 [ + + ]: 28080 : do mu=1,nd2gxdtfac
1281 [ - + ]: 14040 : if(cplex_d2gxdt(mu)==2)then
1282 : 0 : cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = d2gxdt(1,mu,jlmn,ia,ispinor)
1283 : : else
1284 [ + + ]: 42120 : cplex_ = cplex ; gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1285 : : end if
1286 : 14040 : d2gxdtfac_(1,mu,jlmn,ia,ispinor)=d2gxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
1287 [ + - ]: 28080 : if (cplex_==2) d2gxdtfac_(2,mu,jlmn,ia,ispinor)=d2gxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
1288 : : end do
1289 [ + + ]: 99360 : do ilmn=1,jlmn-1
1290 : 84240 : ijlmn=j0lmn+ilmn
1291 [ + + ]: 252720 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
1292 [ - + ]: 84240 : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1293 [ + + ]: 182520 : do mu=1,nd2gxdtfac
1294 [ - + ]: 84240 : if(cplex_d2gxdt(mu)==2)then
1295 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,ispinor)
1296 : : else
1297 [ + + ]: 252720 : cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1298 : : end if
1299 : 84240 : d2gxdtfac_(1,mu,jlmn,ia,ispinor)=d2gxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
1300 : 84240 : d2gxdtfac_(2,mu,jlmn,ia,ispinor)=d2gxdtfac_(2,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(1)
1301 : : #if !defined HAVE_OPENMP
1302 : 84240 : d2gxdtfac_(1,mu,ilmn,ia,ispinor)=d2gxdtfac_(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
1303 : 84240 : d2gxdtfac_(2,mu,ilmn,ia,ispinor)=d2gxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
1304 : : #endif
1305 [ + - ]: 168480 : if (cplex_==2) then
1306 : 84240 : d2gxdtfac_(1,mu,jlmn,ia,ispinor)=d2gxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(2)
1307 : 84240 : d2gxdtfac_(2,mu,jlmn,ia,ispinor)=d2gxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
1308 : : #if !defined HAVE_OPENMP
1309 : 84240 : d2gxdtfac_(1,mu,ilmn,ia,ispinor)=d2gxdtfac_(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
1310 : 84240 : d2gxdtfac_(2,mu,ilmn,ia,ispinor)=d2gxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
1311 : : #endif
1312 : : end if
1313 : : end do
1314 : : end do
1315 : : #if defined HAVE_OPENMP
1316 : : if(jlmn<nlmn) then
1317 : : do ilmn=jlmn+1,nlmn
1318 : : i0lmn=ilmn*(ilmn-1)/2
1319 : : ijlmn=i0lmn+jlmn
1320 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
1321 : : if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1322 : : do mu=1,nd2gxdtfac
1323 : : if(cplex_d2gxdt(mu)==2)then
1324 : : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,ispinor)
1325 : : else
1326 : : cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1327 : : end if
1328 : : d2gxdtfac_(1,mu,jlmn,ia,ispinor)=d2gxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
1329 : : d2gxdtfac_(2,mu,jlmn,ia,ispinor)=d2gxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
1330 : : if (cplex_==2) then
1331 : : d2gxdtfac_(1,mu,jlmn,ia,ispinor)=d2gxdtfac_(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
1332 : : d2gxdtfac_(2,mu,jlmn,ia,ispinor)=d2gxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
1333 : : end if
1334 : : end do
1335 : : end do
1336 : : end if
1337 : : #endif
1338 : : end do
1339 : : !$OMP END DO
1340 : : end do
1341 : : end do
1342 [ - + ]: 270 : ABI_FREE(gxfj)
1343 : : !$OMP END PARALLEL
1344 : : end if !nspinortot
1345 : : end if !complex
1346 : :
1347 : : ! === Off-diagonal term(s) (up-down, down-up)
1348 : :
1349 : : ! --- No parallelization over spinors ---
1350 [ + + + - ]: 4173 : if (nspinortot==2.and.nspinor==nspinortot) then
1351 [ - + ]: 270 : ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
1352 [ - + ]: 270 : ABI_CHECK(cplex_fac==2,"BUG: invalid cplex_fac/=2!")
1353 : : !$OMP PARALLEL &
1354 : : !$OMP PRIVATE(ispinor,jspinor,ia,index_enl), &
1355 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfi,gxfj,ilmn,i0lmn,ijlmn)
1356 [ - + + - : 1080 : ABI_MALLOC(gxfj,(cplex,nd2gxdtfac))
- + + - +
- + - - +
- + ]
1357 [ + + ]: 810 : do ispinor=1,nspinor
1358 : 540 : jspinor=3-ispinor
1359 [ + + ]: 1890 : do ia=1,nincat
1360 : 1080 : index_enl=atindx1(iatm+ia)
1361 : : !$OMP DO
1362 [ + + ]: 15660 : do jlmn=1,nlmn
1363 : 14040 : j0lmn=jlmn*(jlmn-1)/2
1364 : 14040 : jjlmn=j0lmn+jlmn
1365 [ + + ]: 42120 : enl_(1:2)=enl_ptr(2*jjlmn-1:2*jjlmn,index_enl,2+ispinor)
1366 [ + + ]: 28080 : do mu=1,nd2gxdtfac
1367 [ - + ]: 14040 : if(cplex_d2gxdt(mu)==2)then
1368 : 0 : cplex_ = 2 ;
1369 : 0 : gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,jlmn,ia,ispinor)
1370 : 0 : gxfj(1,mu) = zero ; gxfj(2,mu) = d2gxdt(1,mu,jlmn,ia,jspinor)
1371 : : else
1372 : 14040 : cplex_ = cplex ;
1373 [ + + ]: 42120 : gxfi(1:cplex) =d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1374 [ + + ]: 42120 : gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,jspinor)
1375 : : end if
1376 : 14040 : d2gxdtfac_(1,mu,jlmn,ia,jspinor)=d2gxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
1377 : 14040 : d2gxdtfac_(2,mu,jlmn,ia,jspinor)=d2gxdtfac_(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
1378 [ + - ]: 28080 : if (cplex_==2) then
1379 : 14040 : d2gxdtfac_(1,mu,jlmn,ia,jspinor)=d2gxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
1380 : 14040 : d2gxdtfac_(2,mu,jlmn,ia,jspinor)=d2gxdtfac_(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
1381 : : end if
1382 : : end do
1383 [ + + ]: 99360 : do ilmn=1,jlmn-1
1384 : 84240 : ijlmn=j0lmn+ilmn
1385 [ + + ]: 252720 : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
1386 [ + + ]: 182520 : do mu=1,nd2gxdtfac
1387 [ - + ]: 84240 : if(cplex_d2gxdt(mu)==2)then
1388 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,ispinor)
1389 : : else
1390 [ + + ]: 252720 : cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1391 : : end if
1392 : 84240 : d2gxdtfac_(1,mu,jlmn,ia,jspinor)=d2gxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
1393 : 84240 : d2gxdtfac_(2,mu,jlmn,ia,jspinor)=d2gxdtfac_(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
1394 : : #if !defined HAVE_OPENMP
1395 : 84240 : d2gxdtfac_(1,mu,ilmn,ia,ispinor)=d2gxdtfac_(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
1396 : 84240 : d2gxdtfac_(2,mu,ilmn,ia,ispinor)=d2gxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
1397 : : #endif
1398 [ + - ]: 168480 : if (cplex_==2) then
1399 : 84240 : d2gxdtfac_(1,mu,jlmn,ia,jspinor)=d2gxdtfac_(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
1400 : 84240 : d2gxdtfac_(2,mu,jlmn,ia,jspinor)=d2gxdtfac_(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
1401 : : #if !defined HAVE_OPENMP
1402 : 84240 : d2gxdtfac_(1,mu,ilmn,ia,ispinor)=d2gxdtfac_(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
1403 : 84240 : d2gxdtfac_(2,mu,ilmn,ia,ispinor)=d2gxdtfac_(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
1404 : : #endif
1405 : : end if
1406 : : end do !mu
1407 : : end do !ilmn
1408 : : #if defined HAVE_OPENMP
1409 : : if(jlmn<nlmn) then
1410 : : do ilmn=jlmn+1,nlmn
1411 : : i0lmn=ilmn*(ilmn-1)/2
1412 : : ijlmn=i0lmn+jlmn
1413 : : enl_(1:2)=enl_ptr(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
1414 : : do mu=1,nd2gxdtfac
1415 : : if(cplex_d2gxdt(mu)==2)then
1416 : : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,jspinor)
1417 : : else
1418 : : cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,jspinor)
1419 : : end if
1420 : : d2gxdtfac_(1,mu,jlmn,ia,ispinor)=d2gxdtfac_(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
1421 : : d2gxdtfac_(2,mu,jlmn,ia,ispinor)=d2gxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
1422 : : if (cplex_==2) then
1423 : : d2gxdtfac_(1,mu,jlmn,ia,ispinor)=d2gxdtfac_(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
1424 : : d2gxdtfac_(2,mu,jlmn,ia,ispinor)=d2gxdtfac_(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
1425 : : end if
1426 : : end do !mu
1427 : : end do !ilmn
1428 : : end if
1429 : : #endif
1430 : : end do !jmln
1431 : : !$OMP END DO
1432 : : end do !ia
1433 : : end do !ispinor
1434 [ - + ]: 270 : ABI_FREE(gxfj)
1435 : : !$OMP END PARALLEL
1436 : :
1437 : : ! --- Parallelization over spinors ---
1438 [ - + - - ]: 3903 : else if (nspinortot==2.and.nspinor/=nspinortot) then
1439 [ # # ]: 0 : ABI_CHECK(cplex_enl==2,"BUG: opernlc_ylm: invalid cplex_enl/=2!")
1440 [ # # ]: 0 : ABI_CHECK(cplex_fac==2,"BUG: opernlc_ylm: invalid cplex_fac/=2!")
1441 [ # # # # : 0 : ABI_MALLOC(d2gxdtfac_offdiag,(cplex_fac,nd2gxdtfac,nlmn,nincat,nspinortot))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
1442 : : !$OMP PARALLEL &
1443 : : !$OMP PRIVATE(ia,index_enl), &
1444 : : !$OMP PRIVATE(jlmn,j0lmn,ilmn,i0lmn,ijlmn,enl_,jilmn,mu,gxfi)
1445 : : !$OMP WORKSHARE
1446 [ # # # # : 0 : d2gxdtfac_offdiag(:,:,:,:,:)=zero
# # # # #
# ]
1447 : : !$OMP END WORKSHARE
1448 : : !$OMP SINGLE
1449 : 0 : ispinor_index=mpi_enreg%me_spinor+1
1450 : 0 : jspinor_index=3-ispinor_index
1451 [ # # ]: 0 : if (ispinor_index==1) then
1452 : : ijspin=3;jispin=4
1453 : : else
1454 : 0 : ijspin=4;jispin=3
1455 : : end if
1456 : : !$OMP END SINGLE
1457 [ # # ]: 0 : do ia=1,nincat
1458 : 0 : index_enl=atindx1(iatm+ia)
1459 : : !$OMP DO
1460 [ # # ]: 0 : do jlmn=1,nlmn
1461 : 0 : j0lmn=jlmn*(jlmn-1)/2
1462 [ # # ]: 0 : do ilmn=1,nlmn
1463 : 0 : i0lmn=ilmn*(ilmn-1)/2
1464 [ # # ]: 0 : if (ilmn<=jlmn) then
1465 : 0 : ijlmn=j0lmn+ilmn
1466 : 0 : enl_(1)= enl_ptr(2*ijlmn-1,index_enl,ijspin)
1467 : 0 : enl_(2)=-enl_ptr(2*ijlmn ,index_enl,ijspin)
1468 : : else
1469 : 0 : jilmn=i0lmn+jlmn
1470 : 0 : enl_(1)= enl_ptr(2*jilmn-1,index_enl,jispin)
1471 : 0 : enl_(2)= enl_ptr(2*jilmn ,index_enl,jispin)
1472 : : end if
1473 [ # # ]: 0 : do mu=1,nd2gxdtfac
1474 [ # # ]: 0 : if(cplex_d2gxdt(mu)==2)then
1475 : 0 : cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,1)
1476 : : else
1477 [ # # ]: 0 : cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,1)
1478 : : end if
1479 : : d2gxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)= &
1480 : 0 : & d2gxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(1)
1481 : : d2gxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)= &
1482 : 0 : & d2gxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)+enl_(2)*gxfi(1)
1483 [ # # ]: 0 : if (cplex_==2) then
1484 : : d2gxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)= &
1485 : 0 : & d2gxdtfac_offdiag(1,mu,jlmn,ia,jspinor_index)-enl_(2)*gxfi(2)
1486 : : d2gxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)= &
1487 : 0 : & d2gxdtfac_offdiag(2,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(2)
1488 : : end if
1489 : : end do
1490 : : end do !ilmn
1491 : : end do !jlmn
1492 : : !$OMP END DO
1493 : : end do !iat
1494 : : !$OMP SINGLE
1495 : 0 : call xmpi_sum(d2gxdtfac_offdiag,mpi_enreg%comm_spinor,ierr)
1496 : : !$OMP END SINGLE
1497 : : !$OMP WORKSHARE
1498 [ # # # # : 0 : d2gxdtfac_(:,:,:,:,1)=d2gxdtfac_(:,:,:,:,1)+d2gxdtfac_offdiag(:,:,:,:,ispinor_index)
# # # # ]
1499 : : !$OMP END WORKSHARE
1500 : : !$OMP END PARALLEL
1501 [ # # ]: 0 : ABI_FREE(d2gxdtfac_offdiag)
1502 : : end if !nspinortot
1503 : :
1504 : : end if ! pawopt & optder
1505 : :
1506 : : !End of loop when a exp(-iqR) phase is present
1507 : : !------------------------------------------- ------------------------
1508 : :
1509 : : !When iphase=1, gxfac and gxfac_ point to the same memory space
1510 : : !When iphase=2, we add i.gxfac_ to gxfac
1511 [ + + ]: 74367108 : if (iphase==2) then
1512 : : !$OMP PARALLEL PRIVATE(ispinor,ia,ilmn,mu)
1513 : : !$OMP DO COLLAPSE(3)
1514 [ + + ]: 10656280 : do ispinor=1,nspinor
1515 [ + + ]: 16057012 : do ia=1,nincat
1516 [ + + ]: 54328916 : do ilmn=1,nlmn
1517 : 43600044 : gxfac(1,ilmn,ia,ispinor)=gxfac(1,ilmn,ia,ispinor)-gxfac_(2,ilmn,ia,ispinor)
1518 : 49000776 : gxfac(2,ilmn,ia,ispinor)=gxfac(2,ilmn,ia,ispinor)+gxfac_(1,ilmn,ia,ispinor)
1519 : : end do
1520 : : end do
1521 : : end do
1522 : : !$OMP SINGLE
1523 [ - + ]: 5328140 : ABI_FREE(gxfac_)
1524 : : !$OMP END SINGLE
1525 [ + + ]: 5328140 : if (optder>=1) then
1526 : : !$OMP DO COLLAPSE(4)
1527 [ + + ]: 221688 : do ispinor=1,nspinor
1528 [ + + ]: 376740 : do ia=1,nincat
1529 [ + + ]: 1463940 : do ilmn=1,nlmn
1530 [ + + ]: 2551140 : do mu=1,ndgxdtfac
1531 : 1198044 : dgxdtfac(1,mu,ilmn,ia,ispinor)=dgxdtfac(1,mu,ilmn,ia,ispinor)-dgxdtfac_(2,mu,ilmn,ia,ispinor)
1532 : 2396088 : dgxdtfac(2,mu,ilmn,ia,ispinor)=dgxdtfac(2,mu,ilmn,ia,ispinor)+dgxdtfac_(1,mu,ilmn,ia,ispinor)
1533 : : end do
1534 : : end do
1535 : : end do
1536 : : end do
1537 : : !$OMP SINGLE
1538 [ - + ]: 110844 : ABI_FREE(dgxdtfac_)
1539 : : !$OMP END SINGLE
1540 : : end if
1541 [ - + ]: 5328140 : if (optder>=2) then
1542 : : !$OMP DO COLLAPSE(4)
1543 [ # # ]: 0 : do ispinor=1,nspinor
1544 [ # # ]: 0 : do ia=1,nincat
1545 [ # # ]: 0 : do ilmn=1,nlmn
1546 [ # # ]: 0 : do mu=1,nd2gxdtfac
1547 : 0 : d2gxdtfac(1,mu,ilmn,ia,ispinor)=d2gxdtfac(1,mu,ilmn,ia,ispinor)-d2gxdtfac_(2,mu,ilmn,ia,ispinor)
1548 : 0 : d2gxdtfac(2,mu,ilmn,ia,ispinor)=d2gxdtfac(2,mu,ilmn,ia,ispinor)+d2gxdtfac_(1,mu,ilmn,ia,ispinor)
1549 : : end do
1550 : : end do
1551 : : end do
1552 : : end do
1553 : : !$OMP SINGLE
1554 [ # # ]: 0 : ABI_FREE(d2gxdtfac_)
1555 : : !$OMP END SINGLE
1556 : : end if
1557 : : !$OMP END PARALLEL
1558 : : end if
1559 : :
1560 : : !End loop over real/imaginary part of the exp(-iqR) phase
1561 : : end do
1562 : :
1563 : :
1564 : : !Accumulate gxfac related to overlap (Sij) (PAW)
1565 : : !------------------------------------------- ------------------------
1566 [ + + ]: 35673080 : if (paw_opt==3.or.paw_opt==4) then ! Use Sij, overlap contribution
1567 : : !$OMP PARALLEL &
1568 : : !$OMP PRIVATE(ispinor,ia,jlmn,i0lmn,j0lmn,jjlmn,jlm,sijr,ilmn,ilm,ijlmn,gxi,gxj)
1569 : : !$OMP WORKSHARE
1570 [ + + + + : 1011872665 : gxfac_sij(1:cplex,1:nlmn,1:nincat,1:nspinor)=zero
+ + + + ]
1571 : : !$OMP END WORKSHARE
1572 : : !$OMP DO COLLAPSE(3)
1573 [ + + ]: 37685506 : do ispinor=1,nspinor
1574 [ + + ]: 66033951 : do ia=1,nincat
1575 [ + + ]: 374319130 : do jlmn=1,nlmn
1576 : 326171354 : j0lmn=jlmn*(jlmn-1)/2
1577 : 326171354 : jjlmn=j0lmn+jlmn
1578 : 326171354 : jlm=indlmn(4,jlmn)
1579 : 326171354 : sijr=sij(jjlmn)
1580 [ + + ]: 945838714 : gxj(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
1581 [ + + ]: 945838714 : gxfac_sij(1:cplex,jlmn,ia,ispinor)=gxfac_sij(1:cplex,jlmn,ia,ispinor)+sijr*gxj(1:cplex)
1582 [ + + ]: 2567167964 : do ilmn=1,jlmn-1
1583 : 2212648165 : ilm=indlmn(4,ilmn)
1584 : : !if (ilm==jlm) then
1585 : 2212648165 : ijlmn=j0lmn+ilmn
1586 : 2212648165 : sijr=sij(ijlmn)
1587 [ + + ]: 6502818957 : gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
1588 [ + + ]: 6502818957 : gxfac_sij(1:cplex,jlmn,ia,ispinor)=gxfac_sij(1:cplex,jlmn,ia,ispinor)+sijr*gxi(1:cplex)
1589 : : #if !defined HAVE_OPENMP
1590 [ + + ]: 6828990311 : gxfac_sij(1:cplex,ilmn,ia,ispinor)=gxfac_sij(1:cplex,ilmn,ia,ispinor)+sijr*gxj(1:cplex)
1591 : : #endif
1592 : : !end if
1593 : : end do
1594 : : #if defined HAVE_OPENMP
1595 : : if(jlmn<nlmn) then
1596 : : do ilmn=jlmn+1,nlmn
1597 : : ilm=indlmn(4,ilmn)
1598 : : !if (ilm==jlm) then
1599 : : i0lmn=ilmn*(ilmn-1)/2
1600 : : ijlmn=i0lmn+jlmn
1601 : : sijr=sij(ijlmn)
1602 : : gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
1603 : : gxfac_sij(1:cplex,jlmn,ia,ispinor)=gxfac_sij(1:cplex,jlmn,ia,ispinor)+sijr*gxi(1:cplex)
1604 : : !end if
1605 : : end do
1606 : : end if
1607 : : #endif
1608 : : end do
1609 : : end do
1610 : : end do
1611 : : !$OMP END DO
1612 : : !$OMP END PARALLEL
1613 : : end if
1614 : :
1615 : : !Accumulate dgxdtfac related to overlap (Sij) (PAW)
1616 : : !-------------------------------------------------------------------
1617 [ + + + + ]: 35673080 : if (optder>=1.and.(paw_opt==3.or.paw_opt==4)) then ! Use Sij, overlap contribution
1618 : : !$OMP PARALLEL &
1619 : : !$OMP PRIVATE(ispinor,ia), &
1620 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,sijr,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
1621 [ - + + - : 7008692 : ABI_MALLOC(gxfj,(cplex,ndgxdtfac))
- + + - +
- + - - +
- + ]
1622 : : !$OMP WORKSHARE
1623 [ + + + + : 80109388 : dgxdtfac_sij(1:cplex,1:ndgxdtfac,1:nlmn,1:nincat,1:nspinor)=zero
+ + + + +
+ ]
1624 : : !$OMP END WORKSHARE
1625 [ + + ]: 3593320 : do ispinor=1,nspinor
1626 [ + + ]: 5595978 : do ia=1,nincat
1627 : : !$OMP DO
1628 [ + + ]: 21380639 : do jlmn=1,nlmn
1629 : 17536834 : j0lmn=jlmn*(jlmn-1)/2
1630 : 17536834 : jjlmn=j0lmn+jlmn
1631 : 17536834 : sijr=sij(jjlmn)
1632 [ + + ]: 36529026 : do mu=1,ndgxdtfac
1633 [ + + ]: 56976576 : gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,ispinor)
1634 [ + + ]: 74513410 : dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
1635 : : end do
1636 [ + + ]: 94742744 : do ilmn=1,jlmn-1
1637 : 75203252 : ijlmn=j0lmn+ilmn
1638 : 75203252 : sijr=sij(ijlmn)
1639 [ + + ]: 173936990 : do mu=1,ndgxdtfac
1640 [ + + ]: 243590712 : gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
1641 [ + + ]: 243590712 : dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
1642 : : #if !defined HAVE_OPENMP
1643 [ + + ]: 318793964 : dgxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
1644 : : #endif
1645 : : end do
1646 : : end do
1647 : : #if defined HAVE_OPENMP
1648 : : if(jlmn<nlmn) then
1649 : : do ilmn=jlmn+1,nlmn
1650 : : i0lmn=ilmn*(ilmn-1)/2
1651 : : ijlmn=i0lmn+jlmn
1652 : : sijr=sij(ijlmn)
1653 : : do mu=1,ndgxdtfac
1654 : : gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
1655 : : dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
1656 : : end do
1657 : : end do
1658 : : end if
1659 : : #endif
1660 : : end do
1661 : : !$OMP END DO
1662 : : end do
1663 : : end do
1664 [ - + ]: 1752173 : ABI_FREE(gxfj)
1665 : : !$OMP END PARALLEL
1666 : : end if
1667 : :
1668 : : !Accumulate d2gxdtfac related to overlap (Sij) (PAW)
1669 : : !-------------------------------------------------------------------
1670 [ + + + + ]: 35673080 : if (optder==2.and.(paw_opt==3.or.paw_opt==4)) then ! Use Sij, overlap contribution
1671 : : !$OMP PARALLEL &
1672 : : !$OMP PRIVATE(ispinor,ia), &
1673 : : !$OMP PRIVATE(jlmn,j0lmn,jjlmn,sijr,mu,gxfj,ilmn,i0lmn,ijlmn,gxfi)
1674 [ - + + - : 131892 : ABI_MALLOC(gxfj,(cplex,nd2gxdtfac))
- + + - +
- + - - +
- + ]
1675 : : !$OMP WORKSHARE
1676 [ + + + + : 1207254 : d2gxdtfac_sij(1:cplex,1:nd2gxdtfac,1:nlmn,1:nincat,1:nspinor)=zero
+ + + + +
+ ]
1677 : : !$OMP END WORKSHARE
1678 [ + + ]: 66216 : do ispinor=1,nspinor
1679 [ + + ]: 100062 : do ia=1,nincat
1680 : : !$OMP DO
1681 [ + + ]: 343887 : do jlmn=1,nlmn
1682 : 276798 : j0lmn=jlmn*(jlmn-1)/2
1683 : 276798 : jjlmn=j0lmn+jlmn
1684 : 276798 : sijr=sij(jjlmn)
1685 [ + + ]: 553596 : do mu=1,nd2gxdtfac
1686 [ + + ]: 830394 : gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1687 : : d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)= &
1688 [ + + ]: 1107192 : & d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
1689 : : end do
1690 [ + + ]: 1318632 : do ilmn=1,jlmn-1
1691 : 1007988 : ijlmn=j0lmn+ilmn
1692 : 1007988 : sijr=sij(ijlmn)
1693 [ + + ]: 2292774 : do mu=1,nd2gxdtfac
1694 [ + + ]: 3023964 : gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1695 : : d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)= &
1696 [ + + ]: 3023964 : & d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
1697 : : #if !defined HAVE_OPENMP
1698 : : d2gxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)= &
1699 [ + + ]: 4031952 : & d2gxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
1700 : : #endif
1701 : : end do
1702 : : end do
1703 : : #if defined HAVE_OPENMP
1704 : : if(jlmn<nlmn) then
1705 : : do ilmn=jlmn+1,nlmn
1706 : : i0lmn=ilmn*(ilmn-1)/2
1707 : : ijlmn=i0lmn+jlmn
1708 : : sijr=sij(ijlmn)
1709 : : do mu=1,nd2gxdtfac
1710 : : gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1711 : : d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)= &
1712 : : & d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
1713 : : end do
1714 : : end do
1715 : : end if
1716 : : #endif
1717 : : end do
1718 : : !$OMP END DO
1719 : : end do
1720 : : end do
1721 [ - + ]: 32973 : ABI_FREE(gxfj)
1722 : : !$OMP END PARALLEL
1723 : : end if
1724 : :
1725 [ + + - + : 71346160 : end subroutine opernlc_ylm
- + - + -
+ ]
1726 : : !!***
1727 : :
1728 : : ! ---------------------------------------------------------------------------------------
1729 : :
1730 : : !!****f* m_opernlc_ylm/ls_ylm
1731 : : !! NAME
1732 : : !! ls_ylm
1733 : : !!
1734 : : !! FUNCTION
1735 : : !! Compute L.S operator matrix elements in real spherical harmonics basis.
1736 : : !! Upper triangle only (ilm<=jlm), packed as klm=jlm*(jlm-1)/2+ilm.
1737 : : !! ls_ylm(1,:,:)=Re, ls_ylm(2,:,:)=Im; ispin=1: up-up, ispin=2: up-dn.
1738 : : !! Adapted from m_paw_sphharm; tso debug blocks removed.
1739 : : !!
1740 : : !! SOURCE
1741 : :
1742 : 6570 : subroutine ls_ylm(ls_mat, lmax)
1743 : :
1744 : : !Arguments ---------------------------------------------
1745 : : integer, intent(in) :: lmax
1746 : : real(dp), allocatable, intent(inout) :: ls_mat(:,:,:)
1747 : :
1748 : : !Local variables ---------------------------------------
1749 : : integer :: im, jm, jlm, is, ll, lm0, mm
1750 : : real(dp), parameter :: isq2 = one/sqrt2
1751 : 6570 : complex(dp), allocatable :: U(:,:), LS(:,:,:), W(:,:)
1752 : : ! *************************************************************************
1753 : :
1754 [ + + + + : 1793610 : ls_mat = zero
+ + ]
1755 [ - + ]: 6570 : if (lmax <= 0) return
1756 : :
1757 [ + + ]: 19710 : do ll = 1, lmax
1758 : 13140 : lm0 = ll**2
1759 [ - + + - : 52560 : ABI_MALLOC(U, (2*ll+1, 2*ll+1))
- + + - +
- - + - +
- + ]
1760 [ - + + - : 65700 : ABI_MALLOC(LS, (2*ll+1, 2*ll+1, 2))
- + + - +
- + - - +
- + ]
1761 [ - + + - : 39420 : ABI_MALLOC(W, (2*ll+1, 2*ll+1))
- + + - -
+ - + ]
1762 [ + + + + : 867240 : U = czero; LS = czero
+ + + + +
+ ]
1763 : :
1764 : : ! Build U (real->complex Ylm transform) and LS (L.S in complex Ylm basis) in one pass
1765 [ + + ]: 65700 : do im = 1, 2*ll+1
1766 : 52560 : mm = im-ll-1
1767 [ + + ]: 52560 : if (mm > 0) then
1768 : 19710 : U(im,im) = (-1)**mm * isq2; U(-mm+ll+1,im) = isq2
1769 [ + + ]: 32850 : else if (mm == 0) then
1770 : 13140 : U(im,im) = cone
1771 : : else
1772 : 19710 : U(im,im) = cmplx(zero, isq2, dp); U(-mm+ll+1,im) = cmplx(zero, -(-1)**(-mm)*isq2, dp)
1773 : : end if
1774 : 52560 : LS(im,im,1) = half*mm
1775 [ + + ]: 52560 : if (mm+1 <= ll) LS(im,im+1,2) = half*sqrt(real((ll-mm)*(ll+mm+1), dp))
1776 [ + + ]: 65700 : if (mm-1 >= -ll) LS(im-1,im,2) = half*sqrt(real((ll+mm)*(ll-mm+1), dp))
1777 : : end do
1778 : :
1779 : : ! Transform to real Ylm basis via W = U^H * LS * U, store upper triangle
1780 [ + + ]: 39420 : do is = 1, 2
1781 [ - + + - : 8330760 : W = matmul(conjg(transpose(U)), matmul(LS(:,:,is), U))
- + + - +
- - + - +
+ + + + +
+ + + + +
+ - + - +
- - + - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - + + +
+ + + + +
+ + + - +
- - - - -
+ - ]
1782 [ + + ]: 144540 : do jm = 1, 2*ll+1
1783 : 105120 : jlm = lm0+jm
1784 [ + + ]: 407340 : do im = 1, jm
1785 : 275940 : ls_mat(1, jlm*(jlm-1)/2+lm0+im, is) = real(W(im,jm), dp)
1786 : 381060 : ls_mat(2, jlm*(jlm-1)/2+lm0+im, is) = aimag(W(im,jm))
1787 : : end do
1788 : : end do
1789 : : end do
1790 : :
1791 [ - + ]: 13140 : ABI_FREE(U)
1792 [ - + ]: 13140 : ABI_FREE(LS)
1793 [ - + ]: 19710 : ABI_FREE(W)
1794 : : end do
1795 : :
1796 [ - + ]: 6570 : end subroutine ls_ylm
1797 : : !!***
1798 : :
1799 [ + - ]: 26280 : end module m_opernlc_ylm
1800 : : !!***
|