~ubuntu-branches/ubuntu/quantal/psicode/quantal

« back to all changes in this revision

Viewing changes to src/bin/cceom/schmidt_add.cc

  • Committer: Bazaar Package Importer
  • Author(s): Michael Banck, Michael Banck, Daniel Leidert
  • Date: 2009-02-23 00:12:02 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090223001202-rutldoy3dimfpesc
Tags: 3.4.0-1
* New upstream release.

[ Michael Banck ]
* debian/patches/01_DESTDIR.dpatch: Refreshed.
* debian/patches/02_FHS.dpatch: Removed, applied upstream.
* debian/patches/03_debian_docdir: Likewise.
* debian/patches/04_man.dpatch: Likewise.
* debian/patches/06_466828_fix_gcc_43_ftbfs.dpatch: Likewise.
* debian/patches/07_464867_move_executables: Fixed and refreshed.
* debian/patches/00list: Adjusted.
* debian/control: Improved description.
* debian/patches-held: Removed.
* debian/rules (install/psi3): Do not ship the ruby bindings for now.

[ Daniel Leidert ]
* debian/rules: Fix txtdir via DEB_MAKE_INSTALL_TARGET.
* debian/patches/01_DESTDIR.dpatch: Refreshed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*! \file
 
2
    \ingroup CCEOM
 
3
    \brief Enter brief description of file here 
 
4
*/
 
5
#include <cstdio>
 
6
#include <cmath>
 
7
#include "MOInfo.h"
 
8
#include "Params.h"
 
9
#include "Local.h"
 
10
#define EXTERN
 
11
#include "globals.h"
 
