LCOV - code coverage report
Current view: top level - io - eig66_io.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 47 78 60.3 %
Date: 2024-04-26 04:44:34 Functions: 5 6 83.3 %

          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

Generated by: LCOV version 1.14