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
00348
00349
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
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
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
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
01216
01217
01218
01219
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
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
01263 simple_scalar_dist_functions (alpha_angles)
01264 simple_scalar_dist_functions (dihedPC)
01265
01266
01267
01268
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
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
01322
01323
01324
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
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
01411
01412
01413