Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

colvarcomp.h

Go to the documentation of this file.
00001 #ifndef COLVARDEF_H
00002 #define COLVARDEF_H
00003 
00004 #include <fstream>
00005 #include <cmath>
00006 
00007 
00008 #include "colvarmodule.h"
00009 #include "colvar.h"
00010 #include "colvaratoms.h"
00011 
00012 
00050 
00051 class colvar::cvc
00052   : public colvarparse
00053 {
00054 public:
00055 
00058   std::string name;
00059 
00068   std::string function_type;
00069 
00072   colvarvalue::Type type() const;
00073 
00075   cvm::real sup_coeff;
00077   int       sup_np;
00078 
00080   cvm::real period;
00081 
00082   bool b_periodic;
00083 
00090   cvc (std::string const &conf);
00091 
00094   void parse_group (std::string const &conf, 
00095                     char const *group_key,
00096                     cvm::atom_group &group,
00097                     bool optional = false);
00098 
00101   cvc();
00102 
00104   virtual ~cvc();
00105 
00109   bool b_debug_gradients;
00110 
00114   colvarvalue fdiff_change (cvm::atom_group &group);
00115 
00120   bool b_inverse_gradients;
00121 
00126   bool b_Jacobian_derivative;
00127 
00129   virtual void calc_value() = 0;
00130 
00133   virtual void calc_gradients() = 0;
00134 
00137   virtual void calc_force_invgrads();
00138 
00140   virtual void calc_Jacobian_derivative();
00141 
00142 
00144   virtual colvarvalue value() const;
00145 
00147   virtual colvarvalue system_force() const;
00148 
00151   virtual colvarvalue Jacobian_derivative() const;
00152 
00162   virtual void apply_force (colvarvalue const &cvforce) = 0;
00163 
00192   virtual cvm::real dist2 (colvarvalue const &x1,
00193                            colvarvalue const &x2) const;
00194 
00198   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00199                                    colvarvalue const &x2) const;
00200 
00204   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00205                                    colvarvalue const &x2) const;
00206 
00212   virtual cvm::real compare (colvarvalue const &x1,
00213                              colvarvalue const &x2) const;
00214 
00215 protected:
00216 
00218   colvarvalue x;
00219 
00221   colvarvalue x_old;
00222 
00227   colvarvalue ft;
00228 
00231   colvarvalue jd;
00232 };
00233 
00234 
00235 
00236 
00237 inline colvarvalue::Type colvar::cvc::type() const
00238 {
00239   return x.type();
00240 }
00241 
00242 inline colvarvalue colvar::cvc::value() const
00243 {
00244   return x;
00245 }
00246 
00247 inline colvarvalue colvar::cvc::system_force() const
00248 {
00249   return ft;
00250 }
00251 
00252 inline colvarvalue colvar::cvc::Jacobian_derivative() const
00253 {
00254   return jd;
00255 }
00256 
00257 
00258 inline cvm::real colvar::cvc::dist2 (colvarvalue const &x1,
00259                                      colvarvalue const &x2) const
00260 {
00261   return x1.dist2 (x2);
00262 }
00263 
00264 inline colvarvalue colvar::cvc::dist2_lgrad (colvarvalue const &x1,
00265                                              colvarvalue const &x2) const
00266 {
00267   return x1.dist2_grad (x2);
00268 }
00269 
00270 inline colvarvalue colvar::cvc::dist2_rgrad (colvarvalue const &x1,
00271                                              colvarvalue const &x2) const
00272 {
00273   return x2.dist2_grad (x1);
00274 }
00275 
00276 inline cvm::real colvar::cvc::compare (colvarvalue const &x1,
00277                                        colvarvalue const &x2) const
00278 {
00279   if (this->type() == colvarvalue::type_scalar) {
00280     return cvm::real (x1 - x2);
00281   } else {
00282     cvm::fatal_error ("Error: you requested an operation which requires "
00283                       "comparison between two non-scalar values.\n");
00284     return 0.0;
00285   }
00286 }
00287 
00288 
00289 
00298 class colvar::distance
00299   : public colvar::cvc
00300 {
00301 protected:
00303   cvm::atom_group  group1;
00305   cvm::atom_group  group2;
00307   cvm::rvector     dist_v;
00310   bool b_1site_force;
00311 public:
00312   distance (std::string const &conf);
00313   distance();
00314   virtual inline ~distance() {}
00315   virtual void calc_value();
00316   virtual void calc_gradients();
00317   virtual void calc_force_invgrads();
00318   virtual void calc_Jacobian_derivative();
00319   virtual void apply_force (colvarvalue const &force);
00320   virtual cvm::real dist2 (colvarvalue const &x1,
00321                            colvarvalue const &x2) const;
00322   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00323                                    colvarvalue const &x2) const;
00324   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00325                                    colvarvalue const &x2) const;
00326   virtual cvm::real compare (colvarvalue const &x1,
00327                              colvarvalue const &x2) const;
00328 };
00329 
00330 
00331 // // \brief Colvar component: distance vector between centers of mass
00332 // // of two groups (\link colvarvalue::type_vector \endlink type,
00333 // // range (-*:*)x(-*:*)x(-*:*))
00334 // class colvar::distance_vec
00335 //   : public colvar::distance
00336 // {
00337 // public:
00338 //   distance_vec (std::string const &conf);
00339 //   distance_vec();
00340 //   virtual inline ~distance_vec() {}
00341 //   virtual void calc_value();
00342 //   virtual void calc_gradients();
00343 //   virtual void apply_force (colvarvalue const &force);
00344 //   /// Redefined to handle the box periodicity
00345 //   virtual cvm::real dist2 (colvarvalue const &x1,
00346 //                            colvarvalue const &x2) const;
00347 //   /// Redefined to handle the box periodicity
00348 //   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00349 //                                    colvarvalue const &x2) const;
00350 //   /// Redefined to handle the box periodicity
00351 //   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00352 //                                    colvarvalue const &x2) const;
00353 //   /// Redefined to handle the box periodicity
00354 //   virtual cvm::real compare (colvarvalue const &x1,
00355 //                              colvarvalue const &x2) const;
00356 // };
00357 
00358 
00362 class colvar::distance_dir
00363   : public colvar::distance
00364 {
00365 public:
00366   distance_dir (std::string const &conf);
00367   distance_dir();
00368   virtual inline ~distance_dir() {}
00369   virtual void calc_value();
00370   virtual void calc_gradients();
00371   virtual void apply_force (colvarvalue const &force);
00372 //   virtual cvm::real dist2 (colvarvalue const &x1,
00373 //                            colvarvalue const &x2) const;
00374 //   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00375 //                                    colvarvalue const &x2) const;
00376 //   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00377 //                                    colvarvalue const &x2) const;
00378 //   virtual cvm::real compare (colvarvalue const &x1,
00379 //                              colvarvalue const &x2) const;
00380 };
00381 
00382 
00385 class colvar::distance_z
00386   : public colvar::cvc
00387 {
00388 protected:
00390   cvm::atom_group  main;
00392   cvm::atom_group  ref1;
00394   cvm::atom_group  ref2;
00397   bool b_1site_force;
00399   cvm::rvector axis;
00401   cvm::real axis_norm;
00403   cvm::rvector     dist_v;
00405   bool fixed_axis;
00406 public:
00407   distance_z (std::string const &conf);
00408   distance_z();
00409   virtual inline ~distance_z() {}
00410   virtual void calc_value();
00411   virtual void calc_gradients();
00412   virtual void calc_force_invgrads();
00413   virtual void calc_Jacobian_derivative();
00414   virtual void apply_force (colvarvalue const &force);
00415   virtual cvm::real dist2 (colvarvalue const &x1,
00416                            colvarvalue const &x2) const;
00417   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00418                                    colvarvalue const &x2) const;
00419   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00420                                    colvarvalue const &x2) const;
00421   virtual cvm::real compare (colvarvalue const &x1,
00422                              colvarvalue const &x2) const;
00423 };
00424 
00425 
00428 class colvar::distance_xy
00429   : public colvar::distance_z
00430 {
00431 protected:
00433   cvm::rvector dist_v_ortho;
00435   cvm::rvector v12, v13;
00436 public:
00437   distance_xy (std::string const &conf);
00438   distance_xy();
00439   virtual inline ~distance_xy() {}
00440   virtual void calc_value();
00441   virtual void calc_gradients();
00442   virtual void calc_force_invgrads();
00443   virtual void calc_Jacobian_derivative();
00444   virtual void apply_force (colvarvalue const &force);
00445   virtual cvm::real dist2 (colvarvalue const &x1,
00446                            colvarvalue const &x2) const;
00447   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00448                                    colvarvalue const &x2) const;
00449   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00450                                    colvarvalue const &x2) const;
00451   virtual cvm::real compare (colvarvalue const &x1,
00452                              colvarvalue const &x2) const;
00453 };
00454 
00455 
00458 class colvar::min_distance
00459   : public colvar::distance
00460 {
00461 protected:
00463   cvm::real smoothing;
00464 public:
00465   min_distance (std::string const &conf);
00466   min_distance();
00467   virtual inline ~min_distance() {}
00468   virtual void calc_value();
00469   virtual void calc_gradients();
00470   virtual void apply_force (colvarvalue const &force);
00471   virtual cvm::real dist2 (colvarvalue const &x1,
00472                            colvarvalue const &x2) const;
00473   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00474                                    colvarvalue const &x2) const;
00475   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00476                                    colvarvalue const &x2) const;
00477   virtual cvm::real compare (colvarvalue const &x1,
00478                              colvarvalue const &x2) const;
00479 };
00480 
00481 
00482 
00483 
00486 class colvar::gyration
00487   : public colvar::cvc
00488 {
00489 protected:
00491   cvm::atom_group atoms;
00492 public:
00494   gyration (std::string const &conf);
00495   gyration();
00496   virtual inline ~gyration() {}
00497   virtual void calc_value();
00498   virtual void calc_gradients();
00499   virtual void calc_force_invgrads();
00500   virtual void calc_Jacobian_derivative();
00501   virtual void apply_force (colvarvalue const &force);
00502   virtual cvm::real dist2 (colvarvalue const &x1,
00503                            colvarvalue const &x2) const;
00504   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00505                                    colvarvalue const &x2) const;
00506   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00507                                    colvarvalue const &x2) const;
00508   virtual cvm::real compare (colvarvalue const &x1,
00509                              colvarvalue const &x2) const;
00510 };
00511 
00512 
00515 class colvar::eigenvector
00516   : public colvar::cvc
00517 {
00518 protected:
00519 
00521   cvm::atom_group             atoms;
00522 
00524   std::vector<cvm::atom_pos>  ref_pos;
00525 
00527   std::vector<cvm::rvector>   eigenvec;
00528 
00530   cvm::real                   eigenvec_invnorm2;
00531 
00532 public:
00533 
00535   eigenvector (std::string const &conf);
00536   virtual inline ~eigenvector() {}
00537   virtual void calc_value();
00538   virtual void calc_gradients();
00539   virtual void calc_force_invgrads();
00540   virtual void calc_Jacobian_derivative();
00541   virtual void apply_force (colvarvalue const &force);
00542   virtual cvm::real dist2 (colvarvalue const &x1,
00543                            colvarvalue const &x2) const;
00544   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00545                                    colvarvalue const &x2) const;
00546   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00547                                    colvarvalue const &x2) const;
00548   virtual cvm::real compare (colvarvalue const &x1,
00549                              colvarvalue const &x2) const;
00550 };
00551 
00552 
00553 
00556 class colvar::angle
00557   : public colvar::cvc
00558 {
00559 protected:
00560 
00562   cvm::atom_group group1;
00564   cvm::atom_group group2;
00566   cvm::atom_group group3;
00567 
00569   cvm::rvector r21, r23;
00571   cvm::real r21l, r23l;
00572 
00573 public:
00574 
00576   angle (std::string const &conf);
00578   angle (cvm::atom const &a1, cvm::atom const &a2, cvm::atom const &a3);
00579   angle();
00580   virtual inline ~angle() {}
00581   virtual void calc_value();
00582   virtual void calc_gradients();
00583   virtual void apply_force (colvarvalue const &force);
00584   virtual cvm::real dist2 (colvarvalue const &x1,
00585                            colvarvalue const &x2) const;
00586   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00587                                    colvarvalue const &x2) const;
00588   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00589                                    colvarvalue const &x2) const;
00590   virtual cvm::real compare (colvarvalue const &x1,
00591                              colvarvalue const &x2) const;
00592 };
00593 
00594 
00597 class colvar::dihedral
00598   : public colvar::cvc
00599 {
00600 protected:
00601 
00603   cvm::atom_group group1;
00605   cvm::atom_group group2;
00607   cvm::atom_group group3;
00609   cvm::atom_group group4;
00611   cvm::rvector r12, r23, r34;
00612 
00615   bool b_1site_force;
00616   
00617 public:
00618 
00620   dihedral (std::string  const &conf);
00622   dihedral (cvm::atom const &a1, cvm::atom const &a2, cvm::atom const &a3, cvm::atom const &a4);
00623   dihedral();
00624   virtual inline ~dihedral() {}
00625   virtual void calc_value();
00626   virtual void calc_gradients();
00627   virtual void calc_force_invgrads();
00628   virtual void calc_Jacobian_derivative();
00629   virtual void apply_force (colvarvalue const &force);
00630 
00632   virtual cvm::real dist2 (colvarvalue const &x1,
00633                            colvarvalue const &x2) const;
00635   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00636                                    colvarvalue const &x2) const;
00638   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00639                                    colvarvalue const &x2) const;
00641   virtual cvm::real compare (colvarvalue const &x1,
00642                              colvarvalue const &x2) const;
00643 };
00644 
00645 
00648 class colvar::coordnum
00649   : public colvar::distance
00650 {
00651 protected:
00653   cvm::real     r0;
00655   cvm::rvector  r0_vec;
00658   bool b_anisotropic;
00660   int en;
00662   int ed;
00665   bool b_group2_center_only;
00666 public:
00668   coordnum (std::string const &conf);
00669   coordnum();
00670   virtual inline ~coordnum() {}
00671   virtual void calc_value();
00672   virtual void calc_gradients();
00673   virtual void apply_force (colvarvalue const &force);
00674   template<bool b_gradients>
00679   static cvm::real switching_function (cvm::real const &r0,
00680                                        int const &exp_num, int const &exp_den,
00681                                        cvm::atom &A1, cvm::atom &A2);
00682   
00683   template<bool b_gradients>
00689   static cvm::real switching_function (cvm::rvector const &r0_vec,
00690                                        int const &exp_num, int const &exp_den,
00691                                        cvm::atom &A1, cvm::atom &A2);
00692 
00693   virtual cvm::real dist2 (colvarvalue const &x1,
00694                            colvarvalue const &x2) const;
00695   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00696                                    colvarvalue const &x2) const;
00697   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00698                                    colvarvalue const &x2) const;
00699   virtual cvm::real compare (colvarvalue const &x1,
00700                              colvarvalue const &x2) const;
00701 };
00702 
00703 
00707 class colvar::h_bond 
00708   : public colvar::cvc
00709 {
00710 protected:
00712   cvm::atom     acceptor, donor;
00714   cvm::real     r0;
00716   int en;
00718   int ed;
00719 public:
00720   h_bond (std::string const &conf);
00722   h_bond (cvm::atom const &acceptor,
00723           cvm::atom const &donor,
00724           cvm::real r0, int en, int ed);
00725   h_bond();
00726   virtual inline ~h_bond() {}
00727   virtual void calc_value();
00728   virtual void calc_gradients();
00729   virtual void apply_force (colvarvalue const &force);
00730 
00731   virtual cvm::real dist2 (colvarvalue const &x1,
00732                            colvarvalue const &x2) const;
00733   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00734                                    colvarvalue const &x2) const;
00735   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00736                                    colvarvalue const &x2) const;
00737   virtual cvm::real compare (colvarvalue const &x1,
00738                              colvarvalue const &x2) const;
00739 };
00740 
00741 
00746 class colvar::alpha_dihedrals
00747   : public colvar::cvc
00748 {
00749 protected:
00750 
00752   cvm::real phi_ref;
00753 
00755   cvm::real psi_ref;
00756 
00758   std::vector<dihedral *> phi;
00759 
00761   std::vector<dihedral *> psi;
00762 
00764   std::vector<h_bond *>   hb;
00765 
00766 public:
00767 
00768   alpha_dihedrals (std::string const &conf);
00769   alpha_dihedrals();
00770   virtual inline ~alpha_dihedrals() {}
00771   virtual void calc_value();
00772   virtual void calc_gradients(); 
00773   virtual void apply_force (colvarvalue const &force);
00774   virtual cvm::real dist2 (colvarvalue const &x1,
00775                            colvarvalue const &x2) const;
00776   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00777                                    colvarvalue const &x2) const;
00778   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00779                                    colvarvalue const &x2) const;
00780   virtual cvm::real compare (colvarvalue const &x1,
00781                              colvarvalue const &x2) const;
00782 };
00783 
00784 
00789 class colvar::alpha_angles
00790   : public colvar::cvc
00791 {
00792 protected:
00793 
00795   cvm::real theta_ref;
00796 
00798   cvm::real theta_tol;
00799 
00801   std::vector<angle *> theta;
00802 
00804   std::vector<h_bond *>   hb;
00805 
00807   cvm::real hb_coeff;
00808 
00809 public:
00810 
00811   alpha_angles (std::string const &conf);
00812   alpha_angles();
00813   virtual inline ~alpha_angles() {}
00814   void calc_value();
00815   void calc_gradients();
00816   void apply_force (colvarvalue const &force);
00817   virtual cvm::real dist2 (colvarvalue const &x1,
00818                            colvarvalue const &x2) const;
00819   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00820                                    colvarvalue const &x2) const;
00821   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00822                                    colvarvalue const &x2) const;
00823   virtual cvm::real compare (colvarvalue const &x1,
00824                              colvarvalue const &x2) const;
00825 };
00826 
00827 
00832 class colvar::orientation
00833   : public colvar::cvc
00834 {
00835 protected:
00836 
00838   cvm::atom_group            atoms;
00840   cvm::atom_pos              atoms_cog;
00841 
00843   std::vector<cvm::atom_pos> ref_pos;
00844 
00846   cvm::rotation              rot;
00847 
00850   cvm::quaternion            ref_quat;
00851 
00852 public:
00853 
00854   orientation (std::string const &conf);
00855   orientation();
00856   virtual inline ~orientation() {}
00857   virtual void calc_value();
00858   virtual void calc_gradients();
00859   virtual void apply_force (colvarvalue const &force);
00860   virtual cvm::real dist2 (colvarvalue const &x1,
00861                            colvarvalue const &x2) const;
00862   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00863                                    colvarvalue const &x2) const;
00864   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00865                                    colvarvalue const &x2) const;
00866   virtual cvm::real compare (colvarvalue const &x1,
00867                              colvarvalue const &x2) const;
00868 };
00869 
00870 
00874 class colvar::orientation_angle
00875   : public colvar::orientation
00876 {
00877 public:
00878 
00879   orientation_angle (std::string const &conf);
00880   orientation_angle();
00881   virtual inline ~orientation_angle() {}
00882   virtual void calc_value();
00883   virtual void calc_gradients();
00884   virtual void apply_force (colvarvalue const &force);
00885   virtual cvm::real dist2 (colvarvalue const &x1,
00886                            colvarvalue const &x2) const;
00887   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00888                                    colvarvalue const &x2) const;
00889   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00890                                    colvarvalue const &x2) const;
00891   virtual cvm::real compare (colvarvalue const &x1,
00892                              colvarvalue const &x2) const;
00893 };
00894 
00895 
00896 
00901 class colvar::rmsd
00902   : public colvar::orientation
00903 {
00904 protected:
00905 
00907   cvm::real                  ref_pos_sum2;
00908 
00909 public:
00910 
00912   rmsd (std::string const &conf);
00913   virtual inline ~rmsd() {}
00914   virtual void calc_value();
00915   virtual void calc_gradients();
00916   virtual void calc_force_invgrads();
00917   virtual void calc_Jacobian_derivative();
00918   virtual void apply_force (colvarvalue const &force);
00919   virtual cvm::real dist2 (colvarvalue const &x1,
00920                            colvarvalue const &x2) const;
00921   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00922                                    colvarvalue const &x2) const;
00923   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00924                                    colvarvalue const &x2) const;
00925   virtual cvm::real compare (colvarvalue const &x1,
00926                              colvarvalue const &x2) const;
00927 };
00928 
00929 
00934 class colvar::logmsd
00935   : public colvar::orientation
00936 {
00937 protected:
00938 
00940   cvm::real                 ref_pos_sum2;
00941   cvm::real                 MSD;
00942 
00943 public:
00944 
00946   logmsd (std::string const &conf);
00947   virtual inline ~logmsd() {}
00948   virtual void calc_value();
00949   virtual void calc_gradients();
00950   virtual void calc_force_invgrads();
00951   virtual void calc_Jacobian_derivative();
00952   virtual void apply_force (colvarvalue const &force);
00953   virtual cvm::real dist2 (colvarvalue const &x1,
00954                            colvarvalue const &x2) const;
00955   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00956                                    colvarvalue const &x2) const;
00957   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00958                                    colvarvalue const &x2) const;
00959   virtual cvm::real compare (colvarvalue const &x1,
00960                              colvarvalue const &x2) const;
00961 };
00962 
00963 
00964 // metrics functions for cvc implementations with a periodicity
00965 
00966 inline cvm::real colvar::dihedral::dist2 (colvarvalue const &x1,
00967                                           colvarvalue const &x2) const
00968 {
00969   // This version is asymptotically accurate for small distances,
00970   // other choices are possible
00971   cvm::real const diff = x1.real_value - x2.real_value;
00972   return (180.0*180.0/PI/PI) * 2.0 * (1.0 - ::cos (diff * (PI/180.00)));
00973 }
00974 
00975 inline colvarvalue colvar::dihedral::dist2_lgrad (colvarvalue const &x1,
00976                                                   colvarvalue const &x2) const
00977 {
00978   cvm::real const diff = x1.real_value - x2.real_value;
00979   return colvarvalue ((180.0/PI) * 2.0 * ::sin ( diff * (PI/180.0)));
00980 }
00981 
00982 inline colvarvalue colvar::dihedral::dist2_rgrad (colvarvalue const &x1,
00983                                                   colvarvalue const &x2) const
00984 {
00985   cvm::real const diff = x1.real_value - x2.real_value;
00986   return colvarvalue ((180.0/PI) * (-2.0) * ::sin ( diff * (PI/180.0)));
00987 }
00988 
00989 inline cvm::real colvar::dihedral::compare (colvarvalue const &x1,
00990                                             colvarvalue const &x2) const
00991 {
00992   return dist2_lgrad (x1, x2);
00993 }
00994 
00995 
00996 // simple definitions of the distance functions; they are useful for
00997 // optimizing the calculation (the type check performed by the base
00998 // class functions is skipped)
00999 
01000 
01001 // definitions assuming the scalar type
01002 
01003 #define simple_scalar_dist_functions(TYPE)                              \
01004                                                                         \
01005   inline cvm::real colvar::TYPE::dist2 (colvarvalue const &x1,          \
01006                                         colvarvalue const &x2) const    \
01007   {                                                                     \
01008     return ::pow (x1.real_value - x2.real_value, int (2));              \
01009   }                                                                     \
01010                                                                         \
01011   inline colvarvalue colvar::TYPE::dist2_lgrad (colvarvalue const &x1,  \
01012                                                 colvarvalue const &x2) const \
01013   {                                                                     \
01014     return 2.0 * (x1.real_value - x2.real_value);                       \
01015   }                                                                     \
01016                                                                         \
01017   inline colvarvalue colvar::TYPE::dist2_rgrad (colvarvalue const &x1,  \
01018                                                 colvarvalue const &x2) const \
01019   {                                                                     \
01020     return this->dist2_lgrad (x2, x1);                                  \
01021   }                                                                     \
01022                                                                         \
01023   inline cvm::real colvar::TYPE::compare (colvarvalue const &x1,        \
01024                                           colvarvalue const &x2) const  \
01025   {                                                                     \
01026     return this->dist2_lgrad (x1, x2);                                  \
01027   }                                                                     \
01028                                                                         \
01029 
01030   simple_scalar_dist_functions (distance)
01031   simple_scalar_dist_functions (distance_xy)
01032   simple_scalar_dist_functions (distance_z)
01033   simple_scalar_dist_functions (min_distance)
01034   simple_scalar_dist_functions (angle)
01035   simple_scalar_dist_functions (coordnum)
01036   simple_scalar_dist_functions (h_bond)
01037   simple_scalar_dist_functions (gyration)
01038   simple_scalar_dist_functions (rmsd)
01039   simple_scalar_dist_functions (logmsd)
01040   simple_scalar_dist_functions (orientation_angle)
01041   simple_scalar_dist_functions (eigenvector)
01042   simple_scalar_dist_functions (alpha_dihedrals)
01043   simple_scalar_dist_functions (alpha_angles)
01044 
01045 
01046 
01047 // generic definitions
01048 
01049 
01050 // distance between three dimensional vectors
01051 
01052 // inline cvm::real colvar::distance_vec::dist2 (colvarvalue const &x1,
01053 //                                               colvarvalue const &x2) const
01054 // {
01055 //   return (x1.rvector_value - x2.rvector_value).norm2();
01056 // }
01057 
01058 // inline colvarvalue colvar::distance_vec::dist2_lgrad (colvarvalue const &x1,
01059 //                                                       colvarvalue const &x2) const
01060 // {
01061 //   return (x1.rvector_value - x2.rvector_value);
01062 // }
01063 
01064 // inline colvarvalue colvar::distance_vec::dist2_rgrad (colvarvalue const &x1,
01065 //                                                       colvarvalue const &x2) const
01066 // {
01067 //   return (x2.rvector_value - x1.rvector_value);
01068 // }
01069 
01070 // inline cvm::real colvar::distance_vec::compare (colvarvalue const &x1,
01071 //                                                 colvarvalue const &x2) const
01072 // {
01073 //   cvm::fatal_error ("Error: cannot compare() two distance vectors.\n");
01074 //   return 0.0;
01075 // }
01076 
01077 
01078 // distance between quaternions
01079 
01080 inline cvm::real colvar::orientation::dist2 (colvarvalue const &x1,
01081                                              colvarvalue const &x2) const
01082 {
01083   return x1.quaternion_value.dist2 (x2);
01084 }
01085 
01086 inline colvarvalue colvar::orientation::dist2_lgrad (colvarvalue const &x1,
01087                                                      colvarvalue const &x2) const
01088 {
01089   return x1.quaternion_value.dist2_grad (x2);
01090 }
01091 
01092 inline colvarvalue colvar::orientation::dist2_rgrad (colvarvalue const &x1,
01093                                                      colvarvalue const &x2) const
01094 {
01095   return x2.quaternion_value.dist2_grad (x1);
01096 }
01097 
01098 inline cvm::real colvar::orientation::compare (colvarvalue const &x1,
01099                                                colvarvalue const &x2) const
01100 {
01101   cvm::fatal_error ("Error: cannot compare() two quaternions.\n");
01102   return 0.0;
01103 }
01104 
01105 
01106 
01107 
01108 
01109 #endif
01110 
01111 
01112 // Emacs
01113 // Local Variables:
01114 // mode: C++
01115 // End:

Generated on Sat Nov 7 04:07:46 2009 for NAMD by  doxygen 1.3.9.1