eig66_hdf.F90 17.2 KB
Newer Older
1 2 3 4 5 6
!--------------------------------------------------------------------------------
! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
! This file is part of FLEUR and available as free software under the conditions
! of the MIT license as expressed in the LICENSE file in more detail.
!--------------------------------------------------------------------------------

7 8
MODULE m_eig66_hdf
#include "juDFT_env.h"
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  !*****************************************************************
  ! DESC:Module for hdf-io of eig-file
  !      To be compatible with f90 interface of HDF, use kind for vars
  !
  !      !ATTENTION before calling openeig and after calling closeeig!
  !      !the hdf library has to be initialized or finalized, respectively
  !
  !      CONTAINS the following subroutines:
  !      openeig        opens file
  !      closeeig       closes file
  !      read_keb       reads kpt, enpara and basis data
  !      read_neig      read no of eigenvalues (and eigenvalues itself)
  !      read_eig       reads eigenvectors
  !      writeeig       saves all data for kpt
  !      writesingleeig saves data for one kpt and energy
  !
  !
Daniel Wortmann's avatar
Daniel Wortmann committed
26
  !                          Daniel Wortmann
27 28
  !*****************************************************************
  USE m_eig66_data
29
  USE m_types
30
#ifdef CPP_HDF
31 32 33
  USE hdf5
  USE m_hdf_tools
  IMPLICIT NONE
34

35 36 37 38
  PRIVATE
  INTEGER, PARAMETER :: one=1,two=2,three=3,zero=0
  !to have the correct
  !type for array constructors
39 40

#endif
41
  PUBLIC open_eig,close_eig
42
  PUBLIC read_eig
43
  PUBLIC write_eig!,writesingleeig,writeeigc,writebas
44 45

CONTAINS
46 47 48 49 50 51 52 53 54 55 56 57 58 59
  SUBROUTINE priv_find_data(id,d)
    INTEGER,INTENT(IN)::id
    TYPE(t_data_hdf),POINTER:: d

    CLASS(t_data),POINTER   ::dp
    CALL eig66_find_data(dp,id)
    SELECT TYPE(dp)
    TYPE is (t_data_hdf)
       d=>dp
       CLASS default
       CALL judft_error("BUG: wrong datatype in eig66_hdf")
    END SELECT
  END SUBROUTINE priv_find_data
  !----------------------------------------------------------------------
Daniel Wortmann's avatar
Daniel Wortmann committed
60
  SUBROUTINE open_eig(id,mpi_comm,nmat,neig,nkpts,jspins,lmax,nlo,ntype,create,l_real,l_soc,nlotot,readonly,l_dos,l_mcd,l_orb,filename,layers,nstars,ncored,nsld,nat)
61 62 63 64 65 66 67

    !*****************************************************************
    !     opens hdf-file for eigenvectors+values
    !*****************************************************************
    IMPLICIT NONE

    INTEGER, INTENT(IN) :: id,mpi_comm
Daniel Wortmann's avatar
Daniel Wortmann committed
68
    INTEGER, INTENT(IN) :: nmat,neig,nkpts,jspins,nlo,ntype,lmax,nlotot
69
    LOGICAL, INTENT(IN) :: create,readonly,l_real,l_soc
70
    LOGICAL, INTENT(IN),OPTIONAL ::l_dos,l_mcd,l_orb
71 72
    CHARACTER(LEN=*),OPTIONAL :: filename
    INTEGER,INTENT(IN),OPTIONAL :: layers,nstars,ncored,nsld,nat
73 74

#ifdef CPP_HDF
75 76 77 78

    INTEGER         :: hdferr,access_mode
    INTEGER(HID_T)  :: creation_prp,access_prp,spaceid
    LOGICAL         :: l_exist
Daniel Wortmann's avatar
Daniel Wortmann committed
79
    INTEGER(HSIZE_T):: dims(7)
80 81
    TYPE(t_data_HDF),POINTER::d
    !Set creation and access properties
82
#ifdef CPP_MPI
83 84 85 86 87 88 89 90 91 92 93
    INCLUDE 'mpif.h'
    IF (readonly) THEN
       access_prp=H5P_DEFAULT_f
       creation_prp=H5P_DEFAULT_f
    ELSE
       CALL h5pcreate_f(H5P_FILE_ACCESS_F, access_prp, hdferr)
       !      CALL h5pset_fapl_mpiposix_f(access_prp,MPI_COMM,
       !     +.false.,hdferr)
       CALL h5pset_fapl_mpio_f(access_prp, MPI_COMM, MPI_INFO_NULL,hdferr)
       creation_prp=H5P_DEFAULT_f !no special creation property
    ENDIF
