Line data Source code
1 : !--------------------------------------------------------------------------------
2 : ! Copyright (c) 2018 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 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
8 : !
9 : ! This module is used to write out data that can be used to generate augmented
10 : ! DOS or bandstructure plots. For the augmentation additional data, e.g., weights
11 : ! for the orbital character of states, is stored.
12 : !
13 : ! GM' 2018
14 : !
15 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16 :
17 : MODULE m_banddos_io
18 :
19 : #ifdef CPP_HDF
20 :
21 : USE hdf5
22 : USE m_hdf_tools
23 :
24 : IMPLICIT NONE
25 :
26 : PUBLIC openBandDOSFile, closeBandDOSFile, writeBandData, writedosData
27 :
28 : CONTAINS
29 :
30 190 : SUBROUTINE openBandDOSFile(fileID, input, atoms, cell, kpts, sym, banddos, eFermiPrev)
31 :
32 : USE m_types_input
33 : USE m_types_atoms
34 : USE m_types_cell
35 : USE m_types_kpts
36 : USE m_types_sym
37 : USE m_types_banddos
38 :
39 : USE hdf5
40 : !USE m_cdn_io
41 :
42 : TYPE(t_input), INTENT(IN) :: input
43 : TYPE(t_atoms), INTENT(IN) :: atoms
44 : TYPE(t_cell), INTENT(IN) :: cell
45 : TYPE(t_kpts), INTENT(IN) :: kpts
46 : TYPE(t_sym), INTENT(IN) :: sym
47 : TYPE(t_banddos), INTENT(IN) :: banddos
48 :
49 : INTEGER(HID_T), INTENT(OUT) :: fileID
50 : REAL,INTENT(IN) :: eFermiPrev
51 :
52 :
53 : LOGICAL :: l_exist
54 : CHARACTER(LEN=30) :: filename
55 : INTEGER(HID_T) :: metaGroupID
56 : INTEGER(HID_T) :: generalGroupID
57 : INTEGER(HID_T) :: cellGroupID
58 : INTEGER(HID_T) :: atomsGroupID
59 : INTEGER(HID_T) :: kptsGroupID
60 :
61 : INTEGER(HID_T) :: stringTypeID
62 : INTEGER(SIZE_T) :: stringLength
63 :
64 : INTEGER(HID_T) :: bravaisMatrixSpaceID, bravaisMatrixSetID
65 : INTEGER(HID_T) :: reciprocalCellSpaceID, reciprocalCellSetID
66 : INTEGER(HID_T) :: rotMatricesSpaceID, rotMatricesSetID
67 : INTEGER(HID_T) :: transVecsSpaceID, transVecsSetID
68 :
69 : INTEGER(HID_T) :: atomPosSpaceID, atomPosSetID
70 : INTEGER(HID_T) :: atomicNumbersSpaceID, atomicNumbersSetID
71 : INTEGER(HID_T) :: equivAtomsClassSpaceID, equivAtomsClassSetID
72 :
73 : INTEGER(HID_T) :: kptCoordSpaceID, kptCoordSetID
74 : INTEGER(HID_T) :: kptWeightSpaceID, kptWeightSetID
75 : INTEGER(HID_T) :: kptSPLabelsSpaceID, kptSPLabelsSetID
76 : INTEGER(HID_T) :: kptsSPIndicesSpaceID, kptsSPIndicesSetID
77 :
78 : INTEGER :: iType, j, iAtom
79 :
80 : INTEGER :: hdfError, dimsInt(7)
81 : INTEGER :: version
82 :
83 : LOGICAL :: l_error
84 :
85 5 : INTEGER :: atomicNumbers(atoms%nat)
86 5 : INTEGER :: equivAtomsGroup(atoms%nat)
87 :
88 : INTEGER(HSIZE_T) :: dims(7)
89 :
90 5 : version = 2
91 5 : filename = 'banddos.hdf'
92 :
93 5 : INQUIRE(FILE=TRIM(ADJUSTL(filename)),EXIST=l_exist)
94 5 : IF(l_exist) THEN
95 3 : CALL system('rm '//TRIM(ADJUSTL(filename)))
96 : END IF
97 :
98 5 : CALL h5fcreate_f(TRIM(ADJUSTL(filename)), H5F_ACC_TRUNC_F, fileID, hdfError, H5P_DEFAULT_F, H5P_DEFAULT_F)
99 :
100 5 : CALL h5gcreate_f(fileID, '/meta', metaGroupID, hdfError)
101 5 : CALL io_write_attint0(metaGroupID,'version',version)
102 5 : CALL h5gclose_f(metaGroupID, hdfError)
103 :
104 :
105 :
106 5 : CALL h5gcreate_f(fileID, '/general', generalGroupID, hdfError)
107 5 : CALL io_write_attint0(generalGroupID,'spins',input%jspins)
108 5 : CALL io_write_attreal0(generalGroupID,'lastFermiEnergy',eFermiPrev)
109 5 : CALL io_write_attreal0(generalGroupID,'valenceCharge',input%zelec)
110 5 : CALL io_write_attlog0(generalGroupID,'bandUnfolding',banddos%unfoldband)
111 5 : CALL h5gclose_f(generalGroupID, hdfError)
112 :
113 5 : CALL h5gcreate_f(fileID, '/cell', cellGroupID, hdfError)
114 :
115 5 : CALL io_write_attint0(cellGroupID,'nop',sym%nop)
116 5 : CALL io_write_attint0(cellGroupID,'nop2',sym%nop2)
117 5 : CALL io_write_attlog0(cellGroupID,'film',input%film)
118 :
119 15 : dims(:2)=(/3,3/)
120 40 : dimsInt=dims
121 5 : CALL h5screate_simple_f(2,dims(:2),bravaisMatrixSpaceID,hdfError)
122 5 : CALL h5dcreate_f(cellGroupID, "bravaisMatrix", H5T_NATIVE_DOUBLE, bravaisMatrixSpaceID, bravaisMatrixSetID, hdfError)
123 5 : CALL h5sclose_f(bravaisMatrixSpaceID,hdfError)
124 5 : CALL io_write_real2(bravaisMatrixSetID,(/1,1/),dimsInt(:2),"amat",cell%amat)
125 5 : CALL h5dclose_f(bravaisMatrixSetID, hdfError)
126 :
127 15 : dims(:2)=(/3,3/)
128 40 : dimsInt=dims
129 5 : CALL h5screate_simple_f(2,dims(:2),reciprocalCellSpaceID,hdfError)
130 5 : CALL h5dcreate_f(cellGroupID, "reciprocalCell", H5T_NATIVE_DOUBLE, reciprocalCellSpaceID, reciprocalCellSetID, hdfError)
131 5 : CALL h5sclose_f(reciprocalCellSpaceID,hdfError)
132 5 : CALL io_write_real2(reciprocalCellSetID,(/1,1/),dimsInt(:2),"bmar",cell%bmat)
133 5 : CALL h5dclose_f(reciprocalCellSetID, hdfError)
134 :
135 20 : dims(:3)=(/3,3,sym%nop/)
136 40 : dimsInt=dims
137 5 : CALL h5screate_simple_f(3,dims(:3),rotMatricesSpaceID,hdfError)
138 5 : CALL h5dcreate_f(cellGroupID, "symRotMatrices", H5T_NATIVE_INTEGER, rotMatricesSpaceID, rotMatricesSetID, hdfError)
139 5 : CALL h5sclose_f(rotMatricesSpaceID,hdfError)
140 5 : CALL io_write_integer3(rotMatricesSetID,(/1,1,1/),dimsInt(:3),"mrot",sym%mrot(:,:,:sym%nop))
141 5 : CALL h5dclose_f(rotMatricesSetID, hdfError)
142 :
143 15 : dims(:2)=(/3,sym%nop/)
144 40 : dimsInt=dims
145 5 : CALL h5screate_simple_f(2,dims(:2),transVecsSpaceID,hdfError)
146 5 : CALL h5dcreate_f(cellGroupID, "symTransVecs", H5T_NATIVE_DOUBLE, transVecsSpaceID, transVecsSetID, hdfError)
147 5 : CALL h5sclose_f(transVecsSpaceID,hdfError)
148 5 : CALL io_write_real2(transVecsSetID,(/1,1/),dimsInt(:2),"tau",sym%tau(:,:sym%nop))
149 5 : CALL h5dclose_f(transVecsSetID, hdfError)
150 :
151 5 : CALL h5gclose_f(cellGroupID, hdfError)
152 :
153 5 : iAtom = 0
154 15 : DO iType = 1, atoms%ntype
155 29 : DO j = 1, atoms%neq(iType)
156 14 : iAtom = iAtom + 1
157 14 : atomicNumbers(iAtom) = atoms%nz(iType)
158 24 : equivAtomsGroup(iAtom) = iType
159 : END DO
160 : END DO
161 :
162 5 : CALL h5gcreate_f(fileID, '/atoms', atomsGroupID, hdfError)
163 5 : CALL io_write_attint0(atomsGroupID,'nAtoms',atoms%nat)
164 5 : CALL io_write_attint0(atomsGroupID,'nTypes',atoms%ntype)
165 :
166 15 : dims(:2)=(/3,atoms%nat/)
167 40 : dimsInt=dims
168 5 : CALL h5screate_simple_f(2,dims(:2),atomPosSpaceID,hdfError)
169 5 : CALL h5dcreate_f(atomsGroupID, "positions", H5T_NATIVE_DOUBLE, atomPosSpaceID, atomPosSetID, hdfError)
170 5 : CALL h5sclose_f(atomPosSpaceID,hdfError)
171 5 : CALL io_write_real2(atomPosSetID,(/1,1/),dimsInt(:2),"taual",atoms%taual)
172 5 : CALL h5dclose_f(atomPosSetID, hdfError)
173 :
174 10 : dims(:1)=(/atoms%nat/)
175 40 : dimsInt=dims
176 5 : CALL h5screate_simple_f(1,dims(:1),atomicNumbersSpaceID,hdfError)
177 5 : CALL h5dcreate_f(atomsGroupID, "atomicNumbers", H5T_NATIVE_INTEGER, atomicNumbersSpaceID, atomicNumbersSetID, hdfError)
178 5 : CALL h5sclose_f(atomicNumbersSpaceID,hdfError)
179 5 : CALL io_write_integer1(atomicNumbersSetID,(/1/),dimsInt(:1),"atomicNumbers",atomicNumbers)
180 5 : CALL h5dclose_f(atomicNumbersSetID, hdfError)
181 :
182 10 : dims(:1)=(/atoms%nat/)
183 40 : dimsInt=dims
184 5 : CALL h5screate_simple_f(1,dims(:1),equivAtomsClassSpaceID,hdfError)
185 5 : CALL h5dcreate_f(atomsGroupID, "equivAtomsGroup", H5T_NATIVE_INTEGER, equivAtomsClassSpaceID, equivAtomsClassSetID, hdfError)
186 5 : CALL h5sclose_f(equivAtomsClassSpaceID,hdfError)
187 5 : CALL io_write_integer1(equivAtomsClassSetID,(/1/),dimsInt(:1),"equivAtomsGroup",equivAtomsGroup)
188 5 : CALL h5dclose_f(equivAtomsClassSetID, hdfError)
189 :
190 5 : CALL h5gclose_f(atomsGroupID, hdfError)
191 :
192 5 : CALL h5gcreate_f(fileID, '/kpts', kptsGroupID, hdfError)
193 :
194 5 : CALL io_write_attint0(kptsGroupID,'nkpt',kpts%nkpt)
195 5 : CALL io_write_attint0(kptsGroupID,'nSpecialPoints',kpts%numSpecialPoints)
196 :
197 15 : dims(:2)=(/3,kpts%nkpt/)
198 40 : dimsInt=dims
199 5 : CALL h5screate_simple_f(2,dims(:2),kptCoordSpaceID,hdfError)
200 5 : CALL h5dcreate_f(kptsGroupID, "coordinates", H5T_NATIVE_DOUBLE, kptCoordSpaceID, kptCoordSetID, hdfError)
201 5 : CALL h5sclose_f(kptCoordSpaceID,hdfError)
202 5 : CALL io_write_real2(kptCoordSetID,(/1,1/),dimsInt(:2),"bk",kpts%bk)
203 5 : CALL h5dclose_f(kptCoordSetID, hdfError)
204 :
205 10 : dims(:1)=(/kpts%nkpt/)
206 40 : dimsInt=dims
207 5 : CALL h5screate_simple_f(1,dims(:1),kptWeightSpaceID,hdfError)
208 5 : CALL h5dcreate_f(kptsGroupID, "weights", H5T_NATIVE_DOUBLE, kptWeightSpaceID, kptWeightSetID, hdfError)
209 5 : CALL h5sclose_f(kptWeightSpaceID,hdfError)
210 5 : CALL io_write_real1(kptWeightSetID,(/1/),dimsInt(:1),"wtkpt",kpts%wtkpt)
211 5 : CALL h5dclose_f(kptWeightSetID, hdfError)
212 :
213 5 : IF (ALLOCATED(kpts%specialPointIndices)) THEN
214 2 : stringLength = LEN(kpts%specialPointNames(:))
215 2 : CALL h5tcopy_f(H5T_NATIVE_CHARACTER, stringTypeID, hdfError)
216 2 : CALL h5tset_size_f(stringTypeID, stringLength, hdfError)
217 2 : CALL h5tset_strpad_f(stringTypeID, H5T_STR_SPACEPAD_F, hdfError)
218 2 : CALL h5tset_cset_f(stringTypeID, H5T_CSET_ASCII_F, hdfError)
219 4 : dims(:1)=(/kpts%numSpecialPoints/)
220 16 : dimsInt=dims
221 2 : CALL h5screate_simple_f(1,dims(:1),kptSPLabelsSpaceID,hdfError)
222 2 : CALL h5dcreate_f(kptsGroupID, "specialPointLabels", stringTypeID, kptSPLabelsSpaceID, kptSPLabelsSetID, hdfError)
223 2 : CALL h5tclose_f(stringTypeID,hdfError)
224 2 : CALL h5sclose_f(kptSPLabelsSpaceID,hdfError)
225 2 : CALL io_write_string1(kptSPLabelsSetID,dimsInt(:1),LEN(kpts%specialPointNames(:)),kpts%specialPointNames)
226 2 : CALL h5dclose_f(kptSPLabelsSetID, hdfError)
227 :
228 4 : dims(:1)=(/kpts%numSpecialPoints/)
229 16 : dimsInt=dims
230 2 : CALL h5screate_simple_f(1,dims(:1),kptsSPIndicesSpaceID,hdfError)
231 2 : CALL h5dcreate_f(kptsGroupID, "specialPointIndices", H5T_NATIVE_INTEGER, kptsSPIndicesSpaceID, kptsSPIndicesSetID, hdfError)
232 2 : CALL h5sclose_f(kptsSPIndicesSpaceID,hdfError)
233 2 : CALL io_write_integer1(kptsSPIndicesSetID,(/1/),dimsInt(:1),"indices",kpts%specialPointIndices)
234 2 : CALL h5dclose_f(kptsSPIndicesSetID, hdfError)
235 : END IF
236 :
237 5 : CALL h5gclose_f(kptsGroupID, hdfError)
238 :
239 5 : END SUBROUTINE
240 :
241 5 : SUBROUTINE closeBandDOSFile(fileID)
242 :
243 : INTEGER(HID_T), INTENT(IN) :: fileID
244 :
245 : INTEGER hdfError
246 :
247 5 : CALL h5fclose_f(fileID, hdfError)
248 :
249 5 : END SUBROUTINE
250 :
251 27 : SUBROUTINE writeBandData(fileID,kpts,name_of_dos,weight_name,weight_eig,eig)
252 : USE m_types_kpts
253 : character(len=*),intent(in) :: name_of_dos
254 : character(len=*),intent(in) :: weight_name
255 : real,intent(in) :: weight_eig(:,:,:)
256 : real,optional,intent(in) :: eig(:,:,:)
257 : type(t_kpts),intent(in) :: kpts
258 :
259 :
260 : INTEGER(HID_T), INTENT(IN) :: fileID
261 : INTEGER :: n
262 :
263 : INTEGER(HID_T) :: BSGroupID,groupID
264 : INTEGER :: hdfError
265 :
266 27 : if (io_groupexists(fileID,name_of_dos)) THEN
267 25 : call io_gopen(fileID,name_of_dos,groupID)
268 : ELSE
269 2 : call h5gcreate_f(fileID, name_of_dos, GroupID, hdfError)
270 : endif
271 27 : if (io_groupexists(GroupID,"BS")) THEN
272 25 : call io_gopen(GroupID,"BS",BSgroupID)
273 : ELSE
274 2 : CALL h5gcreate_f(GroupID, "BS", BSGroupID, hdfError)
275 : endif
276 27 : IF (PRESENT(eig)) THEN
277 26 : if (.not.io_dataexists(BSGroupID,"eigenvalues")) call io_write_var(BSGroupID,"eigenvalues",eig)
278 : END IF
279 27 : call io_write_var(BSGroupID,weight_name,weight_eig(:,:,:))
280 27 : CALL h5gclose_f(BSGroupID, hdfError)
281 27 : CALL h5gclose_f(GroupID, hdfError)
282 27 : END SUBROUTINE
283 :
284 82 : SUBROUTINE writedosData(fileID,name_of_dos,e_grid,weight_name,dos)
285 : character(len=*),intent(in) :: name_of_dos
286 : character(len=*),intent(in) :: weight_name
287 : real,intent(in):: e_grid(:),dos(:,:)
288 : INTEGER(HID_T), INTENT(IN) :: fileID
289 :
290 : INTEGER :: n
291 :
292 : INTEGER(HID_T) :: DOSGroupID,groupID
293 : INTEGER :: hdfError
294 :
295 82 : if (io_groupexists(fileID,name_of_dos)) THEN
296 77 : call io_gopen(fileID,name_of_dos,groupID)
297 : ELSE
298 5 : call h5gcreate_f(fileID, name_of_dos, GroupID, hdfError)
299 : endif
300 82 : if (io_groupexists(groupID,"DOS")) then
301 77 : call io_gopen(groupID,"DOS",DOSGroupID)
302 : ELSE
303 5 : CALL h5gcreate_f(GroupID, "DOS", DOSGroupID, hdfError)
304 : endif
305 82 : if (.not.io_dataexists(DOSGroupID,"energyGrid")) call io_write_var(DOSGroupID,"energyGrid",e_grid)
306 82 : print *,name_of_dos,weight_name
307 82 : call io_write_var(DOSGroupID,weight_name,dos(:,:))
308 82 : CALL h5gclose_f(DOSGroupID, hdfError)
309 82 : CALL h5gclose_f(GroupID, hdfError)
310 :
311 82 : END SUBROUTINE
312 :
313 82 : SUBROUTINE writeEVData(fileID,name_of_dos,weight_name,eig,weight_eig)
314 : character(len=*),intent(in) :: name_of_dos
315 : character(len=*),intent(in) :: weight_name
316 : real,intent(in) :: eig(:,:,:),weight_eig(:,:,:)
317 :
318 : INTEGER(HID_T), INTENT(IN) :: fileID
319 : INTEGER :: n
320 :
321 : INTEGER(HID_T) :: EVGroupID,groupID
322 : INTEGER :: hdfError
323 :
324 82 : if (io_groupexists(fileID,name_of_dos)) THEN
325 82 : call io_gopen(fileID,name_of_dos,groupID)
326 : ELSE
327 0 : call h5gcreate_f(fileID, name_of_dos, GroupID, hdfError)
328 : endif
329 82 : if (io_groupexists(GroupID,"EV")) THEN
330 77 : call io_gopen(GroupID,"EV",EVgroupID)
331 : ELSE
332 5 : CALL h5gcreate_f(GroupID, "EV", EVGroupID, hdfError)
333 : endif
334 82 : if (.not.io_dataexists(EVGroupID,"eigenvalues")) call io_write_var(EVGroupID,"eigenvalues",eig)
335 82 : call io_write_var(EVGroupID,weight_name,weight_eig(:,:,:))
336 82 : CALL h5gclose_f(EVGroupID, hdfError)
337 82 : CALL h5gclose_f(GroupID, hdfError)
338 82 : END SUBROUTINE
339 :
340 2 : SUBROUTINE io_write_string1(datasetID,dims,stringLength,dataArray)
341 :
342 : USE hdf5
343 : USE m_hdf_tools4
344 :
345 : IMPLICIT NONE
346 :
347 : INTEGER(HID_T), INTENT(IN) :: datasetID
348 : INTEGER, INTENT(IN) :: dims(1)
349 : INTEGER, INTENT(IN) :: stringLength
350 : CHARACTER(LEN=stringLength), INTENT(IN) :: dataArray(:)
351 :
352 : INTEGER :: hdfError
353 : INTEGER(HID_T) :: dataspaceID, memSpaceID
354 : INTEGER(HID_T) :: stringTypeID
355 : INTEGER(HID_t) :: trans
356 : INTEGER(HSIZE_t) :: memOffset(1), fncount(1)
357 : INTEGER(HSIZE_t) :: dimsHDF(1)
358 : INTEGER(SIZE_T) :: stringLengthHDF
359 :
360 2 : stringLengthHDF = stringLength
361 4 : dimsHDF(:) = dims(:)
362 2 : memOffset(:) = 0
363 4 : fnCount(:) = dims(:)
364 :
365 2 : trans = gettransprop()
366 :
367 2 : CALL h5tcopy_f(H5T_NATIVE_CHARACTER, stringTypeID, hdfError)
368 2 : CALL h5tset_size_f(stringTypeID, stringLengthHDF, hdfError)
369 2 : CALL h5tset_strpad_f(stringTypeID, H5T_STR_SPACEPAD_F, hdfError)
370 2 : CALL h5tset_cset_f(stringTypeID, H5T_CSET_ASCII_F, hdfError)
371 :
372 2 : CALL h5dget_space_f(datasetID,dataspaceID,hdfError)
373 2 : CALL h5sselect_hyperslab_f(dataspaceID,H5S_SELECT_SET_F,memOffset,fncount,hdfError)
374 2 : CALL h5screate_simple_f(1,dimsHDF,memSpaceID,hdfError)
375 2 : CALL h5dwrite_f(datasetID,stringTypeID,dataArray,dimsHDF,hdfError,memSpaceID,dataspaceID,trans)
376 2 : CALL h5sclose_f(memSpaceID,hdfError)
377 2 : CALL h5sclose_f(dataspaceID,hdfError)
378 2 : CALL cleartransprop(trans)
379 :
380 2 : CALL h5tclose_f(stringTypeID,hdfError)
381 :
382 2 : CALL io_check("io_write_string1 !",hdfError)
383 :
384 2 : END SUBROUTINE io_write_string1
385 :
386 : #endif
387 :
388 : END MODULE m_banddos_io
|