1c
2c     $Id$
3c
4
5*  ************************************************************
6*  *                MPI cgminimize routine                    *
7*  *               (Fletcher-Reeves' steps)                   *
8*  *                                                          *
9*  *  This is a developing cgsdv3 parallel code wrtten for    *
10*  *  NWChem                                                  *
11*  *                                                          *
12*  ************************************************************
13
14      subroutine paw_nominimize(E)
15      implicit none
16      real*8     E(*)
17
18
19#include "bafdecls.fh"
20#include "errquit.fh"
21#include "paw_energy_kin_atom.fh"
22#include "paw_energy_vloc_atom.fh"
23#include "paw_energy_ion_atom.fh"
24#include "paw_energy_core_atom.fh"
25#include "paw_energy_hartree_atom.fh"
26#include "paw_xc.fh"
27
28
29*     **** local variables ****
30      logical value
31      integer i,neall,npack1,k
32
33      integer G1(2),R1(2)
34
35      double precision E0,ehartree,eorbit,exc,pxc,eion
36      double precision evloc_pw,evloc_atom,ehartr_pw,eke
37      double precision ekin_atom
38      double precision eion_atom
39      double precision ecore_atom
40      double precision ecore_ion_atom
41      double precision ecore_self_atom
42      double precision ehartree_atom
43      double precision exc_atom,pxc_atom
44
45
46
47*     **** external functions ****
48      integer  paw_psi_ne,control_version
49      real*8   paw_rho_error
50      real*8   paw_dng_1ehartree
51      real*8   paw_psi_1ke
52      real*8   paw_psi_1vl
53      real*8   paw_rho_1exc
54      real*8   paw_rho_1pxc
55      real*8   paw_psi_1eorbit
56      real*8   paw_mult_energy_atom_comp !**no header file for paw_mult**
57      real*8   paw_mult_energy_atom_self
58      real*8   paw_mult_energy_atom_mult
59
60      external paw_psi_ne,control_version
61      external paw_rho_error
62      external paw_dng_1ehartree
63      external paw_psi_1ke
64      external paw_psi_1vl
65      external paw_rho_1exc
66      external paw_rho_1pxc
67      external paw_psi_1eorbit
68      external paw_mult_energy_atom_comp
69      external paw_mult_energy_atom_self
70      external paw_mult_energy_atom_mult
71
72
73      call Pack_npack(1,npack1)
74      neall = paw_psi_ne(1)+paw_psi_ne(2)
75
76*     **** allocate G1, and R1 ****
77      value = BA_alloc_get(mt_dcpl,npack1*neall,
78     >                     'G1',G1(2),G1(1))
79      value = value.and.
80     >        BA_alloc_get(mt_dcpl,npack1*neall,
81     >                     'R1',R1(2),R1(1))
82      if (.not. value)
83     >  call errquit('paw_cgminimize:out of heap memory',0,MA_ERR)
84
85
86
87*     ***** get the initial gradient and direction ****
88      call paw_psi_1get_residual(dcpl_mb(R1(1)),dcpl_mb(G1(1)),E0)
89
90
91
92*     **** plane-wave energies ****
93      eorbit    = paw_psi_1eorbit()
94      eke       = paw_psi_1ke()
95      ehartr_pw = paw_dng_1ehartree()
96      exc       = paw_rho_1exc()
97      pxc       = paw_rho_1pxc()
98      evloc_pw  = paw_psi_1vl()
99
100
101*     **** atomic energies ***
102      ekin_atom     = paw_energy_kin_atom()
103      evloc_atom    = paw_energy_vloc_atom()
104
105      ehartree_atom   = paw_energy_hartree_atom()
106      eion_atom       = paw_energy_ion_atom()
107      ecore_atom      = paw_energy_core_atom()
108      ecore_ion_atom  = paw_energy_core_ion_atom()
109      ecore_self_atom = paw_energy_core_self_atom()
110
111      exc_atom        = paw_energy_xc_atom()
112
113
114*     *** kinetic energy
115      E(2) = eke
116      E(3) = ekin_atom
117
118*     *** coulomb contributions
119      E(4) = ehartr_pw
120      E(5) = eion_atom + ecore_atom + ehartree_atom +
121     >       ecore_ion_atom + ecore_self_atom +
122     >       paw_mult_energy_atom_self() +
123     >       paw_mult_energy_atom_comp()
124
125      E(6)=paw_mult_energy_atom_mult()
126
127*     *** exch-correlation
128      E(7) = exc
129      E(8) = exc_atom
130
131*     *** local pseudopot ***
132      E(9)  = evloc_pw
133      E(10) = evloc_atom
134
135c      write(*,*) "eke            =",eke
136c      write(*,*) "ekin_atom      =",ekin_atom
137c      write(*,*)
138c      write(*,*) "ehartr_pw      =",ehartr_pw
139c
140c      write(*,*)
141c      write(*,*) "eion_atom      =",eion_atom
142c      write(*,*) "ecore_atom     =",ecore_atom
143c      write(*,*) "ehartree_atom  =",ehartree_atom
144c      write(*,*) "ecore_ion_atom =",ecore_ion_atom
145c      write(*,*) "ecore_self_atom=",ecore_self_atom
146c      write(*,*) "mult_atom_self =",paw_mult_energy_atom_self()
147c      write(*,*) "mult_atom_comp =",paw_mult_energy_atom_comp()
148c      write(*,*)
149c
150c      write(*,*) "mult_mult      =",E(6)
151c      write(*,*)
152c      write(*,*) "exc            =",exc
153c      write(*,*) "exc_atom       =",exc_atom
154c      write(*,*)
155c      write(*,*) "evloc_pw       =",evloc_pw
156c      write(*,*) "evloc_atom     =",evloc_atom
157
158
159*     *** total energy ***
160      E(1) = 0.0d0
161      do i=2,10
162       E(1) = E(1) + E(i)
163      end do
164
165      E(11) = eorbit
166
167      value = BA_free_heap(R1(2))
168      value = value.and.BA_free_heap(G1(2))
169      if (.not. value)
170     >  call errquit('paw_nominimize:error freeing heap',0, MA_ERR)
171
172
173      return
174      end
175
176
177