94
#else
95 96
    access_prp=H5P_DEFAULT_f
    creation_prp=H5P_DEFAULT_f
97
#endif 
98 99
    CALL priv_find_data(id,d)
    IF (PRESENT(filename)) d%fname=filename
100
    CALL eig66_data_storedefault(d,jspins,nkpts,nmat,neig,lmax,nlotot,nlo,ntype,l_real,l_soc,l_dos,l_mcd,l_orb)
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
    !set access_flags according
    IF (readonly) THEN
       access_mode=H5F_ACC_RDONLY_F
    ELSE
       access_mode=H5F_ACC_RDWR_F
    ENDIF
    !     OPEN FILE and get D%FID's
    IF (create) THEN
       INQUIRE(FILE=TRIM(d%fname)//'.hdf',EXIST=l_exist)
       access_mode=H5F_ACC_TRUNC_F
       !         IF (l_exist) WRITE (*,*)'Warning: eig.hdf was overwritten'
       CALL h5fcreate_f(TRIM(d%fname)//'.hdf',access_Mode, d%fid, hdferr ,creation_prp,access_prp)
       ! create dataspaces and datasets
       !   scalars
       dims(:2)=(/nkpts,jspins/)
       CALL h5screate_simple_f(2,dims(:2),spaceid,hdferr)
       CALL h5dcreate_f(d%fid, "neig", H5T_NATIVE_INTEGER, spaceid, d%neigsetid, hdferr)
       CALL h5sclose_f(spaceid,hdferr)
       !     ew
       CALL h5dcreate_f(d%fid, "energy", H5T_NATIVE_DOUBLE, spaceid, d%energysetid, hdferr)
       CALL h5sclose_f(spaceid,hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
122 123 124
       !     w_iks
       CALL h5dcreate_f(d%fid, "w_iks", H5T_NATIVE_DOUBLE, spaceid, d%wikssetid, hdferr)
       CALL h5sclose_f(spaceid,hdferr)
125
       !     ev
126 127 128 129 130
       if ( l_real .and..not.l_soc ) THEN
          dims(:5)=(/one,nmat,neig,nkpts,jspins/)
       else
          dims(:5)=(/two,nmat,neig,nkpts,jspins/)
       endif
131 132 133 134
       CALL h5screate_simple_f(5,dims(:5),spaceid,hdferr)
       CALL h5dcreate_f(d%fid, "ev", H5T_NATIVE_DOUBLE, spaceid, d%evsetid, hdferr)
       CALL h5sclose_f(spaceid,hdferr)
       !stuff for dos etc
135
       IF (d%l_dos) THEN
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
          dims(:5)=(/4,ntype,neig,nkpts,jspins/)
          CALL h5screate_simple_f(5,dims(:5),spaceid,hdferr)
          CALL h5dcreate_f(d%fid, "qal", H5T_NATIVE_DOUBLE, spaceid, d%qalsetid, hdferr)
          CALL h5sclose_f(spaceid,hdferr)
          dims(:4)=(/neig,2,nkpts,jspins/)
          CALL h5screate_simple_f(4,dims(:4),spaceid,hdferr)
          CALL h5dcreate_f(d%fid, "qvac", H5T_NATIVE_DOUBLE, spaceid, d%qvacsetid, hdferr)
          CALL h5sclose_f(spaceid,hdferr)
          dims(:3)=(/neig,nkpts,jspins/)
          CALL h5screate_simple_f(3,dims(:3),spaceid,hdferr)
          CALL h5dcreate_f(d%fid, "qis", H5T_NATIVE_DOUBLE, spaceid, d%qissetid, hdferr)
          CALL h5sclose_f(spaceid,hdferr)
          dims(:5)=(/neig,layers,2,nkpts,jspins/)
          CALL h5screate_simple_f(5,dims(:5),spaceid,hdferr)
          CALL h5dcreate_f(d%fid, "qvlay", H5T_NATIVE_DOUBLE, spaceid, d%qvlaysetid, hdferr)
          CALL h5sclose_f(spaceid,hdferr)
          dims(:7)=(/2,nstars,neig,layers,2,nkpts,jspins/)
          CALL h5screate_simple_f(7,dims(:7),spaceid,hdferr)
          CALL h5dcreate_f(d%fid, "qstars", H5T_NATIVE_DOUBLE, spaceid, d%qstarssetid, hdferr)
          CALL h5sclose_f(spaceid,hdferr)
          dims(:3)=(/neig,nkpts,jspins/)
          CALL h5screate_simple_f(3,dims(:3),spaceid,hdferr)
          CALL h5dcreate_f(d%fid, "ksym", H5T_NATIVE_DOUBLE, spaceid, d%ksymsetid, hdferr)
          CALL h5sclose_f(spaceid,hdferr)
          dims(:3)=(/neig,nkpts,jspins/)
          CALL h5screate_simple_f(3,dims(:3),spaceid,hdferr)
          CALL h5dcreate_f(d%fid, "jsym", H5T_NATIVE_DOUBLE, spaceid, d%jsymsetid, hdferr)
          CALL h5sclose_f(spaceid,hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
164
          IF (d%l_mcd) THEN
165 166 167 168 169
             dims(:5)=(/3*ntype,ncored,neig,nkpts,jspins/)
             CALL h5screate_simple_f(5,dims(:5),spaceid,hdferr)
             CALL h5dcreate_f(d%fid, "mcd", H5T_NATIVE_DOUBLE, spaceid, d%mcdsetid, hdferr)
             CALL h5sclose_f(spaceid,hdferr)
          ENDIF
Daniel Wortmann's avatar
Daniel Wortmann committed
170
          IF (d%l_orb) THEN
171 172 173 174 175 176 177 178
             dims(:4)=(/nsld,neig,nkpts,jspins/)
             CALL h5screate_simple_f(4,dims(:4),spaceid,hdferr)
             CALL h5dcreate_f(d%fid, "qintsl", H5T_NATIVE_DOUBLE, spaceid, d%qintslsetid, hdferr)
             CALL h5sclose_f(spaceid,hdferr)
             dims(:4)=(/nsld,neig,nkpts,jspins/)
             CALL h5screate_simple_f(4,dims(:4),spaceid,hdferr)
             CALL h5dcreate_f(d%fid, "qmtsl", H5T_NATIVE_DOUBLE, spaceid, d%qmtslsetid, hdferr)
             CALL h5sclose_f(spaceid,hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
179
             dims(:4)=(/neig,nat,nkpts,jspins/)
180 181 182
             CALL h5screate_simple_f(4,dims(:4),spaceid,hdferr)
             CALL h5dcreate_f(d%fid, "qmtp", H5T_NATIVE_DOUBLE, spaceid, d%qmtpsetid, hdferr)
             CALL h5sclose_f(spaceid,hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
183
             dims(:5)=(/neig,23,nat,nkpts,jspins/)
184 185 186 187 188 189 190 191 192
             CALL h5screate_simple_f(5,dims(:5),spaceid,hdferr)
             CALL h5dcreate_f(d%fid, "orbcomp", H5T_NATIVE_DOUBLE, spaceid, d%orbcompsetid, hdferr)
             CALL h5sclose_f(spaceid,hdferr)
          ENDIF
       ENDIF
    ELSE
       CALL h5fopen_f (TRIM(d%fname)//'.hdf', access_Mode, d%fid, hdferr,access_prp)
       !get dataset-ids
       CALL h5dopen_f(d%fid, 'energy', d%energysetid, hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
193
       CALL h5dopen_f(d%fid, 'w_iks', d%wikssetid, hdferr)
194 195
       CALL h5dopen_f(d%fid, 'neig', d%neigsetid, hdferr)
       CALL h5dopen_f(d%fid, 'ev', d%evsetid, hdferr)
196
       IF (d%l_dos) THEN
197 198 199 200 201 202 203
          CALL h5dopen_f(d%fid, 'qal', d%qalsetid, hdferr)
          CALL h5dopen_f(d%fid, 'qvac', d%qvacsetid, hdferr)
          CALL h5dopen_f(d%fid, 'qis', d%qissetid, hdferr)
          CALL h5dopen_f(d%fid, 'qvlay', d%qvlaysetid, hdferr)
          CALL h5dopen_f(d%fid, 'qstars', d%qstarssetid, hdferr)
          CALL h5dopen_f(d%fid, 'ksym', d%ksymsetid, hdferr)
          CALL h5dopen_f(d%fid, 'jsym', d%jsymsetid, hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
204
          IF (d%l_mcd) THEN
205 206
             CALL h5dopen_f(d%fid, 'mcd', d%mcdsetid, hdferr)
          ENDIF
Daniel Wortmann's avatar
Daniel Wortmann committed
207
          IF (d%l_orb) THEN
208 209 210 211 212 213
             CALL h5dopen_f(d%fid, 'qintsl', d%qintslsetid, hdferr)
             CALL h5dopen_f(d%fid, 'qmtsl', d%qmtslsetid, hdferr)
             CALL h5dopen_f(d%fid, 'qmtp', d%qmtpsetid, hdferr)
             CALL h5dopen_f(d%fid, 'orbcomp', d%orbcompsetid, hdferr)
          ENDIF
       ENDIF
Daniel Wortmann's avatar
Daniel Wortmann committed
214 215
    endif
    IF (.NOT.access_prp==H5P_DEFAULT_f) CALL H5Pclose_f(access_prp&
216 217
            &     ,hdferr)
#else
Daniel Wortmann's avatar
Daniel Wortmann committed
218
    CALL juDFT_error("Could not use HDF5 for IO, please recompile")
219
#endif
Daniel Wortmann's avatar
Daniel Wortmann committed
220
  END SUBROUTINE open_eig
221
     !----------------------------------------------------------------------
Daniel Wortmann's avatar
Daniel Wortmann committed
222
  SUBROUTINE close_eig(id,filename)
223 224 225 226 227 228 229 230 231 232 233
       !*****************************************************************
       !     closes hdf-file for eigenvectors+values
       !*****************************************************************
       IMPLICIT NONE
       INTEGER,INTENT(IN)                   :: id
       CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: filename

       INTEGER::hdferr
       TYPE(t_data_HDF),POINTER::d

       !close datasets
234
#ifdef CPP_HDF
235 236 237
       CALL priv_find_data(id,d)

       CALL h5dclose_f(d%energysetid,hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
238
       CALL h5dclose_f(d%wikssetid,hdferr)
239 240
       CALL h5dclose_f(d%neigsetid,hdferr)
       CALL h5dclose_f(d%evsetid,hdferr)
241
       IF (d%l_dos) THEN
242 243 244 245 246 247 248
          CALL h5dclose_f(d%qalsetid, hdferr)
          CALL h5dclose_f(d%qvacsetid, hdferr)
          CALL h5dclose_f(d%qissetid, hdferr)
          CALL h5dclose_f(d%qvlaysetid, hdferr)
          CALL h5dclose_f(d%qstarssetid, hdferr)
          CALL h5dclose_f(d%ksymsetid, hdferr)
          CALL h5dclose_f(d%jsymsetid, hdferr)
Daniel Wortmann's avatar
Daniel Wortmann committed
249
          IF (d%l_mcd) THEN
250 251
             CALL h5dclose_f(d%mcdsetid, hdferr)
          ENDIF
Daniel Wortmann's avatar
Daniel Wortmann committed
252
          IF (d%l_orb) THEN
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
             CALL h5dclose_f(d%qintslsetid, hdferr)
             CALL h5dclose_f(d%qmtslsetid, hdferr)
             CALL h5dclose_f(d%qmtpsetid, hdferr)
             CALL h5dclose_f(d%orbcompsetid, hdferr)
          ENDIF
       ENDIF
       !close file
       CALL h5fclose_f(d%fid,hdferr)
       !If a filename was given and the name is not the current filename
       IF (PRESENT(filename)) THEN
          IF (filename.NE.d%fname) THEN
             CALL system("mv "//TRIM(d%fname)//".hdf "//TRIM(filename)//".hdf")
          ENDIF
       ENDIF
       d%fname="eig"
       CALL eig66_remove_data(id)
269 270

#endif
271
     END SUBROUTINE close_eig
272
#ifdef CPP_HDF
273
     !----------------------------------------------------------------------
Daniel Wortmann's avatar
Daniel Wortmann committed
274
     SUBROUTINE priv_r_vec(d,nk,jspin,n_start,n_end,z)
275

276 277 278 279 280 281
       USE m_hdf_tools
       IMPLICIT NONE
       TYPE(t_data_HDF),INTENT(IN)::d
       INTEGER, INTENT(IN)  :: nk,jspin
       INTEGER, INTENT(IN)  :: n_start,n_end
       REAL,    INTENT(OUT) :: z(:,:)
282

Daniel Wortmann's avatar
Daniel Wortmann committed
283
       INTEGER :: nmat
284
       INTEGER i,j,neig_l
285

286
       neig_l = n_end - n_start + 1
287

Daniel Wortmann's avatar
Daniel Wortmann committed
288
       nmat=SIZE(z,1)
289 290
       !read eigenvectors
       CALL io_read_real2(d%evsetid,(/1,1,n_start,nk,jspin/),&
291 292 293
            &                           (/1,nmat,neig_l,1,1/),&
            &                           z(:nmat,:neig_l) )

294
     END SUBROUTINE priv_r_vec
295 296 297

#endif

298
     SUBROUTINE write_eig(id,nk,jspin,neig,neig_total,eig,w_iks,n_size,n_rank,zmat)
299

300 301 302 303
       !*****************************************************************
       !     writes all eignevecs for the nk-th kpoint
       !*****************************************************************
       IMPLICIT NONE
304

305 306
       INTEGER, INTENT(IN)          :: id,nk,jspin
       INTEGER, INTENT(IN),OPTIONAL :: n_size,n_rank
307 308
       INTEGER, INTENT(IN),OPTIONAL :: neig,neig_total
       REAL,    INTENT(IN),OPTIONAL :: eig(:),w_iks(:)
Daniel Wortmann's avatar
Daniel Wortmann committed
309
       TYPE(t_mat),INTENT(IN),OPTIONAL :: zmat
310

311 312 313
       INTEGER i,j,k,nv_local,n1,n2,ne
       TYPE(t_data_HDF),POINTER::d
       CALL priv_find_data(id,d)
314 315

#ifdef CPP_HDF
316 317 318 319
       !
       !write enparas
       !
       nv_local=HUGE(1)
320

321 322 323
       !
       !write eigenvalues
       !
Daniel Wortmann's avatar
Daniel Wortmann committed
324 325 326 327
       IF (PRESENT(w_iks)) THEN
          CALL io_write_real1s(d%wikssetid,(/1,nk,jspin/),(/size(w_iks),1,1/),w_iks,(/1,1,1/))
       ENDIF
       
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
       IF (PRESENT(neig_total)) THEN
          CALL io_write_integer0(d%neigsetid,(/nk,jspin/),(/1,1/),neig_total)
       ENDIF

       IF (PRESENT(n_rank).AND.PRESENT(n_size).AND.&
            &        PRESENT(eig).AND.PRESENT(neig)) THEN
          CALL io_write_real1s(&
               &                     d%energysetid,(/n_rank+1,nk,jspin/),        &
               &                     (/neig,1,1/),eig(:neig),(/n_size,1,1/))
          !write eigenvectors
          !
       ELSEIF (PRESENT(eig).AND.PRESENT(neig)) THEN
          CALL io_write_real1s(&
               &                     d%energysetid,(/1,nk,jspin/),&
               &                     (/neig,1,1/),eig(:neig),(/1,1,1/))
       ELSE
          IF (PRESENT(eig)) CALL juDFT_error("BUG in calling write_eig")
       ENDIF
Daniel Wortmann's avatar
Daniel Wortmann committed
346
       IF (PRESENT(zmat).AND..NOT.PRESENT(neig))&
347 348
            &    CALL juDFT_error("BUG in calling write_eig with eigenvector")

349 350 351
       n1=1;n2=0
       IF (PRESENT(n_size)) n1=n_size
       IF (PRESENT(n_rank)) n2=n_rank
352 353
       IF (PRESENT(zmat)) THEN
          IF (zmat%l_real) THEN
354 355
             CALL io_write_real2s(&
                  &                     d%evsetid,(/1,1,n2+1,nk,jspin/),&
Daniel Wortmann's avatar
Daniel Wortmann committed
356
                  &           (/1,SIZE(zmat%data_r,1),neig,1,1/),REAL(zmat%data_r(:,:neig)),(/1,1,n1,1,1/))
357
          ELSE
358 359
             CALL io_write_real2s(&
                  &                     d%evsetid,(/1,1,n2+1,nk,jspin/),&
Daniel Wortmann's avatar
Daniel Wortmann committed
360
                  &           (/1,SIZE(zmat%data_c,1),neig,1,1/),REAL(zmat%data_c(:,:neig)),(/1,1,n1,1,1/))
361 362
             CALL io_write_real2s(&
                  &                     d%evsetid,(/2,1,n2+1,nk,jspin/),&
Daniel Wortmann's avatar
Daniel Wortmann committed
363
                  &           (/1,SIZE(zmat%data_c,1),neig,1,1/),AIMAG(zmat%data_c(:,:neig)),&
364
                  &           (/1,1,n1,1,1/))
365
          ENDIF
366
       ENDIF
367 368

#endif
369
     END SUBROUTINE write_eig
370 371 372

#ifdef CPP_HDF

373 374
     !----------------------------------------------------------------------
     SUBROUTINE priv_r_vecc(&
Daniel Wortmann's avatar
Daniel Wortmann committed
375
          &                     d,nk,jspin,n_start,n_end,z)
376

377 378 379 380 381 382
       USE m_hdf_tools
       IMPLICIT NONE
       TYPE(t_data_HDF),INTENT(IN)::d
       INTEGER, INTENT(IN)  :: nk,jspin
       INTEGER, INTENT(IN)  :: n_start,n_end
       COMPLEX, INTENT(OUT) :: z(:,:)
383

384 385
       REAL, ALLOCATABLE :: z1(:,:,:)
       INTEGER i,j,neig_l
Daniel Wortmann's avatar
Daniel Wortmann committed
386 387
       INTEGER :: nmat
    
388
       neig_l = n_end - n_start + 1
389

Daniel Wortmann's avatar
Daniel Wortmann committed
390
       nmat=SIZE(z,1)
391

392 393 394
       ! read eigenvectors
       ALLOCATE (z1(2,nmat,neig_l))
       CALL io_read_real3(d%evsetid,(/1,1,n_start,nk,jspin/),&
395 396
            &                      (/2,nmat,neig_l,1,1/),z1)

397 398 399 400 401
       DO i=1,neig_l
          DO j=1,nmat
             z(j,i) = CMPLX( z1(1,j,i) ,z1(2,j,i) )
          ENDDO
       ENDDO
402

403 404 405 406
       DEALLOCATE (z1)

     END SUBROUTINE priv_r_vecc
     !-----------------------------------------------------------------------
407 408 409

#endif

410
     SUBROUTINE read_eig(id,nk,jspin,neig,eig,w_iks,n_start,n_end,zMat)
411 412 413
       IMPLICIT NONE
       INTEGER, INTENT(IN)            :: id,nk,jspin
       INTEGER, INTENT(OUT),OPTIONAL  :: neig
Daniel Wortmann's avatar
Daniel Wortmann committed
414
       REAL,    INTENT(OUT),OPTIONAL  :: eig(:),w_iks(:)
415
       INTEGER, INTENT(IN),OPTIONAL   :: n_start,n_end
416
       TYPE(t_zMat),OPTIONAL  :: zmat
417 418

#ifdef CPP_HDF
Daniel Wortmann's avatar
Daniel Wortmann committed
419
       INTEGER:: n1,n,k
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
       TYPE(t_data_HDF),POINTER::d
       CALL priv_find_data(id,d)


       IF (PRESENT(neig))  THEN
          CALL io_read_integer0(d%neigsetid,(/nk,jspin/),(/1,1/),neig)

          IF ( PRESENT(eig) ) THEN                           ! read eigenv
             IF ( neig > SIZE(eig) ) THEN
                WRITE(*,*) neig,SIZE(eig)
                CALL juDFT_error("eig66_hdf$readeig",calledby ="eig66_hdf")
             ENDIF
             CALL io_read_real1(d%energysetid,(/1,nk,jspin/),(/neig,1,1/),&
                  &                      eig(:neig))
          ENDIF
Daniel Wortmann's avatar
Daniel Wortmann committed
435
          IF (PRESENT(w_iks)) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
436
             CALL io_read_real1(d%wikssetid,(/1,nk,jspin/),(/size(w_iks),1,1/),w_iks)
Daniel Wortmann's avatar
Daniel Wortmann committed
437
          ENDIF
438 439 440 441
       ENDIF

       IF (PRESENT(n_start)) THEN
          IF (.NOT.PRESENT(n_end)) CALL juDFT_error("BUG3 in read_eig")
442 443
          IF (PRESENT(zMat)) THEN
             IF (zmat%l_real) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
444
                CALL priv_r_vec(d,nk,jspin,n_start,n_end,zmat%z_r)
445
             ELSE
Daniel Wortmann's avatar
Daniel Wortmann committed
446
                CALL priv_r_vecc(d,nk,jspin,n_start,n_end,zmat%z_c)
447
             ENDIF
448 449
          ENDIF
       ENDIF
450
#endif
451
     END SUBROUTINE read_eig
452

453
   END MODULE
454