psi::extrema::zmat Class Reference

Derived class for z-matrix coordinates. More...

#include <zmat.h>

Inheritance diagram for psi::extrema::zmat:

psi::extrema::internals psi::extrema::coord_base psi::extrema::coord_base_carts psi::extrema::math_tools

Public Member Functions

 zmat ()
 zmat constructor
 ~zmat ()
 zmat destructor
void optimize ()
 z-matrix optimization driver

Protected Member Functions

void compute_B (void)
 Computes the B matrix.
void cart_to_internal (double **)
void print_internals (void)
 Prints z-matrix.
void initial_Hi (void)
 Froms initial guess for inverse hessian.
void grad_trans ()
 Transforms gradients from cartesians to internals.
void parse_input ()
 Performs input parsing for z-matrix coordinates.
void write_chkpt ()
 Writes geometries to chkpt.
void newton_step ()
 Computes newton-raphson z-matrix optimization step.
void back_transform ()
 Computes cartesians corresponding to the current z-matrix.
void print_carts (double)
 Prints cartesians.
void print_c_grads ()
 Prints cartesian gradients (Hartree/Bohr).

Protected Attributes

struct z_entry * z_geom
simplesimples
int * first_unique
int * pos_neg_pairs
double * fcoord_old
double bond_lim
double angle_lim

Detailed Description

Derived class for z-matrix coordinates.

A top level class which allows z-matrix manipulations by driving member functions of the abstract classes. Currently optimization is the only available method.

Definition at line 22 of file zmat.h.


Constructor & Destructor Documentation

zmat::zmat (  ) 

zmat constructor

Constructor for the top-level z-matrix derived class. Performs setup of z-matrix coordinates which includes determining optimized coordinates and positive/negative torsion pairs. The internals dummy constructor is called initially and the actual constructor named constructor_internals is called after the number of optimized coordinates is determined.

Definition at line 29 of file bin/extrema/Zmat/zmat.cc.

References psi::extrema::coord_base::angle_abort, ANGLE_TYPE, psi::extrema::coord_base_carts::c_grads, psi::extrema::coord_base_carts::carts, chkpt_rd_felement(), chkpt_rd_fgeom(), chkpt_rd_nallatom(), chkpt_rd_zmat(), psi::extrema::coord_base::coords, psi::extrema::internals::fcoords, psi::extrema::internals::fcoords_old, psi::extrema::coord_base::felement, first_unique, psi::extrema::internals::fnum_coords, free_matrix(), psi::extrema::simple::get_val(), init_array(), init_int_array(), psi::extrema::internals::mem_alloc(), NEAR_180, NOT_180, psi::extrema::coord_base_carts::num_atoms, psi::extrema::coord_base::num_coords, psi::extrema::coord_base_carts::num_entries, parse_input(), pos_neg_pairs, POS_NEG_TORS, psi::extrema::simple::set_label(), psi::extrema::simple::set_simple(), simples, TORS_TYPE, and z_geom.

