89
70
if(params.local) local_init();
92
/* sort_lamps(); now provided by cclambda */
94
cartcomp = (char **) malloc(3 * sizeof(char *));
95
cartcomp[0] = strdup("X");
96
cartcomp[1] = strdup("Y");
97
cartcomp[2] = strdup("Z");
99
if(!strcmp(params.prop,"POLARIZABILITY") || !strcmp(params.prop,"ALL") ||
100
!strcmp(params.prop,"ROTATION")) {
102
tensor = block_matrix(3,3);
104
/* prepare electric dipole integrals */
109
/* Compute the electric-dipole-perturbed CC wave functions */
110
for(alpha=0; alpha < 3; alpha++) {
111
compute_X("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], params.omega);
112
if(params.omega != 0.0) compute_X("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega);
115
for(alpha=0; alpha < 3; alpha++) {
116
for(beta=0; beta < 3; beta++) {
118
tensor[alpha][beta] = 0.0;
125
if(!(moinfo.mu_irreps[alpha]^moinfo.mu_irreps[beta])) {
127
if(params.omega != 0.0) {
128
polar_LCX = LCX("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], "Mu", cartcomp[beta],
129
moinfo.mu_irreps[beta], params.omega);
130
polar_LCX += LCX("Mu", cartcomp[beta], moinfo.mu_irreps[beta], "Mu", cartcomp[alpha],
131
moinfo.mu_irreps[alpha], -params.omega);
132
polar_HXY = HXY("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
133
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], params.omega);
134
polar_LHX1Y1 = LHX1Y1("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
135
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], params.omega);
136
polar_LHX2Y2 = LHX2Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
137
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], params.omega);
138
polar_LHX1Y2 = LHX1Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
139
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], params.omega);
140
polar_LHX1Y2 += LHX1Y2("Mu", cartcomp[beta], moinfo.mu_irreps[beta], params.omega,
141
"Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega);
144
polar_LCX = LCX("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], "Mu", cartcomp[beta],
145
moinfo.mu_irreps[beta], 0.0);
146
polar_LCX += LCX("Mu", cartcomp[beta], moinfo.mu_irreps[beta], "Mu", cartcomp[alpha],
147
moinfo.mu_irreps[alpha], 0.0);
148
polar_HXY = HXY("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
149
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], 0.0);
150
polar_LHX1Y1 = LHX1Y1("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
151
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], 0.0);
152
polar_LHX2Y2 = LHX2Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
153
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], 0.0);
154
polar_LHX1Y2 = LHX1Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
155
"Mu", cartcomp[beta], moinfo.mu_irreps[beta], 0.0);
156
polar_LHX1Y2 += LHX1Y2("Mu", cartcomp[beta], moinfo.mu_irreps[beta], 0.0,
157
"Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0);
160
polar = polar_LCX + polar_HXY + polar_LHX1Y1 + polar_LHX2Y2 + polar_LHX1Y2;
162
fprintf(outfile, "polar_LCX = %20.12f\n", polar_LCX);
163
fprintf(outfile, "polar_HXY = %20.12f\n", polar_HXY);
164
fprintf(outfile, "polar_LHX1Y1 = %20.12f\n", polar_LHX1Y1);
165
fprintf(outfile, "polar_LHX2Y2 = %20.12f\n", polar_LHX2Y2);
166
fprintf(outfile, "polar_LHX1Y2 = %20.12f\n", polar_LHX1Y2);
169
tensor[alpha][beta] = -polar;
174
fprintf(outfile, "\n CCSD Dipole Polarizability [(e^2 a0^2)/E_h]:\n");
175
fprintf(outfile, " -------------------------------------------------------------------------\n");
176
if(params.omega != 0.0)
177
omega_nm = (_c*_h*1e9)/(_hartree2J*params.omega);
178
omega_ev = _hartree2ev*params.omega;
179
omega_cm = _hartree2wavenumbers*params.omega;
180
if(params.omega != 0.0)
181
fprintf(outfile, " Evaluated at omega = %8.6f E_h (%6.2f nm, %5.3f eV, %8.2f cm-1)\n",
182
params.omega, omega_nm, omega_ev, omega_cm);
184
fprintf(outfile, " Evaluated at omega = %8.6f E_h (Inf nm, %5.3f eV, %8.2f cm-1)\n",
185
params.omega, omega_ev, omega_cm);
186
fprintf(outfile, " -------------------------------------------------------------------------\n");
187
mat_print(tensor, 3, 3, outfile);
192
/*** Optical rotation ***/
194
/* prepare magnetic dipole integrals */
195
if(!strcmp(params.prop,"ROTATION") || !strcmp(params.prop,"ALL")) {
197
tensor = block_matrix(3,3);
199
/* prepare the magnetic-dipole integrals */
204
/* Compute the +omega magnetic-dipole-perturbed CC wave functions */
205
/* NB: The -omega electric-dipole perturbed wfns should already be available */
206
for(alpha=0; alpha < 3; alpha++)
207
compute_X("L", cartcomp[alpha], moinfo.l_irreps[alpha], params.omega);
209
for(alpha=0; alpha < 3; alpha++) {
210
for(beta=0; beta < 3; beta++) {
218
if(!(moinfo.mu_irreps[alpha]^moinfo.l_irreps[beta])) {
220
if(params.omega != 0.0) {
221
polar_LCX = LCX("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], "L", cartcomp[beta],
222
moinfo.l_irreps[beta], params.omega);
223
polar_LCX += LCX("L", cartcomp[beta], moinfo.l_irreps[beta], "Mu", cartcomp[alpha],
224
moinfo.mu_irreps[alpha], -params.omega);
225
polar_HXY = HXY("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
226
"L", cartcomp[beta], moinfo.l_irreps[beta], params.omega);
227
polar_LHX1Y1 = LHX1Y1("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
228
"L", cartcomp[beta], moinfo.l_irreps[beta], params.omega);
229
polar_LHX2Y2 = LHX2Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
230
"L", cartcomp[beta], moinfo.l_irreps[beta], params.omega);
231
polar_LHX1Y2 = LHX1Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega,
232
"L", cartcomp[beta], moinfo.l_irreps[beta], params.omega);
233
polar_LHX1Y2 += LHX1Y2("L", cartcomp[beta], moinfo.l_irreps[beta], params.omega,
234
"Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], -params.omega);
237
polar_LCX = LCX("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], "L", cartcomp[beta],
238
moinfo.l_irreps[beta], 0.0);
239
polar_LCX += LCX("L", cartcomp[beta], moinfo.l_irreps[beta], "Mu", cartcomp[alpha],
240
moinfo.mu_irreps[alpha], 0.0);
241
polar_HXY = HXY("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
242
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
243
polar_LHX1Y1 = LHX1Y1("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
244
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
245
polar_LHX2Y2 = LHX2Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
246
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
247
polar_LHX1Y2 = LHX1Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
248
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
249
polar_LHX1Y2 += LHX1Y2("L", cartcomp[beta], moinfo.l_irreps[beta], 0.0,
250
"Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0);
253
polar = polar_LCX + polar_HXY + polar_LHX1Y1 + polar_LHX2Y2 + polar_LHX1Y2;
255
fprintf(outfile, "polar_LCX = %20.12f\n", polar_LCX);
256
fprintf(outfile, "polar_HXY = %20.12f\n", polar_HXY);
257
fprintf(outfile, "polar_LHX1Y1 = %20.12f\n", polar_LHX1Y1);
258
fprintf(outfile, "polar_LHX2Y2 = %20.12f\n", polar_LHX2Y2);
259
fprintf(outfile, "polar_LHX1Y2 = %20.12f\n", polar_LHX1Y2);
262
tensor[alpha][beta] = 0.5 * polar;
264
/* fprintf(outfile, "%1s%1s polar = %20.12f\n", cartcomp[alpha], cartcomp[beta], polar); */
268
/* prepare the complex-conjugate of the magnetic-dipole integrals */
273
/* Compute the -omega cc-magnetic-dipole-perturbed CC wave functions */
274
/* NB: The +omega electric-dipole perturbed wfns should already be available */
275
for(alpha=0; alpha < 3; alpha++)
276
compute_X("L", cartcomp[alpha], moinfo.l_irreps[alpha], -params.omega);
278
for(alpha=0; alpha < 3; alpha++) {
279
for(beta=0; beta < 3; beta++) {
287
if(!(moinfo.mu_irreps[alpha]^moinfo.l_irreps[beta])) {
289
if(params.omega != 0.0) {
290
polar_LCX = LCX("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], "L", cartcomp[beta],
291
moinfo.l_irreps[beta], -params.omega);
292
polar_LCX += LCX("L", cartcomp[beta], moinfo.l_irreps[beta], "Mu", cartcomp[alpha],
293
moinfo.mu_irreps[alpha], params.omega);
294
polar_HXY = HXY("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], params.omega,
295
"L", cartcomp[beta], moinfo.l_irreps[beta], -params.omega);
296
polar_LHX1Y1 = LHX1Y1("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], params.omega,
297
"L", cartcomp[beta], moinfo.l_irreps[beta], -params.omega);
298
polar_LHX2Y2 = LHX2Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], params.omega,
299
"L", cartcomp[beta], moinfo.l_irreps[beta], -params.omega);
300
polar_LHX1Y2 = LHX1Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], params.omega,
301
"L", cartcomp[beta], moinfo.l_irreps[beta], -params.omega);
302
polar_LHX1Y2 += LHX1Y2("L", cartcomp[beta], moinfo.l_irreps[beta], -params.omega,
303
"Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], params.omega);
306
polar_LCX = LCX("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], "L", cartcomp[beta],
307
moinfo.l_irreps[beta], 0.0);
308
polar_LCX += LCX("L", cartcomp[beta], moinfo.l_irreps[beta], "Mu", cartcomp[alpha],
309
moinfo.mu_irreps[alpha], 0.0);
310
polar_HXY = HXY("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
311
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
312
polar_LHX1Y1 = LHX1Y1("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
313
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
314
polar_LHX2Y2 = LHX2Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
315
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
316
polar_LHX1Y2 = LHX1Y2("Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0,
317
"L", cartcomp[beta], moinfo.l_irreps[beta], 0.0);
318
polar_LHX1Y2 += LHX1Y2("L", cartcomp[beta], moinfo.l_irreps[beta], 0.0,
319
"Mu", cartcomp[alpha], moinfo.mu_irreps[alpha], 0.0);
322
polar = polar_LCX + polar_HXY + polar_LHX1Y1 + polar_LHX2Y2 + polar_LHX1Y2;
324
fprintf(outfile, "polar_LCX = %20.12f\n", polar_LCX);
325
fprintf(outfile, "polar_HXY = %20.12f\n", polar_HXY);
326
fprintf(outfile, "polar_LHX1Y1 = %20.12f\n", polar_LHX1Y1);
327
fprintf(outfile, "polar_LHX2Y2 = %20.12f\n", polar_LHX2Y2);
328
fprintf(outfile, "polar_LHX1Y2 = %20.12f\n", polar_LHX1Y2);
330
tensor[alpha][beta] += 0.5 * polar;
332
/* fprintf(outfile, "%1s%1s polar = %20.12f\n", cartcomp[alpha], cartcomp[beta], polar); */
336
fprintf(outfile, "\n CCSD Optical Rotation Tensor:\n");
337
fprintf(outfile, " -------------------------------------------------------------------------\n");
338
fprintf(outfile, " Evaluated at omega = %8.6f E_h (%6.2f nm, %5.3f eV, %8.2f cm-1)\n", params.omega,
339
(_c*_h*1e9)/(_hartree2J*params.omega), _hartree2ev*params.omega,
340
_hartree2wavenumbers*params.omega);
341
fprintf(outfile, " -------------------------------------------------------------------------\n");
342
mat_print(tensor, 3, 3, outfile);
344
/* compute the specific rotation */
345
for(i=0,M=0.0; i < moinfo.natom ;i++) M += an2masses[(int) moinfo.zvals[i]]; /* amu */
346
TrG = (tensor[0][0] + tensor[1][1] + tensor[2][2])/(3.0 * params.omega);
347
nu = params.omega; /* hartree */
348
bohr2a4 = _bohr2angstroms * _bohr2angstroms * _bohr2angstroms * _bohr2angstroms;
349
m2a = _bohr2angstroms * 1.0e-10;
350
hbar = _h/(2.0 * _pi);
351
prefactor = 1.0e-2 * hbar/(_c * 2.0 * _pi * _me * m2a * m2a);
352
prefactor *= prefactor;
353
prefactor *= 288.0e-30 * _pi * _pi * _na * bohr2a4;
354
rotation = prefactor * TrG * nu * nu / M;
355
fprintf(outfile, "\n\t[alpha]_(%5.3f) = %20.12f deg/[dm (gm/cm^3)]\n", params.omega, rotation);
360
for(alpha=0; alpha < 3; alpha++) free(cartcomp[alpha]);
72
if (!strcmp(params.wfn,"CC2")) {
79
sort_lamps(); /* should be removed sometime - provided by cclambda */
80
if(strcmp(params.wfn,"CC2")) lambda_residuals(); /* don't do this for CC2 */
82
if(!strcmp(params.prop,"POLARIZABILITY")) polar();
83
if(!strcmp(params.prop,"ROTATION")) optrot();
364
85
if(params.local) local_done();