eig66_io.F90 6.62 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_io
#include "juDFT_env.h"
9
  USE m_types
10 11 12
  USE m_eig66_data
  IMPLICIT NONE
  PRIVATE
13

14 15 16
  PUBLIC open_eig,close_eig
  PUBLIC read_eig, write_eig
CONTAINS
17

18 19 20 21
  FUNCTION open_eig(mpi_comm,nmat,neig,nkpts,jspins,lmax,nlo,ntype,nlotot,&
                    l_noco,l_create,l_real,l_soc,l_readonly,n_size,mode_in,&
                    filename,layers,nstars,ncored,nsld,nat,l_dos,l_mcd,l_orb)&
           RESULT(id)
22 23 24 25 26 27
    USE m_eig66_hdf,ONLY:open_eig_hdf=>open_eig
    USE m_eig66_DA ,ONLY:open_eig_DA=>open_eig
    USE m_eig66_mem,ONLY:open_eig_mem=>open_eig
    USE m_eig66_MPI,ONLY:open_eig_mpi=>open_eig
    IMPLICIT NONE
    INTEGER,INTENT(IN)          :: nmat,neig,nkpts,jspins,lmax,nlo,ntype,nlotot,mpi_comm
28
    LOGICAL,INTENT(IN)          :: l_noco,l_readonly,l_create,l_real,l_soc
29
    INTEGER,INTENT(IN),OPTIONAL :: n_size,mode_in
30
    LOGICAL,INTENT(IN),OPTIONAL :: l_dos,l_mcd,l_orb
31
    CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: filename
32
    INTEGER,INTENT(IN),OPTIONAL :: layers,nstars,ncored,nsld,nat
33 34 35
    INTEGER:: id,mode

    INTEGER:: neig_local,isize,err
36 37 38 39 40
    if (l_soc) THEN
       neig_local=2*neig
    else
       neig_local=neig
    endif
41
    mode=-1
42
    IF (PRESENT(mode_in)) mode=mode_in
43 44 45 46 47 48 49 50 51

    IF (mode<0) THEN
       !Use default mode
#ifdef CPP_MPI
       mode=MPI_mode
#else
       mode=MEM_mode
#endif
       !check if default was given on command-line
52 53 54 55
       IF (juDFT_was_argument("-mpi")) mode=MPI_mode
       IF (juDFT_was_argument("-mem")) mode=MEM_mode
       IF (juDFT_was_argument("-da")) mode=DA_mode
       IF (juDFT_was_argument("-hdf")) mode=HDF_mode
56 57 58
    ENDIF
    !Check if mode is available
#ifndef CPP_MPI
59
    IF (mode==MPI_mode) CALL juDFT_error("MPI-mode not available. Recompile with CPP_MPI",calledby="eig66_io")
60
#else
61 62 63
    CALL MPI_COMM_SIZE(mpi_comm,isize,err)
    IF (isize>1.AND.((mode==DA_mode.OR.mode==mem_mode))) &
         CALL juDFT_error("In a parallel calculation MEM/DA-mode are not available",calledby="eig66_io")
64 65
#endif
#ifndef CPP_HDF
66
    IF (mode==HDF_mode) CALL juDFT_error("HDF-mode not available. Recompile with CPP_HDF",calledby="eig66_io")
67 68
#endif

69
    id=eig66_data_newid(mode)
70

Daniel Wortmann's avatar
Daniel Wortmann committed
71
    !PRINT *,"open_eig:",id,mode
72

73
    CALL timestart("Open file/memory for IO of eig66")
74
    SELECT CASE (eig66_data_mode(id))
75
    CASE (DA_mode)
76
       CALL open_eig_DA(id,nmat,neig_local,nkpts,jspins,lmax,nlo,ntype,nlotot,l_create,l_real,l_soc,l_dos,l_mcd,l_orb,filename,layers,nstars,ncored,nsld,nat)
77
    CASE (hdf_mode)
Daniel Wortmann's avatar
Daniel Wortmann committed
78
       CALL open_eig_HDF(id,mpi_comm,nmat,neig_local,nkpts,jspins,lmax,nlo,ntype,l_create,l_real,l_soc,nlotot,l_readonly,l_dos,l_mcd,l_orb,filename,layers,nstars,ncored,nsld,nat)
79
    CASE (mem_mode)
80
       CALL open_eig_MEM(id,nmat,neig_local,nkpts,jspins,lmax,nlo,ntype,l_create,l_real,l_soc,nlotot,l_noco,l_dos,l_mcd,l_orb,filename,layers,nstars,ncored,nsld,nat)
81
    CASE (mpi_mode)
82
       CALL open_eig_MPI(id,mpi_comm,nmat,neig_local,nkpts,jspins,lmax,nlo,ntype,l_create,l_real,l_soc,nlotot,l_noco,n_size,l_dos,l_mcd,l_orb,filename,layers,nstars,ncored,nsld,nat)
83 84
    CASE DEFAULT
       CALL juDFT_error("Invalid IO-mode in eig66_io")
85
    END SELECT
86 87
    CALL timestop("Open file/memory for IO of eig66")
  END FUNCTION open_eig
88

89
  SUBROUTINE close_eig(id,filename)