00029              : internals()
00030    {
00031 
00032   int i, j, pos, dummy;        
00033 
00034   zmat::parse_input();
00035 
00036   /*read z_mat and cartesians from chkpt*/
00037   num_entries = chkpt_rd_nallatom();
00038   z_geom = chkpt_rd_zmat();
00039   char **temp_felement;
00040   felement = chkpt_rd_felement();
00041 
00042   dummy=0;
00043   for(i=0;i<num_entries;++i) 
00044       if(!strncmp(felement[i],"X\0",2) )
00045           dummy=1;
00046   if(dummy) {
00047 
00048       free(carts);
00049       double** cart_temp;
00050       carts = init_array(3*num_entries);
00051       cart_temp = chkpt_rd_fgeom();
00052 
00053       for(i=0;i<(3*num_entries);++i) 
00054           carts[i] = cart_temp[0][i];
00055       free_matrix(cart_temp,1);
00056 
00057       double* ctemp;
00058       ctemp = init_array(3*num_atoms);
00059       for(i=0;i<3*num_atoms;++i)
00060               ctemp[i] = c_grads[i];
00061       free(c_grads);
00062       c_grads = init_array(3*num_entries);
00063       pos=0;
00064       for(i=0;i<num_entries;++i) {
00065           if(strncmp(felement[i],"X\0",2) ) {
00066               c_grads[3*i] = ctemp[3*pos];
00067               c_grads[3*i+1] = ctemp[3*pos+1];
00068               c_grads[3*i+2] = ctemp[3*pos+2];
00069               ++pos;
00070           }
00071       }  
00072       free(ctemp);
00073   }
00074 
00075   switch(num_entries) {
00076     case 2: fnum_coords = 1; break;
00077     case 3: fnum_coords = 3; break;
00078     default: fnum_coords =  (num_entries*3-6); break;
00079   } 
00080 
00081   /*write z_mat to the array of simple_internal*/
00082   simples = (simple*) malloc(fnum_coords*sizeof(simple));  
00083   for(i=1;i<num_entries;++i) {
00084       if( i==1 ) {
00085           simples[0].set_simple(0,z_geom[1].bond_val,
00086                                 2,z_geom[1].bond_atom,-1,-1,
00087                                 z_geom[1].bond_opt);
00088       }
00089       else if( i==2 ) {
00090           simples[1].set_simple(0,z_geom[2].bond_val,
00091                                 3,z_geom[2].bond_atom,-1,-1,
00092                                 z_geom[2].bond_opt);
00093           simples[2].set_simple(1,z_geom[2].angle_val *_pi/180.0,
00094                                 3,z_geom[2].bond_atom,z_geom[2].angle_atom,-1,
00095                                 z_geom[2].angle_opt);
00096           j=3;
00097         }
00098       else if( i>2 ) {
00099           simples[j].set_simple(0,z_geom[i].bond_val,i+1,z_geom[i].bond_atom,
00100                                 -1,-1,z_geom[i].bond_opt);
00101           simples[j+1].set_simple(1,z_geom[i].angle_val*_pi/180.0,
00102                                   i+1,z_geom[i].bond_atom,
00103                                   z_geom[i].angle_atom,-1,z_geom[i].angle_opt);
00104           simples[j+2].set_simple(2,z_geom[i].tors_val*_pi/180.0,
00105                                   i+1,z_geom[i].bond_atom,
00106                                   z_geom[i].angle_atom,z_geom[i].tors_atom,
00107                                   z_geom[i].tors_opt);
00108           j+=3;
00109         }
00110   }
00111 
00112   int p=0;
00113   for(i=1;i<num_entries;++i) {
00114       if(i==1) {
00115           simples[p].set_label(z_geom[1].bond_label);
00116           ++p;
00117       }
00118       else if( i==2) {
00119           simples[p].set_label(z_geom[2].bond_label);
00120           simples[p+1].set_label(z_geom[2].angle_label );
00121           p+=2;
00122       }
00123       else if (i>2) {
00124           simples[p].set_label(z_geom[i].bond_label);
00125           simples[p+1].set_label(z_geom[i].angle_label);
00126           simples[p+2].set_label(z_geom[i].tors_label);
00127           p+=3;
00128       }
00129   }
00130   
00131   /*find first instance of each unique coordinate*/
00132   int there;
00133   first_unique = (int *) malloc(fnum_coords*sizeof(int));
00134   for(i=0;i<fnum_coords;++i) {
00135       there=0;
00136       for(j=0;j<i;++j) 
00137           if( !strcmp( simples[i].get_label(), simples[j].get_label() )) {
00138               first_unique[i]=0;
00139               ++there;
00140           }
00141       if( (there==0) || !strcmp(simples[i].get_label(),"") )
00142           first_unique[i]=1;      
00143   }
00144 
00145   num_coords = 0;
00146   for(i=0;i<fnum_coords;++i) {
00147       if(simples[i].get_opt() && first_unique[i]) {
00148           ++num_coords;
00149       }
00150   }
00151   if(!num_coords)
00152       punt("No coordinates to optimize");
00153 
00154   /*allocate memory now that optimized coordinate number is known*/
00155   internals::mem_alloc();
00156 
00157   for(i=0;i<fnum_coords;++i)
00158       fcoords[i] = fcoords_old[i] = simples[i].get_val();
00159 
00160   p=0;
00161   for(i=0;i<fnum_coords;++i) 
00162       if(simples[i].get_opt() && first_unique[i]) {  
00163           coords[p] = simples[i].get_val();
00164           ++p;
00165       }
00166           
00167   /*find positive/negative torsion pairs*/
00168   int *is_torsion;
00169   is_torsion = init_int_array(num_coords);
00170   p=0;
00171   for(i=0;i<fnum_coords;++i) {
00172       if(simples[i].get_opt() && first_unique[i]) {
00173           if(simples[i].get_type()==TORS_TYPE) 
00174               is_torsion[p] = 1;
00175           else is_torsion[p] = 0;
00176           ++p;
00177       }
00178   }
00179 
00180   pos_neg_pairs = (int *) malloc(num_coords*sizeof(int));
00181   for(i=0;i<num_coords;++i)
00182       pos_neg_pairs[i] = 0;
00183   p=1;
00184   for(i=0;i<num_coords;++i) {
00185       if((pos_neg_pairs[i]==0) && is_torsion[i]) 
00186           for(j=(i+1);j<num_coords;++j) 
00187               if((pos_neg_pairs[j]==0) && is_torsion[j]) 
00188                   if( fabs(coords[i]+coords[j]) < POS_NEG_TORS ) {
00189                       pos_neg_pairs[i] = pos_neg_pairs[j] = p;
00190                       ++p;
00191                   }
00192   }
00193   
00194   free(is_torsion);
00195         
00196   /* test angles for extreme values, abort if hopeless */
00197   if(angle_abort)
00198       for(i=0;i<fnum_coords;++i) {
00199           if( simples[i].get_type() == ANGLE_TYPE ) {
00200               if( fabs(simples[i].get_val()) > NEAR_180*_pi/180.0 ) 
00201                   punt("Simple valence angle near 180 degrees");
00202           }
00203           else if (simples[i].get_type() == TORS_TYPE) 
00204               if( (fabs(simples[i].get_val()) > NEAR_180*_pi/180.0 ) &&
00205                   (fabs(simples[i].get_val()) < NOT_180*_pi/180.0) )
00206                   punt("Simple torsion near 180 degrees");
00207       }
00208   
00209   return;
00210 }

