00001 #ifndef ICOORD_H
00002 #define ICOORD_H
00003
00004 #include "stringtools.h"
00005 #include "pTable.h"
00006 #include "grad.h"
00007
00008 class ICoord {
00009
00010 private:
00011
00012
00013 int g_inited;
00014
00015
00016 double* amasses;
00017 double* amasses3;
00018
00019
00020 double* dxm1;
00021
00022
00023 double dEpre;
00024 double smag;
00025
00026 int** imptor;
00027
00028 int nfrags;
00029 int* frags;
00030
00031 int max_bonds;
00032 int max_angles;
00033 int max_torsions;
00034 int max_imptor;
00035
00036 int max_nonbond;
00037 int n_nonbond;
00038 int** nonbond;
00039 double* nonbondd;
00040
00041 void structure_read(string xyzfile);
00042 void alloc_mem();
00043 void make_bonds();
00044 void coord_num();
00045 void make_angles();
00046 void make_torsions();
00047
00048 void make_frags();
00049 void bond_frags();
00050 void hbond_frags();
00051 void linear_ties();
00052 void h2o_torsions();
00053 void tm_ties();
00054
00055 void make_imptor();
00056
00057 void make_imptor_nobonds();
00058
00059 int make_nonbond();
00060
00061
00062 void update_bonds();
00063 void update_angles();
00064 void update_torsion();
00065 void update_imptor();
00066 void update_nonbond();
00067
00068 void create_xyz();
00069
00070 double close_bond(int i);
00071 double close_angle(int i);
00072 double close_tor(int i);
00073 int ixflag;
00074
00075
00076 double* ffR;
00077 double* ffeps;
00078 double ffbondd(int i, int j);
00079 double ffbonde(int i, int j);
00080 double ffangled(int i, int j);
00081 double ffanglee(int i, int j);
00082 double fftord(int i, int j, int k, int l);
00083 double fftore(int i, int j, int k, int l);
00084 double fftorm(int i, int j, int k, int l);
00085 double ffimptore(int i, int j, int k, int l);
00086 double ffimptord(int i, int j, int k, int l);
00087
00088
00089 int isTM(int anum);
00090
00091
00092 double* bmat;
00093 double* bmatti;
00094
00095 void print_grad();
00096 void print_gradq();
00097 void bond_grad_all();
00098 void bond_grad_1(int i, int j);
00099 double bond_stretch(int i, int j);
00100 void angle_grad_all();
00101 void angle_grad_1(int i, int j, int k);
00102 void torsion_grad_all();
00103 void torsion_grad_1(int i, int j, int k, int l);
00104 void imptor_grad_all();
00105 void imptor_grad_1(int i, int j, int k, int l);
00106 void vdw_grad_all();
00107 void vdw_grad_1(int i, int j, double scale);
00108
00109
00110
00111
00112 void update_ic_qn();
00113 void update_ic_eigen();
00114 void update_ic_eigen_h(double* C, double* D);
00115 void update_ic_eigen_ts(double* C);
00116 void walk_up();
00117
00118 void force_notbonds();
00119
00120 void bmatp_dqbdx(int a1, int a2, double* dqbdx);
00121 void bmatp_dqadx(int a1, int a2, int a3, double* dqadx);
00122 void bmatp_dqtdx(int a1, int a2, int a3, int a4, double* dqtdx);
00123
00124
00125 void print_xyzf(ofstream xyzfile);
00126
00127
00128 int nnodes;
00129 double prima_force();
00130 double* prima;
00131 int* aprima;
00132 double* Cp;
00133 double mdist;
00134 void lin_grad_1(int i, int j, double scale);
00135
00136 char* sbuff;
00137
00138 double* Gmh;
00139 double* Gmih;
00140 void get_gm();
00141 void create_mwHint_EV(double* Lm, double* Lme);
00142
00143
00144 public:
00145
00146 int revertOpt;
00147 Gradient grad1;
00148 string printout;
00149
00150 double FMAG;
00151 double OPTTHRESH;
00152 double MAXAD;
00153 double DMAX;
00154 double DMIN0;
00155 double SCALEQN0;
00156 double SCALEQN;
00157
00158 double V0;
00159 int* frozen;
00160
00161 double farBond;
00162 int isTSnode;
00163 int nneg;
00164 int newHess;
00165 int optCG;
00166 int do_bfgs;
00167 int noptdone;
00168 double path_overlap;
00169 int path_overlap_n;
00170 double path_overlap_e_g;
00171 void update_bfgs();
00172 void update_bfgsp(int makeHint);
00173 void update_bofill();
00174 void save_hess();
00175
00176 double getR(int i);
00177
00178 int nicd;
00179 int nicd0;
00180
00181 double* bondd;
00182 double* anglev;
00183 double* torv;
00184 double* torv0;
00185 double* torfix;
00186 double* imptorv;
00187
00188 int** bonds;
00189 int nbonds;
00190 int** angles;
00191 int nangles;
00192 int** torsions;
00193 int ntor;
00194
00195 double* grad;
00196
00197 double* gradq;
00198 double* pgradq;
00199 double* gradqprim;
00200 double* pgradqprim;
00201 double* dq0;
00202 double* dqm1;
00203 double* dqprim;
00204 double* Hint;
00205 double* Hintp;
00206 double* Hinv;
00207 double* q;
00208 int useExactH;
00209 int isOpt;
00210 int stage1opt;
00211 double pgradrms;
00212 double gradrms;
00213 void make_Hint();
00214 void Hintp_to_Hint();
00215 int davidson_H(int neigen);
00216 int isDavid;
00217
00218 int id;
00219 int pid;
00220
00221 int natoms;
00222 double* coords;
00223 double* coordsts;
00224 double* coords0;
00225 string* anames;
00226 int* anumbers;
00227 int* coordn;
00228 int nimptor;
00229
00230 int ic_create();
00231 int ic_create_nobonds();
00232 int mm_grad();
00233 int mm_grad(ICoord shadow);
00234 int grad_to_q();
00235 int ic_to_xyz();
00236 int ic_to_xyz_opt();
00237
00238 int grad_init(string infilename, int ncpu, int run, int rune, int use_knnr, int q1);
00239 string runends;
00240 string runend2;
00241
00242 double* bmatp;
00243 int get_tangent();
00244 int distance_matrix_ic(ICoord ic1, ICoord ic2);
00245 int union_ic(ICoord ic1, ICoord ic2);
00246 int copy_ic(ICoord ic1);
00247 void write_ic(string filename);
00248 int read_ics(string filename);
00249
00250 int opt();
00251 int opt(string xyzfile, ICoord shadow);
00252 int opt(string xyzfile);
00253 void opt_constraint(double* C);
00254 double opt_a(int nnewb, int* newb, int nnewt, int* newt, string xyzfile_string, int nsteps);
00255 double opt_b(string xyzfile_string, int nsteps);
00256 double opt_c(string xyzfile_string, int nsteps, double* C, double* C0);
00257 double opt_r(string xyzfile_string, int nsteps, double* C, double* C0, double* D, int type);
00258 double opt_eigen_ts(string xyzfile_string, int nsteps, double* C, double* C0);
00259 void update_ic();
00260 void mm_init();
00261
00262 int bmat_alloc();
00263 int bmat_free();
00264 int bmatp_finite();
00265 int bmatp_create();
00266 int bmatp_to_U();
00267 int bmat_create();
00268
00269 double* Ut;
00270 double* Ut0;
00271
00272
00273 int bond_exists(int b1, int b2);
00274 int bond_num(int b1, int b2);
00275 int angle_num(int b1, int b2, int b3);
00276 int tor_num(int b1, int b2, int b3, int b4);
00277 int hpair(int a1, int a2);
00278 int h2count();
00279
00280 int same_struct(double* xyz);
00281
00282 int init(string xyzfile);
00283 int init(int natoms, string* anames, int* anumbers, double* xyz);
00284 int alloc(int size);
00285 int reset(int natoms, string* anames, int* anumbers, double* xyz);
00286 int reset(double* xyz);
00287 void print_q();
00288 void print_ic();
00289 void print_bonds();
00290 void print_xyz();
00291 void print_xyz_save(string filename);
00292 void print_xyz_save(string xyzfile_string, double energy);
00293
00294
00295 double distance(int i, int j);
00296 double angle_val(int i, int j, int k);
00297 double torsion_val(int i, int j, int k, int l);
00298
00299 void freemem();
00300
00301
00302 int use_constraint;
00303 int ridge;
00304
00305 int create_prima(int nnodes, int nbonds, int nangles, int ntor, double** tangents);
00306 void save_hesspu(string filename);
00307 void save_hessp(string filename);
00308 void read_hessp(string filename);
00309 void read_hessxyz(string filename, int write);
00310
00311 };
00312
00313
00314
00315 #endif
00316