Branch data Line data Source code
1 : : !!****m* ABINIT/m_vtorhotf
2 : : !! NAME
3 : : !! m_vtorhotf
4 : : !!
5 : : !! FUNCTION
6 : : !! Computes the new density from a fixed potential (vtrial) using the Thomas-Fermi functional
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR, MF, AR, MM)
10 : : !! This file is distributed under the terms of the
11 : : !! GNU General Public License, see ~abinit/COPYING
12 : : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : : !!
14 : : !! SOURCE
15 : :
16 : : #if defined HAVE_CONFIG_H
17 : : #include "config.h"
18 : : #endif
19 : :
20 : : #include "abi_common.h"
21 : :
22 : : module m_vtorhotf
23 : :
24 : : use defs_basis
25 : : use m_abicore
26 : : use m_errors
27 : : use m_xmpi
28 : : use m_dtset
29 : :
30 : : use defs_abitypes, only : MPI_type
31 : : use m_time, only : timab
32 : : use m_spacepar, only : symrhg
33 : :
34 : : implicit none
35 : :
36 : : private
37 : : !!***
38 : :
39 : : public :: vtorhotf
40 : : !!***
41 : :
42 : : contains
43 : : !!***
44 : :
45 : : !!****f* ABINIT/vtorhotf
46 : : !! NAME
47 : : !! vtorhotf
48 : : !!
49 : : !! FUNCTION
50 : : !! This routine computes the new density from a fixed potential (vtrial)
51 : : !! using the Thomas-Fermi functional
52 : : !!
53 : : !! INPUTS
54 : : !! dtset <type(dataset_type)>=all input variables for this dataset
55 : : !! gprimd(3,3)=dimensional reciprocal space primitive translations
56 : : !! irrzon(nfft**(1-1/nsym),2,(nspden/nsppol)-3*(nspden/4))=irreducible zone data
57 : : !! mpi_enreg=information about MPI parallelization
58 : : !! natom=number of atoms in cell.
59 : : !! nfft=number of fft grid points
60 : : !! nspden=number of spin-density components
61 : : !! nsppol=1 for unpolarized, 2 for spin-polarized
62 : : !! nsym=number of symmetry elements in space group
63 : : !! phnons(2,nfft**(1-1/nsym),(nspden/nsppol)-3*(nspden/4))=nonsymmorphic translation phases
64 : : !! gprimd(3,3)=dimensional real space primitive translations
65 : : !! ucvol=unit cell volume in bohr**3.
66 : : !! vtrial(nfft,nspden)=INPUT Vtrial(r).
67 : : !!
68 : : !! OUTPUT
69 : : !! ek=kinetic energy part of total energy.
70 : : !! enlx=nonlocal psp + potential Fock ACE part of total energy.
71 : : !! entropy=entropy due to the occupation number smearing (if metal)
72 : : !! fermie=fermi energy (Hartree)
73 : : !! grnl(3*natom)=stores grads of nonlocal energy wrt length scales
74 : : !! (3x3 tensor) and grads wrt atomic coordinates (3*natom)
75 : : !!
76 : : !! SIDE EFFECTS
77 : : !! rhog(2,nfft)=array for Fourier transform of electron density
78 : : !! rhor(nfft,nspden)=array for electron density in electrons/bohr**3.
79 : : !!
80 : : !! SOURCE
81 : :
82 : 277 : subroutine vtorhotf(dtset,ek,enlx,entropy,fermie,gprimd,grnl,&
83 : 277 : & irrzon,mpi_enreg,natom,nfft,nspden,nsppol,nsym,phnons,rhog,rhor,rprimd,ucvol,vtrial)
84 : :
85 : : !Arguments ------------------------------------
86 : : !scalars
87 : : integer,intent(in) :: natom,nfft,nspden,nsppol,nsym
88 : : real(dp),intent(in) :: ucvol
89 : : real(dp),intent(out) :: ek,enlx,entropy,fermie
90 : : type(MPI_type),intent(in) :: mpi_enreg
91 : : type(dataset_type),intent(in) :: dtset
92 : : !arrays
93 : : integer,intent(in) :: irrzon((dtset%ngfft(1)*dtset%ngfft(1)*dtset%ngfft(1))**(1-1/nsym),2,(nspden/nsppol)-3*(nspden/4))
94 : : real(dp),intent(in) :: gprimd(3,3)
95 : : real(dp),intent(in) :: phnons(2,(dtset%ngfft(1)*dtset%ngfft(1)*dtset%ngfft(1))**(1-1/nsym),(nspden/nsppol)-3*(nspden/4))
96 : : real(dp),intent(in) :: rprimd(3,3),vtrial(nfft,nspden)
97 : : real(dp),intent(inout) :: rhog(2,nfft),rhor(nfft,nspden)
98 : : real(dp),intent(out) :: grnl(3*natom)
99 : :
100 : : !Local variables-------------------------------
101 : : !scalars
102 : : integer,parameter :: jdichomax=20,level=111
103 : : integer :: i1,i2,i3,ierr,ifft,ii,ir,iscf,jdicho
104 : : integer :: me_fft,n1,n2,n3,nfftot,nproc_fft,prtvol
105 : : real(dp),save :: cktf,fermie_tol,nelect_mid
106 : : real(dp) :: dnelect_mid_dx,dxrtnewt,eektemp,eektf,feektemp,feektf
107 : : real(dp) :: rtnewt,sum_rhor_mid,sum_rhor_middx
108 : : logical,save :: lfirst_time_tf=.true.
109 : : logical :: lnewtonraphson
110 : : character(len=500) :: message
111 : : !arrays
112 : : real(dp) :: tsec(2)
113 : 277 : real(dp),allocatable :: betamumoinsV(:),rhor_mid(:),rhor_middx(:)
114 : :
115 : : ! *************************************************************************
116 : :
117 : : !Keep track of total time spent in vtorho
118 : 277 : call timab(21,1,tsec)
119 : :
120 : : !Structured debugging if prtvol==-level
121 : 277 : prtvol=dtset%prtvol
122 [ - + ]: 277 : if(prtvol==-level)then
123 [ # # # # ]: 0 : write(message,'(80a,a,a)') ('=',ii=1,80),ch10,' vtorho : enter '
124 : 0 : call wrtout(std_out,message,'COLL')
125 : : end if
126 : :
127 : 277 : n1=dtset%ngfft(1) ; n2=dtset%ngfft(2) ; n3=dtset%ngfft(3)
128 : 277 : me_fft=dtset%ngfft(11) ; nproc_fft=dtset%ngfft(10)
129 : 277 : iscf=dtset%iscf
130 : : !Debugging : print vtrial and rhor
131 [ - + ]: 277 : if(prtvol==-level)then
132 : 0 : write(message,'(a)') ' ir vtrial(ir) rhor(ir) '
133 : 0 : call wrtout(std_out,message,'COLL')
134 [ # # ]: 0 : do ir=1,nfft
135 : : ! if(ir<=11 .or. mod(ir,301)==0 )then
136 : 0 : i3=(ir-1)/n1/(n2/nproc_fft)
137 : 0 : i2=(ir-1-i3*n1*n2/nproc_fft)/n1
138 : 0 : i1=ir-1-i3*n1*n2/nproc_fft-(i2-me_fft)*n1
139 : 0 : write(message,'(i5,3i3,a,2d13.6)')ir,i1,i2,i3,' ',vtrial(ir,1),rhor(ir,1)
140 : 0 : call wrtout(std_out,message,'COLL')
141 [ # # ]: 0 : if(nspden>=2)then
142 : 0 : write(message,'(a,2d13.6)')' ',vtrial(ir,2),rhor(ir,2)
143 : 0 : call wrtout(std_out,message,'COLL')
144 : : end if
145 : : ! end if
146 : : end do
147 : : end if
148 : :
149 : 277 : ek=zero
150 : 277 : enlx=zero
151 [ + + ]: 26869 : grnl(:)=zero
152 : :
153 : : !Initialize rhor if needed
154 [ + - + + : 12255962 : if(iscf>0) rhor(:,:)=zero
+ + ]
155 : :
156 : : !call Thomas-Fermi for the density
157 : 277 : call tf
158 : : !Compute energy terms
159 : 277 : call tfek
160 : :
161 [ - + - + : 277 : call timab(21,2,tsec)
- + ]
162 : : !End thomas fermi
163 : :
164 : : contains
165 : : !!***
166 : :
167 : : !!****f* vtorhotf/tf
168 : : !! NAME
169 : : !! tf
170 : : !!
171 : : !! FUNCTION
172 : : !!
173 : : !! INPUTS
174 : : !!
175 : : !! OUTPUT
176 : : !!
177 : : !! SOURCE
178 : 277 : subroutine tf()
179 : :
180 : : ! *************************************************************************
181 : :
182 [ - + + - : 831 : ABI_MALLOC(rhor_mid,(nfft))
+ - + - -
+ - + -
+ ]
183 [ - + + - : 831 : ABI_MALLOC(rhor_middx,(nfft))
+ - + - -
+ - + -
+ ]
184 : 277 : fermie_tol=1.e-10_dp
185 : 277 : cktf=one/two/pi**2*(two*dtset%tphysel)**1.5_dp
186 : :
187 : : ! Should be made an input variable, if TF really needed for production
188 : : ! rtnewt=dtset%userra
189 : 277 : rtnewt=zero
190 : :
191 : : ! Newton Raphson
192 [ + + ]: 277 : if (lfirst_time_tf) then
193 : 4 : lfirst_time_tf=.false.
194 : : end if
195 : 277 : jdicho=0
196 : 277 : lnewtonraphson=.false.
197 [ + + ]: 4641 : do while (.not.lnewtonraphson)
198 : 2182 : jdicho=jdicho+1
199 : : ! do ifft=1,nfft
200 : : ! rhor_mid(ifft)=cktf*zfermi12((rtnewt-vtrial(ifft,1))/dtset%tphysel)
201 : : ! rhor_middx(ifft)=cktf*zfermim12((rtnewt-vtrial(ifft,1))/dtset%tphysel)
202 : : ! end do
203 : : call fm12a1t(cktf,rtnewt,dtset%tphysel,vtrial(:,1),rhor_middx,rhor_mid,&
204 : 2182 : & nfft)
205 [ + + ]: 97127446 : sum_rhor_mid=sum(rhor_mid(:))
206 [ + + ]: 97127446 : sum_rhor_middx=sum(rhor_middx(:))
207 : : call xmpi_sum(sum_rhor_mid,mpi_enreg%comm_fft ,ierr)
208 : : call xmpi_sum(sum_rhor_middx,mpi_enreg%comm_fft ,ierr)
209 : 2182 : nelect_mid=sum_rhor_mid*ucvol/(nfft*nproc_fft)-dtset%nelect
210 : 2182 : dnelect_mid_dx=sum_rhor_middx*ucvol/(nfft*nproc_fft)/dtset%tphysel/two
211 : 2182 : dxrtnewt=nelect_mid/dnelect_mid_dx
212 : 2182 : rtnewt=rtnewt-dxrtnewt
213 [ + + ]: 2182 : if (abs(nelect_mid) < fermie_tol/2._dp) then
214 : 277 : lnewtonraphson=.true.
215 : : end if
216 [ + - ]: 2459 : if (jdicho > jdichomax) then
217 : 0 : ABI_ERROR('NEWTON RAPHSON NOT CONVERGED')
218 : : end if
219 : : end do
220 : 277 : fermie=rtnewt
221 [ + + ]: 12255685 : rhor(:,1)=rhor_mid(:)
222 [ - + ]: 277 : ABI_FREE(rhor_mid)
223 [ - + ]: 277 : ABI_FREE(rhor_middx)
224 : :
225 : : ! DEBUG
226 : : ! write(std_out,*)'fmid,nmid,jdicho',fermie,nelect_mid,jdicho
227 : : ! ENDDEBUG
228 : :
229 : : ! Compute rhog
230 : 277 : call timab(70,1,tsec)
231 : :
232 : 277 : nfftot=dtset%ngfft(1)*dtset%ngfft(2)*dtset%ngfft(3)
233 : : call symrhg(1,gprimd,irrzon,mpi_enreg,nfft,nfftot,dtset%ngfft,nspden,nsppol,nsym,phnons,&
234 : 277 : & rhog,rhor,rprimd,dtset%symafm,dtset%symrel,dtset%tnons)
235 : :
236 : : ! We now have both rho(r) and rho(G), symmetrized, and if nsppol=2
237 : : ! we also have the spin-up density, symmetrized, in rhor(:,2).
238 : :
239 : 277 : call timab(70,2,tsec)
240 : :
241 : 277 : end subroutine tf
242 : : !!***
243 : :
244 : : !!****f* vtorhotf/tfek
245 : : !! NAME
246 : : !! tfek
247 : : !!
248 : : !! FUNCTION
249 : : !! This is the calculation of the kinetic energy for Thomas Fermi
250 : : !! Energy and free energy must be distinguished
251 : : !!
252 : : !! INPUTS
253 : : !!
254 : : !! OUTPUT
255 : : !!
256 : : !! SOURCE
257 : :
258 : 277 : subroutine tfek()
259 : :
260 : : ! *************************************************************************
261 : :
262 [ - + + - : 831 : ABI_MALLOC(betamumoinsV,(nfft))
+ - + - -
+ - + -
+ ]
263 : 277 : cktf=one/two/pi**2*(two*dtset%tphysel)**1.5_dp
264 : 277 : eektf=zero
265 : 277 : feektf=zero
266 [ + + ]: 12255685 : do ifft=1,nfft
267 : :
268 : : ! betamumoinsv(ifft)=ifermi12(rhor(ifft,1)/cktf)
269 : 12255408 : betamumoinsv(ifft)=(rtnewt-vtrial(ifft,1))/dtset%tphysel
270 : : ! eektemp=zfermi32(betamumoinsV(ifft))/zfermi12(betamumoinsV(ifft))
271 : 12255408 : eektemp=fp32a1(betamumoinsV(ifft))/rhor(ifft,1)*cktf
272 : 12255408 : feektemp=betamumoinsV(ifft)-two/three*eektemp
273 : 12255408 : feektf=feektf+feektemp*rhor(ifft,1)
274 : 12255685 : eektf=eektf+eektemp*rhor(ifft,1)
275 : : end do
276 : : ! Init mpi_comm
277 : 277 : call timab(48,1,tsec)
278 : : call xmpi_sum(eektf,mpi_enreg%comm_fft ,ierr)
279 : : call xmpi_sum(feektf,mpi_enreg%comm_fft ,ierr)
280 : 277 : call timab(48,2,tsec)
281 : 277 : eektf=eektf*dtset%tphysel
282 : 277 : eektf=eektf*ucvol/dble(nfft*nproc_fft)
283 : 277 : feektf=feektf*dtset%tphysel
284 : 277 : feektf=feektf*ucvol/dble(nfft*nproc_fft)
285 : : ! DEBUG
286 : : ! write(std_out,*)'eektf',eektf
287 : : ! stop ('vtorhotf')
288 : : ! ENDDEBUG
289 : 277 : ek=eektf
290 : 277 : entropy=(eektf-feektf)/dtset%tphysel
291 [ - + ]: 277 : ABI_FREE(betamumoinsV)
292 : 277 : end subroutine tfek
293 : : !!***
294 : :
295 : : !!****f* ABINIT/zfermim12
296 : : !! NAME
297 : : !! zfermim12
298 : : !!
299 : : !! FUNCTION
300 : : !!..file contains fermi-dirac integral routines:
301 : : !!..
302 : : !!..function zfermim12 does a rational function fit for the order -1/2 integral
303 : : !!..function zfermi12 does a rational function fit for the order 1/2 integral
304 : : !!..function zfermi1 does a rational function fit for the order 1 integral
305 : : !!..function zfermi32 does a rational function fit for the order 3/2 integral
306 : : !!..function zfermi2 does a rational function fit for the order 2 integral
307 : : !!..function zfermi52 does a rational function fit for the order 5/2 integral
308 : : !!..function zfermi3 does a rational function fit for the order 3 integral
309 : : !!..
310 : : !!..function ifermim12 is a rational function fit for the inverse of order -1/2
311 : : !!..function ifermi12 is a rational function fit for the inverse of order 1/2
312 : : !!..function ifermi32 is a rational function fit for the inverse of order 3/2
313 : : !!..function ifermi52 is a rational function fit for the inverse of order 5/2
314 : : !!
315 : : !!..this routine applies a rational function expansion to get the fermi-dirac
316 : : !!..integral of order -1/2 evaluated at x. maximum error is 1.23d-12.
317 : : !!..reference: antia apjs 84,101 1993
318 : : !!
319 : : !! INPUTS
320 : : !!
321 : : !! OUTPUT
322 : : !!
323 : : !! SOURCE
324 : :
325 : : function zfermim12(xx)
326 : :
327 : : !Arguments -------------------------------
328 : : real(dp), intent(in) :: xx
329 : : real(dp) :: zfermim12
330 : :
331 : : !Local variables-------------------------------
332 : : integer :: ii,m1,k1,m2,k2
333 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
334 : : !..load the coefficients of the expansion
335 : : data an,m1,k1,m2,k2 /-0.5e0_dp, 7, 7, 11, 11/
336 : : data (a1(ii),ii=1,8)/ 1.71446374704454e7_dp, 3.88148302324068e7_dp,&
337 : : & 3.16743385304962e7_dp, 1.14587609192151e7_dp,&
338 : : & 1.83696370756153E6_dp, 1.14980998186874e5_dp,&
339 : : & 1.98276889924768e3_dp, 1.0e0_dp/
340 : : data (b1(ii),ii=1,8)/ 9.67282587452899e6_dp, 2.87386436731785e7_dp,&
341 : : & 3.26070130734158e7_dp, 1.77657027846367e7_dp,&
342 : : & 4.81648022267831e6_dp, 6.13709569333207e5_dp,&
343 : : & 3.13595854332114e4_dp, 4.35061725080755e2_dp/
344 : : data (a2(ii),ii=1,12)/-4.46620341924942e-15_dp, -1.58654991146236e-12_dp,&
345 : : & -4.44467627042232e-10_dp, -6.84738791621745e-8_dp,&
346 : : & -6.64932238528105e-6_dp, -3.69976170193942e-4_dp,&
347 : : & -1.12295393687006e-2_dp, -1.60926102124442e-1_dp,&
348 : : & -8.52408612877447e-1_dp, -7.45519953763928e-1_dp,&
349 : : & 2.98435207466372e0_dp, 1.0e0_dp/
350 : : data (b2(ii),ii=1,12)/-2.23310170962369e-15_dp, -7.94193282071464e-13_dp,&
351 : : & -2.22564376956228e-10_dp, -3.43299431079845e-8_dp,&
352 : : & -3.33919612678907e-6_dp, -1.86432212187088e-4_dp,&
353 : : & -5.69764436880529e-3_dp, -8.34904593067194e-2_dp,&
354 : : & -4.78770844009440e-1_dp, -4.99759250374148e-1_dp,&
355 : : & 1.86795964993052e0_dp, 4.16485970495288e-1_dp/
356 : :
357 : : ! *************************************************************************
358 : :
359 : : if (xx .lt. 2.0e0_dp) then
360 : : xx1 = exp(xx)
361 : : rn = xx1 + a1(m1)
362 : : do ii=m1-1,1,-1
363 : : rn = rn*xx1 + a1(ii)
364 : : end do
365 : : den = b1(k1+1)
366 : : do ii=k1,1,-1
367 : : den = den*xx1 + b1(ii)
368 : : end do
369 : : zfermim12 = xx1 * rn/den
370 : : ! ..
371 : : else
372 : : xx1 = one/(xx*xx)
373 : : rn = xx1 + a2(m2)
374 : : do ii=m2-1,1,-1
375 : : rn = rn*xx1 + a2(ii)
376 : : end do
377 : : den = b2(k2+1)
378 : : do ii=k2,1,-1
379 : : den = den*xx1 + b2(ii)
380 : : end do
381 : : zfermim12 = sqrt(xx)*rn/den
382 : : end if
383 : :
384 : : end function zfermim12
385 : : !!***
386 : :
387 : : !!****f* ABINIT/zfermi12
388 : : !! NAME
389 : : !! zfermi12
390 : : !!
391 : : !! FUNCTION
392 : : !!
393 : : !! INPUTS
394 : : !!
395 : : !! OUTPUT
396 : : !!
397 : : !! SOURCE
398 : :
399 : : function zfermi12(xx)
400 : : !..
401 : : !..this routine applies a rational function expansion to get the fermi-dirac
402 : : !..integral of order 1/2 evaluated at x. maximum error is 5.47d-13.
403 : : !..reference: antia apjs 84,101 1993
404 : : !..
405 : : !..declare
406 : :
407 : : !Arguments -------------------------------
408 : : real(dp), intent(in) :: xx
409 : : real(dp):: zfermi12
410 : :
411 : : !Local variables-------------------------------
412 : : integer :: ii,m1,k1,m2,k2
413 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
414 : :
415 : : !..load the coefficients of the expansion
416 : : data an,m1,k1,m2,k2 /0.5e0_dp, 7, 7, 10, 11/
417 : : data (a1(ii),ii=1,8)/5.75834152995465e6_dp, 1.30964880355883e7_dp,&
418 : : & 1.07608632249013e7_dp, 3.93536421893014e6_dp,&
419 : : & 6.42493233715640e5_dp, 4.16031909245777e4_dp,&
420 : : & 7.77238678539648e2_dp, 1.0e0_dp/
421 : : data (b1(ii),ii=1,8)/6.49759261942269e6_dp, 1.70750501625775e7_dp,&
422 : : & 1.69288134856160e7_dp, 7.95192647756086e6_dp,&
423 : : & 1.83167424554505e6_dp, 1.95155948326832e5_dp,&
424 : : & 8.17922106644547e3_dp, 9.02129136642157e1_dp/
425 : : data (a2(ii),ii=1,11)/4.85378381173415e-14_dp, 1.64429113030738e-11_dp,&
426 : : & 3.76794942277806e-9_dp, 4.69233883900644e-7_dp,&
427 : : & 3.40679845803144e-5_dp, 1.32212995937796e-3_dp,&
428 : : & 2.60768398973913e-2_dp, 2.48653216266227e-1_dp,&
429 : : & 1.08037861921488e0_dp, 1.91247528779676e0_dp,&
430 : : & 1.0e0_dp/
431 : : data (b2(ii),ii=1,12)/7.28067571760518e-14_dp, 2.45745452167585e-11_dp,&
432 : : & 5.62152894375277e-9_dp, 6.96888634549649e-7_dp,&
433 : : & 5.02360015186394e-5_dp, 1.92040136756592e-3_dp,&
434 : : & 3.66887808002874e-2_dp, 3.24095226486468e-1_dp,&
435 : : & 1.16434871200131e0_dp, 1.34981244060549e0_dp,&
436 : : & 2.01311836975930e-1_dp, -2.14562434782759e-2_dp/
437 : :
438 : : ! *************************************************************************
439 : :
440 : : if (xx .lt. two) then
441 : : xx1 = exp(xx)
442 : : rn = xx1 + a1(m1)
443 : : do ii=m1-1,1,-1
444 : : rn = rn*xx1 + a1(ii)
445 : : end do
446 : : den = b1(k1+1)
447 : : do ii=k1,1,-1
448 : : den = den*xx1 + b1(ii)
449 : : end do
450 : : zfermi12 = xx1 * rn/den
451 : :
452 : : else
453 : : xx1 = one/(xx*xx)
454 : : rn = xx1 + a2(m2)
455 : : do ii=m2-1,1,-1
456 : : rn = rn*xx1 + a2(ii)
457 : : end do
458 : : den = b2(k2+1)
459 : : do ii=k2,1,-1
460 : : den = den*xx1 + b2(ii)
461 : : end do
462 : : zfermi12 = xx*sqrt(xx)*rn/den
463 : : end if
464 : :
465 : : end function zfermi12
466 : : !!***
467 : :
468 : : !!****f* ABINIT/zfermi1
469 : : !! NAME
470 : : !! zfermi1
471 : : !!
472 : : !! FUNCTION
473 : : !!
474 : : !! INPUTS
475 : : !!
476 : : !! OUTPUT
477 : : !!
478 : : !! SOURCE
479 : :
480 : : function zfermi1(xx)
481 : : !..
482 : : !..this routine applies a rational function expansion to get the fermi-dirac
483 : : !..integral of order 1 evaluated at x. maximum error is 1.0e-8.
484 : : !..reference: antia priv comm. 11sep94
485 : : !..
486 : : !..declare
487 : :
488 : : !Arguments -------------------------------
489 : : real(dp), intent(in) :: xx
490 : : real(dp):: zfermi1
491 : : !Local variables-------------------------------
492 : : integer :: ii,m1,k1,m2,k2
493 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
494 : :
495 : : !..load the coefficients of the expansion
496 : : data an,m1,k1,m2,k2 /1.0_dp, 7, 4, 9, 5/
497 : : data (a1(ii),ii=1,8)/-7.606458638543e7_dp, -1.143519707857e8_dp,&
498 : : & -5.167289383236e7_dp, -7.304766495775e6_dp,&
499 : : & -1.630563622280e5_dp, 3.145920924780e3_dp,&
500 : : & -7.156354090495e1_dp, 1.0_dp/
501 : : data (b1(ii),ii=1,5)/-7.606458639561e7_dp, -1.333681162517e8_dp,&
502 : : & -7.656332234147e7_dp, -1.638081306504e7_dp,&
503 : : & -1.044683266663e6_dp/
504 : : data (a2(ii),ii=1,10)/-3.493105157219e-7_dp, -5.628286279892e-5_dp,&
505 : : & -5.188757767899e-3_dp, -2.097205947730e-1_dp,&
506 : : & -3.353243201574_dp, -1.682094530855e1_dp,&
507 : : & -2.042542575231e1_dp, 3.551366939795_dp,&
508 : : & -2.400826804233_dp, 1.0_dp/
509 : : data (b2(ii),ii=1,6)/-6.986210315105e-7_dp, -1.102673536040e-4_dp,&
510 : : & -1.001475250797e-2_dp, -3.864923270059e-1_dp,&
511 : : & -5.435619477378_dp, -1.563274262745e1_dp/
512 : :
513 : : ! *************************************************************************
514 : :
515 : : if (xx .lt. 2.0_dp) then
516 : : xx1 = exp(xx)
517 : : rn = xx1 + a1(m1)
518 : : do ii=m1-1,1,-1
519 : : rn = rn*xx1 + a1(ii)
520 : : end do
521 : : den = b1(k1+1)
522 : : do ii=k1,1,-1
523 : : den = den*xx1 + b1(ii)
524 : : end do
525 : : zfermi1 = xx1 * rn/den
526 : :
527 : : else
528 : : xx1 = 1.0_dp/(xx*xx)
529 : : rn = xx1 + a2(m2)
530 : : do ii=m2-1,1,-1
531 : : rn = rn*xx1 + a2(ii)
532 : : end do
533 : : den = b2(k2+1)
534 : : do ii=k2,1,-1
535 : : den = den*xx1 + b2(ii)
536 : : end do
537 : : zfermi1 = xx*xx*rn/den
538 : : end if
539 : :
540 : : end function zfermi1
541 : : !!***
542 : :
543 : : !!****f* ABINIT/zfermi32
544 : : !! NAME
545 : : !! zfermi32
546 : : !!
547 : : !! FUNCTION
548 : : !! this routine applies a rational function expansion to get the fermi-dirac
549 : : !! integral of order 3/2 evaluated at x. maximum error is 5.07d-13.
550 : : !! reference: antia apjs 84,101 1993
551 : : !!
552 : : !! INPUTS
553 : : !!
554 : : !! OUTPUT
555 : : !!
556 : : !! SOURCE
557 : :
558 : : function zfermi32(xx)
559 : :
560 : : !Arguments -------------------------------
561 : : real(dp), intent(in) :: xx
562 : : real(dp) :: zfermi32
563 : :
564 : : !Local variables-------------------------------
565 : : integer :: ii,m1,k1,m2,k2
566 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
567 : :
568 : : !..load the coefficients of the expansion
569 : : data an,m1,k1,m2,k2 /1.5e0_dp, 6, 7, 9, 10/
570 : : data (a1(ii),ii=1,7)/4.32326386604283e4_dp, 8.55472308218786e4_dp,&
571 : : & 5.95275291210962e4_dp, 1.77294861572005e4_dp,&
572 : : & 2.21876607796460e3_dp, 9.90562948053193e1_dp,&
573 : : & 1.0e0_dp/
574 : : data (b1(ii),ii=1,8)/3.25218725353467e4_dp, 7.01022511904373e4_dp,&
575 : : & 5.50859144223638e4_dp, 1.95942074576400e4_dp,&
576 : : & 3.20803912586318e3_dp, 2.20853967067789e2_dp,&
577 : : & 5.05580641737527e0_dp, 1.99507945223266e-2_dp/
578 : : data (a2(ii),ii=1,10)/2.80452693148553e-13_dp, 8.60096863656367e-11_dp,&
579 : : & 1.62974620742993e-8_dp, 1.63598843752050e-6_dp,&
580 : : & 9.12915407846722e-5_dp, 2.62988766922117e-3_dp,&
581 : : & 3.85682997219346e-2_dp, 2.78383256609605e-1_dp,&
582 : : & 9.02250179334496e-1_dp, 1.0e0_dp/
583 : : data (b2(ii),ii=1,11)/7.01131732871184e-13_dp, 2.10699282897576e-10_dp,&
584 : : & 3.94452010378723e-8_dp, 3.84703231868724e-6_dp,&
585 : : & 2.04569943213216e-4_dp, 5.31999109566385e-3_dp,&
586 : : & 6.39899717779153e-2_dp, 3.14236143831882e-1_dp,&
587 : : & 4.70252591891375e-1_dp, -2.15540156936373e-2_dp,&
588 : : & 2.34829436438087e-3_dp/
589 : :
590 : : ! *************************************************************************
591 : :
592 : : if (xx .lt. 2.0e0_dp) then
593 : : xx1 = exp(xx)
594 : : rn = xx1 + a1(m1)
595 : : do ii=m1-1,1,-1
596 : : rn = rn*xx1 + a1(ii)
597 : : end do
598 : : den = b1(k1+1)
599 : : do ii=k1,1,-1
600 : : den = den*xx1 + b1(ii)
601 : : end do
602 : : zfermi32 = xx1 * rn/den
603 : :
604 : : else
605 : : xx1 = one/(xx*xx)
606 : : rn = xx1 + a2(m2)
607 : : do ii=m2-1,1,-1
608 : : rn = rn*xx1 + a2(ii)
609 : : end do
610 : : den = b2(k2+1)
611 : : do ii=k2,1,-1
612 : : den = den*xx1 + b2(ii)
613 : : end do
614 : : zfermi32 = xx*xx*sqrt(xx)*rn/den
615 : : end if
616 : :
617 : : end function zfermi32
618 : : !!***
619 : :
620 : : !!****f* ABINIT/zfermi2
621 : : !! NAME
622 : : !! zfermi2
623 : : !!
624 : : !! FUNCTION
625 : : !!
626 : : !! this routine applies a rational function expansion to get the fermi-dirac
627 : : !! integral of order 2 evaluated at x. maximum error is 1.0e-8.
628 : : !! reference: antia priv comm. 11sep94
629 : : !!
630 : : !! INPUTS
631 : : !!
632 : : !! OUTPUT
633 : : !!
634 : : !! SOURCE
635 : :
636 : : function zfermi2(xx)
637 : :
638 : : !Arguments -------------------------------
639 : : real(dp), intent(in) :: xx
640 : : real(dp) :: zfermi2
641 : : !Local variables-------------------------------
642 : : integer :: ii,m1,k1,m2,k2
643 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
644 : :
645 : : !..load the coefficients of the expansion
646 : : data an,m1,k1,m2,k2 /2.0_dp, 7, 4, 5, 9/
647 : : data (a1(ii),ii=1,8)/-1.434885992395e8_dp, -2.001711155617e8_dp,&
648 : : & -8.507067153428e7_dp, -1.175118281976e7_dp,&
649 : : & -3.145120854293e5_dp, 4.275771034579e3_dp,&
650 : : & -8.069902926891e1_dp, 1.0e0_dp/
651 : : data (b1(ii),ii=1,5)/-7.174429962316e7_dp, -1.090535948744e8_dp,&
652 : : & -5.350984486022e7_dp, -9.646265123816e6_dp,&
653 : : & -5.113415562845e5_dp/
654 : : data (a2(ii),ii=1,6)/ 6.919705180051e-8_dp, 1.134026972699e-5_dp,&
655 : : & 7.967092675369e-4_dp, 2.432500578301e-2_dp,&
656 : : & 2.784751844942e-1_dp, 1.0e0_dp/
657 : : data (b2(ii),ii=1,10)/ 2.075911553728e-7_dp, 3.197196691324e-5_dp,&
658 : : & 2.074576609543e-3_dp, 5.250009686722e-2_dp,&
659 : : & 3.171705130118e-1_dp, -1.147237720706e-1_dp,&
660 : : & 6.638430718056e-2_dp, -1.356814647640e-2_dp,&
661 : : & -3.648576227388e-2_dp, 3.621098757460e-2_dp/
662 : :
663 : : ! *************************************************************************
664 : :
665 : : if (xx .lt. 2.0e0_dp) then
666 : : xx1 = exp(xx)
667 : : rn = xx1 + a1(m1)
668 : : do ii=m1-1,1,-1
669 : : rn = rn*xx1 + a1(ii)
670 : : end do
671 : : den = b1(k1+1)
672 : : do ii=k1,1,-1
673 : : den = den*xx1 + b1(ii)
674 : : end do
675 : : zfermi2 = xx1 * rn/den
676 : :
677 : : else
678 : : xx1 = one/(xx*xx)
679 : : rn = xx1 + a2(m2)
680 : : do ii=m2-1,1,-1
681 : : rn = rn*xx1 + a2(ii)
682 : : end do
683 : : den = b2(k2+1)
684 : : do ii=k2,1,-1
685 : : den = den*xx1 + b2(ii)
686 : : end do
687 : : zfermi2 = xx*xx*xx*rn/den
688 : : end if
689 : :
690 : : end function zfermi2
691 : : !!***
692 : :
693 : : !!****f* ABINIT/zfermi52
694 : : !! NAME
695 : : !! zfermi52
696 : : !!
697 : : !! FUNCTION
698 : : !! this routine applies a rational function expansion to get the fermi-dirac
699 : : !! integral of order 5/2 evaluated at x. maximum error is 2.47d-13.
700 : : !! reference: antia apjs 84,101 1993
701 : : !!
702 : : !! INPUTS
703 : : !!
704 : : !! OUTPUT
705 : : !!
706 : : !! SOURCE
707 : :
708 : : function zfermi52(xx)
709 : :
710 : : !Arguments -------------------------------
711 : : real(dp), intent(in) :: xx
712 : : real(dp) :: zfermi52
713 : :
714 : : !Local variables-------------------------------
715 : : integer :: ii,m1,k1,m2,k2
716 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
717 : :
718 : : !..load the coefficients of the expansion
719 : : data an,m1,k1,m2,k2 /2.5e0_dp, 6, 7, 10, 9/
720 : : data (a1(ii),ii=1,7)/6.61606300631656e4_dp, 1.20132462801652e5_dp,&
721 : : & 7.67255995316812e4_dp, 2.10427138842443e4_dp,&
722 : : & 2.44325236813275e3_dp, 1.02589947781696e2_dp,&
723 : : & 1.0e0_dp/
724 : : data (b1(ii),ii=1,8)/1.99078071053871e4_dp, 3.79076097261066e4_dp,&
725 : : & 2.60117136841197e4_dp, 7.97584657659364e3_dp,&
726 : : & 1.10886130159658e3_dp, 6.35483623268093e1_dp,&
727 : : & 1.16951072617142e0_dp, 3.31482978240026e-3_dp/
728 : : data (a2(ii),ii=1,11)/8.42667076131315e-12_dp, 2.31618876821567e-9_dp,&
729 : : & 3.54323824923987e-7_dp, 2.77981736000034e-5_dp,&
730 : : & 1.14008027400645e-3_dp, 2.32779790773633e-2_dp,&
731 : : & 2.39564845938301e-1_dp, 1.24415366126179e0_dp,&
732 : : & 3.18831203950106e0_dp, 3.42040216997894e0_dp,&
733 : : & 1.0e0_dp/
734 : : data (b2(ii),ii=1,10)/2.94933476646033e-11_dp, 7.68215783076936e-9_dp,&
735 : : & 1.12919616415947e-6_dp, 8.09451165406274e-5_dp,&
736 : : & 2.81111224925648e-3_dp, 3.99937801931919e-2_dp,&
737 : : & 2.27132567866839e-1_dp, 5.31886045222680e-1_dp,&
738 : : & 3.70866321410385e-1_dp, 2.27326643192516e-2_dp/
739 : :
740 : : ! *************************************************************************
741 : :
742 : : if (xx .lt. two) then
743 : : xx1 = exp(xx)
744 : : rn = xx1 + a1(m1)
745 : : do ii=m1-1,1,-1
746 : : rn = rn*xx1 + a1(ii)
747 : : end do
748 : : den = b1(k1+1)
749 : : do ii=k1,1,-1
750 : : den = den*xx1 + b1(ii)
751 : : end do
752 : : zfermi52 = xx1 * rn/den
753 : :
754 : : else
755 : : xx1 = one/(xx*xx)
756 : : rn = xx1 + a2(m2)
757 : : do ii=m2-1,1,-1
758 : : rn = rn*xx1 + a2(ii)
759 : : end do
760 : : den = b2(k2+1)
761 : : do ii=k2,1,-1
762 : : den = den*xx1 + b2(ii)
763 : : end do
764 : : zfermi52 = xx*xx*xx*sqrt(xx)*rn/den
765 : : end if
766 : :
767 : : end function zfermi52
768 : : !!***
769 : :
770 : : !!****f* ABINIT/zfermi3
771 : : !! NAME
772 : : !! zfermi3
773 : : !!
774 : : !! FUNCTION
775 : : !! this routine applies a rational function expansion to get the fermi-dirac
776 : : !! integral of order 3 evaluated at x. maximum error is 1.0e-8.
777 : : !! reference: antia priv comm. 11sep94
778 : : !!
779 : : !! INPUTS
780 : : !!
781 : : !! OUTPUT
782 : : !!
783 : : !! SOURCE
784 : :
785 : : function zfermi3(xx)
786 : :
787 : : !Arguments -------------------------------
788 : : real(dp), intent(in) :: xx
789 : : real(dp):: zfermi3
790 : :
791 : : !Local variables-------------------------------
792 : : integer :: ii,m1,k1,m2,k2
793 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
794 : :
795 : : !..load the coefficients of the expansion
796 : : data an,m1,k1,m2,k2 /3.0, 4, 6, 7, 7/
797 : : data (a1(ii),ii=1,5)/ 6.317036716422e2_dp, 7.514163924637e2_dp,&
798 : : & 2.711961035750e2_dp, 3.274540902317e1_dp,&
799 : : & 1.0_dp/
800 : : data (b1(ii),ii=1,7)/ 1.052839452797e2_dp, 1.318163114785e2_dp,&
801 : : & 5.213807524405e1_dp, 7.500064111991_dp,&
802 : : & 3.383020205492e-1_dp, 2.342176749453e-3_dp,&
803 : : & -8.445226098359e-6_dp/
804 : : data (a2(ii),ii=1,8)/ 1.360999428425e-8_dp, 1.651419468084e-6_dp,&
805 : : & 1.021455604288e-4_dp, 3.041270709839e-3_dp,&
806 : : & 4.584298418374e-2_dp, 3.440523212512e-1_dp,&
807 : : & 1.077505444383_dp, 1.0_dp/
808 : : data (b2(ii),ii=1,8)/ 5.443997714076e-8_dp, 5.531075760054e-6_dp,&
809 : : & 2.969285281294e-4_dp, 6.052488134435e-3_dp,&
810 : : & 5.041144894964e-2_dp, 1.048282487684e-1_dp,&
811 : : & 1.280969214096e-2_dp, -2.851555446444e-3_dp/
812 : :
813 : : ! *************************************************************************
814 : :
815 : : if (xx .lt. two) then
816 : : xx1 = exp(xx)
817 : : rn = xx1 + a1(m1)
818 : : do ii=m1-1,1,-1
819 : : rn = rn*xx1 + a1(ii)
820 : : end do
821 : : den = b1(k1+1)
822 : : do ii=k1,1,-1
823 : : den = den*xx1 + b1(ii)
824 : : end do
825 : : zfermi3 = xx1 * rn/den
826 : :
827 : : else
828 : : xx1 = one/(xx*xx)
829 : : rn = xx1 + a2(m2)
830 : : do ii=m2-1,1,-1
831 : : rn = rn*xx1 + a2(ii)
832 : : end do
833 : : den = b2(k2+1)
834 : : do ii=k2,1,-1
835 : : den = den*xx1 + b2(ii)
836 : : end do
837 : : zfermi3 = xx*xx*xx*xx*rn/den
838 : : end if
839 : :
840 : : end function zfermi3
841 : : !!***
842 : :
843 : : !!****f* ABINIT/ifermim12
844 : : !! NAME
845 : : !! ifermim12
846 : : !!
847 : : !! FUNCTION
848 : : !! this routine applies a rational function expansion to get the inverse
849 : : !! fermi-dirac integral of order -1/2 when it is equal to f.
850 : : !! maximum error is 3.03d-9. reference: antia apjs 84,101 1993
851 : : !!
852 : : !! INPUTS
853 : : !!
854 : : !! OUTPUT
855 : : !!
856 : : !! SOURCE
857 : :
858 : : function ifermim12(ff)
859 : :
860 : : !Arguments -------------------------------
861 : : real(dp), intent(in) :: ff
862 : : real(dp) :: ifermim12
863 : : !Local variables-------------------------------
864 : : integer :: ii,m1,k1,m2,k2
865 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
866 : :
867 : : !..load the coefficients of the expansion
868 : : data an,m1,k1,m2,k2 /-0.5e0_dp, 5, 6, 6, 6/
869 : : data (a1(ii),ii=1,6)/-1.570044577033e4_dp, 1.001958278442e4_dp,&
870 : : & -2.805343454951e3_dp, 4.121170498099e2_dp,&
871 : : & -3.174780572961e1_dp, 1.0e0_dp/
872 : : data (b1(ii),ii=1,7)/-2.782831558471e4_dp, 2.886114034012e4_dp,&
873 : : & -1.274243093149e4_dp, 3.063252215963e3_dp,&
874 : : & -4.225615045074e2_dp, 3.168918168284e1_dp,&
875 : : & -1.008561571363e0_dp/
876 : : data (a2(ii),ii=1,7)/ 2.206779160034e-8_dp, -1.437701234283e-6_dp,&
877 : : & 6.103116850636e-5_dp, -1.169411057416e-3_dp,&
878 : : & 1.814141021608e-2_dp, -9.588603457639e-2_dp,&
879 : : & 1.0e0_dp/
880 : : data (b2(ii),ii=1,7)/ 8.827116613576e-8_dp, -5.750804196059e-6_dp,&
881 : : & 2.429627688357e-4_dp, -4.601959491394e-3_dp,&
882 : : & 6.932122275919e-2_dp, -3.217372489776e-1_dp,&
883 : : & 3.124344749296e0_dp/
884 : :
885 : : ! *************************************************************************
886 : :
887 : : if (ff .lt. 4.0e0_dp) then
888 : : rn = ff + a1(m1)
889 : : do ii=m1-1,1,-1
890 : : rn = rn*ff + a1(ii)
891 : : end do
892 : : den = b1(k1+1)
893 : : do ii=k1,1,-1
894 : : den = den*ff + b1(ii)
895 : : end do
896 : : ifermim12 = log(ff * rn/den)
897 : :
898 : : else
899 : : ff1 = one/ff**(one/(one + an))
900 : : rn = ff1 + a2(m2)
901 : : do ii=m2-1,1,-1
902 : : rn = rn*ff1 + a2(ii)
903 : : end do
904 : : den = b2(k2+1)
905 : : do ii=k2,1,-1
906 : : den = den*ff1 + b2(ii)
907 : : end do
908 : : ifermim12 = rn/(den*ff1)
909 : : end if
910 : :
911 : : end function ifermim12
912 : : !!***
913 : :
914 : : !!****f* ABINIT/ifermi12
915 : : !! NAME
916 : : !! ifermi12
917 : : !!
918 : : !! FUNCTION
919 : : !! this routine applies a rational function expansion to get the inverse
920 : : !! fermi-dirac integral of order 1/2 when it is equal to f.
921 : : !! maximum error is 4.19d-9. reference: antia apjs 84,101 1993
922 : : !!
923 : : !! INPUTS
924 : : !!
925 : : !! OUTPUT
926 : : !!
927 : : !! SOURCE
928 : :
929 : : function ifermi12(ff)
930 : :
931 : : !Arguments -------------------------------
932 : : real(dp), intent(in) :: ff
933 : : real(dp) :: ifermi12
934 : : !Local variables-------------------------------
935 : : integer :: ii,m1,k1,m2,k2
936 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
937 : :
938 : : !..load the coefficients of the expansion
939 : : data an,m1,k1,m2,k2 /0.5e0_dp, 4, 3, 6, 5/
940 : : data (a1(ii),ii=1,5)/ 1.999266880833e4_dp, 5.702479099336e3_dp,&
941 : : & 6.610132843877e2_dp, 3.818838129486e1_dp,&
942 : : & 1.0e0_dp/
943 : : data (b1(ii),ii=1,4)/ 1.771804140488e4_dp, -2.014785161019e3_dp,&
944 : : & 9.130355392717e1_dp, -1.670718177489e0_dp/
945 : : data (a2(ii),ii=1,7)/-1.277060388085e-2_dp, 7.187946804945e-2_dp,&
946 : : & -4.262314235106e-1_dp, 4.997559426872e-1_dp,&
947 : : & -1.285579118012e0_dp, -3.930805454272e-1_dp,&
948 : : & 1.0e0_dp/
949 : : data (b2(ii),ii=1,6)/-9.745794806288e-3_dp, 5.485432756838e-2_dp,&
950 : : & -3.299466243260e-1_dp, 4.077841975923e-1_dp,&
951 : : & -1.145531476975e0_dp, -6.067091689181e-2_dp/
952 : :
953 : : ! *************************************************************************
954 : :
955 : : if (ff .lt. 4.0e0_dp) then
956 : : rn = ff + a1(m1)
957 : : do ii=m1-1,1,-1
958 : : rn = rn*ff + a1(ii)
959 : : end do
960 : : den = b1(k1+1)
961 : : do ii=k1,1,-1
962 : : den = den*ff + b1(ii)
963 : : end do
964 : : ifermi12 = log(ff * rn/den)
965 : :
966 : : else
967 : : ff1 = one/ff**(one/(one + an))
968 : : rn = ff1 + a2(m2)
969 : : do ii=m2-1,1,-1
970 : : rn = rn*ff1 + a2(ii)
971 : : end do
972 : : den = b2(k2+1)
973 : : do ii=k2,1,-1
974 : : den = den*ff1 + b2(ii)
975 : : end do
976 : : ifermi12 = rn/(den*ff1)
977 : : end if
978 : :
979 : : end function ifermi12
980 : : !!***
981 : :
982 : : !!****f* ABINIT/ifermi32
983 : : !! NAME
984 : : !! ifermi32
985 : : !!
986 : : !! FUNCTION
987 : : !! this routine applies a rational function expansion to get the inverse
988 : : !! fermi-dirac integral of order 3/2 when it is equal to f.
989 : : !! maximum error is 2.26d-9. reference: antia apjs 84,101 1993
990 : : !!
991 : : !! INPUTS
992 : : !!
993 : : !! OUTPUT
994 : : !!
995 : : !! SOURCE
996 : :
997 : : function ifermi32(ff)
998 : :
999 : : !Arguments -------------------------------
1000 : : real(dp), intent(in) :: ff
1001 : : real(dp) :: ifermi32
1002 : : !Local variables-------------------------------
1003 : : integer :: ii,m1,k1,m2,k2
1004 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
1005 : :
1006 : : !..load the coefficients of the expansion
1007 : : data an,m1,k1,m2,k2 /1.5e0_dp, 3, 4, 6, 5/
1008 : : data (a1(ii),ii=1,4)/ 1.715627994191e2_dp, 1.125926232897e2_dp,&
1009 : : & 2.056296753055e1_dp, 1.0e0_dp/
1010 : : data (b1(ii),ii=1,5)/ 2.280653583157e2_dp, 1.193456203021e2_dp,&
1011 : : & 1.167743113540e1_dp, -3.226808804038e-1_dp,&
1012 : : & 3.519268762788e-3_dp/
1013 : : data (a2(ii),ii=1,7)/-6.321828169799e-3_dp, -2.183147266896e-2_dp,&
1014 : : & -1.057562799320e-1_dp, -4.657944387545e-1_dp,&
1015 : : & -5.951932864088e-1_dp, 3.684471177100e-1_dp,&
1016 : : & 1.0e0_dp/
1017 : : data (b2(ii),ii=1,6)/-4.381942605018e-3_dp, -1.513236504100e-2_dp,&
1018 : : & -7.850001283886e-2_dp, -3.407561772612e-1_dp,&
1019 : : & -5.074812565486e-1_dp, -1.387107009074e-1_dp/
1020 : :
1021 : : ! *************************************************************************
1022 : :
1023 : : if (ff .lt. 4.0e0_dp) then
1024 : : rn = ff + a1(m1)
1025 : : do ii=m1-1,1,-1
1026 : : rn = rn*ff + a1(ii)
1027 : : end do
1028 : : den = b1(k1+1)
1029 : : do ii=k1,1,-1
1030 : : den = den*ff + b1(ii)
1031 : : end do
1032 : : ifermi32 = log(ff * rn/den)
1033 : :
1034 : : else
1035 : : ff1 = one/ff**(one/(one + an))
1036 : : rn = ff1 + a2(m2)
1037 : : do ii=m2-1,1,-1
1038 : : rn = rn*ff1 + a2(ii)
1039 : : end do
1040 : : den = b2(k2+1)
1041 : : do ii=k2,1,-1
1042 : : den = den*ff1 + b2(ii)
1043 : : end do
1044 : : ifermi32 = rn/(den*ff1)
1045 : : end if
1046 : :
1047 : : end function ifermi32
1048 : : !!***
1049 : :
1050 : : !!****f* ABINIT/ifermi52
1051 : : !! NAME
1052 : : !! ifermi52
1053 : : !!
1054 : : !! FUNCTION
1055 : : !! this routine applies a rational function expansion to get the inverse
1056 : : !! fermi-dirac integral of order 5/2 when it is equal to f.
1057 : : !! maximum error is 6.17d-9. reference: antia apjs 84,101 1993
1058 : : !!
1059 : : !! INPUTS
1060 : : !!
1061 : : !! OUTPUT
1062 : : !!
1063 : : !! SOURCE
1064 : :
1065 : : function ifermi52(ff)
1066 : :
1067 : : !Arguments -------------------------------
1068 : : real(dp), intent(in) :: ff
1069 : : real(dp) :: ifermi52
1070 : :
1071 : : !Local variables-------------------------------
1072 : : integer :: ii,m1,k1,m2,k2
1073 : : real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
1074 : :
1075 : : !..load the coefficients of the expansion
1076 : : data an,m1,k1,m2,k2 /2.5e0_dp, 2, 3, 6, 6/
1077 : : data (a1(ii),ii=1,3)/ 2.138969250409e2_dp, 3.539903493971e1_dp,&
1078 : : & 1.0e0_dp/
1079 : : data (b1(ii),ii=1,4)/ 7.108545512710e2_dp, 9.873746988121e1_dp,&
1080 : : & 1.067755522895e0_dp, -1.182798726503e-2_dp/
1081 : : data (a2(ii),ii=1,7)/-3.312041011227e-2_dp, 1.315763372315e-1_dp,&
1082 : : & -4.820942898296e-1_dp, 5.099038074944e-1_dp,&
1083 : : & 5.495613498630e-1_dp, -1.498867562255e0_dp,&
1084 : : & 1.0e0_dp/
1085 : : data (b2(ii),ii=1,7)/-2.315515517515e-2_dp, 9.198776585252e-2_dp,&
1086 : : & -3.835879295548e-1_dp, 5.415026856351e-1_dp,&
1087 : : & -3.847241692193e-1_dp, 3.739781456585e-2_dp,&
1088 : : & -3.008504449098e-2_dp/
1089 : :
1090 : : ! *************************************************************************
1091 : :
1092 : : if (ff .lt. 4.0e0_dp) then
1093 : : rn = ff + a1(m1)
1094 : : do ii=m1-1,1,-1
1095 : : rn = rn*ff + a1(ii)
1096 : : end do
1097 : : den = b1(k1+1)
1098 : : do ii=k1,1,-1
1099 : : den = den*ff + b1(ii)
1100 : : end do
1101 : : ifermi52 = log(ff * rn/den)
1102 : :
1103 : : else
1104 : : ff1 = one/ff**(one/(one + an))
1105 : : rn = ff1 + a2(m2)
1106 : : do ii=m2-1,1,-1
1107 : : rn = rn*ff1 + a2(ii)
1108 : : end do
1109 : : den = b2(k2+1)
1110 : : do ii=k2,1,-1
1111 : : den = den*ff1 + b2(ii)
1112 : : end do
1113 : : ifermi52 = rn/(den*ff1)
1114 : : end if
1115 : :
1116 : : end function ifermi52
1117 : : !!***
1118 : :
1119 : : !!****f* ABINIT/fp12a1
1120 : : !! NAME
1121 : : !! fp12a1
1122 : : !!
1123 : : !! FUNCTION
1124 : : !!
1125 : : !! INPUTS
1126 : : !!
1127 : : !! OUTPUT
1128 : : !!
1129 : : !! SOURCE
1130 : :
1131 : : function fp12a1 (x)
1132 : :
1133 : : ! Arguments -------------------------------
1134 : : real(dp),intent(in) :: x
1135 : : real(dp) :: fp12a1
1136 : :
1137 : : real(dp) :: y
1138 : :
1139 : : !**********************************************************************
1140 : : !* *
1141 : : !* Integrale de Fermi d'ordre 1/2 *
1142 : : !* Fp12(x) = somme de 0 a l'infini de (dt*t**1/2)/(1+exp(t-x)) *
1143 : : !* *
1144 : : !**********************************************************************
1145 : : !
1146 : : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
1147 : : !Erreur relative maximum annoncee 5.54 e-5
1148 : : !Erreur relative maximum constatee : -5.53e-5 pour eta = 2
1149 : : !
1150 : : if (x.lt.2._dp) then
1151 : : y=exp(x)
1152 : : fp12a1=y*(21.8168_dp+y*(13.1693_dp+y))&
1153 : : & /(24.6180_dp+y*(23.5546_dp+y*(4.76290_dp+y*0.134481_dp)))
1154 : : else
1155 : : y=one/(x*x)
1156 : : fp12a1=x*sqrt(x)*(0.0473011_dp+y*(0.548433_dp+y))&
1157 : : & /(0.0709478_dp+y*(0.737041_dp+y*0.382065_dp))
1158 : : end if
1159 : : !
1160 : : !**********************************************************************
1161 : : end function fp12a1
1162 : : !!***
1163 : :
1164 : : !!****f* ABINIT/fp32a1
1165 : : !! NAME
1166 : : !! fp32a1
1167 : : !!
1168 : : !! FUNCTION
1169 : : !!
1170 : : !! INPUTS
1171 : : !!
1172 : : !! OUTPUT
1173 : : !!
1174 : : !! SOURCE
1175 : :
1176 : 12255408 : function fp32a1 (x)
1177 : :
1178 : : !Arguments -------------------------------
1179 : : real(dp),intent(in) :: x
1180 : : real(dp) :: fp32a1
1181 : :
1182 : : real(dp) :: y,x2
1183 : :
1184 : : !
1185 : : !**********************************************************************
1186 : : !* *
1187 : : !* Integrale de Fermi d'ordre 3/2 *
1188 : : !* Fp32(x) = somme de 0 a l'infini de (dt*t**3/2)/(1+exp(t-x)) *
1189 : : !* *
1190 : : !**********************************************************************
1191 : : !
1192 : : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
1193 : : !Erreur relative maximum annoncee 6.54 e-5
1194 : : !Erreur relative maximum constatee : -5.84e-5 pour eta = -5
1195 : : !
1196 [ - + ]: 12255408 : if (x.lt.two) then
1197 : 0 : y=exp(x)
1198 : 0 : fp32a1=y*(135.863_dp+y*(49.2764_dp+y))/(102.210_dp+y*(55.0312_dp+y*4.23365_dp))
1199 : : else
1200 : 12255408 : x2=x*x
1201 : 12255408 : y=1._dp/x2
1202 : : fp32a1=x2*sqrt(x)*(0.154699_dp+y*(1.20037_dp+y))&
1203 : 12255408 : & /(0.386765_dp+y*(0.608119_dp-y*0.165665_dp))
1204 : : end if
1205 : : !
1206 : : !**********************************************************************
1207 : 12255408 : end function fp32a1
1208 : : !!***
1209 : :
1210 : : !!****f* ABINIT/xp12a1
1211 : : !! NAME
1212 : : !! xp12a1
1213 : : !!
1214 : : !! FUNCTION
1215 : : !!
1216 : : !! INPUTS
1217 : : !!
1218 : : !! OUTPUT
1219 : : !!
1220 : : !! SOURCE
1221 : :
1222 : : function xp12a1 (y)
1223 : :
1224 : : !Arguments -------------------------------
1225 : : real(dp) :: xp12a1
1226 : : real(dp),intent(in) :: y
1227 : :
1228 : : real(dp),parameter :: deux=2._dp,deuxs3=deux/3._dp
1229 : : real(dp) :: top,den,z
1230 : :
1231 : : !
1232 : : !**********************************************************************
1233 : : !* *
1234 : : !* Calcul de eta tel que fp12 (eta) = y *
1235 : : !* ou fp12 est l'integrale de Fermi d'ordre +1/2 *
1236 : : !* *
1237 : : !**********************************************************************
1238 : : !
1239 : : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
1240 : : !Erreur relative maximum annoncee sur exp(eta) : 3.02 e-5
1241 : : !
1242 : : if (y.lt.4._dp) then
1243 : : top=44.593646_dp+y*(11.288764_dp+y)
1244 : : den=39.519346_dp+y*(-5.7517464_dp+y*0.26594291_dp)
1245 : : xp12a1=log(y*top/den)
1246 : : else
1247 : : z=y**(-deuxs3)
1248 : : top=34.873722_dp+z*(-26.922515_dp+z)
1249 : : den=26.612832_dp+z*(-20.452930_dp+z*11.808945_dp)
1250 : : xp12a1=top/(z*den)
1251 : : end if
1252 : : !
1253 : : !**********************************************************************
1254 : : end function xp12a1
1255 : : !!***
1256 : :
1257 : : !!****f* ABINIT/fm12a1
1258 : : !! NAME
1259 : : !! fm12a1
1260 : : !!
1261 : : !! FUNCTION
1262 : : !!
1263 : : !! INPUTS
1264 : : !!
1265 : : !! OUTPUT
1266 : : !!
1267 : : !! SOURCE
1268 : :
1269 : : function fm12a1 (x)
1270 : :
1271 : : !Arguments -------------------------------
1272 : : real(dp),intent(in) :: x
1273 : : real(dp) :: fm12a1
1274 : :
1275 : : real(dp) :: y
1276 : :
1277 : : !
1278 : : !**********************************************************************
1279 : : !* *
1280 : : !* Integrale de Fermi d'ordre -1/2 *
1281 : : !* Fm12(x) = somme de 0 a l'infini de (dt*t**-1/2)/(1+exp(t-x)) *
1282 : : !* *
1283 : : !**********************************************************************
1284 : : !
1285 : : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
1286 : : !Erreur relative maximum annoncee 4.75 e-5
1287 : : !
1288 : : if (x.lt.2._dp) then
1289 : : y=exp(x)
1290 : : fm12a1=y*(23.1456_dp+y*(13.7820_dp+y))&
1291 : : & /(13.0586_dp+y*(17.0048_dp+y*(5.07527_dp+y*0.236620_dp)))
1292 : : else
1293 : : y=1./(x*x)
1294 : : fm12a1=sqrt(x)*(0.0153602_dp+y*(0.146815_dp+y))&
1295 : : & /(0.00768015_dp+y*(0.0763700_dp+y*0.570485_dp))
1296 : : end if
1297 : : !
1298 : : !**********************************************************************
1299 : : end function fm12a1
1300 : : !!***
1301 : :
1302 : : !!****f* ABINIT/fm12a1t
1303 : : !! NAME
1304 : : !! fm12a1t
1305 : : !!
1306 : : !! FUNCTION
1307 : : !!
1308 : : !! INPUTS
1309 : : !!
1310 : : !! OUTPUT
1311 : : !!
1312 : : !! SOURCE
1313 : :
1314 : 2182 : subroutine fm12a1t (cktf,rtnewt,tphysel,vtrial,rhor_middx,rhor_mid,nfft)
1315 : :
1316 : : integer,intent(in) :: nfft
1317 : : real(dp),intent(in) :: tphysel,rtnewt,cktf
1318 : : real(dp),intent(in) :: vtrial(nfft)
1319 : : real(dp),intent(out) :: rhor_middx(nfft),rhor_mid(nfft)
1320 : :
1321 : : !intrinsic exp,sqrt
1322 : : integer :: ifft
1323 : : real(dp) :: x,y,sqrtx
1324 : :
1325 : : !
1326 : : !**********************************************************************
1327 : : !* *
1328 : : !* Integrale de Fermi d'ordre -1/2 *
1329 : : !* Fm12(x) = somme de 0 a l'infini de (dt*t**-1/2)/(1+exp(t-x)) *
1330 : : !* .... *
1331 : : !**********************************************************************
1332 : : !
1333 : : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
1334 : : !Erreur relative maximum annoncee 4.75 e-5
1335 : : !
1336 [ + + ]: 97127446 : do ifft=1,nfft
1337 : 97125264 : x=(rtnewt-vtrial(ifft))/tphysel
1338 [ + + ]: 97127446 : if (x.lt.2._dp) then
1339 : 9875783 : y=exp(x)
1340 : : rhor_middx(ifft)=cktf*y*(23.1456e0_dp+y*(13.7820e0_dp+y))&
1341 : 9875783 : & /(13.0586e0_dp+y*(17.0048e0_dp+y*(5.07527e0_dp+y*0.236620e0_dp)))
1342 : : rhor_mid(ifft)=cktf*y*(21.8168_dp+y*(13.1693_dp+y))&
1343 : 9875783 : & /(24.6180+y*(23.5546_dp+y*(4.76290_dp+y*0.134481_dp)))
1344 : : else
1345 : 87249481 : y=1._dp/(x*x)
1346 : 87249481 : sqrtx=sqrt(x)
1347 : : rhor_middx(ifft)=cktf*sqrtx*(0.0153602e0_dp+y*(0.146815e0_dp+y))&
1348 : 87249481 : & /(0.00768015e0_dp+y*(0.0763700e0_dp+y*0.570485e0_dp))
1349 : : rhor_mid(ifft)=cktf*x*sqrtx*(0.0473011_dp+y*(0.548433_dp+y))&
1350 : 87249481 : & /(0.0709478_dp+y*(0.737041_dp+y*0.382065_dp))
1351 : : end if
1352 : : end do
1353 : : !
1354 : : !**********************************************************************
1355 : 2182 : end subroutine fm12a1t
1356 : : !!***
1357 : :
1358 : : end subroutine vtorhotf
1359 : : !!***
1360 : :
1361 : : end module m_vtorhotf
1362 : : !!***
|