Line data Source code
1 : !!****m* ABINIT/m_entropyDMFT
2 : !! NAME
3 : !! m_entropyDMFT
4 : !!
5 : !! FUNCTION
6 : !! FIXME: add description.
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
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 : !! NOTES
15 : !!
16 : !! SOURCE
17 :
18 : #if defined HAVE_CONFIG_H
19 : #include "config.h"
20 : #endif
21 :
22 : #include "abi_common.h"
23 :
24 : module m_entropyDMFT
25 :
26 : use defs_basis
27 : use m_errors
28 : use m_abicore
29 : use m_xmpi
30 : use m_dtset
31 :
32 : use m_energies, only : energies_type
33 : use m_splines, only : spline_integrate, spline, splint
34 : use m_pawang, only : pawang_type
35 : use m_pawrad, only : pawrad_type, simp_gen, poisson
36 : use m_pawtab, only : pawtab_type
37 : use m_paw_correlations,only : pawpuxinit
38 : use m_io_tools, only : get_unit
39 : use m_data4entropyDMFT
40 :
41 : implicit none
42 :
43 : private
44 :
45 : public :: entropyDMFT_init
46 : public :: entropyDMFT_destroy
47 : public :: entropyDMFT_nextLambda
48 : public :: entropyDMFT_addIntegrand
49 : public :: entropyDMFT_computeEntropy
50 :
51 : integer, parameter :: E_U0 = 1
52 : integer, parameter :: E_UU = 2
53 : integer, parameter :: E_DIRECT = 1
54 : integer, parameter :: E_DC = 2
55 : integer, parameter :: AC_NOTHING = 0
56 : integer, parameter :: AC_ETOT = 1
57 : character(len=21), parameter :: HDR_NAME = "DATA FOR ETOT DMFT v="
58 :
59 : !!***
60 :
61 : !!****t* m_entropyDMFT/entropyDMFT
62 : !! NAME
63 : !! entropyDMFT
64 : !!
65 : !! FUNCTION
66 : !! This structured datatype contains the necessary data
67 : !!
68 : !! COPYRIGHT
69 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
70 : !! This file is distributed under the terms of the
71 : !! GNU General Public License, see ~abinit/COPYING
72 : !! or http://www.gnu.org/copyleft/gpl.txt .
73 : !!
74 : !! SOURCE
75 :
76 : type, public :: entropyDMFT_t
77 : logical :: isset=.FALSE. ! flag to be sure we are initialize
78 : integer :: spacecomm ! MPI comm
79 : integer :: rank ! rank in the comm
80 : integer :: comm_size ! Number of cpus in the comm
81 : integer :: action ! what to do in gstate
82 : integer :: mylambda ! Current lambda
83 : integer :: natom ! number of atoms
84 : integer :: ncatom ! number of correlated atoms
85 : integer :: ntypat ! number of type of atoms
86 : integer :: nctypat ! number of type of correlated atoms
87 : integer :: nlambda ! number of integration points
88 : integer :: ofile ! unit for file output data
89 : character(len=fnlen) :: filename ! name for the file user readable
90 : character(len=fnlen) :: filedata ! name for the file for restart purposes
91 : character(len=fnlen) :: ofilename ! ofstream prefix
92 : character(len=fnlen) :: ifilename ! ifstream prefix
93 : real(dp) :: temp ! temperature
94 : real(dp) :: entropy0 ! entropy for lambda=0
95 : real(dp) :: energies(2,2) ! internal energy for lambda=0 and 1
96 : integer , allocatable :: index_atom(:) ! index for correlated atoms
97 : integer , allocatable :: index_typat(:) ! index for correlated types
98 : integer , allocatable :: lpawu(:) ! orbital moment to treat (ntypat,2)
99 : integer , allocatable :: typat(:) ! type of each correlated atom
100 : real(dp), allocatable :: U_input(:) ! U from input file (ntypat)
101 : real(dp), allocatable :: J_input(:) ! J from input file (ntypat)
102 : real(dp), allocatable :: lambda(:) ! ilamda
103 : real(dp), allocatable :: docc(:,:,:) ! n_In_j, natom, ilamda
104 : real(dp), allocatable :: e_dc(:,:) ! natom, ilamda
105 : real(dp), allocatable :: uij(:,:) ! uij to compute <uij n_i n_j>, ntypat
106 : end type entropyDMFT_t
107 : !!***
108 :
109 :
110 : contains
111 : !!***
112 :
113 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_init
114 : !! NAME
115 : !! entropyDMFT_init
116 : !!
117 : !! FUNCTION
118 : !! FIXME: add description.
119 : !!
120 : !! COPYRIGHT
121 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
122 : !! This file is distributed under the terms of the
123 : !! GNU General Public License, see ~abinit/COPYING
124 : !! or http://www.gnu.org/copyleft/gpl.txt .
125 : !!
126 : !! INPUTS
127 : !! argin(sizein)=description
128 : !!
129 : !! OUTPUT
130 : !! argout(sizeout)=description
131 : !!
132 : !! SIDE EFFECTS
133 : !!
134 : !! NOTES
135 : !!
136 : !! SOURCE
137 :
138 3 : subroutine entropyDMFT_init(e_t,dt,pawtab,spacecomm,ifilename,ofilename)
139 :
140 : !Arguments ------------------------------------
141 : type(entropyDMFT_t) , intent(inout) :: e_t
142 : type(dataset_type) , intent(in ) :: dt
143 : type(pawtab_type) , intent(in ) :: pawtab(:)
144 : integer , intent(in ) :: spacecomm
145 : character(len=fnlen), intent(in ) :: ifilename
146 : character(len=fnlen), intent(in ) :: ofilename
147 : !Local variables ------------------------------
148 : logical :: doRestart
149 : integer :: natom, ncatom
150 : integer :: iatom, icatom
151 : integer :: nctypat,itypat, ictypat
152 : integer :: ilambda
153 3 : integer, allocatable :: maptypat(:)
154 : character(len=500) :: message
155 :
156 3 : e_t%action = dt%dmft_entropy
157 3 : e_t%mylambda = e_t%action-1 ! should be usefull to start form a given value of lambda
158 : ! -1 added to start from 1 at the first call
159 : ! of nextLambda
160 :
161 3 : if ( e_t%action == AC_NOTHING ) then
162 0 : e_t%isset = .TRUE.
163 : return
164 : endif
165 :
166 3 : e_t%action = AC_ETOT
167 :
168 3 : natom = dt%natom
169 3 : ncatom = dt%natpawu
170 :
171 3 : icatom = 0
172 14 : do iatom=1,natom
173 14 : if ( pawtab(dt%typat(iatom))%lpawu /= -1 ) icatom = icatom + 1
174 : end do
175 :
176 3 : if ( icatom /= ncatom ) ABI_ERROR("Inconsistent number of correlated atoms")
177 :
178 3 : nctypat = 0
179 10 : do itypat=1,dt%ntypat
180 10 : if ( pawtab(itypat)%lpawu /= -1 ) nctypat = nctypat + 1
181 : end do
182 :
183 3 : e_t%natom = natom
184 3 : e_t%ncatom = ncatom
185 3 : e_t%ntypat = dt%ntypat
186 3 : e_t%nctypat = nctypat
187 :
188 3 : if ( dt%dmft_nlambda < 3 ) then
189 0 : write(message,'(2a,i4,2a)') "DMFT must have dmft_nlamda >= 3 to compute entropy", &
190 0 : "whereas its value is dmft_nlambda = ",dt%dmft_nlambda,ch10,&
191 0 : "Action : check you input variable dmft_nlambda"
192 0 : ABI_ERROR(message)
193 : end if
194 :
195 3 : e_t%nlambda = dt%dmft_nlambda
196 :
197 3 : doRestart = .false.
198 3 : if ( e_t%nlambda < (e_t%mylambda+1) ) then
199 0 : ABI_ERROR("Restart calculation of DMFT entropy with a value of dmft_entropy greater than dmft_nlambda")
200 3 : else if ( e_t%mylambda > 0 ) then
201 3 : doRestart = .true.
202 : end if
203 :
204 3 : call entropyDMFT_allocateAll(e_t)
205 :
206 3 : e_t%entropy0 = zero
207 21 : e_t%energies(:,:) = zero
208 :
209 23 : e_t%lambda(:) = (/ (DBLE(ilambda-1)/DBLE(e_t%nlambda-1), ilambda=1,e_t%nlambda) /)
210 :
211 3 : e_t%temp = dt%tsmear
212 :
213 : ! Save each value of U and J for each correlated type
214 3 : ictypat = 1
215 9 : ABI_MALLOC(maptypat,(1:dt%ntypat))
216 10 : do itypat=1,dt%ntypat
217 10 : if ( pawtab(itypat)%lpawu /= -1 ) then
218 3 : e_t%lpawu(ictypat) = pawtab(itypat)%lpawu
219 3 : if(dt%dmft_t2g==1.and.e_t%lpawu(ictypat)==2) then
220 2 : e_t%lpawu(ictypat)=1
221 : end if
222 3 : e_t%U_input(ictypat) = pawtab(itypat)%upawu
223 3 : e_t%J_input(ictypat) = pawtab(itypat)%jpawu
224 3 : e_t%index_typat(ictypat) = itypat
225 3 : maptypat(itypat) = ictypat
226 3 : ictypat = ictypat + 1
227 : end if
228 : end do
229 :
230 : ! Save type local and global of each correlated atom
231 : ! Get the correct value of lpawu for each type
232 3 : icatom = 1
233 6 : do iatom=1,e_t%ncatom
234 6 : if ( pawtab(dt%typat(iatom))%lpawu /= -1 ) then
235 3 : e_t%typat(icatom) = maptypat(dt%typat(iatom))
236 3 : e_t%index_atom(icatom) = iatom
237 3 : icatom = icatom + 1
238 : end if
239 : end do
240 3 : ABI_FREE(maptypat)
241 :
242 231 : write(message,'(a,1x,78a)') ch10,"+",(/ ("-",ilambda=1,76) /), "+"
243 3 : call wrtout(std_out,message,"COLL")
244 3 : call wrtout(ab_out,message,"COLL")
245 3 : write(message,'(1x,a)') "| Calculation of entropy within the DMFT Framework |"
246 3 : call wrtout(std_out,message,"COLL")
247 3 : call wrtout(ab_out,message,"COLL")
248 117 : write(message,'(1x,40a)') "+",(/ ("- ",ilambda=1,38) /), "+"
249 3 : call wrtout(std_out,message,"COLL")
250 13 : do ilambda = 1, e_t%nlambda
251 : write(message,'(1x,a,i4,a11,f6.4,55x,a)') &
252 10 : "|", ilambda, ") lambda = ", e_t%lambda(ilambda), "|"
253 10 : call wrtout(std_out,message,"COLL")
254 23 : do ictypat=1,e_t%nctypat
255 10 : write(message,'(1x,a,6x,a12,i4,4x,a3,5x,2(3x,a4,f6.4,1x,a2),10x,a)') "|", &
256 10 : "- Atom type ", e_t%index_typat(ictypat), "->", &
257 10 : "U = ",e_t%U_input(ictypat)*e_t%lambda(ilambda), "Ha", &
258 20 : "J = ",e_t%J_input(ictypat)*e_t%lambda(ilambda), "Ha","|"
259 20 : call wrtout(std_out,message,"COLL")
260 : end do
261 : end do
262 231 : write(message,'(1x,78a)') "+",(/ ("-",ilambda=1,76) /), "+"
263 3 : call wrtout(std_out,message,"COLL")
264 3 : call wrtout(ab_out,message,"COLL")
265 :
266 : ! Set up MPI
267 3 : e_t%spacecomm = spacecomm
268 3 : e_t%rank = xmpi_comm_rank(spacecomm)
269 3 : e_t%comm_size = xmpi_comm_size(spacecomm)
270 :
271 3 : e_t%ofile = get_unit()
272 3 : e_t%ofilename = ofilename
273 3 : e_t%ifilename = ifilename
274 3 : e_t%filename = TRIM(e_t%ofilename)//"_EntropyDMFT"
275 3 : e_t%filedata = TRIM(e_t%ofilename)//"_data4EntropyDMFT"
276 :
277 3 : if ( doRestart .eqv. .true. ) then
278 : ! If restart fails, then nothing changes and the full calculation is
279 : ! perform. Otherwise, we complete as much a possible the structure.
280 1 : call entropyDMFT_restart(e_t)
281 : end if
282 :
283 : ! Rewrite the files with the previous data
284 3 : call entropyDMFT_dump(e_t)
285 :
286 3 : e_t%isset = .TRUE.
287 :
288 :
289 : end subroutine entropyDMFT_init
290 : !!***
291 :
292 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_allocateAll
293 : !! NAME
294 : !! entropyDMFT_allocateAll
295 : !!
296 : !! FUNCTION
297 : !! FIXME: add description.
298 : !!
299 : !! COPYRIGHT
300 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
301 : !! This file is distributed under the terms of the
302 : !! GNU General Public License, see ~abinit/COPYING
303 : !! or http://www.gnu.org/copyleft/gpl.txt .
304 : !!
305 : !! INPUTS
306 : !! argin(sizein)=description
307 : !!
308 : !! OUTPUT
309 : !! argout(sizeout)=description
310 : !!
311 : !! SIDE EFFECTS
312 : !!
313 : !! NOTES
314 : !!
315 : !! SOURCE
316 :
317 3 : subroutine entropyDMFT_allocateAll(e_t)
318 :
319 : !Arguments ------------------------------------
320 : type(entropyDMFT_t), intent(inout) :: e_t
321 :
322 9 : ABI_MALLOC(e_t%index_atom, (1:e_t%natom))
323 14 : e_t%index_atom = 0
324 9 : ABI_MALLOC(e_t%index_typat,(1:e_t%nctypat))
325 14 : e_t%index_atom = 0
326 9 : ABI_MALLOC(e_t%typat, (1:e_t%ncatom))
327 6 : e_t%typat = 0
328 6 : ABI_MALLOC(e_t%lpawu, (1:e_t%nctypat))
329 6 : e_t%lpawu = 0
330 9 : ABI_MALLOC(e_t%U_input, (1:e_t%nctypat))
331 6 : e_t%U_input = zero
332 6 : ABI_MALLOC(e_t%J_input, (1:e_t%nctypat))
333 6 : e_t%J_input = zero
334 9 : ABI_MALLOC(e_t%lambda, (1:e_t%nlambda))
335 13 : e_t%lambda = 0
336 12 : ABI_MALLOC(e_t%docc, (1:(14*13)/2,1:e_t%ncatom,1:e_t%nlambda))
337 933 : e_t%docc = zero
338 12 : ABI_MALLOC(e_t%e_dc, (1:e_t%ncatom,1:e_t%nlambda))
339 23 : e_t%e_dc = zero
340 9 : ABI_MALLOC(e_t%uij, (1:(14*13)/2,1:e_t%nctypat))
341 279 : e_t%uij = zero
342 3 : end subroutine entropyDMFT_allocateAll
343 : !!***
344 :
345 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_restart
346 : !! NAME
347 : !! entropyDMFT_restart
348 : !!
349 : !! FUNCTION
350 : !! FIXME: add description.
351 : !!
352 : !! COPYRIGHT
353 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
354 : !! This file is distributed under the terms of the
355 : !! GNU General Public License, see ~abinit/COPYING
356 : !! or http://www.gnu.org/copyleft/gpl.txt .
357 : !!
358 : !! INPUTS
359 : !! argin(sizein)=description
360 : !!
361 : !! OUTPUT
362 : !! argout(sizeout)=description
363 : !!
364 : !! SIDE EFFECTS
365 : !!
366 : !! NOTES
367 : !!
368 : !! SOURCE
369 :
370 1 : subroutine entropyDMFT_restart(e_t)
371 :
372 : !Arguments ------------------------------------
373 : type(entropyDMFT_t), intent(inout) :: e_t
374 : !Local variables-------------------------------
375 : logical :: doBcast
376 : character(len=200) :: msg
377 : character(len=21 ) :: hdr
378 : integer :: iostate
379 : integer :: ilambda
380 : integer :: tlambda
381 : integer :: ictypat
382 : integer :: ndim
383 : integer :: icouple
384 : integer :: iflavor1
385 : integer :: iflavor2
386 : integer :: icatom
387 : integer :: iatom
388 : real(dp) :: lambda
389 :
390 1 : write(msg,'(a,1x,2a,1x,a,f6.4,a)') ch10,"EtotDMFT will try to restart calculation from a previous run", ch10, &
391 2 : "and this calculation should start at lambda = ",e_t%lambda(e_t%mylambda+1), ch10
392 1 : call wrtout(std_out,msg,"COLL")
393 1 : call wrtout(ab_out,msg,"COLL")
394 :
395 1 : doBcast = .true.
396 :
397 1 : if ( e_t%rank == 0 ) then
398 1 : tlambda = 1
399 1 : inquire(file=e_t%filedata,iostat=iostate)
400 :
401 1 : if ( iostate /= 0 ) then
402 0 : write(msg,'(5a)') "File ", trim(e_t%filedata), " does not exist or is not accessible", ch10, &
403 0 : "-> No restart performed but full calculation."
404 0 : ABI_WARNING(msg)
405 0 : e_t%mylambda = 0
406 : end if
407 :
408 1 : open(unit=e_t%ofile,file=e_t%filedata,action="read",form="unformatted")
409 1 : read(e_t%ofile,end=42) hdr, iostate
410 :
411 1 : if ( hdr /= HDR_NAME .or. iostate /= 1 ) then
412 0 : write(msg,'(5a)') "File ", trim(e_t%filedata), " does not contain the proper header", ch10, &
413 0 : "-> No restart performed but full calculation."
414 0 : ABI_WARNING(msg)
415 0 : e_t%mylambda = 0
416 : end if
417 :
418 2 : do ilambda = 1, e_t%mylambda
419 2 : tlambda = ilambda
420 2 : read(e_t%ofile,end=42) lambda
421 2 : if ( ABS(lambda - e_t%lambda(ilambda)) >= tol9 ) then
422 1 : write(msg,'(5a,f6.4,a,f6.4)') "File ", trim(e_t%filedata), " is wrong:", ch10, &
423 2 : "Lambda values are different: in file ", lambda, " instead of ", e_t%lambda(ilambda)
424 1 : ABI_WARNING(msg)
425 1 : goto 42
426 : end if
427 :
428 1 : if ( ilambda == 1 ) then
429 1 : read(e_t%ofile,end=42) lambda
430 1 : if ( lambda /= e_t%temp ) then
431 0 : write(msg,'(7a,f6.4)') "File ", trim(e_t%filedata), " is wrong:", ch10, &
432 0 : "Temperature is different than the value of tsmear", ch10, &
433 0 : "-> No restart performed but full calculation."
434 0 : ABI_WARNING(msg)
435 0 : goto 42
436 : end if
437 1 : read(e_t%ofile,end=42) e_t%entropy0
438 1 : read(e_t%ofile,end=42) e_t%energies(E_DC,E_U0)
439 0 : else if ( ilambda == e_t%nlambda ) then ! should never happend ?!
440 0 : read(e_t%ofile,end=42) e_t%energies(E_DC,E_UU)
441 0 : do ictypat = 1, e_t%nctypat
442 0 : ndim = 2*(2*e_t%lpawu(ictypat)+1)
443 0 : icouple = 0
444 0 : do iflavor1 = 1, ndim
445 0 : do iflavor2 = iflavor1+1, ndim
446 0 : icouple = icouple + 1
447 0 : read(e_t%ofile,end=42) e_t%uij(icouple,ictypat)
448 : end do
449 : end do
450 : end do
451 : end if
452 :
453 2 : do icatom = 1, e_t%ncatom
454 1 : iatom = e_t%index_atom(icatom)
455 1 : ndim = 2*(2*e_t%lpawu(e_t%typat(icatom))+1)
456 1 : icouple = 0
457 1 : read(e_t%ofile,end=42) e_t%e_dc(icatom,ilambda)
458 8 : do iflavor1 = 1, ndim
459 22 : do iflavor2 = iflavor1+1, ndim
460 15 : icouple = icouple + 1
461 21 : read(e_t%ofile,end=42) e_t%docc(icouple,icatom,ilambda)
462 : end do
463 : end do
464 : end do
465 : end do
466 0 : close(e_t%ofile)
467 0 : goto 43
468 1 : 42 write(msg,'(5a,f6.4)') "File ", trim(e_t%filedata), " is wrong or incomplete", ch10, &
469 2 : "-> Restart calculation will restart at lambda = ",e_t%lambda(tlambda)
470 1 : ABI_WARNING(msg)
471 1 : close(e_t%ofile)
472 1 : e_t%mylambda = tlambda-1 ! -1 to go to previous lambda
473 : end if
474 : ! MPI BDCAST
475 1 : 43 call xmpi_bcast(e_t%mylambda,0, e_t%spacecomm, ictypat)
476 1 : call xmpi_bcast(e_t%entropy0,0, e_t%spacecomm, ictypat)
477 1 : call xmpi_bcast(e_t%energies,0, e_t%spacecomm, ictypat)
478 : !call xmpi_bcast(e_t%uij,0, e_t%spacecomm, ictypat) ! No need since it
479 : ! restart always perform the last lambda and this is calculation at the end
480 : ! of last lambda
481 1 : call xmpi_bcast(e_t%e_dc,0, e_t%spacecomm, ictypat)
482 1 : call xmpi_bcast(e_t%docc,0, e_t%spacecomm, ictypat)
483 :
484 1 : end subroutine entropyDMFT_restart
485 : !!***
486 :
487 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_dump
488 : !! NAME
489 : !! entropyDMFT_dump
490 : !!
491 : !! FUNCTION
492 : !! FIXME: add description.
493 : !!
494 : !! COPYRIGHT
495 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
496 : !! This file is distributed under the terms of the
497 : !! GNU General Public License, see ~abinit/COPYING
498 : !! or http://www.gnu.org/copyleft/gpl.txt .
499 : !!
500 : !! INPUTS
501 : !! argin(sizein)=description
502 : !!
503 : !! OUTPUT
504 : !! argout(sizeout)=description
505 : !!
506 : !! SIDE EFFECTS
507 : !!
508 : !! NOTES
509 : !!
510 : !! SOURCE
511 :
512 3 : subroutine entropyDMFT_dump(e_t)
513 :
514 : !Arguments ------------------------------------
515 : type(entropyDMFT_t), intent(inout) :: e_t
516 : !Local variables-------------------------------
517 : integer :: ilambda
518 : integer :: ictypat
519 : integer :: ndim
520 : integer :: icouple
521 : integer :: iflavor1
522 : integer :: iflavor2
523 : integer :: icatom
524 : integer :: iatom
525 :
526 3 : if ( e_t%rank /= 0 ) return
527 :
528 : ! Dump _data4EtotDMFT
529 3 : open(unit=e_t%ofile,file=e_t%filedata,action="write",form="unformatted")
530 3 : write(e_t%ofile) HDR_NAME, 1
531 :
532 4 : do ilambda = 1, e_t%mylambda
533 1 : write(e_t%ofile) e_t%lambda(ilambda)
534 :
535 1 : if ( ilambda == 1 ) then
536 1 : write(e_t%ofile) e_t%temp
537 1 : write(e_t%ofile) e_t%entropy0
538 1 : write(e_t%ofile) e_t%energies(E_DC,E_U0)
539 0 : else if ( ilambda == e_t%nlambda ) then ! should never happend ?!
540 0 : write(e_t%ofile) e_t%energies(E_DC,E_UU)
541 0 : do ictypat = 1, e_t%nctypat
542 0 : ndim = 2*(2*e_t%lpawu(ictypat)+1)
543 0 : icouple = 0
544 0 : do iflavor1 = 1, ndim
545 0 : do iflavor2 = iflavor1+1, ndim
546 0 : icouple = icouple + 1
547 0 : write(e_t%ofile) e_t%uij(icouple,ictypat)
548 : end do
549 : end do
550 : end do
551 : end if
552 :
553 5 : do icatom = 1, e_t%ncatom
554 1 : iatom = e_t%index_atom(icatom)
555 1 : ndim = 2*(2*e_t%lpawu(e_t%typat(icatom))+1)
556 1 : icouple = 0
557 1 : write(e_t%ofile) e_t%e_dc(icatom,ilambda)
558 8 : do iflavor1 = 1, ndim
559 22 : do iflavor2 = iflavor1+1, ndim
560 15 : icouple = icouple + 1
561 21 : write(e_t%ofile) e_t%docc(icouple,icatom,ilambda)
562 : end do
563 : end do
564 : end do
565 : end do
566 3 : close(e_t%ofile)
567 :
568 : ! Dump _EtotDMFT
569 3 : open(unit=e_t%ofile,file=e_t%filename)
570 3 : write(e_t%ofile,'(2a)') "# Data for entropy calculation in DMFT",ch10
571 4 : do ilambda = 1, e_t%mylambda
572 4 : if ( ilambda == 1 ) then
573 1 : write(e_t%ofile,'(a)') "# Temperature [Ha]:"
574 1 : write(e_t%ofile,'(es22.14)') e_t%temp
575 1 : write(e_t%ofile,'(a)') "# Entropy for lambda=0 [kb]:"
576 1 : write(e_t%ofile,'(es22.14)') e_t%entropy0
577 1 : write(e_t%ofile,'(a)') "# Internal energy for lambda=0 [Ha]:"
578 1 : write(e_t%ofile,'(es22.14)') e_t%energies(E_DC,E_U0)
579 0 : else if ( e_t%mylambda == e_t%nlambda ) then
580 0 : write(e_t%ofile,'(a)') "# Internal energy for lambda=1 [Ha]:"
581 0 : write(e_t%ofile,'(es22.14)') e_t%energies(E_DC,E_UU)
582 0 : do ictypat = 1, e_t%nctypat
583 0 : ndim = 2*(2*e_t%lpawu(ictypat)+1)
584 0 : icouple = 0
585 0 : write(e_t%ofile,'(a,f7.5,1x,a,i4)') "# Interaction Matrix normalized by U=",e_t%U_input(ictypat) , &
586 0 : "[Ha] for atom type", e_t%index_typat(ictypat)
587 0 : do iflavor1 = 1, ndim
588 0 : write(e_t%ofile,'(14(a21,2x))',advance="no") (/ ( "...", iflavor2=1,iflavor1 ) /)
589 0 : do iflavor2 = iflavor1+1, ndim
590 0 : icouple = icouple + 1
591 0 : write(e_t%ofile,'(14(es21.14,2x))',advance="no") e_t%uij(icouple,ictypat)
592 : end do
593 0 : write(e_t%ofile,*)
594 : end do
595 : end do
596 : end if
597 : end do
598 3 : close(e_t%ofile)
599 : end subroutine entropyDMFT_dump
600 : !!***
601 :
602 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_nextLambda
603 : !! NAME
604 : !! entropyDMFT_nextLambda
605 : !!
606 : !! FUNCTION
607 : !! FIXME: add description.
608 : !!
609 : !! COPYRIGHT
610 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
611 : !! This file is distributed under the terms of the
612 : !! GNU General Public License, see ~abinit/COPYING
613 : !! or http://www.gnu.org/copyleft/gpl.txt .
614 : !!
615 : !! INPUTS
616 : !! argin(sizein)=description
617 : !!
618 : !! OUTPUT
619 : !! argout(sizeout)=description
620 : !!
621 : !! SIDE EFFECTS
622 : !!
623 : !! NOTES
624 : !!
625 : !! SOURCE
626 :
627 12 : function entropyDMFT_nextLambda(e_t,dt,pawtab,pawang,pawrad) result(nextstep)
628 :
629 : !Arguments ------------------------------------
630 : type(entropyDMFT_t) , intent(inout) :: e_t
631 : type(dataset_type) , intent(in) :: dt
632 : type(pawtab_type) , intent(inout) :: pawtab(:)
633 : type(pawang_type) , intent(in ) :: pawang
634 : type(pawrad_type) , intent(inout) :: pawrad(:)
635 : !Local variables ------------------------------
636 : logical :: nextstep
637 : integer :: itypat
638 : integer :: mylambda
639 : logical :: is_dfpt=.false.
640 12 : real(dp),allocatable :: upawu(:),jpawu(:)
641 : character(len=100) :: message
642 :
643 12 : if ( e_t%isset .eqv. .FALSE. ) &
644 0 : ABI_ERROR("entropyDMFT is not initialized")
645 :
646 : ! go to next lambda
647 12 : mylambda = e_t%mylambda + 1
648 : !if ( present(ilambda) ) mylambda = ilambda
649 12 : e_t%mylambda = mylambda
650 :
651 12 : if ( e_t%action == AC_NOTHING .and. mylambda >= 1 ) then
652 : nextstep = .FALSE.
653 : ! We do nothing and return false, one scfvc has already performed
654 12 : else if ( e_t%action == AC_NOTHING .and. mylambda < 1 ) then
655 : nextstep = .TRUE.
656 : ! We do nothing but return true to perform scfcv a least once
657 12 : else if ( e_t%action == AC_ETOT .and. mylambda <= e_t%nlambda ) then ! we iterate over lambda
658 9 : nextstep = .TRUE.
659 27 : ABI_MALLOC(upawu,(dt%ntypat))
660 18 : ABI_MALLOC(jpawu,(dt%ntypat))
661 18 : do itypat = 1, e_t%nctypat
662 9 : upawu(e_t%index_typat(itypat)) = e_t%lambda(mylambda) * e_t%U_input(itypat)
663 18 : jpawu(e_t%index_typat(itypat)) = e_t%lambda(mylambda) * e_t%J_input(itypat)
664 : end do
665 : else ! we did all lambda values
666 : nextstep = .FALSE.
667 : endif
668 :
669 12 : if ( e_t%action == AC_ETOT .and. nextstep .eqv. .true. ) then
670 693 : write(message,'(a,1x,78a)') ch10,"+",(/ ("-",itypat=1,76) /), "+"
671 9 : call wrtout(std_out,message,"COLL")
672 9 : call wrtout(ab_out,message,"COLL")
673 : write(message,'(1x,a,i4,a11,f6.4,55x,a)') &
674 9 : "|", mylambda, ") lambda = ", e_t%lambda(mylambda), "|"
675 9 : call wrtout(std_out,message,"COLL")
676 9 : call wrtout(ab_out,message,"COLL")
677 18 : do itypat=1,e_t%nctypat
678 9 : write(message,'(1x,a,6x,a12,i4,4x,a3,5x,2(3x,a4,f6.4,1x,a2),10x,a)') "|",&
679 9 : "- Atom type ", e_t%index_typat(itypat), "->", &
680 9 : "U = ",e_t%U_input(itypat)*e_t%lambda(mylambda), "Ha", &
681 18 : "J = ",e_t%J_input(itypat)*e_t%lambda(mylambda), "Ha","|"
682 9 : call wrtout(std_out,message,"COLL")
683 18 : call wrtout(ab_out,message,"COLL")
684 : end do
685 693 : write(message,'(1x,78a)') "+",(/ ("-",itypat=1,76) /), "+"
686 9 : call wrtout(std_out,message,"COLL")
687 9 : call wrtout(ab_out,message,"COLL")
688 : call pawpuxinit(dt%dmatpuopt,dt%exchmix,dt%f4of2_sla,dt%f6of2_sla,&
689 : & is_dfpt,jpawu,dt%lexexch,dt%lpawu,dt%nspinor,dt%ntypat,dt%optdcmagpawu,pawang,dt%pawprtvol,&
690 : & pawrad,pawtab,upawu,dt%usedmft,dt%useexexch,dt%usepawu,dmft_orbital=dt%dmft_orbital, &
691 : & dmft_dc=dt%dmft_dc,dmft_orbital_filepath=dt%dmft_orbital_filepath,dmft_yukawa_param=dt%dmft_yukawa_param, &
692 9 : & dmft_yukawa_lambda=dt%dmft_yukawa_lambda,dmft_yukawa_epsilon=dt%dmft_yukawa_epsilon)
693 9 : ABI_FREE(upawu)
694 9 : ABI_FREE(jpawu)
695 : end if
696 :
697 12 : end function entropyDMFT_nextLambda
698 : !!***
699 :
700 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_addIntegrand
701 : !! NAME
702 : !! entropyDMFT_addIntegrand
703 : !!
704 : !! FUNCTION
705 : !! FIXME: add description.
706 : !!
707 : !! COPYRIGHT
708 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
709 : !! This file is distributed under the terms of the
710 : !! GNU General Public License, see ~abinit/COPYING
711 : !! or http://www.gnu.org/copyleft/gpl.txt .
712 : !!
713 : !! INPUTS
714 : !! argin(sizein)=description
715 : !!
716 : !! OUTPUT
717 : !! argout(sizeout)=description
718 : !!
719 : !! SIDE EFFECTS
720 : !!
721 : !! NOTES
722 : !!
723 : !! SOURCE
724 :
725 9 : subroutine entropyDMFT_addIntegrand(e_t,dt,energies,data4etot)
726 :
727 : !Arguments ------------------------------------
728 : type(entropyDMFT_t) , intent(inout) :: e_t
729 : type(dataset_type) , intent(in ) :: dt
730 : type(energies_type), intent(in ) :: energies
731 : type(data4entropyDMFT_t) , intent(in ) :: data4etot
732 : !Local variables ------------------------------
733 : integer :: optdc
734 : integer :: ictypat
735 : integer :: iatom, icatom
736 : integer :: iflavor1, iflavor2, ndim
737 : integer :: icouple
738 :
739 9 : if ( e_t%action == AC_NOTHING ) return
740 :
741 : ! Write lambda for restart
742 9 : if ( e_t%rank == 0 ) then
743 9 : open(unit=e_t%ofile,file=e_t%filedata,position="append",form="unformatted")
744 9 : write(e_t%ofile) e_t%lambda(e_t%mylambda)
745 9 : close(e_t%ofile)
746 : end if
747 :
748 9 : if ( e_t%mylambda == 1 ) then
749 : ! Save entropy and internal energy for U=0
750 2 : e_t%entropy0 = energies%entropy_ks
751 : ! 1 is for usepaw that is 1 in DMFT, optdc is to know if the DC scheme is
752 : ! calculated.
753 2 : call energies%eval_eint(dt,1,optdc,e_t%energies(E_DIRECT,E_U0),e_t%energies(E_DC,E_U0))
754 2 : if ( e_t%rank == 0 ) then
755 2 : open(unit=e_t%ofile,file=e_t%filename,position="append")
756 2 : write(e_t%ofile,'(a)') "# Temperature [Ha]:"
757 2 : write(e_t%ofile,'(es22.14)') e_t%temp
758 2 : write(e_t%ofile,'(a)') "# Entropy for lambda=0 [kb]:"
759 2 : write(e_t%ofile,'(es22.14)') e_t%entropy0
760 2 : write(e_t%ofile,'(a)') "# Internal energy for lambda=0 [Ha]:"
761 2 : write(e_t%ofile,'(es22.14)') e_t%energies(E_DC,E_U0)
762 2 : close(e_t%ofile)
763 2 : open(unit=e_t%ofile,file=e_t%filedata,position="append",form="unformatted")
764 2 : write(e_t%ofile) e_t%temp
765 2 : write(e_t%ofile) e_t%entropy0
766 2 : write(e_t%ofile) e_t%energies(E_DC,E_U0)
767 2 : close(e_t%ofile)
768 : end if
769 7 : else if ( e_t%mylambda == e_t%nlambda ) then
770 : ! Save internal energy for U=Umax
771 3 : call energies%eval_eint(dt,1,optdc,e_t%energies(E_DIRECT,E_UU),e_t%energies(E_DC,E_UU))
772 3 : if ( e_t%rank == 0 ) then
773 3 : open(unit=e_t%ofile,file=e_t%filename,position="append")
774 3 : write(e_t%ofile,'(a)') "# Internal energy for lambda=1 [Ha]:"
775 3 : write(e_t%ofile,'(es22.14)') e_t%energies(E_DC,E_UU)
776 : end if
777 : ! Compute U_max, and uij
778 6 : do ictypat = 1, e_t%nctypat
779 3 : ndim = 2*(2*e_t%lpawu(ictypat)+1)
780 3 : icouple = 0
781 : !write(*,*) matU
782 3 : if ( e_t%rank == 0 ) &
783 3 : write(e_t%ofile,'(a,f7.5,1x,a,i4)') "# Interaction Matrix normalized by U=",e_t%U_input(ictypat) , &
784 6 : "[Ha] for atom type", e_t%index_typat(ictypat)
785 32 : do iflavor1 = 1, ndim
786 26 : if ( e_t%rank == 0 ) &
787 320 : write(e_t%ofile,'(14(a21,2x))',advance="no") (/ ( "...", iflavor2=1,iflavor1 ) /)
788 147 : do iflavor2 = iflavor1+1, ndim
789 121 : icouple = icouple + 1
790 : e_t%uij(icouple,ictypat) = data4etot%hu_dens(iflavor1,iflavor2,e_t%index_typat(ictypat)) &
791 121 : /e_t%U_input(ictypat) ! to modify, this is just the idea
792 121 : if ( e_t%rank == 0 ) &
793 147 : write(e_t%ofile,'(14(es21.14,2x))',advance="no") e_t%uij(icouple,ictypat)
794 : end do
795 29 : if ( e_t%rank == 0 ) write(e_t%ofile,*)
796 : end do
797 : end do
798 :
799 3 : if ( e_t%rank == 0 ) then
800 3 : close(e_t%ofile)
801 3 : open(unit=e_t%ofile,file=e_t%filedata,position="append",form="unformatted")
802 3 : write(e_t%ofile) e_t%energies(E_DC,E_UU)
803 6 : do ictypat = 1, e_t%nctypat
804 3 : ndim = 2*(2*e_t%lpawu(ictypat)+1)
805 3 : icouple = 0
806 32 : do iflavor1 = 1, ndim
807 150 : do iflavor2 = iflavor1+1, ndim
808 121 : icouple = icouple + 1
809 147 : write(e_t%ofile) e_t%uij(icouple,ictypat)
810 : end do
811 : end do
812 : end do
813 3 : close(e_t%ofile)
814 : end if
815 : endif
816 :
817 : ! For all lambda
818 : ! Save Docc, Nup and Ndwn
819 9 : if ( e_t%rank == 0 ) then
820 9 : open(unit=e_t%ofile,file=e_t%filedata,position="append",form="unformatted")
821 : end if
822 18 : do icatom = 1, e_t%ncatom
823 9 : iatom = e_t%index_atom(icatom)
824 9 : ndim = 2*(2*e_t%lpawu(e_t%typat(icatom))+1)
825 9 : icouple = 0
826 9 : e_t%e_dc(icatom,e_t%mylambda) = data4etot%e_dc(iatom)
827 9 : if ( e_t%rank == 0 ) then
828 9 : write(e_t%ofile) e_t%e_dc(icatom,e_t%mylambda)
829 : end if
830 96 : do iflavor1 = 1, ndim
831 450 : do iflavor2 = iflavor1+1, ndim
832 363 : icouple = icouple + 1
833 363 : e_t%docc(icouple,icatom,e_t%mylambda) = data4etot%Docc(iflavor1,iflavor2,iatom)
834 441 : if ( e_t%rank == 0 ) then
835 363 : write(e_t%ofile) e_t%docc(icouple,icatom,e_t%mylambda)
836 : end if
837 : end do
838 : end do
839 : end do
840 :
841 9 : if ( e_t%rank == 0 ) then
842 9 : close(e_t%ofile)
843 : end if
844 :
845 : !call entropyDMFT_computeIntegrand(e_t)
846 :
847 : end subroutine entropyDMFT_addIntegrand
848 : !!***
849 :
850 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_computeEntropy
851 : !! NAME
852 : !! entropyDMFT_computeEntropy
853 : !!
854 : !! FUNCTION
855 : !! FIXME: add description.
856 : !!
857 : !! COPYRIGHT
858 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
859 : !! This file is distributed under the terms of the
860 : !! GNU General Public License, see ~abinit/COPYING
861 : !! or http://www.gnu.org/copyleft/gpl.txt .
862 : !!
863 : !! INPUTS
864 : !! argin(sizein)=description
865 : !!
866 : !! OUTPUT
867 : !! argout(sizeout)=description
868 : !!
869 : !! SIDE EFFECTS
870 : !!
871 : !! NOTES
872 : !!
873 : !! SOURCE
874 :
875 3 : subroutine entropyDMFT_computeEntropy(e_t,entropy)
876 :
877 : !Arguments ------------------------------------
878 : type(entropyDMFT_t), intent(inout) :: e_t
879 : real(dp) , intent(inout) :: entropy !inout in case we do nothing, avoid to change entropy in NaN
880 : !Local variables ------------------------------
881 : integer :: ilambda
882 : integer :: nlambda
883 : integer :: icatom
884 : integer :: ncatom
885 : integer :: icouple
886 : integer :: ndim
887 3 : real(dp), allocatable :: integrand(:,:)
888 : real(dp) :: docc
889 : real(dp) :: integral
890 : real(dp) :: entropyDirect
891 : character(len=500) :: string
892 : character(len=50) :: i2str
893 :
894 3 : if ( e_t%action == AC_NOTHING ) return
895 :
896 3 : nlambda = e_t%nlambda
897 3 : ncatom = e_t%ncatom
898 :
899 12 : ABI_MALLOC(integrand,(1:nlambda,1:ncatom))
900 16 : integrand(1:nlambda,1:ncatom) = zero
901 :
902 3 : if ( e_t%rank == 0 ) then
903 3 : open(unit=e_t%ofile,file=e_t%filename,position="append")
904 3 : write(e_t%ofile,'(2a)') ch10,"#Decomposition for each lambda per atom"
905 : end if
906 13 : do ilambda = 1, nlambda
907 10 : if ( e_t%rank == 0 ) then
908 10 : write(e_t%ofile,'(a,i2,a)') "# ------| lambda ",ilambda," |------ #"
909 10 : write(e_t%ofile,'(a5,a23,a23)') "#Atom","DC","<uij*n_i*n_j>"
910 : end if
911 23 : do icatom = 1, ncatom
912 10 : integrand(ilambda,icatom) = -e_t%e_dc(icatom,ilambda)
913 10 : ndim = 2*(2*e_t%lpawu(e_t%typat(e_t%index_atom(icatom)))+1) ! nflavors
914 10 : ndim = ndim*(ndim-1)/2 ! number of couples
915 10 : docc = zero
916 388 : do icouple = 1, ndim
917 388 : docc = docc + e_t%uij(icouple,e_t%typat(icatom)) * e_t%docc(icouple,icatom,ilambda)
918 : end do
919 10 : integrand(ilambda,icatom) = integrand(ilambda,icatom) + docc
920 10 : if ( e_t%rank == 0 ) &
921 20 : write(e_t%ofile,'(i5,2es23.14)') e_t%index_atom(icatom),e_t%e_dc(icatom,ilambda),docc
922 : end do
923 : end do
924 :
925 : ! print for test purpose
926 3 : if ( e_t%rank == 0 ) then
927 3 : write(i2str,'(i6)') e_t%ncatom
928 3 : string='(a,a7,'//TRIM(ADJUSTL(i2str))//'(12x,"Atom",i6))'
929 : !open(unit=e_t%ofile,file=e_t%filename,position="append")
930 9 : write(e_t%ofile,string) ch10,"#lambda", (/ (e_t%index_atom(icatom),icatom=1,ncatom) /)
931 3 : string='(1x,f6.4,'//TRIM(ADJUSTL(i2str))//'(1x,e21.14))'
932 13 : do ilambda = 1, nlambda
933 33 : write(e_t%ofile,string) e_t%lambda(ilambda), (/ (integrand(ilambda,icatom),icatom=1,ncatom) /)
934 : end do
935 3 : close(e_t%ofile)
936 : end if
937 :
938 : ! Integrate the integrand for all correlated atoms
939 3 : call entropyDMFT_integrate(e_t,integrand,integral)
940 3 : ABI_FREE(integrand)
941 :
942 231 : write(string,'(a,1x,78a)') ch10,"+",(/ ("-",ilambda=1,76) /), "+"
943 3 : call wrtout(std_out,string,"COLL")
944 3 : call wrtout(ab_out,string,"COLL")
945 3 : write(string,'(1x,a)') "| Calculation of entropy within the DMFT Framework |"
946 3 : call wrtout(std_out,string,"COLL")
947 3 : call wrtout(ab_out,string,"COLL")
948 117 : write(string,'(1x,40a)') "+",(/ ("- ",ilambda=1,38) /), "+"
949 3 : call wrtout(std_out,string,"COLL")
950 :
951 3 : entropyDirect = e_t%entropy0 + ( e_t%energies(E_DIRECT,E_UU) - e_t%energies(E_DIRECT,E_U0) - integral ) /e_t%temp
952 3 : entropy = e_t%entropy0 + ( e_t%energies(E_DC,E_UU) - e_t%energies(E_DC,E_U0) - integral ) /e_t%temp
953 :
954 3 : write(i2str,'(a)') '(1x,a,19x,a11,es21.14,1x,a4,20x,a)'
955 3 : write(string,i2str) "|","Integral = ", integral, "[Ha]", "|"
956 3 : call wrtout(std_out,string,"COLL")
957 3 : write(string,i2str) "|","E(0) = ", e_t%energies(E_DC,E_U0), "[Ha]", "|"
958 3 : call wrtout(std_out,string,"COLL")
959 3 : write(string,i2str) "|","E(U) = ", e_t%energies(E_DC,E_UU), "[Ha]", "|"
960 3 : call wrtout(std_out,string,"COLL")
961 3 : write(string,i2str) "|","S(0) = ", e_t%entropy0, "[kb]", "|"
962 3 : call wrtout(std_out,string,"COLL")
963 3 : write(string,i2str) "|","S(U) = ", entropy, "[kb]", "|"
964 3 : call wrtout(std_out,string,"COLL")
965 117 : write(string,'(1x,40a)') "+",(/ ("- ",ilambda=1,38) /), "+"
966 3 : call wrtout(std_out,string,"COLL")
967 :
968 3 : write(string,'(1x,a,16x,a22,es21.14,1x,a4,12x,a)') "|","-kT*entropy is set to ", -e_t%temp*entropy, "[Ha]", "|"
969 3 : call wrtout(std_out,string,"COLL")
970 3 : call wrtout(ab_out,string,"COLL")
971 :
972 231 : write(string,'(1x,78a)') "+",(/ ("-",ilambda=1,76) /), "+"
973 3 : call wrtout(std_out,string,"COLL")
974 3 : call wrtout(ab_out,string,"COLL")
975 :
976 3 : if ( entropy < zero ) then
977 1 : write(string,'(3a)') "Entropy is negative !!!!",ch10,&
978 2 : "It does not make any sense"
979 1 : ABI_WARNING(string)
980 : end if
981 :
982 3 : if ( abs(entropy-entropyDirect) >= tol3 ) then
983 3 : write(string,'(1x,a,1x,f8.3,1x,a,1x,f8.3,2a)') "Difference between Direct and DC entropies is", abs(entropy-entropyDirect), &
984 6 : "which is greater than", tol3,ch10,"Action : converge better the DMFT and/or DFT loops"
985 3 : ABI_WARNING(string)
986 : end if
987 :
988 :
989 :
990 6 : end subroutine entropyDMFT_computeEntropy
991 : !!***
992 :
993 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_integrate
994 : !! NAME
995 : !! entropyDMFT_integrate
996 : !!
997 : !! FUNCTION
998 : !! FIXME: add description.
999 : !!
1000 : !! COPYRIGHT
1001 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
1002 : !! This file is distributed under the terms of the
1003 : !! GNU General Public License, see ~abinit/COPYING
1004 : !! or http://www.gnu.org/copyleft/gpl.txt .
1005 : !!
1006 : !! INPUTS
1007 : !! argin(sizein)=description
1008 : !!
1009 : !! OUTPUT
1010 : !! argout(sizeout)=description
1011 : !!
1012 : !! SIDE EFFECTS
1013 : !!
1014 : !! NOTES
1015 : !!
1016 : !! SOURCE
1017 :
1018 3 : subroutine entropyDMFT_integrate(e_t,integrand,integral)
1019 :
1020 : !Arguments ------------------------------------
1021 : type(entropyDMFT_t), intent(inout) :: e_t
1022 : real(dp) , intent(in ) :: integrand(:,:)
1023 : real(dp) , intent( out) :: integral
1024 : !Local variables ------------------------------
1025 3 : real(dp), allocatable :: ypp(:)
1026 3 : real(dp), allocatable :: fitx(:)
1027 3 : real(dp), allocatable :: fity(:)
1028 : real(dp) :: integral1
1029 : !real(dp) :: integral2
1030 : !real(dp) :: dx
1031 : integer :: unit
1032 : integer :: Nfit
1033 : integer :: icatom
1034 : integer :: i
1035 :
1036 3 : Nfit = 1000
1037 :
1038 9 : ABI_MALLOC(ypp,(1:e_t%nlambda))
1039 3 : ABI_MALLOC(fitx,(1:Nfit))
1040 3 : ABI_MALLOC(fity,(1:Nfit))
1041 :
1042 3 : integral = zero
1043 :
1044 3 : unit = get_unit()
1045 3 : if ( e_t%rank == 0 ) open(unit=unit,file="fit.log")
1046 6 : do icatom = 1, e_t%ncatom
1047 3 : integral1 = zero
1048 : !integral2 = zero
1049 : !dx = e_t%U_input(icatom)/dble(e_t%nlambda-1)
1050 :
1051 : call spline(e_t%lambda,integrand(:,icatom),e_t%nlambda,&
1052 : (integrand(2,icatom)-integrand(1,icatom))/e_t%lambda(2),& ! first derivative left
1053 : (integrand(e_t%nlambda,icatom)-integrand(e_t%nlambda-1,icatom))/e_t%lambda(2),& ! first derivative right
1054 3 : ypp)
1055 6006 : fitx(1:Nfit)=(/ (dble(i-1)/dble(Nfit-1),i=1,Nfit) /)
1056 3 : call splint(e_t%nlambda,e_t%lambda,integrand(:,icatom),ypp,Nfit,fitx,fity)
1057 3003 : integral1 = (sum(fity(1:Nfit))-(fity(1)+fity(Nfit))*half)*e_t%U_input(e_t%typat(icatom))/dble(Nfit-1)
1058 3 : if ( e_t%rank == 0 ) then
1059 3003 : do i=1,Nfit
1060 3003 : write(unit,'(2ES21.14)') fitx(i),fity(i)
1061 : end do
1062 : end if
1063 : !Unfortunately I don't trust this function and I don't have time to understand it.
1064 : !call spline_integrate(integral2,Nfit,dx,integrand(:,icatom))
1065 : !write(*,*) integral1, integral2
1066 :
1067 : !if ( abs(integral2-integral1) >= tol6 ) then
1068 : ! write(msg,'(1x,a,1x,f8.6,1x,a,1x,f8.6,1x,a,i4)') "Difference between two different ways of integration is", abs(integral2-integral1), &
1069 : ! "which is greater than", tol6, "for correlated atom",e_t%index_atom(icatom)
1070 : ! ABI_WARNING(msg)
1071 : !end if
1072 :
1073 6 : integral = integral+integral1
1074 : end do
1075 3 : if ( e_t%rank == 0 ) close(unit)
1076 :
1077 3 : ABI_FREE(ypp)
1078 3 : ABI_FREE(fitx)
1079 3 : ABI_FREE(fity)
1080 :
1081 3 : end subroutine entropyDMFT_integrate
1082 : !!***
1083 :
1084 : !!****f* ABINIT/m_entropyDMFT/entropyDMFT_destroy
1085 : !! NAME
1086 : !! entropyDMFT_destroy
1087 : !!
1088 : !! FUNCTION
1089 : !! FIXME: add description.
1090 : !!
1091 : !! COPYRIGHT
1092 : !! Copyright (C) 2014-2026 ABINIT group (J. Bieder)
1093 : !! This file is distributed under the terms of the
1094 : !! GNU General Public License, see ~abinit/COPYING
1095 : !! or http://www.gnu.org/copyleft/gpl.txt .
1096 : !!
1097 : !! INPUTS
1098 : !! argin(sizein)=description
1099 : !!
1100 : !! OUTPUT
1101 : !! argout(sizeout)=description
1102 : !!
1103 : !! SIDE EFFECTS
1104 : !!
1105 : !! NOTES
1106 : !!
1107 : !! SOURCE
1108 :
1109 3 : subroutine entropyDMFT_destroy(e_t)
1110 :
1111 : !Arguments ------------------------------------
1112 : type(entropyDMFT_t), intent(inout) :: e_t
1113 :
1114 3 : if ( allocated(e_t%index_atom) ) then
1115 3 : ABI_FREE(e_t%index_atom)
1116 : endif
1117 3 : if ( allocated(e_t%index_typat)) then
1118 3 : ABI_FREE(e_t%index_typat)
1119 : endif
1120 3 : if ( allocated(e_t%typat ) ) then
1121 3 : ABI_FREE(e_t%typat )
1122 : endif
1123 3 : if ( allocated(e_t%lpawu ) ) then
1124 3 : ABI_FREE(e_t%lpawu)
1125 : endif
1126 3 : if ( allocated(e_t%U_input ) ) then
1127 3 : ABI_FREE(e_t%U_input)
1128 : endif
1129 3 : if ( allocated(e_t%J_input ) ) then
1130 3 : ABI_FREE(e_t%J_input)
1131 : endif
1132 3 : if ( allocated(e_t%lambda ) ) then
1133 3 : ABI_FREE(e_t%lambda)
1134 : endif
1135 3 : if ( allocated(e_t%docc ) ) then
1136 3 : ABI_FREE(e_t%docc)
1137 : endif
1138 3 : if ( allocated(e_t%e_dc ) ) then
1139 3 : ABI_FREE(e_t%e_dc)
1140 : endif
1141 3 : if ( allocated(e_t%uij ) ) then
1142 3 : ABI_FREE(e_t%uij)
1143 : endif
1144 3 : e_t%isset = .FALSE.
1145 3 : end subroutine entropyDMFT_destroy
1146 : !!***
1147 0 : end module m_entropyDMFT
1148 : !!***
|