psi::extrema::zmat::~zmat (  )  [inline]

zmat destructor

Frees allocated memory.

Definition at line 68 of file zmat.h.

References first_unique, pos_neg_pairs, simples, and z_geom.

00068             {
00069         int i; 
00070         free(z_geom); 
00071         free(simples);
00072         free(first_unique);
00073         free(pos_neg_pairs);
00074         return; }


Member Function Documentation

void zmat::compute_B ( void   )  [protected, virtual]

Computes the B matrix.

Interface for internals::B_row...() functions.

Implements psi::extrema::internals.

Definition at line 25 of file zmat_transform.cc.

References psi::extrema::internals::B, psi::extrema::internals::B_red, psi::extrema::internals::B_row_angle(), psi::extrema::internals::B_row_bond(), psi::extrema::internals::B_row_tors(), psi::extrema::coord_base_carts::carts, psi::extrema::coord_base::felement, first_unique, psi::extrema::internals::fnum_coords, psi::extrema::coord_base_carts::masses, psi::extrema::coord_base_carts::num_entries, simples, and psi::extrema::internals::u.

Referenced by optimize().

00025                      {  
00026 
00027     int i, j, pos=0;
00028     double *B_row0, *B_row1, *B_row2;
00029 
00030   for(i=1;i<num_entries;++i) {
00031       if(i==1) {
00032           B_row0 = B_row_bond(carts, i, simples[pos].get_bond()-1);
00033           B[pos] = B_row0;
00034           ++pos;
00035         }
00036       if(i==2) {
00037           B_row0 = B_row_bond(carts, i, simples[pos].get_bond()-1);
00038           B_row1 = B_row_angle(carts, i, simples[pos+1].get_bond()-1, 
00039                                simples[pos+1].get_angle()-1);
00040           B[pos] = B_row0;
00041           B[pos+1] = B_row1;
00042           pos += 2;
00043         }
00044       if(i>2) {
00045           B_row0 = B_row_bond(carts, i, simples[pos].get_bond()-1);
00046           B_row1 = B_row_angle(carts, i, simples[pos+1].get_bond()-1, 
00047                                simples[pos+1].get_angle()-1);
00048           B_row2 = B_row_tors(carts, i, simples[pos+2].get_bond()-1, 
00049                               simples[pos+2].get_angle()-1, 
00050                               simples[pos+2].get_tors()-1);
00051           B[pos] = B_row0;
00052           B[pos+1] = B_row1;
00053           B[pos+2] = B_row2;
00054           pos += 3;
00055         }
00056     }
00057 
00058   /*form u*/
00059   int k=0;
00060   for(j=0;j<num_entries;++j) {
00061       if(strncmp(felement[j],"X\0",2)) {
00062          u[3*j][3*j] = 1.0 / masses[k]; 
00063          u[3*j+1][3*j+1] = 1.0 /masses[k];
00064          u[3*j+2][3*j+2] = 1.0 / masses[k];
00065          ++k;
00066        }
00067        else if (!strncmp(felement[j],"X\0",2)) {
00068           u[3*j][3*j] = u[3*j+1][3*j+1] = u[3*j+2][3*j+2]= 1.0;
00069           }
00070   }
00071 
00072   /*form B_red, the reduced dimension B matrix*/
00073 
00074   pos=0;
00075   for(i=0;i<fnum_coords;++i) 
00076       if(first_unique[i] && simples[i].get_opt() ) {
00077           for(j=0;j<(3*num_entries);++j)
00078               B_red[pos][j] = B[i][j];
00079           ++pos;
00080       }  
00081       
00082   return;
00083 }

