1      logical function tce_ccsd_lambda_driver(title,thresh,maxiter,
2     &        d_y1,k_y1_offset,size_y1,d_y2,k_y2_offset,size_y2,
3     &        d_t1,k_t1_offset,size_t1,d_t2,k_t2_offset,size_t2,
4     &        d_f1,k_f1_offset,d_v2,k_v2_offset)
5c
6c $Id$
7c
8c Main routine for many-electron theory calculations.
9c Some of the subroutines have been generated by
10c operator/tensor contraction engines.
11c
12c Written by Jeff Hammond, January 2008.
13c
14      implicit none
15#include "mafdecls.fh"
16#include "tcgmsg.fh"
17#include "global.fh"
18#include "bas.fh"
19#include "geom.fh"
20#include "sym.fh"
21#include "util.fh"
22#include "msgids.fh"
23#include "stdio.fh"
24#include "sf.fh"
25#include "inp.fh"
26#include "errquit.fh"
27c#include "tce.fh"
28c#include "tce_main.fh"
29c#include "tce_prop.fh"
30c#include "tce_ints.fh"
31c#include "tce_amps.fh"
32c#include "tce_diis.fh"
33c
34c     CI, CC, & MBPT
35c
36      integer iter,maxiter
37      logical nodezero         ! True if node 0
38      logical recompf          ! True if recompute Fock
39      double precision cpu     ! CPU sec counter
40      double precision wall    ! WALL sec counter
41      integer irrep
42      integer irrep_g
43      integer d_f1             ! SF handle for MO 1e integrals
44      integer l_f1_offset      ! Offset for 1e integral file
45      integer k_f1_offset      ! Offset for 1e integral file
46      integer size_1e          ! File size in doubles
47      integer d_v2             ! SF handle for MO 2e integrals
48      integer l_v2_offset      ! Offset for 2e integral file
49      integer k_v2_offset      ! Offset for 2e integral file
50      integer size_2e          ! File size in doubles
51      integer d_t1             ! SF handle for t1 amplitudes
52      integer l_t1_offset      ! Offset for t1 file
53      integer k_t1_offset      ! Offset for t1 file
54      integer size_t1          ! File size in doubles
55      integer d_t2             ! SF handle for t2 amplitudes
56      integer l_t2_offset      ! Offset for t2 file
57      integer k_t2_offset      ! Offset for t2 file
58      integer size_t2          ! File size in doubles
59      integer d_y1        ! Lambda 1 file
60      integer d_y2        ! Lambda 2 file
61      integer d_yr1            ! Lambda 1 residual file
62      integer d_yr2            ! Lambda 2 residual file
63      integer k_y1_offset      ! Offset for Lambda 1 file
64      integer size_y1          ! File size in doubles
65      integer k_y2_offset      ! Offset for Lambda 2 file
66      integer size_y2          ! File size in doubles
67      double precision ref     ! Ground state energy
68      double precision corr    ! Correlation energy
69      double precision r1      ! Residual t1
70      double precision r2      ! Residual t2
71      double precision residual! Largest residual
72      double precision thresh
73      double precision ddotfile
74      external ddotfile
75      integer dummy            ! Dummy argument for DIIS
76      character*255 filename
77      character*20 title
78      character*4 irrepname
79      nodezero=(ga_nodeid().eq.0)
80      call tce_diis_init()
81      do iter=1,maxiter
82        cpu=-util_cpusec()
83        wall=-util_wallsec()
84        if (nodezero.and.(iter.eq.1)) write(LuOut,9400) title
85        call tce_filename('yr1',filename)
86        call createfile(filename,d_yr1,size_y1)
87        call ccsd_lambda1(d_f1,d_yr1,d_t1,d_t2,d_v2,d_y1,
88     1     d_y2,k_f1_offset,k_y1_offset,k_t1_offset,
89     2     k_t2_offset,k_v2_offset,k_y1_offset,k_y2_offset)
90        call reconcilefile(d_yr1,size_y1)
91        call tce_filename('yr2',filename)
92        call createfile(filename,d_yr2,size_y2)
93        call ccsd_lambda2(d_f1,d_yr2,d_t1,d_t2,d_v2,d_y1,
94     1     d_y2,k_f1_offset,k_y2_offset,k_t1_offset,
95     2     k_t2_offset,k_v2_offset,k_y1_offset,k_y2_offset)
96        call reconcilefile(d_yr2,size_y2)
97        r1 = ddotfile(d_yr1,d_yr1,size_y1)
98        r2 = ddotfile(d_yr2,d_yr2,size_y2)
99        residual = max(r1,r2)
100        cpu=cpu+util_cpusec()
101        wall=wall+util_wallsec()
102        if (nodezero) write(LuOut,9420) iter,residual,cpu,wall
103        if (residual .lt. thresh) then
104          if (nodezero) then
105            write(LuOut,9410)
106          endif
107          call deletefile(d_yr2)
108          call deletefile(d_yr1)
109          call tce_diis_tidy()
110          tce_ccsd_lambda_driver=.true.
111          return
112        endif
113        call tce_diis(.true.,iter,.true.,.true.,.false.,.false.,
114     1                d_yr1,d_y1,k_y1_offset,size_y1,
115     2                d_yr2,d_y2,k_y2_offset,size_y2,
116     3                dummy,dummy,dummy,dummy,
117     4                dummy,dummy,dummy,dummy)
118        call deletefile(d_yr2)
119        call deletefile(d_yr1)
120        if (nodezero) call util_flush(LuOut)
121      enddo
122      call tce_diis_tidy()
123      tce_ccsd_lambda_driver=.false.
124      return
125c
126c     ======
127c     Format
128c     ======
129c
130 9000 format(1x,A,' file size   = ',i16)
131 9010 format(1x,A,' file name   = ',A)
132 9090 format(1x,A,' file handle = ',i10)
133 9020 format(1x,'Cpu & wall time / sec',2f15.1)
134 9480 format(1x,'Cpu & wall time / sec for ',A,2f15.1)
135 9050 format(/,1x,A,' iterations',/,
136     1  1x,'--------------------------------------------------------',/
137     2  1x,'Iter          Residuum       Correlation     Cpu    Wall',/
138     3  1x,'--------------------------------------------------------')
139 9060 format(
140     1  1x,'--------------------------------------------------------',/
141     2  1x,'Iterations converged')
142 9070 format(1x,A,' correlation energy / hartree = ',f25.15)
143 9080 format(1x,A,' total energy / hartree       = ',f25.15)
144 9100 format(1x,i4,2f18.13,2f8.1)
145 9120 format(1x,A)
146 9250 format(1x,'Ground-state symmetry is ',A4)
147 9210 format(/,1x,'Iteration ',i3,' using ',i4,' trial vectors')
148 9230 format(1x,f17.13,f18.13,f11.5,2f8.1)
149 9240 format(1x,
150     1'--------------------------------------------------------------'
151     2,/,1x,'Iterations converged')
152 9310 format(1x,A,' ground state energy / hartree  =',f25.15)
153 9400 format(/,1x,A,' iterations',/,
154     1  1x,'--------------------------------------',/
155     2  1x,'Iter          Residuum     Cpu    Wall',/
156     3  1x,'--------------------------------------')
157 9410 format(
158     1  1x,'--------------------------------------',/
159     2  1x,'Iterations converged')
160 9420 format(1x,i4,f18.13,2f8.1)
161 9440 format(1x,A3,' axis ( ',A4,'symmetry)')
162      end
163