LCOV - code coverage report
Current view: top level - io - eig66_data.F90 (source / functions) Hit Total Coverage
Test: combined.info Lines: 42 64 65.6 %
Date: 2019-09-08 04:53:50 Functions: 5 12 41.7 %

          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_data
       8             : #include "juDFT_env.h"
       9             : #ifdef CPP_HDF
      10             :     use hdf5
      11             : #endif
      12             :     implicit none
      13             : 
      14             :     TYPE :: t_data
      15             :        INTEGER:: io_mode
      16             :        INTEGER:: jspins,nkpts,nmat,neig,nlo,ntype
      17             :        LOGICAL:: l_real,l_soc
      18             :     END TYPE
      19             : 
      20             :     TYPE,EXTENDS(t_data):: t_data_DA
      21             :         INTEGER            :: recl_vec=0,recl_wiks
      22             :         CHARACTER(LEN=20)  :: fname="eig"
      23             :         INTEGER            :: file_io_id_vec,file_io_id_wiks
      24             :     END TYPE
      25             : 
      26             :     TYPE,extends(t_data):: t_data_MPI
      27             :        INTEGER             :: n_size=1
      28             :        INTEGER             :: size_k,size_eig
      29             :        INTEGER             :: eig_handle,zr_handle,zc_handle,neig_handle,w_iks_handle
      30             :        INTEGER,ALLOCATABLE :: pe_basis(:,:),slot_basis(:,:)
      31             :        INTEGER,ALLOCATABLE :: pe_ev(:,:,:),slot_ev(:,:,:)
      32             :        INTEGER             :: irank
      33             :        INTEGER,POINTER :: neig_data(:)
      34             :        REAL,POINTER    :: eig_data(:),zr_data(:), w_iks_data(:)
      35             :        COMPLEX,POINTER :: zc_data(:)
      36             :     END TYPE
      37             :     TYPE,EXTENDS(t_data):: t_data_hdf
      38             : #ifdef CPP_HDF
      39             :          INTEGER(HID_T) :: fid
      40             :          INTEGER(HID_T) :: neigsetid
      41             :          INTEGER(HID_T) :: energysetid,wikssetid,evsetid
      42             :          CHARACTER(LEN=20) :: fname="eig"
      43             : #endif
      44             :       END TYPE
      45             : 
      46             :    TYPE,EXTENDS(t_data):: t_data_mem
      47             :         INTEGER,ALLOCATABLE :: eig_int(:)
      48             :         REAL,ALLOCATABLE    :: eig_eig(:,:,:)
      49             :         REAL,ALLOCATABLE    :: eig_vecr(:,:)
      50             :         COMPLEX,ALLOCATABLE :: eig_vecc(:,:)
      51             :     END TYPE
      52             : 
      53             :     TYPE t_list
      54             :         INTEGER               :: id
      55             :         CLASS(t_data),POINTER :: data
      56             :         TYPE(t_list),POINTER  :: next=>null()
      57             :     END TYPE
      58             : 
      59             : 
      60             : 
      61             :     TYPE(t_list),POINTER :: linked_list=>null()
      62             :     private linked_list
      63             :     INTEGER, PARAMETER :: DA_mode=0,HDF_mode=1,MEM_mode=2,MPI_mode=3
      64             : 
      65             :     contains
      66             :     
      67          66 :     subroutine eig66_data_storedefault(d,jspins,nkpts,nmat,neig,l_real,l_soc)
      68             :     CLASS(t_data)::d
      69             :     INTEGER,INTENT(IN)::jspins,nkpts,nmat,neig
      70             :     LOGICAL,INTENT(IN):: l_real,l_soc
      71          66 :     d%jspins=jspins
      72          66 :     d%nkpts=nkpts
      73          66 :     d%nmat=nmat
      74          66 :     d%neig=neig
      75          66 :     d%l_real=l_real
      76          66 :     d%l_soc=l_soc
      77          66 :     END SUBROUTINE
      78             : 
      79        5277 :     subroutine eig66_find_data(d,id,io_mode)
      80             :     IMPLICIT NONE
      81             :     INTEGER,INTENT(IN) ::id
      82             :     INTEGER,INTENT(IN),OPTIONAL :: io_mode
      83             :     CLASS(t_data),pointer::d
      84             : 
      85             :     TYPE(t_list),POINTER,ASYNCHRONOUS:: listpointer,lastinlist
      86        5277 :     lastinlist=>null()
      87             : 
      88        5277 :     listpointer=>linked_list
      89        5277 :     DO WHILE(associated(listpointer))
      90        5211 :        lastinlist=>listpointer
      91        5211 :        if (listpointer%id==id) THEN
      92        5211 :            d=>listpointer%data
      93        5211 :            return
      94             :        endif
      95          66 :        listpointer=>listpointer%next
      96             :     enddo
      97             :     !no pointer found
      98          66 :     IF (present(io_mode)) THEN
      99          66 :        IF (.not.associated(lastinlist)) THEN
     100          66 :           allocate(linked_list)
     101          66 :           linked_list%id=id
     102          66 :           lastinlist=>linked_list
     103             :        ELSE
     104           0 :           allocate(lastinlist%next)
     105           0 :           lastinlist%next%id=id
     106           0 :           lastinlist=>lastinlist%next
     107             :        ENDIF
     108          66 :        SELECT CASE (io_mode)
     109             :          case (DA_MODE)
     110           0 :           allocate(t_data_DA::lastinlist%data)
     111             :          case (HDF_MODE)
     112             : #ifdef CPP_HDF
     113           0 :           allocate(t_data_HDF::lastinlist%data)
     114             : #else
     115             :           call juDFT_error("Cannot use hdf mode for IO, recompile with CPP_HDF",calledby="eig66_data")
     116             : #endif
     117             :          case (MEM_MODE)
     118           0 :           allocate(t_data_MEM::lastinlist%data)
     119             :          case (MPI_MODE)
     120         132 :           allocate(t_data_MPI::lastinlist%data)
     121             :          end select
     122          66 :          lastinlist%data%io_mode=io_mode
     123          66 :          d=>lastinlist%data
     124             :     ELSE
     125           0 :        call juDFT_error("BUG:Could not find data object in eig66_mpi")
     126             :     ENDIF
     127             :     END SUBROUTINE
     128             : 
     129           0 :     subroutine eig66_remove_data(id)
     130             :     INTEGER,INTENT(IN)::id
     131             : 
     132             :     TYPE(t_list),POINTER:: listpointer,lastpointer
     133           0 :     lastpointer=>null()
     134           0 :     listpointer=>linked_list
     135           0 :     loop:DO WHILE(associated(listpointer))
     136           0 :       IF (listpointer%id==id) THEN
     137             :         exit loop
     138             :       ENDIF
     139           0 :       lastpointer=>listpointer
     140           0 :       listpointer=>listpointer%next
     141             :     ENDDO loop
     142             : 
     143           0 :     if (.not.associated(listpointer)) call juDFT_error("BUG in eig66_data: ID not found in deleting")
     144           0 :     IF (associated(lastpointer)) THEN
     145           0 :         lastpointer%next=>listpointer%next
     146             :     ELSE
     147           0 :         linked_list=>listpointer%next
     148             :     ENDIF
     149             : 
     150           0 :     deallocate(listpointer)
     151           0 :     end subroutine
     152             : 
     153          66 :     INTEGER FUNCTION eig66_data_newid(mode)
     154             :     INTEGER,INTENT(IN)  :: mode
     155             :     TYPE(t_list),POINTER:: listpointer
     156             :     INTEGER             :: id
     157             :     CLASS(t_data),POINTER::d
     158             : 
     159          66 :     id=0
     160          66 :     listpointer=>linked_list
     161          66 :     DO WHILE(associated(listpointer))
     162           0 :       id=max(id,listpointer%id)
     163          66 :       listpointer=>listpointer%next
     164             :     ENDDO
     165          66 :     eig66_data_newid=id+1
     166             : 
     167          66 :     call eig66_find_data(d,id+1,mode)
     168             : 
     169          66 :     end function
     170             : 
     171        5211 :     INTEGER function eig66_data_mode(id)RESULT(mode)
     172             :         INTEGER,INTENT(IN)  :: id
     173             :         TYPE(t_list),POINTER:: listpointer
     174             : 
     175        5211 :         mode=-1
     176        5211 :         listpointer=>linked_list
     177             : 
     178        5211 :         DO WHILE(associated(listpointer))
     179        5211 :             if (id==listpointer%id) THEN
     180        5211 :                 mode=listpointer%data%io_mode
     181        5211 :                 return
     182             :             ENDIF
     183           0 :             listpointer=>listpointer%next
     184             :         ENDDO
     185             :     END FUNCTION
     186             : 
     187          66 : end module m_eig66_data

Generated by: LCOV version 1.13