1  !
2  ! Copyright (C) 2010-2019 Samuel Ponce', Roxana Margine, Carla Verdi, Feliciano Giustino
3  ! Copyright (C) 2007-2009 Jesse Noffsinger, Brad Malone, Feliciano Giustino
4  !
5  ! This file is distributed under the terms of the GNU General Public
6  ! License. See the file `LICENSE' in the root directory of the
7  ! present distribution, or http://www.gnu.org/copyleft.gpl.txt .
8  !
9  !
10  !----------------------------------------------------------------------
11  MODULE close_epw
12  !----------------------------------------------------------------------
13  !!
14  !! This module contains routines related to deallocation and closing of files
15  !!
16  IMPLICIT NONE
17  !
18  CONTAINS
19    !
20    !
21    !----------------------------------------------------------------------------
22    SUBROUTINE iter_close
23    !----------------------------------------------------------------------------
24    !!
25    !! This subroutine opens all the files needed to save scattering rates for the IBTE.
26    !!
27    USE kinds,         ONLY : DP
28    USE io_var,        ONLY : iunepmat, iunsparseq,  &
29                              iunsparseqcb, iunepmatcb, iunepmatwp2
30    USE epwcom,        ONLY : iterative_bte, int_mob, carrier, etf_mem, assume_metal
31    USE epwcom,        ONLY : int_mob, carrier, ncarrier
32#if defined(__MPI)
33    USE parallel_include, ONLY : MPI_MODE_WRONLY, MPI_MODE_CREATE, MPI_INFO_NULL
34#endif
35    !
36    IMPLICIT NONE
37    !
38    ! Local variables
39    INTEGER :: ierr
40    !! Error status
41    !
42#if defined(__MPI)
43    IF (etf_mem == 1) then
44      CALL MPI_FILE_CLOSE(iunepmatwp2, ierr)
45      IF (ierr /= 0) CALL errore('iter_close', 'error in MPI_FILE_CLOSE', 1)
46    ENDIF
47#endif
48    !
49    IF (iterative_bte) THEN
50      IF ((int_mob .AND. carrier) .OR. ((.NOT. int_mob .AND. carrier) .AND. (ncarrier < 0.0)) .OR. assume_metal) THEN
51        CLOSE(iunepmat)
52        CLOSE(iunsparseq)
53      ENDIF
54      IF ((int_mob .AND. carrier) .OR. ((.NOT. int_mob .AND. carrier) .AND. (ncarrier > 0.0)) .AND. .NOT. assume_metal) THEN
55        CLOSE(iunepmatcb)
56        CLOSE(iunsparseqcb)
57      ENDIF  ! in all other cases it is still to decide which files to open
58    ENDIF
59    !
60    !----------------------------------------------------------------------------
61    END SUBROUTINE iter_close
62    !----------------------------------------------------------------------------
63    !
64    !----------------------------------------------------------------------
65    SUBROUTINE deallocate_epw()
66    !----------------------------------------------------------------------
67    !!
68    !!  deallocates the variables allocated by allocate_epw
69    !!  this routine is unchanged as of 3/9/09 and should be cleaned and fixed
70    !!  09/2009 Cleanup still necessary
71    !!  12/2009 Added variables from elph.f90
72    !!
73    !!  RM - Nov/Dec 2014
74    !!  Imported the noncolinear case implemented by xlzhang
75    !!
76    !----------------------------------------------------------------------
77    USE phcom,             ONLY : drc, dyn
78    USE noncollin_module,  ONLY : m_loc
79    USE control_lr,        ONLY : nbnd_occ
80    USE elph2,             ONLY : epsi, etf, wkf, wqf, &
81                                  zstar, xkf, xqf
82    USE klist_epw,         ONLY : xk_all, xk_loc, xk_cryst, et_all, et_loc, &
83                                  isk_loc, isk_all
84    USE epwcom,            ONLY : epbread, epwread
85    USE qpoint,            ONLY : igkq
86    !
87    IMPLICIT NONE
88    !
89    IF (epwread .AND. .NOT. epbread) THEN
90      !  EPW variables only
91      !
92      IF(ALLOCATED(etf))       DEALLOCATE(etf)
93      IF(ALLOCATED(xkf))       DEALLOCATE(xkf)
94      IF(ALLOCATED(wkf))       DEALLOCATE(wkf)
95      IF(ALLOCATED(xqf))       DEALLOCATE(xqf)
96      IF(ALLOCATED(wqf))       DEALLOCATE(wqf)
97      IF(ALLOCATED(et_all))    DEALLOCATE(et_all)
98      !
99    ELSE
100      !
101      IF(ASSOCIATED(igkq))    DEALLOCATE(igkq)
102      IF(ALLOCATED(dyn))      DEALLOCATE(dyn)
103      IF(ALLOCATED(epsi))     DEALLOCATE(epsi)
104      IF(ALLOCATED(zstar))    DEALLOCATE(zstar)
105      IF(ALLOCATED(nbnd_occ)) DEALLOCATE(nbnd_occ)
106      IF(ALLOCATED(m_loc))    DEALLOCATE(m_loc)
107      IF(ALLOCATED(drc))      DEALLOCATE(drc)
108      !
109      !  EPW variables
110      !
111      IF(ALLOCATED(etf))       DEALLOCATE(etf)
112      IF(ALLOCATED(xkf))       DEALLOCATE(xkf)
113      IF(ALLOCATED(wkf))       DEALLOCATE(wkf)
114      IF(ALLOCATED(xqf))       DEALLOCATE(xqf)
115      IF(ALLOCATED(wqf))       DEALLOCATE(wqf)
116      IF(ALLOCATED(xk_all))    DEALLOCATE(xk_all)
117      IF(ALLOCATED(xk_loc))    DEALLOCATE(xk_loc)
118      IF(ALLOCATED(xk_cryst))  DEALLOCATE(xk_cryst)
119      IF(ALLOCATED(et_all))    DEALLOCATE(et_all)
120      IF(ALLOCATED(et_loc))    DEALLOCATE(et_loc)
121      IF(ALLOCATED(isk_loc))   DEALLOCATE(isk_loc)
122      IF(ALLOCATED(isk_all))   DEALLOCATE(isk_all)
123    ENDIF ! epwread .AND. .NOT. epbread
124    !
125    !---------------------------------------------------------------
126    END SUBROUTINE deallocate_epw
127    !---------------------------------------------------------------
128    !
129    !------------------------------------------------------------------
130    SUBROUTINE close_final
131    !------------------------------------------------------------------
132    !
133    USE units_lr,  ONLY : iuwfc
134    USE units_ph,  ONLY : iudwf, iudrho
135    USE phcom,     ONLY : fildrho
136    USE mp_global, ONLY : me_pool,root_pool
137    USE io_var,    ONLY : iunepmatwe
138    USE epwcom,    ONLY : etf_mem
139    !
140    IMPLICIT NONE
141    !
142    !IF (etf_mem == 1 .OR. etf_mem == 2) THEN
143    !  CLOSE(UNIT = iunepmatwe, STATUS = 'delete')
144    !ENDIF
145    !
146    CLOSE(UNIT = iuwfc, STATUS = 'keep')
147    CLOSE(UNIT = iudwf, STATUS = 'keep')
148    IF (me_pool == root_pool) THEN
149      IF (fildrho/=' ') CLOSE(UNIT = iudrho, STATUS = 'keep')
150    ENDIF
151    !
152    !------------------------------------------------------------------
153    END SUBROUTINE close_final
154    !------------------------------------------------------------------
155    !
156  !------------------------------------------------------------------
157  END MODULE close_epw
158  !------------------------------------------------------------------
159