2
C rt_tddft_init_overlap_canorg.F
4
C Initialize overlap matrix and find eigenvalues, then initialize
5
C canonical orthogonalization.
8
subroutine rt_tddft_init_overlap_canorg (params)
12
#include "mafdecls.fh"
19
#include "rt_tddft.fh"
23
type(rt_params_t), intent(inout) :: params !geom params stored in here
27
character(*), parameter :: pname =
28
$ "rt_tddft_init_overlap_canorg: "
32
integer ga_create_atom_blocked
33
external ga_create_atom_blocked
39
integer isvals, lsvals
43
double precision toll_s
45
C integer g_scr, g_s12, g_sn12
53
C Build overlap matrix (ripped from dft_main0d)
55
if (.not. rtdb_get(params%rtdb, 'dft:atomblock',mt_log,1,atmblk))
59
g_s = ga_create_atom_blocked(geom, AO_bas_han, 'AO ovl')
61
if (.not. ga_create(mt_dbl, nbf_ao, nbf_ao, 'AO ovl',
63
& call errquit(pname//'Error creating ga',0,GA_ERR)
68
if (.not.MA_Push_Get(MT_Dbl, nbf_ao, 'ovl eig vals', lsvals,
70
& call errquit(pname//'Cannot allocate ovl eig vals', 0,
73
call dfill(nbf_ao, 0.0d0, dbl_mb(isvals), 1)
75
call int_1e_ga(AO_bas_han, AO_bas_han, g_s, 'overlap', oskel)
76
if (oskel) call sym_symmetrize(geom, AO_bas_han, .false., g_s)
80
C Diagonalize overlap (partially ripped from dft_main0d). We just
81
C use the stock diagonalizer.
83
if (.not. ga_duplicate(g_s, g_svecs, 'AO ovl eig vecs'))
84
& call errquit(pname//'Error creating ga',0,GA_ERR)
87
CXXX [KAL]: valrgrind picking up unintialized values when using parallel diag routine??
88
C call ga_diag_std(g_s, g_svecs, Dbl_MB(isvals))
89
call ga_diag_std_seq (g_s, g_svecs, Dbl_MB(isvals))
93
C Now that we have the overlap eigenvalues/vectors, initialize
94
C canonical orthogonalization. This will set the value of
97
call canorg_init (params, dbl_mb(isvals), g_svecs)
101
C Store overlap for future use and destroy eigenvals/vecs.
107
c$$$ if (.not. ga_duplicate (g_s, g_scr, "scr"))
108
c$$$ $ call errquit (pname//"failed to create scr",0,0)
110
c$$$ if (.not. ga_duplicate (g_s, g_s12, "s12"))
111
c$$$ $ call errquit (pname//"failed to create s12",0,0)
113
c$$$ if (.not. ga_duplicate (g_s, g_sn12, "sn12"))
114
c$$$ $ call errquit (pname//"failed to create sn12",0,0)
117
call util_tolls (params%rtdb, .false., toll_s,
118
$ n_dep, dbl_mb(isvals), params%nbf_ao)
122
c$$$ call ga_zero (g_scr)
123
c$$$ call diis_bld12_so(toll_s, dbl_mb(isvals), g_svecs, g_sn12,
124
c$$$ & g_scr, nbf_ao, 2)
127
c$$$ call ga_zero (g_scr)
128
c$$$ call diis_bld12_so(toll_s, dbl_mb(isvals), g_svecs, g_s12,
129
c$$$ & g_scr, nbf_ao, 3)
132
C params%g_s12 = g_s12
133
C params%g_sn12 = g_sn12
136
if (.not. ga_destroy (g_svecs))
137
$ call errquit (pname//"Failed to destroy Svecs", 0, 0)
139
c$$$ if (.not. ga_destroy (g_scr))
140
c$$$ $ call errquit (pname//"Failed to destroy scr", 0, 0)
142
if (.not.ma_pop_stack(lsvals))
143
$ call errquit(pname//'cannot pop stack',0, MA_ERR)
154
CXXX [KAL]: EXPERIMENTAL SO ROUTINE
156
subroutine rt_tddft_init_overlap_canorg_new (params)
159
#include "errquit.fh"
160
#include "mafdecls.fh"
167
#include "rt_tddft.fh"
171
type(rt_params_t), intent(inout) :: params !geom params stored in here
175
character(*), parameter :: pname =
176
$ "rt_tddft_init_overlap_canorg: "
180
integer ga_create_atom_blocked
181
external ga_create_atom_blocked
186
integer g_s, g_svecs, g_s_super
187
integer isvals, lsvals
196
C Build overlap matrix (ripped from dft_main0d)
197
C note "geom" (active geometry) is in common block
199
if (.not. rtdb_get(params%rtdb, 'dft:atomblock',mt_log,1,atmblk))
203
g_s = ga_create_atom_blocked(geom, AO_bas_han, 'AO ovl')
205
if (.not. ga_create(mt_dbl, nbf_ao, nbf_ao, 'AO ovl',
207
& call errquit(pname//'Error creating ga',0,GA_ERR)
212
call int_1e_ga(AO_bas_han, AO_bas_han, g_s, 'overlap', oskel)
213
if (oskel) call sym_symmetrize(geom, AO_bas_han, .false., g_s)
217
if (.not.MA_Push_Get(MT_Dbl, 2*nbf_ao, 'ovl eig vals', lsvals,
219
& call errquit(pname//'Cannot allocate ovl eig vals', 0,
222
call dfill(2*nbf_ao, 0.0d0, dbl_mb(isvals), 1)
227
C Upconvert overlap matrix to supermatrix form:
232
C call rt_tddft_so_upconvert (params, g_s)
234
if (.not. ga_create(mt_dbl, 2*nbf_ao, 2*nbf_ao, 'AO ovl (super)',
236
& call errquit(pname//'Error creating g_s_super',0,GA_ERR)
238
call ga_zero (g_s_super)
243
$ 1d0, g_s, 1, nbf_ao, 1, nbf_ao,
244
$ 1d0, g_s_super, 1, nbf_ao, 1, nbf_ao,
245
$ g_s_super, 1, nbf_ao, 1, nbf_ao)
250
$ 1d0, g_s, 1, nbf_ao, 1, nbf_ao,
251
$ 1d0, g_s_super, nbf_ao+1, 2*nbf_ao, nbf_ao+1, 2*nbf_ao,
252
$ g_s_super, nbf_ao+1, 2*nbf_ao, nbf_ao+1, 2*nbf_ao)
257
C Diagonalize the super overlap (partially ripped from dft_main0d).
258
C We just use the stock diagonalizer.
260
if (.not. ga_duplicate(g_s_super, g_svecs, 'AO ovl eig vecs'))
261
& call errquit(pname//'Error creating ga',0,GA_ERR)
262
call ga_zero(g_svecs)
264
CXXX [KAL]: valrgrind picking up unintialized values when using parallel diag routine??
265
C call ga_diag_std(g_s, g_svecs, Dbl_MB(isvals))
266
call ga_diag_std_seq (g_s_super, g_svecs, Dbl_MB(isvals))
270
C Now that we have the overlap eigenvalues/vectors, initialize
271
C canonical orthogonalization. This will set the value of
274
C call canorg_init (params, dbl_mb(isvals), g_svecs)
275
C XXX MAKE NEW CANORG WHICH TAKES SUPER MATS AND DOESNT UPCONVERT
277
call ga_print (g_svecs)
280
if (ga_nodeid().eq.0) then
281
write (6,*) i, dbl_mb(isvals+i-1)
287
C call canorg_init_new (params, dbl_mb(isvals), g_svecs)
292
C Store overlap for future use and destroy eigenvals/vecs.
294
params%g_s = g_s_super
296
if (.not. ga_destroy (g_svecs))
297
$ call errquit (pname//"Failed to destroy Svecs", 0, 0)
299
if (.not.ma_pop_stack(lsvals))
300
& call errquit(pname//'cannot pop stack',0, MA_ERR)