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
|