void zmat::grad_trans (  )  [protected, virtual]

Transforms gradients from cartesians to internals.

Interface for internals::grad_trans(). Gradients are calculated for redundant coordinates and their equivalency is checked.

Reimplemented from psi::extrema::internals.

Definition at line 95 of file zmat_transform.cc.

References EQUIV_GRAD, psi::extrema::internals::fgrads, first_unique, psi::extrema::internals::fnum_coords, psi::extrema::internals::grad_trans(), psi::extrema::coord_base::grads, NORMAL_PRINT, psi::extrema::coord_base::print_lvl, and simples.

Referenced by optimize().

00095                       {
00096     
00097     internals::grad_trans();
00098 
00099     int i, j, div, p=0;
00100 
00101     if(print_lvl>NORMAL_PRINT) {
00102         fprintf(outfile,"\n  Internal coordinate gradients (a.u):");
00103         for(i=0;i<fnum_coords;++i)
00104             fprintf(outfile,"\n  %i %8s: %15.10lf",
00105                     i+1,simples[i].get_label(),fgrads[i]);
00106     }
00107     fprintf(outfile,"\n");
00108 
00109     double sum;
00110     for(i=0;i<fnum_coords;++i) 
00111         if(first_unique[i] && simples[i].get_opt()) {
00112             sum = fgrads[i];
00113             div=1;
00114             for(j=(i+1);j<fnum_coords;++j)
00115                 if(!strcmp(simples[i].get_label(),simples[j].get_label()) &&
00116                     strcmp(simples[i].get_label(),"")) {
00117                     sum += fgrads[j];
00118                     ++div;
00119                     if( fabs(fgrads[i]-fgrads[j]) > EQUIV_GRAD ) {
00120                         fprintf(outfile,"\n  WARNING: gradients %d and %d",
00121                                 i+1,j+1);
00122                         fprintf(outfile," should be equal, differ by %lf",
00123                                 fabs(fgrads[i]-fgrads[j]));
00124                     }
00125                 }
00126             grads[p] = sum/((double) div);
00127             ++p;
00128         }
00129     
00130     return;
00131 }

