1
/*** ENERGY_SAVE.CC Rollin King, 2002 ***/
2
// function executes if optinfo.mode == MODE_ENERGY_SAVE
12
#include <libchkpt/chkpt.h>
16
#include <libciomr/libciomr.h>
17
#include <libipv1/ip_lib.h>
18
#include <libpsio/psio.h>
19
#include <physconst.h>
26
#include "cartesians.h"
27
#include "internals.h"
29
void grad_save(cartesians &carts) {
30
int i,j,dim_carts,total_num_disps;
31
double energy, *micro_e, *micro_grad, *grad, **ggrad, **refgrad, **rref;
33
dim_carts = 3*optinfo.natom;
35
fprintf(outfile,"Saving gradient and energy.\n");
38
psio_read_entry(PSIF_OPTKING, "OPT: Current disp_num",
39
(char *) &(optinfo.disp_num), sizeof(int));
40
psio_read_entry(PSIF_OPTKING, "OPT: Total num. of disp.",
41
(char *) &(total_num_disps), sizeof(int));
43
micro_e = new double[total_num_disps];
44
micro_grad = new double [total_num_disps*3*carts.get_natom()*sizeof(double)];
45
psio_read_entry(PSIF_OPTKING, "OPT: Displaced gradients",
46
(char *) &(micro_grad[0]), total_num_disps*3*carts.get_natom()*sizeof(double));
49
fprintf(outfile,"gradients\n");
50
for (i=0; i<total_num_disps*3*carts.get_natom(); ++i)
51
fprintf(outfile,"%15.10lf\n",micro_grad[i]);
54
psio_read_entry(PSIF_OPTKING, "OPT: Displaced energies",
55
(char *) &(micro_e[0]), total_num_disps*sizeof(double));
58
chkpt_init(PSIO_OPEN_OLD);
59
grad = chkpt_rd_grad();
60
rref = chkpt_rd_rref();
61
energy = chkpt_rd_etot();
64
// Rotate the gradient back to the reference frame in which all geometries were generated and stores
65
int natoms = carts.get_natom();
66
ggrad = block_matrix(natoms,3);
68
for(int atom=0; atom<natoms; atom++)
69
for(int xyz=0; xyz<3; xyz++,atomxyz++)
70
ggrad[atom][xyz] = grad[atomxyz];
72
refgrad = block_matrix(carts.get_natom(),3);
73
mmult(ggrad,0,rref,0,refgrad,0,carts.get_natom(),3,3,0);
77
micro_e[optinfo.disp_num] = energy;
78
for (i=0; i<dim_carts; ++i) {
81
micro_grad[3*carts.get_natom()*(optinfo.disp_num)+i] = refgrad[atom][xyz];
85
psio_write_entry(PSIF_OPTKING,"OPT: Displaced energies",
86
(char *) &(micro_e[0]), total_num_disps*sizeof(double));
87
psio_write_entry(PSIF_OPTKING, "OPT: Displaced gradients",
88
(char *) &(micro_grad[0]), total_num_disps*3*carts.get_natom()*sizeof(double));
91
delete [] micro_e; delete [] micro_grad;
95
optinfo.disp_num += 1;
96
psio_write_entry(PSIF_OPTKING, "OPT: Current disp_num",
97
(char *) &(optinfo.disp_num), sizeof(int));