Line data Source code
1 : !!****m* ABINIT/m_opernla_ylm
2 : !! NAME
3 : !! m_opernla_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_opernla_ylm
22 :
23 : use defs_basis
24 : use m_abicore
25 : use m_errors
26 : use m_xmpi
27 : #if defined HAVE_OPENMP
28 : use OMP_LIB
29 : #endif
30 :
31 : use defs_abitypes, only : MPI_type
32 : use m_time, only : timab
33 :
34 : implicit none
35 :
36 : private
37 : !!***
38 :
39 : public :: opernla_ylm
40 : integer,public,save :: opernla_counter = -1
41 :
42 : contains
43 : !!***
44 :
45 : !!****f* ABINIT/opernla_ylm
46 : !! NAME
47 : !! opernla_ylm
48 : !!
49 : !! FUNCTION
50 : !! For a given wave-function |c>, get all projected scalars
51 : !! <p_lmn|c> where |p_lmn> are non-local projectors
52 : !! With:
53 : !! <p_lmn|c>=4pi/sqrt(vol) (i)^l Sum_g[c(g).f_nl(g).Y_lm(g).exp(2pi.i.g.R)]
54 : !!
55 : !! INPUTS
56 : !! choice=chooses possible output:
57 : !! if choice>=0: compute projected scalars
58 : !! if choice<0: same as choice>0 but use already computed projected scalars
59 : !! if ABS(choice)>1, then compute additional quantities:
60 : !! 2: compute projected scalars and derivatives wrt atm pos.
61 : !! 3: compute projected scalars and derivatives wrt strains
62 : !! 22: compute projected scalars and 2nd derivatives wrt atm pos. and q-vector.
63 : !! 23: compute projected scalars, derivatives wrt atm pos. and derivatives wrt strains
64 : !! 25: compute projected scalars and 3rd derivatives wrt atm pos. and two q-vectors.
65 : !! 4, 24: compute projected scalars, derivatives wrt atm pos.
66 : !! and 2nd derivatives wrt atm pos.
67 : !! 33: compute projected scalars and 2nd derivatives wrt strain and q-vector.
68 : !! 5,51,52: compute projected scalars and derivatives wrt wave vector k
69 : !! 53: compute projected scalars and derivatives wrt wave vector k in direction idir+1 and idir+2 mod 3
70 : !! 54: compute projected scalars, deriv. wrt atm pos., deriv. wrt wave vector k
71 : !! and 2nd derivatives wrt right wave vector k and atm pos.
72 : !! 55: compute projected scalars, deriv. strains, deriv. wrt wave vector k
73 : !! and 2nd derivatives wrt right wave vector k and strain
74 : !! 6: compute projected scalars, derivatives wrt atm pos., derivatives wrt strains,
75 : !! 2nd derivatives wrt 2 strains and derivatives wrt strain and atm pos.
76 : !! 7: not available
77 : !! 8: compute projected scalars, derivatives wrt wave vector k
78 : !! and 2nd derivatives wrt 2 wave vectors k
79 : !! cplex=1 if <p_lmn|c> scalars are real or pure imaginary (equivalent to istwfk>1)
80 : !! 2 if <p_lmn|c> scalars are complex
81 : !! dimffnl=second dimension of ffnl
82 : !! ffnl(npw,dimffnl,nlmn)= nonlocal quantities containing nonlocal form factors
83 : !! ia3=gives the number of the first atom in the subset presently treated
84 : !! idir=direction of the - atom to be moved in the case (choice=2,signs=2) or (choice=22,signs=2)
85 : !! - k point direction in the case (choice=5,signs=2)
86 : !! - strain component (1:6) in the case (choice=3,signs=2) or (choice=6,signs=1)
87 : !! - strain component (1:9) in the case (choice=33,signs=2)
88 : !! - (1:9) components to specify the atom to be moved and the second q-gradient
89 : !! direction in the case (choice=25,signs=2)
90 : !! indlmn(6,nlmn)= array giving l,m,n,lm,ln,s for i=lmn
91 : !! istwf_k=option parameter that describes the storage of wfs
92 : !! kpg(npw,nkpg)=(k+G) components for ikpg=1...3 (if nkpg=3 or 9)
93 : !! [(k+G)_a].[(k+G)_b] quantities for ikpg=4...9 (if nkpg=9)
94 : !! (k+G) Cartesian components for choice==33
95 : !! matblk=dimension of the array ph3d
96 : !! mpi_enreg=information about MPI parallelization
97 : !! ndgxdt=second dimension of dgxdt
98 : !! nd2gxdt=second dimension of d2gxdt
99 : !! nincat=number of atoms in the subset here treated
100 : !! nkpg=second dimension of array kpg (0, 3 or 9)
101 : !! nlmn=number of (l,m,n) numbers for current type of atom
102 : !! nloalg(3)=governs the choice of the algorithm for non-local operator.
103 : !! npw=number of plane waves in reciprocal space
104 : !! nspinor=number of spinorial components of the wavefunctions (on current proc)
105 : !! ph3d(2,npw,matblk)=three-dimensional phase factors
106 : !! [qdir]= optional, direction of the q-gradient (only for choice=22 choice=25 and choice=33)
107 : !! signs=chooses possible output:
108 : !! signs=1: compute derivatives in all directions
109 : !! signs=2: compute derivative in direction IDIR only
110 : !! compatible only with 1st-order derivatives and "single" derivatives
111 : !! ucvol=unit cell volume (bohr^3)
112 : !! vect(2,npw*my_nspinor)=starting vector in reciprocal space
113 : !!
114 : !! OUTPUT
115 : !! if (choice>1) dgxdt(cplex,ndgxdt,nlmn,nincat,nspinor)=
116 : !! gradients of projected scalars wrt coords (choice=2, 23, 4, 54, 6)
117 : !! wrt strains (choice=3, 23, 55)
118 : !! wrt k wave vect. (choice=5, 51, 52, 53, 54, 55, 8)
119 : !! wrt coords and q vect (choice=22)
120 : !! wrt coords and two q vects (choice=25)
121 : !! wrt strains and q vect (choice=33)
122 : !! if (choice=4, 24, 33, 54, 55, 6, 8) d2gxdt(cplex,nd2gxdt,nlmn,nincat,nspinor)=
123 : !! 2nd grads of projected scalars wrt 2 coords (choice=4 or 24)
124 : !! wrt coords & k wave vect. (choice=54)
125 : !! wrt strains & k wave vect. (choice=55)
126 : !! wrt coords & strains (choice=6)
127 : !! wrt 2 strains (choice=6)
128 : !! wrt 2 k wave vect. (choice=8)
129 : !! wrt strains and q vect (choice=33)
130 : !! only compatible with signs=1
131 : !! cplex_dgxdt(ndgxdt) = used only when cplex = 1
132 : !! cplex_dgxdt(i) = 1 if dgxdt(1,i,:,:) is real, 2 if it is pure imaginary
133 : !! cplex_d2gxdt(nd2gxdt) = used only when cplex = 1
134 : !! cplex_d2gxdt(i) = 1 if d2gxdt(1,i,:,:) is real, 2 if it is pure imaginary
135 : !!
136 : !! SIDE EFFECTS
137 : !! gx(cplex,nlmn,nincat,nspinor)= projected scalars - input if choice<0, output if choice>=0
138 : !!
139 : !! NOTES
140 : !! 1-The openMP version is different from the standard version:
141 : !! the standard version is more effifient on one CPU core.
142 : !! 2-Operate for one type of atom, and within this given type of atom,
143 : !! for a subset of at most nincat atoms.
144 : !!
145 : !! SOURCE
146 :
147 58796696 : subroutine opernla_ylm(choice,cplex,cplex_dgxdt,cplex_d2gxdt,dimffnl,d2gxdt,dgxdt,ffnl,gx,&
148 29398348 : & ia3,idir,indlmn,istwf_k,kpg,matblk,mpi_enreg,nd2gxdt,ndgxdt,nincat,nkpg,nlmn,&
149 29398348 : & nloalg,npw,nspinor,ph3d,signs,ucvol,vect,qdir)
150 :
151 : !Arguments ------------------------------------
152 : !scalars
153 : integer,intent(in) :: choice,cplex,dimffnl,ia3,idir,istwf_k,matblk,nd2gxdt
154 : integer,intent(in) :: ndgxdt,nincat,nkpg,nlmn,npw,nspinor,signs
155 : integer,intent(in),optional :: qdir
156 : real(dp),intent(in) :: ucvol
157 : type(MPI_type),intent(in) :: mpi_enreg
158 : !arrays
159 : integer,intent(in) :: indlmn(6,nlmn),nloalg(3)
160 : integer,intent(out) :: cplex_dgxdt(ndgxdt),cplex_d2gxdt(nd2gxdt)
161 : real(dp),intent(in) :: ffnl(npw,dimffnl,nlmn),kpg(npw,nkpg),ph3d(2,npw,matblk)
162 : real(dp),intent(in) :: vect(:,:)
163 : real(dp),intent(out) :: d2gxdt(cplex,nd2gxdt,nlmn,nincat,nspinor)
164 : real(dp),intent(out) :: dgxdt(cplex,ndgxdt,nlmn,nincat,nspinor),gx(cplex,nlmn,nincat,nspinor)
165 :
166 : !Local variables-------------------------------
167 : !scalars
168 : integer :: choice_,gama,gamb,gamc,gamd,ia,iaph3d,ialpha,ibeta,idelta,idelgam
169 : integer :: ierr,igamma,il,ilmn,ipw,ipw0,ipwshft,ispinor,jpw,mu,mu0
170 : integer :: mua,mub,ndir,nthreads,nua1,nua2,nub1,nub2
171 : real(dp), parameter :: two_pi2=two_pi*two_pi
172 : real(dp) :: aux_i,aux_i2,aux_i3,aux_i4
173 : real(dp) :: aux_r,aux_r2,aux_r3,aux_r4
174 : real(dp) :: buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5,buffer_i6
175 : real(dp) :: buffer_ia,buffer_ib,buffer_ic,buffer_id,buffer_ie,buffer_if
176 : real(dp) :: buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5,buffer_r6
177 : real(dp) :: buffer_ra,buffer_rb,buffer_rc,buffer_rd,buffer_re,buffer_rf
178 : real(dp) :: kpga,kpgb,kpgc,kpgd,scale,scale2,wt
179 : logical :: check,parity
180 : !arrays
181 : integer,parameter :: alpha(6)=(/1,2,3,3,3,2/),beta(6)=(/1,2,3,2,1,1/)
182 : integer,parameter :: nalpha(9)=(/1,2,3,3,3,2,2,1,1/),nbeta(9)=(/1,2,3,2,1,1,3,3,2/)
183 : integer,parameter :: gamma(3,3)=reshape((/1,6,5,6,2,4,5,4,3/),(/3,3/))
184 : integer,parameter :: ffnl_dir_dat(6)=(/2,3,3,1,1,2/)
185 : integer,parameter :: idir1(9)=(/1,1,1,2,2,2,3,3,3/),idir2(9)=(/1,2,3,1,2,3,1,2,3/)
186 : integer :: ffnl_dir(2)
187 : real(dp) :: tsec(2)
188 : ! real(dp),allocatable :: kpg(:,:)
189 29398348 : real(dp),allocatable :: scali(:),scalr(:),scalari(:,:),scalarr(:,:)
190 : ! *************************************************************************
191 :
192 29398348 : if (choice==-1) return
193 :
194 : !Useful variables
195 29398348 : choice_=abs(choice)
196 29398348 : wt=four_pi/sqrt(ucvol);if (cplex==1) wt=2.d0*wt
197 58366953 : ipw0=1;if (istwf_k==2.and.mpi_enreg%me_g0_fft==1) ipw0=2
198 36610873 : cplex_dgxdt(:) = 0 ; if (cplex == 1) cplex_dgxdt(:) = 1
199 31345729 : cplex_d2gxdt(:) = 0 ; if (cplex == 1) cplex_d2gxdt(:) = 1
200 29398348 : nthreads=1
201 :
202 : !Check compatibility of options
203 29398348 : if (signs==1) then
204 : ! signs=1, almost all choices
205 : check=(choice_==0 .or.choice_==1 .or.choice_==2 .or.choice_==3 .or.choice_==4 .or.&
206 : & choice_==23.or.choice_==24.or.choice_==5 .or.choice_==51.or.choice_==52.or.&
207 : & choice_==53.or.choice_==54.or.choice_==55.or.&
208 3297279 : & choice_==6 .or.choice_==8 .or.choice_==81)
209 0 : ABI_CHECK(check,'BUG: choice not compatible (for signs=1)')
210 : end if
211 29398348 : if (signs==2) then
212 : ! signs=2,less choices
213 : check=(choice_== 0.or.choice_== 1.or.choice_== 2.or.choice_==3.or.choice_==5.or.&
214 : & choice_==22.or.choice_==23.or.choice==25.or.choice_==33.or.&
215 : & choice_==51.or.choice_==52.or.choice_==53.or.choice_==54.or.choice_==55.or.&
216 26101069 : & choice_== 8.or.choice_==81)
217 0 : ABI_CHECK(check,'BUG: signs=2 not compatible with this choice')
218 : end if
219 29398348 : if (choice_==3.and.signs==2) then
220 : ! 1<=idir<=6 is required when choice=3 and signs=2
221 275952 : check=(idir>=1.and.idir<=6)
222 275952 : ABI_CHECK(check,'BUG: choice=3 and signs=2 requires 1<=idir<=6')
223 29122396 : else if (choice_==25.and.signs==2) then
224 : ! 1<=idir<=9 is required when choice=25 and signs=2
225 248832 : check=(idir>=1.and.idir<=9)
226 248832 : ABI_CHECK(check,'BUG: choice=25 and signs=2 requires 1<=idir<=9')
227 28873564 : else if (choice_==33.and.signs==2) then
228 : ! 1<=idir<=9 is required when choice=33 and signs=2
229 373248 : check=(idir>=1.and.idir<=9)
230 373248 : ABI_CHECK(check,'BUG: choice=33 and signs=2 requires 1<=idir<=9')
231 28500316 : else if ((choice_==8.or.choice_==81.or.choice_==54).and.signs==2) then
232 : ! 1<=idir<=9 is required when choice=8 and signs=2
233 108741 : check=(idir>=1.and.idir<=9)
234 108741 : ABI_CHECK(check,'BUG: choice=8/81 and signs=2 requires 1<=idir<=9')
235 : else
236 : ! signs=2 requires 1<=idir<=3 when choice>1
237 28391575 : check=(signs/=2.or.choice<=1.or.(idir>=1.and.idir<=3))
238 0 : ABI_CHECK(check,'BUG: signs=2 requires 1<=idir<=3')
239 : end if
240 :
241 : #if defined HAVE_OPENMP
242 : nthreads=OMP_GET_NUM_THREADS()
243 : #endif
244 :
245 29398348 : if (opernla_counter>=0) then
246 0 : if (choice>=0) opernla_counter = opernla_counter + 1
247 0 : if ((signs==1).and.(choice_==2.or.choice_==4.or.choice_==6.or.choice_==23.or.choice_==24.or.choice_==54)) then
248 0 : opernla_counter = opernla_counter + 3 ! 3 directions
249 : end if
250 0 : if ((signs==2).and.(choice_==2)) opernla_counter = opernla_counter + 1 ! 1 direction
251 0 : if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) opernla_counter = opernla_counter + 6 ! 6 directions
252 0 : if ((signs==2).and.(choice_==3)) opernla_counter = opernla_counter + 1 ! 1 direction
253 : end if
254 :
255 : !==========================================================================
256 : !========== STANDARD VERSION ==============================================
257 : !==========================================================================
258 : !Parallelization OpenMP on nlmn loops
259 : if (nthreads==1) then
260 :
261 : ! Loop on spinorial components
262 60920478 : do ispinor =1,nspinor
263 31522130 : ipwshft=(ispinor-1)*npw
264 :
265 : ! Allocate work space
266 94566390 : ABI_MALLOC(scali,(npw))
267 63044260 : ABI_MALLOC(scalr,(npw))
268 :
269 : ! Loop on atoms (blocking)
270 75903940 : do ia=1,nincat
271 44381810 : iaph3d=ia;if (nloalg(2)>0) iaph3d=ia+ia3-1
272 : ! Compute c(g).exp(2pi.i.g.R)
273 15482104809 : do ipw=ipw0,npw
274 15437722999 : jpw=ipw+ipwshft
275 15437722999 : scalr(ipw)=(vect(1,jpw)*ph3d(1,ipw,iaph3d)-vect(2,jpw)*ph3d(2,ipw,iaph3d))
276 15482104809 : scali(ipw)=(vect(2,jpw)*ph3d(1,ipw,iaph3d)+vect(1,jpw)*ph3d(2,ipw,iaph3d))
277 : end do
278 :
279 44381810 : if (ipw0==2) then
280 1812460 : scalr(1)=half*vect(1,1+ipwshft)*ph3d(1,1,iaph3d)
281 1812460 : scali(1)=half*vect(1,1+ipwshft)*ph3d(2,1,iaph3d)
282 : end if
283 :
284 : ! --------------------------------------------------------------------
285 : ! ALL CHOICES:
286 : ! Accumulate Gx
287 : ! --------------------------------------------------------------------
288 :
289 44381810 : if (choice>=0) then
290 :
291 527524626 : do ilmn=1,nlmn
292 483487223 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
293 483487223 : scale=wt;if (il>1) scale=-scale
294 527524626 : if (cplex==2) then
295 : buffer_r1 = zero ; buffer_i1 = zero
296 >12311*10^7 : do ipw=1,npw
297 >12267*10^7 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
298 >12311*10^7 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
299 : end do
300 444882717 : if (parity) then
301 205851056 : gx(1,ilmn,ia,ispinor) = scale*buffer_r1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_i1
302 : else
303 239031661 : gx(1,ilmn,ia,ispinor) =-scale*buffer_i1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_r1
304 : end if
305 : else
306 38604506 : if (parity) then
307 : buffer_r1 = zero
308 11181516386 : do ipw=1,npw
309 11181516386 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
310 : end do
311 11027504 : gx(1,ilmn,ia,ispinor) = scale*buffer_r1
312 : else
313 : buffer_i1 = zero
314 28696390242 : do ipw=1,npw
315 28696390242 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
316 : end do
317 27577002 : gx(1,ilmn,ia,ispinor) =-scale*buffer_i1
318 : end if
319 : end if
320 : end do
321 : end if
322 :
323 : ! --------------------------------------------------------------------
324 : ! CHOICE= 2, 4, 6, 23, 24, 54 -- SIGNS= 1
325 : ! Accumulate dGxdt --- derivative wrt atm pos. --- for all directions
326 : ! --------------------------------------------------------------------
327 44381810 : if ((signs==1).and. &
328 : & (choice_==2.or.choice_==4.or.choice_==6.or.choice_==23.or.choice_==24.or.choice_==54)) then
329 1222418 : mu0=1;if (choice_==23.or.choice_==6) mu0=7
330 :
331 13077341 : do ilmn=1,nlmn
332 11854923 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
333 11854923 : scale=wt;if (il>1) scale=-scale
334 11854923 : scale2=two_pi*scale
335 52331114 : if (cplex==2) then
336 : buffer_r1 = zero ; buffer_r2 = zero
337 : buffer_r3 = zero ; buffer_i1 = zero
338 : buffer_i2 = zero ; buffer_i3 = zero
339 1927010480 : do ipw=1,npw
340 1918862973 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
341 1918862973 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
342 1918862973 : buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
343 1918862973 : buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
344 1918862973 : buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
345 1918862973 : buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
346 1918862973 : buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
347 1927010480 : buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
348 : end do
349 8147507 : if (parity) then
350 3736711 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_r1
351 3736711 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_i1
352 3736711 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
353 3736711 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_i2
354 3736711 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
355 3736711 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_i3
356 : else
357 4410796 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_i1
358 4410796 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_r1
359 4410796 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
360 4410796 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
361 4410796 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
362 4410796 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
363 : end if
364 : else
365 3707416 : if (parity) then
366 : buffer_r1 = zero ; buffer_r2 = zero ; buffer_r3 = zero
367 1175793206 : do ipw=1,npw
368 1174823652 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
369 1174823652 : buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
370 1174823652 : buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
371 1175793206 : buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
372 : end do
373 969554 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_r1
374 969554 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
375 969554 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
376 : else
377 : buffer_i1 = zero ; buffer_i2 = zero ; buffer_i3 = zero
378 3150705280 : do ipw=1,npw
379 3147967418 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
380 3147967418 : buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
381 3147967418 : buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
382 3150705280 : buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
383 : end do
384 2737862 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_i1
385 2737862 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
386 2737862 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
387 : end if
388 : end if
389 : end do
390 : end if
391 :
392 : ! --------------------------------------------------------------------
393 : ! CHOICE= 2, -- SIGNS= 2
394 : ! Accumulate dGxdt --- derivative wrt atm pos. --- for direction IDIR
395 : ! --------------------------------------------------------------------
396 44381810 : if ((signs==2).and.(choice_==2)) then
397 :
398 11826982 : mu0=1
399 11826982 : do ilmn=1,nlmn
400 10748170 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
401 10748170 : scale=wt;if (il>1) scale=-scale
402 10748170 : scale2=two_pi*scale
403 11826982 : if (cplex==2) then
404 : buffer_r1 = zero ; buffer_i1 = zero
405 1772506033 : do ipw=1,npw
406 1761757863 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
407 1761757863 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
408 1761757863 : buffer_r1 = buffer_r1 - aux_i*kpg(ipw,idir)
409 1772506033 : buffer_i1 = buffer_i1 + aux_r*kpg(ipw,idir)
410 : end do
411 10748170 : if (parity) then
412 3271618 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
413 3271618 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_i1
414 : else
415 7476552 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
416 7476552 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
417 : end if
418 : else
419 0 : if (parity) then
420 : buffer_r1 = zero
421 0 : do ipw=1,npw
422 0 : buffer_r1 = buffer_r1 - scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
423 : end do
424 0 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
425 : else
426 : buffer_i1 = zero
427 0 : do ipw=1,npw
428 0 : buffer_i1 = buffer_i1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
429 : end do
430 0 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
431 : end if
432 : end if
433 : end do
434 : end if
435 :
436 : ! --------------------------------------------------------------------
437 : ! CHOICE= 22 and 25 -- SIGNS= 2
438 : ! Accumulate dGxdt --- derivative wrt atm pos. and one or two q-vectors---
439 : ! for directions fixed by IDIR and qdir
440 : ! --------------------------------------------------------------------
441 44381810 : if (signs==2.and.(choice_==22.or.choice_==25)) then
442 : !Use same notation as the notes for clarity
443 628832 : if(choice_==22) ialpha=idir
444 248832 : if(choice_==25) ialpha=nalpha(idir)
445 :
446 628832 : mu0=1
447 6052832 : do ilmn=1,nlmn
448 5424000 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
449 5424000 : scale=wt;if (il>1) scale=-scale
450 6052832 : if (cplex==2) then
451 : buffer_r1 = zero ; buffer_i1 = zero
452 549914364 : do ipw=1,npw
453 544490364 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
454 544490364 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
455 544490364 : buffer_r1 = buffer_r1 + aux_r*kpg(ipw,ialpha)
456 549914364 : buffer_i1 = buffer_i1 + aux_i*kpg(ipw,ialpha)
457 : end do
458 5424000 : if (parity) then
459 2897664 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
460 2897664 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
461 : else
462 2526336 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
463 2526336 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
464 : end if
465 : else
466 0 : if (parity) then
467 : buffer_r1 = zero
468 0 : do ipw=1,npw
469 0 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
470 : end do
471 0 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
472 : else
473 : buffer_i1 = zero
474 0 : do ipw=1,npw
475 0 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
476 : end do
477 0 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
478 : end if
479 : end if
480 : end do
481 : end if
482 :
483 : ! --------------------------------------------------------------------
484 : ! CHOICE= 3, 6, 23, 55 -- SIGNS= 1
485 : ! Accumulate dGxdt --- derivative wrt strain --- for all directions
486 : ! --------------------------------------------------------------------
487 44381810 : if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) then
488 :
489 3053354 : mu0=1
490 3053354 : do ilmn=1,nlmn
491 2817597 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
492 2817597 : scale=wt;if (il>1) scale=-scale
493 2817597 : scale2=half*scale
494 42307127 : if (cplex==2) then
495 : buffer_r1 = zero ; buffer_r2 = zero
496 : buffer_r3 = zero ; buffer_r4 = zero
497 : buffer_r5 = zero ; buffer_r6 = zero
498 : buffer_i1 = zero ; buffer_i2 = zero
499 : buffer_i3 = zero ; buffer_i4 = zero
500 : buffer_i5 = zero ; buffer_i6 = zero
501 1049238590 : do ipw=1,npw
502 1046484821 : aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
503 1046484821 : aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
504 1046484821 : aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
505 1046484821 : aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
506 1046484821 : aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
507 1046484821 : aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
508 1046484821 : buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
509 1046484821 : buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
510 1046484821 : buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
511 1046484821 : buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
512 1046484821 : buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
513 1046484821 : buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
514 1046484821 : buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
515 1046484821 : buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
516 1046484821 : buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
517 1046484821 : buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
518 1046484821 : buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
519 1049238590 : buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
520 : end do
521 2753769 : if (parity) then
522 1354541 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_r1
523 1354541 : dgxdt(2,mu0 ,ilmn,ia,ispinor) =-scale*buffer_i1
524 1354541 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
525 1354541 : dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
526 1354541 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
527 1354541 : dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
528 1354541 : dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
529 1354541 : dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_i4
530 1354541 : dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
531 1354541 : dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_i5
532 1354541 : dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
533 1354541 : dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_i6
534 : else
535 1399228 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
536 1399228 : dgxdt(2,mu0 ,ilmn,ia,ispinor) =-scale*buffer_r1
537 1399228 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
538 1399228 : dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
539 1399228 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
540 1399228 : dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
541 1399228 : dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
542 1399228 : dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
543 1399228 : dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
544 1399228 : dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
545 1399228 : dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
546 1399228 : dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
547 : end if
548 : else
549 63828 : if (parity) then
550 : buffer_r1 = zero ; buffer_r2 = zero
551 : buffer_r3 = zero ; buffer_r4 = zero
552 : buffer_r5 = zero ; buffer_r6 = zero
553 37020858 : do ipw=1,npw
554 36989408 : aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
555 36989408 : aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
556 36989408 : aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
557 36989408 : buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
558 36989408 : buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
559 36989408 : buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
560 36989408 : buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
561 36989408 : buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
562 37020858 : buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
563 : end do
564 31450 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_r1
565 31450 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
566 31450 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
567 31450 : dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
568 31450 : dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
569 31450 : dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
570 : else
571 : buffer_i1 = zero ; buffer_i2 = zero
572 : buffer_i3 = zero ; buffer_i4 = zero
573 : buffer_i5 = zero ; buffer_i6 = zero
574 34486504 : do ipw=1,npw
575 34454126 : aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
576 34454126 : aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
577 34454126 : aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
578 34454126 : buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
579 34454126 : buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
580 34454126 : buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
581 34454126 : buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
582 34454126 : buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
583 34486504 : buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
584 : end do
585 32378 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
586 32378 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
587 32378 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
588 32378 : dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
589 32378 : dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
590 32378 : dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
591 : end if
592 : end if
593 : end do
594 : end if
595 :
596 : ! --------------------------------------------------------------------
597 : ! CHOICE= 3 -- SIGNS= 2
598 : ! Accumulate dGxdt --- derivative wrt strain --- for direction IDIR
599 : ! --------------------------------------------------------------------
600 44381810 : if ((signs==2).and.(choice_==3)) then
601 :
602 428832 : mu0=1;ffnl_dir(1)=1;if (dimffnl>2) ffnl_dir(1)=idir
603 4215720 : do ilmn=1,nlmn
604 3786888 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
605 3786888 : scale=wt;if (il>1) scale=-scale
606 4215720 : if (cplex==2) then
607 : buffer_r1 = zero ; buffer_i1 = zero
608 653119200 : do ipw=1,npw
609 649332312 : buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
610 653119200 : buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
611 : end do
612 3786888 : if (parity) then
613 1606080 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
614 1606080 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
615 : else
616 2180808 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
617 2180808 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
618 : end if
619 : else
620 0 : if (parity) then
621 : buffer_r1 = zero
622 0 : do ipw=1,npw
623 0 : buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
624 : end do
625 0 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
626 : else
627 : buffer_i1 = zero
628 0 : do ipw=1,npw
629 0 : buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
630 : end do
631 0 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
632 : end if
633 : end if
634 : end do
635 : end if
636 :
637 : ! --------------------------------------------------------------------
638 : ! CHOICE= 33 -- SIGNS= 2
639 : ! Accumulate dGxdt and d2Gxdt --- mixed derivative wrt strain and q-vector ---
640 : ! for directions fixed by idir and qdir
641 : ! --------------------------------------------------------------------
642 44381810 : if ((signs==2).and.(choice_==33)) then
643 :
644 : !Use same notation as the notes for clarity
645 746496 : ibeta=nalpha(idir)
646 746496 : idelta=nbeta(idir)
647 746496 : igamma=qdir
648 746496 : idelgam=gamma(idelta,igamma)
649 7216128 : do ilmn=1,nlmn
650 6469632 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
651 6469632 : scale=wt;if (il>1) scale=-scale
652 7216128 : if (cplex==2) then
653 : buffer_r1 = zero ; buffer_i1 = zero
654 : buffer_r2 = zero ; buffer_i2 = zero
655 : buffer_r3 = zero ; buffer_i3 = zero
656 : buffer_r4 = zero ; buffer_i4 = zero
657 : buffer_r5 = zero ; buffer_i5 = zero
658 645547968 : do ipw=1,npw
659 639078336 : aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
660 639078336 : aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
661 639078336 : buffer_r1 = buffer_r1 + aux_r
662 639078336 : buffer_i1 = buffer_i1 + aux_i
663 639078336 : buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
664 639078336 : buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
665 639078336 : aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
666 639078336 : aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
667 639078336 : buffer_r3 = buffer_r3 + aux_r
668 639078336 : buffer_i3 = buffer_i3 + aux_i
669 639078336 : buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
670 639078336 : buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
671 639078336 : aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
672 639078336 : aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
673 639078336 : buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
674 645547968 : buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
675 : end do
676 :
677 6469632 : if (parity) then
678 3483648 : dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
679 3483648 : dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i1
680 3483648 : dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
681 3483648 : dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i3
682 3483648 : d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
683 3483648 : d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i2
684 3483648 : d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
685 3483648 : d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i4
686 3483648 : d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
687 3483648 : d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_i5
688 : else
689 2985984 : dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
690 2985984 : dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r1
691 2985984 : dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
692 2985984 : dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r3
693 2985984 : d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
694 2985984 : d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r2
695 2985984 : d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
696 2985984 : d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r4
697 2985984 : d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
698 2985984 : d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_r5
699 : end if
700 : else
701 0 : if (parity) then
702 : buffer_r1 = zero
703 : buffer_r2 = zero
704 : buffer_r3 = zero
705 : buffer_r4 = zero
706 : buffer_r5 = zero
707 0 : do ipw=1,npw
708 0 : aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
709 0 : buffer_r1 = buffer_r1 + aux_r
710 0 : buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
711 0 : aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
712 0 : buffer_r3 = buffer_r3 + aux_r
713 0 : buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
714 0 : aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
715 0 : buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
716 : end do
717 :
718 0 : dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
719 0 : dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
720 0 : d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
721 0 : d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
722 0 : d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
723 : else
724 : buffer_i1 = zero
725 : buffer_i2 = zero
726 : buffer_i3 = zero
727 : buffer_i4 = zero
728 : buffer_i5 = zero
729 0 : do ipw=1,npw
730 0 : aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
731 0 : buffer_i1 = buffer_i1 + aux_i
732 0 : buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
733 0 : aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
734 0 : buffer_i3 = buffer_i3 + aux_i
735 0 : buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
736 0 : aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
737 0 : buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
738 : end do
739 :
740 0 : dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
741 0 : dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
742 0 : d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
743 0 : d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
744 0 : d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
745 : end if
746 : end if
747 : end do
748 : end if
749 :
750 : ! --------------------------------------------------------------------
751 : ! CHOICE= 4, 24 -- SIGNS= 1
752 : ! Accumulate d2Gxdt --- 2nd derivative wrt 2 atm pos. --- for all dirs
753 : ! --------------------------------------------------------------------
754 44381810 : if ((signs==1).and.(choice_==4.or.choice_==24)) then
755 514024 : mu0=1
756 514024 : do ilmn=1,nlmn
757 468336 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
758 468336 : scale=wt;if (il>1) scale=-scale
759 468336 : scale2=two_pi2*scale
760 514024 : if (cplex==2) then
761 : buffer_ra = zero ; buffer_rb = zero
762 : buffer_rc = zero ; buffer_rd = zero
763 : buffer_re = zero ; buffer_rf = zero
764 : buffer_ia = zero ; buffer_ib = zero
765 : buffer_ic = zero ; buffer_id = zero
766 : buffer_ie = zero ; buffer_if = zero
767 61610952 : do ipw=1,npw
768 61142616 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
769 61142616 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
770 61142616 : buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
771 61142616 : buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
772 61142616 : buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
773 61142616 : buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
774 61142616 : buffer_re = buffer_re - aux_r*kpg(ipw,8)
775 61142616 : buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
776 61142616 : buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
777 61142616 : buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
778 61142616 : buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
779 61142616 : buffer_id = buffer_id - aux_i*kpg(ipw,7)
780 61142616 : buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
781 61610952 : buffer_if = buffer_if - aux_i*kpg(ipw,9)
782 : end do
783 468336 : if (parity) then
784 150288 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ra
785 150288 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ia
786 150288 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
787 150288 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_ib
788 150288 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
789 150288 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_ic
790 150288 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
791 150288 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_id
792 150288 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
793 150288 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_ie
794 150288 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
795 150288 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_if
796 : else
797 318048 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_ia
798 318048 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ra
799 318048 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
800 318048 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
801 318048 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
802 318048 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
803 318048 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
804 318048 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
805 318048 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
806 318048 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
807 318048 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
808 318048 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
809 : end if
810 : else
811 0 : if (parity) then
812 : buffer_ra = zero ; buffer_rb = zero
813 : buffer_rc = zero ; buffer_rd = zero
814 : buffer_re = zero ; buffer_rf = zero
815 0 : do ipw=1,npw
816 0 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
817 0 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
818 0 : buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
819 0 : buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
820 0 : buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
821 0 : buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
822 0 : buffer_re = buffer_re - aux_r*kpg(ipw,8)
823 0 : buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
824 : end do
825 0 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ra
826 0 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
827 0 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
828 0 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
829 0 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
830 0 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
831 : else
832 : buffer_ia = zero ; buffer_ib = zero
833 : buffer_ic = zero ; buffer_id = zero
834 : buffer_ie = zero ; buffer_if = zero
835 0 : do ipw=1,npw
836 0 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
837 0 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
838 0 : buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
839 0 : buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
840 0 : buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
841 0 : buffer_id = buffer_id - aux_i*kpg(ipw,7)
842 0 : buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
843 0 : buffer_if = buffer_if - aux_i*kpg(ipw,9)
844 : end do
845 0 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_ia
846 0 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
847 0 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
848 0 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
849 0 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
850 0 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
851 : end if
852 : end if
853 : end do
854 : end if
855 :
856 : ! --------------------------------------------------------------------
857 : ! CHOICE= 5, 51, 52, 53, 54, 55, 8, 81 -- SIGNS= 1
858 : ! Accumulate dGxdt --- derivative wrt k --- for all directions
859 : ! --------------------------------------------------------------------
860 44381810 : if ((signs==1).and.&
861 : & (choice_==5 .or.choice_==51.or.choice_==52.or.choice_==53.or.&
862 : & choice_==54.or.choice_==55.or.choice_==8 .or.choice_==81)) then
863 117604 : mu0=1
864 117604 : if (choice_==54) mu0=4
865 94180 : if (choice_==55) mu0=7
866 1076676 : do ilmn=1,nlmn
867 959072 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
868 959072 : scale=wt;if (il>1) scale=-scale
869 45340882 : if (cplex==2) then
870 : buffer_r1 = zero ; buffer_r2 = zero
871 : buffer_r3 = zero
872 : buffer_i1 = zero ; buffer_i2 = zero
873 : buffer_i3 = zero
874 123786944 : do ipw=1,npw
875 122827872 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
876 122827872 : buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
877 122827872 : buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
878 122827872 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
879 122827872 : buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
880 123786944 : buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
881 : end do
882 959072 : if (parity) then
883 250952 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_r1
884 250952 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
885 250952 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
886 250952 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
887 250952 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
888 250952 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
889 : else
890 708120 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_i1
891 708120 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_r1
892 708120 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
893 708120 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
894 708120 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
895 708120 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
896 : end if
897 : else
898 0 : cplex_dgxdt(mu0:mu0+2) = 2 ! Warning dgxdt is here pure imaginary
899 0 : if (parity) then
900 : buffer_i1 = zero ; buffer_i2 = zero
901 : buffer_i3 = zero
902 0 : do ipw=1,npw
903 0 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
904 0 : buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
905 0 : buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
906 : end do
907 0 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
908 0 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
909 0 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
910 : else
911 : buffer_r1 = zero ; buffer_r2 = zero
912 : buffer_r3 = zero
913 0 : do ipw=1,npw
914 0 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
915 0 : buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
916 0 : buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
917 : end do
918 0 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_r1
919 0 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
920 0 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
921 : end if
922 : end if
923 : end do
924 : end if
925 :
926 : ! --------------------------------------------------------------------
927 : ! CHOICE= 5, 51, 52, 53, 54, 8, 81 -- SIGNS= 2
928 : ! Accumulate dGxdt --- derivative wrt k ---
929 : ! for direction IDIR (CHOICE=5,51,52)
930 : ! for direction IDIR2 (CHOICE=54,81), only if choice > 0
931 : ! for directions IDIR+1 & IDIR+2 mod 3 (CHOICE=53)
932 : ! for 2 directions (CHOICE=8), only if choice > 0
933 : ! --------------------------------------------------------------------
934 44381810 : if ((signs==2).and.&
935 : & (choice_==5.or.choice_==51.or.choice_==52.or.choice_==53.or.choice_==54.or. &
936 : & choice==8.or.choice==81)) then ! Note the use of choice and not choice_=abs(choice)
937 1703309 : mu0=1
938 1703309 : if (choice_==5.or.choice_==51.or.choice_==52) then
939 : ! We compute the derivative in one direction
940 1573844 : ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir
941 : ndir=1
942 : end if
943 1703309 : if (choice_==53) then
944 : ! Case 53 though need multiple directions and here ffnl will contain the
945 : ! derivative information in locations 2,3, and 4 corresponding to idir = 1, 2,
946 : ! and 3. Moreover, choice 53 needs the derivatives in direction idir+1 and idir+2 mod 3.
947 : ! The parameter vector ffnl_dir_dat contains the necessary translations in
948 : ! locations 1,2 for idir=1; 3,4 for idir=2; and 5,6 for idir=3.
949 0 : ffnl_dir(1)=ffnl_dir_dat(2*idir-1);ffnl_dir(2)=ffnl_dir_dat(2*idir)
950 0 : ndir=2
951 : end if
952 1703309 : if (choice_==54) then
953 : ! We compute the derivative in one direction (the second one)
954 23040 : ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir2(idir)
955 : ndir=1
956 : end if
957 1703309 : if (choice_==8) then
958 : ! We compute the derivative in two directions
959 : ! depending on the input idir argument
960 101817 : ffnl_dir(1)=idir1(idir);ffnl_dir(2)=idir2(idir)
961 101817 : ndir=2
962 : end if
963 1703309 : if (choice_==81) then
964 : ! We compute the derivative in one direction (the second one)
965 4608 : ffnl_dir(1)=idir2(idir)
966 4608 : ndir=1
967 : end if
968 3508435 : do mua=1,ndir
969 18272006 : mu=mu0+mua-1
970 62653816 : do ilmn=1,nlmn
971 16466880 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
972 16466880 : scale=wt;if (il>1) scale=-scale
973 18272006 : if (cplex==2) then
974 : buffer_r1 = zero ; buffer_i1 = zero
975 2631876256 : do ipw=1,npw
976 2615409376 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
977 2631876256 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
978 : end do
979 16466880 : if (parity) then
980 7658292 : dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
981 7658292 : dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_i1
982 : else
983 8808588 : dgxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
984 8808588 : dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_r1
985 : end if
986 : else
987 0 : cplex_dgxdt(mu) = 2 ! Warning dgxdt is here pure imaginary
988 0 : if (parity) then
989 : buffer_i1 = zero
990 0 : do ipw=1,npw
991 0 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
992 : end do
993 0 : dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
994 : else
995 : buffer_r1 = zero
996 0 : do ipw=1,npw
997 0 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
998 : end do
999 0 : dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
1000 : end if
1001 : end if
1002 : end do
1003 : end do
1004 : end if
1005 :
1006 : ! --------------------------------------------------------------------
1007 : ! CHOICE= 54 -- SIGNS= 1
1008 : ! Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- for all dirs
1009 : ! --------------------------------------------------------------------
1010 44381810 : if ((signs==1).and.(choice_==54)) then
1011 220736 : mu0=1
1012 220736 : do ilmn=1,nlmn
1013 197312 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1014 197312 : scale=wt;if (il>1) scale=-scale
1015 197312 : scale2=two_pi*scale
1016 220736 : if (cplex==2) then
1017 789248 : do mua=1,3 ! atm. pos
1018 2565056 : do mub=1,3 ! k
1019 1775808 : mu=mu0+(mub-1)+3*(mua-1)
1020 1775808 : buffer_r1 = zero ; buffer_i1 = zero
1021 224769600 : do ipw=1,npw
1022 222993792 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1023 224769600 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1024 : end do
1025 2367744 : if (parity) then
1026 499680 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1027 499680 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1028 : else
1029 1276128 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
1030 1276128 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1031 : end if
1032 : end do
1033 : end do
1034 : else
1035 0 : cplex_d2gxdt(mu0:mu0+8) = 2 ! Warning d2gxdt is here pure imaginary
1036 0 : if (parity) then
1037 0 : do mua=1,3 ! atm. pos
1038 0 : do mub=1,3 ! k
1039 0 : mu=mu0+(mub-1)+3*(mua-1)
1040 0 : buffer_r1 = zero
1041 0 : do ipw=1,npw
1042 0 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1043 : end do
1044 0 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1045 : end do
1046 : end do
1047 : else
1048 0 : do mua=1,3 ! atm. pos
1049 0 : do mub=1,3 ! k
1050 0 : mu=mu0+(mub-1)+3*(mua-1)
1051 0 : buffer_i1 = zero
1052 0 : do ipw=1,npw
1053 0 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1054 : end do
1055 0 : d2gxdt(1,mu,ilmn,ia,ispinor) = -scale2*buffer_i1
1056 : end do
1057 : end do
1058 : end if
1059 : end if
1060 : end do
1061 : end if
1062 :
1063 : ! --------------------------------------------------------------------
1064 : ! CHOICE= 54 -- SIGNS= 2
1065 : ! Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- for direction IDIR
1066 : ! --------------------------------------------------------------------
1067 44381810 : if ((signs==2).and.(choice_==54)) then
1068 23040 : mu0=1
1069 : !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
1070 23040 : mua=idir1(idir) ! atm. pos
1071 23040 : mub=1;if(dimffnl>2) mub=idir2(idir) ! k
1072 207360 : do ilmn=1,nlmn
1073 184320 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1074 184320 : scale=wt;if (il>1) scale=-scale
1075 184320 : scale2=two_pi*scale
1076 207360 : if (cplex==2) then
1077 : buffer_r1 = zero ; buffer_i1 = zero
1078 17556480 : do ipw=1,npw
1079 17372160 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1080 17556480 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1081 : end do
1082 184320 : if (parity) then
1083 46080 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1084 46080 : d2gxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1085 : else
1086 138240 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_r1
1087 138240 : d2gxdt(2,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1088 : end if
1089 : else
1090 0 : cplex_d2gxdt(mu0) = 2 ! Warning d2gxdt is here pure imaginary
1091 0 : if (parity) then
1092 : buffer_r1 = zero
1093 0 : do ipw=1,npw
1094 0 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1095 : end do
1096 0 : d2gxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1097 : else
1098 : buffer_i1 = zero
1099 0 : do ipw=1,npw
1100 0 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1101 : end do
1102 0 : d2gxdt(1,mu0,ilmn,ia,ispinor) = -scale2*buffer_i1
1103 : end if
1104 : end if
1105 : end do
1106 : end if
1107 :
1108 : ! --------------------------------------------------------------------
1109 : ! CHOICE= 55 -- SIGNS= 1
1110 : ! Accumulate d2Gxdt --- 2nd derivative wrt k and strains --- for all dirs
1111 : ! --------------------------------------------------------------------
1112 44381810 : if ((signs==1).and.(choice_==55)) then
1113 56288 : mu0=1
1114 56288 : do ilmn=1,nlmn
1115 50496 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1116 50496 : scale=wt;if (il>1) scale=-scale
1117 56288 : if (cplex==2) then
1118 353472 : do mua=1,6 ! strain
1119 1262400 : do mub=1,3 ! k
1120 908928 : mu=mu0+(mub-1)+3*(mua-1)
1121 908928 : buffer_r1 = zero ; buffer_i1 = zero
1122 173664000 : do ipw=1,npw
1123 172755072 : aux_r=ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
1124 172755072 : buffer_r1 = buffer_r1 + aux_r*scalr(ipw)
1125 173664000 : buffer_i1 = buffer_i1 + aux_r*scali(ipw)
1126 : end do
1127 1211904 : if (parity) then
1128 272160 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
1129 272160 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_i1
1130 : else
1131 636768 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
1132 636768 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_r1
1133 : end if
1134 : end do
1135 : end do
1136 : else
1137 0 : cplex_d2gxdt(mu0:mu0+17) = 2 ! Warning d2gxdt is here pure imaginary
1138 0 : if (parity) then
1139 0 : do mua=1,6 ! strain
1140 0 : do mub=1,3 ! k
1141 0 : mu=mu0+(mub-1)+3*(mua-1)
1142 0 : buffer_i1 = zero
1143 0 : do ipw=1,npw
1144 0 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+mua,ilmn)*kpg(ipw,mub)
1145 : end do
1146 0 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
1147 : end do
1148 : end do
1149 : else
1150 0 : do mua=1,6 ! strain
1151 0 : do mub=1,3 ! k
1152 0 : mu=mu0+(mub-1)+3*(mua-1)
1153 0 : buffer_r1 = zero
1154 0 : do ipw=1,npw
1155 0 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+mua,ilmn)*kpg(ipw,mub)
1156 : end do
1157 0 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
1158 : end do
1159 : end do
1160 : end if
1161 : end if
1162 : end do
1163 : end if
1164 :
1165 : ! --------------------------------------------------------------------
1166 : ! CHOICE= 6 -- SIGNS= 1
1167 : ! Accumulate d2Gxdt --- 2nd derivative wrt atm. pos and strain --- for all dirs
1168 : ! --------------------------------------------------------------------
1169 44381810 : if ((signs==1).and.(choice_==6)) then
1170 : mu0=1;if (choice_==6) mu0=37
1171 16128 : ABI_MALLOC(scalarr,(npw,4))
1172 10752 : ABI_MALLOC(scalari,(npw,4))
1173 50432 : do ilmn=1,nlmn
1174 45056 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1175 45056 : scale=wt;if (il>1) scale=-scale
1176 45056 : scale2=pi*scale
1177 225280 : do mu=1,4
1178 38405376 : do ipw=1,npw
1179 38180096 : scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
1180 38360320 : scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
1181 : end do
1182 : end do
1183 50432 : if(cplex==2) then
1184 315392 : do mub=1,6
1185 270336 : nub1=alpha(mub);nub2=beta(mub)
1186 1126400 : do mua=1,3
1187 811008 : mu=mu0+(mua-1)+3*(mub-1)
1188 811008 : buffer_r1 = zero ; buffer_i1 = zero
1189 172621440 : do ipw=1,npw
1190 : buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
1191 171810432 : & scalarr(ipw,1+nub2)*kpg(ipw,nub1))
1192 : buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
1193 172621440 : & scalari(ipw,1+nub2)*kpg(ipw,nub1))
1194 : end do
1195 1081344 : if (parity) then
1196 340992 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1197 340992 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
1198 : else
1199 470016 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1200 470016 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1201 : end if
1202 : end do
1203 : end do
1204 : else
1205 0 : if (parity) then
1206 0 : do mub=1,6
1207 0 : nub1=alpha(mub);nub2=beta(mub)
1208 0 : do mua=1,3
1209 0 : mu=mu0+(mua-1)+3*(mub-1)
1210 0 : buffer_i1 = zero
1211 0 : do ipw=1,npw
1212 : buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
1213 0 : & scalari(ipw,1+nub2)*kpg(ipw,nub1))
1214 : end do
1215 0 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1216 : end do
1217 : end do
1218 : else
1219 0 : do mub=1,6
1220 0 : nub1=alpha(mub);nub2=beta(mub)
1221 0 : do mua=1,3
1222 0 : mu=mu0+(mua-1)+3*(mub-1)
1223 0 : buffer_r1 = zero
1224 0 : do ipw=1,npw
1225 : buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
1226 0 : & scalarr(ipw,1+nub2)*kpg(ipw,nub1))
1227 : end do
1228 0 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1229 : end do
1230 : end do
1231 : end if
1232 : end if
1233 : end do
1234 5376 : ABI_FREE(scalarr)
1235 5376 : ABI_FREE(scalari)
1236 : end if
1237 :
1238 : ! --------------------------------------------------------------------
1239 : ! CHOICE= 6 -- SIGNS= 1
1240 : ! Accumulate d2Gxdt --- 2nd derivative wrt 2 strains --- for all dirs
1241 : ! --------------------------------------------------------------------
1242 44381810 : if ((signs==1).and.(choice_==6)) then
1243 5376 : mu0=1
1244 16128 : ABI_MALLOC(scalarr,(npw,10))
1245 10752 : ABI_MALLOC(scalari,(npw,10))
1246 50432 : do ilmn=1,nlmn
1247 45056 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1248 45056 : scale=wt;if (il>1) scale=-scale
1249 45056 : scale2=quarter*scale
1250 495616 : do mu=1,10
1251 95945856 : do ipw=1,npw
1252 95450240 : scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
1253 95900800 : scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
1254 : end do
1255 : end do
1256 50432 : if(cplex==2) then
1257 315392 : do mub=1,6
1258 270336 : nub1=alpha(mub);nub2=beta(mub)
1259 1937408 : do mua=1,6
1260 1622016 : mu=mu0+(mua-1)+6*(mub-1)
1261 1622016 : nua1=alpha(mua);nua2=beta(mua)
1262 1622016 : gama=gamma(nub1,nua1)
1263 1622016 : gamb=gamma(nub2,nua1)
1264 1622016 : gamc=gamma(nub1,nua2)
1265 1622016 : gamd=gamma(nub2,nua2)
1266 1622016 : buffer_r1 = zero ; buffer_i1 = zero
1267 345242880 : do ipw=1,npw
1268 343620864 : kpga=kpg(ipw,nub1)
1269 343620864 : kpgb=kpg(ipw,nub2)
1270 343620864 : kpgc=kpg(ipw,nua1)
1271 343620864 : kpgd=kpg(ipw,nua2)
1272 : buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
1273 343620864 : & + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
1274 : buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
1275 345242880 : & + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
1276 : end do
1277 1892352 : if (parity) then
1278 681984 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1279 681984 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1280 : else
1281 940032 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1282 940032 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1283 : end if
1284 : end do
1285 : end do
1286 : else
1287 0 : if (parity) then
1288 0 : do mub=1,6
1289 0 : nub1=alpha(mub);nub2=beta(mub)
1290 0 : do mua=1,6
1291 0 : mu=mu0+(mua-1)+6*(mub-1)
1292 0 : nua1=alpha(mua);nua2=beta(mua)
1293 0 : gama=gamma(nub1,nua1)
1294 0 : gamb=gamma(nub2,nua1)
1295 0 : gamc=gamma(nub1,nua2)
1296 0 : gamd=gamma(nub2,nua2)
1297 0 : buffer_r1 = zero
1298 0 : do ipw=1,npw
1299 0 : kpga=kpg(ipw,nub1)
1300 0 : kpgb=kpg(ipw,nub2)
1301 0 : kpgc=kpg(ipw,nua1)
1302 0 : kpgd=kpg(ipw,nua2)
1303 : buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
1304 0 : & + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
1305 : end do
1306 0 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1307 : end do
1308 : end do
1309 : else
1310 0 : do mub=1,6
1311 0 : nub1=alpha(mub);nub2=beta(mub)
1312 0 : do mua=1,6
1313 0 : mu=mu0+(mua-1)+6*(mub-1)
1314 0 : nua1=alpha(mua);nua2=beta(mua)
1315 0 : gama=gamma(nub1,nua1)
1316 0 : gamb=gamma(nub2,nua1)
1317 0 : gamc=gamma(nub1,nua2)
1318 0 : gamd=gamma(nub2,nua2)
1319 0 : buffer_i1 = zero
1320 0 : do ipw=1,npw
1321 0 : kpga=kpg(ipw,nub1)
1322 0 : kpgb=kpg(ipw,nub2)
1323 0 : kpgc=kpg(ipw,nua1)
1324 0 : kpgd=kpg(ipw,nua2)
1325 : buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
1326 0 : & + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
1327 : end do
1328 0 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1329 : end do
1330 : end do
1331 : end if
1332 : end if
1333 : end do
1334 5376 : ABI_FREE(scalarr)
1335 5376 : ABI_FREE(scalari)
1336 : end if
1337 :
1338 : ! --------------------------------------------------------------------
1339 : ! CHOICE= 8, 81 -- SIGNS= 1
1340 : ! Accumulate d2Gxdt --- 2nd derivative wrt 2 k wave vect. --- for all dirs
1341 : ! --------------------------------------------------------------------
1342 44381810 : if ((signs==1).and.(choice_==8.or.choice_==81)) then
1343 17280 : mu0=1
1344 17280 : do ilmn=1,nlmn
1345 15360 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1346 15360 : scale=wt;if (il>1) scale=-scale
1347 17280 : if (cplex==2) then
1348 : buffer_ra = zero ; buffer_rb = zero
1349 : buffer_rc = zero ; buffer_rd = zero
1350 : buffer_re = zero ; buffer_rf = zero
1351 : buffer_ia = zero ; buffer_ib = zero
1352 : buffer_ic = zero ; buffer_id = zero
1353 : buffer_ie = zero ; buffer_if = zero
1354 1463040 : do ipw=1,npw
1355 1447680 : buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
1356 1447680 : buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
1357 1447680 : buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
1358 1447680 : buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
1359 1447680 : buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
1360 1447680 : buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
1361 1447680 : buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
1362 1447680 : buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
1363 1447680 : buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
1364 1447680 : buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
1365 1447680 : buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
1366 1463040 : buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
1367 : end do
1368 15360 : if (parity) then
1369 3840 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_ra
1370 3840 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_ia
1371 3840 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
1372 3840 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_ib
1373 3840 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
1374 3840 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_ic
1375 3840 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
1376 3840 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_id
1377 3840 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
1378 3840 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_ie
1379 3840 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
1380 3840 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_if
1381 : else
1382 11520 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_ia
1383 11520 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_ra
1384 11520 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
1385 11520 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
1386 11520 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
1387 11520 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
1388 11520 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
1389 11520 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
1390 11520 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
1391 11520 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
1392 11520 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
1393 11520 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
1394 : end if
1395 : else
1396 0 : if (parity) then
1397 : buffer_ra = zero ; buffer_rb = zero
1398 : buffer_rc = zero ; buffer_rd = zero
1399 : buffer_re = zero ; buffer_rf = zero
1400 0 : do ipw=1,npw
1401 0 : buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
1402 0 : buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
1403 0 : buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
1404 0 : buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
1405 0 : buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
1406 0 : buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
1407 : end do
1408 0 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_ra
1409 0 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
1410 0 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
1411 0 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
1412 0 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
1413 0 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
1414 : else
1415 : buffer_ia = zero ; buffer_ib = zero
1416 : buffer_ic = zero ; buffer_id = zero
1417 : buffer_ie = zero ; buffer_if = zero
1418 0 : do ipw=1,npw
1419 0 : buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
1420 0 : buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
1421 0 : buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
1422 0 : buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
1423 0 : buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
1424 0 : buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
1425 : end do
1426 0 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_ia
1427 0 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
1428 0 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
1429 0 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
1430 0 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
1431 0 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
1432 : end if
1433 : end if
1434 : end do
1435 : end if
1436 :
1437 : ! --------------------------------------------------------------------
1438 : ! CHOICE= 8, 81 -- SIGNS= 2
1439 : ! Accumulate d2Gxdt --- 2nd derivative wrt k --- for direction IDIR (Voigt not.)
1440 : ! --------------------------------------------------------------------
1441 75903940 : if ((signs==2).and.(choice_==8.or.choice_==81)) then
1442 108345 : mu0=1
1443 : !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
1444 108345 : mua=idir1(idir);mub=idir2(idir)
1445 : !idir->(Voigt) (11->1,22->2,33->3,32->4,31->5,21->6)
1446 108345 : ffnl_dir(1)=gamma(mua,mub)
1447 1120728 : do ilmn=1,nlmn
1448 1012383 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1449 1012383 : scale=wt;if (il>1) scale=-scale
1450 1120728 : if (cplex==2) then
1451 : buffer_r1 = zero ; buffer_i1 = zero
1452 167967180 : do ipw=1,npw
1453 166954797 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1454 167967180 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1455 : end do
1456 1012383 : if (parity) then
1457 490473 : d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1458 490473 : d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
1459 : else
1460 521910 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1461 521910 : d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1462 : end if
1463 : else
1464 0 : if (parity) then
1465 : buffer_r1 = zero
1466 0 : do ipw=1,npw
1467 0 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1468 : end do
1469 0 : d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1470 : else
1471 : buffer_i1 = zero
1472 0 : do ipw=1,npw
1473 0 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1474 : end do
1475 0 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1476 : end if
1477 : end if
1478 : end do
1479 : end if
1480 :
1481 : ! --------------------------------------------------------------------
1482 : ! END CHOICES
1483 : ! --------------------------------------------------------------------
1484 :
1485 : end do ! End loop on atoms
1486 :
1487 : ! Deallocate temporary space
1488 31522130 : ABI_FREE(scali)
1489 60920478 : ABI_FREE(scalr)
1490 :
1491 : end do ! End loop on spinorial components
1492 :
1493 :
1494 : ! ==========================================================================
1495 : ! ========== OPENMP VERSION ================================================
1496 : ! ==========================================================================
1497 : ! Parallelization OpenMP on npw loops
1498 : else
1499 :
1500 : !$OMP PARALLEL PRIVATE(il,ilmn,ipw,jpw,parity,ndir,ffnl_dir), &
1501 : !$OMP PRIVATE(mu,mua,mub,nua1,nua2,nub1,nub2), &
1502 : !$OMP PRIVATE(kpga,kpgb,kpgc,kpgd), &
1503 : !$OMP PRIVATE(scale,scale2,mu0), &
1504 : !$OMP PRIVATE(ispinor,ipwshft,ia,iaph3d)
1505 :
1506 : ! Loop on spinorial components
1507 : do ispinor =1,nspinor
1508 : ipwshft=(ispinor-1)*npw
1509 :
1510 : ! Allocate work space
1511 : !$OMP SECTIONS
1512 : !$OMP SECTION
1513 : ABI_MALLOC(scali,(npw))
1514 : !$OMP SECTION
1515 : ABI_MALLOC(scalr,(npw))
1516 : !$OMP END SECTIONS
1517 :
1518 : ! Loop on atoms (blocking)
1519 : do ia=1,nincat
1520 : iaph3d=ia;if (nloalg(2)>0) iaph3d=ia+ia3-1
1521 :
1522 : ! Compute Sum_g[c(g).exp(2pi.i.g.R)]
1523 : !$OMP DO
1524 : do ipw=ipw0,npw
1525 : jpw=ipw+ipwshft
1526 : scalr(ipw)=(vect(1,jpw)*ph3d(1,ipw,iaph3d)-vect(2,jpw)*ph3d(2,ipw,iaph3d))
1527 : scali(ipw)=(vect(2,jpw)*ph3d(1,ipw,iaph3d)+vect(1,jpw)*ph3d(2,ipw,iaph3d))
1528 : end do
1529 : !$OMP END DO
1530 : !$OMP SINGLE
1531 : if (ipw0==2) then
1532 : scalr(1)=half*vect(1,1+ipwshft)*ph3d(1,1,iaph3d)
1533 : scali(1)=half*vect(1,1+ipwshft)*ph3d(2,1,iaph3d)
1534 : end if
1535 : !$OMP END SINGLE
1536 :
1537 : ! --------------------------------------------------------------------
1538 : ! ALL CHOICES
1539 : ! Accumulate Gx
1540 : ! --------------------------------------------------------------------
1541 : if (choice>=0) then ! JWZ to check: I dont think 53 needs this
1542 : do ilmn=1,nlmn
1543 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1544 : scale=wt;if (il>1) scale=-scale
1545 : if (cplex==2) then
1546 : !$OMP SINGLE
1547 : buffer_r1 = zero ; buffer_i1 = zero
1548 : !$OMP END SINGLE
1549 : !$OMP DO &
1550 : !$OMP REDUCTION(+:buffer_r1,buffer_i1)
1551 : do ipw=1,npw
1552 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
1553 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
1554 : end do
1555 : !$OMP END DO
1556 : !$OMP SINGLE
1557 : if (parity) then
1558 : gx(1,ilmn,ia,ispinor) = scale*buffer_r1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_i1
1559 : else
1560 : gx(1,ilmn,ia,ispinor) =-scale*buffer_i1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_r1
1561 : end if
1562 : !$OMP END SINGLE
1563 : else
1564 : if (parity) then
1565 : !$OMP SINGLE
1566 : buffer_r1 = zero
1567 : !$OMP END SINGLE
1568 : !$OMP DO &
1569 : !$OMP REDUCTION(+:buffer_r1)
1570 : do ipw=1,npw
1571 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
1572 : end do
1573 : !$OMP END DO
1574 : !$OMP SINGLE
1575 : gx(1,ilmn,ia,ispinor) = scale*buffer_r1
1576 : !$OMP END SINGLE
1577 : else
1578 : !$OMP SINGLE
1579 : buffer_i1 = zero
1580 : !$OMP END SINGLE
1581 : !$OMP DO &
1582 : !$OMP REDUCTION(+:buffer_i1)
1583 : do ipw=1,npw
1584 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
1585 : end do
1586 : !$OMP END DO
1587 : !$OMP SINGLE
1588 : gx(1,ilmn,ia,ispinor) =-scale*buffer_i1
1589 : !$OMP END SINGLE
1590 : end if
1591 : end if
1592 : end do
1593 : end if
1594 :
1595 : ! --------------------------------------------------------------------
1596 : ! CHOICE= 2, 4, 6, 23, 24, 54 -- SIGNS= 1
1597 : ! Accumulate dGxdt --- derivative wrt atm pos. --- for all directions
1598 : ! --------------------------------------------------------------------
1599 : if ((signs==1).and. &
1600 : & (choice_==2.or.choice_==23.or.choice_==24.or.choice_==4.or.choice_==54.or.choice_==6)) then
1601 : mu0 =1;if (choice_==23.or.choice_==6) mu0=7
1602 : do ilmn=1,nlmn
1603 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1604 : scale=wt;if (il>1) scale=-scale
1605 : scale2=two_pi*scale
1606 : if (cplex==2) then
1607 : !$OMP SINGLE
1608 : buffer_r1 = zero ; buffer_r2 = zero
1609 : buffer_r3 = zero ; buffer_i1 = zero
1610 : buffer_i2 = zero ; buffer_i3 = zero
1611 : !$OMP END SINGLE
1612 : !$OMP DO &
1613 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_i1,buffer_i2,buffer_i3),&
1614 : !$OMP PRIVATE(aux_r,aux_i)
1615 : do ipw=1,npw
1616 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1617 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1618 : buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
1619 : buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
1620 : buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
1621 : buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
1622 : buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
1623 : buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
1624 : end do
1625 : !$OMP END DO
1626 : !$OMP SINGLE
1627 : if (parity) then
1628 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_r1
1629 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_i1
1630 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
1631 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_i2
1632 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
1633 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_i3
1634 : else
1635 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_i1
1636 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_r1
1637 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
1638 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
1639 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
1640 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
1641 : end if
1642 : !$OMP END SINGLE
1643 : else
1644 : if (parity) then
1645 : !$OMP SINGLE
1646 : buffer_r1 = zero ; buffer_r2 = zero ; buffer_r3 = zero
1647 : !$OMP END SINGLE
1648 : !$OMP DO &
1649 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3), &
1650 : !$OMP PRIVATE(aux_r,aux_i)
1651 : do ipw=1,npw
1652 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1653 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1654 : buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
1655 : buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
1656 : buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
1657 : end do
1658 : !$OMP END DO
1659 : !$OMP SINGLE
1660 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_r1
1661 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
1662 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
1663 : !$OMP END SINGLE
1664 : else
1665 : !$OMP SINGLE
1666 : buffer_i1 = zero ; buffer_i2 = zero ; buffer_i3 = zero
1667 : !$OMP END SINGLE
1668 : !$OMP DO &
1669 : !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3), &
1670 : !$OMP PRIVATE(aux_r,aux_i)
1671 : do ipw=1,npw
1672 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1673 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1674 : buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
1675 : buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
1676 : buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
1677 : end do
1678 : !$OMP SINGLE
1679 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_i1
1680 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
1681 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
1682 : !$OMP END SINGLE
1683 : end if
1684 : end if
1685 : end do
1686 : end if
1687 :
1688 : ! --------------------------------------------------------------------
1689 : ! CHOICE= 2 -- SIGNS= 2
1690 : ! Accumulate dGxdt --- derivative wrt atm pos. --- for direction IDIR
1691 : ! --------------------------------------------------------------------
1692 : if ((signs==2).and.(choice_==2)) then
1693 : mu0=1
1694 : do ilmn=1,nlmn
1695 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1696 : scale=wt;if (il>1) scale=-scale
1697 : scale2=two_pi*scale
1698 : if (cplex==2) then
1699 : !$OMP SINGLE
1700 : buffer_r1 = zero ; buffer_i1 = zero
1701 : !$OMP END SINGLE
1702 : !$OMP DO &
1703 : !$OMP REDUCTION(+:buffer_r1,buffer_i1), &
1704 : !$OMP PRIVATE(aux_r,aux_i)
1705 : do ipw=1,npw
1706 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1707 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1708 : buffer_r1 = buffer_r1 - aux_i*kpg(ipw,idir)
1709 : buffer_i1 = buffer_i1 + aux_r*kpg(ipw,idir)
1710 : end do
1711 : !$OMP END DO
1712 : !$OMP SINGLE
1713 : if (parity) then
1714 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1715 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_i1
1716 : else
1717 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1718 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1719 : end if
1720 : !$OMP END SINGLE
1721 : else
1722 : if (parity) then
1723 : !$OMP SINGLE
1724 : buffer_r1 = zero
1725 : !$OMP END SINGLE
1726 : !$OMP DO &
1727 : !$OMP REDUCTION(+:buffer_r1)
1728 : do ipw=1,npw
1729 : buffer_r1 = buffer_r1 - scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
1730 : end do
1731 : !$OMP END DO
1732 : !$OMP SINGLE
1733 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1734 : !$OMP END SINGLE
1735 : else
1736 : !$OMP SINGLE
1737 : buffer_i1 = zero
1738 : !$OMP END SINGLE
1739 : !$OMP DO &
1740 : !$OMP REDUCTION(+:buffer_i1)
1741 : do ipw=1,npw
1742 : buffer_i1 = buffer_i1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
1743 : end do
1744 : !$OMP END DO
1745 : !$OMP SINGLE
1746 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1747 : !$OMP END SINGLE
1748 : end if
1749 : end if
1750 : end do
1751 : end if
1752 :
1753 : ! --------------------------------------------------------------------
1754 : ! CHOICE= 22 and 25 -- SIGNS= 2
1755 : ! Accumulate dGxdt --- derivative wrt atm pos. and one or two q-vectors---
1756 : ! for directions fixed by IDIR and qdir
1757 : ! --------------------------------------------------------------------
1758 : if (signs==2.and.(choice_==22.or.choice_==25)) then
1759 : !Use same notation as the notes for clarity
1760 : if(choice_==22) ialpha=idir
1761 : if(choice_==25) ialpha=nalpha(idir)
1762 : mu0=1
1763 : do ilmn=1,nlmn
1764 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1765 : scale=wt;if (il>1) scale=-scale
1766 : if (cplex==2) then
1767 : !$OMP SINGLE
1768 : buffer_r1 = zero ; buffer_i1 = zero
1769 : !$OMP END SINGLE
1770 : !$OMP DO &
1771 : !$OMP REDUCTION(+:buffer_r1,buffer_i1), &
1772 : !$OMP PRIVATE(aux_r,aux_i)
1773 : do ipw=1,npw
1774 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1775 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1776 : buffer_r1 = buffer_r1 + aux_r*kpg(ipw,ialpha)
1777 : buffer_i1 = buffer_i1 + aux_i*kpg(ipw,ialpha)
1778 : end do
1779 : !$OMP END DO
1780 : !$OMP SINGLE
1781 : if (parity) then
1782 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1783 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
1784 : else
1785 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1786 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1787 : end if
1788 : !$OMP END SINGLE
1789 : else
1790 : if (parity) then
1791 : !$OMP SINGLE
1792 : buffer_r1 = zero
1793 : !$OMP END SINGLE
1794 : !$OMP DO &
1795 : !$OMP REDUCTION(+:buffer_r1)
1796 : do ipw=1,npw
1797 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
1798 : end do
1799 : !$OMP END DO
1800 : !$OMP SINGLE
1801 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1802 : !$OMP END SINGLE
1803 : else
1804 : !$OMP SINGLE
1805 : buffer_i1 = zero
1806 : !$OMP END SINGLE
1807 : !$OMP DO &
1808 : !$OMP REDUCTION(+:buffer_i1)
1809 : do ipw=1,npw
1810 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
1811 : end do
1812 : !$OMP END DO
1813 : !$OMP SINGLE
1814 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1815 : !$OMP END SINGLE
1816 : end if
1817 : end if
1818 : end do
1819 : end if
1820 :
1821 : ! --------------------------------------------------------------------
1822 : ! CHOICE= 3, 6, 23, 55 -- SIGNS= 1
1823 : ! Accumulate dGxdt --- derivative wrt strain --- for all directions
1824 : ! --------------------------------------------------------------------
1825 : if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) then
1826 : mu0=1
1827 : do ilmn=1,nlmn
1828 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1829 : scale=wt;if (il>1) scale=-scale
1830 : scale2=half*scale
1831 : if (cplex==2) then
1832 : !$OMP SINGLE
1833 : buffer_r1 = zero ; buffer_r2 = zero
1834 : buffer_r3 = zero ; buffer_r4 = zero
1835 : buffer_r5 = zero ; buffer_r6 = zero
1836 : buffer_i1 = zero ; buffer_i2 = zero
1837 : buffer_i3 = zero ; buffer_i4 = zero
1838 : buffer_i5 = zero ; buffer_i6 = zero
1839 : !$OMP END SINGLE
1840 : !$OMP DO &
1841 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5,buffer_r6), &
1842 : !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5,buffer_i6), &
1843 : !$OMP PRIVATE(aux_r2,aux_r3,aux_r4,aux_i2,aux_i3,aux_i4)
1844 : do ipw=1,npw
1845 : aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
1846 : aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
1847 : aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
1848 : aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
1849 : aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
1850 : aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
1851 : buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
1852 : buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
1853 : buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
1854 : buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
1855 : buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
1856 : buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
1857 : buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
1858 : buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
1859 : buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
1860 : buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
1861 : buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
1862 : buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
1863 : end do
1864 : !$OMP END DO
1865 : !$OMP SINGLE
1866 : if (parity) then
1867 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_r1
1868 : dgxdt(2,mu0 ,ilmn,ia,ispinor) =-scale*buffer_i1
1869 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
1870 : dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
1871 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
1872 : dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
1873 : dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
1874 : dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_i4
1875 : dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
1876 : dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_i5
1877 : dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
1878 : dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_i6
1879 : else
1880 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
1881 : dgxdt(2,mu0 ,ilmn,ia,ispinor) =-scale*buffer_r1
1882 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
1883 : dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
1884 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
1885 : dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
1886 : dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
1887 : dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
1888 : dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
1889 : dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
1890 : dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
1891 : dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
1892 : end if
1893 : !$OMP END SINGLE
1894 : else
1895 : if (parity) then
1896 : !$OMP SINGLE
1897 : buffer_r1 = zero ; buffer_r2 = zero
1898 : buffer_r3 = zero ; buffer_r4 = zero
1899 : buffer_r5 = zero ; buffer_r6 = zero
1900 : !$OMP END SINGLE
1901 : !$OMP DO &
1902 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5,buffer_r6), &
1903 : !$OMP PRIVATE(aux_r2,aux_r3,aux_r4)
1904 : do ipw=1,npw
1905 : aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
1906 : aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
1907 : aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
1908 : buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
1909 : buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
1910 : buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
1911 : buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
1912 : buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
1913 : buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
1914 : end do
1915 : !$OMP SINGLE
1916 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_r1
1917 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
1918 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
1919 : dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
1920 : dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
1921 : dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
1922 : !$OMP END SINGLE
1923 : else
1924 : !$OMP SINGLE
1925 : buffer_i1 = zero ; buffer_i2 = zero
1926 : buffer_i3 = zero ; buffer_i4 = zero
1927 : buffer_i5 = zero ; buffer_i6 = zero
1928 : !$OMP END SINGLE
1929 : !$OMP DO &
1930 : !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5,buffer_i6), &
1931 : !$OMP PRIVATE(aux_i2,aux_i3,aux_i4)
1932 : do ipw=1,npw
1933 : aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
1934 : aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
1935 : aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
1936 : buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
1937 : buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
1938 : buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
1939 : buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
1940 : buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
1941 : buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
1942 : end do
1943 : !$OMP END DO
1944 : !$OMP SINGLE
1945 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
1946 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
1947 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
1948 : dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
1949 : dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
1950 : dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
1951 : !$OMP END SINGLE
1952 : end if
1953 : end if
1954 : end do
1955 : end if
1956 :
1957 : ! --------------------------------------------------------------------
1958 : ! CHOICE= 3 -- SIGNS= 2
1959 : ! Accumulate dGxdt --- derivative wrt strain --- for direction IDIR
1960 : ! --------------------------------------------------------------------
1961 : if ((signs==2).and.(choice_==3)) then
1962 : mu0=1;ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir
1963 : do ilmn=1,nlmn
1964 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1965 : scale=wt;if (il>1) scale=-scale
1966 : if (cplex==2) then
1967 : !$OMP SINGLE
1968 : buffer_r1 = zero ; buffer_i1 = zero
1969 : !$OMP END SINGLE
1970 : !$OMP DO &
1971 : !$OMP REDUCTION(+:buffer_r1,buffer_i1)
1972 : do ipw=1,npw
1973 : buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
1974 : buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
1975 : end do
1976 : !$OMP END DO
1977 : !$OMP SINGLE
1978 : if (parity) then
1979 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1980 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
1981 : else
1982 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1983 : dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1984 : end if
1985 : !$OMP END SINGLE
1986 : else
1987 : if (parity) then
1988 : !$OMP SINGLE
1989 : buffer_r1 = zero
1990 : !$OMP END SINGLE
1991 : !$OMP DO &
1992 : !$OMP REDUCTION(+:buffer_r1)
1993 : do ipw=1,npw
1994 : buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
1995 : end do
1996 : !$OMP END DO
1997 : !$OMP SINGLE
1998 : dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1999 : !$OMP END SINGLE
2000 : else
2001 : !$OMP SINGLE
2002 : buffer_i1 = zero
2003 : !$OMP END SINGLE
2004 : !$OMP DO &
2005 : !$OMP REDUCTION(+:buffer_i1)
2006 : do ipw=1,npw
2007 : buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
2008 : end do
2009 : !$OMP END DO
2010 : !$OMP SINGLE
2011 : dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
2012 : !$OMP END SINGLE
2013 : end if
2014 : end if
2015 : end do
2016 : end if
2017 :
2018 : ! --------------------------------------------------------------------
2019 : ! CHOICE= 33 -- SIGNS= 2
2020 : ! Accumulate dGxdt and d2Gxdt --- mixed derivative wrt strain and q-vector ---
2021 : ! for directions fixed by idir and qdir
2022 : ! --------------------------------------------------------------------
2023 : if ((signs==2).and.(choice_==33)) then
2024 : !Use same notation as the notes for clarity
2025 : ibeta=nalpha(idir)
2026 : idelta=nbeta(idir)
2027 : igamma=qdir
2028 : idelgam=gamma(idelta,igamma)
2029 : do ilmn=1,nlmn
2030 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2031 : scale=wt;if (il>1) scale=-scale
2032 : if (cplex==2) then
2033 : !$OMP SINGLE
2034 : buffer_r1 = zero ; buffer_i1 = zero
2035 : buffer_r2 = zero ; buffer_i2 = zero
2036 : buffer_r3 = zero ; buffer_i3 = zero
2037 : buffer_r4 = zero ; buffer_i4 = zero
2038 : buffer_r5 = zero ; buffer_i5 = zero
2039 : !$OMP END SINGLE
2040 : !$OMP DO &
2041 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5), &
2042 : !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5), &
2043 : !$OMP PRIVATE(aux_r,aux_i)
2044 : do ipw=1,npw
2045 : aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
2046 : aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
2047 : buffer_r1 = buffer_r1 + aux_r
2048 : buffer_i1 = buffer_i1 + aux_i
2049 : buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
2050 : buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
2051 : aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
2052 : aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
2053 : buffer_r3 = buffer_r3 + aux_r
2054 : buffer_i3 = buffer_i3 + aux_i
2055 : buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
2056 : buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
2057 : aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
2058 : aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
2059 : buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
2060 : buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
2061 : end do
2062 : !$OMP END DO
2063 : !$OMP SINGLE
2064 : if (parity) then
2065 : dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
2066 : dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i1
2067 : dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
2068 : dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i3
2069 : d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
2070 : d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i2
2071 : d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
2072 : d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i4
2073 : d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
2074 : d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_i5
2075 : else
2076 : dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
2077 : dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r1
2078 : dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
2079 : dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r3
2080 : d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
2081 : d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r2
2082 : d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
2083 : d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r4
2084 : d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
2085 : d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_r5
2086 : end if
2087 : !$OMP END SINGLE
2088 : else
2089 : if (parity) then
2090 : !$OMP SINGLE
2091 : buffer_r1 = zero
2092 : buffer_r2 = zero
2093 : buffer_r3 = zero
2094 : buffer_r4 = zero
2095 : buffer_r5 = zero
2096 : !$OMP END SINGLE
2097 : !$OMP DO &
2098 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5), &
2099 : !$OMP PRIVATE(aux_r)
2100 : do ipw=1,npw
2101 : aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
2102 : buffer_r1 = buffer_r1 + aux_r
2103 : buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
2104 : aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
2105 : buffer_r3 = buffer_r3 + aux_r
2106 : buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
2107 : aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
2108 : buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
2109 : end do
2110 : !$OMP SINGLE
2111 : dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
2112 : dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
2113 : d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
2114 : d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
2115 : d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
2116 : !$OMP END SINGLE
2117 : else
2118 : !$OMP SINGLE
2119 : buffer_i1 = zero
2120 : buffer_i2 = zero
2121 : buffer_i3 = zero
2122 : buffer_i4 = zero
2123 : buffer_i5 = zero
2124 : !$OMP END SINGLE
2125 : !$OMP DO &
2126 : !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5), &
2127 : !$OMP PRIVATE(aux_i)
2128 : do ipw=1,npw
2129 : aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
2130 : buffer_i1 = buffer_i1 + aux_i
2131 : buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
2132 : aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
2133 : buffer_i3 = buffer_i3 + aux_i
2134 : buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
2135 : aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
2136 : buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
2137 : end do
2138 : !$OMP END DO
2139 : !$OMP SINGLE
2140 : dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
2141 : dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
2142 : d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
2143 : d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
2144 : d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
2145 : !$OMP END SINGLE
2146 : end if
2147 : end if
2148 : end do
2149 : end if
2150 :
2151 : ! --------------------------------------------------------------------
2152 : ! CHOICE= 4, 24 -- SIGNS= 1
2153 : ! Accumulate d2Gxdt --- 2nd derivative wrt 2 atm pos. --- for all dirs
2154 : ! --------------------------------------------------------------------
2155 : if ((signs==1).and.(choice_==4.or.choice_==24)) then
2156 : mu0=1
2157 : do ilmn=1,nlmn
2158 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2159 : scale=wt;if (il>1) scale=-scale
2160 : scale2=two_pi2*scale
2161 : if (cplex==2) then
2162 : !$OMP SINGLE
2163 : buffer_ra = zero ; buffer_rb = zero
2164 : buffer_rc = zero ; buffer_rd = zero
2165 : buffer_re = zero ; buffer_rf = zero
2166 : buffer_ia = zero ; buffer_ib = zero
2167 : buffer_ic = zero ; buffer_id = zero
2168 : buffer_ie = zero ; buffer_if = zero
2169 : !$OMP END SINGLE
2170 : !$OMP DO &
2171 : !$OMP PRIVATE(aux_r,aux_i), &
2172 : !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc,buffer_rd,buffer_re,buffer_rf),&
2173 : !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic,buffer_id,buffer_ie,buffer_if)
2174 : do ipw=1,npw
2175 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
2176 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
2177 : buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
2178 : buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
2179 : buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
2180 : buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
2181 : buffer_re = buffer_re - aux_r*kpg(ipw,8)
2182 : buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
2183 : buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
2184 : buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
2185 : buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
2186 : buffer_id = buffer_id - aux_i*kpg(ipw,7)
2187 : buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
2188 : buffer_if = buffer_if - aux_i*kpg(ipw,9)
2189 : end do
2190 : !$OMP END DO
2191 : !$OMP SINGLE
2192 : if (parity) then
2193 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ra
2194 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ia
2195 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
2196 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_ib
2197 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
2198 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_ic
2199 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
2200 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_id
2201 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
2202 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_ie
2203 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
2204 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_if
2205 : else
2206 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_ia
2207 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ra
2208 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
2209 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
2210 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
2211 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
2212 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
2213 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
2214 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
2215 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
2216 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
2217 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
2218 : end if
2219 : !$OMP END SINGLE
2220 : else
2221 : if (parity) then
2222 : !$OMP SINGLE
2223 : buffer_ra = zero ; buffer_rb = zero
2224 : buffer_rc = zero ; buffer_rd = zero
2225 : buffer_re = zero ; buffer_rf = zero
2226 : !$OMP END SINGLE
2227 : !$OMP DO &
2228 : !$OMP PRIVATE(aux_r,aux_i), &
2229 : !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc,buffer_rd,buffer_re,buffer_rf)
2230 : do ipw=1,npw
2231 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
2232 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
2233 : buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
2234 : buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
2235 : buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
2236 : buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
2237 : buffer_re = buffer_re - aux_r*kpg(ipw,8)
2238 : buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
2239 : end do
2240 : !$OMP END DO
2241 : !$OMP SINGLE
2242 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale2*buffer_ra
2243 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
2244 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
2245 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
2246 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
2247 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
2248 : !$OMP END SINGLE
2249 : else
2250 : !$OMP SINGLE
2251 : buffer_ia = zero ; buffer_ib = zero
2252 : buffer_ic = zero ; buffer_id = zero
2253 : buffer_ie = zero ; buffer_if = zero
2254 : !$OMP END SINGLE
2255 : !$OMP DO &
2256 : !$OMP PRIVATE(aux_i,aux_r), &
2257 : !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic,buffer_id,buffer_ie,buffer_if)
2258 : do ipw=1,npw
2259 : aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
2260 : aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
2261 : buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
2262 : buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
2263 : buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
2264 : buffer_id = buffer_id - aux_i*kpg(ipw,7)
2265 : buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
2266 : buffer_if = buffer_if - aux_i*kpg(ipw,9)
2267 : end do
2268 : !$OMP END DO
2269 : !$OMP SINGLE
2270 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale2*buffer_ia
2271 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
2272 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
2273 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
2274 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
2275 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
2276 : !$OMP END SINGLE
2277 : end if
2278 : end if
2279 : end do
2280 : end if
2281 :
2282 : ! --------------------------------------------------------------------
2283 : ! CHOICE= 5, 51, 52, 53, 54, 55, 8, 81 -- SIGNS= 1
2284 : ! Accumulate dGxdt --- derivative wrt k --- for all directions
2285 : ! --------------------------------------------------------------------
2286 : if ((signs==1).and.&
2287 : & (choice_==5 .or.choice_==51.or.choice_==52.or.choice_==53.or.&
2288 : & choice_==54.or.choice_==55.or.choice_==8 .or.choice_==81)) then
2289 : mu0=1
2290 : if (choice_==54) mu0=4
2291 : if (choice_==55) mu0=7
2292 : do ilmn=1,nlmn
2293 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2294 : scale=wt;if (il>1) scale=-scale
2295 : if (cplex==2) then
2296 : !$OMP SINGLE
2297 : buffer_r1 = zero ; buffer_r2 = zero
2298 : buffer_r3 = zero
2299 : buffer_i1 = zero ; buffer_i2 = zero
2300 : buffer_i3 = zero
2301 : !$OMP END SINGLE
2302 : !$OMP DO &
2303 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3), &
2304 : !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3)
2305 : do ipw=1,npw
2306 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
2307 : buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
2308 : buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
2309 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
2310 : buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
2311 : buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
2312 : end do
2313 : !$OMP END DO
2314 : !$OMP SINGLE
2315 : if (parity) then
2316 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_r1
2317 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
2318 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
2319 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
2320 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
2321 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
2322 : else
2323 : dgxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_i1
2324 : dgxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_r1
2325 : dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
2326 : dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
2327 : dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
2328 : dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
2329 : end if
2330 : !$OMP END SINGLE
2331 : else
2332 : cplex_dgxdt(mu0:mu0+2) = 2 ! Warning dgxdt is here pure imaginary
2333 : if (parity) then
2334 : !$OMP SINGLE
2335 : buffer_i1 = zero ; buffer_i2 = zero
2336 : buffer_i3 = zero
2337 : !$OMP END SINGLE
2338 : !$OMP DO &
2339 : !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3)
2340 : do ipw=1,npw
2341 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
2342 : buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
2343 : buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
2344 : end do
2345 : !$OMP END DO
2346 : !$OMP SINGLE
2347 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_i1
2348 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
2349 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
2350 : !$OMP END SINGLE
2351 : else
2352 : !$OMP SINGLE
2353 : buffer_r1 = zero ; buffer_r2 = zero
2354 : buffer_r3 = zero
2355 : !$OMP END SINGLE
2356 : !$OMP DO &
2357 : !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3)
2358 : do ipw=1,npw
2359 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
2360 : buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
2361 : buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
2362 : end do
2363 : !$OMP END DO
2364 : !$OMP SINGLE
2365 : dgxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_r1
2366 : dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
2367 : dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
2368 : !$OMP END SINGLE
2369 : end if
2370 : end if
2371 : end do
2372 : end if
2373 :
2374 : ! --------------------------------------------------------------------
2375 : ! CHOICE= 5, 51, 52, 53, 54, 8, 81 -- SIGNS= 2
2376 : ! Accumulate dGxdt --- derivative wrt k ---
2377 : ! for direction IDIR (CHOICE=5,51,52)
2378 : ! for direction IDIR2 (CHOICE=54,81)
2379 : ! for directions IDIR-1 & IDIR+1 (CHOICE=53)
2380 : ! for 2 directions (CHOICE=8)
2381 : ! --------------------------------------------------------------------
2382 : if ((signs==2).and.&
2383 : & (choice_==5.or.choice_==51.or.choice_==52.or.choice_==53.or.choice_==54.or. &
2384 : & choice_==8.or.choice_==81)) then
2385 : mu0=1
2386 : if (choice_==5.or.choice_==51.or.choice_==52) then
2387 : ! We compute the derivative in one direction
2388 : ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir
2389 : ndir=1
2390 : end if
2391 : if (choice_==53) then
2392 : ! Case 53 though need multiple directions and here ffnl will contain the
2393 : ! derivative information in locations 2,3, and 4 corresponding to idir = 1, 2,
2394 : ! and 3. Moreover, choice 53 needs the derivatives in direction idir+1 and idir-1.
2395 : ! The parameter vector ffnl_dir_dat contains the necessary translations in
2396 : ! locations 1,2 for idir=1; 3,4 for idir=2; and 5,6 for idir=3.
2397 : ffnl_dir(1)=ffnl_dir_dat(2*idir-1);ffnl_dir(2)=ffnl_dir_dat(2*idir)
2398 : ndir=2
2399 : end if
2400 : if (choice_==54) then
2401 : ! We compute the derivative in one direction (the second one)
2402 : ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir2(idir)
2403 : ndir=1
2404 : end if
2405 : if (choice_==8) then
2406 : ! We compute the derivative in two directions
2407 : ! depending on the input idir argument
2408 : ffnl_dir(1)=idir1(idir);ffnl_dir(2)=idir2(idir)
2409 : ndir=2
2410 : end if
2411 : if (choice_==81) then
2412 : ! We compute the derivative in one direction (the second one)
2413 : ffnl_dir(1)=idir2(idir)
2414 : ndir=1
2415 : end if
2416 : do mua=1,ndir
2417 : mu=mu0+mua-1
2418 : do ilmn=1,nlmn
2419 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2420 : scale=wt;if (il>1) scale=-scale
2421 : if (cplex==2) then
2422 : !$OMP SINGLE
2423 : buffer_r1 = zero ; buffer_i1 = zero
2424 : !$OMP END SINGLE
2425 : !$OMP DO &
2426 : !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2427 : do ipw=1,npw
2428 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2429 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2430 : end do
2431 : !$OMP END DO
2432 : !$OMP SINGLE
2433 : if (parity) then
2434 : dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
2435 : dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_i1
2436 : else
2437 : dgxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
2438 : dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_r1
2439 : end if
2440 : !$OMP END SINGLE
2441 : else
2442 : !$OMP SINGLE
2443 : cplex_dgxdt(mu) = 2 ! Warning dgxdt is here pure imaginary
2444 : !$OMP END SINGLE
2445 : if (parity) then
2446 : !$OMP SINGLE
2447 : buffer_i1 = zero
2448 : !$OMP END SINGLE
2449 : !$OMP DO &
2450 : !$OMP REDUCTION(+:buffer_i1)
2451 : do ipw=1,npw
2452 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2453 : end do
2454 : !$OMP END DO
2455 : !$OMP SINGLE
2456 : dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
2457 : !$OMP END SINGLE
2458 : else
2459 : !$OMP SINGLE
2460 : buffer_r1 = zero
2461 : !$OMP END SINGLE
2462 : !$OMP DO &
2463 : !$OMP REDUCTION(+:buffer_r1)
2464 : do ipw=1,npw
2465 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2466 : end do
2467 : !$OMP SINGLE
2468 : dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
2469 : !$OMP END SINGLE
2470 : end if
2471 : end if
2472 : end do
2473 : end do
2474 : end if
2475 :
2476 : ! --------------------------------------------------------------------
2477 : ! CHOICE= 54 -- SIGNS= 1
2478 : ! Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- in all dirs
2479 : ! --------------------------------------------------------------------
2480 : if ((signs==1).and.(choice_==54)) then
2481 : mu0=1
2482 : do ilmn=1,nlmn
2483 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2484 : scale=wt;if (il>1) scale=-scale
2485 : scale2=two_pi*scale
2486 : if (cplex==2) then
2487 : do mua=1,3 ! atm. pos
2488 : do mub=1,3 ! k
2489 : mu=mu0+(mub-1)+3*(mua-1)
2490 : !$OMP SINGLE
2491 : buffer_r1 = zero ; buffer_i1 = zero
2492 : !$OMP END SINGLE
2493 : !$OMP DO &
2494 : !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2495 : do ipw=1,npw
2496 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2497 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2498 : end do
2499 : !$OMP END DO
2500 : !$OMP SINGLE
2501 : if (parity) then
2502 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2503 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2504 : else
2505 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
2506 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2507 : end if
2508 : !$OMP END SINGLE
2509 : end do
2510 : end do
2511 : else
2512 : !$OMP SINGLE
2513 : cplex_d2gxdt(mu0:mu0+8) = 2 ! Warning dgxdt is here pure imaginary
2514 : !$OMP END SINGLE
2515 : if (parity) then
2516 : do mua=1,3 ! atm. pos
2517 : do mub=1,3 ! k
2518 : mu=mu0+(mub-1)+3*(mua-1)
2519 : !$OMP SINGLE
2520 : buffer_r1 = zero
2521 : !$OMP END SINGLE
2522 : !$OMP DO &
2523 : !$OMP REDUCTION(+:buffer_r1)
2524 : do ipw=1,npw
2525 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2526 : end do
2527 : !$OMP END DO
2528 : !$OMP SINGLE
2529 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2530 : !$OMP END SINGLE
2531 : end do
2532 : end do
2533 : else
2534 : do mua=1,3 ! atm. pos
2535 : do mub=1,3 ! k
2536 : mu=mu0+(mub-1)+3*(mua-1)
2537 : !$OMP SINGLE
2538 : buffer_i1 = zero
2539 : !$OMP END SINGLE
2540 : !$OMP DO &
2541 : !$OMP REDUCTION(+:buffer_i1)
2542 : do ipw=1,npw
2543 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2544 : end do
2545 : !$OMP END DO
2546 : !$OMP SINGLE
2547 : d2gxdt(1,mu,ilmn,ia,ispinor) = -scale2*buffer_i1
2548 : !$OMP END SINGLE
2549 : end do
2550 : end do
2551 : end if
2552 : end if
2553 : end do
2554 : end if
2555 :
2556 : ! --------------------------------------------------------------------
2557 : ! CHOICE= 54 -- SIGNS= 2
2558 : ! Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- for direction IDIR
2559 : ! --------------------------------------------------------------------
2560 : if ((signs==2).and.(choice_==54)) then
2561 : mu0=1
2562 : !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
2563 : mua=idir1(idir) ! atm. pos
2564 : mub=1;if(dimffnl>2) mub=idir2(idir) ! k
2565 : do ilmn=1,nlmn
2566 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2567 : scale=wt;if (il>1) scale=-scale
2568 : scale2=two_pi*scale
2569 : if (cplex==2) then
2570 : !$OMP SINGLE
2571 : buffer_r1 = zero ; buffer_i1 = zero
2572 : !$OMP END SINGLE
2573 : !$OMP DO &
2574 : !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2575 : do ipw=1,npw
2576 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2577 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2578 : end do
2579 : !$OMP END DO
2580 : !$OMP SINGLE
2581 : if (parity) then
2582 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
2583 : d2gxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
2584 : else
2585 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_r1
2586 : d2gxdt(2,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
2587 : end if
2588 : !$OMP END SINGLE
2589 : else
2590 : cplex_d2gxdt(mu0) = 2 ! Warning d2gxdt is here pure imaginary
2591 : if (parity) then
2592 : !$OMP SINGLE
2593 : buffer_r1 = zero
2594 : !$OMP END SINGLE
2595 : !$OMP DO &
2596 : !$OMP REDUCTION(+:buffer_r1)
2597 : do ipw=1,npw
2598 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2599 : end do
2600 : !$OMP END DO
2601 : !$OMP SINGLE
2602 : d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
2603 : !$OMP END SINGLE
2604 : else
2605 : !$OMP SINGLE
2606 : buffer_i1 = zero
2607 : !$OMP END SINGLE
2608 : !$OMP DO &
2609 : !$OMP REDUCTION(+:buffer_i1)
2610 : do ipw=1,npw
2611 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2612 : end do
2613 : !$OMP SINGLE
2614 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
2615 : !$OMP END SINGLE
2616 : end if
2617 : end if
2618 : end do
2619 : end if
2620 :
2621 : ! --------------------------------------------------------------------
2622 : ! CHOICE= 55 -- SIGNS= 1
2623 : ! Accumulate d2Gxdt --- 2nd derivative wrt k and strains --- for all dirs
2624 : ! --------------------------------------------------------------------
2625 : if ((signs==1).and.(choice_==55)) then
2626 : mu0=1
2627 : do ilmn=1,nlmn
2628 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2629 : scale=wt;if (il>1) scale=-scale
2630 : if (cplex==2) then
2631 : do mua=1,6 ! strain
2632 : do mub=1,3 ! k
2633 : mu=mu0+(mub-1)+3*(mua-1)
2634 : !$OMP SINGLE
2635 : buffer_r1 = zero ; buffer_i1 = zero
2636 : !$OMP END SINGLE
2637 : !$OMP DO &
2638 : !$OMP REDUCTION(+:buffer_r1,buffer_i1),&
2639 : !$OMP PRIVATE(aux_r)
2640 : do ipw=1,npw
2641 : aux_r=ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
2642 : buffer_r1 = buffer_r1 + aux_r*scalr(ipw)
2643 : buffer_i1 = buffer_i1 + aux_r*scali(ipw)
2644 : end do
2645 : !$OMP END DO
2646 : !$OMP SINGLE
2647 : if (parity) then
2648 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
2649 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_i1
2650 : else
2651 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
2652 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_r1
2653 : end if
2654 : !$OMP END SINGLE
2655 : end do
2656 : end do
2657 : else
2658 : !$OMP SINGLE
2659 : cplex_d2gxdt(mu0:mu0+17) = 2 ! Warning d2gxdt is here pure imaginary
2660 : !$OMP END SINGLE
2661 : if (parity) then
2662 : do mua=1,6 ! strain
2663 : do mub=1,3 ! k
2664 : mu=mu0+(mub-1)+3*(mua-1)
2665 : !$OMP SINGLE
2666 : buffer_i1 = zero
2667 : !$OMP END SINGLE
2668 : !$OMP DO &
2669 : !$OMP REDUCTION(+:buffer_i1)
2670 : do ipw=1,npw
2671 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
2672 : end do
2673 : !$OMP END DO
2674 : !$OMP SINGLE
2675 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
2676 : !$OMP END SINGLE
2677 : end do
2678 : end do
2679 : else
2680 : do mua=1,6 ! strain
2681 : do mub=1,3 ! k
2682 : mu=mu0+(mub-1)+3*(mua-1)
2683 : !$OMP SINGLE
2684 : buffer_r1 = zero
2685 : !$OMP END SINGLE
2686 : !$OMP DO &
2687 : !$OMP REDUCTION(+:buffer_r1)
2688 : do ipw=1,npw
2689 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
2690 : end do
2691 : !$OMP END DO
2692 : !$OMP SINGLE
2693 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
2694 : !$OMP END SINGLE
2695 : end do
2696 : end do
2697 : end if
2698 : end if
2699 : end do
2700 : end if
2701 :
2702 : ! --------------------------------------------------------------------
2703 : ! CHOICE= 6 -- SIGNS= 1
2704 : ! Accumulate d2Gxdt --- 2nd derivative wrt atm. pos and strain --- for all dirs
2705 : ! --------------------------------------------------------------------
2706 : if ((signs==1).and.(choice_==6)) then
2707 : mu0=1;if (choice_==6) mu0=37
2708 : ABI_MALLOC(scalarr,(npw,4))
2709 : ABI_MALLOC(scalari,(npw,4))
2710 : do ilmn=1,nlmn
2711 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2712 : scale=wt;if (il>1) scale=-scale
2713 : scale2=pi*scale
2714 : do mu=1,4
2715 : !$OMP SINGLE
2716 : do ipw=1,npw
2717 : scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
2718 : scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
2719 : end do
2720 : !$OMP END SINGLE
2721 : end do
2722 : if(cplex==2) then
2723 : do mub=1,6
2724 : nub1=alpha(mub);nub2=beta(mub)
2725 : do mua=1,3
2726 : mu=mu0+(mua-1)+3*(mub-1)
2727 : buffer_r1 = zero ; buffer_i1 = zero
2728 : !$OMP DO &
2729 : !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2730 : do ipw=1,npw
2731 : buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
2732 : & scalari(ipw,1+nub2)*kpg(ipw,nub1))
2733 : buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
2734 : & scalarr(ipw,1+nub2)*kpg(ipw,nub1))
2735 : end do
2736 : !$OMP END DO
2737 : if (parity) then
2738 : !$OMP SINGLE
2739 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2740 : d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
2741 : !$OMP END SINGLE
2742 : else
2743 : !$OMP SINGLE
2744 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2745 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2746 : !$OMP END SINGLE
2747 : end if
2748 : end do
2749 : end do
2750 : else
2751 : if (parity) then
2752 : do mub=1,6
2753 : nub1=alpha(mub);nub2=beta(mub)
2754 : do mua=1,3
2755 : mu=mu0+(mua-1)+3*(mub-1)
2756 : buffer_i1 = zero
2757 : !$OMP DO &
2758 : !$OMP REDUCTION(+:buffer_r1)
2759 : do ipw=1,npw
2760 : buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
2761 : & scalari(ipw,1+nub2)*kpg(ipw,nub1))
2762 : end do
2763 : !$OMP END DO
2764 : !$OMP SINGLE
2765 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2766 : !$OMP END SINGLE
2767 : end do
2768 : end do
2769 : else
2770 : do mub=1,6
2771 : nub1=alpha(mub);nub2=beta(mub)
2772 : do mua=1,3
2773 : mu=mu0+(mua-1)+3*(mub-1)
2774 : buffer_r1 = zero
2775 : !$OMP DO &
2776 : !$OMP REDUCTION(+:buffer_r1)
2777 : do ipw=1,npw
2778 : buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
2779 : & scalarr(ipw,1+nub2)*kpg(ipw,nub1))
2780 : end do
2781 : !$OMP END DO
2782 : !$OMP SINGLE
2783 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2784 : !$OMP END SINGLE
2785 : end do
2786 : end do
2787 : end if
2788 : end if
2789 : end do
2790 : ABI_FREE(scalarr)
2791 : ABI_FREE(scalari)
2792 : end if
2793 :
2794 : ! --------------------------------------------------------------------
2795 : ! CHOICE= 6 -- SIGNS= 1
2796 : ! Accumulate d2Gxdt --- 2nd derivative wrt 2 strains --- for all dirs
2797 : ! --------------------------------------------------------------------
2798 : if ((signs==1).and.(choice_==6)) then
2799 : mu0=1
2800 : ABI_MALLOC(scalarr,(npw,10))
2801 : ABI_MALLOC(scalari,(npw,10))
2802 : do ilmn=1,nlmn
2803 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2804 : scale=wt;if (il>1) scale=-scale
2805 : scale2=quarter*scale
2806 : do mu=1,10
2807 : !$OMP SINGLE
2808 : do ipw=1,npw
2809 : scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
2810 : scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
2811 : end do
2812 : !$OMP END SINGLE
2813 : end do
2814 : if(cplex==2) then
2815 : do mub=1,6
2816 : nub1=alpha(mub);nub2=beta(mub)
2817 : do mua=1,6
2818 : mu=mu0+(mua-1)+6*(mub-1)
2819 : nua1=alpha(mua);nua2=beta(mua)
2820 : gama=gamma(nub1,nua1)
2821 : gamb=gamma(nub2,nua1)
2822 : gamc=gamma(nub1,nua2)
2823 : gamd=gamma(nub2,nua2)
2824 : buffer_r1 = zero ; buffer_i1 = zero
2825 : !$OMP DO &
2826 : !$OMP REDUCTION(+:buffer_r1,buffer_i1), &
2827 : !$OMP PRIVATE(kpga,kpgb,kpgc,kpgd)
2828 : do ipw=1,npw
2829 : kpga=kpg(ipw,nub1)
2830 : kpgb=kpg(ipw,nub2)
2831 : kpgc=kpg(ipw,nua1)
2832 : kpgd=kpg(ipw,nua2)
2833 : buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
2834 : & + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
2835 : buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
2836 : & + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
2837 : end do
2838 : !$OMP END DO
2839 : if (parity) then
2840 : !$OMP SINGLE
2841 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2842 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2843 : !$OMP END SINGLE
2844 : else
2845 : !$OMP SINGLE
2846 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2847 : d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2848 : !$OMP END SINGLE
2849 : end if
2850 : end do
2851 : end do
2852 : else
2853 : if (parity) then
2854 : do mub=1,6
2855 : nub1=alpha(mub);nub2=beta(mub)
2856 : do mua=1,6
2857 : mu=mu0+(mua-1)+6*(mub-1)
2858 : nua1=alpha(mua);nua2=beta(mua)
2859 : gama=gamma(nub1,nua1)
2860 : gamb=gamma(nub2,nua1)
2861 : gamc=gamma(nub1,nua2)
2862 : gamd=gamma(nub2,nua2)
2863 : buffer_r1 = zero
2864 : !$OMP DO &
2865 : !$OMP REDUCTION(+:buffer_r1), &
2866 : !$OMP PRIVATE(kpga,kpgb,kpgc,kpgd)
2867 : do ipw=1,npw
2868 : kpga=kpg(ipw,nub1)
2869 : kpgb=kpg(ipw,nub2)
2870 : kpgc=kpg(ipw,nua1)
2871 : kpgd=kpg(ipw,nua2)
2872 : buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
2873 : & + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
2874 : end do
2875 : !$OMP END DO
2876 : !$OMP SINGLE
2877 : d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2878 : !$OMP END SINGLE
2879 : end do
2880 : end do
2881 : else
2882 : do mub=1,6
2883 : nub1=alpha(mub);nub2=beta(mub)
2884 : do mua=1,6
2885 : mu=mu0+(mua-1)+6*(mub-1)
2886 : nua1=alpha(mua);nua2=beta(mua)
2887 : gama=gamma(nub1,nua1)
2888 : gamb=gamma(nub2,nua1)
2889 : gamc=gamma(nub1,nua2)
2890 : gamd=gamma(nub2,nua2)
2891 : buffer_i1 = zero
2892 : !$OMP DO &
2893 : !$OMP REDUCTION(+:buffer_r1)
2894 : do ipw=1,npw
2895 : kpga=kpg(ipw,nub1)
2896 : kpgb=kpg(ipw,nub2)
2897 : kpgc=kpg(ipw,nua1)
2898 : kpgd=kpg(ipw,nua2)
2899 : buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
2900 : & + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
2901 : end do
2902 : !$OMP END DO
2903 : !$OMP SINGLE
2904 : d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2905 : !$OMP END SINGLE
2906 : end do
2907 : end do
2908 : end if
2909 : end if
2910 : end do
2911 : ABI_FREE(scalarr)
2912 : ABI_FREE(scalari)
2913 : end if
2914 :
2915 : ! --------------------------------------------------------------------
2916 : ! CHOICE= 8, 81 -- SIGNS= 1
2917 : ! Accumulate d2Gxdt --- 2nd derivative wrt 2 k wave vect. --- for all dirs
2918 : ! --------------------------------------------------------------------
2919 : if ((signs==1).and.(choice_==8.or.choice_==81)) then
2920 : mu0=1
2921 : do ilmn=1,nlmn
2922 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2923 : scale=wt;if (il>1) scale=-scale
2924 : if (cplex==2) then
2925 : !$OMP SINGLE
2926 : buffer_ra = zero ; buffer_rb = zero
2927 : buffer_rc = zero ; buffer_rd = zero
2928 : buffer_re = zero ; buffer_rf = zero
2929 : buffer_ia = zero ; buffer_ib = zero
2930 : buffer_ic = zero ; buffer_id = zero
2931 : buffer_ie = zero ; buffer_if = zero
2932 : !$OMP END SINGLE
2933 : !$OMP DO &
2934 : !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc), &
2935 : !$OMP REDUCTION(+:buffer_rd,buffer_re,buffer_rf), &
2936 : !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic), &
2937 : !$OMP REDUCTION(+:buffer_id,buffer_ie,buffer_if)
2938 : do ipw=1,npw
2939 : buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
2940 : buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
2941 : buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
2942 : buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
2943 : buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
2944 : buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
2945 : buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
2946 : buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
2947 : buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
2948 : buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
2949 : buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
2950 : buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
2951 : end do
2952 : !$OMP END DO
2953 : !$OMP SINGLE
2954 : if (parity) then
2955 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_ra
2956 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_ia
2957 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
2958 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_ib
2959 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
2960 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_ic
2961 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
2962 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_id
2963 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
2964 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_ie
2965 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
2966 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_if
2967 : else
2968 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_ia
2969 : d2gxdt(2,mu0 ,ilmn,ia,ispinor) = scale*buffer_ra
2970 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
2971 : d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
2972 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
2973 : d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
2974 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
2975 : d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
2976 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
2977 : d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
2978 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
2979 : d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
2980 : end if
2981 : !$OMP END SINGLE
2982 : else
2983 : if (parity) then
2984 : !$OMP SINGLE
2985 : buffer_ra = zero ; buffer_rb = zero
2986 : buffer_rc = zero ; buffer_rd = zero
2987 : buffer_re = zero ; buffer_rf = zero
2988 : !$OMP END SINGLE
2989 : !$OMP DO &
2990 : !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc), &
2991 : !$OMP REDUCTION(+:buffer_rd,buffer_re,buffer_rf)
2992 : do ipw=1,npw
2993 : buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
2994 : buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
2995 : buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
2996 : buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
2997 : buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
2998 : buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
2999 : end do
3000 : !$OMP END DO
3001 : !$OMP SINGLE
3002 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) = scale*buffer_ra
3003 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
3004 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
3005 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
3006 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
3007 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
3008 : !$OMP END SINGLE
3009 : else
3010 : !$OMP SINGLE
3011 : buffer_ia = zero ; buffer_ib = zero
3012 : buffer_ic = zero ; buffer_id = zero
3013 : buffer_ie = zero ; buffer_if = zero
3014 : !$OMP END SINGLE
3015 : !$OMP DO &
3016 : !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic), &
3017 : !$OMP REDUCTION(+:buffer_id,buffer_ie,buffer_if)
3018 : do ipw=1,npw
3019 : buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
3020 : buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
3021 : buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
3022 : buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
3023 : buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
3024 : buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
3025 : end do
3026 : !$OMP END DO
3027 : !$OMP SINGLE
3028 : d2gxdt(1,mu0 ,ilmn,ia,ispinor) =-scale*buffer_ia
3029 : d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
3030 : d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
3031 : d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
3032 : d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
3033 : d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
3034 : !$OMP END SINGLE
3035 : end if
3036 : end if
3037 : end do
3038 : end if
3039 :
3040 : ! --------------------------------------------------------------------
3041 : ! CHOICE= 8, 81 -- SIGNS= 2
3042 : ! Accumulate d2Gxdt --- 2nd derivative wrt k --- for direction IDIR (Voigt not.)
3043 : ! --------------------------------------------------------------------
3044 : if ((signs==2).and.(choice_==8.or.choice_==81)) then
3045 : mu0=1
3046 : !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
3047 : mua=idir1(idir);mub=idir2(idir)
3048 : !idir->(Voigt) (11->1,22->2,33->3,32->4,31->5,21->6)
3049 : ffnl_dir(1)=gamma(mua,mub)
3050 : do ilmn=1,nlmn
3051 : il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
3052 : scale=wt;if (il>1) scale=-scale
3053 : if (cplex==2) then
3054 : !$OMP SINGLE
3055 : buffer_r1 = zero ; buffer_i1 = zero
3056 : !$OMP END SINGLE
3057 : !$OMP DO &
3058 : !$OMP REDUCTION(+:buffer_r1,buffer_i1)
3059 : do ipw=1,npw
3060 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3061 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3062 : end do
3063 : !$OMP END DO
3064 : !$OMP SINGLE
3065 : if (parity) then
3066 : d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
3067 : d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
3068 : else
3069 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
3070 : d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
3071 : end if
3072 : !$OMP END SINGLE
3073 : else
3074 : if (parity) then
3075 : !$OMP SINGLE
3076 : buffer_r1 = zero
3077 : !$OMP END SINGLE
3078 : !$OMP DO &
3079 : !$OMP REDUCTION(+:buffer_r1)
3080 : do ipw=1,npw
3081 : buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3082 : end do
3083 : !$OMP END DO
3084 : !$OMP SINGLE
3085 : d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
3086 : !$OMP END SINGLE
3087 : else
3088 : !$OMP SINGLE
3089 : buffer_i1 = zero
3090 : !$OMP END SINGLE
3091 : !$OMP DO &
3092 : !$OMP REDUCTION(+:buffer_i1)
3093 : do ipw=1,npw
3094 : buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3095 : end do
3096 : !$OMP SINGLE
3097 : d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
3098 : !$OMP END SINGLE
3099 : end if
3100 : end if
3101 : end do
3102 : end if
3103 :
3104 : ! --------------------------------------------------------------------
3105 : ! END CHOICES
3106 : ! --------------------------------------------------------------------
3107 :
3108 : end do ! End loop on atoms
3109 :
3110 : ! Deallocate temporary space
3111 : !$OMP SECTIONS
3112 : !$OMP SECTION
3113 : ABI_FREE(scali)
3114 : !$OMP SECTION
3115 : ABI_FREE(scalr)
3116 : !$OMP END SECTIONS
3117 :
3118 : end do ! End loop on spinorial components
3119 : !$OMP END PARALLEL
3120 :
3121 : ! ==========================================================================
3122 : end if
3123 :
3124 : !Has to reduce arrays in case of FFT parallelization
3125 29398348 : if (mpi_enreg%nproc_fft>1) then
3126 444700 : call timab(48,1,tsec)
3127 444700 : if (choice>=0) then
3128 442108 : call xmpi_sum(gx,mpi_enreg%comm_fft,ierr)
3129 : end if
3130 444700 : if (choice_>1) then
3131 36192 : if (ndgxdt>0) then
3132 36192 : call xmpi_sum(dgxdt,mpi_enreg%comm_fft,ierr)
3133 : end if
3134 36192 : if (nd2gxdt>0) then
3135 0 : call xmpi_sum(d2gxdt,mpi_enreg%comm_fft,ierr)
3136 : end if
3137 : end if
3138 444700 : call timab(48,2,tsec)
3139 : end if
3140 :
3141 : end subroutine opernla_ylm
3142 : !!***
3143 :
3144 : end module m_opernla_ylm
3145 : !!***
|