void zmat::newton_step (  )  [protected]

Computes newton-raphson z-matrix optimization step.

Interface for math_tools::newton_step().

Definition at line 405 of file bin/extrema/Zmat/zmat.cc.

References psi::extrema::coord_base::angle_abort, angle_lim, ANGLE_TYPE, bond_lim, psi::extrema::coord_base::coord_write, psi::extrema::coord_base::coords, fcoord_old, first_unique, psi::extrema::internals::fnum_coords, psi::extrema::coord_base::grads, psi::extrema::coord_base::Hi, init_array(), NEAR_180, psi::extrema::math_tools::newton_step(), NOT_180, psi::extrema::coord_base::num_coords, pos_neg_pairs, POS_NEG_TORS, psi::extrema::coord_base::print_lvl, psi::extrema::simple::set_val(), simples, and TORS_TYPE.

Referenced by optimize().

00405                          {
00406     
00407     int i, j, k, p;
00408     double *s, num, con;
00409 
00410     fprintf(outfile,"\n\n  --------------------------------------");
00411     fprintf(outfile,"--------------------------------------\n");
00412     fprintf(outfile,"  Computing newton-raphson optimization step\n");
00413     fprintf(outfile,"  --------------------------------------");
00414     fprintf(outfile,"--------------------------------------\n");
00415     s = math_tools::newton_step(num_coords,Hi,grads);
00416 
00417     /* ensure pos/neg torsion angle pairs match */
00418     for(i=0;i<num_coords;++i) 
00419         if(pos_neg_pairs[i]) 
00420             for(j=(i+1);j<num_coords;++j) 
00421                 if(pos_neg_pairs[i]==pos_neg_pairs[j]) {
00422                     
00423                     num = (fabs(s[i]) + fabs(s[j]))/2;
00424                     if(s[i] < 0)
00425                         s[i] = -1.0*num;
00426                     else s[i] = num;
00427                     if(s[j] < 0)
00428                         s[j] = -1.0*num;
00429                     else s[j] = num;
00430                     
00431                     if( (s[i]+s[j]) > POS_NEG_TORS ) {
00432                         fprintf(outfile,"\n  WARNING: positive/negative pair");
00433                         fprintf(outfile," %d/%d:\n",i,j);
00434                         fprintf(outfile,"  displacements differ by more than");
00435                         fprintf(outfile,"%lf radians\n", POS_NEG_TORS);
00436                     }
00437                 }
00438     
00439     /* print before limit enforcement */
00440     if(print_lvl>1) {
00441         p=0;
00442         fprintf(outfile,"\n  Displacements before limit enforcement");
00443         fprintf(outfile," (angstroms and degrees):\n");
00444         for(i=0;i<fnum_coords;++i)
00445             if(simples[i].get_opt() && first_unique[i]) {
00446                 if(simples[i].get_type()==0)
00447                     con = _bohr2angstroms; 
00448                 else con = 180.0/_pi;  
00449                 fprintf(outfile,"  %i %8s: %lf\n",
00450                         i+1,simples[i].get_label(),s[p]*con);
00451                 ++p;
00452             }
00453     }
00454     
00455     /* enforce bond and angle limits */
00456     p=0;
00457     for(i=0;i<fnum_coords;++i) {
00458         if((simples[i].get_type()==0) && first_unique[i] && simples[i].get_opt() ) {
00459             if(s[p] > bond_lim) 
00460                 s[p] = bond_lim; 
00461             else if (s[p] < (-1.0*bond_lim) ) 
00462                 s[p] = (-1.0*bond_lim); 
00463             ++p;
00464         }
00465         else if(first_unique[i] && simples[i].get_opt() ) {
00466             if(s[p] > angle_lim) 
00467                 s[p] = angle_lim; 
00468             else if (s[p] < (-1.0*angle_lim) ) 
00469                 s[p] = (-1.0*angle_lim);
00470             ++p;
00471         }
00472     }
00473 
00474     /*save old coordinates to write to opt.dat and for back transform*/
00475     fcoord_old = init_array(fnum_coords);
00476     for(i=0;i<num_coords;++i) 
00477         coord_write[i] = coords[i];
00478     for(i=0;i<fnum_coords;++i)
00479         fcoord_old[i] = simples[i].get_val();
00480 
00481 
00482     /* take the step */
00483     for(i=0;i<num_coords;++i) 
00484         coords[i] += s[i];
00485 
00486     /*update simples*/
00487     p=0;
00488     for(i=0;i<fnum_coords;++i) {
00489         if(first_unique[i] && simples[i].get_opt()) {
00490             simples[i].set_val(coords[p]);
00491             ++p;
00492             for(j=(i+1);j<fnum_coords;++j) 
00493                 if(!strcmp(simples[i].get_label(),simples[j].get_label()) &&
00494                     strcmp(simples[i].get_label(),""))
00495                     simples[j].set_val(simples[i].get_val());
00496         }
00497     }
00498 
00499     /* test for extreme angle cases */
00500     if(angle_abort)
00501         for(i=0;i<fnum_coords;++i) {
00502             if( simples[i].get_type() == ANGLE_TYPE ) {
00503                 if( fabs(simples[i].get_val()) > NEAR_180*_pi/180.0 )
00504                     punt("Simple valence angle near 180 degrees");
00505             }
00506             else if (simples[i].get_type() == TORS_TYPE)
00507                 if( (fabs(simples[i].get_val()) > NEAR_180*_pi/180.0 ) &&
00508                     (fabs(simples[i].get_val()) < NOT_180*_pi/180.0) )
00509                     punt("Simple torsion near 180 degrees");
00510         }
00511     
00512     int entry;
00513     fprintf(outfile,"\n  Optimization Step (angstroms and degrees):\n");
00514     fprintf(outfile,"\n  label    initial value   gradient (a.u.)");      
00515     fprintf(outfile," displacement    new value");
00516     fprintf(outfile,"\n  -------- --------------- ---------------"); 
00517     fprintf(outfile," --------------- ---------------");
00518     entry=0;
00519     p=0;
00520     for(i=0;i<fnum_coords;++i) {
00521         con = _bohr2angstroms;
00522         if( i==2 )
00523             con = 180.0/_pi;
00524         if( i>2 ) {
00525             if(entry==0)
00526                 ++entry;
00527             else if(entry==1) {
00528                 con = 180.0/_pi;
00529                 ++entry;
00530             }
00531             else if(entry==2) {
00532                 con = 180.0/_pi;
00533                 entry = 0;
00534             }
00535         }
00536         if(simples[i].get_opt() && first_unique[i]) {
00537             fprintf(outfile,"\n  %-8s %15.10lf %15.10lf %15.10lf %15.10lf",
00538                     simples[i].get_label(),coord_write[p]*con, grads[p], 
00539                     s[p]*con, coords[p]*con);
00540             ++p;
00541         }
00542     }
00543 
00544     free(s);
00545     return;
00546 }

