Line data Source code
1 : !--------------------------------------------------------------------------------
2 : ! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
3 : ! This file is part of FLEUR and available as free software under the conditions
4 : ! of the MIT license as expressed in the LICENSE file in more detail.
5 : !--------------------------------------------------------------------------------
6 :
7 : MODULE m_eig66_io
8 : use m_juDFT
9 : use m_types_mat
10 : USE m_eig66_data
11 : IMPLICIT NONE
12 : PRIVATE
13 :
14 : PUBLIC open_eig, close_eig, reset_eig
15 : PUBLIC read_eig, write_eig
16 : CONTAINS
17 :
18 154 : FUNCTION open_eig(mpi_comm, nmat, neig, nkpts, jspins, &
19 : l_noco, l_create, l_real, l_soc, l_readonly, l_olap, n_size, mode_in, filename) &
20 : RESULT(id)
21 : USE m_eig66_hdf, ONLY: open_eig_hdf => open_eig
22 : USE m_eig66_DA, ONLY: open_eig_DA => open_eig
23 : USE m_eig66_mem, ONLY: open_eig_mem => open_eig
24 : USE m_eig66_MPI, ONLY: open_eig_mpi => open_eig
25 : IMPLICIT NONE
26 : INTEGER, INTENT(IN) :: nmat, neig, nkpts, jspins, mpi_comm
27 : LOGICAL, INTENT(IN) :: l_noco, l_readonly, l_create, l_real, l_soc, l_olap
28 : INTEGER, INTENT(IN), OPTIONAL :: n_size, mode_in
29 : CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: filename
30 : INTEGER:: id, mode
31 : CHARACTER(LEN=20) :: arg
32 :
33 : INTEGER:: neig_local, isize, err
34 154 : if (l_soc) THEN
35 30 : neig_local = 2*neig
36 : else
37 124 : neig_local = neig
38 : endif
39 154 : mode = -1
40 154 : IF (PRESENT(mode_in)) mode = mode_in
41 :
42 154 : IF (mode < 0) THEN
43 : !Use default mode
44 : #ifdef CPP_MPI
45 154 : CALL MPI_COMM_SIZE(mpi_comm, isize, err)
46 154 : IF (isize > 1) THEN
47 154 : mode = MPI_mode
48 : ELSE
49 0 : mode = MEM_mode
50 : ENDIF
51 : #else
52 : mode = MEM_mode
53 : #endif
54 : !check if default was given on command-line
55 154 : arg=TRIM(juDFT_string_for_argument("-eig"))
56 :
57 154 : IF (index(arg,"mpi")>0) mode = MPI_mode
58 154 : IF (index(arg,"mem")>0) mode = MEM_mode
59 154 : IF (index(arg,"da")>0) mode = DA_mode
60 154 : IF (index(arg,"hdf")>0) mode = HDF_mode
61 : ENDIF
62 : !Check if mode is available
63 : #ifndef CPP_MPI
64 : IF (mode == MPI_mode) CALL juDFT_error("MPI-mode not available. Recompile with CPP_MPI", calledby="eig66_io")
65 : #else
66 154 : CALL MPI_COMM_SIZE(mpi_comm, isize, err)
67 154 : IF (isize > 1 .AND. ((mode == DA_mode .OR. mode == mem_mode))) &
68 0 : CALL juDFT_error("In a parallel calculation MEM/DA-mode are not available", calledby="eig66_io")
69 : #endif
70 : #ifndef CPP_HDF
71 : IF (mode == HDF_mode) CALL juDFT_error("HDF-mode not available. Recompile with CPP_HDF", calledby="eig66_io")
72 : #endif
73 :
74 154 : id = eig66_data_newid(mode)
75 :
76 : !PRINT *,"open_eig:",id,mode
77 :
78 154 : CALL timestart("Open file/memory for IO of eig66")
79 0 : SELECT CASE (eig66_data_mode(id))
80 : CASE (DA_mode)
81 0 : CALL open_eig_DA(id, nmat, neig_local, nkpts, jspins, l_create, l_real, l_soc, l_olap, filename)
82 : CASE (hdf_mode)
83 0 : CALL open_eig_HDF(id, mpi_comm, nmat, neig_local, nkpts, jspins, l_create, l_real, l_soc, l_readonly, l_olap, filename)
84 : CASE (mem_mode)
85 0 : CALL open_eig_MEM(id, nmat, neig_local, nkpts, jspins, l_create, l_real, l_soc, l_noco, l_olap, filename)
86 : CASE (mpi_mode)
87 308 : CALL open_eig_MPI(id, mpi_comm, nmat, neig_local, nkpts, jspins, l_create, l_real, l_soc, l_noco, l_olap, n_size, filename)
88 : CASE DEFAULT
89 154 : CALL juDFT_error("Invalid IO-mode in eig66_io")
90 : END SELECT
91 154 : CALL timestop("Open file/memory for IO of eig66")
92 154 : END FUNCTION open_eig
93 :
94 132 : SUBROUTINE close_eig(id, filename)
95 : USE m_eig66_hdf, ONLY: close_eig_hdf => close_eig
96 : USE m_eig66_DA, ONLY: close_eig_DA => close_eig
97 : USE m_eig66_mem, ONLY: close_eig_MEM => close_eig
98 : USE m_eig66_MPI, ONLY: close_eig_MPI => close_eig
99 : IMPLICIT NONE
100 : INTEGER, INTENT(IN) :: id
101 : CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: filename
102 : INTEGER :: mode
103 132 : mode = eig66_data_mode(id)
104 : !PRINT*,"close_eig:",id,mode
105 0 : SELECT CASE (mode)
106 : CASE (DA_mode)
107 0 : CALL close_eig_DA(id, filename)
108 : CASE (hdf_mode)
109 0 : CALL close_eig_HDF(id, filename)
110 : CASE (mem_mode)
111 0 : CALL close_eig_Mem(id, filename=filename)
112 : CASE (MPI_mode)
113 264 : CALL close_eig_MPI(id, filename=filename)
114 : CASE (-1)
115 132 : CALL juDFT_error("ID not assigned in close_eig", calledby="eig66_io")
116 : END SELECT
117 :
118 132 : END SUBROUTINE close_eig
119 :
120 11532 : subroutine read_eig(id, nk, jspin, neig, eig, list, zmat, smat,kpts,input,noco,nococonv,sym,atoms,cell)
121 : use m_types
122 : use m_types_nococonv
123 : use m_trafo
124 : IMPLICIT NONE
125 : INTEGER, INTENT(IN) :: id, nk, jspin
126 : INTEGER, INTENT(OUT), OPTIONAL :: neig
127 : REAL, INTENT(OUT), OPTIONAL :: eig(:)
128 : INTEGER, INTENT(IN), OPTIONAL :: list(:)
129 : TYPE(t_mat), INTENT(INOUT), OPTIONAL :: zmat, smat
130 : !for the rotation to IBZ we need:
131 : TYPE(t_kpts),INTENT(IN),OPTIONAL :: kpts
132 : TYPE(t_input),INTENT(IN),OPTIONAL :: input
133 : TYPE(t_noco),INTENT(IN),OPTIONAL :: noco
134 : TYPE(t_nococonv),INTENT(IN),OPTIONAL:: nococonv
135 : TYPE(t_sym),INTENT(IN),OPTIONAL :: sym
136 : TYPE(t_atoms),INTENT(IN),OPTIONAL :: atoms
137 : TYPE(t_cell),INTENT(IN),OPTIONAL :: cell
138 :
139 :
140 : LOGICAL:: ibz
141 11532 : TYPE(t_mat):: tmp_mat
142 : INTEGER :: ikp,iop
143 11532 : TYPE(t_lapw):: lapw_nk,lapw_ikp
144 11532 : ibz=.true.
145 11532 : if (present(kpts)) THEN
146 0 : if (nk>kpts%nkpt) ibz=.false.
147 : endif
148 :
149 :
150 : if(ibz) then
151 22582 : call read_eig_ibz(id,nk,jspin,neig, eig=eig, list=list,zmat=zmat,smat=smat)
152 : else
153 0 : if (present(smat)) call judft_error("SMAT cannot be rotated")
154 0 : call tmp_mat%init(zmat)
155 :
156 0 : ikp = kpts%bkp(nk) ! parent k-point
157 0 : iop = kpts%bksym(nk) ! connecting symm
158 :
159 0 : call read_eig_ibz(id,ikp, jspin,zmat=tmp_mat, list=list, eig=eig)
160 :
161 0 : CALL lapw_nk%init(input, noco, nococonv, kpts, atoms, sym, nk, cell)
162 0 : CALL lapw_ikp%init(input, noco, nococonv, kpts, atoms, sym, ikp, cell)
163 0 : call waveftrafo_gen_zmat(tmp_mat, ikp, iop, kpts, sym, jspin, tmp_mat%matsize2, lapw_ikp, lapw_nk, zmat)
164 : endif
165 11532 : end subroutine read_eig
166 :
167 11532 : SUBROUTINE read_eig_ibz(id, nk, jspin, neig, eig, list, zmat, smat)
168 : USE m_eig66_hdf, ONLY: read_eig_hdf => read_eig
169 : USE m_eig66_DA, ONLY: read_eig_DA => read_eig
170 : USE m_eig66_mem, ONLY: read_eig_mem => read_eig
171 : USE m_eig66_MPI, ONLY: read_eig_MPI => read_eig
172 : IMPLICIT NONE
173 : INTEGER, INTENT(IN) :: id, nk, jspin
174 : INTEGER, INTENT(OUT), OPTIONAL :: neig
175 : REAL, INTENT(OUT), OPTIONAL :: eig(:)
176 : INTEGER, INTENT(IN), OPTIONAL :: list(:)
177 : TYPE(t_mat), INTENT(INOUT), OPTIONAL :: zmat, smat
178 : INTEGER::n
179 11532 : CALL timestart("IO (read)")
180 0 : SELECT CASE (eig66_data_mode(id))
181 : CASE (DA_mode)
182 0 : CALL read_eig_DA(id, nk, jspin, neig, eig, list, zmat, smat)
183 : CASE (hdf_mode)
184 0 : CALL read_eig_hdf(id, nk, jspin, neig, eig, list, zmat, smat)
185 : CASE (mem_mode)
186 0 : CALL read_eig_mem(id, nk, jspin, neig, eig, list, zmat, smat)
187 : CASE (mpi_mode)
188 22582 : CALL read_eig_mpi(id, nk, jspin, neig, eig, list, zmat, smat)
189 : CASE (-1)
190 11532 : CALL juDFT_error("Could not read eig-file before opening", calledby="eig66_io")
191 : END SELECT
192 11532 : CALL timestop("IO (read)")
193 11532 : END SUBROUTINE read_eig_ibz
194 :
195 8596 : SUBROUTINE write_eig(id, nk, jspin, neig, neig_total, eig, n_start, n_end, zmat, smat)
196 : USE m_eig66_hdf, ONLY: write_eig_hdf => write_eig
197 : USE m_eig66_DA, ONLY: write_eig_DA => write_eig
198 : USE m_eig66_mem, ONLY: write_eig_MEM => write_eig
199 : USE m_eig66_MPI, ONLY: write_eig_MPI => write_eig
200 : IMPLICIT NONE
201 : INTEGER, INTENT(IN) :: id, nk, jspin
202 : INTEGER, INTENT(IN), OPTIONAL :: neig, neig_total, n_start, n_end
203 : REAL, INTENT(IN), OPTIONAL :: eig(:)
204 : TYPE(t_Mat), INTENT(IN), OPTIONAL :: zmat, smat
205 8596 : CALL timestart("IO (write)")
206 0 : SELECT CASE (eig66_data_mode(id))
207 : CASE (da_mode)
208 0 : CALL write_eig_DA(id, nk, jspin, neig, neig_total, eig, n_start, n_end, zmat, smat)
209 : CASE (hdf_mode)
210 0 : CALL write_eig_HDF(id, nk, jspin, neig, neig_total, eig, n_start, n_end, zmat, smat)
211 : CASE (mem_mode)
212 0 : CALL write_eig_Mem(id, nk, jspin, neig, neig_total, eig, n_start, n_end, zmat, smat)
213 : CASE (MPI_mode)
214 11752 : CALL write_eig_MPI(id, nk, jspin, neig, neig_total, eig, n_start, n_end, zmat, smat)
215 : CASE (-1)
216 8596 : CALL juDFT_error("Could not write eig-file before opening", calledby="eig66_io")
217 : END SELECT
218 8596 : CALL timestop("IO (write)")
219 8596 : END SUBROUTINE write_eig
220 :
221 0 : SUBROUTINE reset_eig(id, l_soc)
222 : USE m_eig66_MPI, ONLY: reset_eig_MPI => reset_eig
223 : INTEGER, INTENT(IN) :: id
224 : LOGICAL, INTENT(IN) :: l_soc
225 :
226 0 : SELECT CASE (eig66_data_mode(id))
227 : CASE (MPI_mode)
228 0 : CALL reset_eig_MPI(id, l_soc)
229 : END SELECT
230 :
231 0 : END SUBROUTINE reset_eig
232 :
233 : END MODULE m_eig66_io
|