Localization changes
authorAnthony Stone <ajs1@cam.ac.uk>
Mon, 19 Nov 2018 10:04:06 +0000 (10:04 +0000)
committerAnthony Stone <ajs1@cam.ac.uk>
Tue, 20 Nov 2018 11:10:19 +0000 (11:10 +0000)
src/alphas.f90

index 741ef23..592bf93 100644 (file)
@@ -163,7 +163,7 @@ IMPLICIT NONE
 !    If TEST is specified, the program checks whether non-local
 !    polarizabilities have been reduced below the value given; otherwise
 !    a default value is used.
-!  LOCALIZE [LW] [ONLY CHARGEFLOW] [LIMIT rank]
+!  LOCALIZE [LW] [[ONLY|EXCEPT] CHARGEFLOW] [LIMIT rank]
 !    Localize using the Lillestolen-Wheatley algorithm. This is the default
 !    method. Normally, all polarizabilities, for all polarizable sites, up
 !    to the specified limiting rank are localized. If ONLY CHARGEFLOW is
@@ -432,7 +432,7 @@ do
     if (lw) then
       !  Lillestolen-Wheatley localization
       print "(/a)", "Localising polarizabilities using the Lillestolen-Wheatley method"
-      call localize_lw(mol,lmax,only_flow)
+      call localize_lw(mol,lmax,only_flow,.not.flow)
     else if (n > 0) then
       !  There is a list of sites to localise
       print "(/a)", "Localising polarizabilities using the Le Sueur-Stone method"
@@ -2279,7 +2279,7 @@ END SUBROUTINE applequist
 
 !-----------------------------------------------------------------------
 
-SUBROUTINE localize_lw(mol,max_rank,only_flow)
+SUBROUTINE localize_lw(mol,max_rank,only_flow,no_flow)
 
 !  Localize non-local polarizabilities using the Lillestolen-Wheatley
 !  algorithm.
@@ -2287,6 +2287,7 @@ SUBROUTINE localize_lw(mol,max_rank,only_flow)
 !  mol       The molecule to be treated.
 !  max_rank  The maximum rank of polarizability to be handled
 !  only_flow If true, just remove charge-flow polarizabilities and stop.
+!  no_flow   If true, don't touch charge-flow polarizabilities
 
 USE sites, ONLY : next, tops, sx
 USE molecules, ONLY : head
@@ -2298,7 +2299,7 @@ USE sizes, ONLY : lq, qsize
 
 IMPLICIT NONE
 INTEGER, INTENT(IN) :: mol, max_rank
-LOGICAL, INTENT(IN) :: only_flow
+LOGICAL, INTENT(IN) :: only_flow, no_flow
 
 INTERFACE
   SUBROUTINE hdiag (iegen,order,a,eivr,n)
@@ -2309,7 +2310,7 @@ INTERFACE
   END SUBROUTINE hdiag
 END INTERFACE
 
-INTEGER :: i, j, k, l, ka, kb, kc, kd, lt, last, n, nb, pab,            &
+INTEGER :: i, j, k, l, ka, kb, kc, kd, lt, first, last, n, nb, pab,     &
      pcb, pdb, pbc, pbd, t, u, map(tops), pam(tops), size
 REAL(dp), ALLOCATABLE :: lambda(:), w(:,:), v(:,:), z(:,:), temp(:), umove(:)
 INTEGER, ALLOCATABLE :: bm(:,:) 
@@ -2379,11 +2380,21 @@ if (verbose) then
   call matwrt(z,ncols=8,fmt="8f10.5")
 end if
 
+if (no_flow) then
+  !  Don't localize charge-flows
+  first = 2
+else
+  first = 1
+end if
 if (only_flow) then
   last = 1
 else
   last = qsize(max_rank)
 end if
+if (first > last) then
+  print "(a)", "Localise LW: contradictory options for charge-flows"
+  stop
+end if
 do t = 1,last
   lt = lq(t)
   do u = t,qsize(max_rank)