void zmat::back_transform (  )  [protected]

Computes cartesians corresponding to the current z-matrix.

Interface for internals::back_transform().

Definition at line 142 of file zmat_transform.cc.

References psi::extrema::internals::back_transform(), fcoord_old, psi::extrema::internals::fnum_coords, psi::extrema::simple::get_val(), init_array(), and simples.

Referenced by optimize().

00142                           {
00143     
00144     /*create full coordinate vectors*/
00145     double *fcoord_new;
00146     fcoord_new = init_array(fnum_coords);
00147     
00148     int i;
00149     for(i=0;i<fnum_coords;++i) { 
00150         fcoord_new[i] = simples[i].get_val();
00151     }
00152 
00153     internals::back_transform(fcoord_new, fcoord_old);
00154 
00155     free(fcoord_old);
00156     free(fcoord_new);
00157     return;
00158 }

void zmat::print_carts ( double  conv  )  [protected, virtual]

Prints cartesians.

Parameters:
conv conversion factor; either 1.0 for bohr or _bohr2angstroms for angstroms

Reimplemented from psi::extrema::coord_base_carts.

Definition at line 558 of file bin/extrema/Zmat/zmat.cc.

References psi::extrema::coord_base_carts::carts, psi::extrema::coord_base::felement, free_matrix(), init_matrix(), and psi::extrema::coord_base_carts::num_entries.

