4
#include <libciomr/libciomr.h>
5
#include <libpsio/psio.h>
9
double LCX(char *pert_c, char *cart_c, int irrep_c,
10
char *pert_x, char *cart_x, int irrep_x, double omega);
11
double HXY(char *pert_x, char *cart_x, int irrep_x, double omega_x,
12
char *pert_y, char *cart_y, int irrep_y, double omega_y);
13
double LHX1Y1(char *pert_x, char *cart_x, int irrep_x, double omega_x,
14
char *pert_y, char *cart_y, int irrep_y, double omega_y);
15
double LHX2Y2(char *pert_x, char *cart_x, int irrep_x, double omega_x,
16
char *pert_y, char *cart_y, int irrep_y, double omega_y);
17
double LHX1Y2(char *pert_x, char *cart_x, int irrep_x, double omega_x,
18
char *pert_y, char *cart_y, int irrep_y, double omega_y);
19
double cc2_LHX1Y1(char *pert_x, char *cart_x, int irrep_x, double omega_x,
20
char *pert_y, char *cart_y, int irrep_y, double omega_y);
21
double cc2_LHX1Y2(char *pert_x, char *cart_x, int irrep_x, double omega_x,
22
char *pert_y, char *cart_y, int irrep_y, double omega_y);
24
void linresp(double **tensor, double A, double B,
25
char *pert_x, int *x_irreps, double omega_x,
26
char *pert_y, int *y_irreps, double omega_y)
29
double polar, polar_LCX, polar_HXY, polar_LHX1Y1, polar_LHX1Y2, polar_LHX2Y2;
32
cartcomp = (char **) malloc(3 * sizeof(char *));
33
cartcomp[0] = strdup("X");
34
cartcomp[1] = strdup("Y");
35
cartcomp[2] = strdup("Z");
37
for(alpha=0; alpha < 3; alpha++) {
38
for(beta=0; beta < 3; beta++) {
40
/* clear out scratch space */
41
for(j=CC_TMP; j <= CC_TMP11; j++) {
42
psio_close(j,0); psio_open(j,0);
51
if(!(x_irreps[alpha]^y_irreps[beta])) {
53
if(omega_y != 0.0) { /* we assume omega_x = -omega_y */
54
polar_LCX = LCX(pert_x, cartcomp[alpha], x_irreps[alpha],
55
pert_y, cartcomp[beta], y_irreps[beta], omega_y);
56
polar_LCX += LCX(pert_y, cartcomp[beta], y_irreps[beta],
57
pert_x, cartcomp[alpha], x_irreps[alpha], omega_x);
60
if (!strcmp(params.wfn,"CC2")) {
61
polar_HXY = HXY(pert_x, cartcomp[alpha], x_irreps[alpha], omega_x,
62
pert_y, cartcomp[beta], y_irreps[beta], omega_y);
63
polar_LHX1Y1 = cc2_LHX1Y1(pert_x, cartcomp[alpha], x_irreps[alpha], omega_x,
64
pert_y, cartcomp[beta], y_irreps[beta], omega_y);
65
polar_LHX1Y2 = cc2_LHX1Y2(pert_x, cartcomp[alpha], x_irreps[alpha], omega_x,
66
pert_y, cartcomp[beta], y_irreps[beta], omega_y);
67
polar_LHX1Y2 += cc2_LHX1Y2(pert_y, cartcomp[beta], y_irreps[beta], omega_y,
68
pert_x, cartcomp[alpha], x_irreps[alpha], omega_x);
71
polar_LHX1Y1 = LHX1Y1(pert_x, cartcomp[alpha], x_irreps[alpha], omega_x,
72
pert_y, cartcomp[beta], y_irreps[beta], omega_y);
73
polar_LHX2Y2 = LHX2Y2(pert_x, cartcomp[alpha], x_irreps[alpha], omega_x,
74
pert_y, cartcomp[beta], y_irreps[beta], omega_y);
75
polar_LHX1Y2 = LHX1Y2(pert_x, cartcomp[alpha], x_irreps[alpha], omega_x,
76
pert_y, cartcomp[beta], y_irreps[beta], omega_y);
77
polar_LHX1Y2 += LHX1Y2(pert_y, cartcomp[beta], y_irreps[beta], omega_y,
78
pert_x, cartcomp[alpha], x_irreps[alpha], omega_x);
83
polar_LCX = LCX(pert_x, cartcomp[alpha], x_irreps[alpha], pert_y, cartcomp[beta],
85
polar_LCX += LCX(pert_y, cartcomp[beta], y_irreps[beta], pert_x, cartcomp[alpha],
86
x_irreps[alpha], 0.0);
88
if (!strcmp(params.wfn,"CC2")) {
89
polar_HXY = HXY(pert_x, cartcomp[alpha], x_irreps[alpha], 0.0,
90
pert_y, cartcomp[beta], y_irreps[beta], 0.0);
91
polar_LHX1Y1 = cc2_LHX1Y1(pert_x, cartcomp[alpha], x_irreps[alpha], 0.0,
92
pert_y, cartcomp[beta], y_irreps[beta], 0.0);
93
polar_LHX1Y2 = cc2_LHX1Y2(pert_x, cartcomp[alpha], x_irreps[alpha], 0.0,
94
pert_y, cartcomp[beta], y_irreps[beta], 0.0);
95
polar_LHX1Y2 += cc2_LHX1Y2(pert_y, cartcomp[beta], y_irreps[beta], 0.0,
96
pert_x, cartcomp[alpha], x_irreps[alpha], 0.0);
99
polar_LHX1Y1 = LHX1Y1(pert_x, cartcomp[alpha], x_irreps[alpha], 0.0,
100
pert_y, cartcomp[beta], y_irreps[beta], 0.0);
101
polar_LHX2Y2 = LHX2Y2(pert_x, cartcomp[alpha], x_irreps[alpha], 0.0,
102
pert_y, cartcomp[beta], y_irreps[beta], 0.0);
103
polar_LHX1Y2 = LHX1Y2(pert_x, cartcomp[alpha], x_irreps[alpha], 0.0,
104
pert_y, cartcomp[beta], y_irreps[beta], 0.0);
105
polar_LHX1Y2 += LHX1Y2(pert_y, cartcomp[beta], y_irreps[beta], 0.0,
106
pert_x, cartcomp[alpha], x_irreps[alpha], 0.0);
111
if(params.sekino) /* only linear term needed in Sekino-Bartlett model III */
114
polar = polar_LCX + polar_HXY + polar_LHX1Y1 + polar_LHX2Y2 + polar_LHX1Y2;
116
if(params.print & 2) {
117
fprintf(outfile, "\n\tLinresp tensor[%s][%s]\n", cartcomp[alpha], cartcomp[beta]);
118
fprintf(outfile, "\tpolar_LCX = %20.12f\n", polar_LCX);
119
if(!strcmp(params.wfn,"CC2"))
120
fprintf(outfile, "\tpolar_HXY = %20.12f\n", polar_HXY);
121
fprintf(outfile, "\tpolar_LHX1Y1 = %20.12f\n", polar_LHX1Y1);
122
fprintf(outfile, "\tpolar_LHX1Y2 = %20.12f\n", polar_LHX1Y2);
123
fprintf(outfile, "\tpolar_LHX2Y2 = %20.12f\n", polar_LHX2Y2);
127
tensor[alpha][beta] = A * polar + B * tensor[alpha][beta];