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 
00083   cvm::real wrap_center;
00084 
00085   bool b_periodic;
00086 
00093   cvc (std::string const &conf);
00094 
00097   void parse_group (std::string const &conf, 
00098                     char const *group_key,
00099                     cvm::atom_group &group,
00100                     bool optional = false);
00101 
00104   cvc();
00105 
00107   virtual ~cvc();
00108 
00112   bool b_debug_gradients;
00113 
00117   colvarvalue fdiff_change (cvm::atom_group &group);
00118 
00123   bool b_inverse_gradients;
00124 
00129   bool b_Jacobian_derivative;
00130 
00132   virtual void calc_value() = 0;
00133 
00136   virtual void calc_gradients() = 0;
00137 
00140   virtual void calc_force_invgrads();
00141 
00143   virtual void calc_Jacobian_derivative();
00144 
00145 
00147   virtual colvarvalue value() const;
00148 
00150   virtual colvarvalue system_force() const;
00151 
00154   virtual colvarvalue Jacobian_derivative() const;
00155 
00165   virtual void apply_force (colvarvalue const &cvforce) = 0;
00166 
00195   virtual cvm::real dist2 (colvarvalue const &x1,
00196                            colvarvalue const &x2) const;
00197 
00201   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00202                                    colvarvalue const &x2) const;
00203 
00207   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00208                                    colvarvalue const &x2) const;
00209 
00215   virtual cvm::real compare (colvarvalue const &x1,
00216                              colvarvalue const &x2) const;
00217 
00219   virtual void wrap (colvarvalue &x) const;
00220 
00223   std::vector<cvm::atom_group *> atom_groups;
00224 
00225 protected:
00226 
00228   colvarvalue x;
00229 
00231   colvarvalue x_old;
00232 
00237   colvarvalue ft;
00238 
00241   colvarvalue jd;
00242 };
00243 
00244 
00245 
00246 
00247 inline colvarvalue::Type colvar::cvc::type() const
00248 {
00249   return x.type();
00250 }
00251 
00252 inline colvarvalue colvar::cvc::value() const
00253 {
00254   return x;
00255 }
00256 
00257 inline colvarvalue colvar::cvc::system_force() const
00258 {
00259   return ft;
00260 }
00261 
00262 inline colvarvalue colvar::cvc::Jacobian_derivative() const
00263 {
00264   return jd;
00265 }
00266 
00267 
00268 inline cvm::real colvar::cvc::dist2 (colvarvalue const &x1,
00269                                      colvarvalue const &x2) const
00270 {
00271   return x1.dist2 (x2);
00272 }
00273 
00274 inline colvarvalue colvar::cvc::dist2_lgrad (colvarvalue const &x1,
00275                                              colvarvalue const &x2) const
00276 {
00277   return x1.dist2_grad (x2);
00278 }
00279 
00280 inline colvarvalue colvar::cvc::dist2_rgrad (colvarvalue const &x1,
00281                                              colvarvalue const &x2) const
00282 {
00283   return x2.dist2_grad (x1);
00284 }
00285 
00286 inline cvm::real colvar::cvc::compare (colvarvalue const &x1,
00287                                        colvarvalue const &x2) const
00288 {
00289   if (this->type() == colvarvalue::type_scalar) {
00290     return cvm::real (x1 - x2);
00291   } else {
00292     cvm::fatal_error ("Error: you requested an operation which requires "
00293                       "comparison between two non-scalar values.\n");
00294     return 0.0;
00295   }
00296 }
00297 
00298 inline void colvar::cvc::wrap (colvarvalue &x) const
00299 {
00300   return;
00301 }
00302 
00303 
00312 class colvar::distance
00313   : public colvar::cvc
00314 {
00315 protected:
00317   cvm::atom_group  group1;
00319   cvm::atom_group  group2;
00321   cvm::rvector     dist_v;
00323   bool b_no_PBC;
00326   bool b_1site_force;
00327 public:
00328   distance (std::string const &conf, bool twogroups = true);
00329   distance();
00330   virtual inline ~distance() {}
00331   virtual void calc_value();
00332   virtual void calc_gradients();
00333   virtual void calc_force_invgrads();
00334   virtual void calc_Jacobian_derivative();
00335   virtual void apply_force (colvarvalue const &force);
00336   virtual cvm::real dist2 (colvarvalue const &x1,
00337                            colvarvalue const &x2) const;
00338   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00339                                    colvarvalue const &x2) const;
00340   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00341                                    colvarvalue const &x2) const;
00342   virtual cvm::real compare (colvarvalue const &x1,
00343                              colvarvalue const &x2) const;
00344 };
00345 
00346 
00347 // \brief Colvar component: distance vector between centers of mass
00348 // of two groups (\link colvarvalue::type_vector \endlink type,
00349 // range (-*:*)x(-*:*)x(-*:*))
00350 class colvar::distance_vec
00351   : public colvar::distance
00352 {
00353 public:
00354   distance_vec (std::string const &conf);
00355   distance_vec();
00356   virtual inline ~distance_vec() {}
00357   virtual void calc_value();
00358   virtual void calc_gradients();
00359   virtual void apply_force (colvarvalue const &force);
00361   virtual cvm::real dist2 (colvarvalue const &x1,
00362                            colvarvalue const &x2) const;
00364   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00365                                    colvarvalue const &x2) const;
00367   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00368                                    colvarvalue const &x2) const;
00370   virtual cvm::real compare (colvarvalue const &x1,
00371                              colvarvalue const &x2) const;
00372 };
00373 
00374 
00378 class colvar::distance_dir
00379   : public colvar::distance
00380 {
00381 public:
00382   distance_dir (std::string const &conf);
00383   distance_dir();
00384   virtual inline ~distance_dir() {}
00385   virtual void calc_value();
00386   virtual void calc_gradients();
00387   virtual void apply_force (colvarvalue const &force);
00388   virtual cvm::real dist2 (colvarvalue const &x1,
00389                            colvarvalue const &x2) const;
00390   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00391                                    colvarvalue const &x2) const;
00392   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00393                                    colvarvalue const &x2) const;
00394   virtual cvm::real compare (colvarvalue const &x1,
00395                              colvarvalue const &x2) const;
00396 };
00397 
00398 
00401 class colvar::distance_z
00402   : public colvar::cvc
00403 {
00404 protected:
00406   cvm::atom_group  main;
00408   cvm::atom_group  ref1;
00410   cvm::atom_group  ref2;
00412   bool b_no_PBC;
00415   bool b_1site_force;
00417   cvm::rvector axis;
00419   cvm::real axis_norm;
00421   cvm::rvector     dist_v;
00423   bool fixed_axis;
00424 public:
00425   distance_z (std::string const &conf);
00426   distance_z();
00427   virtual inline ~distance_z() {}
00428   virtual void calc_value();
00429   virtual void calc_gradients();
00430   virtual void calc_force_invgrads();
00431   virtual void calc_Jacobian_derivative();
00432   virtual void apply_force (colvarvalue const &force);
00433   virtual cvm::real dist2 (colvarvalue const &x1,
00434                            colvarvalue const &x2) const;
00435   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00436                                    colvarvalue const &x2) const;
00437   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00438                                    colvarvalue const &x2) const;
00439   virtual cvm::real compare (colvarvalue const &x1,
00440                              colvarvalue const &x2) const;
00442   virtual void wrap (colvarvalue &x) const;
00443 };
00444 
00445 
00448 class colvar::distance_xy
00449   : public colvar::distance_z
00450 {
00451 protected:
00453   cvm::rvector dist_v_ortho;
00455   cvm::rvector v12, v13;
00456 public:
00457   distance_xy (std::string const &conf);
00458   distance_xy();
00459   virtual inline ~distance_xy() {}
00460   virtual void calc_value();
00461   virtual void calc_gradients();
00462   virtual void calc_force_invgrads();
00463   virtual void calc_Jacobian_derivative();
00464   virtual void apply_force (colvarvalue const &force);
00465   virtual cvm::real dist2 (colvarvalue const &x1,
00466                            colvarvalue const &x2) const;
00467   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00468                                    colvarvalue const &x2) const;
00469   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00470                                    colvarvalue const &x2) const;
00471   virtual cvm::real compare (colvarvalue const &x1,
00472                              colvarvalue const &x2) const;
00473 };
00474 
00475 
00478 class colvar::min_distance
00479   : public colvar::distance
00480 {
00481 protected:
00483   cvm::real smoothing;
00484 public:
00485   min_distance (std::string const &conf);
00486   min_distance();
00487   virtual inline ~min_distance() {}
00488   virtual void calc_value();
00489   virtual void calc_gradients();
00490   virtual void apply_force (colvarvalue const &force);
00491   virtual cvm::real dist2 (colvarvalue const &x1,
00492                            colvarvalue const &x2) const;
00493   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00494                                    colvarvalue const &x2) const;
00495   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00496                                    colvarvalue const &x2) const;
00497   virtual cvm::real compare (colvarvalue const &x1,
00498                              colvarvalue const &x2) const;
00499 };
00500 
00501 
00502 
00503 
00506 class colvar::gyration
00507   : public colvar::cvc
00508 {
00509 protected:
00511   cvm::atom_group atoms;
00512 public:
00514   gyration (std::string const &conf);
00515   gyration();
00516   virtual inline ~gyration() {}
00517   virtual void calc_value();
00518   virtual void calc_gradients();
00519   virtual void calc_force_invgrads();
00520   virtual void calc_Jacobian_derivative();
00521   virtual void apply_force (colvarvalue const &force);
00522   virtual cvm::real dist2 (colvarvalue const &x1,
00523                            colvarvalue const &x2) const;
00524   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00525                                    colvarvalue const &x2) const;
00526   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00527                                    colvarvalue const &x2) const;
00528   virtual cvm::real compare (colvarvalue const &x1,
00529                              colvarvalue const &x2) const;
00530 };
00531 
00532 
00535 class colvar::eigenvector
00536   : public colvar::cvc
00537 {
00538 protected:
00539 
00541   cvm::atom_group             atoms;
00542 
00544   std::vector<cvm::atom_pos>  ref_pos;
00545 
00547   std::vector<cvm::rvector>   eigenvec;
00548 
00550   cvm::real                   eigenvec_invnorm2;
00551 
00552 public:
00553 
00555   eigenvector (std::string const &conf);
00556   virtual inline ~eigenvector() {}
00557   virtual void calc_value();
00558   virtual void calc_gradients();
00559   virtual void calc_force_invgrads();
00560   virtual void calc_Jacobian_derivative();
00561   virtual void apply_force (colvarvalue const &force);
00562   virtual cvm::real dist2 (colvarvalue const &x1,
00563                            colvarvalue const &x2) const;
00564   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00565                                    colvarvalue const &x2) const;
00566   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00567                                    colvarvalue const &x2) const;
00568   virtual cvm::real compare (colvarvalue const &x1,
00569                              colvarvalue const &x2) const;
00570 };
00571 
00572 
00573 
00576 class colvar::angle
00577   : public colvar::cvc
00578 {
00579 protected:
00580 
00582   cvm::atom_group group1;
00584   cvm::atom_group group2;
00586   cvm::atom_group group3;
00587 
00589   cvm::rvector r21, r23;
00591   cvm::real r21l, r23l;
00593   cvm::rvector dxdr1, dxdr3;
00594 
00598   bool b_1site_force;
00599 public:
00600 
00602   angle (std::string const &conf);
00604   angle (cvm::atom const &a1, cvm::atom const &a2, cvm::atom const &a3);
00605   angle();
00606   virtual inline ~angle() {}
00607   virtual void calc_value();
00608   virtual void calc_gradients();
00609   virtual void calc_force_invgrads();
00610   virtual void calc_Jacobian_derivative();
00611   virtual void apply_force (colvarvalue const &force);
00612   virtual cvm::real dist2 (colvarvalue const &x1,
00613                            colvarvalue const &x2) const;
00614   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00615                                    colvarvalue const &x2) const;
00616   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00617                                    colvarvalue const &x2) const;
00618   virtual cvm::real compare (colvarvalue const &x1,
00619                              colvarvalue const &x2) const;
00620 };
00621 
00622 
00625 class colvar::dihedral
00626   : public colvar::cvc
00627 {
00628 protected:
00629 
00631   cvm::atom_group group1;
00633   cvm::atom_group group2;
00635   cvm::atom_group group3;
00637   cvm::atom_group group4;
00639   cvm::rvector r12, r23, r34;
00640 
00643   bool b_1site_force;
00644   
00645 public:
00646 
00648   dihedral (std::string  const &conf);
00650   dihedral (cvm::atom const &a1, cvm::atom const &a2, cvm::atom const &a3, cvm::atom const &a4);
00651   dihedral();
00652   virtual inline ~dihedral() {}
00653   virtual void calc_value();
00654   virtual void calc_gradients();
00655   virtual void calc_force_invgrads();
00656   virtual void calc_Jacobian_derivative();
00657   virtual void apply_force (colvarvalue const &force);
00658 
00660   virtual cvm::real dist2 (colvarvalue const &x1,
00661                            colvarvalue const &x2) const;
00663   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00664                                    colvarvalue const &x2) const;
00666   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00667                                    colvarvalue const &x2) const;
00669   virtual cvm::real compare (colvarvalue const &x1,
00670                              colvarvalue const &x2) const;
00672   virtual void wrap (colvarvalue &x) const;
00673 };
00674 
00675 
00678 class colvar::coordnum
00679   : public colvar::distance
00680 {
00681 protected:
00683   cvm::real     r0;
00685   cvm::rvector  r0_vec;
00688   bool b_anisotropic;
00690   int en;
00692   int ed;
00695   bool b_group2_center_only;
00696 public:
00698   coordnum (std::string const &conf);
00699   coordnum();
00700   virtual inline ~coordnum() {}
00701   virtual void calc_value();
00702   virtual void calc_gradients();
00703   virtual void apply_force (colvarvalue const &force);
00704   template<bool b_gradients>
00709   static cvm::real switching_function (cvm::real const &r0,
00710                                        int const &exp_num, int const &exp_den,
00711                                        cvm::atom &A1, cvm::atom &A2);
00712   
00713   template<bool b_gradients>
00719   static cvm::real switching_function (cvm::rvector const &r0_vec,
00720                                        int const &exp_num, int const &exp_den,
00721                                        cvm::atom &A1, cvm::atom &A2);
00722 
00723   virtual cvm::real dist2 (colvarvalue const &x1,
00724                            colvarvalue const &x2) const;
00725   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00726                                    colvarvalue const &x2) const;
00727   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00728                                    colvarvalue const &x2) const;
00729   virtual cvm::real compare (colvarvalue const &x1,
00730                              colvarvalue const &x2) const;
00731 };
00732 
00735 class colvar::selfcoordnum
00736   : public colvar::distance
00737 {
00738 protected:
00740   cvm::real     r0;
00742   int en;
00744   int ed;
00745 public:
00747   selfcoordnum (std::string const &conf);
00748   selfcoordnum();
00749   virtual inline ~selfcoordnum() {}
00750   virtual void calc_value();
00751   virtual void calc_gradients();
00752   virtual void apply_force (colvarvalue const &force);
00753   template<bool b_gradients>
00758   static cvm::real switching_function (cvm::real const &r0,
00759                                        int const &exp_num, int const &exp_den,
00760                                        cvm::atom &A1, cvm::atom &A2);
00761   
00762   virtual cvm::real dist2 (colvarvalue const &x1,
00763                            colvarvalue const &x2) const;
00764   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00765                                    colvarvalue const &x2) const;
00766   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00767                                    colvarvalue const &x2) const;
00768   virtual cvm::real compare (colvarvalue const &x1,
00769                              colvarvalue const &x2) const;
00770 };
00771 
00775 class colvar::h_bond 
00776   : public colvar::cvc
00777 {
00778 protected:
00780   cvm::atom     acceptor, donor;
00782   cvm::real     r0;
00784   int en;
00786   int ed;
00787 public:
00788   h_bond (std::string const &conf);
00790   h_bond (cvm::atom const &acceptor,
00791           cvm::atom const &donor,
00792           cvm::real r0, int en, int ed);
00793   h_bond();
00794   virtual ~h_bond();
00795   virtual void calc_value();
00796   virtual void calc_gradients();
00797   virtual void apply_force (colvarvalue const &force);
00798 
00799   virtual cvm::real dist2 (colvarvalue const &x1,
00800                            colvarvalue const &x2) const;
00801   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00802                                    colvarvalue const &x2) const;
00803   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00804                                    colvarvalue const &x2) const;
00805   virtual cvm::real compare (colvarvalue const &x1,
00806                              colvarvalue const &x2) const;
00807 };
00808 
00809 
00814 // class colvar::alpha_dihedrals
00815 //   : public colvar::cvc
00816 // {
00817 // protected:
00818 
00819 //   /// Alpha-helical reference phi value
00820 //   cvm::real phi_ref;
00821 
00822 //   /// Alpha-helical reference psi value
00823 //   cvm::real psi_ref;
00824 
00825 //   /// List of phi dihedral angles
00826 //   std::vector<dihedral *> phi;
00827 
00828 //   /// List of psi dihedral angles
00829 //   std::vector<dihedral *> psi;
00830 
00831 //   /// List of hydrogen bonds
00832 //   std::vector<h_bond *>   hb;
00833 
00834 // public:
00835 
00836 //   alpha_dihedrals (std::string const &conf);
00837 //   alpha_dihedrals();
00838 //   virtual inline ~alpha_dihedrals() {}
00839 //   virtual void calc_value();
00840 //   virtual void calc_gradients(); 
00841 //   virtual void apply_force (colvarvalue const &force);
00842 //   virtual cvm::real dist2 (colvarvalue const &x1,
00843 //                            colvarvalue const &x2) const;
00844 //   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00845 //                                    colvarvalue const &x2) const;
00846 //   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00847 //                                    colvarvalue const &x2) const;
00848 //   virtual cvm::real compare (colvarvalue const &x1,
00849 //                              colvarvalue const &x2) const;
00850 // };
00851 
00852 
00857 class colvar::alpha_angles
00858   : public colvar::cvc
00859 {
00860 protected:
00861 
00863   cvm::real theta_ref;
00864 
00866   cvm::real theta_tol;
00867 
00869   std::vector<angle *> theta;
00870 
00872   std::vector<h_bond *>   hb;
00873 
00875   cvm::real hb_coeff;
00876 
00877 public:
00878 
00879   alpha_angles (std::string const &conf);
00880   alpha_angles();
00881   virtual ~alpha_angles();
00882   void calc_value();
00883   void calc_gradients();
00884   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 
00899 class colvar::dihedPC
00900   : public colvar::cvc
00901 {
00902 protected:
00903 
00904   std::vector<dihedral *> theta;
00905   std::vector<cvm::real> coeffs;
00906 
00907 public:
00908 
00909   dihedPC (std::string const &conf);
00910   dihedPC();
00911   virtual  ~dihedPC();
00912   void calc_value();
00913   void calc_gradients();
00914   void apply_force (colvarvalue const &force);
00915   virtual cvm::real dist2 (colvarvalue const &x1,
00916                            colvarvalue const &x2) const;
00917   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00918                                    colvarvalue const &x2) const;
00919   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00920                                    colvarvalue const &x2) const;
00921   virtual cvm::real compare (colvarvalue const &x1,
00922                              colvarvalue const &x2) const;
00923 };
00924 
00929 class colvar::orientation
00930   : public colvar::cvc
00931 {
00932 protected:
00933 
00935   cvm::atom_group            atoms;
00937   cvm::atom_pos              atoms_cog;
00938 
00940   std::vector<cvm::atom_pos> ref_pos;
00941 
00943   cvm::rotation              rot;
00944 
00947   cvm::quaternion            ref_quat;
00948 
00949 public:
00950 
00951   orientation (std::string const &conf);
00952   orientation();
00953   virtual inline ~orientation() {}
00954   virtual void calc_value();
00955   virtual void calc_gradients();
00956   virtual void apply_force (colvarvalue const &force);
00957   virtual cvm::real dist2 (colvarvalue const &x1,
00958                            colvarvalue const &x2) const;
00959   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00960                                    colvarvalue const &x2) const;
00961   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00962                                    colvarvalue const &x2) const;
00963   virtual cvm::real compare (colvarvalue const &x1,
00964                              colvarvalue const &x2) const;
00965 };
00966 
00967 
00971 class colvar::orientation_angle
00972   : public colvar::orientation
00973 {
00974 public:
00975 
00976   orientation_angle (std::string const &conf);
00977   orientation_angle();
00978   virtual inline ~orientation_angle() {}
00979   virtual void calc_value();
00980   virtual void calc_gradients();
00981   virtual void apply_force (colvarvalue const &force);
00982   virtual cvm::real dist2 (colvarvalue const &x1,
00983                            colvarvalue const &x2) const;
00984   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00985                                    colvarvalue const &x2) const;
00986   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00987                                    colvarvalue const &x2) const;
00988   virtual cvm::real compare (colvarvalue const &x1,
00989                              colvarvalue const &x2) const;
00990 };
00991 
00992 
00995 class colvar::tilt
00996   : public colvar::orientation
00997 {
00998 protected:
00999 
01000   cvm::rvector axis;
01001 
01002 public:
01003 
01004   tilt (std::string const &conf);
01005   tilt();
01006   virtual inline ~tilt() {}
01007   virtual void calc_value();
01008   virtual void calc_gradients();
01009   virtual void apply_force (colvarvalue const &force);
01010   virtual cvm::real dist2 (colvarvalue const &x1,
01011                            colvarvalue const &x2) const;
01012   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
01013                                    colvarvalue const &x2) const;
01014   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
01015                                    colvarvalue const &x2) const;
01016   virtual cvm::real compare (colvarvalue const &x1,
01017                              colvarvalue const &x2) const;
01018 };
01019 
01020 
01021 
01024 class colvar::spin_angle
01025   : public colvar::orientation
01026 {
01027 protected:
01028 
01029   cvm::rvector axis;
01030 
01031 public:
01032 
01033   spin_angle (std::string const &conf);
01034   spin_angle();
01035   virtual inline ~spin_angle() {}
01036   virtual void calc_value();
01037   virtual void calc_gradients();
01038   virtual void apply_force (colvarvalue const &force);
01040   virtual cvm::real dist2 (colvarvalue const &x1,
01041                            colvarvalue const &x2) const;
01043   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
01044                                    colvarvalue const &x2) const;
01046   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
01047                                    colvarvalue const &x2) const;
01049   virtual cvm::real compare (colvarvalue const &x1,
01050                              colvarvalue const &x2) const;
01052   virtual void wrap (colvarvalue &x) const;
01053 };
01054 
01055 
01056 
01061 class colvar::rmsd
01062   : public colvar::orientation
01063 {
01064 protected:
01066   cvm::real ref_pos_sum2;
01067 
01068 public:
01069 
01071   rmsd (std::string const &conf);
01072   virtual inline ~rmsd() {}
01073   virtual void calc_value();
01074   virtual void calc_gradients();
01075   virtual void calc_force_invgrads();
01076   virtual void calc_Jacobian_derivative();
01077   virtual void apply_force (colvarvalue const &force);
01078   virtual cvm::real dist2 (colvarvalue const &x1,
01079                            colvarvalue const &x2) const;
01080   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
01081                                    colvarvalue const &x2) const;
01082   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
01083                                    colvarvalue const &x2) const;
01084   virtual cvm::real compare (colvarvalue const &x1,
01085                              colvarvalue const &x2) const;
01086 };
01087 
01088 
01093 class colvar::logmsd
01094   : public colvar::orientation
01095 {
01096 protected:
01097 
01099   cvm::real                 ref_pos_sum2;
01100   cvm::real                 MSD;
01101 
01102 public:
01103 
01105   logmsd (std::string const &conf);
01106   virtual inline ~logmsd() {}
01107   virtual void calc_value();
01108   virtual void calc_gradients();
01109   virtual void calc_force_invgrads();
01110   virtual void calc_Jacobian_derivative();
01111   virtual void apply_force (colvarvalue const &force);
01112   virtual cvm::real dist2 (colvarvalue const &x1,
01113                            colvarvalue const &x2) const;
01114   virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
01115                                    colvarvalue const &x2) const;
01116   virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
01117                                    colvarvalue const &x2) const;
01118   virtual cvm::real compare (colvarvalue const &x1,
01119                              colvarvalue const &x2) const;
01120 };
01121 
01122 
01123 // metrics functions for cvc implementations with a periodicity
01124 
01125 inline cvm::real colvar::dihedral::dist2 (colvarvalue const &x1,
01126                                           colvarvalue const &x2) const
01127 {
01128   cvm::real diff = x1.real_value - x2.real_value;
01129   diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff));
01130   return diff * diff;
01131 }
01132 
01133 inline colvarvalue colvar::dihedral::dist2_lgrad (colvarvalue const &x1,
01134                                                   colvarvalue const &x2) const
01135 {
01136   cvm::real diff = x1.real_value - x2.real_value;
01137   diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff));
01138   return 2.0 * diff;
01139 }
01140 
01141 inline colvarvalue colvar::dihedral::dist2_rgrad (colvarvalue const &x1,
01142                                                   colvarvalue const &x2) const
01143 {
01144   cvm::real diff = x1.real_value - x2.real_value;
01145   diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff));
01146   return (-2.0) * diff;
01147 }
01148 
01149 inline cvm::real colvar::dihedral::compare (colvarvalue const &x1,
01150                                             colvarvalue const &x2) const
01151 {
01152   return dist2_lgrad (x1, x2);
01153 }
01154 
01155 inline void colvar::dihedral::wrap (colvarvalue &x) const
01156 {
01157   if ((x.real_value - wrap_center) >= 180.0) {
01158     x.real_value -= 360.0;
01159     return;
01160   } 
01161 
01162   if ((x.real_value - wrap_center) < -180.0) {
01163     x.real_value += 360.0;
01164     return;
01165   } 
01166 
01167   return;
01168 }
01169 
01170 inline cvm::real colvar::spin_angle::dist2 (colvarvalue const &x1,
01171                                           colvarvalue const &x2) const
01172 {
01173   cvm::real diff = x1.real_value - x2.real_value;
01174   diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff));
01175   return diff * diff;
01176 }
01177 
01178 inline colvarvalue colvar::spin_angle::dist2_lgrad (colvarvalue const &x1,
01179                                                   colvarvalue const &x2) const
01180 {
01181   cvm::real diff = x1.real_value - x2.real_value;
01182   diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff));
01183   return 2.0 * diff;
01184 }
01185 
01186 inline colvarvalue colvar::spin_angle::dist2_rgrad (colvarvalue const &x1,
01187                                                   colvarvalue const &x2) const
01188 {
01189   cvm::real diff = x1.real_value - x2.real_value;
01190   diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff));
01191   return (-2.0) * diff;
01192 }
01193 
01194 inline cvm::real colvar::spin_angle::compare (colvarvalue const &x1,
01195                                             colvarvalue const &x2) const
01196 {
01197   return dist2_lgrad (x1, x2);
01198 }
01199 
01200 inline void colvar::spin_angle::wrap (colvarvalue &x) const
01201 {
01202   if ((x.real_value - wrap_center) >= 180.0) {
01203     x.real_value -= 360.0;
01204     return;
01205   } 
01206 
01207   if ((x.real_value - wrap_center) < -180.0) {
01208     x.real_value += 360.0;
01209     return;
01210   } 
01211 
01212   return;
01213 }
01214 
01215 // simple definitions of the distance functions; these are useful only
01216 // for optimization (the type check performed in the default
01217 // colvarcomp functions is skipped)
01218 
01219 // definitions assuming the scalar type
01220 
01221 #define simple_scalar_dist_functions(TYPE)                              \
01222                                                                         \
01223   inline cvm::real colvar::TYPE::dist2 (colvarvalue const &x1,          \
01224                                         colvarvalue const &x2) const    \
01225   {                                                                     \
01226     return std::pow (x1.real_value - x2.real_value, int (2));              \
01227   }                                                                     \
01228                                                                         \
01229   inline colvarvalue colvar::TYPE::dist2_lgrad (colvarvalue const &x1,  \
01230                                                 colvarvalue const &x2) const \
01231   {                                                                     \
01232     return 2.0 * (x1.real_value - x2.real_value);                       \
01233   }                                                                     \
01234                                                                         \
01235   inline colvarvalue colvar::TYPE::dist2_rgrad (colvarvalue const &x1,  \
01236                                                 colvarvalue const &x2) const \
01237   {                                                                     \
01238     return this->dist2_lgrad (x2, x1);                                  \
01239   }                                                                     \
01240                                                                         \
01241   inline cvm::real colvar::TYPE::compare (colvarvalue const &x1,        \
01242                                           colvarvalue const &x2) const  \
01243   {                                                                     \
01244     return this->dist2_lgrad (x1, x2);                                  \
01245   }                                                                     \
01246                                                                         \
01247 
01248   simple_scalar_dist_functions (distance)
01249   // NOTE: distance_z has explicit functions, see below 
01250   simple_scalar_dist_functions (distance_xy)
01251   simple_scalar_dist_functions (min_distance)
01252   simple_scalar_dist_functions (angle)
01253   simple_scalar_dist_functions (coordnum)
01254   simple_scalar_dist_functions (selfcoordnum)
01255   simple_scalar_dist_functions (h_bond)
01256   simple_scalar_dist_functions (gyration)
01257   simple_scalar_dist_functions (rmsd)
01258   simple_scalar_dist_functions (logmsd)
01259   simple_scalar_dist_functions (orientation_angle)
01260   simple_scalar_dist_functions (tilt)
01261   simple_scalar_dist_functions (eigenvector)
01262   //  simple_scalar_dist_functions (alpha_dihedrals)
01263   simple_scalar_dist_functions (alpha_angles)
01264   simple_scalar_dist_functions (dihedPC)
01265 
01266 
01267 // Projected distance
01268 // Differences should always be wrapped around 0 (ignoring wrap_center)
01269 inline cvm::real colvar::distance_z::dist2 (colvarvalue const &x1,
01270                                             colvarvalue const &x2) const
01271 {
01272   cvm::real diff = x1.real_value - x2.real_value;
01273   if (period != 0.0) {
01274     cvm::real shift = std::floor (diff/period + 0.5);
01275     diff -= shift * period;
01276   }
01277   return diff * diff;
01278 }
01279 
01280 inline colvarvalue colvar::distance_z::dist2_lgrad (colvarvalue const &x1,
01281                                                     colvarvalue const &x2) const
01282 {
01283   cvm::real diff = x1.real_value - x2.real_value;
01284   if (period != 0.0) {
01285     cvm::real shift = std::floor (diff/period + 0.5);
01286     diff -= shift * period;
01287   }
01288   return 2.0 * diff;
01289 }
01290 
01291 inline colvarvalue colvar::distance_z::dist2_rgrad (colvarvalue const &x1,
01292                                                     colvarvalue const &x2) const
01293 {
01294   cvm::real diff = x1.real_value - x2.real_value;
01295   if (period != 0.0) {
01296     cvm::real shift = std::floor (diff/period + 0.5);
01297     diff -= shift * period;
01298   }
01299   return (-2.0) * diff;
01300 }
01301 
01302 inline cvm::real colvar::distance_z::compare (colvarvalue const &x1,
01303                                               colvarvalue const &x2) const
01304 {
01305   return dist2_lgrad (x1, x2);
01306 }
01307 
01308 inline void colvar::distance_z::wrap (colvarvalue &x) const
01309 {
01310   if (! this->b_periodic) {
01311     // don't wrap if the period has not been set
01312     return;
01313   }
01314 
01315   cvm::real shift = std::floor ((x.real_value - wrap_center) / period + 0.5);
01316   x.real_value -= shift * period;
01317   return;
01318 }
01319 
01320 
01321 // distance between three dimensional vectors
01322 //
01323 // TODO apply PBC to distance_vec
01324 // Note: differences should be centered around (0, 0, 0)!
01325 
01326 inline cvm::real colvar::distance_vec::dist2 (colvarvalue const &x1,
01327                                               colvarvalue const &x2) const
01328 {
01329   return cvm::position_dist2 (x1.rvector_value, x2.rvector_value);
01330 }
01331 
01332 inline colvarvalue colvar::distance_vec::dist2_lgrad (colvarvalue const &x1,
01333                                                       colvarvalue const &x2) const
01334 {
01335   return 2.0 * cvm::position_distance(x2.rvector_value, x1.rvector_value);
01336 }
01337 
01338 inline colvarvalue colvar::distance_vec::dist2_rgrad (colvarvalue const &x1,
01339                                                       colvarvalue const &x2) const
01340 {
01341   return 2.0 * cvm::position_distance(x2.rvector_value, x1.rvector_value);
01342 }
01343 
01344 inline cvm::real colvar::distance_vec::compare (colvarvalue const &x1,
01345                                                 colvarvalue const &x2) const
01346 {
01347   cvm::fatal_error ("Error: cannot compare() two distance vectors.\n");
01348   return 0.0;
01349 }
01350 
01351 inline cvm::real colvar::distance_dir::dist2 (colvarvalue const &x1,
01352                                               colvarvalue const &x2) const
01353 {
01354   return (x1.rvector_value - x2.rvector_value).norm2();
01355 }
01356 
01357 inline colvarvalue colvar::distance_dir::dist2_lgrad (colvarvalue const &x1,
01358                                                       colvarvalue const &x2) const
01359 {
01360   return colvarvalue ((x1.rvector_value - x2.rvector_value), colvarvalue::type_unitvector);
01361 }
01362 
01363 inline colvarvalue colvar::distance_dir::dist2_rgrad (colvarvalue const &x1,
01364                                                       colvarvalue const &x2) const
01365 {
01366   return colvarvalue ((x2.rvector_value - x1.rvector_value), colvarvalue::type_unitvector);
01367 }
01368 
01369 inline cvm::real colvar::distance_dir::compare (colvarvalue const &x1,
01370                                                 colvarvalue const &x2) const
01371 {
01372   cvm::fatal_error ("Error: cannot compare() two distance directions.\n");
01373   return 0.0;
01374 }
01375 
01376 // distance between quaternions
01377 
01378 inline cvm::real colvar::orientation::dist2 (colvarvalue const &x1,
01379                                              colvarvalue const &x2) const
01380 {
01381   return x1.quaternion_value.dist2 (x2);
01382 }
01383 
01384 inline colvarvalue colvar::orientation::dist2_lgrad (colvarvalue const &x1,
01385                                                      colvarvalue const &x2) const
01386 {
01387   return x1.quaternion_value.dist2_grad (x2);
01388 }
01389 
01390 inline colvarvalue colvar::orientation::dist2_rgrad (colvarvalue const &x1,
01391                                                      colvarvalue const &x2) const
01392 {
01393   return x2.quaternion_value.dist2_grad (x1);
01394 }
01395 
01396 inline cvm::real colvar::orientation::compare (colvarvalue const &x1,
01397                                                colvarvalue const &x2) const
01398 {
01399   cvm::fatal_error ("Error: cannot compare() two quaternions.\n");
01400   return 0.0;
01401 }
01402 
01403 
01404 
01405 
01406 
01407 #endif
01408 
01409 
01410 // Emacs
01411 // Local Variables:
01412 // mode: C++
01413 // End:

Generated on Fri May 25 04:07:13 2012 for NAMD by  doxygen 1.3.9.1