12
 
 
13
namespace psi { namespace cceom {
 
14
 
 
15
/* This function orthogonalizes the r residual vector with the set of
 
16
numCs C vectors and adds the new vector to the C list if its norm is greater
 
17
than params.residual_tol */
 
18
 
 
19
extern double norm_C(dpdfile2 *CME, dpdfile2 *Cme,
 
20
  dpdbuf4 *CMNEF, dpdbuf4 *Cmnef, dpdbuf4 *CMnEf);
 
21
 
 
22
extern void scm_C(dpdfile2 *CME, dpdfile2 *Cme, dpdbuf4 *CMNEF,
 
23
  dpdbuf4 *Cmnef, dpdbuf4 *CMnEf, double a);
 
24
 
 
25
/* use for ROHF and UHF */
 
26
void schmidt_add(dpdfile2 *RIA, dpdfile2 *Ria,
 
27
  dpdbuf4 *RIJAB, dpdbuf4 *Rijab, dpdbuf4 *RIjAb, int *numCs, int irrep)
 
28
{
 
29
  double dotval;
 
30
  double norm;
 
31
  int i, I;
 
32
  dpdfile2 Cme, CME, Cme2, CME2;
 
33
  dpdbuf4 CMNEF, Cmnef, CMnEf, CMNEF2, Cmnef2, CMnEf2;
 
34
  dpdbuf4 CMnEf_buf;
 
35
  char CME_lbl[32], Cme_lbl[32], CMNEF_lbl[32], Cmnef_lbl[32], CMnEf_lbl[32];
 
36
 
 
37
  for (i=0; i<*numCs; i++) {
 
38
    sprintf(CME_lbl, "%s %d", "CME", i);
 
39
    sprintf(Cme_lbl, "%s %d", "Cme", i);
 
40
    sprintf(CMNEF_lbl, "%s %d", "CMNEF", i);
 
41
    sprintf(Cmnef_lbl, "%s %d", "Cmnef", i);
 
42
    sprintf(CMnEf_lbl, "%s %d", "CMnEf", i);
 
43
 
 
44
    dpd_file2_init(&CME, EOM_CME, irrep, 0, 1, CME_lbl);
 
45
    dpd_buf4_init(&CMNEF, EOM_CMNEF, irrep, 2, 7, 2, 7, 0, CMNEF_lbl);
 
46
    if (params.eom_ref == 1) {
 
47
      dpd_file2_init(&Cme, EOM_Cme, irrep, 0, 1, Cme_lbl);
 
48
      dpd_buf4_init(&Cmnef, EOM_Cmnef, irrep, 2, 7, 2, 7, 0, Cmnef_lbl);
 
49
      dpd_buf4_init(&CMnEf, EOM_CMnEf, irrep, 0, 5, 0, 5, 0, CMnEf_lbl);
 
50
    }
 
51
    else if (params.eom_ref == 2) {
 
52
      dpd_file2_init(&Cme, EOM_Cme, irrep, 2, 3, Cme_lbl);
 
53
      dpd_buf4_init(&Cmnef, EOM_Cmnef, irrep, 12, 17, 12, 17, 0, Cmnef_lbl);
 
54
      dpd_buf4_init(&CMnEf, EOM_CMnEf, irrep, 22, 28, 22, 28, 0, CMnEf_lbl);
 
55
    }
 
56
 
 
57
    dotval  = dpd_file2_dot(RIA, &CME);
 
58
    dotval += dpd_file2_dot(Ria, &Cme);
 
59
  //fprintf(outfile, "OE Dotval for vector %d = %20.14f\n", i, dotval);
 
60
    dotval += dpd_buf4_dot(RIJAB, &CMNEF);
 
61
    dotval += dpd_buf4_dot(Rijab, &Cmnef);
 
62
    dotval += dpd_buf4_dot(RIjAb, &CMnEf);
 
63
 
 
64
  //fprintf(outfile, "Dotval for vector %d = %20.14f\n", i, dotval);
 
65
 
 
66
    dpd_file2_axpy(&CME, RIA, -1.0*dotval, 0);
 
67
    dpd_file2_axpy(&Cme, Ria, -1.0*dotval, 0);
 
68
    dpd_buf4_axpy(&CMNEF, RIJAB, -1.0*dotval);
 
69
    dpd_buf4_axpy(&Cmnef, Rijab, -1.0*dotval);
 
70
    dpd_buf4_axpy(&CMnEf, RIjAb, -1.0*dotval);
 
71
 
 
72
    dpd_file2_close(&CME);
 
73
    dpd_file2_close(&Cme);
 
74
    dpd_buf4_close(&CMNEF);
 
75
    dpd_buf4_close(&Cmnef);
 
76
    dpd_buf4_close(&CMnEf);
 
77
  }
 
78
 
 
79
  norm = norm_C(RIA, Ria, RIJAB, Rijab, RIjAb);
 
80
  //fprintf(outfile, "Norm of residual (TDC) = %20.14f\n", norm);
 
81
 
 
82
  if (norm < eom_params.schmidt_add_residual_tol) {
 
83
    return;
 
84
  }
 
85
  else {
 
86
    scm_C(RIA, Ria, RIJAB, Rijab, RIjAb, 1.0/norm);
 
87
    sprintf(CME_lbl, "%s %d", "CME", *numCs);
 
88
    sprintf(Cme_lbl, "%s %d", "Cme", *numCs);
 
89
    sprintf(CMNEF_lbl, "%s %d", "CMNEF", *numCs);
 
90
    sprintf(Cmnef_lbl, "%s %d", "Cmnef", *numCs);
 
91
    sprintf(CMnEf_lbl, "%s %d", "CMnEf", *numCs);
 
92
 
 
93
    dpd_file2_copy(RIA, EOM_CME, CME_lbl);
 
94
    dpd_file2_copy(Ria, EOM_Cme, Cme_lbl);
 
95
    dpd_buf4_copy(RIJAB, EOM_CMNEF, CMNEF_lbl);
 
96
    dpd_buf4_copy(Rijab, EOM_Cmnef, Cmnef_lbl);
 
97
    dpd_buf4_copy(RIjAb, EOM_CMnEf, CMnEf_lbl);
 
98
 
 
99
    ++(*numCs);
 
100
  }
 
101
  return;
 
102
}
 
103
 
 
104
void schmidt_add_RHF(dpdfile2 *RIA, dpdbuf4 *RIjAb, int *numCs, int irrep)
 
105
{
 
106
  double dotval, norm, R0, C0;
 
107
  int i, I;
 
108
  dpdfile2 CME;
 
109
  dpdbuf4 CMnEf, CAB1, CAB2;
 
110
  dpdfile2 R1;
 
111
  dpdbuf4 R2a, R2b;
 
112
  char CME_lbl[32], Cme_lbl[32], CMNEF_lbl[32], Cmnef_lbl[32], CMnEf_lbl[32], C0_lbl[32];
 
113
 
 
114
  if (params.full_matrix) psio_read_entry(EOM_R, "R0", (char *) &R0, sizeof(double));
 
115
 
 
116
  for (i=0; i<*numCs; i++) {
 
117
    /* Spin-adapt the residual */
 
118
    dpd_buf4_copy(RIjAb, EOM_TMP, "RIjAb");
 
119
    dpd_buf4_sort(RIjAb, EOM_TMP, pqsr, 0, 5, "RIjbA");
 
120
 
 
121
    dpd_buf4_init(&R2a, EOM_TMP, irrep, 0, 5, 0, 5, 0, "RIjAb");
 
122
    dpd_buf4_init(&R2b, EOM_TMP, irrep, 0, 5, 0, 5, 0, "RIjbA");
 
123
    dpd_buf4_scm(&R2a, 2.0);
 
124
    dpd_buf4_axpy(&R2b, &R2a, -1.0);
 
125
    dpd_buf4_close(&R2b);
 
126
 
 
127
    sprintf(CME_lbl, "%s %d", "CME", i);
 
128
    sprintf(CMnEf_lbl, "%s %d", "CMnEf", i);
 
129
    dpd_file2_init(&CME, EOM_CME, irrep, 0, 1, CME_lbl);
 
130
    dpd_buf4_init(&CMnEf, EOM_CMnEf, irrep, 0, 5, 0, 5, 0, CMnEf_lbl);
 
131
    dotval  = 2.0 * dpd_file2_dot(RIA, &CME);
 
132
 //fprintf(outfile, "OE Dotval for vector %d = %20.14f\n", i, dotval);
 
133
    dotval += dpd_buf4_dot(&R2a, &CMnEf);
 
134
    dpd_buf4_close(&R2a);
 
135
                if (params.full_matrix) {
 
136
      sprintf(C0_lbl, "%s %d", "C0", i);
 
137
                        psio_read_entry(EOM_CME, C0_lbl, (char *) &C0, sizeof(double));
 
138
                        dotval += C0 * R0;
 
139
                }
 
140
 
 
141
 //fprintf(outfile, "Dotval for vector %d = %20.14f\n", i, dotval);
 
142
                R0 = R0 - 1.0 * dotval * C0;
 
143
    dpd_file2_axpy(&CME, RIA, -1.0*dotval, 0);
 
144
    dpd_buf4_axpy(&CMnEf, RIjAb, -1.0*dotval);
 
145
    dpd_file2_close(&CME);
 
146
    dpd_buf4_close(&CMnEf);
 
147
  }
 
148
 
 
149
  dpd_buf4_sort(RIjAb, EOM_TMP, pqsr, 0, 5, "RIjbA");
 
150
  dpd_buf4_init(&R2b, EOM_TMP, irrep, 0, 5, 0, 5, 0, "RIjbA");
 
151
 
 
152
  /* norm = norm_C_rhf(RIA, RIjAb, &R2b); */
 
153
  norm  = 2.0 * dpd_file2_dot_self(RIA);
 
154
  norm += 2.0 * dpd_buf4_dot_self(RIjAb);
 
155
  norm -= dpd_buf4_dot(RIjAb, &R2b);
 
156
        if (params.full_matrix)
 
157
          norm += R0 * R0;
 
158
  norm = sqrt(norm);
 
159
 
 
160
  dpd_buf4_close(&R2b);
 
161
 
 
162
  //fprintf(outfile, "Norm of residual (TDC) = %20.14f\n", norm);
 
163
 
 
164
  if (norm < eom_params.schmidt_add_residual_tol) {
 
165
    return;
 
166
  }
 
167
  else {
 
168
 
 
169
    if (params.full_matrix) R0 *= 1.0/norm;
 
170
    dpd_file2_scm(RIA, 1.0/norm);
 
171
    dpd_buf4_scm(RIjAb, 1.0/norm);
 
172
 
 
173
#ifdef EOM_DEBUG
 
174
    dpd_buf4_sort(RIjAb, EOM_TMP, pqsr, 0, 5, "RIjbA");
 
175
    dpd_buf4_init(&R2b, EOM_TMP, irrep, 0, 5, 0, 5, 0, "RIjbA");
 
176
    norm  = 2.0 * dpd_file2_dot_self(RIA);
 
177
    norm += 2.0 * dpd_buf4_dot_self(RIjAb);
 
178
    norm -= dpd_buf4_dot(RIjAb, &R2b);
 
179
                if (params.full_matrix) norm += R0 * R0;
 
180
    norm = sqrt(norm);
 
181
    fprintf(outfile,"Norm of final new C in schmidt_add(): %20.15lf\n", norm);
 
182
    dpd_buf4_close(&R2b);
 
183
#endif
 
184
 
 
185
    sprintf(CME_lbl, "%s %d", "CME", *numCs);
 
186
    sprintf(CMnEf_lbl, "%s %d", "CMnEf", *numCs);
 
187
 
 
188
    dpd_file2_copy(RIA, EOM_CME, CME_lbl);
 
189
    dpd_buf4_copy(RIjAb, EOM_CMnEf, CMnEf_lbl);
 
190
 
 
191
    /* Generate AA and BB C2 vectors from AB vector */
 
192
    /* C(IJ,AB) = C(ij,ab) = C(Ij,Ab) - C(Ij,bA) */
 
193
    dpd_buf4_copy(RIjAb, EOM_TMP, "CMnEf");
 
194
    dpd_buf4_sort(RIjAb, EOM_TMP, pqsr, 0, 5, "CMnfE");
 
195
 
 
196
    dpd_buf4_init(&CAB1, EOM_TMP, irrep, 0, 5, 0, 5, 0, "CMnEf");
 
197
    dpd_buf4_init(&CAB2, EOM_TMP, irrep, 0, 5, 0, 5, 0, "CMnfE");
 
198
    dpd_buf4_axpy(&CAB2, &CAB1, -1.0);
 
199
    dpd_buf4_close(&CAB2);
 
200
    dpd_buf4_close(&CAB1);
 
201
 
 
202
                if (params.full_matrix) {
 
203
      sprintf(C0_lbl, "%s %d", "C0", *numCs);
 
204
                  psio_write_entry(EOM_CME, C0_lbl, (char *) &R0, sizeof(double));
 
205
                }
 
206
    ++(*numCs);
 
207
  }
 
208
  return;
 
209
}
 
210
 
 
211
}} // namespace psi::cceom