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