90 91 92 93 94 95 96 97 98
    USE m_eig66_hdf,ONLY:close_eig_hdf=>close_eig
    USE m_eig66_DA ,ONLY:close_eig_DA=>close_eig
    USE m_eig66_mem,ONLY:close_eig_MEM=>close_eig
    USE m_eig66_MPI,ONLY:close_eig_MPI=>close_eig
    IMPLICIT NONE
    INTEGER,INTENT(IN)                   :: id
    CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: filename
    INTEGER  :: mode
    mode=eig66_data_mode(id)
Daniel Wortmann's avatar
Daniel Wortmann committed
99
    !PRINT*,"close_eig:",id,mode
100
    SELECT CASE (mode)
101 102 103 104 105 106 107 108 109 110
    CASE (DA_mode)
       CALL close_eig_DA(id,filename)
    CASE (hdf_mode)
       CALL close_eig_HDF(id,filename)
    CASE (mem_mode)
       CALL close_eig_Mem(id,filename=filename)
    CASE (MPI_mode)
       CALL close_eig_MPI(id,filename=filename)
    CASE (-1)
       CALL juDFT_error("ID not assigned in close_eig",calledby="eig66_io")
111 112
    END SELECT

113
  END SUBROUTINE close_eig
114

115
  SUBROUTINE read_eig(id,nk,jspin,neig,eig,w_iks,n_start,n_end,zmat)
116 117 118 119 120 121 122
    USE m_eig66_hdf,ONLY:read_eig_hdf=>read_eig
    USE m_eig66_DA ,ONLY:read_eig_DA=>read_eig
    USE m_eig66_mem,ONLY:read_eig_mem=>read_eig
    USE m_eig66_MPI,ONLY:read_eig_MPI=>read_eig
    IMPLICIT NONE
    INTEGER, INTENT(IN)            :: id,nk,jspin
    INTEGER, INTENT(OUT),OPTIONAL  :: neig
Daniel Wortmann's avatar
Daniel Wortmann committed
123
    REAL,    INTENT(OUT),OPTIONAL  :: eig(:),w_iks(:)
124
    INTEGER, INTENT(IN),OPTIONAL   :: n_start,n_end
125
    TYPE(t_zMAT),INTENT(INOUT),OPTIONAL  :: zmat
126 127 128
    INTEGER::n
    CALL timestart("IO (read)")
    SELECT CASE (eig66_data_mode(id))
129
    CASE (DA_mode)
130
       CALL read_eig_DA(id,nk,jspin,neig,eig,w_iks,n_start,n_end,zmat)
131
    CASE (hdf_mode)
132
       CALL read_eig_hdf(id,nk,jspin,neig,eig,w_iks,n_start,n_end,zmat)
133
    CASE (mem_mode)
134
       CALL read_eig_mem(id,nk,jspin,neig,eig,w_iks,n_start,n_end,zmat)
135
    CASE (mpi_mode)
136
       CALL read_eig_mpi(id,nk,jspin,neig,eig,w_iks,n_start,n_end,zmat)
137
    CASE (-1)
138
       CALL juDFT_error("Could not read eig-file before opening", calledby = "eig66_io")
139
    END SELECT
140 141
    CALL timestop("IO (read)")
  END SUBROUTINE read_eig
142

143
  SUBROUTINE write_eig(id,nk,jspin,neig,neig_total,eig,w_iks,n_start,n_end,zmat)
144 145 146 147 148 149
    USE m_eig66_hdf,ONLY:write_eig_hdf=>write_eig
    USE m_eig66_DA ,ONLY:write_eig_DA=>write_eig
    USE m_eig66_mem,ONLY:write_eig_MEM=>write_eig
    USE m_eig66_MPI,ONLY:write_eig_MPI=>write_eig
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: id,nk,jspin
150 151
    INTEGER, INTENT(IN),OPTIONAL :: neig,neig_total,n_start,n_end
    REAL,    INTENT(IN),OPTIONAL :: eig(:),w_iks(:)
Daniel Wortmann's avatar
Daniel Wortmann committed
152
    TYPE(t_Mat),INTENT(IN),OPTIONAL :: zmat
153 154 155
    CALL timestart("IO (write)")
    SELECT CASE (eig66_data_mode(id))
    CASE (da_mode)
156
       CALL write_eig_DA(id,nk,jspin,neig,neig_total,eig,w_iks,n_start,n_end,zmat)
157
    CASE (hdf_mode)
158
       CALL write_eig_HDF(id,nk,jspin,neig,neig_total,eig,w_iks,n_start,n_end,zmat)
159
    CASE (mem_mode)
160
       CALL write_eig_Mem(id,nk,jspin,neig,neig_total,eig,w_iks,n_start,n_end,zmat)
161
    CASE (MPI_mode)
162
       CALL write_eig_MPI(id,nk,jspin,neig,neig_total,eig,w_iks,n_start,n_end,zmat)
163
    CASE (-1)
164
       CALL juDFT_error("Could not write eig-file before opening", calledby = "eig66_io")
165 166 167 168
    END SELECT
    CALL timestop("IO (write)")
  END SUBROUTINE write_eig

169
END MODULE m_eig66_io