LCOV - code coverage report
Current view: top level - mix - broyden_history.F90 (source / functions) Hit Total Coverage
Test: combined.info Lines: 42 42 100.0 %
Date: 2019-09-08 04:53:50 Functions: 1 1 100.0 %

          Line data    Source code
       1             : MODULE m_broyden
       2             :   USE m_juDFT
       3             :   !################################################################
       4             :   !     IMIX = 3 : BROYDEN'S FIRST METHOD
       5             :   !     IMIX = 5 : BROYDEN'S SECOND METHOD
       6             :   !     IMIX = 7 : GENERALIZED ANDERSEN METHOD
       7             :   !     sm   : input charge density of iteration m
       8             :   !            afterwards update rho(m+1)
       9             :   !     fm   : output minus input charge density of iteration m
      10             :   !     sm1  : input charge density of iteration m-1
      11             :   !     fm1   : output minus inputcharge density of iteration m-1
      12             :   !################################################################
      13             : CONTAINS
      14         322 :   SUBROUTINE broyden(alpha,fm,sm)
      15             :     USE m_types
      16             :     USE m_types_mixvector
      17             :     IMPLICIT NONE
      18             : 
      19             :     real,INTENT(IN)                 :: alpha
      20             :     TYPE(t_mixvector),INTENT(IN)    :: fm(:)
      21             :     TYPE(t_mixvector),INTENT(INOUT) :: sm(:)
      22             : 
      23             :     ! Locals
      24             :     INTEGER           :: n,it,hlen
      25             :     REAL              :: fmvm,vmnorm
      26         322 :     REAL,ALLOCATABLE  :: am(:),dfivi(:)
      27         966 :     TYPE(t_mixvector) :: fm1,sm1,ui,um,vi,vm
      28         644 :     TYPE(t_mixvector),allocatable :: u_store(:),v_store(:)
      29             : 
      30         322 :     hlen=size(fm)
      31         322 :     IF (hlen<2) THEN !Do a simple mixing step
      32          48 :        sm(hlen)=sm(hlen)+alpha*fm(hlen)
      33          48 :        RETURN
      34             :     ENDIF
      35             : 
      36         274 :     ALLOCATE(u_store(hlen-2),v_store(hlen-2))
      37        2486 :     do it=1,hlen-2
      38        2212 :        call u_store(it)%alloc()
      39        2486 :        call v_store(it)%alloc()
      40             :     enddo
      41             :      
      42         274 :     CALL fm1%alloc()
      43         274 :     CALL sm1%alloc()
      44         274 :     CALL ui%alloc()
      45         274 :     CALL um%alloc()
      46         274 :     CALL vi%alloc()
      47         274 :     CALL vm%alloc()
      48             :     
      49         274 :     ALLOCATE (am(hlen-1),dfivi(hlen-1))
      50        2760 :     dfivi = 0.0
      51        2760 :     am  = 0.0
      52        5246 :     DO n=2,hlen
      53        2486 :        sm1 = sm(n) - sm(n-1)
      54        2486 :        fm1 = fm(n) - fm(n-1)
      55             :        !     |vi> = w|vi> 
      56             :        !     loop to generate um : um = sm1 + alpha*fm1 - \sum <fm1|w|vi> ui
      57        2486 :        um = alpha * fm1 + sm1
      58             :        
      59       16788 :        DO it = n-2,1,-1
      60       14302 :           ui=u_store(it)
      61       14302 :           vi=v_store(it)
      62             :           
      63       14302 :           am(it) = vi.dot.fm1
      64             :           ! calculate um(:) = -am(it)*ui(:) + um(:)
      65       16788 :           um=um-am(it)*ui
      66             :           !WRITE(6,FMT='(5x,"<vi|w|Fm> for it",i2,5x,f10.6)')it,am(it) 
      67             :        END DO
      68             : 
      69             :        ! calculate vm = alpha*wfm1 -\sum <fm1|w|vi> <fi1|w|vi><vi|
      70             :        ! convolute fm1 with the metrik and store in vm
      71        2486 :        vm=fm1%apply_metric()
      72       16788 :        DO it = n-2,1,-1
      73       14302 :           vi=v_store(it)
      74             :           ! calculate vm(:) = -am(it)*dfivi*vi(:) + vm
      75       16788 :           vm=vm-am(it)*dfivi(it)*vi
      76             :        END DO
      77             : 
      78        2486 :        vmnorm=fm1.dot.vm
      79             :        ! if (vmnorm.lt.tol_10) stop
      80             : 
      81             :        ! calculate vm(:) = (1.0/vmnorm)*vm(:)
      82        2486 :        vm=(1.0/vmnorm)*vm
      83             :      
      84             :        ! save dfivi(mit) for next iteration
      85        2486 :        dfivi(n-1) = vmnorm
      86        2486 :        IF (n<hlen) u_store(n-1)=um
      87        2760 :        IF (n<hlen) v_store(n-1)=vm
      88             :     enddo
      89             :     ! update rho(m+1)
      90             :     ! calculate <fm|w|vm>
      91         274 :     fmvm = vm.dot.fm(hlen)
      92             :     ! calculate sm(:) = (1.0-fmvm)*um(:) + sm
      93         274 :     sm(hlen)=sm(hlen)+(1.0-fmvm)*um
      94             :  
      95         322 :   END SUBROUTINE broyden
      96             : END MODULE m_broyden

Generated by: LCOV version 1.13