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
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
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
00373
00374
00375
00376
00377
00378
00379
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
00965
00966 inline cvm::real colvar::dihedral::dist2 (colvarvalue const &x1,
00967 colvarvalue const &x2) const
00968 {
00969
00970
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
00997
00998
00999
01000
01001
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
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
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
01113
01114
01115