1
/* DISP_FREQ_ENERGY_CART makes symmetry-adapted cartesian coordinates and displaces
2
along them to setup frequencies by energy points */
4
DISP_FREQ_ENERGY_CART makes symmetry-adapted cartesian coordinates and displaces
5
along them to setup frequencies by energy points
6
Formulas for finite differences
8
O(1/h^2): [f(1,0) + f(-1,0) - 2f(0,0)]/(h^2)
9
[which is same as : [f(2,0) + f(-2,0) - 2f(0,0)]/(4h^2)
10
3-point - off-diagonal
11
O(1/h^2): old-way: [f(1,1) - f(1,-1) - f(-1,1) + f(-1,-1)]/(4h^2)
12
O(1/h^2): new-way: [f(1,1)+f(-1,-1)+2f(0,0) -f(1,0) -f(-1,0) -f(0,1) -f(0,-1)]/(2h^2)
14
5-point formula - diagonal
15
O(1/h^4): [-f(-2,0) + 16f(-1,0) + 16f(1,0) - f(2,0) - 30f(0,0)] / (12h^2)
16
5-point formula - off-diagonal
17
O(1/h^4): old-way [ 1f(-2,-2) - 8f(-1,-2) + 8f(+1,-2) - 1f(+2,-2) - 8f(-2,-1)
18
+ 64f(-1,-1) - 64f(+1,-1) + 8f(+2,-1) + 8f(-2,+1) - 64f(-1,+1) + 64f(+1,+1)
19
- 8f(+2,+1) - 1f(-2,+2) + 8f(-1,+2) - 8f(+1,+2) + 1f(+2,+2) / (144h^2)
20
O(1/h^4): new-way [ -1f(-1,-2) - 1f(-2,-1) + 9f(-1,-1) - 1f(+1,-1)
21
- 1f(-1,1) + 9f(+1,+1) - 1f(+2,+1) - 1f(1,2)
22
+ 1f(-2,0) - 7f(-1,0) - 7f(+1,0) + 1f(+2,0)
23
+ 1f(0,-2) - 7f(0,-1) - 7f(0,+1) + 1f(0,+2) + 12f(0,0)]/(12h^2)
12
28
#include <libchkpt/chkpt.h>
16
32
#include <libciomr/libciomr.h>
17
33
#include <libqt/qt.h>
18
34
#include <libipv1/ip_lib.h>
19
35
#include <physconst.h>
20
36
#include <libpsio/psio.h>
21
37
#include <psifiles.h>
381
385
/* add off-diagonal displacements */
383
387
for (i=0; i<nsalc[irrep]; ++i) {
384
for (j=i+1; j<nsalc[irrep]; ++j) {
388
for (j=0; j<i; ++j) {
385
389
if (optinfo.points == 3) {
386
390
for (k=0; k < 3*natom; ++k) {
387
391
geoms[irrep][cnt+0][k] += ( + salc[irrep][i][k] + salc[irrep][j][k] )
388
392
* optinfo.disp_size / sqrt(masses[k]);
389
geoms[irrep][cnt+1][k] += ( + salc[irrep][i][k] - salc[irrep][j][k] )
390
* optinfo.disp_size / sqrt(masses[k]);
391
geoms[irrep][cnt+2][k] += ( - salc[irrep][i][k] + salc[irrep][j][k] )
392
* optinfo.disp_size / sqrt(masses[k]);
393
geoms[irrep][cnt+3][k] += ( - salc[irrep][i][k] - salc[irrep][j][k] )
393
geoms[irrep][cnt+1][k] += ( - salc[irrep][i][k] - salc[irrep][j][k] )
394
394
* optinfo.disp_size / sqrt(masses[k]);
398
398
else if (optinfo.points == 5) {
399
399
for (k=0; k < 3*natom; ++k) {
400
geoms[irrep][cnt+0][k] += ( - 2.0 * salc[irrep][i][k] - 2.0 * salc[irrep][j][k] )
401
* optinfo.disp_size / sqrt(masses[k]);
402
geoms[irrep][cnt+1][k] += ( - 1.0 * salc[irrep][i][k] - 2.0 * salc[irrep][j][k] )
403
* optinfo.disp_size / sqrt(masses[k]);
404
geoms[irrep][cnt+2][k] += ( + 1.0 * salc[irrep][i][k] - 2.0 * salc[irrep][j][k] )
405
* optinfo.disp_size / sqrt(masses[k]);
406
geoms[irrep][cnt+3][k] += ( + 2.0 * salc[irrep][i][k] - 2.0 * salc[irrep][j][k] )
407
* optinfo.disp_size / sqrt(masses[k]);
408
geoms[irrep][cnt+4][k] += ( - 2.0 * salc[irrep][i][k] - 1.0 * salc[irrep][j][k] )
409
* optinfo.disp_size / sqrt(masses[k]);
410
geoms[irrep][cnt+5][k] += ( - 1.0 * salc[irrep][i][k] - 1.0 * salc[irrep][j][k] )
411
* optinfo.disp_size / sqrt(masses[k]);
412
geoms[irrep][cnt+6][k] += ( + 1.0 * salc[irrep][i][k] - 1.0 * salc[irrep][j][k] )
413
* optinfo.disp_size / sqrt(masses[k]);
414
geoms[irrep][cnt+7][k] += ( + 2.0 * salc[irrep][i][k] - 1.0 * salc[irrep][j][k] )
415
* optinfo.disp_size / sqrt(masses[k]);
416
geoms[irrep][cnt+8][k] += ( - 2.0 * salc[irrep][i][k] + 1.0 * salc[irrep][j][k] )
417
* optinfo.disp_size / sqrt(masses[k]);
418
geoms[irrep][cnt+9][k] += ( - 1.0 * salc[irrep][i][k] + 1.0 * salc[irrep][j][k] )
419
* optinfo.disp_size / sqrt(masses[k]);
420
geoms[irrep][cnt+10][k] += ( + 1.0 * salc[irrep][i][k] + 1.0 * salc[irrep][j][k] )
421
* optinfo.disp_size / sqrt(masses[k]);
422
geoms[irrep][cnt+11][k] += ( + 2.0 * salc[irrep][i][k] + 1.0 * salc[irrep][j][k] )
423
* optinfo.disp_size / sqrt(masses[k]);
424
geoms[irrep][cnt+12][k] += ( - 2.0 * salc[irrep][i][k] + 2.0 * salc[irrep][j][k] )
425
* optinfo.disp_size / sqrt(masses[k]);
426
geoms[irrep][cnt+13][k] += ( - 1.0 * salc[irrep][i][k] + 2.0 * salc[irrep][j][k] )
427
* optinfo.disp_size / sqrt(masses[k]);
428
geoms[irrep][cnt+14][k] += ( + 1.0 * salc[irrep][i][k] + 2.0 * salc[irrep][j][k] )
429
* optinfo.disp_size / sqrt(masses[k]);
430
geoms[irrep][cnt+15][k] += ( + 2.0 * salc[irrep][i][k] + 2.0 * salc[irrep][j][k] )
400
geoms[irrep][cnt+0][k] += ( - 1.0 * salc[irrep][i][k] - 2.0 * salc[irrep][j][k] )
401
* optinfo.disp_size / sqrt(masses[k]);
402
geoms[irrep][cnt+1][k] += ( - 2.0 * salc[irrep][i][k] - 1.0 * salc[irrep][j][k] )
403
* optinfo.disp_size / sqrt(masses[k]);
404
geoms[irrep][cnt+2][k] += ( - 1.0 * salc[irrep][i][k] - 1.0 * salc[irrep][j][k] )
405
* optinfo.disp_size / sqrt(masses[k]);
406
geoms[irrep][cnt+3][k] += ( + 1.0 * salc[irrep][i][k] - 1.0 * salc[irrep][j][k] )
407
* optinfo.disp_size / sqrt(masses[k]);
408
geoms[irrep][cnt+4][k] += ( - 1.0 * salc[irrep][i][k] + 1.0 * salc[irrep][j][k] )
409
* optinfo.disp_size / sqrt(masses[k]);
410
geoms[irrep][cnt+5][k] += ( + 1.0 * salc[irrep][i][k] + 1.0 * salc[irrep][j][k] )
411
* optinfo.disp_size / sqrt(masses[k]);
412
geoms[irrep][cnt+6][k] += ( + 2.0 * salc[irrep][i][k] + 1.0 * salc[irrep][j][k] )
413
* optinfo.disp_size / sqrt(masses[k]);
414
geoms[irrep][cnt+7][k] += ( + 1.0 * salc[irrep][i][k] + 2.0 * salc[irrep][j][k] )
431
415
* optinfo.disp_size / sqrt(masses[k]);
424
if(optinfo.external_energies){
426
FILE *fp_dispcart = fopen("dispcart", "w");
427
// ACS (11/06) Print the displaced and reference geometry for external programs
428
// Use 1 based counting, and remember that the first "displacement" is the reference itself
429
fprintf(fp_dispcart,"%d\n",counter++);
430
for(int n = 0; n < carts.get_natom(); n++){
431
fprintf(fp_dispcart,"%16.10lf %16.10lf %16.10lf\n",coord[3*n],coord[3*n+1],coord[3*n+2]);
434
for (irrep=0; irrep<nirreps; ++irrep) {
435
for(int disp = 0; disp< ndisp[irrep]; disp++){
436
fprintf(fp_dispcart,"%d\n",counter++);
437
for(int n = 0; n < carts.get_natom(); n++){
438
fprintf(fp_dispcart,"%16.10lf %16.10lf %16.10lf\n",
439
geoms[irrep][disp][3*n],geoms[irrep][disp][3*n+1],geoms[irrep][disp][3*n+2]);
440
446
/**** write out info to PSIF_OPTKING, geoms and coordinates in irrep order ****/