1
subroutine get_alfaorbeta_reim(
2
& AorBre, ! in/out: alpha or beta real part
3
& AorBim, ! in/out: alpha or beta im part
4
& g_vecE1, ! in : 1st-order pert vec RE
5
& g_vecE1_im, ! in : 1st-order pert vec IM
6
& g_dipEM, ! in : dipole electric or magnetic
7
& g_vectors, ! in : MO vectors
8
& idir, ! in : = 1,2,3=x,y,z directions
9
& iresp, ! in : = 1,2,3
10
& coeffre, ! in : coeff for real part
11
& coeffim, ! in : coeff for imag part
12
& caseAO, ! in : indices in (alo,ahi)(3) (blo,bhi)(3)
13
& nbf, ! in : nr. basis functions
14
& nocc, ! in : nr. occupied alpha or beta
15
& lifetime, ! in : logical var for damping
16
& debug, ! in : logical var for debugging
17
& g_temp) ! in : scratch GA array
19
c Author : Fredy W. Aquino
21
c Note.- Modified from original aoresponse source code
22
c for extension to spin-unrestricted case
23
c original aoresponse source code was written by
24
c J. Autschbach and appears on nwchem-devtrunk (date:03-02-12)
26
c --> Experimental (not published yet)
31
#include "mafdecls.fh"
40
double precision AorBre, ! OUTPUT
42
integer idir,iresp,ndir,
45
integer alo(3),ahi(3),
48
integer g_temp, ! scratch ga arrays (input)
52
& g_dipEM ! IN : = g_dipel or g_dipmag
53
logical lifetime,debug
54
double precision sum,sumre,sumim,
55
& coeffre,coeffim,trace
56
external trace,get_C1MCtrace
57
double precision ga_trace_diag
58
external ga_trace_diag
60
if (ga_nodeid().eq.0) then
61
write(*,2) idir,iresp,caseAO,nbf,
63
2 format('(idir,iresp,caseAO,nbf,nocc)=(',
64
& i3,',',i3,',',i3,',',i3,',',i3,')')
66
if (ga_nodeid().eq.0) then
67
write(*,10) idir,iresp
68
10 format('---- g_vecE1(',i3,',',i3,')-------- START')
70
call ga_print(g_vecE1)
71
if (ga_nodeid().eq.0) then
72
write(*,11) idir,iresp
73
11 format('---- g_vecE1(',i3,',',i3,')-------- END')
75
if (ga_nodeid().eq.0) then
76
write(*,12) idir,iresp
77
12 format('---- g_dipEM(',i3,',',i3,')-------- START')
79
call ga_print(g_dipEM)
80
if (ga_nodeid().eq.0) then
81
write(*,21) idir,iresp
82
21 format('---- g_dipEM(',i3,',',i3,')-------- END')
84
if (ga_nodeid().eq.0) then
85
write(*,13) idir,iresp
86
13 format('---- g_vectors(',i3,',',i3,')-------- START')
88
call ga_print(g_vectors)
89
if (ga_nodeid().eq.0) then
90
write(*,14) idir,iresp
91
14 format('---- g_vectors(',i3,',',i3,')-------- END')
96
& sumre, ! out: trace(transp(vecE1 )*g_temp)
97
& sumim, ! out: trace(transp(vecE1im)*g_temp)
98
& lifetime, ! in : =T => returns sumim
99
& g_vecE1, ! in : 1st-order pert vec RE
100
& g_vecE1_im, ! in : 1st-order pert vec IM
101
& g_dipEM, ! in : dipole electric or magnetic
102
& g_vectors, ! in : MO vectors
103
& idir, ! in : = 1,2,3=x,y,z directions
104
& iresp, ! in : = 1,2,3
105
& caseAO, ! in : indices in (alo,ahi)(3) (blo,bhi)(3)
106
& nbf, ! in : nr. basis functions
107
& nocc, ! in : nr. occupied alpha or beta
108
& debug, ! in : logical var for debugging
109
& g_temp) ! in : scratch GA array -> out
111
c the factor of two is for the orbital occupations,
112
c assuming that ispin is never equal to two
113
AorBre=AorBre+coeffre*sumre
115
& AorBim=AorBim+coeffim*sumim
120
& g_work, ! out: C(E) M C
121
& g_vecE1, ! in : 1st-order pert vec RE
122
& g_dipEM, ! in : dipole electric or magnetic
123
& g_vectors, ! in : MO vectors
124
& idir, ! in : = 1,2,3=x,y,z directions
125
& iresp, ! in : = 1,2,3
126
& caseAO, ! in : indices in (alo,ahi)(3) (blo,bhi)(3)
127
& nbf, ! in : nr. basis functions
128
& nocc, ! in : nr. occupied alpha or beta
129
& debug, ! in : logical var for debugging
130
& g_temp) ! in : scratch GA array
132
c Author : Fredy W. Aquino
134
c Note.- Modified from original aoresponse source code
135
c for extension to spin-unrestricted case
136
c original aoresponse source code was written by
137
c J. Autschbach and appears on nwchem-devtrunk (date:03-02-12)
139
c --> Experimental (not published yet)
142
#include "errquit.fh"
144
#include "mafdecls.fh"
148
integer g_work ! = C(E) M C
152
integer alo(3),ahi(3),
155
integer g_temp, ! IN: scratch ga arrays (input)
158
& g_dipEM ! IN : = g_dipel or g_dipmag
160
c Note.- (ind1,ind2)=(iresp,1 ) for caseAO=1 (g_dipEM ne g_smat0)
161
c (ind1,ind2)=(1 ,iresp) for caseAO=2 (g_dipEM eq g_smat0)
162
c (ind1,ind2)=(1 ,idir ) for caseAO=3 (g_dipEM eq g_smat0) in aor_r1_beta_anl
163
c (ind1,ind2)=(idir ,1 ) for caseAO=4 (g_dipEM eq g_sket1) in aor_r1_beta_anl
164
if (caseAO .eq. 1) then
167
else if (caseAO .eq. 2) then
170
else if (caseAO .eq. 3) then
173
else if (caseAO .eq. 4) then
178
& ('get_C1MC: caseAO ne 1,2,3 or 4',
185
alo(3) = ind1 ! pick direction iresp for g_dipEM
198
if (ga_nodeid().eq.0) then
199
write(*,18) alo(1),ahi(1),alo(2),ahi(2),
201
& blo(1),bhi(1),blo(2),bhi(2),
203
& clo(1),chi(1),clo(2),chi(2),
205
18 format('FA-1::alo-ahi=(',i3,',',i3,',',
206
& i3,',',i3,',',i3,',',i3,') ',
207
& 'blo-bhi=(',i3,',',i3,',',
208
& i3,',',i3,',',i3,',',i3,') ',
209
& 'clo-chi=(',i3,',',i3,',',
210
& i3,',',i3,',',i3,',',i3,')')
215
call nga_matmul_patch('n','n',1d0,0d0,
219
if (debug) write (luout,*)
220
& 'alfa: h(E) C(0) intermediate complete'
236
if (ga_nodeid().eq.0) then
237
write(*,19) alo(1),ahi(1),alo(2),ahi(2),
239
& blo(1),bhi(1),blo(2),bhi(2),
241
& clo(1),chi(1),clo(2),chi(2),
243
19 format('FA-2::alo-ahi=(',i3,',',i3,',',
244
& i3,',',i3,',',i3,',',i3,') ',
245
& 'blo-bhi=(',i3,',',i3,',',
246
& i3,',',i3,',',i3,',',i3,') ',
247
& 'clo-chi=(',i3,',',i3,',',
248
& i3,',',i3,',',i3,',',i3,')')
253
if (ga_nodeid().eq.0)
254
& write(*,*) '----g_vecE1 --------- START'
255
call ga_print(g_vecE1)
256
if (ga_nodeid().eq.0)
257
& write(*,*) '----g_vecE1 --------- END'
258
if (ga_nodeid().eq.0)
259
& write(*,*) '----g_temp --------- START'
260
call ga_print(g_temp)
261
if (ga_nodeid().eq.0)
262
& write(*,*) '----g_temp --------- END'
264
call nga_matmul_patch('t','n',1d0,0d0,
269
if (ga_nodeid().eq.0)
270
& write(*,*) '----g_work-inside----- START'
271
call ga_print(g_work)
272
if (ga_nodeid().eq.0)
273
& write(*,*) '----g_work-inside------- END'
278
subroutine get_C1MCtrace(
279
& sumre, ! out: trace(transp(vecE1 )*g_temp)
280
& sumim, ! out: trace(transp(vecE1im)*g_temp)
281
& lifetime, ! in : =T => returns sumim
282
& g_vecE1, ! in : 1st-order pert vec RE
283
& g_vecE1_im, ! in : 1st-order pert vec IM
284
& g_dipEM, ! in : dipole electric or magnetic
285
& g_vectors, ! in : MO vectors
286
& idir, ! in : = 1,2,3=x,y,z directions
287
& iresp, ! in : = 1,2,3
288
& caseAO, ! in : indices in (alo,ahi)(3) (blo,bhi)(3)
289
& nbf, ! in : nr. basis functions
290
& nocc, ! in : nr. occupied alpha or beta
291
& debug, ! in : logical var for debugging
292
& g_temp) ! in : scratch GA array
293
c Note.- g_temp= g_dipEM * g_vectors
295
c Author : Fredy W. Aquino
297
c Note.- Modified from original aoresponse source code
298
c for extension to spin-unrestricted case
299
c original aoresponse source code was written by
300
c J. Autschbach and appears on nwchem-devtrunk (date:03-02-12)
302
c --> Experimental (not published yet)
305
#include "errquit.fh"
307
#include "mafdecls.fh"
314
integer alo(3),ahi(3),
317
integer g_temp, ! IN: scratch ga arrays (input)
321
& g_dipEM ! IN : = g_dipel or g_dipmag
322
double precision trace,sumre,sumim
324
logical lifetime,debug
325
c Note.- (ind1,ind2)=(iresp,1 ) for caseAO=1 (g_dipEM ne g_smat0)
326
c (ind1,ind2)=(1 ,iresp) for caseAO=2 (g_dipEM eq g_smat0)
327
c (ind1,ind2)=(1 ,idir ) for caseAO=3 (g_dipEM eq g_smat0) in aor_r1_beta_anl
328
c (ind1,ind2)=(idir ,1 ) for caseAO=4 (g_dipEM eq g_sket1) in aor_r1_beta_anl
329
if (caseAO .eq. 1) then
332
else if (caseAO .eq. 2) then
335
else if (caseAO .eq. 3) then
338
else if (caseAO .eq. 4) then
343
& ('get_C1MC: caseAO ne 1,2,3 or 4',
350
alo(3) = ind1 ! pick direction iresp for g_dipEM
363
if (ga_nodeid().eq.0) then
364
write(*,18) alo(1),ahi(1),alo(2),ahi(2),
366
& blo(1),bhi(1),blo(2),bhi(2),
368
& clo(1),chi(1),clo(2),chi(2),
370
18 format('FA-1::alo-ahi=(',i3,',',i3,',',
371
& i3,',',i3,',',i3,',',i3,') ',
372
& 'blo-bhi=(',i3,',',i3,',',
373
& i3,',',i3,',',i3,',',i3,') ',
374
& 'clo-chi=(',i3,',',i3,',',
375
& i3,',',i3,',',i3,',',i3,')')
380
call nga_matmul_patch('n','n',1d0,0d0,
384
if (debug) write (luout,*)
385
& 'alfa: h(E) C(0) intermediate complete'
401
if (ga_nodeid().eq.0) then
402
write(*,19) alo(1),ahi(1),alo(2),ahi(2),
404
& blo(1),bhi(1),blo(2),bhi(2),
406
& clo(1),chi(1),clo(2),chi(2),
408
19 format('FA-2::alo-ahi=(',i3,',',i3,',',
409
& i3,',',i3,',',i3,',',i3,') ',
410
& 'blo-bhi=(',i3,',',i3,',',
411
& i3,',',i3,',',i3,',',i3,') ',
412
& 'clo-chi=(',i3,',',i3,',',
413
& i3,',',i3,',',i3,',',i3,')')
417
if (ga_nodeid().eq.0)
418
& write(*,*) '----g_vecE1 --------- START'
419
call ga_print(g_vecE1)
420
if (ga_nodeid().eq.0)
421
& write(*,*) '----g_vecE1 --------- END'
422
if (ga_nodeid().eq.0)
423
& write(*,*) '----g_temp --------- START'
424
call ga_print(g_temp)
425
if (ga_nodeid().eq.0)
426
& write(*,*) '----g_temp --------- END'
428
sumre=trace( ! out: trace of transp(A)* B
435
sumim=trace( ! out: trace of transp(A)* B
440
endif ! end-if-lifetime
444
double precision function
445
& trace( ! out: trace of transp(A)* B
446
& g_A, ! in : GA matrix A
447
& g_B, ! in : GA matrix B
451
c Purpose: Calculate trace(transpose(A)*B) without the need
452
c of doing a matrix multiplication A*B
453
c Note1.- If we want trace(A*B) swap: (1,2) for (2,1) in (aho,ahi)
458
c Note2.- In nga_ddot_patch() the op1,op2='n','t' do not work
459
c or maybe it works if the resulting patch is not a vector
460
c if the resulting patch was a matrix then it could work
461
c transposing the resulting patch.
463
c Author : Fredy W. Aquino
465
c Note.- Modified from original aoresponse source code
466
c for extension to spin-unrestricted case
467
c original aoresponse source code was written by
468
c J. Autschbach and appears on nwchem-devtrunk (date:03-02-12)
470
c --> Experimental (not published yet)
473
#include "errquit.fh"
475
#include "mafdecls.fh"
480
double precision ac_trace
481
integer idir,nbf,nocc,i
482
integer alo(3),ahi(3),
498
ac_trace=nga_ddot_patch(g_A,'n',alo,ahi,