#include <zmat.h>

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 |
| simple * | simples |
| int * | first_unique |
| int * | pos_neg_pairs |
| double * | fcoord_old |
| double | bond_lim |
| double | angle_lim |
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.
| 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; }
| 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.
| 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 }
struct z_entry* psi::extrema::zmat::z_geom [read, protected] |
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().
1.5.4