LCOV - code coverage report
Current view: top level - io - pot_io.F90 (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 82 0.0 %
Date: 2019-09-08 04:53:50 Functions: 0 2 0.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------
       2             : ! Copyright (c) 2017 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 a wrapper for the potential I/O
      10             : !!!
      11             : !!!                             GM'17
      12             : !!!
      13             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      14             : 
      15             : MODULE m_pot_io
      16             : 
      17             :    USE m_types
      18             :    USE m_juDFT
      19             :    USE m_loddop
      20             :    USE m_wrtdop
      21             :    USE m_cdnpot_io_hdf
      22             :    USE m_cdnpot_io_common
      23             : #ifdef CPP_HDF
      24             :    USE hdf5
      25             : #endif
      26             :    IMPLICIT NONE
      27             : 
      28             :    PRIVATE
      29             :    PUBLIC readPotential, writePotential
      30             :    PUBLIC POT_ARCHIVE_TYPE_TOT_const, POT_ARCHIVE_TYPE_COUL_const
      31             :    PUBLIC POT_ARCHIVE_TYPE_X_const
      32             : 
      33             :    INTEGER,          PARAMETER :: POT_ARCHIVE_TYPE_TOT_const = 1
      34             :    INTEGER,          PARAMETER :: POT_ARCHIVE_TYPE_COUL_const = 2
      35             :    INTEGER,          PARAMETER :: POT_ARCHIVE_TYPE_X_const = 3
      36             : 
      37             :    INTEGER,          PARAMETER :: POT_DIRECT_MODE = 1
      38             :    INTEGER,          PARAMETER :: POT_STREAM_MODE = 2
      39             :    INTEGER,          PARAMETER :: POT_HDF5_MODE   = 3
      40             : 
      41             :    CONTAINS
      42             : 
      43           0 :    SUBROUTINE readPotential(stars,vacuum,atoms,sphhar,input,sym,archiveType,&
      44           0 :                             iter,fr,fpw,fz,fzxy)
      45             : 
      46             :       TYPE(t_stars),INTENT(IN)  :: stars
      47             :       TYPE(t_vacuum),INTENT(IN) :: vacuum
      48             :       TYPE(t_atoms),INTENT(IN)  :: atoms
      49             :       TYPE(t_sphhar),INTENT(IN) :: sphhar
      50             :       TYPE(t_input),INTENT(IN)  :: input
      51             :       TYPE(t_sym),INTENT(IN)    :: sym
      52             : 
      53             :       INTEGER, INTENT (OUT)     :: iter
      54             :       INTEGER, INTENT (IN)      :: archiveType
      55             : 
      56             :       !     ..
      57             :       !     .. Array Arguments ..
      58             :       COMPLEX, INTENT (OUT) :: fpw(stars%ng3,input%jspins), fzxy(vacuum%nmzxyd,stars%ng2-1,2,input%jspins)
      59             :       REAL,    INTENT (OUT) :: fr(atoms%jmtd,0:sphhar%nlhd,atoms%ntype,input%jspins), fz(vacuum%nmzd,2,input%jspins)
      60             : 
      61             :       ! local variables
      62             :       INTEGER           :: mode, iUnit
      63             :       LOGICAL           :: l_exist
      64             :       CHARACTER(len=30) :: filename
      65             : 
      66             : #ifdef CPP_HDF
      67             :       INTEGER(HID_T)    :: fileID
      68             : #endif
      69             :       INTEGER           :: currentStarsIndex,currentLatharmsIndex
      70             :       INTEGER           :: currentStructureIndex,currentStepfunctionIndex
      71             :       INTEGER           :: potentialType
      72             :       CHARACTER(LEN=30) :: archiveName
      73             : 
      74           0 :       CALL getMode(mode)
      75             : 
      76             :       IF(mode.EQ.POT_HDF5_MODE) THEN
      77             : #ifdef CPP_HDF
      78           0 :          INQUIRE(FILE='pot.hdf',EXIST=l_exist)
      79           0 :          IF (l_exist) THEN
      80             :             CALL openPOT_HDF(fileID,currentStarsIndex,currentLatharmsIndex,&
      81           0 :                              currentStructureIndex,currentStepfunctionIndex)
      82             : 
      83           0 :             archiveName = 'illegalPotentialArchive'
      84           0 :             IF (archiveType.EQ.POT_ARCHIVE_TYPE_TOT_const) THEN
      85           0 :                archiveName = 'pottot'
      86             :             END IF
      87           0 :             IF (archiveType.EQ.POT_ARCHIVE_TYPE_COUL_const) THEN
      88           0 :                archiveName = 'potcoul'
      89             :             END IF
      90           0 :             IF (archiveType.EQ.POT_ARCHIVE_TYPE_X_const) THEN
      91           0 :                archiveName = 'potx'
      92             :             END IF
      93             : 
      94           0 :             potentialType = POTENTIAL_TYPE_IN_const
      95             : 
      96           0 :             l_exist = isPotentialEntryPresentHDF(fileID,archiveName,potentialType)
      97             : 
      98           0 :             CALL closeCDNPOT_HDF(fileID)
      99             :          END IF
     100             : 
     101           0 :          IF(l_exist) THEN
     102             :             CALL openPOT_HDF(fileID,currentStarsIndex,currentLatharmsIndex,&
     103           0 :                              currentStructureIndex,currentStepfunctionIndex)
     104             : 
     105             :             CALL readPotentialHDF(fileID, archiveName, potentialType,&
     106           0 :                                   iter,fr,fpw,fz,fzxy)
     107             : 
     108           0 :             CALL closeCDNPOT_HDF(fileID)
     109             :          ELSE
     110           0 :             WRITE(*,*) 'Potential entry or pot.hdf file not found.'
     111           0 :             WRITE(*,*) 'Falling back to stream access file pot.str.'
     112           0 :             mode = POT_STREAM_MODE
     113             :          END IF
     114             : #else
     115             :          WRITE(*,*) 'Not compiled for pot.hdf file usage.'
     116             :          WRITE(*,*) 'Falling back to stream access file pot.str.'
     117             :          mode = POT_STREAM_MODE
     118             : #endif
     119             :       END IF
     120             : 
     121           0 :       IF(mode.EQ.POT_STREAM_MODE) THEN
     122           0 :          INQUIRE(FILE='pot.str',EXIST=l_exist)
     123           0 :          IF (l_exist) THEN
     124             :             !load density from cdn.str and exit subroutine
     125             : 
     126           0 :             RETURN
     127             :          ELSE
     128           0 :             WRITE(*,*) 'pot.str file not found.'
     129           0 :             WRITE(*,*) 'Falling back to direct access file.'
     130           0 :             mode = POT_DIRECT_MODE
     131             :          END IF
     132             :       END IF
     133             : 
     134           0 :       IF (mode.EQ.POT_DIRECT_MODE) THEN
     135           0 :          filename = 'illegalPotentialArchive'
     136           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_TOT_const) THEN
     137           0 :             filename = 'pottot'
     138             :          END IF
     139           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_COUL_const) THEN
     140           0 :             filename = 'potcoul'
     141             :          END IF
     142           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_X_const) THEN
     143           0 :             filename = 'potx'
     144             :          END IF
     145             : 
     146           0 :          INQUIRE(file=TRIM(ADJUSTL(filename)),EXIST=l_exist)
     147           0 :          IF(.NOT.l_exist) THEN
     148           0 :             CALL juDFT_error("potential file "//TRIM(ADJUSTL(filename))//" missing",calledby ="readPotential")
     149             :          END IF
     150             : 
     151           0 :          iUnit = 11
     152           0 :          OPEN (iUnit,file=TRIM(ADJUSTL(filename)),form='unformatted',status='unknown')
     153             : 
     154             :          CALL loddop(stars,vacuum,atoms,sphhar,input,sym,&
     155           0 :                      iUnit,iter,fr,fpw,fz,fzxy)
     156             : 
     157           0 :          CLOSE(iUnit)
     158             :       END IF
     159             : 
     160             :    END SUBROUTINE readPotential
     161             : 
     162           0 :    SUBROUTINE writePotential(stars,vacuum,atoms,cell,sphhar,input,sym,oneD,archiveType,&
     163           0 :                              iter,pot,fpw)
     164             : 
     165             :       TYPE(t_stars),INTENT(IN)      :: stars
     166             :       TYPE(t_vacuum),INTENT(IN)     :: vacuum
     167             :       TYPE(t_atoms),INTENT(IN)      :: atoms
     168             :       TYPE(t_cell), INTENT(IN)      :: cell
     169             :       TYPE(t_sphhar),INTENT(IN)     :: sphhar
     170             :       TYPE(t_input),INTENT(IN)      :: input
     171             :       TYPE(t_sym),INTENT(IN)        :: sym
     172             :       TYPE(t_oneD),INTENT(IN)       :: oneD
     173             :       TYPE(t_potden), INTENT(INOUT) :: pot
     174             : 
     175             :       INTEGER, INTENT (IN)      :: iter
     176             :       INTEGER, INTENT (IN)      :: archiveType
     177             :       !     ..
     178             :       !     .. Array Arguments ..
     179             :       COMPLEX, INTENT (IN) :: fpw(stars%ng3,input%jspins)
     180             : 
     181             :       ! local variables
     182             :       INTEGER           :: mode, iUnit
     183             :       LOGICAL           :: l_exist, l_storeIndices
     184             :       CHARACTER(len=30) :: filename
     185             : 
     186             : #ifdef CPP_HDF
     187             :       INTEGER(HID_T)    :: fileID
     188             : #endif
     189             :       INTEGER           :: currentStarsIndex,currentLatharmsIndex
     190             :       INTEGER           :: currentStructureIndex,currentStepfunctionIndex
     191             :       INTEGER           :: potentialType
     192             :       CHARACTER(LEN=30) :: archiveName
     193             : 
     194           0 :       CALL getMode(mode)
     195             : 
     196             :       IF(mode.EQ.POT_HDF5_MODE) THEN
     197             : #ifdef CPP_HDF
     198             :          CALL openPOT_HDF(fileID,currentStarsIndex,currentLatharmsIndex,&
     199           0 :                           currentStructureIndex,currentStepfunctionIndex)
     200             : 
     201             :          CALL checkAndWriteMetadataHDF(fileID, input, atoms, cell, vacuum, oneD, stars, sphhar, sym,&
     202             :                                        currentStarsIndex,currentLatharmsIndex,currentStructureIndex,&
     203           0 :                                        currentStepfunctionIndex,l_storeIndices,.TRUE.)
     204             : 
     205           0 :          archiveName = 'illegalPotentialArchive'
     206           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_TOT_const) THEN
     207           0 :             archiveName = 'pottot'
     208             :          END IF
     209           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_COUL_const) THEN
     210           0 :             archiveName = 'potcoul'
     211             :          END IF
     212           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_X_const) THEN
     213           0 :             archiveName = 'potx'
     214             :          END IF
     215             : 
     216           0 :          potentialType = POTENTIAL_TYPE_IN_const
     217             : 
     218           0 :          IF(vacuum%nvac.EQ.1) THEN
     219           0 :             pot%vacz(:,2,:) = pot%vacz(:,1,:)
     220           0 :             IF (sym%invs) THEN
     221           0 :                pot%vacxy(:,:,2,:) = CONJG(pot%vacxy(:,:,1,:))
     222             :             ELSE
     223           0 :                pot%vacxy(:,:,2,:) = pot%vacxy(:,:,1,:)
     224             :             END IF
     225             :          END IF
     226             :          CALL writePotentialHDF(input, fileID, archiveName, potentialType,&
     227             :                                 currentStarsIndex, currentLatharmsIndex, currentStructureIndex,&
     228           0 :                                 currentStepfunctionIndex,iter,pot,fpw)
     229             : 
     230           0 :          IF(l_storeIndices) THEN
     231             :             CALL writePOTHeaderData(fileID,currentStarsIndex,currentLatharmsIndex,&
     232           0 :                                     currentStructureIndex,currentStepfunctionIndex)
     233             :          END IF
     234             : 
     235           0 :          CALL closeCDNPOT_HDF(fileID)
     236             : #endif
     237             :       ELSE IF(mode.EQ.POT_STREAM_MODE) THEN
     238             :          ! Write potential to pot.str file
     239             :          STOP 'POT_STREAM_MODE not yet implemented!'
     240             :       ELSE
     241             :          ! Direct mode
     242           0 :          filename = 'illegalPotentialArchive'
     243           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_TOT_const) THEN
     244           0 :             filename = 'pottot'
     245             :          END IF
     246           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_COUL_const) THEN
     247           0 :             filename = 'potcoul'
     248             :          END IF
     249           0 :          IF (archiveType.EQ.POT_ARCHIVE_TYPE_X_const) THEN
     250           0 :             filename = 'potx'
     251             :          END IF
     252             : 
     253           0 :          iUnit = 11
     254           0 :          OPEN (iUnit,file=TRIM(ADJUSTL(filename)),form='unformatted',status='unknown')
     255             :          CALL wrtdop(stars,vacuum,atoms,sphhar,input,sym,&
     256           0 :                      iUnit,iter,pot%mt,fpw,pot%vacz(:,:,:input%jspins),pot%vacxy(:,:,:,:input%jspins))
     257           0 :          CLOSE(iUnit)
     258             :       END IF
     259             : 
     260           0 :    END SUBROUTINE writePotential
     261             : 
     262             :    SUBROUTINE getMode(mode)
     263             :       INTEGER, INTENT(OUT) :: mode
     264             : 
     265           0 :       mode = POT_DIRECT_MODE
     266             :       !IF (juDFT_was_argument("-stream_cdn")) mode=POT_STREAM_MODE
     267           0 :       IF (.NOT.juDFT_was_argument("-no_cdn_hdf")) THEN !juDFT_was_argument("-hdf_cdn")) THEN
     268             : #ifdef CPP_HDF
     269           0 :          mode=POT_HDF5_MODE
     270             : #else
     271             : !         WRITE(*,*) 'Code not compiled with HDF5 support.'
     272             : !         WRITE(*,*) 'Falling back to direct access.'
     273             : #endif
     274             :       END IF
     275             :    END SUBROUTINE getMode
     276             : 
     277             : END MODULE m_pot_io

Generated by: LCOV version 1.13