Referenced by optimize().

00558                                     {
00559  
00560     int i, j;
00561     double **temp;
00562 
00563     temp = init_matrix(num_entries,3);
00564     for(i=0;i<num_entries;++i) 
00565         for(j=0;j<3;++j) 
00566             temp[i][j] = carts[3*i+j]*conv;
00567     if(conv==1.0)
00568         fprintf(outfile,"\n  Cartesian Coordinates (bohr):\n");
00569     else
00570         fprintf(outfile,"\n  Cartesian Coordinates (angstroms):\n");
00571      fprintf(outfile,"                       x              y         ");
00572     fprintf(outfile,"       z\n");
00573     fprintf(outfile,"                --------------- --------------- ");
00574     fprintf(outfile,"---------------\n");
00575     for(i=0;i<num_entries;++i)
00576         fprintf(outfile,"  %12s  %15.10lf %15.10lf %15.10lf\n",
00577                 felement[i], temp[i][0], temp[i][1], temp[i][2]);
00578     free_matrix(temp,num_entries);
00579 
00580     return;
00581 }


Field Documentation

struct z_entry* psi::extrema::zmat::z_geom [read, protected]

an array of z_entry structs, defined in chkpt.h, a z-matrix is read/written to chkpt as an array of z_entry structs

Definition at line 26 of file zmat.h.

Referenced by write_chkpt(), zmat(), and ~zmat().

simple* psi::extrema::zmat::simples [protected]

an array of simple classes, the simple concrete class provides interfaces to simple internal coordinate information

Definition at line 32 of file zmat.h.

Referenced by back_transform(), compute_B(), grad_trans(), initial_Hi(), newton_step(), print_internals(), write_chkpt(), zmat(), and ~zmat().

int* psi::extrema::zmat::first_unique [protected]

1 if a simple intenal from the full set of simples is the first unique coordinate, 0 otherwise, only unique coordinates need to be optimized

Definition at line 36 of file zmat.h.

Referenced by compute_B(), grad_trans(), initial_Hi(), newton_step(), zmat(), and ~zmat().

int* psi::extrema::zmat::pos_neg_pairs [protected]

positive negative torsion angle pairs are indicated by matching positive integers, for keeping torsion angle pairs matching

Definition at line 41 of file zmat.h.

Referenced by newton_step(), zmat(), and ~zmat().

double* psi::extrema::zmat::fcoord_old [protected]

full coordinates prior to optimization step, needed for back transformation to cartesians

Definition at line 46 of file zmat.h.

Referenced by back_transform(), and newton_step().

double psi::extrema::zmat::bond_lim [protected]

maximum bond displacement in bohr

Definition at line 49 of file zmat.h.

Referenced by newton_step(), and parse_input().

double psi::extrema::zmat::angle_lim [protected]

maximum angle displacement in radians

Definition at line 50 of file zmat.h.

Referenced by newton_step(), and parse_input().


The documentation for this class was generated from the following files:
Generated on Wed Feb 13 16:36:15 2008 for PSI by  doxygen 1.5.4