LCOV - code coverage report
Current view: top level - mix - checkMMPmat.f90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 19 22 86.4 %
Date: 2024-05-01 04:44:11 Functions: 1 1 100.0 %

          Line data    Source code
       1             : MODULE m_checkMMPmat
       2             : 
       3             :    !Check whether the given density matrix makes sense (only diagonal)
       4             : 
       5             :    USE m_types
       6             :    USE m_juDFT
       7             :    USE m_constants
       8             :    use m_types_mixvector
       9             :    use m_mixing_history
      10             :    use m_mpi_bc_tool
      11             : 
      12             :    IMPLICIT NONE
      13             : 
      14             :    CONTAINS
      15             : 
      16          62 :    SUBROUTINE checkMMPmat(indStart,indEnd,l_denmat_in_mixer,fmpi,atoms,input,outden,inden)
      17             : 
      18             :       INTEGER,             INTENT(IN)    :: indStart, indEnd
      19             :       LOGICAL,             INTENT(IN)    :: l_denmat_in_mixer
      20             :       TYPE(t_mpi),         INTENT(IN)    :: fmpi
      21             :       TYPE(t_atoms),       INTENT(IN)    :: atoms
      22             :       TYPE(t_input),       INTENT(IN)    :: input
      23             :       TYPE(t_potden),      INTENT(IN)    :: outden
      24             :       TYPE(t_potden),      INTENT(INOUT) :: inden
      25             : 
      26             :       REAL, PARAMETER :: lowBound = 0.0
      27             :       LOGICAL changed_elements
      28             :       INTEGER i_u,l,ispin,m
      29             :       REAL maxOcc
      30             : 
      31          62 :       changed_elements = .FALSE.
      32             : 
      33          62 :       maxOcc = (2 + 0.1)/input%jspins
      34         226 :       DO i_u = indStart, indEnd
      35         164 :          l = atoms%lda_u(i_u)%l
      36             :          !Check the diagonal elements
      37         450 :          DO ispin = 1, input%jspins
      38        1452 :             DO m = -l,l
      39        1288 :                IF(REAL(inden%mmpmat(m,m,i_u,ispin)).LT.lowBound) THEN
      40           0 :                   IF(REAL(outden%mmpmat(m,m,i_u,ispin)).GE.lowBound) THEN
      41           0 :                      inden%mmpmat(m,m,i_u,ispin) = 0.0
      42           0 :                      changed_elements = .TRUE.
      43             :                   ENDIF
      44        1064 :                ELSE IF(REAL(inden%mmpmat(m,m,i_u,ispin)).GT.maxOcc) THEN
      45           9 :                   IF(REAL(outden%mmpmat(m,m,i_u,ispin)).LE.maxOcc) THEN
      46           9 :                      inden%mmpmat(m,m,i_u,ispin) = maxOcc
      47           9 :                      changed_elements = .TRUE.
      48             :                   ENDIF
      49             :                ENDIF
      50             :             ENDDO
      51             :          ENDDO
      52             :       ENDDO
      53             : 
      54          62 :       CALL mpi_bc(changed_elements, 0, fmpi%mpi_comm)
      55             : 
      56          62 :       IF(changed_elements .AND. l_denmat_in_mixer) THEN
      57           2 :          IF(fmpi%irank.EQ.0) THEN
      58           1 :             WRITE(*,*) "Invalid elements in DFT+U matrix after mixing:"
      59             :          ENDIF
      60           2 :          CALL mixing_history_reset(fmpi)
      61           2 :          CALL mixvector_reset()
      62             :       ENDIF
      63             : 
      64             :       IF(.FALSE.) THEN
      65             :          WRITE(*,*) "-----------------------------------------------------------------"
      66             :          WRITE(*,*) "Using the Quasi-Newton methods for mixing and LDA+U"
      67             :          WRITE(*,*) "from the beginning of the SCF calculaion can be unstable."
      68             :          WRITE(*,*) "You can reset the mixing_history, use straight mixing for "
      69             :          WRITE(*,*) "the first iterations or use linear mixing for the density matrix"
      70             :          WRITE(*,*) "-----------------------------------------------------------------"
      71             :          CALL juDFT_error("Invalid elements in mmpmat", calledby="checkMMPmat")
      72             : 
      73             :       ENDIF
      74             : 
      75          62 :    END SUBROUTINE checkMMPmat
      76             : 
      77             : END MODULE m_checkMMPmat

Generated by: LCOV version 1.14